diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-07-17 17:11:43 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-07-24 14:00:47 +0200 |
commit | 345d03a6f6eb4c2d9511774b1eda33f0a886742a (patch) | |
tree | 335c585e7c9c1ab1d1eb657be4dd9d22b4041daa /src/host/layer23 | |
parent | 0a6ad6bbf882cddc7a3b6634879baad3ca085c28 (diff) |
layer23: modem: Delay using cell until fully synced to it
Change-Id: If306d82879281bb540c5cdee2eaf354858c8d24b
Diffstat (limited to 'src/host/layer23')
-rw-r--r-- | src/host/layer23/include/osmocom/bb/modem/modem.h | 1 | ||||
-rw-r--r-- | src/host/layer23/src/modem/app_modem.c | 37 | ||||
-rw-r--r-- | src/host/layer23/src/modem/grr.c | 8 |
3 files changed, 42 insertions, 4 deletions
diff --git a/src/host/layer23/include/osmocom/bb/modem/modem.h b/src/host/layer23/include/osmocom/bb/modem/modem.h index 29d2571a..7135bf71 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 6871384e..08a12609 100644 --- a/src/host/layer23/src/modem/app_modem.c +++ b/src/host/layer23/src/modem/app_modem.c @@ -165,17 +165,38 @@ static int modem_l23_subscr_signal_cb(unsigned int subsys, unsigned int signal, 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 @@ static int global_signal_cb(unsigned int subsys, unsigned int signal, 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 f0bbf893..2047eefd 100644 --- a/src/host/layer23/src/modem/grr.c +++ b/src/host/layer23/src/modem/grr.c @@ -482,6 +482,9 @@ static bool grr_cell_is_usable(const struct osmocom_ms *ms) 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 @@ static void grr_st_packet_transfer_action(struct osmo_fsm_inst *fi, 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: |