aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bsc/timeslot_fsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osmo-bsc/timeslot_fsm.c')
-rw-r--r--src/osmo-bsc/timeslot_fsm.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/osmo-bsc/timeslot_fsm.c b/src/osmo-bsc/timeslot_fsm.c
index 4816dafb5..541cfd97e 100644
--- a/src/osmo-bsc/timeslot_fsm.c
+++ b/src/osmo-bsc/timeslot_fsm.c
@@ -750,14 +750,25 @@ static int ts_fsm_timer_cb(struct osmo_fsm_inst *fi)
}
}
+static void _count_borken_on_teardown(struct osmo_fsm_inst *fi)
+{
+ struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);
+ if (ts->fi->state == TS_ST_BORKEN) {
+ rate_ctr_inc(&ts->trx->bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_TEARDOWN]);
+ osmo_stat_item_dec(ts->trx->bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);
+ }
+}
+
static void ts_fsm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);
switch (event) {
case TS_EV_OML_DOWN:
ts->is_oml_ready = false;
- if (fi->state != TS_ST_NOT_INITIALIZED)
+ if (fi->state != TS_ST_NOT_INITIALIZED) {
+ _count_borken_on_teardown(fi);
osmo_fsm_inst_state_chg(fi, TS_ST_NOT_INITIALIZED, 0, 0);
+ }
OSMO_ASSERT(fi->state == TS_ST_NOT_INITIALIZED);
ts_terminate_lchan_fsms(ts);
ts->pchan_is = ts->pchan_on_init = GSM_PCHAN_NONE;
@@ -766,8 +777,10 @@ static void ts_fsm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data
case TS_EV_RSL_DOWN:
ts->is_rsl_ready = false;
- if (fi->state != TS_ST_NOT_INITIALIZED)
+ if (fi->state != TS_ST_NOT_INITIALIZED) {
+ _count_borken_on_teardown(fi);
osmo_fsm_inst_state_chg(fi, TS_ST_NOT_INITIALIZED, 0, 0);
+ }
OSMO_ASSERT(fi->state == TS_ST_NOT_INITIALIZED);
ts->pchan_is = GSM_PCHAN_NONE;
ts_lchans_dispatch(ts, -1, LCHAN_EV_TS_ERROR);
@@ -780,11 +793,7 @@ static void ts_fsm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data
static void ts_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)
{
- struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);
- if (ts->fi->state == TS_ST_BORKEN) {
- rate_ctr_inc(&ts->trx->bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_TEARDOWN]);
- osmo_stat_item_dec(ts->trx->bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);
- }
+ _count_borken_on_teardown(fi);
}
#define S(x) (1 << (x))