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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[VAMOS] osmo-bts-trx: move {chan,bid} to trx_{dl,ul}_burst_{req,ind}<br><br>Historically the logical channel handlers like rx_data_fn() used to accept<br>quite a lot of arguments.  With the introduction of additional measurement<br>parameters it has become clear that we need to group the arguments into<br>structures.  This is why both 'trx_{dl,ul}_burst_{req,ind}' structures<br>were introduced.<br><br>However, both channel type and burst ID were kept untouched, so until<br>now we had them being passed between the scheduler functions here and<br>there.  This change is a logical conclusion of the original change<br>mentioned above.<br><br>As a part of this change, the new LOGL1SB() macro is introduced.  It<br>does accept a pointer to 'trx_{dl,ul}_burst_{req,ind}' and expands the<br>context information for the old LOGL1S() macro.<br><br>Change-Id: Ic5a02b074662b3e429bf18e05a982f3f3e7b7444<br>---<br>M include/osmo-bts/scheduler.h<br>M include/osmo-bts/scheduler_backend.h<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/sched_lchan_fcch_sch.c<br>M src/osmo-bts-trx/sched_lchan_pdtch.c<br>M src/osmo-bts-trx/sched_lchan_rach.c<br>M src/osmo-bts-trx/sched_lchan_tchf.c<br>M src/osmo-bts-trx/sched_lchan_tchh.c<br>M src/osmo-bts-trx/sched_lchan_xcch.c<br>M src/osmo-bts-trx/scheduler_trx.c<br>M src/osmo-bts-virtual/scheduler_virtbts.c<br>11 files changed, 312 insertions(+), 353 deletions(-)<br><br></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 ad6e5c5..2d613e7 100644</span><br><span>--- a/include/osmo-bts/scheduler.h</span><br><span>+++ b/include/osmo-bts/scheduler.h</span><br><span>@@ -249,6 +249,10 @@</span><br><span>   uint8_t tsc;            /*!< Training Sequence Code */</span><br><span>    int16_t ci_cb;          /*!< Carrier-to-Interference ratio (in centiBels) */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Internally used by the scheduler */</span><br><span style="color: hsl(120, 100%, 40%);">+        enum trx_chan_type chan;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t bid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       /*! Burst soft-bits buffer */</span><br><span>        sbit_t burst[EGPRS_BURST_LEN];</span><br><span>       size_t burst_len;</span><br><span>@@ -260,6 +264,10 @@</span><br><span>     uint8_t tn;             /*!< TDMA timeslot number */</span><br><span>      uint8_t att;            /*!< Tx power attenuation */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Internally used by the scheduler */</span><br><span style="color: hsl(120, 100%, 40%);">+        enum trx_chan_type chan;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t bid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       /*! Burst hard-bits buffer */</span><br><span>        ubit_t burst[EGPRS_BURST_LEN];</span><br><span>       size_t burst_len;</span><br><span>diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h</span><br><span>index e3326f6..13ca71b 100644</span><br><span>--- a/include/osmo-bts/scheduler_backend.h</span><br><span>+++ b/include/osmo-bts/scheduler_backend.h</span><br><span>@@ -6,14 +6,16 @@</span><br><span>                   gsm_ts_name(&(l1t)->trx->ts[tn]),     \</span><br><span>                    chan >=0 ? trx_chan_desc[chan].name : "", ## args)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Logging helper adding context from trx_{ul,dl}_burst_{ind,req} */</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGL1SB(subsys, level, l1t, b, fmt, args ...) \</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGL1S(subsys, level, l1t, (b)->tn, (b)->chan, (b)->fn, fmt, ## args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> typedef int trx_sched_rts_func(struct l1sched_trx *l1t, uint8_t tn,</span><br><span>                             uint32_t fn, enum trx_chan_type chan);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-typedef int trx_sched_dl_func(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                              uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+typedef int trx_sched_dl_func(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-typedef int trx_sched_ul_func(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                             uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+typedef int trx_sched_ul_func(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi);</span><br><span> </span><br><span> struct trx_chan_desc {</span><br><span>     /*! \brief Human-readable name */</span><br><span>@@ -40,8 +42,8 @@</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> </span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *_sched_dequeue_prim(struct l1sched_trx *l1t, int8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                          enum trx_chan_type chan);</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *_sched_dequeue_prim(struct l1sched_trx *l1t,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const struct trx_dl_burst_req *br);</span><br><span> </span><br><span> int _sched_compose_ph_data_ind(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span>                                enum trx_chan_type chan, uint8_t *l2,</span><br><span>@@ -55,31 +57,19 @@</span><br><span>                      int16_t ta_offs_256bits, uint16_t ber10k, float rssi,</span><br><span>                        uint8_t is_sub);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int tx_idle_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_fcch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_sch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_idle_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_fcch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_sch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_data_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_pdtch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_tchf_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_tchh_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_rach_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-         uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_rach_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_data_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_pdtch_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchf_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchh_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi);</span><br><span> </span><br><span> void _sched_dl_burst(struct l1sched_trx *l1t, struct trx_dl_burst_req *br);</span><br><span> int _sched_rts(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn);</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index c7c3e62..87a1f60 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -637,13 +637,13 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *_sched_dequeue_prim(struct l1sched_trx *l1t, int8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                              enum trx_chan_type chan)</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *_sched_dequeue_prim(struct l1sched_trx *l1t,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>     struct msgb *msg, *msg2;</span><br><span>     uint32_t prim_fn, l1sap_fn;</span><br><span>  uint8_t chan_nr, link_id;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span> </span><br><span>    /* get prim of current fn from queue */</span><br><span>      llist_for_each_entry_safe(msg, msg2, &l1ts->dl_prims, list) {</span><br><span>@@ -660,18 +660,18 @@</span><br><span>                         l1sap_fn = l1sap->u.tch.fn;</span><br><span>                       break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Prim has wrong type.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Prim has wrong type.\n");</span><br><span>                      goto free_msg;</span><br><span>               }</span><br><span style="color: hsl(0, 100%, 40%);">-               prim_fn = GSM_TDMA_FN_SUB(l1sap_fn, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+              prim_fn = GSM_TDMA_FN_SUB(l1sap_fn, br->fn);</span><br><span>              if (prim_fn > 100) { /* l1sap_fn < fn */</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGL1SB(DL1P, LOGL_NOTICE, l1t, br,</span><br><span>                       "Prim %u is out of range (%u vs exp %u), or channel %s with "</span><br><span>                              "type %s is already disabled. If this happens in "</span><br><span>                         "conjunction with PCU, increase 'rts-advance' by 5.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       prim_fn, l1sap_fn, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                        prim_fn, l1sap_fn, br->fn,</span><br><span>                        get_lchan_by_chan_nr(l1t->trx, chan_nr)->name,</span><br><span style="color: hsl(0, 100%, 40%);">-                            trx_chan_desc[chan].name);</span><br><span style="color: hsl(120, 100%, 40%);">+                            trx_chan_desc[br->chan].name);</span><br><span>                       rate_ctr_inc2(l1ts->ctrs, L1SCHED_TS_CTR_DL_LATE);</span><br><span>                        /* unlink and free message */</span><br><span>                        llist_del(&msg->list);</span><br><span>@@ -682,11 +682,11 @@</span><br><span>                        break;</span><br><span> </span><br><span>           /* l1sap_fn == fn */</span><br><span style="color: hsl(0, 100%, 40%);">-            if ((chan_nr ^ (trx_chan_desc[chan].chan_nr | tn))</span><br><span style="color: hsl(0, 100%, 40%);">-               || ((link_id & 0xc0) ^ trx_chan_desc[chan].link_id)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Prim has wrong chan_nr=0x%02x link_id=%02x, "</span><br><span style="color: hsl(120, 100%, 40%);">+          if ((chan_nr ^ (trx_chan_desc[br->chan].chan_nr | br->tn))</span><br><span style="color: hsl(120, 100%, 40%);">+               || ((link_id & 0xc0) ^ trx_chan_desc[br->chan].link_id)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Prim has wrong chan_nr=0x%02x link_id=%02x, "</span><br><span>                          "expecting chan_nr=0x%02x link_id=%02x.\n", chan_nr, link_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                         trx_chan_desc[chan].chan_nr | tn, trx_chan_desc[chan].link_id);</span><br><span style="color: hsl(120, 100%, 40%);">+                               trx_chan_desc[br->chan].chan_nr | br->tn, trx_chan_desc[br->chan].link_id);</span><br><span>                         goto free_msg;</span><br><span>               }</span><br><span> </span><br><span>@@ -1209,9 +1209,8 @@</span><br><span>        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span>        struct l1sched_chan_state *l1cs;</span><br><span>     const struct trx_sched_frame *frame;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t offset, period, bid;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t offset, period;</span><br><span>      trx_sched_dl_func *func;</span><br><span style="color: hsl(0, 100%, 40%);">-        enum trx_chan_type chan;</span><br><span> </span><br><span>         if (!l1ts->mf_index)</span><br><span>              return;</span><br><span>@@ -1221,18 +1220,18 @@</span><br><span>    offset = br->fn % period;</span><br><span>         frame = l1ts->mf_frames + offset;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        chan = frame->dl_chan;</span><br><span style="color: hsl(0, 100%, 40%);">-       bid = frame->dl_bid;</span><br><span style="color: hsl(0, 100%, 40%);">- func = trx_chan_desc[chan].dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+     br->chan = frame->dl_chan;</span><br><span style="color: hsl(120, 100%, 40%);">+      br->bid = frame->dl_bid;</span><br><span style="color: hsl(120, 100%, 40%);">+        func = trx_chan_desc[br->chan].dl_fn;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    l1cs = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+        l1cs = &l1ts->chan_state[br->chan];</span><br><span> </span><br><span>    /* check if channel is active */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!TRX_CHAN_IS_ACTIVE(l1cs, chan))</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!TRX_CHAN_IS_ACTIVE(l1cs, br->chan))</span><br><span>          return;</span><br><span> </span><br><span>  /* get burst from function */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (func(l1t, chan, bid, br) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (func(l1t, br) != 0)</span><br><span>              return;</span><br><span> </span><br><span>  /* BS Power reduction (in dB) per logical channel */</span><br><span>@@ -1253,9 +1252,9 @@</span><br><span> }</span><br><span> </span><br><span> static int trx_sched_calc_frame_loss(struct l1sched_trx *l1t,</span><br><span style="color: hsl(0, 100%, 40%);">-  struct l1sched_chan_state *l1cs, uint8_t tn, uint32_t fn)</span><br><span style="color: hsl(120, 100%, 40%);">+                                  struct l1sched_chan_state *l1cs,</span><br><span style="color: hsl(120, 100%, 40%);">+                              const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    const struct trx_sched_frame *frame_head;</span><br><span>    const struct trx_sched_frame *frame;</span><br><span>         struct l1sched_ts *l1ts;</span><br><span>     uint32_t elapsed_fs;</span><br><span>@@ -1271,12 +1270,10 @@</span><br><span>               return 0;</span><br><span> </span><br><span>        /* Get current TDMA frame info */</span><br><span style="color: hsl(0, 100%, 40%);">-       l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(0, 100%, 40%);">-     offset = fn % l1ts->mf_period;</span><br><span style="color: hsl(0, 100%, 40%);">-       frame_head = l1ts->mf_frames + offset;</span><br><span style="color: hsl(120, 100%, 40%);">+     l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span> </span><br><span>       /* Not applicable for some logical channels */</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (frame_head->ul_chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (bi->chan) {</span><br><span>       case TRXC_IDLE:</span><br><span>      case TRXC_RACH:</span><br><span>      case TRXC_PDTCH:</span><br><span>@@ -1289,9 +1286,9 @@</span><br><span>     }</span><br><span> </span><br><span>        /* How many frames elapsed since the last one? */</span><br><span style="color: hsl(0, 100%, 40%);">-       elapsed_fs = GSM_TDMA_FN_SUB(fn, l1cs->last_tdma_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+      elapsed_fs = GSM_TDMA_FN_SUB(bi->fn, l1cs->last_tdma_fn);</span><br><span>      if (elapsed_fs > l1ts->mf_period) { /* Too many! */</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_ERROR, l1t, tn, frame_head->ul_chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGL1SB(DL1P, LOGL_ERROR, l1t, bi,</span><br><span>                   "Too many (>%u) contiguous TDMA frames=%u elapsed "</span><br><span>                     "since the last processed fn=%u\n", l1ts->mf_period,</span><br><span>                    elapsed_fs, l1cs->last_tdma_fn);</span><br><span>@@ -1312,12 +1309,12 @@</span><br><span>                offset = fn_i % l1ts->mf_period;</span><br><span>          frame = l1ts->mf_frames + offset;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                if (frame->ul_chan == frame_head->ul_chan)</span><br><span style="color: hsl(120, 100%, 40%);">+              if (frame->ul_chan == bi->chan)</span><br><span>                        l1cs->lost_tdma_fs++;</span><br><span>     }</span><br><span> </span><br><span>        if (l1cs->lost_tdma_fs > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, frame_head->ul_chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi,</span><br><span>                  "At least %u TDMA frames were lost since the last "</span><br><span>                        "processed fn=%u\n", l1cs->lost_tdma_fs, l1cs->last_tdma_fn);</span><br><span> </span><br><span>@@ -1330,14 +1327,15 @@</span><br><span>          trx_sched_ul_func *func;</span><br><span> </span><br><span>                 /* Prepare dummy burst indication */</span><br><span style="color: hsl(0, 100%, 40%);">-            struct trx_ul_burst_ind bi = {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct trx_ul_burst_ind dbi = {</span><br><span>                      .flags = TRX_BI_F_NOPE_IND,</span><br><span>                  .burst_len = GSM_BURST_LEN,</span><br><span>                  .burst = { 0 },</span><br><span>                      .rssi = -128,</span><br><span>                        .toa256 = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .chan = bi->chan,</span><br><span>                         /* TDMA FN is set below */</span><br><span style="color: hsl(0, 100%, 40%);">-                      .tn = tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     .tn = bi->tn,</span><br><span>             };</span><br><span> </span><br><span>               for (i = 1; i < elapsed_fs; i++) {</span><br><span>@@ -1346,15 +1344,16 @@</span><br><span>                      frame = l1ts->mf_frames + offset;</span><br><span>                         func = trx_chan_desc[frame->ul_chan].ul_fn;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                      if (frame->ul_chan != frame_head->ul_chan)</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (frame->ul_chan != bi->chan)</span><br><span>                                continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, frame->ul_chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                               "Substituting lost TDMA frame=%u by all-zero "</span><br><span style="color: hsl(0, 100%, 40%);">-                                "dummy burst\n", fn_i);</span><br><span style="color: hsl(120, 100%, 40%);">+                     dbi.bid = frame->ul_bid;</span><br><span style="color: hsl(120, 100%, 40%);">+                   dbi.fn = fn_i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                      bi.fn = fn_i;</span><br><span style="color: hsl(0, 100%, 40%);">-                   func(l1t, frame->ul_chan, frame->ul_bid, &bi);</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_NOTICE, l1t, &dbi,</span><br><span style="color: hsl(120, 100%, 40%);">+                             "Substituting lost burst with NOPE.ind\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       func(l1t, &dbi);</span><br><span> </span><br><span>                     l1cs->lost_tdma_fs--;</span><br><span>             }</span><br><span>@@ -1369,9 +1368,8 @@</span><br><span>    struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span>        struct l1sched_chan_state *l1cs;</span><br><span>     const struct trx_sched_frame *frame;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t offset, period, bid;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t offset, period;</span><br><span>      trx_sched_ul_func *func;</span><br><span style="color: hsl(0, 100%, 40%);">-        enum trx_chan_type chan;</span><br><span> </span><br><span>         if (!l1ts->mf_index)</span><br><span>              return -EINVAL;</span><br><span>@@ -1381,20 +1379,19 @@</span><br><span>    offset = bi->fn % period;</span><br><span>         frame = l1ts->mf_frames + offset;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        chan = frame->ul_chan;</span><br><span style="color: hsl(0, 100%, 40%);">-       bid = frame->ul_bid;</span><br><span style="color: hsl(0, 100%, 40%);">- l1cs = &l1ts->chan_state[chan];</span><br><span style="color: hsl(0, 100%, 40%);">-  func = trx_chan_desc[chan].ul_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+     bi->chan = frame->ul_chan;</span><br><span style="color: hsl(120, 100%, 40%);">+      bi->bid = frame->ul_bid;</span><br><span style="color: hsl(120, 100%, 40%);">+        l1cs = &l1ts->chan_state[bi->chan];</span><br><span style="color: hsl(120, 100%, 40%);">+ func = trx_chan_desc[bi->chan].ul_fn;</span><br><span> </span><br><span>         /* TODO: handle noise measurements */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (chan == TRXC_IDLE && bi->flags & TRX_BI_F_NOPE_IND) {</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(0, 100%, 40%);">-                      "Rx noise measurement (%d)\n", bi->rssi);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->chan == TRXC_IDLE && bi->flags & TRX_BI_F_NOPE_IND) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Rx noise measurement (%d)\n", bi->rssi);</span><br><span>            return -ENOTSUP;</span><br><span>     }</span><br><span> </span><br><span>        /* check if channel is active */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!TRX_CHAN_IS_ACTIVE(l1cs, chan))</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!TRX_CHAN_IS_ACTIVE(l1cs, bi->chan))</span><br><span>          return -EINVAL;</span><br><span> </span><br><span>  /* omit bursts which have no handler, like IDLE bursts */</span><br><span>@@ -1402,7 +1399,7 @@</span><br><span>            return -EINVAL;</span><br><span> </span><br><span>  /* calculate how many TDMA frames were potentially lost */</span><br><span style="color: hsl(0, 100%, 40%);">-      trx_sched_calc_frame_loss(l1t, l1cs, bi->tn, bi->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+   trx_sched_calc_frame_loss(l1t, l1cs, bi);</span><br><span> </span><br><span>        /* update TDMA frame counters */</span><br><span>     l1cs->last_tdma_fn = bi->fn;</span><br><span>@@ -1410,7 +1407,7 @@</span><br><span> </span><br><span>       /* handle NOPE indications */</span><br><span>        if (bi->flags & TRX_BI_F_NOPE_IND) {</span><br><span style="color: hsl(0, 100%, 40%);">-             switch (chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (bi->chan) {</span><br><span>               case TRXC_PTCCH:</span><br><span>             case TRXC_RACH:</span><br><span>                      /* For some logical channel types NOPE.ind is valueless. */</span><br><span>@@ -1418,7 +1415,7 @@</span><br><span>          default:</span><br><span>                     /* NOTE: Uplink burst handler must check bi->burst_len before</span><br><span>                      * accessing bi->burst to avoid uninitialized memory access. */</span><br><span style="color: hsl(0, 100%, 40%);">-                      return func(l1t, chan, bid, bi);</span><br><span style="color: hsl(120, 100%, 40%);">+                      return func(l1t, bi);</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span>@@ -1437,7 +1434,7 @@</span><br><span>        }</span><br><span> </span><br><span>        /* Invoke the logical channel handler */</span><br><span style="color: hsl(0, 100%, 40%);">-        func(l1t, chan, bid, bi);</span><br><span style="color: hsl(120, 100%, 40%);">+     func(l1t, bi);</span><br><span> </span><br><span>   return 0;</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_fcch_sch.c b/src/osmo-bts-trx/sched_lchan_fcch_sch.c</span><br><span>index 2a5e482..4aac601 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_fcch_sch.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_fcch_sch.c</span><br><span>@@ -1,6 +1,7 @@</span><br><span> /*</span><br><span>  * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2015-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -35,10 +36,9 @@</span><br><span> #include <sched_utils.h></span><br><span> </span><br><span> /* obtain a to-be-transmitted FCCH (frequency correction channel) burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_fcch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_fcch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting FCCH\n");</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGL1SB(DL1P, LOGL_DEBUG, l1t, br, "Transmitting FCCH\n");</span><br><span> </span><br><span>     /* A frequency correction burst is basically a sequence of zeros.</span><br><span>     * Since br->burst is already zero-initialized, just set the length. */</span><br><span>@@ -48,15 +48,14 @@</span><br><span> }</span><br><span> </span><br><span> /* obtain a to-be-transmitted SCH (synchronization channel) burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_sch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_sch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>    ubit_t burst[78];</span><br><span>    uint8_t sb_info[4];</span><br><span>  struct  gsm_time t;</span><br><span>  uint8_t t3p, bsic;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting SCH\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGL1SB(DL1P, LOGL_DEBUG, l1t, br, "Transmitting SCH\n");</span><br><span> </span><br><span>      /* BURST BYPASS */</span><br><span> </span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_pdtch.c b/src/osmo-bts-trx/sched_lchan_pdtch.c</span><br><span>index d936f75..7ccc77a 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_pdtch.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_pdtch.c</span><br><span>@@ -1,6 +1,7 @@</span><br><span> /*</span><br><span>  * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2015-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -38,11 +39,10 @@</span><br><span> #define EGPRS_0503_MAX_BYTES   155</span><br><span> </span><br><span> /*! \brief a single PDTCH burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_pdtch_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>    struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[bi->chan];</span><br><span>       sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint32_t first_fn;</span><br><span>   uint8_t *mask = &chan_state->ul_mask;</span><br><span>@@ -55,8 +55,7 @@</span><br><span>     int rc;</span><br><span>      enum osmo_ph_pres_info_type presence_info;</span><br><span> </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(0, 100%, 40%);">-               "Received PDTCH bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received PDTCH bid=%u\n", bi->bid);</span><br><span> </span><br><span>     /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -67,13 +66,13 @@</span><br><span>      }</span><br><span> </span><br><span>        /* clear burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bi->bid == 0) {</span><br><span>               memset(*bursts_p, 0, GSM0503_EGPRS_BURSTS_NBITS);</span><br><span>            *mask = 0x0;</span><br><span>         }</span><br><span> </span><br><span>        /* update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << bi->bid);</span><br><span> </span><br><span>        /* store measurements */</span><br><span>     trx_sched_meas_push(chan_state, bi);</span><br><span>@@ -81,26 +80,26 @@</span><br><span>   /* copy burst to buffer of 4 bursts */</span><br><span>       switch (bi->burst_len) {</span><br><span>  case EGPRS_BURST_LEN:</span><br><span style="color: hsl(0, 100%, 40%);">-           burst = *bursts_p + bid * 348;</span><br><span style="color: hsl(120, 100%, 40%);">+                burst = *bursts_p + bi->bid * 348;</span><br><span>                memcpy(burst, bi->burst + 9, 174);</span><br><span>                memcpy(burst + 174, bi->burst + 261, 174);</span><br><span>                n_bursts_bits = GSM0503_EGPRS_BURSTS_NBITS;</span><br><span>          break;</span><br><span>       case GSM_BURST_LEN:</span><br><span style="color: hsl(0, 100%, 40%);">-             burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+                burst = *bursts_p + bi->bid * 116;</span><br><span>                memcpy(burst, bi->burst + 3, 58);</span><br><span>                 memcpy(burst + 58, bi->burst + 87, 58);</span><br><span>           n_bursts_bits = GSM0503_GPRS_BURSTS_NBITS;</span><br><span>           break;</span><br><span>       case 0:</span><br><span>              /* NOPE.ind, assume GPRS? */</span><br><span style="color: hsl(0, 100%, 40%);">-            burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+                burst = *bursts_p + bi->bid * 116;</span><br><span>                memset(burst, 0, 116);</span><br><span>               n_bursts_bits = GSM0503_GPRS_BURSTS_NBITS;</span><br><span>   }</span><br><span> </span><br><span>        /* wait until complete set of bursts */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bid != 3)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->bid != 3)</span><br><span>                 return 0;</span><br><span> </span><br><span>        /* average measurements of the last 4 bursts */</span><br><span>@@ -108,8 +107,7 @@</span><br><span> </span><br><span>    /* check for complete set of bursts */</span><br><span>       if ((*mask & 0xf) != 0xf) {</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(0, 100%, 40%);">-                       "Received incomplete frame (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received incomplete frame (%u/%u)\n",</span><br><span>                  bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>         }</span><br><span>    *mask = 0x0;</span><br><span>@@ -131,8 +129,7 @@</span><br><span>   if (rc > 0) {</span><br><span>             presence_info = PRES_INFO_BOTH;</span><br><span>      } else {</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(0, 100%, 40%);">-                       "Received bad PDTCH (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received bad PDTCH (%u/%u)\n",</span><br><span>                         bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                 rc = 0;</span><br><span>              presence_info = PRES_INFO_INVALID;</span><br><span>@@ -142,36 +139,35 @@</span><br><span> </span><br><span>       first_fn = GSM_TDMA_FN_SUB(bi->fn, 3);</span><br><span>    return _sched_compose_ph_data_ind(l1t, bi->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         first_fn, chan, l2, rc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       first_fn, bi->chan, l2, rc,</span><br><span>                                       meas_avg.rssi, meas_avg.toa256,</span><br><span>                                      meas_avg.ci_cb, ber10k,</span><br><span>                                      presence_info);</span><br><span> }</span><br><span> </span><br><span> /* obtain a to-be-transmitted PDTCH (packet data) burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_pdtch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span>        struct gsm_bts_trx_ts *ts = &l1t->trx->ts[br->tn];</span><br><span>      struct msgb *msg = NULL; /* make GCC happy */</span><br><span style="color: hsl(0, 100%, 40%);">-   ubit_t *burst, **bursts_p = &l1ts->chan_state[chan].dl_bursts;</span><br><span style="color: hsl(0, 100%, 40%);">-   enum trx_mod_type *mod = &l1ts->chan_state[chan].dl_mod_type;</span><br><span style="color: hsl(120, 100%, 40%);">+  ubit_t *burst, **bursts_p = &l1ts->chan_state[br->chan].dl_bursts;</span><br><span style="color: hsl(120, 100%, 40%);">+  enum trx_mod_type *mod = &l1ts->chan_state[br->chan].dl_mod_type;</span><br><span>  int rc = 0;</span><br><span> </span><br><span>      /* send burst, if we already got a frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (bid > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (br->bid > 0) {</span><br><span>             if (!*bursts_p)</span><br><span>                      return 0;</span><br><span>            goto send_burst;</span><br><span>     }</span><br><span> </span><br><span>        /* get mac block from queue */</span><br><span style="color: hsl(0, 100%, 40%);">-  msg = _sched_dequeue_prim(l1t, br->tn, br->fn, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = _sched_dequeue_prim(l1t, br);</span><br><span>  if (msg)</span><br><span>             goto got_msg;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "No prim for transmit.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGL1SB(DL1P, LOGL_INFO, l1t, br, "No prim for transmit.\n");</span><br><span> </span><br><span> no_msg:</span><br><span>       /* free burst memory */</span><br><span>@@ -199,7 +195,7 @@</span><br><span> </span><br><span>    /* check validity of message */</span><br><span>      if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_FATAL, l1t, br->tn, chan, br->fn, "Prim invalid length, please FIX! "</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_FATAL, l1t, br, "Prim invalid length, please FIX! "</span><br><span>                     "(len=%ld)\n", (long)(msg->tail - msg->l2h));</span><br><span>                /* free message */</span><br><span>           msgb_free(msg);</span><br><span>@@ -216,7 +212,7 @@</span><br><span> send_burst:</span><br><span>         /* compose burst */</span><br><span>  if (*mod == TRX_MOD_T_8PSK) {</span><br><span style="color: hsl(0, 100%, 40%);">-           burst = *bursts_p + bid * 348;</span><br><span style="color: hsl(120, 100%, 40%);">+                burst = *bursts_p + br->bid * 348;</span><br><span>                memset(br->burst, 1, 9);</span><br><span>          memcpy(br->burst + 9, burst, 174);</span><br><span>                memcpy(br->burst + 183, _sched_egprs_tsc[gsm_ts_tsc(ts)], 78);</span><br><span>@@ -225,7 +221,7 @@</span><br><span> </span><br><span>          br->burst_len = EGPRS_BURST_LEN;</span><br><span>  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+                burst = *bursts_p + br->bid * 116;</span><br><span>                memcpy(br->burst + 3, burst, 58);</span><br><span>                 memcpy(br->burst + 61, _sched_tsc[gsm_ts_tsc(ts)], 26);</span><br><span>           memcpy(br->burst + 87, burst + 58, 58);</span><br><span>@@ -233,7 +229,7 @@</span><br><span>             br->burst_len = GSM_BURST_LEN;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting burst=%u.\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGL1SB(DL1P, LOGL_DEBUG, l1t, br, "Transmitting burst=%u.\n", br->bid);</span><br><span> </span><br><span>    return 0;</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_rach.c b/src/osmo-bts-trx/sched_lchan_rach.c</span><br><span>index fa50f14..ce9a46b 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_rach.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_rach.c</span><br><span>@@ -2,6 +2,7 @@</span><br><span>  * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2015-2017 by Harald Welte <laforge@gnumonks.org></span><br><span>  * (C) 2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -101,8 +102,7 @@</span><br><span>   return seq;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_rach_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_rach_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      struct osmo_phsap_prim l1sap;</span><br><span>        int n_errors = 0;</span><br><span>@@ -123,16 +123,16 @@</span><br><span>    /* If logical channel is not either of RACH, PDTCH or PTCCH, this is a</span><br><span>        * handover Access Burst, which is always encoded as 8-bit and shall</span><br><span>          * contain the generic training sequence (TS0). */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (chan == TRXC_RACH || chan == TRXC_PDTCH || chan == TRXC_PTCCH) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (bi->chan == TRXC_RACH || bi->chan == TRXC_PDTCH || bi->chan == TRXC_PTCCH) {</span><br><span>            if (bi->flags & TRX_BI_F_TS_INFO)</span><br><span>                     synch_seq = (enum rach_synch_seq_t) bi->tsc;</span><br><span>              else</span><br><span>                         synch_seq = rach_get_synch_seq((sbit_t *) bi->burst, &best_score);</span><br><span>    }</span><br><span> </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%);">+     LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi,</span><br><span>          "Received%s RACH (%s): rssi=%d toa256=%d",</span><br><span style="color: hsl(0, 100%, 40%);">-            (chan != TRXC_RACH) ? " handover" : "",</span><br><span style="color: hsl(120, 100%, 40%);">+           (bi->chan != TRXC_RACH) ? " handover" : "",</span><br><span>           get_value_string(rach_synch_seq_names, synch_seq),</span><br><span>           bi->rssi, bi->toa256);</span><br><span>  if (bi->flags & TRX_BI_F_CI_CB)</span><br><span>@@ -145,7 +145,7 @@</span><br><span>         /* Compose a new L1SAP primitive */</span><br><span>  memset(&l1sap, 0x00, sizeof(l1sap));</span><br><span>     osmo_prim_init(&l1sap.oph, SAP_GSM_PH, PRIM_PH_RACH, PRIM_OP_INDICATION, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-     l1sap.u.rach_ind.chan_nr = trx_chan_desc[chan].chan_nr | bi->tn;</span><br><span style="color: hsl(120, 100%, 40%);">+   l1sap.u.rach_ind.chan_nr = trx_chan_desc[bi->chan].chan_nr | bi->tn;</span><br><span>   l1sap.u.rach_ind.acc_delay = (bi->toa256 >= 0) ? bi->toa256 / 256 : 0;</span><br><span>      l1sap.u.rach_ind.acc_delay_256bits = bi->toa256;</span><br><span>  l1sap.u.rach_ind.rssi = bi->rssi;</span><br><span>@@ -166,8 +166,7 @@</span><br><span>           rc = gsm0503_rach_ext_decode_ber(&ra11, bi->burst + RACH_EXT_TAIL_LEN + RACH_SYNCH_SEQ_LEN,</span><br><span>                                            l1t->trx->bts->bsic, &n_errors, &n_bits_total);</span><br><span>            if (rc) {</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(0, 100%, 40%);">-                              "Received bad Access Burst\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received bad Access Burst\n");</span><br><span>                         return 0;</span><br><span>            }</span><br><span> </span><br><span>@@ -184,16 +183,14 @@</span><br><span>        default:</span><br><span>             /* Fall-back to the default TS0 if needed */</span><br><span>                 if (synch_seq != RACH_SYNCH_SEQ_TS0) {</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(0, 100%, 40%);">-                              "Falling-back to the default TS0\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Falling-back to the default TS0\n");</span><br><span>                   synch_seq = RACH_SYNCH_SEQ_TS0;</span><br><span>              }</span><br><span> </span><br><span>                rc = gsm0503_rach_decode_ber(&ra, bi->burst + RACH_EXT_TAIL_LEN + RACH_SYNCH_SEQ_LEN,</span><br><span>                                              l1t->trx->bts->bsic, &n_errors, &n_bits_total);</span><br><span>                if (rc) {</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(0, 100%, 40%);">-                              "Received bad Access Burst\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received bad Access Burst\n");</span><br><span>                         return 0;</span><br><span>            }</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 b1453dc..8ace49e 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>@@ -1,6 +1,7 @@</span><br><span> /*</span><br><span>  * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2015-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -45,11 +46,10 @@</span><br><span> #include <loops.h></span><br><span> </span><br><span> /*! \brief a single TCH/F burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchf_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[bi->chan];</span><br><span>       struct gsm_lchan *lchan = chan_state->lchan;</span><br><span>      sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint8_t *mask = &chan_state->ul_mask;</span><br><span>@@ -70,10 +70,9 @@</span><br><span>    /* If handover RACH detection is turned on, treat this burst as an Access Burst.</span><br><span>      * Handle NOPE.ind as usually to ensure proper Uplink measurement reporting. */</span><br><span>      if (chan_state->ho_rach_detect == 1 && ~bi->flags & TRX_BI_F_NOPE_IND)</span><br><span style="color: hsl(0, 100%, 40%);">-                return rx_rach_fn(l1t, chan, bid, bi);</span><br><span style="color: hsl(120, 100%, 40%);">+                return rx_rach_fn(l1t, bi);</span><br><span> </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(0, 100%, 40%);">-              "Received TCH/F, bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received TCH/F, bid=%u\n", bi->bid);</span><br><span> </span><br><span>    /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -83,19 +82,19 @@</span><br><span>      }</span><br><span> </span><br><span>        /* clear burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bi->bid == 0) {</span><br><span>               memset(*bursts_p + 464, 0, 464);</span><br><span>             *mask = 0x0;</span><br><span>         }</span><br><span> </span><br><span>        /* update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << bi->bid);</span><br><span> </span><br><span>        /* store measurements */</span><br><span>     trx_sched_meas_push(chan_state, bi);</span><br><span> </span><br><span>     /* copy burst to end of buffer of 8 bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-   burst = *bursts_p + bid * 116 + 464;</span><br><span style="color: hsl(120, 100%, 40%);">+  burst = *bursts_p + bi->bid * 116 + 464;</span><br><span>  if (bi->burst_len > 0) {</span><br><span>               memcpy(burst, bi->burst + 3, 58);</span><br><span>                 memcpy(burst + 58, bi->burst + 87, 58);</span><br><span>@@ -103,12 +102,12 @@</span><br><span>           memset(burst, 0, 116);</span><br><span> </span><br><span>   /* wait until complete set of bursts */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bid != 3)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->bid != 3)</span><br><span>                 return 0;</span><br><span> </span><br><span>        /* check for complete set of bursts */</span><br><span>       if ((*mask & 0xf) != 0xf) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi,</span><br><span>                  "Received incomplete frame (%u/%u)\n",</span><br><span>                     bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>         }</span><br><span>@@ -153,8 +152,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(0, 100%, 40%);">-                              "Received AMR SID frame: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "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>          }</span><br><span>@@ -186,7 +184,7 @@</span><br><span> </span><br><span>          if (rc)</span><br><span>                      trx_loop_amr_input(l1t,</span><br><span style="color: hsl(0, 100%, 40%);">-                         trx_chan_desc[chan].chan_nr | bi->tn, chan_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                          trx_chan_desc[bi->chan].chan_nr | bi->tn, chan_state,</span><br><span>                          n_errors, n_bits_total);</span><br><span>             /* only good speech frames get rtp header */</span><br><span>                 if (rc != GSM_MACBLOCK_LEN && rc >= 4) {</span><br><span>@@ -203,7 +201,7 @@</span><br><span> </span><br><span>                break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGL1SB(DL1P, LOGL_ERROR, l1t, bi,</span><br><span>                   "TCH mode %u invalid, please fix!\n",</span><br><span>                      tch_mode);</span><br><span>           return -EINVAL;</span><br><span>@@ -215,12 +213,11 @@</span><br><span> </span><br><span>  /* Check if the frame is bad */</span><br><span>      if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "Received bad data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi, "Received bad data (%u/%u)\n",</span><br><span>                         bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                 bfi_flag = true;</span><br><span>     } else if (rc < 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi,</span><br><span>                  "Received bad data (%u/%u) with invalid codec mode %d\n",</span><br><span>                  bi->fn % l1ts->mf_period, l1ts->mf_period, rc);</span><br><span>             bfi_flag = true;</span><br><span>@@ -236,7 +233,7 @@</span><br><span>       /* FACCH */</span><br><span>  if (rc == GSM_MACBLOCK_LEN) {</span><br><span>                fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_F);</span><br><span style="color: hsl(0, 100%, 40%);">-               _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, chan,</span><br><span style="color: hsl(120, 100%, 40%);">+            _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, bi->chan,</span><br><span>                    tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span>                    meas_avg.rssi, meas_avg.toa256,</span><br><span>                      meas_avg.ci_cb, ber10k,</span><br><span>@@ -284,7 +281,7 @@</span><br><span>                                        chan_state->codec[chan_state->dl_ft],</span><br><span>                                  AMR_BAD);</span><br><span>                            if (rc < 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     LOGL1SB(DL1P, LOGL_ERROR, l1t, bi,</span><br><span>                                          "Failed to encode AMR_BAD frame (rc=%d), "</span><br><span>                                         "not sending BFI\n", rc);</span><br><span>                                   return -EINVAL;</span><br><span>@@ -292,7 +289,7 @@</span><br><span>                                memset(tch_data + 2, 0, rc - 2);</span><br><span>                             break;</span><br><span>                       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                                LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                             LOGL1SB(DL1P, LOGL_ERROR, l1t, bi,</span><br><span>                                   "TCH mode %u invalid, please fix!\n", tch_mode);</span><br><span>                           return -EINVAL;</span><br><span>                      }</span><br><span>@@ -305,7 +302,7 @@</span><br><span>      /* TCH or BFI */</span><br><span> compose_l1sap:</span><br><span>   fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_TCH_F);</span><br><span style="color: hsl(0, 100%, 40%);">- return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan, tch_data, rc,</span><br><span style="color: hsl(120, 100%, 40%);">+   return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, bi->chan, tch_data, rc,</span><br><span>                                 /* FIXME: what should we use for BFI here? */</span><br><span>                                bfi_flag ? bi->toa256 : meas_avg.toa256, ber10k,</span><br><span>                                  bfi_flag ? bi->rssi : meas_avg.rssi, is_sub);</span><br><span>@@ -313,13 +310,12 @@</span><br><span> </span><br><span> /* common section for generation of TCH bursts (TCH/H and TCH/F).</span><br><span>  * FIXME: this function is over-complicated, refactor / get rid of it. */</span><br><span style="color: hsl(0, 100%, 40%);">-void tx_tch_common(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                   enum trx_chan_type chan, uint8_t bid,</span><br><span style="color: hsl(120, 100%, 40%);">+void tx_tch_common(struct l1sched_trx *l1t, struct trx_dl_burst_req *br,</span><br><span>              struct msgb **_msg_tch, struct msgb **_msg_facch)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span>        struct msgb *msg1, *msg2, *msg_tch = NULL, *msg_facch = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[br->chan];</span><br><span>       uint8_t rsl_cmode = chan_state->rsl_cmode;</span><br><span>        uint8_t tch_mode = chan_state->tch_mode;</span><br><span>  struct osmo_phsap_prim *l1sap;</span><br><span>@@ -330,13 +326,12 @@</span><br><span>               uint8_t tch_data[GSM_FR_BYTES];</span><br><span>              int len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                    "Missing TCH bursts detected, sending BFI\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_NOTICE, l1t, br, "Missing TCH bursts detected, sending BFI\n");</span><br><span> </span><br><span>             /* indicate bad frame */</span><br><span>             switch (tch_mode) {</span><br><span>          case GSM48_CMODE_SPEECH_V1: /* FR / HR */</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (chan != TRXC_TCHF) { /* HR */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (br->chan != TRXC_TCHF) { /* HR */</span><br><span>                             tch_data[0] = 0x70; /* F = 0, FT = 111 */</span><br><span>                            memset(tch_data + 1, 0, 14);</span><br><span>                                 len = 15;</span><br><span>@@ -346,7 +341,7 @@</span><br><span>                      len = GSM_FR_BYTES;</span><br><span>                  break;</span><br><span>               case GSM48_CMODE_SPEECH_EFR: /* EFR */</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (chan != TRXC_TCHF)</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (br->chan != TRXC_TCHF)</span><br><span>                                goto inval_mode1;</span><br><span>                    memset(tch_data, 0, GSM_EFR_BYTES);</span><br><span>                  len = GSM_EFR_BYTES;</span><br><span>@@ -356,29 +351,30 @@</span><br><span>                                 chan_state->codec[chan_state->dl_cmr],</span><br><span>                                 chan_state->codec[chan_state->dl_ft], AMR_BAD);</span><br><span>                        if (len < 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    "Failed to encode AMR_BAD frame (rc=%d), "</span><br><span style="color: hsl(0, 100%, 40%);">-                                    "not sending BFI\n", len);</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGL1SB(DL1P, LOGL_ERROR, l1t, br,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "Failed to encode AMR_BAD frame (rc=%d), "</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "not sending BFI\n", len);</span><br><span>                                 return;</span><br><span>                      }</span><br><span>                    memset(tch_data + 2, 0, len - 2);</span><br><span>                    break;</span><br><span>               default:</span><br><span> inval_mode1:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "TCH mode invalid, please fix!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "TCH mode invalid, please fix!\n");</span><br><span>                     len = 0;</span><br><span>             }</span><br><span> </span><br><span>                if (len) {</span><br><span>                   /* Note: RSSI/ToA256 is set to 0 to indicate to the higher</span><br><span>                    * layers that this is a faked tch_ind */</span><br><span style="color: hsl(0, 100%, 40%);">-                       _sched_compose_tch_ind(l1t, tn, fn, chan, tch_data, len, 0, 10000, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                     _sched_compose_tch_ind(l1t, br->tn, br->fn, br->chan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               tch_data, len, 0, 10000, 0, 0);</span><br><span>               }</span><br><span>    }</span><br><span> </span><br><span>        /* get frame and unlink from queue */</span><br><span style="color: hsl(0, 100%, 40%);">-   msg1 = _sched_dequeue_prim(l1t, tn, fn, chan);</span><br><span style="color: hsl(0, 100%, 40%);">-  msg2 = _sched_dequeue_prim(l1t, tn, fn, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+        msg1 = _sched_dequeue_prim(l1t, br);</span><br><span style="color: hsl(120, 100%, 40%);">+  msg2 = _sched_dequeue_prim(l1t, br);</span><br><span>         if (msg1) {</span><br><span>          l1sap = msgb_l1sap_prim(msg1);</span><br><span>               if (l1sap->oph.primitive == PRIM_TCH) {</span><br><span>@@ -386,8 +382,7 @@</span><br><span>                     if (msg2) {</span><br><span>                          l1sap = msgb_l1sap_prim(msg2);</span><br><span>                               if (l1sap->oph.primitive == PRIM_TCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                      LOGL1S(DL1P, LOGL_FATAL, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             "TCH twice, please FIX!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                        LOGL1SB(DL1P, LOGL_FATAL, l1t, br, "TCH twice, please FIX!\n");</span><br><span>                                    msgb_free(msg2);</span><br><span>                             } else</span><br><span>                                       msg_facch = msg2;</span><br><span>@@ -397,8 +392,7 @@</span><br><span>                      if (msg2) {</span><br><span>                          l1sap = msgb_l1sap_prim(msg2);</span><br><span>                               if (l1sap->oph.primitive != PRIM_TCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                      LOGL1S(DL1P, LOGL_FATAL, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             "FACCH twice, please FIX!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                      LOGL1SB(DL1P, LOGL_FATAL, l1t, br, "FACCH twice, please FIX!\n");</span><br><span>                                  msgb_free(msg2);</span><br><span>                             } else</span><br><span>                                       msg_tch = msg2;</span><br><span>@@ -414,8 +408,8 @@</span><br><span> </span><br><span>    /* check validity of message */</span><br><span>      if (msg_facch && msgb_l2len(msg_facch) != GSM_MACBLOCK_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGL1S(DL1P, LOGL_FATAL, l1t, tn, chan, fn, "Prim not 23 bytes, please FIX! "</span><br><span style="color: hsl(0, 100%, 40%);">-                 "(len=%d)\n", msgb_l2len(msg_facch));</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_FATAL, l1t, br, "Prim has odd len=%u != %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   msgb_l2len(msg_facch), GSM_MACBLOCK_LEN);</span><br><span>            /* free message */</span><br><span>           msgb_free(msg_facch);</span><br><span>                msg_facch = NULL;</span><br><span>@@ -431,20 +425,20 @@</span><br><span>            int8_t sti, cmi;</span><br><span> </span><br><span>                 if (rsl_cmode != RSL_CMOD_SPD_SPEECH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Dropping speech frame, "</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_NOTICE, l1t, br, "Dropping speech frame, "</span><br><span>                              "because we are not in speech mode\n");</span><br><span>                    goto free_bad_msg;</span><br><span>           }</span><br><span> </span><br><span>                switch (tch_mode) {</span><br><span>          case GSM48_CMODE_SPEECH_V1: /* FR / HR */</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (chan != TRXC_TCHF) /* HR */</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (br->chan != TRXC_TCHF) /* HR */</span><br><span>                               len = 15;</span><br><span>                    else</span><br><span>                                 len = GSM_FR_BYTES;</span><br><span>                  break;</span><br><span>               case GSM48_CMODE_SPEECH_EFR: /* EFR */</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (chan != TRXC_TCHF)</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (br->chan != TRXC_TCHF)</span><br><span>                                goto inval_mode2;</span><br><span>                    len = GSM_EFR_BYTES;</span><br><span>                         break;</span><br><span>@@ -469,33 +463,32 @@</span><br><span>                               trx_loop_amr_set(chan_state, 1);</span><br><span>                     }</span><br><span>                    if (ft < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGL1SB(DL1P, LOGL_ERROR, l1t, br,</span><br><span>                                   "Codec (FT = %d) of RTP frame not in list\n", ft_codec);</span><br><span>                           goto free_bad_msg;</span><br><span>                   }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (fn_is_codec_mode_request(fn) && chan_state->dl_ft != ft) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Codec (FT = %d) "</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (fn_is_codec_mode_request(br->fn) && chan_state->dl_ft != ft) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              LOGL1SB(DL1P, LOGL_NOTICE, l1t, br, "Codec (FT = %d) "</span><br><span>                                     " of RTP cannot be changed now, but in next frame\n", ft_codec);</span><br><span>                           goto free_bad_msg;</span><br><span>                   }</span><br><span>                    chan_state->dl_ft = ft;</span><br><span>                   if (bfi == AMR_BAD) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    "Transmitting 'bad AMR frame'\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOGL1SB(DL1P, LOGL_NOTICE, l1t, br, "Transmitting 'bad AMR frame'\n");</span><br><span>                             goto free_bad_msg;</span><br><span>                   }</span><br><span>                    break;</span><br><span>               default:</span><br><span> inval_mode2:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "TCH mode invalid, please fix!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "TCH mode invalid, please fix!\n");</span><br><span>                     goto free_bad_msg;</span><br><span>           }</span><br><span>            if (len < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Cannot send invalid AMR payload\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Cannot send invalid AMR payload\n");</span><br><span>                   goto free_bad_msg;</span><br><span>           }</span><br><span>            if (msgb_l2len(msg_tch) != len) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Cannot send payload with "</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Cannot send payload with "</span><br><span>                             "invalid length! (expecting %d, received %d)\n",</span><br><span>                           len, msgb_l2len(msg_tch));</span><br><span> free_bad_msg:</span><br><span>@@ -512,24 +505,23 @@</span><br><span> }</span><br><span> </span><br><span> /* obtain a to-be-transmitted TCH/F (Full Traffic Channel) burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_tchf_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  struct msgb *msg_tch = NULL, *msg_facch = NULL;</span><br><span>      struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span>        struct gsm_bts_trx_ts *ts = &l1t->trx->ts[br->tn];</span><br><span style="color: hsl(0, 100%, 40%);">- struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[br->chan];</span><br><span>       uint8_t tch_mode = chan_state->tch_mode;</span><br><span>  ubit_t *burst, **bursts_p = &chan_state->dl_bursts;</span><br><span> </span><br><span>       /* send burst, if we already got a frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (bid > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (br->bid > 0) {</span><br><span>             if (!*bursts_p)</span><br><span>                      return 0;</span><br><span>            goto send_burst;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   tx_tch_common(l1t, br->tn, br->fn, chan, bid, &msg_tch, &msg_facch);</span><br><span style="color: hsl(120, 100%, 40%);">+    tx_tch_common(l1t, br, &msg_tch, &msg_facch);</span><br><span> </span><br><span>    /* BURST BYPASS */</span><br><span> </span><br><span>@@ -546,7 +538,7 @@</span><br><span> </span><br><span>     /* no message at all */</span><br><span>      if (!msg_tch && !msg_facch) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "No TCH or FACCH prim for transmit.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGL1SB(DL1P, LOGL_INFO, l1t, br, "No TCH or FACCH prim for transmit.\n");</span><br><span>                 goto send_burst;</span><br><span>     }</span><br><span> </span><br><span>@@ -574,14 +566,14 @@</span><br><span> </span><br><span> send_burst:</span><br><span>     /* compose burst */</span><br><span style="color: hsl(0, 100%, 40%);">-     burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+        burst = *bursts_p + br->bid * 116;</span><br><span>        memcpy(br->burst + 3, burst, 58);</span><br><span>         memcpy(br->burst + 61, _sched_tsc[gsm_ts_tsc(ts)], 26);</span><br><span>   memcpy(br->burst + 87, burst + 58, 58);</span><br><span> </span><br><span>       br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting burst=%u.\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGL1SB(DL1P, LOGL_DEBUG, l1t, br, "Transmitting burst=%u.\n", br->bid);</span><br><span> </span><br><span>    return 0;</span><br><span> }</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 378d47a..ca05844 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>@@ -1,6 +1,7 @@</span><br><span> /*</span><br><span>  * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2015-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -45,11 +46,10 @@</span><br><span> #include <loops.h></span><br><span> </span><br><span> /*! \brief a single TCH/H burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchh_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[bi->chan];</span><br><span>       struct gsm_lchan *lchan = chan_state->lchan;</span><br><span>      sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint8_t *mask = &chan_state->ul_mask;</span><br><span>@@ -77,10 +77,9 @@</span><br><span>    /* If handover RACH detection is turned on, treat this burst as an Access Burst.</span><br><span>      * Handle NOPE.ind as usually to ensure proper Uplink measurement reporting. */</span><br><span>      if (chan_state->ho_rach_detect == 1 && ~bi->flags & TRX_BI_F_NOPE_IND)</span><br><span style="color: hsl(0, 100%, 40%);">-                return rx_rach_fn(l1t, chan, bid, bi);</span><br><span style="color: hsl(120, 100%, 40%);">+                return rx_rach_fn(l1t, bi);</span><br><span> </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(0, 100%, 40%);">-               "Received TCH/H, bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received TCH/H, bid=%u\n", bi->bid);</span><br><span> </span><br><span>    /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -90,19 +89,19 @@</span><br><span>      }</span><br><span> </span><br><span>        /* clear burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bi->bid == 0) {</span><br><span>               memset(*bursts_p + 464, 0, 232);</span><br><span>             *mask = 0x0;</span><br><span>         }</span><br><span> </span><br><span>        /* update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << bi->bid);</span><br><span> </span><br><span>        /* store measurements */</span><br><span>     trx_sched_meas_push(chan_state, bi);</span><br><span> </span><br><span>     /* copy burst to end of buffer of 6 bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-   burst = *bursts_p + bid * 116 + 464;</span><br><span style="color: hsl(120, 100%, 40%);">+  burst = *bursts_p + bi->bid * 116 + 464;</span><br><span>  if (bi->burst_len > 0) {</span><br><span>               memcpy(burst, bi->burst + 3, 58);</span><br><span>                 memcpy(burst + 58, bi->burst + 87, 58);</span><br><span>@@ -110,12 +109,12 @@</span><br><span>           memset(burst, 0, 116);</span><br><span> </span><br><span>   /* wait until complete set of bursts */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bid != 1)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->bid != 1)</span><br><span>                 return 0;</span><br><span> </span><br><span>        /* check for complete set of bursts */</span><br><span>       if ((*mask & 0x3) != 0x3) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi,</span><br><span>                  "Received incomplete frame (%u/%u)\n",</span><br><span>                     bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>         }</span><br><span>@@ -176,9 +175,8 @@</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(0, 100%, 40%);">-                              "Received AMR SID frame: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                               gsm0503_amr_dtx_frame_name(chan_state->amr_last_dtx));</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received AMR SID frame: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          gsm0503_amr_dtx_frame_name(chan_state->amr_last_dtx));</span><br><span>                    is_sub = 1;</span><br><span>          }</span><br><span> </span><br><span>@@ -209,7 +207,7 @@</span><br><span> </span><br><span>              if (rc)</span><br><span>                      trx_loop_amr_input(l1t,</span><br><span style="color: hsl(0, 100%, 40%);">-                         trx_chan_desc[chan].chan_nr | bi->tn, chan_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                          trx_chan_desc[bi->chan].chan_nr | bi->tn, chan_state,</span><br><span>                          n_errors, n_bits_total);</span><br><span> </span><br><span>                 /* only good speech frames get rtp header */</span><br><span>@@ -227,7 +225,7 @@</span><br><span> </span><br><span>               break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGL1SB(DL1P, LOGL_ERROR, l1t, bi,</span><br><span>                   "TCH mode %u invalid, please fix!\n",</span><br><span>                      tch_mode);</span><br><span>           return -EINVAL;</span><br><span>@@ -243,12 +241,11 @@</span><br><span> </span><br><span>  /* Check if the frame is bad */</span><br><span>      if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "Received bad data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi, "Received bad data (%u/%u)\n",</span><br><span>                         bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                 bfi_flag = true;</span><br><span>     } else if (rc < 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi,</span><br><span>                  "Received bad data (%u/%u) with invalid codec mode %d\n",</span><br><span>                  bi->fn % l1ts->mf_period, l1ts->mf_period, rc);</span><br><span>             bfi_flag = true;</span><br><span>@@ -268,7 +265,7 @@</span><br><span>                       fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_H0);</span><br><span>           else</span><br><span>                         fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_H1);</span><br><span style="color: hsl(0, 100%, 40%);">-              _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, chan,</span><br><span style="color: hsl(120, 100%, 40%);">+            _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, bi->chan,</span><br><span>                    tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span>                    meas_avg.rssi, meas_avg.toa256,</span><br><span>                      meas_avg.ci_cb, ber10k,</span><br><span>@@ -315,7 +312,7 @@</span><br><span>                                        chan_state->codec[chan_state->dl_ft],</span><br><span>                                  AMR_BAD);</span><br><span>                            if (rc < 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     LOGL1SB(DL1P, LOGL_ERROR, l1t, bi,</span><br><span>                                          "Failed to encode AMR_BAD frame (rc=%d), "</span><br><span>                                         "not sending BFI\n", rc);</span><br><span>                                   return -EINVAL;</span><br><span>@@ -323,7 +320,7 @@</span><br><span>                                memset(tch_data + 2, 0, rc - 2);</span><br><span>                             break;</span><br><span>                       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                                LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                             LOGL1SB(DL1P, LOGL_ERROR, l1t, bi,</span><br><span>                                   "TCH mode %u invalid, please fix!\n", tch_mode);</span><br><span>                           return -EINVAL;</span><br><span>                      }</span><br><span>@@ -367,7 +364,7 @@</span><br><span>              chan_state->ber10k_facch = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan, tch_data, rc,</span><br><span style="color: hsl(120, 100%, 40%);">+   return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, bi->chan, tch_data, rc,</span><br><span>                                 /* FIXME: what should we use for BFI here? */</span><br><span>                                bfi_flag ? bi->toa256 : meas_avg.toa256, ber10k,</span><br><span>                                  bfi_flag ? bi->rssi : meas_avg.rssi, is_sub);</span><br><span>@@ -375,35 +372,34 @@</span><br><span> </span><br><span> /* common section for generation of TCH bursts (TCH/H and TCH/F).</span><br><span>  * FIXME: this function is over-complicated, refactor / get rid of it. */</span><br><span style="color: hsl(0, 100%, 40%);">-extern void tx_tch_common(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                   enum trx_chan_type chan, uint8_t bid,</span><br><span style="color: hsl(120, 100%, 40%);">+extern void tx_tch_common(struct l1sched_trx *l1t,</span><br><span style="color: hsl(120, 100%, 40%);">+                     const struct trx_dl_burst_req *br,</span><br><span>                           struct msgb **_msg_tch, struct msgb **_msg_facch);</span><br><span> </span><br><span> /* obtain a to-be-transmitted TCH/H (Half Traffic Channel) burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_tchh_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  struct msgb *msg_tch = NULL, *msg_facch = NULL;</span><br><span>      struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span>        struct gsm_bts_trx_ts *ts = &l1t->trx->ts[br->tn];</span><br><span style="color: hsl(0, 100%, 40%);">- struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[br->chan];</span><br><span>       uint8_t tch_mode = chan_state->tch_mode;</span><br><span>  ubit_t *burst, **bursts_p = &chan_state->dl_bursts;</span><br><span> </span><br><span>       /* send burst, if we already got a frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (bid > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (br->bid > 0) {</span><br><span>             if (!*bursts_p)</span><br><span>                      return 0;</span><br><span>            goto send_burst;</span><br><span>     }</span><br><span> </span><br><span>        /* get TCH and/or FACCH */</span><br><span style="color: hsl(0, 100%, 40%);">-      tx_tch_common(l1t, br->tn, br->fn, chan, bid, &msg_tch, &msg_facch);</span><br><span style="color: hsl(120, 100%, 40%);">+    tx_tch_common(l1t, br, &msg_tch, &msg_facch);</span><br><span> </span><br><span>    /* check for FACCH alignment */</span><br><span>      if (msg_facch && ((((br->fn + 4) % 26) >> 2) & 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_ERROR, l1t, br->tn, chan, br->fn, "Cannot transmit FACCH starting on "</span><br><span style="color: hsl(0, 100%, 40%);">-                        "even frames, please fix RTS!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGL1SB(DL1P, LOGL_ERROR, l1t, br,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Cannot transmit FACCH starting on even frames, please fix RTS!\n");</span><br><span>               msgb_free(msg_facch);</span><br><span>                msg_facch = NULL;</span><br><span>    }</span><br><span>@@ -428,7 +424,7 @@</span><br><span> </span><br><span>  /* no message at all */</span><br><span>      if (!msg_tch && !msg_facch && !chan_state->dl_ongoing_facch) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "No TCH or FACCH prim for transmit.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGL1SB(DL1P, LOGL_INFO, l1t, br, "No TCH or FACCH prim for transmit.\n");</span><br><span>                 goto send_burst;</span><br><span>     }</span><br><span> </span><br><span>@@ -458,14 +454,14 @@</span><br><span> </span><br><span> send_burst:</span><br><span>     /* compose burst */</span><br><span style="color: hsl(0, 100%, 40%);">-     burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+        burst = *bursts_p + br->bid * 116;</span><br><span>        memcpy(br->burst + 3, burst, 58);</span><br><span>         memcpy(br->burst + 61, _sched_tsc[gsm_ts_tsc(ts)], 26);</span><br><span>   memcpy(br->burst + 87, burst + 58, 58);</span><br><span> </span><br><span>       br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting burst=%u.\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGL1SB(DL1P, LOGL_DEBUG, l1t, br, "Transmitting burst=%u.\n", br->bid);</span><br><span> </span><br><span>    return 0;</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_xcch.c b/src/osmo-bts-trx/sched_lchan_xcch.c</span><br><span>index 90f481a..ba0d612 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_xcch.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_xcch.c</span><br><span>@@ -1,6 +1,7 @@</span><br><span> /*</span><br><span>  * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2015-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -46,11 +47,10 @@</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single (SDCCH/SACCH) burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_data_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[bi->chan];</span><br><span>       sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint32_t *first_fn = &chan_state->ul_first_fn;</span><br><span>        uint8_t *mask = &chan_state->ul_mask;</span><br><span>@@ -61,15 +61,14 @@</span><br><span>   uint16_t ber10k;</span><br><span>     int rc;</span><br><span>      struct gsm_lchan *lchan = chan_state->lchan;</span><br><span style="color: hsl(0, 100%, 40%);">- bool rep_sacch = L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id) && lchan->repeated_ul_sacch_active;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool rep_sacch = L1SAP_IS_LINK_SACCH(trx_chan_desc[bi->chan].link_id) && lchan->repeated_ul_sacch_active;</span><br><span> </span><br><span>  /* If handover RACH detection is turned on, treat this burst as an Access Burst.</span><br><span>      * Handle NOPE.ind as usually to ensure proper Uplink measurement reporting. */</span><br><span>      if (chan_state->ho_rach_detect == 1 && ~bi->flags & TRX_BI_F_NOPE_IND)</span><br><span style="color: hsl(0, 100%, 40%);">-                return rx_rach_fn(l1t, chan, bid, bi);</span><br><span style="color: hsl(120, 100%, 40%);">+                return rx_rach_fn(l1t, bi);</span><br><span> </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(0, 100%, 40%);">-              "Received Data, bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi, "Received Data, bid=%u\n", bi->bid);</span><br><span> </span><br><span>     /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -80,28 +79,28 @@</span><br><span> </span><br><span>  /* UL-SACCH requires additional memory to keep a copy of each previous</span><br><span>        * burst set. */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id) && !chan_state->ul_bursts_prev) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (L1SAP_IS_LINK_SACCH(trx_chan_desc[bi->chan].link_id) && !chan_state->ul_bursts_prev) {</span><br><span>             chan_state->ul_bursts_prev = talloc_zero_size(tall_bts_ctx, 464);</span><br><span>                 if (!chan_state->ul_bursts_prev)</span><br><span>                  return -ENOMEM;</span><br><span>      }</span><br><span> </span><br><span>        /* clear burst & store frame number of first burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bi->bid == 0) {</span><br><span>               memset(*bursts_p, 0, 464);</span><br><span>           *mask = 0x0;</span><br><span>                 *first_fn = bi->fn;</span><br><span>       }</span><br><span> </span><br><span>        /* update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << bi->bid);</span><br><span> </span><br><span>        /* store measurements */</span><br><span>     trx_sched_meas_push(chan_state, bi);</span><br><span> </span><br><span>     /* Copy burst to buffer of 4 bursts. If the burst indication contains</span><br><span>         * no data, ensure that the buffer does not stay uninitialized */</span><br><span style="color: hsl(0, 100%, 40%);">-       burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+        burst = *bursts_p + bi->bid * 116;</span><br><span>        if (bi->burst_len > 0) {</span><br><span>               memcpy(burst, bi->burst + 3, 58);</span><br><span>                 memcpy(burst + 58, bi->burst + 87, 58);</span><br><span>@@ -109,7 +108,7 @@</span><br><span>             memset(burst, 0, 58 * 2);</span><br><span> </span><br><span>        /* wait until complete set of bursts */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bid != 3)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->bid != 3)</span><br><span>                 return 0;</span><br><span> </span><br><span>        /* average measurements of the last 4 bursts */</span><br><span>@@ -117,8 +116,7 @@</span><br><span> </span><br><span>    /* check for complete set of bursts */</span><br><span>       if ((*mask & 0xf) != 0xf) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "Received incomplete data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi, "Received incomplete data (%u/%u)\n",</span><br><span>                  bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span> </span><br><span>             /* we require first burst to have correct FN */</span><br><span>@@ -132,8 +130,7 @@</span><br><span>        /* decode */</span><br><span>         rc = gsm0503_xcch_decode(l2, *bursts_p, &n_errors, &n_bits_total);</span><br><span>   if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "Received bad data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi, "Received bad data (%u/%u)\n",</span><br><span>                         bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                 l2_len = 0;</span><br><span> </span><br><span>@@ -145,11 +142,11 @@</span><br><span>                      add_sbits(*bursts_p, chan_state->ul_bursts_prev);</span><br><span>                         rc = gsm0503_xcch_decode(l2, *bursts_p, &n_errors, &n_bits_total);</span><br><span>                   if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGL1SB(DL1P, LOGL_NOTICE, l1t, bi,</span><br><span>                                 "Combining current SACCH block with previous SACCH block also yields bad data (%u/%u)\n",</span><br><span>                                  bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                  } else {</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%);">+                             LOGL1SB(DL1P, LOGL_DEBUG, l1t, bi,</span><br><span>                                  "Combining current SACCH block with previous SACCH block yields good data (%u/%u)\n",</span><br><span>                                      bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                          l2_len = GSM_MACBLOCK_LEN;</span><br><span>@@ -165,34 +162,33 @@</span><br><span>           memcpy(chan_state->ul_bursts_prev, *bursts_p, 464);</span><br><span> </span><br><span>   return _sched_compose_ph_data_ind(l1t, bi->tn, *first_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      chan, l2, l2_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     bi->chan, l2, l2_len,</span><br><span>                                     meas_avg.rssi, meas_avg.toa256,</span><br><span>                                      meas_avg.ci_cb, ber10k,</span><br><span>                                      PRES_INFO_UNKNOWN);</span><br><span> }</span><br><span> </span><br><span> /* obtain a to-be-transmitted xCCH (e.g SACCH or SDCCH) burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_data_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span>        struct gsm_bts_trx_ts *ts = &l1t->trx->ts[br->tn];</span><br><span>      struct msgb *msg = NULL; /* make GCC happy */</span><br><span style="color: hsl(0, 100%, 40%);">-   ubit_t *burst, **bursts_p = &l1ts->chan_state[chan].dl_bursts;</span><br><span style="color: hsl(120, 100%, 40%);">+ ubit_t *burst, **bursts_p = &l1ts->chan_state[br->chan].dl_bursts;</span><br><span> </span><br><span>     /* send burst, if we already got a frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (bid > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (br->bid > 0) {</span><br><span>             if (!*bursts_p)</span><br><span>                      return 0;</span><br><span>            goto send_burst;</span><br><span>     }</span><br><span> </span><br><span>        /* get mac block from queue */</span><br><span style="color: hsl(0, 100%, 40%);">-  msg = _sched_dequeue_prim(l1t, br->tn, br->fn, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = _sched_dequeue_prim(l1t, br);</span><br><span>  if (msg)</span><br><span>             goto got_msg;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "No prim for transmit.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGL1SB(DL1P, LOGL_INFO, l1t, br, "No prim for transmit.\n");</span><br><span> </span><br><span> no_msg:</span><br><span>       /* free burst memory */</span><br><span>@@ -205,8 +201,8 @@</span><br><span> got_msg:</span><br><span>    /* check validity of message */</span><br><span>      if (msgb_l2len(msg) != GSM_MACBLOCK_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGL1S(DL1P, LOGL_FATAL, l1t, br->tn, chan, br->fn, "Prim not 23 bytes, please FIX! "</span><br><span style="color: hsl(0, 100%, 40%);">-                   "(len=%d)\n", msgb_l2len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGL1SB(DL1P, LOGL_FATAL, l1t, br, "Prim has odd len=%u != %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   msgb_l2len(msg), GSM_MACBLOCK_LEN);</span><br><span>          /* free message */</span><br><span>           msgb_free(msg);</span><br><span>              goto no_msg;</span><br><span>@@ -215,15 +211,15 @@</span><br><span>         /* BURST BYPASS */</span><br><span> </span><br><span>       /* handle loss detection of SACCH */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id)) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (L1SAP_IS_LINK_SACCH(trx_chan_desc[br->chan].link_id)) {</span><br><span>               /* count and send BFI */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (++(l1ts->chan_state[chan].lost_frames) > 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (++(l1ts->chan_state[br->chan].lost_frames) > 1) {</span><br><span>                       /* TODO: Should we pass old TOA here? Otherwise we risk</span><br><span>                       * unnecessary decreasing TA */</span><br><span> </span><br><span>                  /* Note: RSSI is set to 0 to indicate to the higher</span><br><span>                   * layers that this is a faked ph_data_ind */</span><br><span style="color: hsl(0, 100%, 40%);">-                   _sched_compose_ph_data_ind(l1t, br->tn, 0, chan, NULL, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                  _sched_compose_ph_data_ind(l1t, br->tn, 0, br->chan, NULL, 0,</span><br><span>                                             0, 0, 0, 10000,</span><br><span>                                              PRES_INFO_INVALID);</span><br><span>               }</span><br><span>@@ -244,14 +240,14 @@</span><br><span> </span><br><span> send_burst:</span><br><span>         /* compose burst */</span><br><span style="color: hsl(0, 100%, 40%);">-     burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+        burst = *bursts_p + br->bid * 116;</span><br><span>        memcpy(br->burst + 3, burst, 58);</span><br><span>         memcpy(br->burst + 61, _sched_tsc[gsm_ts_tsc(ts)], 26);</span><br><span>   memcpy(br->burst + 87, burst + 58, 58);</span><br><span> </span><br><span>       br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting burst=%u.\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGL1SB(DL1P, LOGL_DEBUG, l1t, br, "Transmitting burst=%u.\n", br->bid);</span><br><span> </span><br><span>    return 0;</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 c173f5b..bfe8d5c 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>@@ -53,10 +53,9 @@</span><br><span>     (ts)->hopping.hsn, (ts)->hopping.maio, (ts)->hopping.arfcn_num</span><br><span> </span><br><span> /* an IDLE burst returns nothing. on C0 it is replaced by dummy burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_idle_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_idle_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting IDLE\n");</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGL1SB(DL1P, LOGL_DEBUG, l1t, br, "Transmitting IDLE\n");</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bts-virtual/scheduler_virtbts.c b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>index 466e864..bbc2c4e 100644</span><br><span>--- a/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>+++ b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>@@ -50,12 +50,12 @@</span><br><span> /**</span><br><span>  * Send a message over the virtual um interface.</span><br><span>  * This will at first wrap the msg with a GSMTAP header and then write it to the declared multicast socket.</span><br><span style="color: hsl(0, 100%, 40%);">- * TODO: we might want to remove unused argument uint8_t tn</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static void _tx_to_virt_um(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                      enum trx_chan_type chan, struct msgb *msg, bool is_voice_frame)</span><br><span style="color: hsl(120, 100%, 40%);">+static void _tx_to_virt_um(struct l1sched_trx *l1t,</span><br><span style="color: hsl(120, 100%, 40%);">+                          struct trx_dl_burst_req *br,</span><br><span style="color: hsl(120, 100%, 40%);">+                          struct msgb *msg, bool is_voice_frame)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  const struct trx_chan_desc *chdesc = &trx_chan_desc[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+        const struct trx_chan_desc *chdesc = &trx_chan_desc[br->chan];</span><br><span>        struct msgb *outmsg;                    /* msg to send with gsmtap header prepended */</span><br><span>       uint16_t arfcn = l1t->trx->arfcn; /* ARFCN of the transceiver the message is send with */</span><br><span>      uint8_t signal_dbm = 63;                /* signal strength, 63 is best */</span><br><span>@@ -69,17 +69,17 @@</span><br><span> </span><br><span>  rsl_dec_chan_nr(chdesc->chan_nr, &rsl_chantype, &subslot, &timeslot);</span><br><span>         /* the timeslot is not encoded in the chan_nr of the chdesc, and so has to be overwritten */</span><br><span style="color: hsl(0, 100%, 40%);">-    timeslot = tn;</span><br><span style="color: hsl(120, 100%, 40%);">+        timeslot = br->tn;</span><br><span>        /* in Osmocom, AGCH is only sent on ccch block 0. no idea why. this seems to cause false GSMTAP channel</span><br><span>       * types for agch and pch. */</span><br><span>        if (rsl_chantype == RSL_CHAN_PCH_AGCH &&</span><br><span style="color: hsl(0, 100%, 40%);">-            l1sap_fn2ccch_block(fn) >= num_agch(l1t->trx, "PH-DATA-REQ"))</span><br><span style="color: hsl(120, 100%, 40%);">+         l1sap_fn2ccch_block(br->fn) >= num_agch(l1t->trx, "PH-DATA-REQ"))</span><br><span>             gsmtap_chantype = GSMTAP_CHANNEL_PCH;</span><br><span>        else</span><br><span>                 gsmtap_chantype = chantype_rsl2gsmtap2(rsl_chantype, chdesc->link_id, is_voice_frame); /* the logical channel type */</span><br><span> </span><br><span>         if (gsmtap_chantype == GSMTAP_CHANNEL_UNKNOWN) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Tx GSMTAP for RSL channel type 0x%02x: cannot send, this"</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Tx GSMTAP for RSL channel type 0x%02x: cannot send, this"</span><br><span>                     " channel type is unknown in GSMTAP\n", rsl_chantype);</span><br><span>              msgb_free(msg);</span><br><span>              return;</span><br><span>@@ -87,10 +87,10 @@</span><br><span> </span><br><span> #if MODULO_HYPERFRAME</span><br><span>   /* Restart fn after every superframe (26 * 51 frames) to simulate hyperframe overflow each 6 seconds. */</span><br><span style="color: hsl(0, 100%, 40%);">-        fn %= 26 * 51;</span><br><span style="color: hsl(120, 100%, 40%);">+        br->fn %= 26 * 51;</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     outmsg = gsmtap_makemsg(arfcn, timeslot, gsmtap_chantype, subslot, fn, signal_dbm, snr, data, data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+      outmsg = gsmtap_makemsg(arfcn, timeslot, gsmtap_chantype, subslot, br->fn, signal_dbm, snr, data, data_len);</span><br><span> </span><br><span>  if (outmsg) {</span><br><span>                struct phy_instance *pinst = trx_phy_instance(l1t->trx);</span><br><span>@@ -98,24 +98,25 @@</span><br><span> </span><br><span>                rc = virt_um_write_msg(pinst->phy_link->u.virt.virt_um, outmsg);</span><br><span>               if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGL1SB(DL1P, LOGL_ERROR, l1t, br,</span><br><span>                          "GSMTAP msg could not send to virtual Um: %s\n", strerror(-rc));</span><br><span>            else if (rc == 0)</span><br><span>                    bts_shutdown(l1t->trx->bts, "VirtPHY write socket died\n");</span><br><span>          else</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGL1SB(DL1P, LOGL_DEBUG, l1t, br,</span><br><span>                          "Sending GSMTAP message to virtual Um\n");</span><br><span>  } else</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "GSMTAP msg could not be created!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "GSMTAP msg could not be created!\n");</span><br><span> </span><br><span>      /* free incoming message */</span><br><span>  msgb_free(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void tx_to_virt_um(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                       enum trx_chan_type chan, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+static void tx_to_virt_um(struct l1sched_trx *l1t,</span><br><span style="color: hsl(120, 100%, 40%);">+                        struct trx_dl_burst_req *br,</span><br><span style="color: hsl(120, 100%, 40%);">+                          struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        _tx_to_virt_um(l1t, tn, fn, chan, msg, false);</span><br><span style="color: hsl(120, 100%, 40%);">+        _tx_to_virt_um(l1t, br, msg, false);</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -151,10 +152,11 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void tx_to_virt_um_voice_frame(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     enum trx_chan_type chan, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+static void tx_to_virt_um_voice_frame(struct l1sched_trx *l1t,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    struct trx_dl_burst_req *br,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_lchan *lchan = lchan_from_l1t(l1t, tn, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_lchan *lchan = lchan_from_l1t(l1t, br->tn, br->chan);</span><br><span>       int um_voice_type;</span><br><span> </span><br><span>       OSMO_ASSERT(lchan);</span><br><span>@@ -168,7 +170,7 @@</span><br><span>    msgb_pull_to_l2(msg);</span><br><span>        msgb_push_u8(msg, um_voice_type);</span><br><span>    msg->l2h = msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-     _tx_to_virt_um(l1t, tn, fn, chan, msg, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ _tx_to_virt_um(l1t, br, msg, true);</span><br><span> }</span><br><span> </span><br><span> /*</span><br><span>@@ -176,42 +178,38 @@</span><br><span>  */</span><br><span> </span><br><span> /* an IDLE burst returns nothing. on C0 it is replaced by dummy burst */</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_idle_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_idle_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int tx_fcch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_fcch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int tx_sch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_sch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int tx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_data_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  struct msgb *msg;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (bid > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (br->bid > 0)</span><br><span>               return 0;</span><br><span> </span><br><span>        /* get mac block from queue */</span><br><span style="color: hsl(0, 100%, 40%);">-  msg = _sched_dequeue_prim(l1t, br->tn, br->fn, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = _sched_dequeue_prim(l1t, br);</span><br><span>  if (!msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "has not been served !! No prim\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_INFO, l1t, br, "has not been served !! No prim\n");</span><br><span>             return -ENODEV;</span><br><span>      }</span><br><span> </span><br><span>        /* check validity of message */</span><br><span>      if (msgb_l2len(msg) != GSM_MACBLOCK_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGL1S(DL1P, LOGL_FATAL, l1t, br->tn, chan, br->fn, "Prim not 23 bytes, please FIX! (len=%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_FATAL, l1t, br, "Prim not 23 bytes, please FIX! (len=%d)\n",</span><br><span>                    msgb_l2len(msg));</span><br><span>            /* free message */</span><br><span>           msgb_free(msg);</span><br><span>@@ -219,38 +217,38 @@</span><br><span>      }</span><br><span> </span><br><span>        /* transmit the msg received on dl from bsc to layer1 (virt Um) */</span><br><span style="color: hsl(0, 100%, 40%);">-      tx_to_virt_um(l1t, br->tn, br->fn, chan, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  tx_to_virt_um(l1t, br, msg);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int tx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_pdtch_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>         struct msgb *msg = NULL; /* make GCC happy */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (br->bid > 0)</span><br><span>               return 0;</span><br><span> </span><br><span>        /* get mac block from queue */</span><br><span style="color: hsl(0, 100%, 40%);">-  msg = _sched_dequeue_prim(l1t, br->tn, br->fn, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = _sched_dequeue_prim(l1t, br);</span><br><span>  if (!msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "has not been served !! No prim\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_INFO, l1t, br, "has not been served !! No prim\n");</span><br><span>             return -ENODEV;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   tx_to_virt_um(l1t, br->tn, br->fn, chan, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  tx_to_virt_um(l1t, br, msg);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void tx_tch_common(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-   enum trx_chan_type chan, uint8_t bid, struct msgb **_msg_tch,</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb **_msg_facch, int codec_mode_request)</span><br><span style="color: hsl(120, 100%, 40%);">+static void tx_tch_common(struct l1sched_trx *l1t,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct trx_dl_burst_req *br,</span><br><span style="color: hsl(120, 100%, 40%);">+                    struct msgb **_msg_tch, struct msgb **_msg_facch,</span><br><span style="color: hsl(120, 100%, 40%);">+                     int codec_mode_request)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span>        struct msgb *msg1, *msg2, *msg_tch = NULL, *msg_facch = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[br->chan];</span><br><span>       uint8_t rsl_cmode = chan_state->rsl_cmode;</span><br><span>        uint8_t tch_mode = chan_state->tch_mode;</span><br><span>  struct osmo_phsap_prim *l1sap;</span><br><span>@@ -261,13 +259,13 @@</span><br><span>               uint8_t tch_data[GSM_FR_BYTES];</span><br><span>              int len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Missing TCH bursts detected, sending "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "BFI for %s\n", trx_chan_desc[chan].name);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGL1SB(DL1P, LOGL_NOTICE, l1t, br, "Missing TCH bursts detected, sending "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "BFI for %s\n", trx_chan_desc[br->chan].name);</span><br><span> </span><br><span>              /* indicate bad frame */</span><br><span>             switch (tch_mode) {</span><br><span>          case GSM48_CMODE_SPEECH_V1: /* FR / HR */</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (chan != TRXC_TCHF) { /* HR */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (br->chan != TRXC_TCHF) { /* HR */</span><br><span>                             tch_data[0] = 0x70; /* F = 0, FT = 111 */</span><br><span>                            memset(tch_data + 1, 0, 14);</span><br><span>                                 len = 15;</span><br><span>@@ -277,7 +275,7 @@</span><br><span>                      len = GSM_FR_BYTES;</span><br><span>                  break;</span><br><span>               case GSM48_CMODE_SPEECH_EFR: /* EFR */</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (chan != TRXC_TCHF)</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (br->chan != TRXC_TCHF)</span><br><span>                                goto inval_mode1;</span><br><span>                    memset(tch_data, 0, GSM_EFR_BYTES);</span><br><span>                  len = GSM_EFR_BYTES;</span><br><span>@@ -289,7 +287,7 @@</span><br><span>                   if (len < 2)</span><br><span>                              break;</span><br><span>                       memset(tch_data + 2, 0, len - 2);</span><br><span style="color: hsl(0, 100%, 40%);">-                       _sched_compose_tch_ind(l1t, tn, 0, chan, tch_data, len);</span><br><span style="color: hsl(120, 100%, 40%);">+                      _sched_compose_tch_ind(l1t, br->tn, 0, br->chan, tch_data, len);</span><br><span>                       break;</span><br><span>               default:</span><br><span> inval_mode1:</span><br><span>@@ -298,13 +296,13 @@</span><br><span>                     len = 0;</span><br><span>             }</span><br><span>            if (len)</span><br><span style="color: hsl(0, 100%, 40%);">-                        _sched_compose_tch_ind(l1t, tn, 0, chan, tch_data, len);</span><br><span style="color: hsl(120, 100%, 40%);">+                      _sched_compose_tch_ind(l1t, br->tn, 0, br->chan, tch_data, len);</span><br><span>       }</span><br><span> #endif</span><br><span> </span><br><span>      /* get frame and unlink from queue */</span><br><span style="color: hsl(0, 100%, 40%);">-   msg1 = _sched_dequeue_prim(l1t, tn, fn, chan);</span><br><span style="color: hsl(0, 100%, 40%);">-  msg2 = _sched_dequeue_prim(l1t, tn, fn, chan);</span><br><span style="color: hsl(120, 100%, 40%);">+        msg1 = _sched_dequeue_prim(l1t, br);</span><br><span style="color: hsl(120, 100%, 40%);">+  msg2 = _sched_dequeue_prim(l1t, br);</span><br><span>         if (msg1) {</span><br><span>          l1sap = msgb_l1sap_prim(msg1);</span><br><span>               if (l1sap->oph.primitive == PRIM_TCH) {</span><br><span>@@ -312,8 +310,8 @@</span><br><span>                     if (msg2) {</span><br><span>                          l1sap = msgb_l1sap_prim(msg2);</span><br><span>                               if (l1sap->oph.primitive == PRIM_TCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                      LOGL1S(DL1P, LOGL_FATAL, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             "TCH twice, please FIX! ");</span><br><span style="color: hsl(120, 100%, 40%);">+                                 LOGL1SB(DL1P, LOGL_FATAL, l1t, br,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            "TCH twice, please FIX!\n");</span><br><span>                                       msgb_free(msg2);</span><br><span>                             } else</span><br><span>                                       msg_facch = msg2;</span><br><span>@@ -323,8 +321,8 @@</span><br><span>                      if (msg2) {</span><br><span>                          l1sap = msgb_l1sap_prim(msg2);</span><br><span>                               if (l1sap->oph.primitive != PRIM_TCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                      LOGL1S(DL1P, LOGL_FATAL, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             "FACCH twice, please FIX! ");</span><br><span style="color: hsl(120, 100%, 40%);">+                                       LOGL1SB(DL1P, LOGL_FATAL, l1t, br,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            "FACCH twice, please FIX!\n");</span><br><span>                                     msgb_free(msg2);</span><br><span>                             } else</span><br><span>                                       msg_tch = msg2;</span><br><span>@@ -340,8 +338,8 @@</span><br><span> </span><br><span>    /* check validity of message */</span><br><span>      if (msg_facch && msgb_l2len(msg_facch) != GSM_MACBLOCK_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGL1S(DL1P, LOGL_FATAL, l1t, tn, chan, fn, "Prim not 23 bytes, please FIX! (len=%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      msgb_l2len(msg_facch));</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_FATAL, l1t, br, "Prim has odd len=%u != %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   msgb_l2len(msg_facch), GSM_MACBLOCK_LEN);</span><br><span>            /* free message */</span><br><span>           msgb_free(msg_facch);</span><br><span>                msg_facch = NULL;</span><br><span>@@ -356,18 +354,18 @@</span><br><span> #endif</span><br><span> </span><br><span>              if (rsl_cmode != RSL_CMOD_SPD_SPEECH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Dropping speech frame, "</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGL1SB(DL1P, LOGL_NOTICE, l1t, br, "Dropping speech frame, "</span><br><span>                              "because we are not in speech mode\n");</span><br><span>                    goto free_bad_msg;</span><br><span>           }</span><br><span> </span><br><span>                switch (tch_mode) {</span><br><span>          case GSM48_CMODE_SPEECH_V1: /* FR / HR */</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (chan != TRXC_TCHF) { /* HR */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (br->chan != TRXC_TCHF) { /* HR */</span><br><span>                             len = 15;</span><br><span>                            if (msgb_l2len(msg_tch) >= 1</span><br><span>                               && (msg_tch->l2h[0] & 0xf0) != 0x00) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  LOGL1SB(DL1P, LOGL_NOTICE, l1t, br,</span><br><span>                                          "Transmitting 'bad HR frame'\n");</span><br><span>                                  goto free_bad_msg;</span><br><span>                           }</span><br><span>@@ -376,18 +374,18 @@</span><br><span>                    len = GSM_FR_BYTES;</span><br><span>                  if (msgb_l2len(msg_tch) >= 1</span><br><span>                       && (msg_tch->l2h[0] >> 4) != 0xd) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOGL1SB(DL1P, LOGL_NOTICE, l1t, br,</span><br><span>                                  "Transmitting 'bad FR frame'\n");</span><br><span>                          goto free_bad_msg;</span><br><span>                   }</span><br><span>                    break;</span><br><span>               case GSM48_CMODE_SPEECH_EFR: /* EFR */</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (chan != TRXC_TCHF)</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (br->chan != TRXC_TCHF)</span><br><span>                                goto inval_mode2;</span><br><span>                    len = GSM_EFR_BYTES;</span><br><span>                         if (msgb_l2len(msg_tch) >= 1</span><br><span>                       && (msg_tch->l2h[0] >> 4) != 0xc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOGL1SB(DL1P, LOGL_NOTICE, l1t, br,</span><br><span>                                  "Transmitting 'bad EFR frame'\n");</span><br><span>                                 goto free_bad_msg;</span><br><span>                   }</span><br><span>@@ -398,15 +396,15 @@</span><br><span>                    break;</span><br><span>               default:</span><br><span> inval_mode2:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "TCH mode invalid, please fix!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "TCH mode invalid, please fix!\n");</span><br><span>                     goto free_bad_msg;</span><br><span>           }</span><br><span>            if (len < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Cannot send invalid AMR payload\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Cannot send invalid AMR payload\n");</span><br><span>                   goto free_bad_msg;</span><br><span>           }</span><br><span>            if (msgb_l2len(msg_tch) != len) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Cannot send payload with "</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Cannot send payload with "</span><br><span>                             "invalid length! (expecing %d, received %d)\n", len, msgb_l2len(msg_tch));</span><br><span> free_bad_msg:</span><br><span>                        /* free message */</span><br><span>@@ -421,51 +419,47 @@</span><br><span>   *_msg_facch = msg_facch;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int tx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_tchf_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  struct msgb *msg_tch = NULL, *msg_facch = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (bid > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (br->bid > 0)</span><br><span>               return 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   tx_tch_common(l1t, br->tn, br->fn, chan, bid, &msg_tch, &msg_facch,</span><br><span style="color: hsl(0, 100%, 40%);">-               (((br->fn + 4) % 26) >> 2) & 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ tx_tch_common(l1t, br, &msg_tch, &msg_facch, (((br->fn + 4) % 26) >> 2) & 1);</span><br><span> </span><br><span>       /* no message at all */</span><br><span>      if (!msg_tch && !msg_facch) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "has not been served !! No prim\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_INFO, l1t, br, "has not been served !! No prim\n");</span><br><span>             return -ENODEV;</span><br><span>      }</span><br><span> </span><br><span>        if (msg_facch) {</span><br><span style="color: hsl(0, 100%, 40%);">-                tx_to_virt_um(l1t, br->tn, br->fn, chan, msg_facch);</span><br><span style="color: hsl(120, 100%, 40%);">+            tx_to_virt_um(l1t, br, msg_facch);</span><br><span>           msgb_free(msg_tch);</span><br><span>  } else if (msg_tch)</span><br><span style="color: hsl(0, 100%, 40%);">-             tx_to_virt_um_voice_frame(l1t, br->tn, br->fn, chan, msg_tch);</span><br><span style="color: hsl(120, 100%, 40%);">+          tx_to_virt_um_voice_frame(l1t, br, msg_tch);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int tx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, struct trx_dl_burst_req *br)</span><br><span style="color: hsl(120, 100%, 40%);">+int tx_tchh_fn(struct l1sched_trx *l1t, struct trx_dl_burst_req *br)</span><br><span> {</span><br><span>  struct msgb *msg_tch = NULL, *msg_facch = NULL;</span><br><span>      struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, br->tn);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_chan_state *chan_state = &l1ts->chan_state[br->chan];</span><br><span>       //uint8_t tch_mode = chan_state->tch_mode;</span><br><span> </span><br><span>    /* send burst, if we already got a frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (bid > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (br->bid > 0)</span><br><span>               return 0;</span><br><span> </span><br><span>        /* get TCH and/or FACCH */</span><br><span style="color: hsl(0, 100%, 40%);">-      tx_tch_common(l1t, br->tn, br->fn, chan, bid, &msg_tch, &msg_facch,</span><br><span style="color: hsl(0, 100%, 40%);">-               (((br->fn + 4) % 26) >> 2) & 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ tx_tch_common(l1t, br, &msg_tch, &msg_facch, (((br->fn + 4) % 26) >> 2) & 1);</span><br><span> </span><br><span>       /* check for FACCH alignment */</span><br><span>      if (msg_facch && ((((br->fn + 4) % 26) >> 2) & 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_ERROR, l1t, br->tn, chan, br->fn, "Cannot transmit FACCH starting on "</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGL1SB(DL1P, LOGL_ERROR, l1t, br, "Cannot transmit FACCH starting on "</span><br><span>                    "even frames, please fix RTS!\n");</span><br><span>                 msgb_free(msg_facch);</span><br><span>                msg_facch = NULL;</span><br><span>@@ -473,15 +467,15 @@</span><br><span> </span><br><span>        /* no message at all */</span><br><span>      if (!msg_tch && !msg_facch && !chan_state->dl_ongoing_facch) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_INFO, l1t, br->tn, chan, br->fn, "has not been served !! No prim\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGL1SB(DL1P, LOGL_INFO, l1t, br, "has not been served !! No prim\n");</span><br><span>             return -ENODEV;</span><br><span>      }</span><br><span> </span><br><span>        if (msg_facch) {</span><br><span style="color: hsl(0, 100%, 40%);">-                tx_to_virt_um(l1t, br->tn, br->fn, chan, msg_facch);</span><br><span style="color: hsl(120, 100%, 40%);">+            tx_to_virt_um(l1t, br, msg_facch);</span><br><span>           msgb_free(msg_tch);</span><br><span>  } else if (msg_tch)</span><br><span style="color: hsl(0, 100%, 40%);">-             tx_to_virt_um_voice_frame(l1t, br->tn, br->fn, chan, msg_tch);</span><br><span style="color: hsl(120, 100%, 40%);">+          tx_to_virt_um_voice_frame(l1t, br, msg_tch);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span>@@ -495,33 +489,28 @@</span><br><span>  * directly into the L1SAP, bypassing the TDMA multiplex logic oriented</span><br><span>  * towards receiving bursts */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_rach_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_rach_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-         uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_data_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_pdtch_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchf_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchh_fn(struct l1sched_trx *l1t, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>      return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/24178">change 24178</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/+/24178"/><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: Ic5a02b074662b3e429bf18e05a982f3f3e7b7444 </div>
<div style="display:none"> Gerrit-Change-Number: 24178 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@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>