diff options
Diffstat (limited to 'src/common/bts_trx.c')
-rw-r--r-- | src/common/bts_trx.c | 70 |
1 files changed, 45 insertions, 25 deletions
diff --git a/src/common/bts_trx.c b/src/common/bts_trx.c index a5d7ed3d..251b6735 100644 --- a/src/common/bts_trx.c +++ b/src/common/bts_trx.c @@ -59,14 +59,7 @@ static void gsm_bts_trx_ts_init_lchan(struct gsm_bts_trx_ts *ts) for (ln = 0; ln < ARRAY_SIZE(ts->lchan); ln++) { struct gsm_lchan *lchan = &ts->lchan[ln]; - - lchan->ts = ts; - lchan->nr = ln; - lchan->type = GSM_LCHAN_NONE; - gsm_lchan_name_update(lchan); - - INIT_LLIST_HEAD(&lchan->sapi_cmds); - INIT_LLIST_HEAD(&lchan->dl_tch_queue); + gsm_lchan_init(lchan, ts, ln); } } @@ -81,12 +74,17 @@ static void gsm_bts_trx_init_ts(struct gsm_bts_trx *trx) ts->trx = trx; ts->nr = tn; + ts->tsc_oml_configured = false; + ts->tsc_rsl_configured = false; + ts->tsc = ts->tsc_oml = ts->tsc_rsl = 0xff; + ts->mo.fi = osmo_fsm_inst_alloc(&nm_chan_fsm, trx, ts, LOGL_INFO, NULL); osmo_fsm_inst_update_id_f(ts->mo.fi, "%s-ts%u", trx->bb_transc.mo.fi->id, ts->nr); gsm_mo_init(&ts->mo, trx->bts, NM_OC_CHANNEL, trx->bts->nr, trx->nr, ts->nr); + oml_mo_state_init(&ts->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED); gsm_bts_trx_ts_init_lchan(ts); } @@ -106,6 +104,10 @@ void gsm_bts_trx_init_shadow_ts(struct gsm_bts_trx *trx) ts->trx = trx; ts->nr = tn; + ts->tsc_oml_configured = false; + ts->tsc_rsl_configured = false; + ts->tsc = ts->tsc_oml = ts->tsc_rsl = 0xff; + /* Link both primary and shadow */ trx->ts[tn].vamos.peer = ts; ts->vamos.peer = &trx->ts[tn]; @@ -119,6 +121,27 @@ void gsm_bts_trx_init_shadow_ts(struct gsm_bts_trx *trx) } } +void gsm_bts_trx_free_shadow_ts(struct gsm_bts_trx *trx) +{ + unsigned int tn; + unsigned int ln; + + for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++) { + struct gsm_bts_trx_ts *shadow_ts = trx->ts[tn].vamos.peer; + if (!shadow_ts) + continue; + + /* free lchan related mem allocated on the trx object: */ + for (ln = 0; ln < ARRAY_SIZE(shadow_ts->lchan); ln++) { + struct gsm_lchan *lchan = &shadow_ts->lchan[ln]; + TALLOC_FREE(lchan->name); + } + + talloc_free(shadow_ts); + trx->ts[tn].vamos.peer = NULL; + } +} + struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts) { struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx); @@ -134,14 +157,14 @@ struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts) trx->mo.fi = osmo_fsm_inst_alloc(&nm_rcarrier_fsm, trx, trx, LOGL_INFO, NULL); osmo_fsm_inst_update_id_f(trx->mo.fi, "bts%d-trx%d", bts->nr, trx->nr); - gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER, - bts->nr, trx->nr, 0xff); + gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER, bts->nr, trx->nr, 0xff); + oml_mo_state_init(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED); trx->bb_transc.mo.fi = osmo_fsm_inst_alloc(&nm_bb_transc_fsm, trx, &trx->bb_transc, LOGL_INFO, NULL); osmo_fsm_inst_update_id_f(trx->bb_transc.mo.fi, "bts%d-trx%d", bts->nr, trx->nr); - gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC, - bts->nr, trx->nr, 0xff); + gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC, bts->nr, trx->nr, 0xff); + oml_mo_state_init(&trx->bb_transc.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED); gsm_bts_trx_init_ts(trx); @@ -206,25 +229,22 @@ const char *gsm_trx_unit_id(struct gsm_bts_trx *trx) /* RSL link is established, send status report */ int trx_link_estab(struct gsm_bts_trx *trx) { - struct e1inp_sign_link *link = trx->rsl_link; int rc; - LOGPTRX(trx, DSUM, LOGL_INFO, "RSL link %s\n", - link ? "up" : "down"); + LOGPTRX(trx, DRSL, LOGL_INFO, "RSL link up\n"); - osmo_fsm_inst_dispatch(trx->mo.fi, link ? NM_EV_RSL_UP : NM_EV_RSL_DOWN, NULL); - osmo_fsm_inst_dispatch(trx->bb_transc.mo.fi, link ? NM_EV_RSL_UP : NM_EV_RSL_DOWN, NULL); + osmo_fsm_inst_dispatch(trx->mo.fi, NM_EV_RSL_UP, NULL); + osmo_fsm_inst_dispatch(trx->bb_transc.mo.fi, NM_EV_RSL_UP, NULL); - if (link) + if (trx->mo.nm_state.operational == NM_OPSTATE_ENABLED || + trx->bb_transc.mo.nm_state.operational == NM_OPSTATE_ENABLED) { rc = rsl_tx_rf_res(trx); - else - rc = bts_model_trx_deact_rf(trx); - if (rc < 0) { - oml_tx_failure_event_rep(&trx->bb_transc.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_RSL_FAIL, - link ? - "Failed to establish RSL link (%d)" : - "Failed to deactivate RF (%d)", rc); + if (rc < 0) + oml_tx_failure_event_rep(&trx->bb_transc.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_RSL_FAIL, + "Failed to establish RSL link (%d)", rc); } + if (trx == trx->bts->c0) + load_timer_start(trx->bts); return 0; } |