Review at  https://gerrit.osmocom.org/6694

host/trxcon: handle ccch_mode from L1CTL_FBSB_REQ

Previously, the content of L1CTL_FBSB_REQ message was only used
to obtain a new ARFCN and retune transceiver. Now, since we have
working TDMA scheduler, some other params (like ccch_mode) may be
used too.

Change-Id: Iccabba376d67e091b55a604a2ae87f2aa86362e5
---
M src/host/trxcon/l1ctl.c
M src/host/trxcon/trxcon.c
2 files changed, 42 insertions(+), 7 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/94/6694/1

diff --git a/src/host/trxcon/l1ctl.c b/src/host/trxcon/l1ctl.c
index 26670f1..0bb26f7 100644
--- a/src/host/trxcon/l1ctl.c
+++ b/src/host/trxcon/l1ctl.c
@@ -125,7 +125,7 @@
 
 static int l1ctl_rx_fbsb_req(struct l1ctl_link *l1l, struct msgb *msg)
 {
-       struct l1ctl_fbsb_req *fbsb;
+       struct l1ctl_fbsb_req *fbsb, *fbsb_copy;
        uint16_t band_arfcn;
        int rc = 0;
 
@@ -143,8 +143,19 @@
                gsm_band_name(gsm_arfcn2band(band_arfcn)),
                band_arfcn &~ ARFCN_FLAG_MASK);
 
-       osmo_fsm_inst_dispatch(trxcon_fsm,
-               L1CTL_EVENT_FBSB_REQ, &band_arfcn);
+       /**
+        * We cannot simply pass a pointer to fbsb,
+        * because the memory will be freed.
+        *
+        * TODO: better solution?
+        */
+       fbsb_copy = talloc_memdup(l1l, fbsb, sizeof(struct l1ctl_fbsb_req));
+       if (fbsb_copy == NULL) {
+               rc = -EINVAL;
+               goto exit;
+       }
+
+       osmo_fsm_inst_dispatch(trxcon_fsm, L1CTL_EVENT_FBSB_REQ, fbsb_copy);
 
 exit:
        msgb_free(msg);
diff --git a/src/host/trxcon/trxcon.c b/src/host/trxcon/trxcon.c
index d88e990..6f50d1a 100644
--- a/src/host/trxcon/trxcon.c
+++ b/src/host/trxcon/trxcon.c
@@ -29,6 +29,8 @@
 #include <unistd.h>
 #include <signal.h>
 
+#include <arpa/inet.h>
+
 #include <osmocom/core/fsm.h>
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/talloc.h>
@@ -72,6 +74,31 @@
 void *tall_trx_ctx = NULL;
 struct osmo_fsm_inst *trxcon_fsm;
 
+static void trxcon_handle_fbsb_req(struct l1ctl_fbsb_req *req)
+{
+       uint16_t band_arfcn;
+
+       /* Reset L1 */
+       sched_trx_reset(app_data.trx);
+
+       /* Configure a single timeslot */
+       if (req->ccch_mode == CCCH_MODE_COMBINED)
+               sched_trx_configure_ts(app_data.trx, 0, GSM_PCHAN_CCCH_SDCCH4);
+       else
+               sched_trx_configure_ts(app_data.trx, 0, GSM_PCHAN_CCCH);
+
+       /* Store current ARFCN */
+       band_arfcn = ntohs(req->band_arfcn);
+       app_data.trx->band_arfcn = band_arfcn;
+
+       /* Tune transceiver to required ARFCN */
+       trx_if_cmd_rxtune(app_data.trx, band_arfcn);
+       trx_if_cmd_txtune(app_data.trx, band_arfcn);
+       trx_if_cmd_poweron(app_data.trx);
+
+       talloc_free(req);
+}
+
 static void trxcon_fsm_idle_action(struct osmo_fsm_inst *fi,
        uint32_t event, void *data)
 {
@@ -101,10 +128,7 @@
                l1ctl_tx_reset_conf(app_data.l1l, L1CTL_RES_T_BOOT);
                break;
        case L1CTL_EVENT_FBSB_REQ:
-               app_data.trx->band_arfcn = *((uint16_t *) data);
-               trx_if_cmd_rxtune(app_data.trx, app_data.trx->band_arfcn);
-               trx_if_cmd_txtune(app_data.trx, app_data.trx->band_arfcn);
-               trx_if_cmd_poweron(app_data.trx);
+               trxcon_handle_fbsb_req((struct l1ctl_fbsb_req *) data);
                break;
        case TRX_EVENT_RSP_ERROR:
        case TRX_EVENT_OFFLINE:

-- 
To view, visit https://gerrit.osmocom.org/6694
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iccabba376d67e091b55a604a2ae87f2aa86362e5
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>

Reply via email to