<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/18035">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">scheduler_trx: fix RSSI calculation for SUB frames<br><br>Currently the RSSI value of the burst that concludes a block is passed<br>up to the higher layer. However, this also means that the RSSI values of<br>the other bursts are skipped. Lets keep record of all RSSI values and<br>average the values before we pass them up to the higher layers.<br><br>Also lets make sure that we pick the correct RSSI measurements when we<br>calculate the RSSI values for the AMR SID frames (SUB frames).<br><br>Change-Id: I902bb47d68742d2589156f61099b67a0edbaf40b<br>Related: OS#2978<br>---<br>M include/osmo-bts/scheduler.h<br>M src/osmo-bts-trx/scheduler_trx.c<br>2 files changed, 179 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/35/18035/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/scheduler.h b/include/osmo-bts/scheduler.h</span><br><span>index c026411..4462566 100644</span><br><span>--- a/include/osmo-bts/scheduler.h</span><br><span>+++ b/include/osmo-bts/scheduler.h</span><br><span>@@ -76,6 +76,7 @@</span><br><span>  ubit_t                  *dl_bursts;     /* burst buffer for TX */</span><br><span>    enum trx_burst_type     dl_burst_type;  /* GMSK or 8PSK burst type */</span><br><span>        sbit_t                  *ul_bursts;     /* burst buffer for RX */</span><br><span style="color: hsl(120, 100%, 40%);">+     int8_t                  ul_rssi[8];     /* rssi meas buffer for RX */</span><br><span>        uint32_t                ul_first_fn;    /* fn of first burst */</span><br><span>      uint8_t                 ul_mask;        /* mask of received bursts */</span><br><span> </span><br><span>diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>index 8c3dd64..09b00bc 100644</span><br><span>--- a/src/osmo-bts-trx/scheduler_trx.c</span><br><span>+++ b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>@@ -1120,6 +1120,98 @@</span><br><span>                                        PRES_INFO_BOTH);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Modes that can be used with function calc_rssi_avg() */</span><br><span style="color: hsl(120, 100%, 40%);">+enum rssi_calc_mode {</span><br><span style="color: hsl(120, 100%, 40%);">+        RSSI_FR_LOWER_FOUR,</span><br><span style="color: hsl(120, 100%, 40%);">+   RSSI_FR_HIGHER_FOUR,</span><br><span style="color: hsl(120, 100%, 40%);">+  RSSI_HR_ALL,</span><br><span style="color: hsl(120, 100%, 40%);">+  RSSI_HR_LOWER_TWO,</span><br><span style="color: hsl(120, 100%, 40%);">+    RSSI_HR_MID_TWO,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* A handy function to calculate the RSSI for received bursts in various</span><br><span style="color: hsl(120, 100%, 40%);">+ * different modes. */</span><br><span style="color: hsl(120, 100%, 40%);">+static int8_t calc_rssi_avg(int8_t * rssi_values, enum rssi_calc_mode mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int rssi_sum = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rssi_count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   int8_t rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       int8_t *r = rssi_values;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case RSSI_FR_LOWER_FOUR:</span><br><span style="color: hsl(120, 100%, 40%);">+              rssi_count = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_FR_HIGHER_FOUR:</span><br><span style="color: hsl(120, 100%, 40%);">+             rssi_count = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+               rssi_values += 4;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_HR_ALL:</span><br><span style="color: hsl(120, 100%, 40%);">+             rssi_count = 6;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_HR_LOWER_TWO:</span><br><span style="color: hsl(120, 100%, 40%);">+               rssi_count = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_HR_MID_TWO:</span><br><span style="color: hsl(120, 100%, 40%);">+         rssi_count = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               rssi_values += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < rssi_count; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (rssi_values[i] == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                      rssi_sum += -127;</span><br><span style="color: hsl(120, 100%, 40%);">+             else</span><br><span style="color: hsl(120, 100%, 40%);">+                  rssi_sum += rssi_values[i];</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = rssi_sum / rssi_count;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Debug output: */</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case RSSI_FR_LOWER_FOUR:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DL1P, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              "%s calculating rssi: [%02i %02i %02i %02i] %02i %02i %02i %02i => %i\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                gsm_lchan_name(lchan), r[0], r[1], r[2], r[3], r[4], r[5],</span><br><span style="color: hsl(120, 100%, 40%);">+                    r[6], r[7], rc);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_FR_HIGHER_FOUR:</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DL1P, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              "%s calculating rssi: %02i %02i %02i %02i [%02i %02i %02i %02i] => %i\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                gsm_lchan_name(lchan), r[0], r[1], r[2], r[3], r[4], r[5],</span><br><span style="color: hsl(120, 100%, 40%);">+                    r[6], r[7], rc);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_HR_ALL:</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DL1P, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              "%s calculating rssi: [%02i %02i %02i %02i %02i %02i] => %i\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_lchan_name(lchan), r[0], r[1], r[2], r[3], r[4], r[5],</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_HR_LOWER_TWO:</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DL1P, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              "%s calculating rssi: [%02i %02i] %02i %02i %02i %02i => %i\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_lchan_name(lchan), r[0], r[1], r[2], r[3], r[4], r[5],</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSSI_HR_MID_TWO:</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DL1P, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+              "%s calculating rssi: %02i %02i [%02i %02i] %02i %02i => %i\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_lchan_name(lchan), r[0], r[1], r[2], r[3], r[4], r[5],</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! \brief a single TCH/F burst was received by the PHY, process it */</span><br><span> int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span>               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span>@@ -1142,6 +1234,7 @@</span><br><span>       uint16_t ber10k;</span><br><span>     uint8_t is_sub = 0;</span><br><span>  uint8_t ft;</span><br><span style="color: hsl(120, 100%, 40%);">+   int8_t rssi;</span><br><span> </span><br><span>     /* handle rach, if handover rach detection is turned on */</span><br><span>   if (chan_state->ho_rach_detect == 1)</span><br><span>@@ -1175,10 +1268,18 @@</span><br><span>    } else</span><br><span>               memset(burst, 0, 116);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* keep record of the rssi values for each burst */</span><br><span style="color: hsl(120, 100%, 40%);">+   chan_state->ul_rssi[bid + 4] = bi->rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* wait until complete set of bursts */</span><br><span>      if (bid != 3)</span><br><span>                return 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Precalculate the RSSI value for a regular TCH burst, this calucation</span><br><span style="color: hsl(120, 100%, 40%);">+        * will be valid for the most situation, however, FACCH and AMR-DTX</span><br><span style="color: hsl(120, 100%, 40%);">+    * frames require a different calculation mode. */</span><br><span style="color: hsl(120, 100%, 40%);">+    rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_FR_LOWER_FOUR, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* check for complete set of bursts */</span><br><span>       if ((*mask & 0xf) != 0xf) {</span><br><span>              LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span>@@ -1226,7 +1327,7 @@</span><br><span>           /* Tag all frames that are not regular AMR voice frames as</span><br><span>            * SUB-Frames */</span><br><span>             if (chan_state->amr_last_dtx != AMR_OTHER) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGL1S(DL1P, LOGL_INFO, l1t, bi->tn, chan, bi->fn,</span><br><span>                            "Received AMR SID frame: %s\n",</span><br><span>                            gsm0503_amr_dtx_frame_name(chan_state->amr_last_dtx));</span><br><span>                     is_sub = 1;</span><br><span>@@ -1246,6 +1347,23 @@</span><br><span>                         break;</span><br><span>               }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         switch (chan_state->amr_last_dtx) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case AFS_SID_FIRST:</span><br><span style="color: hsl(120, 100%, 40%);">+                   rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_FR_LOWER_FOUR, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AFS_SID_UPDATE:</span><br><span style="color: hsl(120, 100%, 40%);">+                  rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_FR_HIGHER_FOUR, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AFS_SID_UPDATE_CN:</span><br><span style="color: hsl(120, 100%, 40%);">+                       rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_FR_LOWER_FOUR, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AFS_ONSET:</span><br><span style="color: hsl(120, 100%, 40%);">+                       rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_FR_HIGHER_FOUR, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          if (rc)</span><br><span>                      trx_loop_amr_input(l1t,</span><br><span>                              trx_chan_desc[chan].chan_nr | bi->tn, chan_state,</span><br><span>@@ -1270,8 +1388,14 @@</span><br><span>                        tch_mode);</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* copy bursts to the beginning of the buffer since they are needed in</span><br><span style="color: hsl(120, 100%, 40%);">+         * the lower half of the buffer for the next run (diagonal interleaving) */</span><br><span>  memcpy(*bursts_p, *bursts_p + 464, 464);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* also move measurement values */</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(chan_state->ul_rssi, chan_state->ul_rssi + 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* Check if the frame is bad */</span><br><span>      if (rc < 0) {</span><br><span>             LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span>@@ -1297,8 +1421,8 @@</span><br><span>           fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_F);</span><br><span>            _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, chan,</span><br><span>                   tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span style="color: hsl(0, 100%, 40%);">-                       /* FIXME: AVG RSSI and ToA256 */</span><br><span style="color: hsl(0, 100%, 40%);">-                        bi->rssi, bi->toa256,</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* FIXME: AVG ToA256 */</span><br><span style="color: hsl(120, 100%, 40%);">+                       rssi, bi->toa256,</span><br><span>                         0 /* FIXME: AVG C/I */,</span><br><span>                      ber10k, PRES_INFO_UNKNOWN);</span><br><span> bfi:</span><br><span>@@ -1356,7 +1480,7 @@</span><br><span> compose_l1sap:</span><br><span>        fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_TCH_F);</span><br><span>      return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 tch_data, rc, bi->toa256, ber10k, bi->rssi, is_sub);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    tch_data, rc, bi->toa256, ber10k, rssi, is_sub);</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single TCH/H burst was received by the PHY, process it */</span><br><span>@@ -1386,6 +1510,7 @@</span><br><span>         uint16_t ber10k;</span><br><span>     uint8_t is_sub = 0;</span><br><span>  uint8_t ft;</span><br><span style="color: hsl(120, 100%, 40%);">+   int8_t rssi;</span><br><span> </span><br><span>     /* handle RACH, if handover RACH detection is turned on */</span><br><span>   if (chan_state->ho_rach_detect == 1)</span><br><span>@@ -1411,7 +1536,9 @@</span><br><span>      /* update mask */</span><br><span>    *mask |= (1 << bid);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* copy burst to end of buffer of 6 bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* copy burst to end of buffer of 6 bursts, even though a normal TCH</span><br><span style="color: hsl(120, 100%, 40%);">+   * frame requires only 4 bursts. However, we will need 6 bursts to</span><br><span style="color: hsl(120, 100%, 40%);">+     * decode the FACCH channel (diagonal interleaving). */</span><br><span>      burst = *bursts_p + bid * 116 + 464;</span><br><span>         if (bi->burst_len > 0) {</span><br><span>               memcpy(burst, bi->burst + 3, 58);</span><br><span>@@ -1419,10 +1546,18 @@</span><br><span>       } else</span><br><span>               memset(burst, 0, 116);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* keep record of the rssi values for each burst */</span><br><span style="color: hsl(120, 100%, 40%);">+   chan_state->ul_rssi[bid + 4] = bi->rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* wait until complete set of bursts */</span><br><span>      if (bid != 1)</span><br><span>                return 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Precalculate the RSSI value for a regular TCH burst, this calucation</span><br><span style="color: hsl(120, 100%, 40%);">+        * will be valid for the most situation, however, FACCH and AMR-DTX</span><br><span style="color: hsl(120, 100%, 40%);">+    * frames require a different calculation mode. */</span><br><span style="color: hsl(120, 100%, 40%);">+    rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_MID_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* check for complete set of bursts */</span><br><span>       if ((*mask & 0x3) != 0x3) {</span><br><span>              LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span>@@ -1479,7 +1614,7 @@</span><br><span>           /* Tag all frames that are not regular AMR voice frames</span><br><span>                 as SUB-Frames */</span><br><span>          if (chan_state->amr_last_dtx != AMR_OTHER) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGL1S(DL1P, LOGL_INFO, l1t, bi->tn, chan, bi->fn,</span><br><span>                            "Received AMR SID frame: %s\n",</span><br><span>                            gsm0503_amr_dtx_frame_name(chan_state->amr_last_dtx));</span><br><span>                     is_sub = 1;</span><br><span>@@ -1496,6 +1631,30 @@</span><br><span>                         break;</span><br><span>               }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         switch (chan_state->amr_last_dtx) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case AHS_SID_FIRST_P1:</span><br><span style="color: hsl(120, 100%, 40%);">+                        rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_LOWER_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AHS_SID_FIRST_P2:</span><br><span style="color: hsl(120, 100%, 40%);">+                        rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_LOWER_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AHS_SID_UPDATE:</span><br><span style="color: hsl(120, 100%, 40%);">+                  rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_LOWER_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AHS_SID_UPDATE_CN:</span><br><span style="color: hsl(120, 100%, 40%);">+                       rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_LOWER_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AHS_ONSET:</span><br><span style="color: hsl(120, 100%, 40%);">+                       rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_MID_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AHS_SID_FIRST_INH:</span><br><span style="color: hsl(120, 100%, 40%);">+                       rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_LOWER_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AHS_SID_UPDATE_INH:</span><br><span style="color: hsl(120, 100%, 40%);">+                      rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_LOWER_TWO, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          if (rc)</span><br><span>                      trx_loop_amr_input(l1t,</span><br><span>                              trx_chan_desc[chan].chan_nr | bi->tn, chan_state,</span><br><span>@@ -1521,10 +1680,17 @@</span><br><span>                       tch_mode);</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* copy bursts to the beginning of the buffer since they are needed in</span><br><span style="color: hsl(120, 100%, 40%);">+         * the lower half of the buffer for the next run (diagonal interleaving) */</span><br><span>  memcpy(*bursts_p, *bursts_p + 232, 232);</span><br><span>     memcpy(*bursts_p + 232, *bursts_p + 464, 232);</span><br><span style="color: hsl(0, 100%, 40%);">-  ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* also move measurement values */</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(chan_state->ul_rssi, chan_state->ul_rssi + 2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(chan_state->ul_rssi + 2, chan_state->ul_rssi + 4, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span> </span><br><span>         /* Check if the frame is bad */</span><br><span>      if (rc < 0) {</span><br><span>@@ -1547,6 +1713,7 @@</span><br><span> </span><br><span>         /* FACCH */</span><br><span>  if (rc == GSM_MACBLOCK_LEN) {</span><br><span style="color: hsl(120, 100%, 40%);">+         rssi = calc_rssi_avg(chan_state->ul_rssi, RSSI_HR_ALL, lchan);</span><br><span>            chan_state->ul_ongoing_facch = 1;</span><br><span>                 uint16_t ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span>            if (lchan->nr == 0)</span><br><span>@@ -1555,10 +1722,11 @@</span><br><span>                     fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_H1);</span><br><span>           _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, chan,</span><br><span>                   tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span style="color: hsl(0, 100%, 40%);">-                       /* FIXME: AVG both RSSI and ToA */</span><br><span style="color: hsl(0, 100%, 40%);">-                      bi->rssi, bi->toa256,</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* FIXME: AVG ToA */</span><br><span style="color: hsl(120, 100%, 40%);">+                  rssi, bi->toa256,</span><br><span>                         0 /* FIXME: AVG C/I */,</span><br><span>                      ber10k, PRES_INFO_UNKNOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> bfi:</span><br><span>                /* FIXME: a FACCH/H frame replaces two speech frames,</span><br><span>                 * so we actually need to send two bad frame indications! */</span><br><span>@@ -1619,7 +1787,7 @@</span><br><span>         else</span><br><span>                 fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_TCH_H1);</span><br><span>     return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 tch_data, rc, bi->toa256, ber10k, bi->rssi, is_sub);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    tch_data, rc, bi->toa256, ber10k, rssi, is_sub);</span><br><span> }</span><br><span> </span><br><span> /* schedule all frames of all TRX for given FN */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18035">change 18035</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/18035"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I902bb47d68742d2589156f61099b67a0edbaf40b </div>
<div style="display:none"> Gerrit-Change-Number: 18035 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>