<p>dexter would like fixeria to <strong>review</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25284">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-bts-trx: implement Temporary Overpower for SACCH/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/sched_lchan_tchf.c<br>M src/osmo-bts-trx/sched_lchan_tchh.c<br>5 files changed, 42 insertions(+), 4 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/84/25284/1</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 80f1833..53b3b05 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -401,6 +401,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 6e1e4fb..c69c9dd 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -1278,6 +1278,23 @@</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_acch_overpower(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%);">+        if (overpower_db == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</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>@@ -1316,9 +1333,11 @@</span><br><span>   br->mod = l1cs->dl_mod_type;</span><br><span> </span><br><span>       /* BS Power reduction (in dB) per logical channel */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (l1cs->lchan != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+   if (l1cs->lchan != NULL) {</span><br><span>                br->att = l1cs->lchan->bs_power_ctrl.current;</span><br><span style="color: hsl(0, 100%, 40%);">-  else /* Ensure no attenuation in the absence of lchan (e.g. on PDCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Temporary Overpower for SACCH/FACCH bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+              trx_sched_acch_overpower(l1cs->lchan, br);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else /* Ensure no attenuation in the absence of lchan (e.g. on PDCH) */</span><br><span>            br->att = 0;</span><br><span> </span><br><span>  /* encrypt */</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 8e6298c..d2b39d2 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>@@ -544,10 +544,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>@@ -574,6 +575,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 bfebb66..cf0d65d 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>@@ -434,6 +434,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>@@ -463,6 +464,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: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>