fixeria has submitted this change. ( https://gerrit.osmocom.org/c/osmocom-bb/+/30318 )
Change subject: trxcon: trxcon_fsm: permit loop [P]DCH transitions ......................................................................
trxcon: trxcon_fsm: permit loop [P]DCH transitions
According to 3GPP TS 44.004, Figure 5.1, it's absolutely legal to perform loop transitions in state 'DCH' (i.e. from 'DCH' to 'DCH').
This kind of transition is needed in the following cases:
* on reciept of RR FREQUENCY REDEFINITION, * on reciept of RR ASSIGNMENT REQUEST, * on reciept of RR HANDOVER REQUEST,
when going back from state 'DCH' to state 'BCH' is not required nor actually desired. In context of the trxcon_fsm, this applies to both TRXCON_ST_DEDICATED and TRXCON_ST_PACKET_DATA, as they both represent what's defined as 'DCH' in the Figure 5.1.
Change-Id: I3b402ec84610a5df744d9b06e5f7dab7a9a3ddad Related: OS#5599 --- M src/host/trxcon/src/trxcon_fsm.c 1 file changed, 15 insertions(+), 2 deletions(-)
Approvals: Jenkins Builder: Verified pespin: Looks good to me, but someone else must approve osmith: Looks good to me, but someone else must approve fixeria: Looks good to me, approved
diff --git a/src/host/trxcon/src/trxcon_fsm.c b/src/host/trxcon/src/trxcon_fsm.c index 875a9f5..264ba20 100644 --- a/src/host/trxcon/src/trxcon_fsm.c +++ b/src/host/trxcon/src/trxcon_fsm.c @@ -336,6 +336,9 @@ trxcon->l1p.band_arfcn = req->h0.band_arfcn; }
+ /* Remove all active timeslots */ + l1sched_reset(trxcon->sched, false); + rc = l1sched_configure_ts(trxcon->sched, req->chan_nr & 0x07, config); if (rc) return; @@ -410,6 +413,9 @@ case TRXCON_EV_TX_ACCESS_BURST_CNF: l1ctl_tx_rach_conf(trxcon, (const struct trxcon_param_tx_access_burst_cnf *)data); break; + case TRXCON_EV_DCH_EST_REQ: + handle_dch_est_req(fi, (const struct trxcon_param_dch_est_req *)data); + break; case TRXCON_EV_DCH_REL_REQ: l1sched_reset(trxcon->sched, false); osmo_fsm_inst_state_chg(fi, TRXCON_ST_RESET, 0, 0); @@ -530,6 +536,9 @@ LOGPFSML(fi, LOGL_NOTICE, "Rx PTCCH/D message\n"); break; } + case TRXCON_EV_DCH_EST_REQ: + handle_dch_est_req(fi, (const struct trxcon_param_dch_est_req *)data); + break; case TRXCON_EV_DCH_REL_REQ: l1sched_reset(trxcon->sched, false); osmo_fsm_inst_state_chg(fi, TRXCON_ST_RESET, 0, 0); @@ -601,8 +610,10 @@ [TRXCON_ST_DEDICATED] = { .name = "DEDICATED", .out_state_mask = S(TRXCON_ST_RESET) - | S(TRXCON_ST_FBSB_SEARCH), + | S(TRXCON_ST_FBSB_SEARCH) + | S(TRXCON_ST_DEDICATED), .in_event_mask = S(TRXCON_EV_DCH_REL_REQ) + | S(TRXCON_EV_DCH_EST_REQ) | S(TRXCON_EV_TX_ACCESS_BURST_REQ) | S(TRXCON_EV_TX_ACCESS_BURST_CNF) | S(TRXCON_EV_SET_TCH_MODE_REQ) @@ -615,8 +626,10 @@ [TRXCON_ST_PACKET_DATA] = { .name = "PACKET_DATA", .out_state_mask = S(TRXCON_ST_RESET) - | S(TRXCON_ST_FBSB_SEARCH), + | S(TRXCON_ST_FBSB_SEARCH) + | S(TRXCON_ST_PACKET_DATA), .in_event_mask = S(TRXCON_EV_DCH_REL_REQ) + | S(TRXCON_EV_DCH_EST_REQ) | S(TRXCON_EV_TX_ACCESS_BURST_REQ) | S(TRXCON_EV_TX_ACCESS_BURST_CNF) | S(TRXCON_EV_RX_DATA_IND),