<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/19029">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Hoernchen: 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/scheduler: refactor dummy burst scheduling<br><br>This change facilitates the upcoming freq. hopping implementation,<br>in particular scheduling of dummy bursts on C0 with hopping time-<br>slots.  One problem is that we cannot know in advance, whether to<br>send a dummy burst on a given timeslot unless all transceivers are<br>processed.  For example, trx#3 may want to send a normal burst on<br>ARFCN of trx#0 (C0), while we have already sent a dummy burst...<br><br>Another important aspect is that we shall not be sending dummy<br>bursts on transceivers other than C0.  Scheduling dummy bursts<br>from _sched_dl_burst() in the context of a single hopping timeslot<br>of a single transceiver leaves trx_sched_fn() no way to know<br>whether it's a dummy burst or something else.<br><br>Let's solve both problems by moving dummy burst scheduling logic<br>from _sched_dl_burst() to trx_sched_fn().  Maintain C0 slot-mask<br>in the inner (per-trx) loop, so that we can fill missing bursts<br>with dummy bursts afterwards.<br><br>Change-Id: I8c3651c27d2991079e83b8abdb7e2c3f95b97a43<br>Related: SYS#4868, OS#4546<br>---<br>M include/osmo-bts/scheduler_backend.h<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/scheduler_trx.c<br>3 files changed, 29 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h</span><br><span>index eb8039f..e3326f6 100644</span><br><span>--- a/include/osmo-bts/scheduler_backend.h</span><br><span>+++ b/include/osmo-bts/scheduler_backend.h</span><br><span>@@ -35,6 +35,7 @@</span><br><span> };</span><br><span> extern const struct trx_chan_desc trx_chan_desc[_TRX_CHAN_MAX];</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern const ubit_t _sched_dummy_burst[];</span><br><span> extern const ubit_t _sched_tsc[8][26];</span><br><span> extern const ubit_t _sched_egprs_tsc[8][78];</span><br><span> extern const ubit_t _sched_sch_train[64];</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index 7375a1a..c5b3830 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -52,8 +52,9 @@</span><br><span>   enum trx_chan_type chan);</span><br><span> static int rts_tchh_fn(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span>        enum trx_chan_type chan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! \brief Dummy Burst (TS 05.02 Chapter 5.2.6) */</span><br><span style="color: hsl(0, 100%, 40%);">-static const ubit_t dummy_burst[GSM_BURST_LEN] = {</span><br><span style="color: hsl(120, 100%, 40%);">+const ubit_t _sched_dummy_burst[GSM_BURST_LEN] = {</span><br><span>      0,0,0,</span><br><span>       1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,0,0,0,0,0,1,0,1,0,0,1,0,0,1,1,1,0,</span><br><span>     0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,</span><br><span>@@ -1189,7 +1190,7 @@</span><br><span>     enum trx_chan_type chan;</span><br><span> </span><br><span>         if (!l1ts->mf_index)</span><br><span style="color: hsl(0, 100%, 40%);">-         goto no_data;</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span> </span><br><span>  /* get frame from multiframe */</span><br><span>      period = l1ts->mf_period;</span><br><span>@@ -1204,11 +1205,11 @@</span><br><span> </span><br><span>   /* check if channel is active */</span><br><span>     if (!TRX_CHAN_IS_ACTIVE(l1cs, chan))</span><br><span style="color: hsl(0, 100%, 40%);">-            goto no_data;</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span> </span><br><span>  /* get burst from function */</span><br><span>        if (func(l1t, chan, bid, br) != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-              goto no_data;</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span> </span><br><span>  /* BS Power reduction (in dB) per logical channel */</span><br><span>         if (l1cs->lchan != NULL)</span><br><span>@@ -1225,19 +1226,6 @@</span><br><span>                         br->burst[i + 88] ^= ks[i + 57];</span><br><span>          }</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-no_data:</span><br><span style="color: hsl(0, 100%, 40%);">-       /* in case of C0, we need a dummy burst to maintain RF power */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!br->burst_len && l1t->trx == l1t->trx->bts->c0) {</span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span style="color: hsl(0, 100%, 40%);">-              if (chan != TRXC_IDLE) // hack</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGP(DL1C, LOGL_DEBUG, "No burst data for %s fn=%u ts=%u "</span><br><span style="color: hsl(0, 100%, 40%);">-                         "burst=%d on C0, so filling with dummy burst\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      trx_chan_desc[chan].name, fn, tn, bid);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-              memcpy(br->burst, dummy_burst, ARRAY_SIZE(dummy_burst));</span><br><span style="color: hsl(0, 100%, 40%);">-             br->burst_len = ARRAY_SIZE(dummy_burst);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span> }</span><br><span> </span><br><span> static int trx_sched_calc_frame_loss(struct l1sched_trx *l1t,</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 85f0e92..e617031 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>@@ -60,6 +60,7 @@</span><br><span> {</span><br><span>    struct trx_dl_burst_req br;</span><br><span>  struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t c0_mask = 0x00;</span><br><span>      uint32_t sched_fn;</span><br><span>   uint8_t tn;</span><br><span> </span><br><span>@@ -99,9 +100,31 @@</span><br><span>                                continue;</span><br><span>                    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                 /* update dummy burst mask for C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (trx == bts->c0)</span><br><span style="color: hsl(120, 100%, 40%);">+                                c0_mask |= (1 << tn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                        trx_if_send_burst(l1h, &br);</span><br><span>             }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* send dummy bursts on inactive timeslots of C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct phy_instance *pinst = trx_phy_instance(bts->c0);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct phy_link *plink = pinst->phy_link;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        br = (struct trx_dl_burst_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+              .fn = GSM_TDMA_FN_SUM(fn, plink->u.osmotrx.clock_advance),</span><br><span style="color: hsl(120, 100%, 40%);">+         .burst_len = GSM_BURST_LEN,</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%);">+  memcpy(br.burst, _sched_dummy_burst, GSM_BURST_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (br.tn = 0; br.tn < TRX_NR_TS; br.tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (c0_mask & (1 << br.tn))</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             trx_if_send_burst(l1h, &br);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> }</span><br><span> </span><br><span> /*! maximum number of 'missed' frame periods we can tolerate of OS doesn't schedule us*/</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/19029">change 19029</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/+/19029"/><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: I8c3651c27d2991079e83b8abdb7e2c3f95b97a43 </div>
<div style="display:none"> Gerrit-Change-Number: 19029 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@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-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>