pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmocom-bb/+/33905 )


Change subject: layer23: modem: Delay using cell until fully synced to it
......................................................................

layer23: modem: Delay using cell until fully synced to it

Change-Id: If306d82879281bb540c5cdee2eaf354858c8d24b
---
M src/host/layer23/include/osmocom/bb/modem/modem.h
M src/host/layer23/src/modem/app_modem.c
M src/host/layer23/src/modem/grr.c
3 files changed, 51 insertions(+), 4 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/05/33905/1

diff --git a/src/host/layer23/include/osmocom/bb/modem/modem.h 
b/src/host/layer23/include/osmocom/bb/modem/modem.h
index 29d2571..7135bf7 100644
--- a/src/host/layer23/include/osmocom/bb/modem/modem.h
+++ b/src/host/layer23/include/osmocom/bb/modem/modem.h
@@ -4,6 +4,7 @@

 int modem_start(void);
 int modem_gprs_attach_if_needed(struct osmocom_ms *ms);
+int modem_sync_to_cell(struct osmocom_ms *ms);

 enum modem_state {
        MODEM_ST_IDLE,
diff --git a/src/host/layer23/src/modem/app_modem.c 
b/src/host/layer23/src/modem/app_modem.c
index 6871384..08a1260 100644
--- a/src/host/layer23/src/modem/app_modem.c
+++ b/src/host/layer23/src/modem/app_modem.c
@@ -165,17 +165,38 @@
        return 0;
 }

+int modem_sync_to_cell(struct osmocom_ms *ms)
+{
+       struct gsm322_cellsel *cs = &ms->cellsel;
+
+       if (cs->sync_pending) {
+               LOGP(DCS, LOGL_INFO, "Sync to ARFCN=%s, but there is a sync "
+                       "already pending\n", gsm_print_arfcn(cs->arfcn));
+               return 0;
+       }
+
+       cs->sync_pending = true;
+       l1ctl_tx_reset_req(ms, L1CTL_RES_T_FULL);
+       return l1ctl_tx_fbsb_req(ms, cs->arfcn,
+                       L1CTL_FBSB_F_FB01SB, 100, 0,
+                       cs->ccch_mode, dbm2rxlev(-85));
+}
+
 static int global_signal_cb(unsigned int subsys, unsigned int signal,
                            void *handler_data, void *signal_data)
 {
        struct osmocom_ms *ms;
+       struct gsm322_cellsel *cs;
+       struct osmobb_fbsb_res *fr;

        if (subsys != SS_L1CTL)
                return 0;

        switch (signal) {
        case S_L1CTL_RESET:
+               LOGP(DCS, LOGL_NOTICE, "S_L1CTL_RESET\n");
                ms = signal_data;
+               ms->cellsel.arfcn = ms->test_arfcn;
                if (ms->started)
                        break;
                layer3_app_reset();
@@ -196,6 +217,22 @@
                return l1ctl_tx_fbsb_req(ms, ms->test_arfcn,
                                         L1CTL_FBSB_F_FB01SB, 100, 0,
                                         CCCH_MODE_NONE, dbm2rxlev(-85));
+       case S_L1CTL_FBSB_RESP:
+               LOGP(DCS, LOGL_NOTICE, "S_L1CTL_FBSB_RESP\n");
+               fr = signal_data;
+               ms = fr->ms;
+               cs = &ms->cellsel;
+               cs->sync_pending = false;
+               break;
+       case S_L1CTL_FBSB_ERR:
+               LOGP(DCS, LOGL_NOTICE, "S_L1CTL_FBSB_ERR\n");
+               fr = signal_data;
+               ms = fr->ms;
+               cs = &ms->cellsel;
+               cs->sync_pending = false;
+               /* Retry: */
+               modem_sync_to_cell(ms);
+               break;
        }

        return 0;
diff --git a/src/host/layer23/src/modem/grr.c b/src/host/layer23/src/modem/grr.c
index f0bbf89..2047eef 100644
--- a/src/host/layer23/src/modem/grr.c
+++ b/src/host/layer23/src/modem/grr.c
@@ -482,6 +482,9 @@
        const struct gsm322_cellsel *cs = &ms->cellsel;
        const struct gsm48_sysinfo *si = &cs->sel_si;

+       if (cs->sync_pending) /* FBSB in process */
+               return false;
+
        if (!si->si1 || !si->si3 || !si->si4 || !si->si13)
                return false;
        if (!si->gprs.supported)
@@ -684,10 +687,7 @@
                handle_pdch_block_ind(ms, (struct msgb *)data);
                break;
        case GRR_EV_PDCH_RELEASE_REQ:
-               l1ctl_tx_reset_req(ms, L1CTL_RES_T_FULL);
-               l1ctl_tx_fbsb_req(ms, ms->test_arfcn,
-                                 L1CTL_FBSB_F_FB01SB, 100, 0,
-                                 ms->cellsel.ccch_mode, dbm2rxlev(-85));
+               modem_sync_to_cell(ms);
                osmo_fsm_inst_state_chg(fi, GRR_ST_PACKET_IDLE, 0, 0);
                break;
        default:

--
To view, visit https://gerrit.osmocom.org/c/osmocom-bb/+/33905
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: If306d82879281bb540c5cdee2eaf354858c8d24b
Gerrit-Change-Number: 33905
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-MessageType: newchange

Reply via email to