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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts-trx: Implement power ramping during BTS bring up<br><br>The nominal transmit power is still only configurable manually from<br>osmo-bts-trx VTY interface. Support to retrieve the nominal power<br>from osmo-trx will come later.<br><br>Change-Id: Ia7c353e4c199e0fc3bcab55c45a4abda2c66d2c1<br>---<br>M include/osmo-bts/tx_power.h<br>M src/osmo-bts-trx/l1_if.c<br>M src/osmo-bts-trx/l1_if.h<br>M src/osmo-bts-trx/main.c<br>M src/osmo-bts-trx/trx_if.c<br>M src/osmo-bts-trx/trx_if.h<br>M src/osmo-bts-trx/trx_vty.c<br>7 files changed, 73 insertions(+), 73 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/tx_power.h b/include/osmo-bts/tx_power.h</span><br><span>index 21887c7..10129eb 100644</span><br><span>--- a/include/osmo-bts/tx_power.h</span><br><span>+++ b/include/osmo-bts/tx_power.h</span><br><span>@@ -65,6 +65,8 @@</span><br><span> int get_p_target_mdBm(struct gsm_bts_trx *trx, uint8_t bs_power_ie);</span><br><span> int get_p_target_mdBm_lchan(struct gsm_lchan *lchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int get_p_actual_mdBm(struct gsm_bts_trx *trx, int p_target_mdBm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int get_p_trxout_target_mdBm(struct gsm_bts_trx *trx, uint8_t bs_power_ie);</span><br><span> int get_p_trxout_target_mdBm_lchan(struct gsm_lchan *lchan);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c</span><br><span>index b67d8fa..ff8e293 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>@@ -177,6 +177,15 @@</span><br><span>            if (rc == 0 && pinst->phy_link->state != PHY_LINK_CONNECTED) {</span><br><span>                         trx_sched_clock_started(pinst->trx->bts);</span><br><span>                      phy_link_state_set(pinst->phy_link, PHY_LINK_CONNECTED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Begin to ramp up the power on all TRX associated with this phy */</span><br><span style="color: hsl(120, 100%, 40%);">+                  llist_for_each_entry(pinst, &plink->instances, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         struct gsm_bts_trx *trx = pinst->trx;</span><br><span style="color: hsl(120, 100%, 40%);">+                              if (l1h->config.forced_max_power_red == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                                        power_ramp_start(trx, get_p_nominal_mdBm(trx), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                            else</span><br><span style="color: hsl(120, 100%, 40%);">+                                  power_ramp_start(trx, get_p_max_out_mdBm(trx) - to_mdB(l1h->config.forced_max_power_red), 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span>            } else if (rc != 0 && pinst->phy_link->state != PHY_LINK_SHUTDOWN) {</span><br><span>                   trx_sched_clock_stopped(pinst->trx->bts);</span><br><span>                      phy_link_state_set(pinst->phy_link, PHY_LINK_SHUTDOWN);</span><br><span>@@ -184,6 +193,16 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void l1if_setpower_cb(struct trx_l1h *l1h, int power_att_db, int rc)</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%);">+        struct gsm_bts_trx *trx = pinst->trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGPPHI(pinst, DL1C, LOGL_DEBUG, "l1if_setpower_cb(power_att_db=%d, rc=%d)\n", power_att_db, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ power_trx_change_compl(trx, get_p_max_out_mdBm(trx) - to_mdB(power_att_db));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * transceiver provisioning</span><br><span>  */</span><br><span>@@ -249,10 +268,6 @@</span><br><span>                         trx_if_cmd_setrxgain(l1h, l1h->config.rxgain);</span><br><span>                    l1h->config.rxgain_sent = 1;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (l1h->config.power_valid && !l1h->config.power_sent) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 trx_if_cmd_setpower(l1h, l1h->config.power);</span><br><span style="color: hsl(0, 100%, 40%);">-                 l1h->config.power_sent = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span>            if (l1h->config.maxdly_valid && !l1h->config.maxdly_sent) {</span><br><span>                    trx_if_cmd_setmaxdly(l1h, l1h->config.maxdly);</span><br><span>                    l1h->config.maxdly_sent = 1;</span><br><span>@@ -279,7 +294,6 @@</span><br><span>                        plink->u.osmotrx.poweronoff_sent = true;</span><br><span>          }</span><br><span>            l1h->config.rxgain_sent = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         l1h->config.power_sent = 0;</span><br><span>               l1h->config.maxdly_sent = 0;</span><br><span>              l1h->config.maxdlynb_sent = 0;</span><br><span>            for (tn = 0; tn < TRX_NR_TS; tn++)</span><br><span>@@ -304,7 +318,6 @@</span><br><span>          l1h->config.tsc_sent = 0;</span><br><span>                 l1h->config.bsic_sent = 0;</span><br><span>                l1h->config.rxgain_sent = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         l1h->config.power_sent = 0;</span><br><span>               l1h->config.maxdly_sent = 0;</span><br><span>              l1h->config.maxdlynb_sent = 0;</span><br><span>            for (tn = 0; tn < TRX_NR_TS; tn++)</span><br><span>@@ -408,6 +421,7 @@</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(120, 100%, 40%);">+        struct phy_link *plink = pinst->phy_link;</span><br><span>         uint16_t arfcn = trx->arfcn;</span><br><span> </span><br><span>  if (l1h->config.arfcn != arfcn || !l1h->config.arfcn_valid) {</span><br><span>@@ -417,12 +431,11 @@</span><br><span>          l1if_provision_transceiver_trx(l1h);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (l1h->config.power_oml) {</span><br><span style="color: hsl(0, 100%, 40%);">-         l1h->config.power = trx->max_power_red;</span><br><span style="color: hsl(0, 100%, 40%);">-           l1h->config.power_valid = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         l1h->config.power_sent = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          l1if_provision_transceiver_trx(l1h);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Begin to ramp up the power if power reduction is set by OML and TRX</span><br><span style="color: hsl(120, 100%, 40%);">+           is already running. Otherwise skip, power ramping will be started</span><br><span style="color: hsl(120, 100%, 40%);">+     after TRX is running */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (plink->u.osmotrx.powered && l1h->config.forced_max_power_red == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+         power_ramp_start(pinst->trx, get_p_nominal_mdBm(pinst->trx), 0);</span><br><span> </span><br><span>   return 0;</span><br><span> }</span><br><span>@@ -802,9 +815,10 @@</span><br><span> </span><br><span> int bts_model_change_power(struct gsm_bts_trx *trx, int p_trxout_mdBm)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-#warning "implement bts_model_change_power\n"</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DL1C, LOGL_NOTICE, "Setting TRX output power not supported!\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct phy_instance *pinst = trx_phy_instance(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span style="color: hsl(120, 100%, 40%);">+        int power_att = (get_p_max_out_mdBm(trx) - p_trxout_mdBm) / 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+     return trx_if_cmd_setpower(l1h, power_att, l1if_setpower_cb);</span><br><span> }</span><br><span> </span><br><span> int bts_model_ts_disconnect(struct gsm_bts_trx_ts *ts)</span><br><span>diff --git a/src/osmo-bts-trx/l1_if.h b/src/osmo-bts-trx/l1_if.h</span><br><span>index 42452d2..46f2c18 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>@@ -73,10 +73,7 @@</span><br><span>   uint8_t                 rxgain;</span><br><span>      int                     rxgain_sent;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        int                     power_valid;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t                 power;</span><br><span style="color: hsl(0, 100%, 40%);">-  int                     power_oml;</span><br><span style="color: hsl(0, 100%, 40%);">-      int                     power_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+   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> </span><br><span>diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c</span><br><span>index bd3d0cb..8fb67d2 100644</span><br><span>--- a/src/osmo-bts-trx/main.c</span><br><span>+++ b/src/osmo-bts-trx/main.c</span><br><span>@@ -129,6 +129,7 @@</span><br><span> </span><br><span> int bts_model_trx_init(struct gsm_bts_trx *trx)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  trx->power_params.trx_p_max_out_mdBm = to_mdB(trx->bts->c0->nominal_power);</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -150,7 +151,7 @@</span><br><span>     l1h = trx_l1h_alloc(tall_bts_ctx, pinst);</span><br><span>    pinst->u.osmotrx.hdl = l1h;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      l1h->config.power_oml = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ l1h->config.forced_max_power_red = -1;</span><br><span> }</span><br><span> </span><br><span> int main(int argc, char **argv)</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 24d6b9b..5e3bf91 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>@@ -303,9 +303,9 @@</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETPOWER" command to TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setpower(struct trx_l1h *l1h, int db)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setpower(struct trx_l1h *l1h, int power_att_db, trx_if_cmd_setpower_cb *cb)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   return trx_ctrl_cmd(l1h, 0, "SETPOWER", "%d", db);</span><br><span style="color: hsl(120, 100%, 40%);">+        return trx_ctrl_cmd_cb(l1h, 0, cb, "SETPOWER", "%d", power_att_db);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETMAXDLY" command to TRX, i.e. maximum delay for RACH bursts */</span><br><span>@@ -544,6 +544,22 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_ctrl_rx_rsp_setpower(struct trx_l1h *l1h, struct trx_ctrl_rsp *rsp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     trx_if_cmd_setpower_cb *cb = (trx_if_cmd_setpower_cb*) rsp->cb;</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%);">+        int power_att;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rsp->status)</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPPHI(pinst, DTRX, LOGL_ERROR, "transceiver SETPOWER failed with status %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    rsp->status);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+             sscanf(rsp->params, "%d", &power_att);</span><br><span style="color: hsl(120, 100%, 40%);">+               cb(l1h, power_att, rsp->status);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* -EINVAL: unrecoverable error, exit BTS</span><br><span>  * N > 0: try sending originating command again after N seconds</span><br><span>  * 0: Done with response, get originating command out from send queue</span><br><span>@@ -562,6 +578,8 @@</span><br><span>      * so that's why we should use tcm instead of rsp. */</span><br><span>    } else if (strcmp(tcm->cmd, "SETFORMAT") == 0) {</span><br><span>                return trx_ctrl_rx_rsp_setformat(l1h, rsp);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (strcmp(tcm->cmd, "SETPOWER") == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return trx_ctrl_rx_rsp_setpower(l1h, rsp);</span><br><span>   }</span><br><span> </span><br><span>        if (rsp->status) {</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 fd0077d..0630eb6 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>@@ -15,6 +15,7 @@</span><br><span> </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 style="color: hsl(120, 100%, 40%);">+typedef void trx_if_cmd_setpower_cb(struct trx_l1h *l1h, int power_att_db, int rc);</span><br><span> </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>@@ -22,7 +23,7 @@</span><br><span> int trx_if_cmd_settsc(struct trx_l1h *l1h, uint8_t tsc);</span><br><span> int trx_if_cmd_setbsic(struct trx_l1h *l1h, uint8_t bsic);</span><br><span> int trx_if_cmd_setrxgain(struct trx_l1h *l1h, int db);</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setpower(struct trx_l1h *l1h, int db);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setpower(struct trx_l1h *l1h, int power_att_db, trx_if_cmd_setpower_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>diff --git a/src/osmo-bts-trx/trx_vty.c b/src/osmo-bts-trx/trx_vty.c</span><br><span>index 6dddfe2..b920c57 100644</span><br><span>--- a/src/osmo-bts-trx/trx_vty.c</span><br><span>+++ b/src/osmo-bts-trx/trx_vty.c</span><br><span>@@ -97,6 +97,7 @@</span><br><span> {</span><br><span>  uint8_t tn;</span><br><span>  struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts_trx *trx = pinst->trx;</span><br><span> </span><br><span>         vty_out(vty, "PHY Instance %s%s",</span><br><span>          phy_instance_name(pinst), VTY_NEWLINE);</span><br><span>@@ -106,11 +107,9 @@</span><br><span>                       l1h->config.rxgain, VTY_NEWLINE);</span><br><span>         else</span><br><span>                 vty_out(vty, " rx-gain        : undefined%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (l1h->config.power_valid)</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, " tx-attenuation : %d dB%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                     l1h->config.power, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     else</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, " tx-attenuation : undefined%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " tx-attenuation : %d dB%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           (get_p_max_out_mdBm(trx) - get_p_actual_mdBm(trx, trx->power_params.p_total_tgt_mdBm))/1000,</span><br><span style="color: hsl(120, 100%, 40%);">+               VTY_NEWLINE);</span><br><span>        if (l1h->config.maxdly_valid)</span><br><span>             vty_out(vty, " maxdly : %d%s", l1h->config.maxdly,</span><br><span>                      VTY_NEWLINE);</span><br><span>@@ -171,6 +170,7 @@</span><br><span>  int val = atoi(argv[0]);</span><br><span> </span><br><span>         trx->nominal_power = val;</span><br><span style="color: hsl(120, 100%, 40%);">+  trx->power_params.trx_p_max_out_mdBm = to_mdB(trx->nominal_power);</span><br><span>     l1h->config.nominal_power_set_by_vty = true;</span><br><span> </span><br><span>  return CMD_SUCCESS;</span><br><span>@@ -361,36 +361,19 @@</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_phyinst_tx_atten, cfg_phyinst_tx_atten_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-   "osmotrx tx-attenuation <0-50>",</span><br><span style="color: hsl(120, 100%, 40%);">+      "osmotrx tx-attenuation (oml|<0-50>)",</span><br><span>       OSMOTRX_STR</span><br><span>  "Set the transmitter attenuation\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "Fixed attenuation in dB, overriding OML\n")</span><br><span style="color: hsl(120, 100%, 40%);">+        "Use NM_ATT_RF_MAXPOWR_R (max power reduction) from BSC via OML (default)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Fixed attenuation in dB, overriding OML (default)\n")</span><br><span> {</span><br><span>        struct phy_instance *pinst = vty->index;</span><br><span>  struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      l1h->config.power = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-   l1h->config.power_oml = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   l1h->config.power_valid = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.power_sent = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  l1if_provision_transceiver_trx(l1h);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return CMD_SUCCESS;</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%);">-DEFUN(cfg_phyinst_tx_atten_oml, cfg_phyinst_tx_atten_oml_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-       "osmotrx tx-attenuation oml",</span><br><span style="color: hsl(0, 100%, 40%);">- OSMOTRX_STR</span><br><span style="color: hsl(0, 100%, 40%);">-     "Set the transmitter attenuation\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "Use NM_ATT_RF_MAXPOWR_R (max power reduction) from BSC via OML\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct phy_instance *pinst = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  l1h->config.power_oml = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-   l1h->config.power_valid = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- l1h->config.power_sent = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  l1if_provision_transceiver_trx(l1h);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (strcmp(argv[0], "oml") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            l1h->config.forced_max_power_red = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          l1h->config.forced_max_power_red = atoi(argv[0]);</span><br><span> </span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -407,18 +390,6 @@</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_phyinst_no_tx_atten, cfg_phyinst_no_tx_atten_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "no osmotrx tx-attenuation",</span><br><span style="color: hsl(0, 100%, 40%);">-  NO_STR OSMOTRX_STR "Unset the transmitter attenuation\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct phy_instance *pinst = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct trx_l1h *l1h = pinst->u.osmotrx.hdl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  l1h->config.power_valid = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> DEFUN(cfg_phyinst_no_maxdly, cfg_phyinst_no_maxdly_cmd,</span><br><span>      "no osmotrx maxdly",</span><br><span>       NO_STR OSMOTRX_STR</span><br><span>@@ -574,13 +545,11 @@</span><br><span>   if (l1h->config.rxgain_valid)</span><br><span>             vty_out(vty, "  osmotrx rx-gain %d%s",</span><br><span>                     l1h->config.rxgain, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (l1h->config.power_valid) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (l1h->config.power_oml)</span><br><span style="color: hsl(0, 100%, 40%);">-                   vty_out(vty, "  osmotrx tx-attenuation oml%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-                    vty_out(vty, "  osmotrx tx-attenuation %d%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                         l1h->config.power, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (l1h->config.forced_max_power_red == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "  osmotrx tx-attenuation oml%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "  osmotrx tx-attenuation %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       l1h->config.forced_max_power_red, VTY_NEWLINE);</span><br><span>   if (l1h->config.maxdly_valid)</span><br><span>             vty_out(vty, "  osmotrx maxdly %d%s", l1h->config.maxdly, VTY_NEWLINE);</span><br><span>         if (l1h->config.maxdlynb_valid)</span><br><span>@@ -637,9 +606,7 @@</span><br><span> </span><br><span>         install_element(PHY_INST_NODE, &cfg_phyinst_rxgain_cmd);</span><br><span>         install_element(PHY_INST_NODE, &cfg_phyinst_tx_atten_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-  install_element(PHY_INST_NODE, &cfg_phyinst_tx_atten_oml_cmd);</span><br><span>   install_element(PHY_INST_NODE, &cfg_phyinst_no_rxgain_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(PHY_INST_NODE, &cfg_phyinst_no_tx_atten_cmd);</span><br><span>    install_element(PHY_INST_NODE, &cfg_phyinst_slotmask_cmd);</span><br><span>       install_element(PHY_INST_NODE, &cfg_phyinst_power_on_cmd);</span><br><span>       install_element(PHY_INST_NODE, &cfg_phyinst_maxdly_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18488">change 18488</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/+/18488"/><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: Ia7c353e4c199e0fc3bcab55c45a4abda2c66d2c1 </div>
<div style="display:none"> Gerrit-Change-Number: 18488 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </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: daniel <dwillmann@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-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>