<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/19367">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts-trx: Integrate TRX provisioning logic more tightly into the FSM<br><br>The state of each config required is now tracked through the "acked"<br>variables, this way the FSM can know when all configs are confirmed by<br>the TRX and can proceed to submit POWERON command.<br>With this version each TRX is still totally independent (there's an FSM<br>per TRX), which means POWERON can be sent on TRX0 before TRX!=0 are<br>fully configured. As a result, powe ramping may start before we know the<br>NOMTXPOWER of a TRX. This kind of issue will be fixed in next commit.<br><br>Related: SYS#4920<br>Change-Id: I1b736a4be5ce52a854f5767d8609153e1f4c08d9<br>---<br>M src/osmo-bts-trx/l1_if.h<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>5 files changed, 230 insertions(+), 89 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/67/19367/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bts-trx/l1_if.h b/src/osmo-bts-trx/l1_if.h</span><br><span>index f35936e..fb988a6 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>@@ -61,21 +61,27 @@</span><br><span> uint8_t trxd_hdr_ver_req; /* requested TRXD header version */</span><br><span> uint8_t trxd_hdr_ver_use; /* actual TRXD header version in use */</span><br><span> bool setformat_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool setformat_acked;</span><br><span> </span><br><span> bool enabled;</span><br><span> </span><br><span> </span><br><span> bool arfcn_valid;</span><br><span> uint16_t arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">- bool arfcn_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool rxtune_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool rxtune_acked;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool txtune_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool txtune_acked;</span><br><span> </span><br><span> bool tsc_valid;</span><br><span> uint8_t tsc;</span><br><span> bool tsc_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool tsc_acked;</span><br><span> </span><br><span> bool bsic_valid;</span><br><span> uint8_t bsic;</span><br><span> bool bsic_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool bsic_acked;</span><br><span> </span><br><span> bool rxgain_valid;</span><br><span> uint8_t rxgain;</span><br><span>@@ -84,6 +90,8 @@</span><br><span> int forced_max_power_red; /* -1 if not forced by VTY config (default) */</span><br><span> </span><br><span> bool nominal_power_set_by_vty; /* whether nominal trx power was enforced/retreived from VTY config "nominal-tx-power" */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool nomtxpower_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool nomtxpower_acked;</span><br><span> </span><br><span> bool maxdly_valid;</span><br><span> int maxdly;</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 e650d79..ad6faad 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>@@ -270,32 +270,24 @@</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETFORMAT" command to TRX: change TRXD header format version */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver, trx_if_cmd_generic_cb *cb)</span><br><span> {</span><br><span> LOGPPHI(l1h->phy_inst, DTRX, LOGL_INFO,</span><br><span> "Requesting TRXD header format version %u\n", ver);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return trx_ctrl_cmd(l1h, 0, "SETFORMAT", "%u", ver);</span><br><span style="color: hsl(120, 100%, 40%);">+ return trx_ctrl_cmd_cb(l1h, 0, cb, "SETFORMAT", "%u", ver);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETTSC" command to TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc, trx_if_cmd_generic_cb *cb)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct phy_instance *pinst = l1h->phy_inst;</span><br><span style="color: hsl(0, 100%, 40%);">- if (pinst->phy_link->u.osmotrx.use_legacy_setbsic)</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return trx_ctrl_cmd(l1h, 1, "SETTSC", "%d", tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+ return trx_ctrl_cmd_cb(l1h, 1, cb, "SETTSC", "%d", tsc);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETBSIC" command to TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic, trx_if_cmd_generic_cb *cb)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct phy_instance *pinst = l1h->phy_inst;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!pinst->phy_link->u.osmotrx.use_legacy_setbsic)</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return trx_ctrl_cmd(l1h, 1, "SETBSIC", "%d", bsic);</span><br><span style="color: hsl(120, 100%, 40%);">+ return trx_ctrl_cmd_cb(l1h, 1, cb, "SETBSIC", "%d", bsic);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETRXGAIN" command to TRX */</span><br><span>@@ -335,7 +327,7 @@</span><br><span> }</span><br><span> </span><br><span> /*! Send "RXTUNE" command to TRX: Tune Receiver to given ARFCN */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb)</span><br><span> {</span><br><span> struct phy_instance *pinst = l1h->phy_inst;</span><br><span> uint16_t freq10;</span><br><span>@@ -350,11 +342,11 @@</span><br><span> return -ENOTSUP;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return trx_ctrl_cmd(l1h, 1, "RXTUNE", "%d", freq10 * 100);</span><br><span style="color: hsl(120, 100%, 40%);">+ return trx_ctrl_cmd_cb(l1h, 1, cb, "RXTUNE", "%d", freq10 * 100);</span><br><span> }</span><br><span> </span><br><span> /*! Send "TXTUNE" command to TRX: Tune Transmitter to given ARFCN */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb)</span><br><span> {</span><br><span> struct phy_instance *pinst = l1h->phy_inst;</span><br><span> uint16_t freq10;</span><br><span>@@ -369,7 +361,7 @@</span><br><span> return -ENOTSUP;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return trx_ctrl_cmd(l1h, 1, "TXTUNE", "%d", freq10 * 100);</span><br><span style="color: hsl(120, 100%, 40%);">+ return trx_ctrl_cmd_cb(l1h, 1, cb, "TXTUNE", "%d", freq10 * 100);</span><br><span> }</span><br><span> </span><br><span> /*! Send "HANDOVER" command to TRX: Enable handover RACH Detection on timeslot/sub-slot */</span><br><span>@@ -516,12 +508,17 @@</span><br><span> static int trx_ctrl_rx_rsp_setformat(struct trx_l1h *l1h,</span><br><span> struct trx_ctrl_rsp *rsp)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_generic_cb *cb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Old transceivers reject 'SETFORMAT' with 'RSP ERR 1' */</span><br><span> if (strcmp(rsp->cmd, "SETFORMAT") != 0) {</span><br><span> LOGPPHI(l1h->phy_inst, DTRX, LOGL_NOTICE,</span><br><span> "Transceiver rejected the format negotiation command, "</span><br><span> "using legacy TRXD header format version (0)\n");</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.trxd_hdr_ver_use = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rsp->cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cb = (trx_if_cmd_generic_cb*) rsp->cb;</span><br><span style="color: hsl(120, 100%, 40%);">+ cb(l1h, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -534,19 +531,9 @@</span><br><span> return -EINVAL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Transceiver may suggest a lower version (than requested) */</span><br><span style="color: hsl(0, 100%, 40%);">- if (rsp->status == l1h->config.trxd_hdr_ver_req) {</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.trxd_hdr_ver_use = rsp->status;</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">- "Using TRXD header format version %u\n",</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.trxd_hdr_ver_use);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">- "Transceiver suggests TRXD header version %u (requested %u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rsp->status, l1h->config.trxd_hdr_ver_req);</span><br><span style="color: hsl(0, 100%, 40%);">- /* Send another SETFORMAT with suggested version */</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.trxd_hdr_ver_req = rsp->status;</span><br><span style="color: hsl(0, 100%, 40%);">- trx_if_cmd_setformat(l1h, rsp->status);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rsp->cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cb = (trx_if_cmd_generic_cb*) rsp->cb;</span><br><span style="color: hsl(120, 100%, 40%);">+ cb(l1h, rsp->status);</span><br><span> }</span><br><span> </span><br><span> return 0;</span><br><span>@@ -595,6 +582,8 @@</span><br><span> struct trx_ctrl_rsp *rsp,</span><br><span> struct trx_ctrl_msg *tcm)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_generic_cb *cb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (strcmp(rsp->cmd, "POWERON") == 0) {</span><br><span> return trx_ctrl_rx_rsp_poweron(l1h, rsp);</span><br><span> } else if (strcmp(rsp->cmd, "POWEROFF") == 0) {</span><br><span>@@ -611,6 +600,12 @@</span><br><span> return trx_ctrl_rx_rsp_setpower(l1h, rsp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Generic callback if available */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rsp->cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cb = (trx_if_cmd_generic_cb*) rsp->cb;</span><br><span style="color: hsl(120, 100%, 40%);">+ cb(l1h, rsp->status);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (rsp->status) {</span><br><span> LOGPPHI(l1h->phy_inst, DTRX, tcm->critical ? LOGL_FATAL : LOGL_NOTICE,</span><br><span> "transceiver rejected TRX command with response: '%s%s%s %d'\n",</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 b2fc326..6b417cf 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>@@ -14,6 +14,7 @@</span><br><span> void *cb;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+typedef void trx_if_cmd_generic_cb(struct trx_l1h *l1h, int rc);</span><br><span> typedef void trx_if_cmd_poweronoff_cb(struct trx_l1h *l1h, bool poweronoff, int rc);</span><br><span> typedef void trx_if_cmd_setslot_cb(struct trx_l1h *l1h, uint8_t tn, uint8_t type, int rc);</span><br><span> typedef void trx_if_cmd_getnompower_cb(struct trx_l1h *l1h, int nominal_power, int rc);</span><br><span>@@ -22,16 +23,16 @@</span><br><span> void trx_if_init(struct trx_l1h *l1h);</span><br><span> int trx_if_cmd_poweroff(struct trx_l1h *l1h, trx_if_cmd_poweronoff_cb *cb);</span><br><span> int trx_if_cmd_poweron(struct trx_l1h *l1h, trx_if_cmd_poweronoff_cb *cb);</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc);</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc, trx_if_cmd_generic_cb *cb);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic, trx_if_cmd_generic_cb *cb);</span><br><span> int trx_if_cmd_setrxgain(struct trx_l1h *l1h, int db);</span><br><span> int trx_if_cmd_getnompower(struct trx_l1h *l1h, trx_if_cmd_getnompower_cb *cb);</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> 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(0, 100%, 40%);">-int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn);</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb);</span><br><span style="color: hsl(120, 100%, 40%);">+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> int trx_if_cmd_nohandover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss);</span><br><span> int trx_if_send_burst(struct trx_l1h *l1h, const struct trx_dl_burst_req *br);</span><br><span>@@ -41,6 +42,6 @@</span><br><span> #define TRX_DATA_FORMAT_VER 1</span><br><span> </span><br><span> /* Format negotiation command */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setformat(struct trx_l1h *l1h, uint8_t ver, trx_if_cmd_generic_cb *cb);</span><br><span> </span><br><span> #endif /* TRX_IF_H */</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 fbeee37..611ec69 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>@@ -56,14 +56,37 @@</span><br><span> osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_POWEROFF_CNF, (void*)(intptr_t)rc);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void l1if_rxtune_cb(struct trx_l1h *l1h, int rc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_RXTUNE_CNF, (void*)(intptr_t)rc);</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%);">+void l1if_txtune_cb(struct trx_l1h *l1h, int rc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_TXTUNE_CNF, (void*)(intptr_t)rc);</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%);">+void l1if_settsc_cb(struct trx_l1h *l1h, int rc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_SETTSC_CNF, (void*)(intptr_t)rc);</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%);">+void l1if_setbsic_cb(struct trx_l1h *l1h, int rc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_SETBSIC_CNF, (void*)(intptr_t)rc);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void l1if_getnompower_cb(struct trx_l1h *l1h, int nominal_power, int rc)</span><br><span> {</span><br><span> struct phy_instance *pinst = l1h->phy_inst;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx *trx = pinst->trx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> LOGPPHI(pinst, DL1C, LOGL_DEBUG, "l1if_getnompower_cb(nominal_power=%d, rc=%d)\n", nominal_power, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_NOMTXPOWER_CNF, (void*)(intptr_t)nominal_power);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- l1if_trx_set_nominal_power(trx, nominal_power);</span><br><span style="color: hsl(120, 100%, 40%);">+void l1if_setformat_cb(struct trx_l1h *l1h, int rc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_SETFORMAT_CNF, (void*)(intptr_t)rc);</span><br><span> }</span><br><span> </span><br><span> /*</span><br><span>@@ -87,59 +110,58 @@</span><br><span> return -EIO;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (l1h->config.enabled</span><br><span style="color: hsl(0, 100%, 40%);">- && l1h->config.tsc_valid</span><br><span style="color: hsl(0, 100%, 40%);">- && l1h->config.bsic_valid</span><br><span style="color: hsl(0, 100%, 40%);">- && l1h->config.arfcn_valid) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* before power on */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!l1h->config.arfcn_sent) {</span><br><span style="color: hsl(0, 100%, 40%);">- trx_if_cmd_rxtune(l1h, l1h->config.arfcn);</span><br><span style="color: hsl(0, 100%, 40%);">- trx_if_cmd_txtune(l1h, l1h->config.arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* before power on */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.arfcn_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!l1h->config.rxtune_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_rxtune(l1h, l1h->config.arfcn, l1if_rxtune_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.rxtune_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.rxtune_acked = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!l1h->config.txtune_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_txtune(l1h, l1h->config.arfcn, l1if_txtune_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.txtune_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.txtune_acked = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.txtune_acked) {</span><br><span> /* After TXTUNE is sent to TRX, get the tx nominal power</span><br><span> * (which may vary precisly on band/arfcn. Avoid sending</span><br><span> * it if we are forced by VTY to use a specific nominal</span><br><span> * power (because TRX may not support the command or</span><br><span> * provide broken values) */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!l1h->config.nominal_power_set_by_vty)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!l1h->config.nominal_power_set_by_vty && !l1h->config.nomtxpower_sent) {</span><br><span> trx_if_cmd_getnompower(l1h, l1if_getnompower_cb);</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.arfcn_sent = true;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (!l1h->config.tsc_sent) {</span><br><span style="color: hsl(0, 100%, 40%);">- trx_if_cmd_settsc(l1h, l1h->config.tsc);</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.tsc_sent = true;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (!l1h->config.bsic_sent) {</span><br><span style="color: hsl(0, 100%, 40%);">- trx_if_cmd_setbsic(l1h, l1h->config.bsic);</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.bsic_sent = 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(0, 100%, 40%);">- /* Ask transceiver to use the newest TRXD header version if not using it yet */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!l1h->config.setformat_sent) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (l1h->config.trxd_hdr_ver_use != plink->u.osmotrx.trxd_hdr_ver_max) {</span><br><span style="color: hsl(0, 100%, 40%);">- trx_if_cmd_setformat(l1h, plink->u.osmotrx.trxd_hdr_ver_max);</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.trxd_hdr_ver_req = plink->u.osmotrx.trxd_hdr_ver_max;</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(pinst, DL1C, LOGL_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">- "No need to negotiate TRXD version, "</span><br><span style="color: hsl(0, 100%, 40%);">- "already using maximum configured one: %" PRIu8 "\n",</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.trxd_hdr_ver_use);</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.nomtxpower_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.nomtxpower_acked = false;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.setformat_sent = true;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (pinst->num == 0 && !plink->u.osmotrx.powered && !plink->u.osmotrx.poweronoff_sent) {</span><br><span style="color: hsl(0, 100%, 40%);">- trx_if_cmd_poweron(l1h, l1if_poweronoff_cb);</span><br><span style="color: hsl(0, 100%, 40%);">- plink->u.osmotrx.poweronoff_sent = 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(0, 100%, 40%);">- return 0;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(pinst, DL1C, LOGL_INFO, "Delaying provision, TRX attributes not yet received from BSC:%s%s%s%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.enabled ? "" :" enable",</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.tsc_valid ? "" : " tsc",</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.bsic_valid ? "" : " bsic",</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.arfcn_valid ? "" : " arfcn");</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</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%);">+ l1h->config.tsc_valid && !l1h->config.tsc_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_settsc(l1h, l1h->config.tsc, l1if_settsc_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.tsc_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.tsc_acked = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</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%);">+ l1h->config.bsic_valid && !l1h->config.bsic_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_setbsic(l1h, l1h->config.bsic, l1if_setbsic_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.bsic_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.bsic_acked = false;</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%);">+ /* Ask transceiver to use the newest TRXD header version if not using it yet */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!l1h->config.setformat_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.setformat_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (plink->u.osmotrx.trxd_hdr_ver_max == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(pinst, DL1C, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+ "No need to negotiate max TRXD version 0");</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.trxd_hdr_ver_use = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.setformat_acked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_setformat(l1h, l1h->config.trxd_hdr_ver_req, l1if_setformat_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.setformat_acked = false;</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%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span> static void l1if_setslot_cb(struct trx_l1h *l1h, uint8_t tn, uint8_t type, int rc)</span><br><span>@@ -182,6 +204,20 @@</span><br><span> return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Whether a given TRX is fully configured and can be powered on */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool trx_can_be_powered_on(struct trx_l1h *l1h)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct phy_instance *pinst = l1h->phy_inst;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.enabled && l1h->config.rxtune_acked && l1h->config.txtune_acked &&</span><br><span style="color: hsl(120, 100%, 40%);">+ (l1h->config.bsic_acked || !pinst->phy_link->u.osmotrx.use_legacy_setbsic) &&</span><br><span style="color: hsl(120, 100%, 40%);">+ (l1h->config.tsc_acked || pinst->phy_link->u.osmotrx.use_legacy_setbsic) &&</span><br><span style="color: hsl(120, 100%, 40%);">+ (l1h->config.nomtxpower_acked || l1h->config.nominal_power_set_by_vty) &&</span><br><span style="color: hsl(120, 100%, 40%);">+ (l1h->config.setformat_acked)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> //////////////////////////</span><br><span> // FSM STATE ACTIONS</span><br><span>@@ -202,12 +238,24 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void st_open_poweroff_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct trx_l1h *l1h = (struct trx_l1h *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct phy_instance *pinst = l1h->phy_inst;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.trxd_hdr_ver_req = pinst->phy_link->u.osmotrx.trxd_hdr_ver_max;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void st_open_poweroff(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span> struct trx_l1h *l1h = (struct trx_l1h *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct phy_instance *pinst = l1h->phy_inst;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *trx = pinst->trx;</span><br><span> uint8_t bsic;</span><br><span> uint16_t arfcn;</span><br><span> uint16_t tsc;</span><br><span style="color: hsl(120, 100%, 40%);">+ int nominal_power;</span><br><span style="color: hsl(120, 100%, 40%);">+ int status;</span><br><span> </span><br><span> switch(event) {</span><br><span> case TRX_PROV_EV_CFG_ENABLE:</span><br><span>@@ -226,7 +274,9 @@</span><br><span> if (l1h->config.arfcn != arfcn || !l1h->config.arfcn_valid) {</span><br><span> l1h->config.arfcn = arfcn;</span><br><span> l1h->config.arfcn_valid = true;</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.arfcn_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.txtune_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.rxtune_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.nomtxpower_sent = false;</span><br><span> }</span><br><span> break;</span><br><span> case TRX_PROV_EV_CFG_TSC:</span><br><span>@@ -240,17 +290,84 @@</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* CONFIRMATIONS FROM TRXC */</span><br><span style="color: hsl(120, 100%, 40%);">+ case TRX_PROV_EV_RXTUNE_CNF:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.rxtune_sent)</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.rxtune_acked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case TRX_PROV_EV_TXTUNE_CNF:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.txtune_sent)</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.txtune_acked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case TRX_PROV_EV_NOMTXPOWER_CNF:</span><br><span style="color: hsl(120, 100%, 40%);">+ nominal_power = (int)(intptr_t)data;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.nomtxpower_sent)</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.nomtxpower_acked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1if_trx_set_nominal_power(trx, nominal_power);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case TRX_PROV_EV_SETBSIC_CNF:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.bsic_sent)</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.bsic_acked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case TRX_PROV_EV_SETTSC_CNF:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l1h->config.tsc_sent)</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.tsc_acked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case TRX_PROV_EV_SETFORMAT_CNF:</span><br><span style="color: hsl(120, 100%, 40%);">+ status = (int)(intptr_t)data;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Transceiver may suggest a lower version (than requested) */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status == l1h->config.trxd_hdr_ver_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.trxd_hdr_ver_use = status;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.setformat_acked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(l1h->phy_inst, DTRX, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Using TRXD header format version %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.trxd_hdr_ver_use);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Transceiver suggests TRXD header version %u (requested %u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ status, l1h->config.trxd_hdr_ver_req);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send another SETFORMAT with suggested version */</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.trxd_hdr_ver_req = status;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.setformat_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* 0 = if we gathered all date and could go forward :*/</span><br><span style="color: hsl(0, 100%, 40%);">- if (l1if_provision_transceiver_trx(l1h) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ l1if_provision_transceiver_trx(l1h);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* if we gathered all data and could go forward :*/</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx_can_be_powered_on(l1h)) {</span><br><span> if (l1h->phy_inst->num == 0)</span><br><span> trx_prov_fsm_state_chg(fi, TRX_PROV_ST_OPEN_WAIT_POWERON_CNF);</span><br><span> else</span><br><span> trx_prov_fsm_state_chg(fi, TRX_PROV_ST_OPEN_POWERON);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(pinst, DL1C, LOGL_INFO, "Delaying poweron, TRX attributes not yet configured:%s%s%s%s%s%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.enabled ? "" :" enable",</span><br><span style="color: hsl(120, 100%, 40%);">+ pinst->phy_link->u.osmotrx.use_legacy_setbsic ?</span><br><span style="color: hsl(120, 100%, 40%);">+ (l1h->config.bsic_valid ? (l1h->config.bsic_acked ? "" : " bsic-ack") : " bsic") :</span><br><span style="color: hsl(120, 100%, 40%);">+ (l1h->config.tsc_valid ? (l1h->config.tsc_acked ? "" : " tsc-ack") : " tsc"),</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.arfcn_valid ? "" : " arfcn",</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.rxtune_acked ? "" : " rxtune-ack",</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.nominal_power_set_by_vty ? "" : (l1h->config.nomtxpower_acked ? "" : " nomtxpower-ack"),</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.setformat_acked ? "" : " setformat-ack"</span><br><span style="color: hsl(120, 100%, 40%);">+ );</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_open_wait_power_cnf_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct trx_l1h *l1h = (struct trx_l1h *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct phy_instance *pinst = l1h->phy_inst;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_if_cmd_poweron(l1h, l1if_poweronoff_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ pinst->phy_link->u.osmotrx.poweronoff_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void st_open_wait_power_cnf(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span> struct trx_l1h *l1h = (struct trx_l1h *)fi->priv;</span><br><span>@@ -392,11 +509,18 @@</span><br><span> X(TRX_PROV_EV_CFG_BSIC) |</span><br><span> X(TRX_PROV_EV_CFG_ARFCN) |</span><br><span> X(TRX_PROV_EV_CFG_TSC) |</span><br><span style="color: hsl(0, 100%, 40%);">- X(TRX_PROV_EV_CFG_TS),</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TRX_PROV_EV_CFG_TS) |</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TRX_PROV_EV_RXTUNE_CNF) |</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TRX_PROV_EV_TXTUNE_CNF) |</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TRX_PROV_EV_NOMTXPOWER_CNF) |</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TRX_PROV_EV_SETBSIC_CNF) |</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TRX_PROV_EV_SETTSC_CNF) |</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TRX_PROV_EV_SETFORMAT_CNF),</span><br><span> .out_state_mask =</span><br><span> X(TRX_PROV_ST_OPEN_WAIT_POWERON_CNF) |</span><br><span> X(TRX_PROV_ST_OPEN_POWERON),</span><br><span> .name = "OPEN_POWEROFF",</span><br><span style="color: hsl(120, 100%, 40%);">+ .onenter = st_open_poweroff_on_enter,</span><br><span> .action = st_open_poweroff,</span><br><span> },</span><br><span> [TRX_PROV_ST_OPEN_WAIT_POWERON_CNF] = {</span><br><span>@@ -406,6 +530,7 @@</span><br><span> .out_state_mask =</span><br><span> X(TRX_PROV_ST_OPEN_POWERON),</span><br><span> .name = "OPEN_WAIT_POWERON_CNF",</span><br><span style="color: hsl(120, 100%, 40%);">+ .onenter = st_open_wait_power_cnf_on_enter,</span><br><span> .action = st_open_wait_power_cnf,</span><br><span> },</span><br><span> [TRX_PROV_ST_OPEN_POWERON] = {</span><br><span>@@ -438,6 +563,12 @@</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 style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(TRX_PROV_EV_RXTUNE_CNF),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(TRX_PROV_EV_TXTUNE_CNF),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(TRX_PROV_EV_NOMTXPOWER_CNF),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(TRX_PROV_EV_SETBSIC_CNF),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(TRX_PROV_EV_SETTSC_CNF),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(TRX_PROV_EV_SETFORMAT_CNF),</span><br><span> OSMO_VALUE_STRING(TRX_PROV_EV_POWERON_CNF),</span><br><span> OSMO_VALUE_STRING(TRX_PROV_EV_POWEROFF),</span><br><span> OSMO_VALUE_STRING(TRX_PROV_EV_POWEROFF_CNF),</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 7fede35..24eb268 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>@@ -46,6 +46,12 @@</span><br><span> TRX_PROV_EV_CFG_TS,</span><br><span> TRX_PROV_EV_CFG_RXGAIN,</span><br><span> TRX_PROV_EV_CFG_SETMAXDLY,</span><br><span style="color: hsl(120, 100%, 40%);">+ TRX_PROV_EV_RXTUNE_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+ TRX_PROV_EV_TXTUNE_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+ TRX_PROV_EV_NOMTXPOWER_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+ TRX_PROV_EV_SETBSIC_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+ TRX_PROV_EV_SETTSC_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+ TRX_PROV_EV_SETFORMAT_CNF,</span><br><span> TRX_PROV_EV_POWERON_CNF,</span><br><span> TRX_PROV_EV_POWEROFF,</span><br><span> TRX_PROV_EV_POWEROFF_CNF,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/19367">change 19367</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/+/19367"/><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: I1b736a4be5ce52a854f5767d8609153e1f4c08d9 </div>
<div style="display:none"> Gerrit-Change-Number: 19367 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>