<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/14322">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">common/scheduler.c: refactor description of TRXC_* lchans<br><br>Let's avoid fancy alignment in the description of logical channels<br>for the benefits of having better readability, the ability to add<br>more comments and fields without making it look ugly.<br><br>Get rid of value-string array 'trx_chan_type_names', since each<br>logical channel has its name defined in 'trx_chan_desc'.<br><br>Get rid of field 'chan' of 'trx_lchan_desc' structure since it's<br>not used anywhere, and not actually needed because the position<br>of each lchan description is defined by its TRXC_* type.<br><br>Replace both 'pdch' and 'auto_active' fields with more generic<br>bitmask field called 'flags', and define the following flags:<br><br> - TRX_CHAN_FLAG_AUTO_ACTIVE,<br> - TRX_CHAN_FLAG_PDCH.<br><br>Use RSL channel mode #defines from libosmogsm instead of having<br>hard-coded numbers. This increases readability.<br><br>As a bonus, let's add a human readable description to each lchan<br>definition, so it can be printed in the VTY some day.<br><br>Change-Id: I9d5d49ec569f133d37b8164b22607d4700474315<br>Backported from: I2fc61e1cdca4690a34e2861b9ee3b7c64ea64843<br> I7ab4958801b3422973b67ff0452b90afa8a3f501<br>---<br>M include/osmo-bts/scheduler.h<br>M include/osmo-bts/scheduler_backend.h<br>M src/common/scheduler.c<br>3 files changed, 466 insertions(+), 107 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/22/14322/1</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 2906c6e..c862307 100644</span><br><span>--- a/include/osmo-bts/scheduler.h</span><br><span>+++ b/include/osmo-bts/scheduler.h</span><br><span>@@ -5,6 +5,15 @@</span><br><span> </span><br><span> #include <osmo-bts/gsm_data.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Whether a logical channel must be activated automatically */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_CHAN_FLAG_AUTO_ACTIVE (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Whether a logical channel belongs to PDCH (packet switched data) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_CHAN_FLAG_PDCH (1 << 1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: we should actually activate 'auto-active' channels */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_CHAN_IS_ACTIVE(state, chan) \</span><br><span style="color: hsl(120, 100%, 40%);">+ (trx_chan_desc[chan].flags & TRX_CHAN_FLAG_AUTO_ACTIVE || (state)->active)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* These types define the different channels on a multiframe.</span><br><span> * Each channel has queues and can be activated individually.</span><br><span> */</span><br><span>@@ -51,8 +60,6 @@</span><br><span> _TRX_CHAN_MAX</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string trx_chan_type_names[];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define GSM_BURST_LEN 148</span><br><span> #define GPRS_BURST_LEN GSM_BURST_LEN</span><br><span> #define EGPRS_BURST_LEN 444</span><br><span>diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h</span><br><span>index dbd9319..505f4d7 100644</span><br><span>--- a/include/osmo-bts/scheduler_backend.h</span><br><span>+++ b/include/osmo-bts/scheduler_backend.h</span><br><span>@@ -19,24 +19,22 @@</span><br><span> int8_t rssi, int16_t toa256);</span><br><span> </span><br><span> struct trx_chan_desc {</span><br><span style="color: hsl(0, 100%, 40%);">- /*! \brief Is this on a PDCH (PS) ? */</span><br><span style="color: hsl(0, 100%, 40%);">- int pdch;</span><br><span style="color: hsl(0, 100%, 40%);">- /*! \brief TRX Channel Type */</span><br><span style="color: hsl(0, 100%, 40%);">- enum trx_chan_type chan;</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! \brief Human-readable name */</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! \brief Human-readable description */</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *desc;</span><br><span> /*! \brief Channel Number (like in RSL) */</span><br><span> uint8_t chan_nr;</span><br><span> /*! \brief Link ID (like in RSL) */</span><br><span> uint8_t link_id;</span><br><span style="color: hsl(0, 100%, 40%);">- /*! \brief Human-readable name */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *name;</span><br><span> /*! \brief function to call when we want to generate RTS.req to L2 */</span><br><span> trx_sched_rts_func *rts_fn;</span><br><span> /*! \brief function to call when DATA.req received from L2 */</span><br><span> trx_sched_dl_func *dl_fn;</span><br><span> /*! \brief function to call when burst received from PHY */</span><br><span> trx_sched_ul_func *ul_fn;</span><br><span style="color: hsl(0, 100%, 40%);">- /*! \brief is this channel automatically active at start? */</span><br><span style="color: hsl(0, 100%, 40%);">- int auto_active;</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! \brief channel flags, see TRX_CHAN_FLAG_* */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t flags;</span><br><span> };</span><br><span> extern const struct trx_chan_desc trx_chan_desc[_TRX_CHAN_MAX];</span><br><span> </span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index f705ddf..6ad2e1f 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -29,6 +29,8 @@</span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/bits.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_08_58.h></span><br><span> #include <osmocom/gsm/a5.h></span><br><span> </span><br><span> #include <osmo-bts/gsm_data.h></span><br><span>@@ -111,95 +113,448 @@</span><br><span> 0,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,0,0,0,0,1,1,0,1,1,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * subchannel description structure</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+/* Logical channel (TRXC_*) description */</span><br><span> const struct trx_chan_desc trx_chan_desc[_TRX_CHAN_MAX] = {</span><br><span style="color: hsl(0, 100%, 40%);">- /* is_pdch chan_type chan_nr link_id name rts_fn dl_fn ul_fn auto_active */</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_IDLE, 0, LID_DEDIC, "IDLE", NULL, tx_idle_fn, NULL, 1 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_FCCH, 0, LID_DEDIC, "FCCH", NULL, tx_fcch_fn, NULL, 1 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SCH, 0, LID_DEDIC, "SCH", NULL, tx_sch_fn, NULL, 1 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_BCCH, 0x80, LID_DEDIC, "BCCH", rts_data_fn, tx_data_fn, NULL, 1 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_RACH, 0x88, LID_DEDIC, "RACH", NULL, NULL, rx_rach_fn, 1 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_CCCH, 0x90, LID_DEDIC, "CCCH", rts_data_fn, tx_data_fn, NULL, 1 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_TCHF, 0x08, LID_DEDIC, "TCH/F", rts_tchf_fn, tx_tchf_fn, rx_tchf_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_TCHH_0, 0x10, LID_DEDIC, "TCH/H(0)", rts_tchh_fn, tx_tchh_fn, rx_tchh_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_TCHH_1, 0x18, LID_DEDIC, "TCH/H(1)", rts_tchh_fn, tx_tchh_fn, rx_tchh_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH4_0, 0x20, LID_DEDIC, "SDCCH/4(0)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH4_1, 0x28, LID_DEDIC, "SDCCH/4(1)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH4_2, 0x30, LID_DEDIC, "SDCCH/4(2)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH4_3, 0x38, LID_DEDIC, "SDCCH/4(3)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_0, 0x40, LID_DEDIC, "SDCCH/8(0)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_1, 0x48, LID_DEDIC, "SDCCH/8(1)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_2, 0x50, LID_DEDIC, "SDCCH/8(2)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_3, 0x58, LID_DEDIC, "SDCCH/8(3)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_4, 0x60, LID_DEDIC, "SDCCH/8(4)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_5, 0x68, LID_DEDIC, "SDCCH/8(5)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_6, 0x70, LID_DEDIC, "SDCCH/8(6)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SDCCH8_7, 0x78, LID_DEDIC, "SDCCH/8(7)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCHTF, 0x08, LID_SACCH, "SACCH/TF", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCHTH_0, 0x10, LID_SACCH, "SACCH/TH(0)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCHTH_1, 0x18, LID_SACCH, "SACCH/TH(1)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH4_0, 0x20, LID_SACCH, "SACCH/4(0)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH4_1, 0x28, LID_SACCH, "SACCH/4(1)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH4_2, 0x30, LID_SACCH, "SACCH/4(2)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH4_3, 0x38, LID_SACCH, "SACCH/4(3)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_0, 0x40, LID_SACCH, "SACCH/8(0)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_1, 0x48, LID_SACCH, "SACCH/8(1)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_2, 0x50, LID_SACCH, "SACCH/8(2)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_3, 0x58, LID_SACCH, "SACCH/8(3)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_4, 0x60, LID_SACCH, "SACCH/8(4)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_5, 0x68, LID_SACCH, "SACCH/8(5)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_6, 0x70, LID_SACCH, "SACCH/8(6)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_SACCH8_7, 0x78, LID_SACCH, "SACCH/8(7)", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 1, TRXC_PDTCH, 0xc0, LID_DEDIC, "PDTCH", rts_data_fn, tx_pdtch_fn, rx_pdtch_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 1, TRXC_PTCCH, 0xc0, LID_DEDIC, "PTCCH", rts_data_fn, tx_data_fn, rx_data_fn, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, TRXC_CBCH, 0xc8, LID_DEDIC, "CBCH", rts_data_fn, tx_data_fn, NULL, 1 },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_IDLE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "IDLE",</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Idle channel",</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const struct value_string trx_chan_type_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_IDLE),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_FCCH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SCH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_BCCH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_RACH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_CCCH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_TCHF),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_TCHH_0),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_TCHH_1),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH4_0),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH4_1),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH4_2),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH4_3),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_0),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_1),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_2),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_3),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_4),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_5),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_6),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SDCCH8_7),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCHTF),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCHTH_0),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCHTH_1),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH4_0),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH4_1),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH4_2),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH4_3),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_0),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_1),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_2),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_3),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_4),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_5),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_6),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_SACCH8_7),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_PDTCH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_PTCCH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(TRXC_CBCH),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(_TRX_CHAN_MAX),</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, NULL }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* On C0, BTS needs to ensure discontinuous burst transmission.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Therefore we need to send dummy bursts on IDLE slots. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_AUTO_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_idle_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_FCCH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "FCCH", /* 3GPP TS 05.02, section 3.3.2.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Frequency correction channel",</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Tx only, frequency correction bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_AUTO_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_fcch_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SCH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SCH", /* 3GPP TS 05.02, section 3.3.2.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Synchronization channel",</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Tx only, synchronization bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_AUTO_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_sch_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_BCCH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "BCCH", /* 3GPP TS 05.02, section 3.3.2.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Broadcast control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_BCCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Tx only, xCCH convolutional coding (3GPP TS 05.03, section 4.4),</span><br><span style="color: hsl(120, 100%, 40%);">+ * regular interleaving (3GPP TS 05.02, clause 7, table 3):</span><br><span style="color: hsl(120, 100%, 40%);">+ * a L2 frame is interleaved over 4 consecutive bursts. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_AUTO_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_RACH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "RACH", /* 3GPP TS 05.02, section 3.3.3.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Random access channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_RACH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Rx only, RACH convolutional coding (3GPP TS 05.03, section 4.6). */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_AUTO_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_rach_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_CCCH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "CCCH", /* 3GPP TS 05.02, section 3.3.3.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Common control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_PCH_AGCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Tx only, xCCH convolutional coding (3GPP TS 05.03, section 4.4),</span><br><span style="color: hsl(120, 100%, 40%);">+ * regular interleaving (3GPP TS 05.02, clause 7, table 3):</span><br><span style="color: hsl(120, 100%, 40%);">+ * a L2 frame is interleaved over 4 consecutive bursts. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_AUTO_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_TCHF] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "TCH/F", /* 3GPP TS 05.02, section 3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Full Rate traffic channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_Bm_ACCHs,</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Rx and Tx, multiple convolutional coding types (3GPP TS 05.03,</span><br><span style="color: hsl(120, 100%, 40%);">+ * chapter 3), block diagonal interleaving (3GPP TS 05.02, clause 7):</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * - a traffic frame is interleaved over 8 consecutive bursts</span><br><span style="color: hsl(120, 100%, 40%);">+ * using the even numbered bits of the first 4 bursts</span><br><span style="color: hsl(120, 100%, 40%);">+ * and odd numbered bits of the last 4 bursts;</span><br><span style="color: hsl(120, 100%, 40%);">+ * - a FACCH/F frame 'steals' (replaces) one traffic frame,</span><br><span style="color: hsl(120, 100%, 40%);">+ * interleaving is done in the same way. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_tchf_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_tchf_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_tchf_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_TCHH_0] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "TCH/H(0)", /* 3GPP TS 05.02, section 3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Half Rate traffic channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_Lm_ACCHs + (0 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Rx and Tx, multiple convolutional coding types (3GPP TS 05.03,</span><br><span style="color: hsl(120, 100%, 40%);">+ * chapter 3), block diagonal interleaving (3GPP TS 05.02, clause 7):</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * - a traffic frame is interleaved over 6 consecutive bursts</span><br><span style="color: hsl(120, 100%, 40%);">+ * using the even numbered bits of the first 2 bursts,</span><br><span style="color: hsl(120, 100%, 40%);">+ * all bits of the middle two 2 bursts,</span><br><span style="color: hsl(120, 100%, 40%);">+ * and odd numbered bits of the last 2 bursts;</span><br><span style="color: hsl(120, 100%, 40%);">+ * - a FACCH/H frame 'steals' (replaces) two traffic frames,</span><br><span style="color: hsl(120, 100%, 40%);">+ * interleaving is done over 4 consecutive bursts,</span><br><span style="color: hsl(120, 100%, 40%);">+ * the same as given for a TCH/FS. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_tchh_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_tchh_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_tchh_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_TCHH_1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "TCH/H(1)", /* 3GPP TS 05.02, section 3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Half Rate traffic channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_Lm_ACCHs + (1 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_TCHH_0, see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_tchh_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_tchh_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_tchh_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH4_0] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/4(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (0 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH4_1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/4(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (1 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH4_2] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/4(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (2 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH4_3] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/4(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (3 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_0] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (0 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (1 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_2] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (2 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_3] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (3 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_4] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(4)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 4)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (4 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_5] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(5)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 5)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (5 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_6] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(6)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 6)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (6 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SDCCH8_7] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SDCCH/8(7)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Stand-alone dedicated control channel (sub-channel 7)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (7 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCHTF] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/TF", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow TCH/F associated control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_Bm_ACCHs,</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCHTH_0] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/TH(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow TCH/H associated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_Bm_ACCHs + (0 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCHTH_1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/TH(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow TCH/H associated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_Bm_ACCHs + (1 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH4_0] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/4(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/4 associated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (0 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH4_1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/4(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/4 associated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (1 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH4_2] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/4(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/4 associated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (2 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH4_3] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/4(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/4 associated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH4_ACCH + (3 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_0] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (0 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (1 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_2] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (2 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_3] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (3 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_4] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(4)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 4)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (4 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_5] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(5)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 5)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (5 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_6] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(6)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 6)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (6 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_SACCH8_7] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "SACCH/8(7)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Slow SDCCH/8 associated control channel (sub-channel 7)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_SDCCH8_ACCH + (7 << 3),</span><br><span style="color: hsl(120, 100%, 40%);">+ .link_id = LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_PDTCH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "PDTCH", /* 3GPP TS 05.02, sections 3.2.4, 3.3.2.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Packet data traffic & control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_OSMO_PDCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Rx and Tx, multiple coding schemes: CS-2..4 and MCS-1..9 (3GPP TS</span><br><span style="color: hsl(120, 100%, 40%);">+ * 05.03, chapter 5), regular interleaving as specified for xCCH.</span><br><span style="color: hsl(120, 100%, 40%);">+ * NOTE: the burst buffer is three times bigger because the</span><br><span style="color: hsl(120, 100%, 40%);">+ * payload of EDGE bursts is three times longer. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_PDCH,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_pdtch_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_pdtch_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_PTCCH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "PTCCH", /* 3GPP TS 05.02, section 3.3.4.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Packet Timing advance control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_OSMO_PDCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_PDCH,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRXC_CBCH] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: distinguish CBCH on SDCCH/4 and SDCCH/8 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "CBCH", /* 3GPP TS 05.02, section 3.3.5 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .desc = "Cell Broadcast channel",</span><br><span style="color: hsl(120, 100%, 40%);">+ .chan_nr = RSL_CHAN_OSMO_CBCH4,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Tx only, same as for TRXC_BCCH (xCCH), see above. */</span><br><span style="color: hsl(120, 100%, 40%);">+ .flags = TRX_CHAN_FLAG_AUTO_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rts_fn = rts_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .dl_fn = tx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span> };</span><br><span> </span><br><span> /*</span><br><span>@@ -311,7 +666,7 @@</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> prim_fn, get_lchan_by_chan_nr(l1t->trx, chan_nr)->name,</span><br><span style="color: hsl(0, 100%, 40%);">- get_value_string(trx_chan_type_names, chan));</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_chan_desc[chan].name);</span><br><span> /* unlink and free message */</span><br><span> llist_del(&msg->list);</span><br><span> msgb_free(msg);</span><br><span>@@ -608,10 +963,10 @@</span><br><span> for (i = 0; i < _TRX_CHAN_MAX; i++) {</span><br><span> struct l1sched_chan_state *chan_state;</span><br><span> chan_state = &l1ts->chan_state[i];</span><br><span style="color: hsl(0, 100%, 40%);">- /* skip if pchan type does not match pdch flag */</span><br><span style="color: hsl(0, 100%, 40%);">- if ((trx_sched_multiframes[l1ts->mf_index].pchan</span><br><span style="color: hsl(0, 100%, 40%);">- == GSM_PCHAN_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">- != trx_chan_desc[i].pdch)</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Skip if pchan type does not match pdch flag.</span><br><span style="color: hsl(120, 100%, 40%);">+ * FIXME: Is it possible at all? Clarify if so. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((trx_sched_multiframes[l1ts->mf_index].pchan == GSM_PCHAN_PDCH)</span><br><span style="color: hsl(120, 100%, 40%);">+ && !(trx_chan_desc[i].flags & TRX_CHAN_FLAG_PDCH))</span><br><span> continue;</span><br><span> if (trx_chan_desc[i].chan_nr == (chan_nr & 0xf8)</span><br><span> && trx_chan_desc[i].link_id == link_id) {</span><br><span>@@ -727,7 +1082,7 @@</span><br><span> /* look for all matching chan_nr */</span><br><span> for (i = 0; i < _TRX_CHAN_MAX; i++) {</span><br><span> /* skip if pchan type */</span><br><span style="color: hsl(0, 100%, 40%);">- if (trx_chan_desc[i].pdch)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx_chan_desc[i].flags & TRX_CHAN_FLAG_PDCH)</span><br><span> continue;</span><br><span> if (trx_chan_desc[i].chan_nr == (chan_nr & 0xf8)) {</span><br><span> chan_state = &l1ts->chan_state[i];</span><br><span>@@ -782,8 +1137,7 @@</span><br><span> return 0;</span><br><span> </span><br><span> /* check if channel is active */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!trx_chan_desc[chan].auto_active</span><br><span style="color: hsl(0, 100%, 40%);">- && !l1ts->chan_state[chan].active)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TRX_CHAN_IS_ACTIVE(&l1ts->chan_state[chan], chan))</span><br><span> return -EINVAL;</span><br><span> </span><br><span> return func(l1t, tn, fn, frame->dl_chan);</span><br><span>@@ -816,7 +1170,7 @@</span><br><span> l1cs = &l1ts->chan_state[chan];</span><br><span> </span><br><span> /* check if channel is active */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!trx_chan_desc[chan].auto_active && !l1cs->active) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TRX_CHAN_IS_ACTIVE(l1cs, chan)) {</span><br><span> if (nbits)</span><br><span> *nbits = GSM_BURST_LEN;</span><br><span> goto no_data;</span><br><span>@@ -984,7 +1338,7 @@</span><br><span> func = trx_chan_desc[chan].ul_fn;</span><br><span> </span><br><span> /* check if channel is active */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!trx_chan_desc[chan].auto_active && !l1cs->active)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!TRX_CHAN_IS_ACTIVE(l1cs, chan))</span><br><span> return -EINVAL;</span><br><span> </span><br><span> /* omit bursts which have no handler, like IDLE bursts */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/14322">change 14322</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/+/14322"/><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: I9d5d49ec569f133d37b8164b22607d4700474315 </div>
<div style="display:none"> Gerrit-Change-Number: 14322 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>