<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>