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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts-trx: Use TRXC RFMUTE instead of resetting the scheduler<br><br>Since commit 221ee92551a3d34c4f61e99e5bf4aa718c4d6f88,<br>bts_model_trx_deact_rf() was being called when RF locking the TRX, which<br>was implemented by resetting the scheduler. This proved to be a messy<br>and wrong way to emulate disabling RF, since it modifies tate on lots of<br>structures from which it is later difficult to recover from, causing<br>bugs and issues like:<br>82a35a1dbff849ecf16b7c70de4c1c7786704b2e<br>be15a12c87983ef07fb133fedea4ef18d2213bc6<br>eef420d1ca2144682d3de3f4e5cc4a7458276a03<br>https://osmocom.org/issues/4694<br>https://osmocom.org/issues/4695<br>https://osmocom.org/issues/4696<br>https://osmocom.org/issues/4697<br><br>So for all these reasons, it is believed a good solution to avoid<br>resetting the scheduler and simply ask lower layers (osmo-trx) to take<br>care of disabling RF TX/RX on a given TRX. For TRX implementations not<br>supporting the newly added RFMUTE command, ramping down to -10dBm still<br>provides for a way to emulate RF locking. In any case, none of this was<br>supported until recently so it's not like we are breaking some feature<br>here.<br><br>Related: SYS#4920<br>Change-Id: I1423ddb390ef327ec7d4a27de2ac5dca663773a5<br>---<br>M src/osmo-bts-trx/l1_if.c<br>M src/osmo-bts-trx/trx_if.c<br>M src/osmo-bts-trx/trx_if.h<br>3 files changed, 19 insertions(+), 40 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c</span><br><span>index 430d97e..bc0df2b 100644</span><br><span>--- a/src/osmo-bts-trx/l1_if.c</span><br><span>+++ b/src/osmo-bts-trx/l1_if.c</span><br><span>@@ -215,18 +215,8 @@</span><br><span> {</span><br><span>        struct phy_instance *pinst = trx_phy_instance(trx);</span><br><span>  struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span style="color: hsl(0, 100%, 40%);">-  enum gsm_phys_chan_config pchan = trx->ts[0].pchan;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* close all logical channels and reset timeslots */</span><br><span style="color: hsl(0, 100%, 40%);">-    trx_sched_reset(&l1h->l1s);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* deactivate lchan for CCCH */</span><br><span style="color: hsl(0, 100%, 40%);">- if (pchan == GSM_PCHAN_CCCH || pchan == GSM_PCHAN_CCCH_SDCCH4 ||</span><br><span style="color: hsl(0, 100%, 40%);">-            pchan == GSM_PCHAN_CCCH_SDCCH4_CBCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-              lchan_set_state(&trx->ts[0].lchan[CCCH_LCHAN], LCHAN_S_INACTIVE);</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 style="color: hsl(120, 100%, 40%);">+     return trx_if_cmd_rfmute(l1h, true);</span><br><span> }</span><br><span> </span><br><span> /* deactivate transceiver */</span><br><span>@@ -651,12 +641,14 @@</span><br><span> {</span><br><span>   struct gsm_bts_trx *trx;</span><br><span>     struct phy_instance *pinst;</span><br><span style="color: hsl(0, 100%, 40%);">-     int i, rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct trx_l1h *l1h;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc = 0;</span><br><span> </span><br><span>      switch (mo->obj_class) {</span><br><span>  case NM_OC_RADIO_CARRIER:</span><br><span>            trx = (struct gsm_bts_trx *) obj;</span><br><span>            pinst = trx_phy_instance(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+                l1h = pinst->u.osmotrx.hdl;</span><br><span> </span><br><span>           /* Begin to ramp the power if TRX is already running. Otherwise</span><br><span>               * skip, power ramping will be started after TRX is running */</span><br><span>@@ -670,20 +662,18 @@</span><br><span>                       if (mo->nm_state.administrative == NM_STATE_LOCKED &&</span><br><span>                         adm_state == NM_STATE_UNLOCKED) {</span><br><span>                                /* Previous change was UNLOCKED->LOCKED, so we</span><br><span style="color: hsl(0, 100%, 40%);">-                                * were ramping down and we didn't deactivate</span><br><span style="color: hsl(120, 100%, 40%);">+                              * were ramping down and we didn't mute RF</span><br><span>                                * yet, so now simply skip old ramp down compl</span><br><span style="color: hsl(0, 100%, 40%);">-                           * cb, skip TS activation and go for ramp up</span><br><span style="color: hsl(120, 100%, 40%);">+                           * cb, skip RF unmute and go for ramp up</span><br><span>                              * directly. */</span><br><span>                              goto ramp_up;</span><br><span>                        } else if (mo->nm_state.administrative == NM_STATE_UNLOCKED &&</span><br><span>                        adm_state == NM_STATE_LOCKED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             /* Previous change was LOCKED->UNLOCKED, which</span><br><span style="color: hsl(0, 100%, 40%);">-                                * means TS were also enabled during start of</span><br><span style="color: hsl(0, 100%, 40%);">-                            * ramping up. So we simply need to skip</span><br><span style="color: hsl(0, 100%, 40%);">-                                 * ramping up and start ramping down instead,</span><br><span style="color: hsl(0, 100%, 40%);">-                            * disabling TS at the end as usual. Fall</span><br><span style="color: hsl(0, 100%, 40%);">-                                * through usual procedure below.</span><br><span style="color: hsl(0, 100%, 40%);">-                                */</span><br><span style="color: hsl(120, 100%, 40%);">+                           /* Previous change was LOCKED->UNLOCKED, so we</span><br><span style="color: hsl(120, 100%, 40%);">+                              * simply need to skip ramping up and start</span><br><span style="color: hsl(120, 100%, 40%);">+                            * ramping down instead, muting RF at the</span><br><span style="color: hsl(120, 100%, 40%);">+                              * end as usual. Fall through usual procedure</span><br><span style="color: hsl(120, 100%, 40%);">+                          * below. */</span><br><span>                         } else if (mo->nm_state.administrative == adm_state) {</span><br><span>                            OSMO_ASSERT(0);</span><br><span>                      }</span><br><span>@@ -695,25 +685,7 @@</span><br><span>                     break;</span><br><span>               case NM_STATE_UNLOCKED:</span><br><span>                      mo->procedure_pending = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Activate timeslots in scheduler and start power ramp up */</span><br><span style="color: hsl(0, 100%, 40%);">-                   for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(0, 100%, 40%);">-                         if (ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                       /* dyn.pchan_is is set to GSM_PCHAN_NONE when</span><br><span style="color: hsl(0, 100%, 40%);">-                                    * internally deactivated during locking. Simply</span><br><span style="color: hsl(0, 100%, 40%);">-                                         * internally restore the old status here.</span><br><span style="color: hsl(0, 100%, 40%);">-                                       */</span><br><span style="color: hsl(0, 100%, 40%);">-                                     ts->dyn.pchan_is = ts->dyn.pchan_want;</span><br><span style="color: hsl(0, 100%, 40%);">-                            } else if (ts->pchan == GSM_PCHAN_TCH_F_PDCH && ts->flags & TS_F_PDCH_PENDING_MASK) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 /* TS configuration already in progress,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         * waiting for PCU response, let it be</span><br><span style="color: hsl(0, 100%, 40%);">-                                   * de/activated later by PCU ACT CNF as a</span><br><span style="color: hsl(0, 100%, 40%);">-                                        * response to pcu_tx_info_ind()</span><br><span style="color: hsl(0, 100%, 40%);">-                                         */</span><br><span style="color: hsl(0, 100%, 40%);">-                                     continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                               trx_set_ts(ts);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     trx_if_cmd_rfmute(l1h, false);</span><br><span> ramp_up:</span><br><span>                   rc = l1if_trx_start_power_ramp(trx, bts_model_chg_adm_state_ramp_compl_cb);</span><br><span>                  if (rc == 0) {</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 875487a..05167ca 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>@@ -376,6 +376,12 @@</span><br><span>       return trx_ctrl_cmd(l1h, 1, "NOHANDOVER", "%d %d", tn, ss);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Send "RFMUTE" command to TRX: Mute or Unmute RF transmission */</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_rfmute(struct trx_l1h *l1h, bool mute)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return trx_ctrl_cmd(l1h, 0, "RFMUTE", mute ? "1" : "0");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct trx_ctrl_rsp {</span><br><span>         char cmd[50];</span><br><span>        char params[100];</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 6b417cf..17bc7db 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>@@ -35,6 +35,7 @@</span><br><span> int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb);</span><br><span> int trx_if_cmd_handover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss);</span><br><span> int trx_if_cmd_nohandover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_rfmute(struct trx_l1h *l1h, bool mute);</span><br><span> int trx_if_send_burst(struct trx_l1h *l1h, const struct trx_dl_burst_req *br);</span><br><span> int trx_if_powered(struct trx_l1h *l1h);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/19827">change 19827</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/+/19827"/><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: I1423ddb390ef327ec7d4a27de2ac5dca663773a5 </div>
<div style="display:none"> Gerrit-Change-Number: 19827 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>