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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[VAMOS] osmo-bts-trx: properly handle per-timeslot TSC values<br><br>Each timeslot can have its own Training Sequence Code value, which<br>may optionally be included in the NM_MT_SET_CHAN_ATTR message sent<br>over the A-bis/OML.  If it's not present, then the TSC value for a<br>timeslot is derived from the BCC part of BSIC, which is always<br>included in the NM_MT_SET_BTS_ATTR message.<br><br>On the TRXC interface, the BTS global TSC value is indicated to the<br>transceiver using either of the 'SETTSC' or 'SETBSIC' commands.<br>The transceiver then applies this value for all timeslots by default,<br>however it can be redefined for each timeslot individually using<br>additional arguments of the 'SETSLOT' command (see section 25.2.4.1<br>in the user manual [1] for more details).<br><br>Currently, trx_set_ts_as_pchan() sends TRX_PROV_EV_CFG_TSC to the<br>transceiver provisioning FSM, together with the per-timeslot TSC<br>value.  This event causes the FSM to modify the global TSC value,<br>that is going to be or has already been sent to the transceiver.<br>This is wrong, the global TSC value shall not be overwritten.<br><br>Remove the TRX_PROV_EV_CFG_TSC, and include per-timeslot Training<br>Sequence Code and Set in the data structure that gets passed together<br>with the TRX_PROV_EV_CFG_TS instead.  Implement handling of the<br>optional per-timeslot TSC in trx_if_cmd_setslot().<br><br>[1] https://downloads.osmocom.org/docs/latest/osmobts-usermanual.pdf<br><br>Change-Id: Idc5796151e3e83f42d60c2d4cb7c35890d76a7f5<br>Related: SYS#4895, OS#4941<br>---<br>M src/osmo-bts-trx/l1_if.c<br>M src/osmo-bts-trx/l1_if.h<br>M src/osmo-bts-trx/main.c<br>M src/osmo-bts-trx/trx_if.c<br>M src/osmo-bts-trx/trx_if.h<br>M src/osmo-bts-trx/trx_provision_fsm.c<br>M src/osmo-bts-trx/trx_provision_fsm.h<br>M src/osmo-bts-trx/trx_vty.c<br>8 files changed, 84 insertions(+), 58 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c</span><br><span>index 3f95a69..3be5179 100644</span><br><span>--- a/src/osmo-bts-trx/l1_if.c</span><br><span>+++ b/src/osmo-bts-trx/l1_if.c</span><br><span>@@ -271,15 +271,9 @@</span><br><span>       struct phy_instance *pinst = trx_phy_instance(ts->trx);</span><br><span>   struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span>       uint8_t tn = ts->nr;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t tsc = ts->tsc;</span><br><span>   uint8_t slottype;</span><br><span>    int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* all TSC of all timeslots must be equal, because transceiver only</span><br><span style="color: hsl(0, 100%, 40%);">-      * supports one TSC per TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_CFG_TSC, (void*)(intptr_t)tsc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     /* ignore disabled slots */</span><br><span>  if (!(l1h->config.slotmask & (1 << tn)))</span><br><span>                return NM_NACK_RES_NOTAVAIL;</span><br><span>@@ -303,6 +297,13 @@</span><br><span> </span><br><span> </span><br><span>  struct trx_prov_ev_cfg_ts_data data = { .tn = tn, .slottype = slottype };</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ts->tsc_set != 0 || ts->tsc != BTS_TSC(ts->trx->bts)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* On TRXC we use 3GPP compliant numbering, so +1 */</span><br><span style="color: hsl(120, 100%, 40%);">+          data.tsc_set = ts->tsc_set + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+            data.tsc_val = ts->tsc;</span><br><span style="color: hsl(120, 100%, 40%);">+            data.tsc_valid = true;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_CFG_TS, &data);</span><br><span> </span><br><span>     return 0;</span><br><span>diff --git a/src/osmo-bts-trx/l1_if.h b/src/osmo-bts-trx/l1_if.h</span><br><span>index 864bb69..50369d9 100644</span><br><span>--- a/src/osmo-bts-trx/l1_if.h</span><br><span>+++ b/src/osmo-bts-trx/l1_if.h</span><br><span>@@ -105,9 +105,14 @@</span><br><span> </span><br><span>    uint8_t                 slotmask;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   bool                    slottype_valid[TRX_NR_TS];</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t                 slottype[TRX_NR_TS];</span><br><span style="color: hsl(0, 100%, 40%);">-    bool                    slottype_sent[TRX_NR_TS];</span><br><span style="color: hsl(120, 100%, 40%);">+     bool                    setslot_valid[TRX_NR_TS];</span><br><span style="color: hsl(120, 100%, 40%);">+     struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t slottype;</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t tsc_set;</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t tsc_val;</span><br><span style="color: hsl(120, 100%, 40%);">+              bool tsc_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+       }                       setslot[TRX_NR_TS];</span><br><span style="color: hsl(120, 100%, 40%);">+   bool                    setslot_sent[TRX_NR_TS];</span><br><span> };</span><br><span> </span><br><span> struct trx_l1h {</span><br><span>diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c</span><br><span>index e0a99a5..6ec8dfc 100644</span><br><span>--- a/src/osmo-bts-trx/main.c</span><br><span>+++ b/src/osmo-bts-trx/main.c</span><br><span>@@ -145,6 +145,7 @@</span><br><span>        osmo_bts_set_feature(bts->features, BTS_FEAT_CBCH);</span><br><span>       osmo_bts_set_feature(bts->features, BTS_FEAT_HOPPING);</span><br><span>    osmo_bts_set_feature(bts->features, BTS_FEAT_ACCH_REP);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_bts_set_feature(bts->features, BTS_FEAT_MULTI_TSC);</span><br><span> </span><br><span>      bts_internal_flag_set(bts, BTS_INTERNAL_FLAG_MEAS_PAYLOAD_COMB);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c</span><br><span>index af1deef..c10a15f 100644</span><br><span>--- a/src/osmo-bts-trx/trx_if.c</span><br><span>+++ b/src/osmo-bts-trx/trx_if.c</span><br><span>@@ -8,6 +8,7 @@</span><br><span>  * Copyright (C) 2013  Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * Copyright (C) 2016-2017  Harald Welte <laforge@gnumonks.org></span><br><span>  * Copyright (C) 2019  Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2021  sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -326,10 +327,21 @@</span><br><span>       return trx_ctrl_cmd(l1h, 0, "SETMAXDLYNB", "%d", dly);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Send "SETSLOT" command to TRX: Configure Channel Combination for TS */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd_setslot_cb *cb)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Send "SETSLOT" command to TRX: Configure Channel Combination and TSC for TS */</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                       trx_if_cmd_setslot_cb *cb)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  return trx_ctrl_cmd_cb(l1h, 1, cb, "SETSLOT", "%d %d", tn, type);</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct trx_config *cfg = &l1h->config;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cfg->setslot[tn].tsc_valid) { /* PHY is instructed to use a custom TSC */</span><br><span style="color: hsl(120, 100%, 40%);">+              return trx_ctrl_cmd_cb(l1h, 1, cb, "SETSLOT", "%u %u C%u/S%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   tn, cfg->setslot[tn].slottype,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     cfg->setslot[tn].tsc_val,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  cfg->setslot[tn].tsc_set);</span><br><span style="color: hsl(120, 100%, 40%);">+       } else { /* PHY is instructed to use the default TSC from 'SETTSC' */</span><br><span style="color: hsl(120, 100%, 40%);">+            return trx_ctrl_cmd_cb(l1h, 1, cb, "SETSLOT", "%u %u",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   tn, cfg->setslot[tn].slottype);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> }</span><br><span> </span><br><span> /*! Send "RXTUNE" command to TRX: Tune Receiver to given ARFCN */</span><br><span>diff --git a/src/osmo-bts-trx/trx_if.h b/src/osmo-bts-trx/trx_if.h</span><br><span>index e131d56..b838b76 100644</span><br><span>--- a/src/osmo-bts-trx/trx_if.h</span><br><span>+++ b/src/osmo-bts-trx/trx_if.h</span><br><span>@@ -34,7 +34,7 @@</span><br><span> int trx_if_cmd_setpower_att(struct trx_l1h *l1h, int power_att_db, trx_if_cmd_setpower_att_cb *cb);</span><br><span> int trx_if_cmd_setmaxdly(struct trx_l1h *l1h, int dly);</span><br><span> int trx_if_cmd_setmaxdlynb(struct trx_l1h *l1h, int dly);</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd_setslot_cb *cb);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, trx_if_cmd_setslot_cb *cb);</span><br><span> int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb);</span><br><span> int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb);</span><br><span> int trx_if_cmd_handover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss);</span><br><span>diff --git a/src/osmo-bts-trx/trx_provision_fsm.c b/src/osmo-bts-trx/trx_provision_fsm.c</span><br><span>index 070037d..5beca2a 100644</span><br><span>--- a/src/osmo-bts-trx/trx_provision_fsm.c</span><br><span>+++ b/src/osmo-bts-trx/trx_provision_fsm.c</span><br><span>@@ -191,17 +191,15 @@</span><br><span>        cb_ts_connected(ts, rc);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Returns true if any TS changed, false otherwise */</span><br><span style="color: hsl(0, 100%, 40%);">-static bool update_ts_data(struct trx_l1h *l1h, struct trx_prov_ev_cfg_ts_data* ts_data) {</span><br><span style="color: hsl(120, 100%, 40%);">+static void update_ts_data(struct trx_l1h *l1h, struct trx_prov_ev_cfg_ts_data *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    l1h->config.setslot[data->tn].slottype = data->slottype;</span><br><span style="color: hsl(120, 100%, 40%);">+     l1h->config.setslot[data->tn].tsc_set = data->tsc_set;</span><br><span style="color: hsl(120, 100%, 40%);">+       l1h->config.setslot[data->tn].tsc_val = data->tsc_val;</span><br><span style="color: hsl(120, 100%, 40%);">+       l1h->config.setslot[data->tn].tsc_valid = data->tsc_valid;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (l1h->config.slottype[ts_data->tn] != ts_data->slottype ||</span><br><span style="color: hsl(0, 100%, 40%);">-      !l1h->config.slottype_valid[ts_data->tn]) {</span><br><span style="color: hsl(0, 100%, 40%);">-           l1h->config.slottype[ts_data->tn] = ts_data->slottype;</span><br><span style="color: hsl(0, 100%, 40%);">-         l1h->config.slottype_valid[ts_data->tn] = true;</span><br><span style="color: hsl(0, 100%, 40%);">-           l1h->config.slottype_sent[ts_data->tn] = false;</span><br><span style="color: hsl(0, 100%, 40%);">-           return true;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.setslot_valid[data->tn] = true;</span><br><span style="color: hsl(120, 100%, 40%);">+     l1h->config.setslot_sent[data->tn] = false;</span><br><span> }</span><br><span> </span><br><span> /* Whether a given TRX is fully configured and can be powered on */</span><br><span>@@ -290,9 +288,7 @@</span><br><span>      struct trx_l1h *l1h = (struct trx_l1h *)fi->priv;</span><br><span>         struct phy_instance *pinst = l1h->phy_inst;</span><br><span>       struct gsm_bts_trx *trx = pinst->trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t bsic;</span><br><span>        uint16_t arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t tsc;</span><br><span>        int nominal_power;</span><br><span>   int status;</span><br><span>  bool others_ready;</span><br><span>@@ -302,11 +298,21 @@</span><br><span>           l1h->config.enabled =(bool)data;</span><br><span>          break;</span><br><span>       case TRX_PROV_EV_CFG_BSIC:</span><br><span style="color: hsl(0, 100%, 40%);">-              bsic = (uint8_t)(intptr_t)data;</span><br><span style="color: hsl(0, 100%, 40%);">-         if (l1h->config.bsic != bsic || !l1h->config.bsic_valid) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        l1h->config.bsic = bsic;</span><br><span style="color: hsl(0, 100%, 40%);">-                     l1h->config.bsic_valid = true;</span><br><span style="color: hsl(0, 100%, 40%);">-                       l1h->config.bsic_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+             /* We always get BSIC from the BSC, TSC can be derived from the BCC */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!pinst->phy_link->u.osmotrx.use_legacy_setbsic) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   const uint8_t tsc = BSIC2BCC((uint8_t)(intptr_t)data);</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (l1h->config.tsc != tsc || !l1h->config.tsc_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         l1h->config.tsc = tsc;</span><br><span style="color: hsl(120, 100%, 40%);">+                             l1h->config.tsc_valid = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                              l1h->config.tsc_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      const uint8_t bsic = (uint8_t)(intptr_t)data;</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (l1h->config.bsic != bsic || !l1h->config.bsic_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              l1h->config.bsic = bsic;</span><br><span style="color: hsl(120, 100%, 40%);">+                           l1h->config.bsic_valid = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                             l1h->config.bsic_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span>            }</span><br><span>            break;</span><br><span>       case TRX_PROV_EV_CFG_ARFCN:</span><br><span>@@ -319,14 +325,6 @@</span><br><span>                   l1h->config.nomtxpower_sent = false;</span><br><span>              }</span><br><span>            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case TRX_PROV_EV_CFG_TSC:</span><br><span style="color: hsl(0, 100%, 40%);">-               tsc = (uint16_t)(intptr_t)data;</span><br><span style="color: hsl(0, 100%, 40%);">-         if (l1h->config.tsc != tsc || !l1h->config.tsc_valid) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   l1h->config.tsc = tsc;</span><br><span style="color: hsl(0, 100%, 40%);">-                       l1h->config.tsc_valid = true;</span><br><span style="color: hsl(0, 100%, 40%);">-                        l1h->config.tsc_sent = false;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span>       case TRX_PROV_EV_CFG_TS:</span><br><span>             update_ts_data(l1h, (struct trx_prov_ev_cfg_ts_data*)data);</span><br><span>          break;</span><br><span>@@ -478,11 +476,10 @@</span><br><span>       }</span><br><span> </span><br><span>        for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (l1h->config.slottype_valid[tn]</span><br><span style="color: hsl(0, 100%, 40%);">-            && !l1h->config.slottype_sent[tn]) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        trx_if_cmd_setslot(l1h, tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                             l1h->config.slottype[tn], l1if_setslot_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-                  l1h->config.slottype_sent[tn] = true;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (l1h->config.setslot_valid[tn]</span><br><span style="color: hsl(120, 100%, 40%);">+           && !l1h->config.setslot_sent[tn]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       trx_if_cmd_setslot(l1h, tn, l1if_setslot_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+                 l1h->config.setslot_sent[tn] = true;</span><br><span>              }</span><br><span>    }</span><br><span> }</span><br><span>@@ -507,7 +504,7 @@</span><br><span>                         l1h->config.maxdly_sent = false;</span><br><span>                  l1h->config.maxdlynb_sent = false;</span><br><span>                        for (tn = 0; tn < TRX_NR_TS; tn++)</span><br><span style="color: hsl(0, 100%, 40%);">-                           l1h->config.slottype_sent[tn] = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                             l1h->config.setslot_sent[tn] = false;</span><br><span>             } else if (!pinst->phy_link->u.osmotrx.poweronoff_sent) {</span><br><span>                      bts_model_trx_close_cb(pinst->trx, 0);</span><br><span>            } /* else: poweroff in progress, cb will be called upon TRXC RSP */</span><br><span>@@ -519,12 +516,10 @@</span><br><span>          break;</span><br><span>       case TRX_PROV_EV_CFG_TS:</span><br><span>             ts_data = (struct trx_prov_ev_cfg_ts_data*)data;</span><br><span style="color: hsl(0, 100%, 40%);">-                if (update_ts_data(l1h, ts_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     trx_if_cmd_setslot(l1h, ts_data->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                         l1h->config.slottype[ ts_data->tn], l1if_setslot_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-                     l1h->config.slottype_sent[ts_data->tn] = true;</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%);">+             update_ts_data(l1h, ts_data);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* While in this state we can send SETSLOT immediately */</span><br><span style="color: hsl(120, 100%, 40%);">+             trx_if_cmd_setslot(l1h, ts_data->tn, l1if_setslot_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+             l1h->config.setslot_sent[ts_data->tn] = true;</span><br><span>          break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(0);</span><br><span>@@ -571,7 +566,6 @@</span><br><span>                        X(TRX_PROV_EV_CFG_ENABLE) |</span><br><span>                  X(TRX_PROV_EV_CFG_BSIC) |</span><br><span>                    X(TRX_PROV_EV_CFG_ARFCN) |</span><br><span style="color: hsl(0, 100%, 40%);">-                      X(TRX_PROV_EV_CFG_TSC) |</span><br><span>                     X(TRX_PROV_EV_CFG_TS) |</span><br><span>                      X(TRX_PROV_EV_RXTUNE_CNF) |</span><br><span>                  X(TRX_PROV_EV_TXTUNE_CNF) |</span><br><span>@@ -623,7 +617,6 @@</span><br><span>    OSMO_VALUE_STRING(TRX_PROV_EV_CFG_ENABLE),</span><br><span>   OSMO_VALUE_STRING(TRX_PROV_EV_CFG_BSIC),</span><br><span>     OSMO_VALUE_STRING(TRX_PROV_EV_CFG_ARFCN),</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_VALUE_STRING(TRX_PROV_EV_CFG_TSC),</span><br><span>      OSMO_VALUE_STRING(TRX_PROV_EV_CFG_TS),</span><br><span>       OSMO_VALUE_STRING(TRX_PROV_EV_CFG_RXGAIN),</span><br><span>   OSMO_VALUE_STRING(TRX_PROV_EV_CFG_SETMAXDLY),</span><br><span>diff --git a/src/osmo-bts-trx/trx_provision_fsm.h b/src/osmo-bts-trx/trx_provision_fsm.h</span><br><span>index 0f80088..8e6b97b 100644</span><br><span>--- a/src/osmo-bts-trx/trx_provision_fsm.h</span><br><span>+++ b/src/osmo-bts-trx/trx_provision_fsm.h</span><br><span>@@ -22,6 +22,8 @@</span><br><span> </span><br><span> #pragma once</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <osmocom/core/fsm.h></span><br><span> </span><br><span> enum trx_provision_fsm_states {</span><br><span>@@ -35,6 +37,11 @@</span><br><span> struct trx_prov_ev_cfg_ts_data {</span><br><span>  uint8_t tn;</span><br><span>  uint8_t slottype;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Training Sequence Code and Set */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t tsc_set;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t tsc_val;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool tsc_valid;</span><br><span> };</span><br><span> </span><br><span> enum trx_provision_fsm_events {</span><br><span>diff --git a/src/osmo-bts-trx/trx_vty.c b/src/osmo-bts-trx/trx_vty.c</span><br><span>index 2b0913f..d9d17d0 100644</span><br><span>--- a/src/osmo-bts-trx/trx_vty.c</span><br><span>+++ b/src/osmo-bts-trx/trx_vty.c</span><br><span>@@ -127,16 +127,23 @@</span><br><span>    else</span><br><span>                 vty_out(vty, " maxdlynb : undefined%s", VTY_NEWLINE);</span><br><span>      for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!((1 << tn) & l1h->config.slotmask))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!((1 << tn) & l1h->config.slotmask)) {</span><br><span>                      vty_out(vty, " slot #%d: unsupported%s", tn,</span><br><span>                               VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           else if (l1h->config.slottype_valid[tn])</span><br><span style="color: hsl(0, 100%, 40%);">-                     vty_out(vty, " slot #%d: type %d%s", tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                              l1h->config.slottype[tn],</span><br><span style="color: hsl(0, 100%, 40%);">-                            VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (!l1h->config.setslot_valid[tn]) {</span><br><span>                      vty_out(vty, " slot #%d: undefined%s", tn,</span><br><span>                                 VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, " slot #%d: type %d", tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                      l1h->config.setslot[tn].slottype);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (l1h->config.setslot[tn].tsc_valid)</span><br><span style="color: hsl(120, 100%, 40%);">+                     vty_out(vty, " TSC-s%dc%d",</span><br><span style="color: hsl(120, 100%, 40%);">+                         l1h->config.setslot[tn].tsc_set,</span><br><span style="color: hsl(120, 100%, 40%);">+                           l1h->config.setslot[tn].tsc_val);</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%s", VTY_NEWLINE);</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/24388">change 24388</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/+/24388"/><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: Idc5796151e3e83f42d60c2d4cb7c35890d76a7f5 </div>
<div style="display:none"> Gerrit-Change-Number: 24388 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>