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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">om2k: Wait for OM TRX links to stabilize before trying to bring up TRX<br><br>The OM2K link "per-trx" only comes up after MCTR is setup. So that means<br>we need to wait for it before trying to boot the TRX itself.<br><br>He we simply apply a "dumb" 5 sec timeout as this is the most reliable<br>way I found to get this working reliably.<br><br>Tracking the link state proved difficult and unreliable:<br><br> - Multiple TRX can be present with their link coming up in random<br>   order.<br><br> - They can already be up at the start (BTS already initialized from<br>   a previous boot) and so the link may actually come up, down, and<br>   up again.<br><br> - All of theses transitions might happens before/after we get to the<br>   OM2K_BTS_S_WAIT_TRX state depending on how the LAPD timeout<br>   expire, if the BTS config was actually changed or not and how much<br>   time it takes to apply the new config.<br><br>So all in all, what we must do is wait for the link to stabilize ...<br>hence just waiting 5 second.<br><br>Signed-off-by: Sylvain Munaut <tnt@246tNt.com><br>Change-Id: I55a06e08b9c52ff6e97e8c72f2d55770809eba51<br>---<br>M src/osmo-bsc/abis_om2000.c<br>1 file changed, 31 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/abis_om2000.c b/src/osmo-bsc/abis_om2000.c</span><br><span>index ae36ff2..c696557 100644</span><br><span>--- a/src/osmo-bsc/abis_om2000.c</span><br><span>+++ b/src/osmo-bsc/abis_om2000.c</span><br><span>@@ -76,6 +76,7 @@</span><br><span> #define OM_HEADROOM_SIZE    128</span><br><span> </span><br><span> #define OM2K_TIMEOUT 10</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_LAPD_TIMEOUT 5</span><br><span> #define TRX_FSM_TIMEOUT       60</span><br><span> #define BTS_FSM_TIMEOUT   60</span><br><span> </span><br><span>@@ -2297,6 +2298,7 @@</span><br><span>       OM2K_BTS_EVT_CON_DONE,</span><br><span>       OM2K_BTS_EVT_TF_DONE,</span><br><span>        OM2K_BTS_EVT_MCTR_DONE,</span><br><span style="color: hsl(120, 100%, 40%);">+       OM2K_BTS_EVT_TRX_LAPD_UP,</span><br><span>    OM2K_BTS_EVT_TRX_DONE,</span><br><span>       OM2K_BTS_EVT_STOP,</span><br><span> };</span><br><span>@@ -2308,6 +2310,7 @@</span><br><span>     { OM2K_BTS_EVT_CON_DONE,        "CON-DONE" },</span><br><span>      { OM2K_BTS_EVT_TF_DONE,         "TF-DONE" },</span><br><span>       { OM2K_BTS_EVT_MCTR_DONE,       "MCTR-DONE" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { OM2K_BTS_EVT_TRX_LAPD_UP,     "TRX-LAPD-UP" },</span><br><span>   { OM2K_BTS_EVT_TRX_DONE,        "TRX-DONE" },</span><br><span>      { OM2K_BTS_EVT_STOP,            "STOP" },</span><br><span>  { 0, NULL }</span><br><span>@@ -2320,6 +2323,7 @@</span><br><span>  OM2K_BTS_S_WAIT_CON,</span><br><span>         OM2K_BTS_S_WAIT_TF,</span><br><span>  OM2K_BTS_S_WAIT_MCTR,</span><br><span style="color: hsl(120, 100%, 40%);">+ OM2K_BTS_S_WAIT_TRX_LAPD,</span><br><span>    OM2K_BTS_S_WAIT_TRX,</span><br><span>         OM2K_BTS_S_DONE,</span><br><span>     OM2K_BTS_S_ERROR,</span><br><span>@@ -2394,21 +2398,25 @@</span><br><span>          om2k_mo_fsm_start(fi, OM2K_BTS_EVT_MCTR_DONE, bts->c0,</span><br><span>                              &bts->rbs2000.mctr.om2k_mo);</span><br><span>        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        BTS_FSM_TIMEOUT, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-            obfp->next_trx_nr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               trx = gsm_bts_trx_num(obfp->bts, obfp->next_trx_nr++);</span><br><span style="color: hsl(0, 100%, 40%);">-            om2k_trx_fsm_start(fi, trx, OM2K_BTS_EVT_TRX_DONE);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX_LAPD,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 TRX_LAPD_TIMEOUT, 0);</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span> static void om2k_bts_s_wait_mctr(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(event == OM2K_BTS_EVT_MCTR_DONE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX_LAPD,</span><br><span style="color: hsl(120, 100%, 40%);">+                         TRX_LAPD_TIMEOUT, 0);</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%);">+static void om2k_bts_s_wait_trx_lapd(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span>    struct om2k_bts_fsm_priv *obfp = fi->priv;</span><br><span>        struct gsm_bts_trx *trx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(event == OM2K_BTS_EVT_MCTR_DONE);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(event == OM2K_BTS_EVT_TRX_LAPD_UP);</span><br><span> </span><br><span>  osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX,</span><br><span>                             BTS_FSM_TIMEOUT, 0);</span><br><span>@@ -2469,17 +2477,23 @@</span><br><span>               .in_event_mask = S(OM2K_BTS_EVT_IS_DONE),</span><br><span>            .out_state_mask = S(OM2K_BTS_S_ERROR) |</span><br><span>                                S(OM2K_BTS_S_WAIT_MCTR) |</span><br><span style="color: hsl(0, 100%, 40%);">-                               S(OM2K_BTS_S_WAIT_TRX),</span><br><span style="color: hsl(120, 100%, 40%);">+                               S(OM2K_BTS_S_WAIT_TRX_LAPD),</span><br><span>               .name = "WAIT-IS",</span><br><span>                 .action = om2k_bts_s_wait_is,</span><br><span>        },</span><br><span>   [OM2K_BTS_S_WAIT_MCTR] = {</span><br><span>           .in_event_mask = S(OM2K_BTS_EVT_MCTR_DONE),</span><br><span>          .out_state_mask = S(OM2K_BTS_S_ERROR) |</span><br><span style="color: hsl(0, 100%, 40%);">-                           S(OM2K_BTS_S_WAIT_TRX),</span><br><span style="color: hsl(120, 100%, 40%);">+                               S(OM2K_BTS_S_WAIT_TRX_LAPD),</span><br><span>               .name = "WAIT-MCTR",</span><br><span>               .action = om2k_bts_s_wait_mctr,</span><br><span>      },</span><br><span style="color: hsl(120, 100%, 40%);">+    [OM2K_BTS_S_WAIT_TRX_LAPD] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .in_event_mask = S(OM2K_BTS_EVT_TRX_LAPD_UP),</span><br><span style="color: hsl(120, 100%, 40%);">+         .out_state_mask = S(OM2K_BTS_S_WAIT_TRX),</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "WAIT-TRX-LAPD",</span><br><span style="color: hsl(120, 100%, 40%);">+            .action = om2k_bts_s_wait_trx_lapd,</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span>   [OM2K_BTS_S_WAIT_TRX] = {</span><br><span>            .in_event_mask = S(OM2K_BTS_EVT_TRX_DONE),</span><br><span>           .out_state_mask = S(OM2K_BTS_S_ERROR) |</span><br><span>@@ -2498,7 +2512,14 @@</span><br><span> </span><br><span> static int om2k_bts_timer_cb(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_ERROR, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (fi->state) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case OM2K_BTS_S_WAIT_TRX_LAPD:</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_fsm_inst_dispatch(fi, OM2K_BTS_EVT_TRX_LAPD_UP, NULL);</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_fsm_inst_state_chg(fi, OM2K_BTS_S_ERROR, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18126">change 18126</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-bsc/+/18126"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I55a06e08b9c52ff6e97e8c72f2d55770809eba51 </div>
<div style="display:none"> Gerrit-Change-Number: 18126 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: tnt <tnt@246tNt.com> </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: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>