aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/osmo-bts-trx/l1_if.c7
-rw-r--r--src/osmo-bts-trx/scheduler.c15
-rw-r--r--src/osmo-bts-trx/scheduler.h3
3 files changed, 22 insertions, 3 deletions
diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c
index 66922b54..25aa0f98 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -239,12 +239,19 @@ static int trx_close(struct gsm_bts_trx *trx)
{
struct trx_l1h *l1h = trx_l1h_hdl(trx);
+ /* close all logical channels and reset timeslots */
+ trx_sched_reset(l1h);
+
+ /* power off tranceiver, if not already */
if (l1h->config.poweron) {
l1h->config.poweron = 0;
l1h->config.poweron_sent = 0;
l1if_provision_tranceiver_trx(l1h);
}
+ /* Set to Operational State: Disabled */
+ oml_mo_state_chg(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);
+
return 0;
}
diff --git a/src/osmo-bts-trx/scheduler.c b/src/osmo-bts-trx/scheduler.c
index a0caeeca..d51c1eb4 100644
--- a/src/osmo-bts-trx/scheduler.c
+++ b/src/osmo-bts-trx/scheduler.c
@@ -201,10 +201,12 @@ int trx_sched_init(struct trx_l1h *l1h)
for (tn = 0; tn < 8; tn++) {
l1h->mf_index[tn] = 0;
+ INIT_LLIST_HEAD(&l1h->dl_prims[tn]);
for (i = 0; i < _TRX_CHAN_MAX; i++) {
- INIT_LLIST_HEAD(&l1h->dl_prims[tn]);
chan_state = &l1h->chan_states[tn][i];
- chan_state->ul_mask = 0x0;
+ chan_state->dl_active = 0;
+ chan_state->ul_active = 0;
+ chan_state->ul_mask = 0x00;
}
}
@@ -220,8 +222,8 @@ void trx_sched_exit(struct trx_l1h *l1h)
LOGP(DL1C, LOGL_NOTICE, "Exit scheduler for trx=%u\n", l1h->trx->nr);
for (tn = 0; tn < 8; tn++) {
+ msgb_queue_flush(&l1h->dl_prims[tn]);
for (i = 0; i < _TRX_CHAN_MAX; i++) {
- msgb_queue_flush(&l1h->dl_prims[tn]);
chan_state = &l1h->chan_states[tn][i];
if (chan_state->dl_bursts) {
talloc_free(chan_state->dl_bursts);
@@ -235,6 +237,13 @@ void trx_sched_exit(struct trx_l1h *l1h)
}
}
+/* close all logical channels and reset timeslots */
+void trx_sched_reset(struct trx_l1h *l1h)
+{
+ trx_sched_exit(l1h);
+ trx_sched_init(l1h);
+}
+
/*
* data request (from upper layer)
diff --git a/src/osmo-bts-trx/scheduler.h b/src/osmo-bts-trx/scheduler.h
index eb82327a..97803bd4 100644
--- a/src/osmo-bts-trx/scheduler.h
+++ b/src/osmo-bts-trx/scheduler.h
@@ -26,4 +26,7 @@ int trx_sched_set_pchan(struct trx_l1h *l1h, uint8_t tn,
int trx_sched_set_lchan(struct trx_l1h *l1h, uint8_t chan_nr, uint8_t link_id,
int downlink, int active);
+/* close all logical channels and reset timeslots */
+void trx_sched_reset(struct trx_l1h *l1h);
+
#endif /* TRX_SCHEDULER_H */