summaryrefslogtreecommitdiffstats
path: root/src/host
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-07-17 17:11:43 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-07-24 14:00:47 +0200
commit345d03a6f6eb4c2d9511774b1eda33f0a886742a (patch)
tree335c585e7c9c1ab1d1eb657be4dd9d22b4041daa /src/host
parent0a6ad6bbf882cddc7a3b6634879baad3ca085c28 (diff)
layer23: modem: Delay using cell until fully synced to it
Diffstat (limited to 'src/host')
-rw-r--r--src/host/layer23/include/osmocom/bb/modem/modem.h1
-rw-r--r--src/host/layer23/src/modem/app_modem.c37
-rw-r--r--src/host/layer23/src/modem/grr.c8
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: