<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11932">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts-trx: (n)ack PDCH DEACT only after TRX answered SETSLOT<br><br>Before this patch, PDCH DEACT was (n)acked to the BSC without taking<br>into account if TRX succeeded or failed to set the TS:<br><br>20181123044720655 DRLL <0002> rsl.c:2523 (bts=0,trx=0,ts=0,ss=0) Rx RLL DATA_REQ Abis -> LAPDm<br>20181123044720700 DRSL <0000> rsl.c:2805 (bts=0,trx=0,ts=6,pchan=TCH/F_PDCH as PDCH) ss=0 Rx RSL IPAC_PDCH_DEACT<br>20181123044720700 DRSL <0000> rsl.c:2205 (bts=0,trx=0,ts=6,pchan=TCH/F_PDCH as PDCH) Request to PDCH DEACT, but lchan is still active<br>20181123044720700 DRSL <0000> rsl.c:2131 (bts=0,trx=0,ts=6,ss=0) Tx PDCH DEACT NACK (cause = 0x0f)<br>20181123044720700 DPCU <0009> pcu_sock.c:124 Sending info<br>20181123044720700 DPCU <0009> pcu_sock.c:139 BTS is up<br>20181123044720700 DPCU <0009> pcu_sock.c:232 trx=0 ts=7: available (tsc=7 arfcn=868)<br>20181123044720703 DPCU <0009> pcu_sock.c:608 Deactivate request received: TRX=0 TX=6<br>20181123044720703 DL1C <0006> l1sap.c:1519 deactivating channel chan_nr=TCH/F on TS6 trx=0<br>20181123044720703 DTRX <000b> trx_if.c:242 Enqueuing TRX control command 'CMD NOHANDOVER 6 0'<br>20181123044720703 DL1C <0006> l1sap.c:648 deactivate confirm chan_nr=TCH/F on TS6 trx=0<br>20181123044720703 DRSL <0000> rsl.c:714 (bts=0,trx=0,ts=6,ss=0) not sending REL ACK<br>20181123044720703 DRSL <0000> rsl.c:2264 (bts=0,trx=0,ts=6,ss=0) PDCH DEACT operation: channel disconnected, will reconnect as TCH<br>20181123044720703 DL1C <0006> scheduler.c:593 Configuring multiframe with TCH/F+SACCH trx=0 ts=6<br>20181123044720703 DTRX <000b> trx_if.c:242 Enqueuing TRX control command 'CMD SETSLOT 6 1'<br>20181123044720703 DL1C <0006> l1_if.c:780 (bts=0,trx=0,ts=6) bts_model_ts_connect(as_pchan=TCH/F) success, calling cb_ts_connected()<br>20181123044720703 DRSL <0000> rsl.c:2339 (bts=0,trx=0,ts=6,ss=0) PDCH DEACT operation: timeslot connected as TCH/F<br>20181123044720703 DRSL <0000> rsl.c:2440 (bts=0,trx=0,ts=6,ss=0) TCH/F_PDCH switched to TCH/F mode (ts->flags == 0)<br>20181123044720703 DRSL <0000> rsl.c:2103 (bts=0,trx=0,ts=6,ss=0) Tx PDCH DEACT ACK<br>20181123044720704 DTRX <000b> trx_if.c:492 Response message: 'RSP NOHANDOVER 0 6'<br>20181123044720705 DTRX <000b> trx_if.c:492 Response message: 'RSP SETSLOT 0 6 1'<br><br>Change-Id: I888de761b65c3ea8bfe623fcf009f3b2b57c926c<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, 91 insertions(+), 21 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/32/11932/1</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 da1b554..6af25a6 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>@@ -58,6 +58,16 @@</span><br><span>      [GSM_PCHAN_UNKNOWN]             = 0,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static enum gsm_phys_chan_config transceiver_chan_type_2_pchan(uint8_t type)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < _GSM_PCHAN_MAX; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (transceiver_chan_types[i] == type)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return (enum gsm_phys_chan_config) i;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return GSM_PCHAN_UNKNOWN;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct trx_l1h *trx_l1h_alloc(void *tall_ctx, struct phy_instance *pinst)</span><br><span> {</span><br><span>     struct trx_l1h *l1h;</span><br><span>@@ -140,6 +150,36 @@</span><br><span>                             LID_SACCH, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void l1if_setslot_cb(struct trx_l1h *l1h, uint8_t tn, uint8_t type, 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%);">+      struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(120, 100%, 40%);">+    enum gsm_phys_chan_config pchan;</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%);">+  if (tn >= TRX_NR_TS) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DL1C, LOGL_ERROR, "transceiver (%s) SETSLOT invalid param TN\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    phy_instance_name(pinst));</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</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%);">+   if (type > 13) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DL1C, LOGL_ERROR, "transceiver (%s) SETSLOT invalid param TS_TYPE\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               phy_instance_name(pinst));</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</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%);">+   pchan = transceiver_chan_type_2_pchan(type);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ts = &trx->ts[tn];</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DL1C, LOGL_DEBUG, "%s l1if_setslot_cb(as_pchan=%s),"</span><br><span style="color: hsl(120, 100%, 40%);">+        " calling cb_ts_connected(rc=%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+        gsm_ts_name(ts), gsm_pchan_name(pchan), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+     cb_ts_connected(ts, 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%);">+</span><br><span> /*</span><br><span>  * transceiver provisioning</span><br><span>  */</span><br><span>@@ -196,7 +236,7 @@</span><br><span>                    if (l1h->config.slottype_valid[tn]</span><br><span>                         && !l1h->config.slottype_sent[tn]) {</span><br><span>                             trx_if_cmd_setslot(l1h, tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     l1h->config.slottype[tn]);</span><br><span style="color: hsl(120, 100%, 40%);">+                                 l1h->config.slottype[tn], l1if_setslot_cb);</span><br><span>                               l1h->config.slottype_sent[tn] = 1;</span><br><span>                        }</span><br><span>            }</span><br><span>@@ -775,8 +815,5 @@</span><br><span>      if (rc)</span><br><span>              cb_ts_connected(ts, rc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    LOGP(DL1C, LOGL_NOTICE, "%s bts_model_ts_connect(as_pchan=%s) success,"</span><br><span style="color: hsl(0, 100%, 40%);">-            " calling cb_ts_connected()\n",</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_ts_name(ts), gsm_pchan_name(as_pchan));</span><br><span style="color: hsl(0, 100%, 40%);">-        cb_ts_connected(ts, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* cb_ts_connected will be called in l1if_setslot_cb once we receive RSP SETSLOT */</span><br><span> }</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 abe6846..7c9f432 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>@@ -196,7 +196,7 @@</span><br><span>  *  The new ocommand will be added to the end of the control command</span><br><span>  *  queue.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static int trx_ctrl_cmd(struct trx_l1h *l1h, int critical, const char *cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_ctrl_cmd(struct trx_l1h *l1h, int critical, void *cb, const char *cmd,</span><br><span>       const char *fmt, ...)</span><br><span> {</span><br><span>   struct trx_ctrl_msg *tcm;</span><br><span>@@ -231,6 +231,7 @@</span><br><span>              tcm->params_len = 0;</span><br><span>      }</span><br><span>    tcm->critical = critical;</span><br><span style="color: hsl(120, 100%, 40%);">+  tcm->cb = cb;</span><br><span> </span><br><span>         /* Avoid adding consecutive duplicate messages, eg: two consecutive POWEROFF */</span><br><span>      if(pending)</span><br><span>@@ -255,7 +256,7 @@</span><br><span> {</span><br><span>       struct phy_instance *pinst = l1h->phy_inst;</span><br><span>       if (pinst->num == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         return trx_ctrl_cmd(l1h, 1, "POWEROFF", "");</span><br><span style="color: hsl(120, 100%, 40%);">+              return trx_ctrl_cmd(l1h, 1, NULL, "POWEROFF", "");</span><br><span>       else</span><br><span>                 return 0;</span><br><span> }</span><br><span>@@ -265,7 +266,7 @@</span><br><span> {</span><br><span>    struct phy_instance *pinst = l1h->phy_inst;</span><br><span>       if (pinst->num == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         return trx_ctrl_cmd(l1h, 1, "POWERON", "");</span><br><span style="color: hsl(120, 100%, 40%);">+               return trx_ctrl_cmd(l1h, 1, NULL, "POWERON", "");</span><br><span>        else</span><br><span>                 return 0;</span><br><span> }</span><br><span>@@ -277,7 +278,7 @@</span><br><span>         if (pinst->phy_link->u.osmotrx.use_legacy_setbsic)</span><br><span>             return 0;</span><br><span> </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(l1h, 1, NULL, "SETTSC", "%d", tsc);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETBSIC" command to TRX */</span><br><span>@@ -287,37 +288,37 @@</span><br><span>       if (!pinst->phy_link->u.osmotrx.use_legacy_setbsic)</span><br><span>            return 0;</span><br><span> </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(l1h, 1, NULL, "SETBSIC", "%d", bsic);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETRXGAIN" command to TRX */</span><br><span> int trx_if_cmd_setrxgain(struct trx_l1h *l1h, int db)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        return trx_ctrl_cmd(l1h, 0, "SETRXGAIN", "%d", db);</span><br><span style="color: hsl(120, 100%, 40%);">+       return trx_ctrl_cmd(l1h, 0, NULL, "SETRXGAIN", "%d", db);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETPOWER" command to TRX */</span><br><span> int trx_if_cmd_setpower(struct trx_l1h *l1h, int db)</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(l1h, 0, NULL, "SETPOWER", "%d", 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> int trx_if_cmd_setmaxdly(struct trx_l1h *l1h, int dly)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    return trx_ctrl_cmd(l1h, 0, "SETMAXDLY", "%d", dly);</span><br><span style="color: hsl(120, 100%, 40%);">+      return trx_ctrl_cmd(l1h, 0, NULL, "SETMAXDLY", "%d", dly);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETMAXDLYNB" command to TRX, i.e. maximum delay for normal bursts */</span><br><span> int trx_if_cmd_setmaxdlynb(struct trx_l1h *l1h, int dly)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    return trx_ctrl_cmd(l1h, 0, "SETMAXDLYNB", "%d", dly);</span><br><span style="color: hsl(120, 100%, 40%);">+    return trx_ctrl_cmd(l1h, 0, NULL, "SETMAXDLYNB", "%d", dly);</span><br><span> }</span><br><span> </span><br><span> /*! Send "SETSLOT" command to TRX: Configure Channel Combination for TS */</span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd_setslot_cb *cb)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   return trx_ctrl_cmd(l1h, 1, "SETSLOT", "%d %d", tn, type);</span><br><span style="color: hsl(120, 100%, 40%);">+        return trx_ctrl_cmd(l1h, 1, cb, "SETSLOT", "%d %d", tn, type);</span><br><span> }</span><br><span> </span><br><span> /*! Send "RXTUNE" command to TRX: Tune Receiver to given ARFCN */</span><br><span>@@ -336,7 +337,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, "RXTUNE", "%d", freq10 * 100);</span><br><span style="color: hsl(120, 100%, 40%);">+        return trx_ctrl_cmd(l1h, 1, NULL, "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>@@ -355,25 +356,26 @@</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(l1h, 1, NULL, "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> int trx_if_cmd_handover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      return trx_ctrl_cmd(l1h, 1, "HANDOVER", "%d %d", tn, ss);</span><br><span style="color: hsl(120, 100%, 40%);">+ return trx_ctrl_cmd(l1h, 1, NULL, "HANDOVER", "%d %d", tn, ss);</span><br><span> }</span><br><span> </span><br><span> /*! Send "NOHANDOVER" command to TRX: Disable handover RACH Detection on timeslot/sub-slot */</span><br><span> int trx_if_cmd_nohandover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  return trx_ctrl_cmd(l1h, 1, "NOHANDOVER", "%d %d", tn, ss);</span><br><span style="color: hsl(120, 100%, 40%);">+       return trx_ctrl_cmd(l1h, 1, NULL, "NOHANDOVER", "%d %d", tn, ss);</span><br><span> }</span><br><span> </span><br><span> struct trx_ctrl_rsp {</span><br><span>      char cmd[50];</span><br><span>        char params[100];</span><br><span>    int status;</span><br><span style="color: hsl(120, 100%, 40%);">+   void *cb;</span><br><span> };</span><br><span> </span><br><span> static int parse_rsp(const char *buf_in, size_t len_in, struct trx_ctrl_rsp *rsp)</span><br><span>@@ -437,6 +439,30 @@</span><br><span>      return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_ctrl_rx_rsp_setslot(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_setslot_cb *cb = (trx_if_cmd_setslot_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%);">+        unsigned int tn, ts_type;</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%);">+           LOGP(DTRX, LOGL_ERROR, "transceiver (%s) SETSLOT failed with status %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               phy_instance_name(pinst), rsp->status);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Since message was already validated against CMD we sent, we know format</span><br><span style="color: hsl(120, 100%, 40%);">+     * of params is: "<TN> <TS_TYPE>" */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (sscanf(rsp->params, "%u %u", &tn, &ts_type) < 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DTRX, LOGL_ERROR, "transceiver (%s) SETSLOT unable to parse params\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              phy_instance_name(pinst));</span><br><span style="color: hsl(120, 100%, 40%);">+               return -EINVAL;</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%);">+   if (cb)</span><br><span style="color: hsl(120, 100%, 40%);">+               cb(l1h, tn, ts_type, rsp->status);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return rsp->status == 0 ? 0 : -EINVAL;</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>@@ -459,6 +485,8 @@</span><br><span>                             phy_link_state_set(pinst->phy_link, PHY_LINK_SHUTDOWN);</span><br><span>                   return 5;</span><br><span>            }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (strcmp(rsp->cmd, "SETSLOT") == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return trx_ctrl_rx_rsp_setslot(l1h, rsp);</span><br><span>    }</span><br><span> </span><br><span>        if (rsp->status) {</span><br><span>@@ -526,6 +554,8 @@</span><br><span>          goto rsp_error;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rsp.cb = tcm->cb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       /* check for response code */</span><br><span>        rc = trx_ctrl_rx_rsp(l1h, &rsp, tcm->critical);</span><br><span>       if (rc == -EINVAL)</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 206f5e5..cdfbd41 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>@@ -12,8 +12,11 @@</span><br><span>     int                     cmd_len;</span><br><span>     int                     params_len;</span><br><span>  int                     critical;</span><br><span style="color: hsl(120, 100%, 40%);">+     void                    *cb;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+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%);">+</span><br><span> void trx_if_init(struct trx_l1h *l1h);</span><br><span> int trx_if_cmd_poweroff(struct trx_l1h *l1h);</span><br><span> int trx_if_cmd_poweron(struct trx_l1h *l1h);</span><br><span>@@ -23,7 +26,7 @@</span><br><span> int trx_if_cmd_setpower(struct trx_l1h *l1h, int db);</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 style="color: hsl(0, 100%, 40%);">-int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd_setslot_cb *cb);</span><br><span> int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn);</span><br><span> int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn);</span><br><span> int trx_if_cmd_handover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11932">change 11932</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/11932"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I888de761b65c3ea8bfe623fcf009f3b2b57c926c </div>
<div style="display:none"> Gerrit-Change-Number: 11932 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>