<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>