Change in osmo-bts[master]: [VAMOS] osmo-bts-trx: move {chan, bid} to trx_{dl, ul}_burst_{req, ind}

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

fixeria gerrit-no-reply at lists.osmocom.org
Sat May 8 15:41:30 UTC 2021


fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/24178 )


Change subject: [VAMOS] osmo-bts-trx: move {chan,bid} to trx_{dl,ul}_burst_{req,ind}
......................................................................

[VAMOS] osmo-bts-trx: move {chan,bid} to trx_{dl,ul}_burst_{req,ind}

Change-Id: Ic5a02b074662b3e429bf18e05a982f3f3e7b7444
---
M include/osmo-bts/scheduler.h
M include/osmo-bts/scheduler_backend.h
M src/common/scheduler.c
M src/osmo-bts-trx/sched_lchan_fcch_sch.c
M src/osmo-bts-trx/sched_lchan_pdtch.c
M src/osmo-bts-trx/sched_lchan_rach.c
M src/osmo-bts-trx/sched_lchan_tchf.c
M src/osmo-bts-trx/sched_lchan_tchh.c
M src/osmo-bts-trx/sched_lchan_xcch.c
M src/osmo-bts-trx/scheduler_trx.c
M src/osmo-bts-virtual/scheduler_virtbts.c
11 files changed, 312 insertions(+), 353 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/78/24178/1

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

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/24178
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: Ic5a02b074662b3e429bf18e05a982f3f3e7b7444
Gerrit-Change-Number: 24178
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210508/118b9cdb/attachment.htm>


More information about the gerrit-log mailing list