<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25284">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-bts-trx: implement Temporary Overpower for SACCH/FACCH<br><br>GSM/EDGE Evolution and Performance, Section 12.3 suggests Temporary<br>Overpower as another solution to improve SACCH/FACCH performance in<br>case of bad C/I. The idea here is that you increment the DL transmit<br>power by 2..4dB only for FACCH/SACCH bursts, while keeping all voice<br>bursts at the lower (normal) level as determined by BS power control.<br><br>SACCH blocks can be recognized by the channel type, since they're<br>always transmitted in specific frames of a multiframe.  FACCH blocks,<br>however, are not predictable and can substitute voice blocks at<br>(almost) any time.  Thus we need to mark FACCH bursts as such in<br>the logical channel handlers (using TRX_BR_F_FACCH).<br><br>Change-Id: Ie8a626fefccf1eb07271058e5126ec106cb1abcf<br>Related: SYS#5319<br>---<br>M include/osmo-bts/gsm_data.h<br>M include/osmo-bts/scheduler.h<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/main.c<br>M src/osmo-bts-trx/sched_lchan_tchf.c<br>M src/osmo-bts-trx/sched_lchan_tchh.c<br>6 files changed, 43 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 19689e5..fe2862d 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -421,6 +421,9 @@</span><br><span>     struct gsm_power_ctrl_params ms_dpc_params;</span><br><span>  struct gsm_power_ctrl_params bs_dpc_params;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       /* Temporary Overpower for SACCH/FACCH */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t bs_acch_overpower_db;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      struct msgb *pending_rel_ind_msg;</span><br><span> </span><br><span>        /* ECU (Error Concealment Unit) state */</span><br><span>diff --git a/include/osmo-bts/scheduler.h b/include/osmo-bts/scheduler.h</span><br><span>index 80a260f..d640647 100644</span><br><span>--- a/include/osmo-bts/scheduler.h</span><br><span>+++ b/include/osmo-bts/scheduler.h</span><br><span>@@ -128,6 +128,8 @@</span><br><span>  struct l1sched_meas_set meas_avg_facch;   /* measurement results for last FACCH */</span><br><span>   uint16_t                ber10k_facch;     /* bit error rate for last FACCH */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t                 dl_facch_bursts;  /* number of remaining DL FACCH bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        /* encryption */</span><br><span>     int                     ul_encr_algo;   /* A5/x encry algo downlink */</span><br><span>       int                     dl_encr_algo;   /* A5/x encry algo uplink */</span><br><span>@@ -272,6 +274,8 @@</span><br><span>   size_t burst_len;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_BR_F_FACCH             (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! DL burst request with the corresponding meta info */</span><br><span> struct trx_dl_burst_req {</span><br><span>    uint8_t flags;          /*!< see TRX_BR_F_* */</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index a07ef68..ffa0ed8 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -1287,6 +1287,26 @@</span><br><span>      return func(l1ts, &dbr);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void trx_sched_apply_att(const struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                         struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct trx_chan_desc *desc = &trx_chan_desc[br->chan];</span><br><span style="color: hsl(120, 100%, 40%);">+   const uint8_t overpower_db = lchan->bs_acch_overpower_db;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Current BS power reduction value in dB */</span><br><span style="color: hsl(120, 100%, 40%);">+  br->att = lchan->bs_power_ctrl.current;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Temporary Overpower for SACCH/FACCH bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (overpower_db == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (desc->link_id == LID_SACCH || br->flags & TRX_BR_F_FACCH) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (br->att > overpower_db)</span><br><span style="color: hsl(120, 100%, 40%);">+                     br->att -= overpower_db;</span><br><span style="color: hsl(120, 100%, 40%);">+           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  br->att = 0;</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%);">+</span><br><span> /* process downlink burst */</span><br><span> void _sched_dl_burst(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>@@ -1326,7 +1346,7 @@</span><br><span> </span><br><span>        /* BS Power reduction (in dB) per logical channel */</span><br><span>         if (l1cs->lchan != NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-             br->att = l1cs->lchan->bs_power_ctrl.current;</span><br><span style="color: hsl(120, 100%, 40%);">+                trx_sched_apply_att(l1cs->lchan, br);</span><br><span> </span><br><span>         /* encrypt */</span><br><span>        if (br->burst_len && l1cs->dl_encr_algo) {</span><br><span>diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c</span><br><span>index 9720b03..e31597b 100644</span><br><span>--- a/src/osmo-bts-trx/main.c</span><br><span>+++ b/src/osmo-bts-trx/main.c</span><br><span>@@ -148,6 +148,7 @@</span><br><span>      osmo_bts_set_feature(bts->features, BTS_FEAT_MULTI_TSC);</span><br><span>  osmo_bts_set_feature(bts->features, BTS_FEAT_VAMOS);</span><br><span>      osmo_bts_set_feature(bts->features, BTS_FEAT_BCCH_POWER_RED);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_bts_set_feature(bts->features, BTS_FEAT_ACCH_TEMP_OVP);</span><br><span> </span><br><span>  bts_internal_flag_set(bts, BTS_INTERNAL_FLAG_MEAS_PAYLOAD_COMB);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_tchf.c b/src/osmo-bts-trx/sched_lchan_tchf.c</span><br><span>index 85fe207..8cf096d 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_tchf.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_tchf.c</span><br><span>@@ -547,10 +547,11 @@</span><br><span>        }</span><br><span> </span><br><span>        /* encode bursts (prioritize FACCH) */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (msg_facch)</span><br><span style="color: hsl(120, 100%, 40%);">+        if (msg_facch) {</span><br><span>             gsm0503_tch_fr_encode(*bursts_p, msg_facch->l2h, msgb_l2len(msg_facch),</span><br><span>                   1);</span><br><span style="color: hsl(0, 100%, 40%);">-     else if (tch_mode == GSM48_CMODE_SPEECH_AMR)</span><br><span style="color: hsl(120, 100%, 40%);">+          chan_state->dl_facch_bursts = 8;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (tch_mode == GSM48_CMODE_SPEECH_AMR)</span><br><span>               /* the first FN 4,13,21 defines that CMI is included in frame,</span><br><span>                * the first FN 0,8,17 defines that CMR is included in frame.</span><br><span>                 */</span><br><span>@@ -577,6 +578,11 @@</span><br><span> </span><br><span>       br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (chan_state->dl_facch_bursts > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          chan_state->dl_facch_bursts--;</span><br><span style="color: hsl(120, 100%, 40%);">+             br->flags |= TRX_BR_F_FACCH;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  LOGL1SB(DL1P, LOGL_DEBUG, l1ts, br, "Transmitting burst=%u.\n", br->bid);</span><br><span> </span><br><span>   return 0;</span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_tchh.c b/src/osmo-bts-trx/sched_lchan_tchh.c</span><br><span>index a1ed996..ea1060c 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_tchh.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_tchh.c</span><br><span>@@ -445,6 +445,7 @@</span><br><span>     if (msg_facch) {</span><br><span>             gsm0503_tch_hr_encode(*bursts_p, msg_facch->l2h, msgb_l2len(msg_facch));</span><br><span>          chan_state->dl_ongoing_facch = 1; /* first of two TCH frames */</span><br><span style="color: hsl(120, 100%, 40%);">+            chan_state->dl_facch_bursts = 6;</span><br><span>  } else if (chan_state->dl_ongoing_facch) /* second of two TCH frames */</span><br><span>           chan_state->dl_ongoing_facch = 0; /* we are done with FACCH */</span><br><span>    else if (tch_mode == GSM48_CMODE_SPEECH_AMR)</span><br><span>@@ -474,6 +475,11 @@</span><br><span> </span><br><span>      br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (chan_state->dl_facch_bursts > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          chan_state->dl_facch_bursts--;</span><br><span style="color: hsl(120, 100%, 40%);">+             br->flags |= TRX_BR_F_FACCH;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  LOGL1SB(DL1P, LOGL_DEBUG, l1ts, br, "Transmitting burst=%u.\n", br->bid);</span><br><span> </span><br><span>   return 0;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25284">change 25284</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/+/25284"/><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: Ie8a626fefccf1eb07271058e5126ec106cb1abcf </div>
<div style="display:none"> Gerrit-Change-Number: 25284 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>