aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/bsc/gsm_data.h7
-rw-r--r--src/libbsc/abis_om2000.c4
-rw-r--r--src/libbsc/abis_rsl.c37
-rw-r--r--src/libbsc/bsc_init.c4
-rw-r--r--src/libbsc/bts_ericsson_rbs2000.c8
-rw-r--r--src/libbsc/bts_ipaccess_nanobts.c10
-rw-r--r--src/libbsc/bts_nokia_site.c4
-rw-r--r--src/libbsc/bts_siemens_bs11.c2
8 files changed, 73 insertions, 3 deletions
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index f113904d7..29b97f0f3 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -459,6 +459,8 @@ enum {
/* One Timeslot in a TRX */
struct gsm_bts_trx_ts {
struct gsm_bts_trx *trx;
+ bool initialized;
+
/* number of this timeslot at the TRX */
uint8_t nr;
@@ -605,6 +607,7 @@ struct gsm_bts_model {
int (*start)(struct gsm_network *net);
int (*oml_rcvmsg)(struct msgb *msg);
char * (*oml_status)(const struct gsm_bts *bts);
+ bool (*oml_is_ts_ready)(const struct gsm_bts_trx_ts *ts);
void (*e1line_bind_ops)(struct e1inp_line *line);
@@ -1387,4 +1390,8 @@ void gsm_bts_set_radio_link_timeout(struct gsm_bts *bts, int value);
bool classmark_is_r99(struct gsm_classmark *cm);
+void gsm_ts_check_init(struct gsm_bts_trx_ts *ts);
+void gsm_trx_mark_all_ts_uninitialized(struct gsm_bts_trx *trx);
+void gsm_bts_mark_all_ts_uninitialized(struct gsm_bts *bts);
+
#endif /* _GSM_DATA_H */
diff --git a/src/libbsc/abis_om2000.c b/src/libbsc/abis_om2000.c
index 6057bc647..d533ea198 100644
--- a/src/libbsc/abis_om2000.c
+++ b/src/libbsc/abis_om2000.c
@@ -2737,8 +2737,10 @@ void abis_om2k_trx_init(struct gsm_bts_trx *trx)
bts->nr, 255, trx->nr);
for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
- om2k_mo_init(&trx->ts[i].rbs2000.om2k_mo, OM2K_MO_CLS_TS,
+ struct gsm_bts_trx_ts *ts = &trx->ts[i];
+ om2k_mo_init(&ts->rbs2000.om2k_mo, OM2K_MO_CLS_TS,
bts->nr, trx->nr, i);
+ gsm_ts_check_init(ts);
}
}
diff --git a/src/libbsc/abis_rsl.c b/src/libbsc/abis_rsl.c
index b36e49687..e6d0cea96 100644
--- a/src/libbsc/abis_rsl.c
+++ b/src/libbsc/abis_rsl.c
@@ -3017,3 +3017,40 @@ int rsl_direct_rf_release(struct gsm_lchan *lchan)
/* Now release it */
return rsl_rf_chan_release(lchan, 0, SACCH_NONE);
}
+
+/* Initial timeslot actions when a timeslot first comes into operation. */
+static bool gsm_ts_init(struct gsm_bts_trx_ts *ts)
+{
+ dyn_ts_init(ts);
+ return true;
+}
+
+/* Trigger initial timeslot actions iff both OML and RSL are setup. */
+void gsm_ts_check_init(struct gsm_bts_trx_ts *ts)
+{
+ struct gsm_bts *bts = ts->trx->bts;
+ if (bts->model->oml_is_ts_ready
+ && !bts->model->oml_is_ts_ready(ts))
+ return;
+ if (!ts->trx->rsl_link)
+ return;
+ if (ts->initialized)
+ return;
+ ts->initialized = gsm_ts_init(ts);
+}
+
+void gsm_trx_mark_all_ts_uninitialized(struct gsm_bts_trx *trx)
+{
+ int i;
+ for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
+ struct gsm_bts_trx_ts *ts = &trx->ts[i];
+ ts->initialized = false;
+ }
+}
+
+void gsm_bts_mark_all_ts_uninitialized(struct gsm_bts *bts)
+{
+ struct gsm_bts_trx *trx;
+ llist_for_each_entry(trx, &bts->trx_list, list)
+ gsm_trx_mark_all_ts_uninitialized(trx);
+}
diff --git a/src/libbsc/bsc_init.c b/src/libbsc/bsc_init.c
index 92b8c27ff..5b157c57f 100644
--- a/src/libbsc/bsc_init.c
+++ b/src/libbsc/bsc_init.c
@@ -353,7 +353,9 @@ static void bootstrap_rsl(struct gsm_bts_trx *trx)
}
for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
- generate_ma_for_ts(&trx->ts[i]);
+ struct gsm_bts_trx_ts *ts = &trx->ts[i];
+ generate_ma_for_ts(ts);
+ gsm_ts_check_init(ts);
}
}
diff --git a/src/libbsc/bts_ericsson_rbs2000.c b/src/libbsc/bts_ericsson_rbs2000.c
index 20b498a52..9c8b90ee2 100644
--- a/src/libbsc/bts_ericsson_rbs2000.c
+++ b/src/libbsc/bts_ericsson_rbs2000.c
@@ -52,6 +52,8 @@ static void bootstrap_om_trx(struct gsm_bts_trx *trx)
static int shutdown_om(struct gsm_bts *bts)
{
+ gsm_bts_mark_all_ts_uninitialized(bts);
+
/* FIXME */
return 0;
}
@@ -172,11 +174,17 @@ static void bts_model_rbs2k_e1line_bind_ops(struct e1inp_line *line)
e1inp_line_bind_ops(line, &bts_isdn_e1inp_line_ops);
}
+static bool bts_model_rbs2k_is_ts_ready(const struct gsm_bts_trx_ts *ts)
+{
+ return ts && ts->mo.nm_state.operational == NM_OPSTATE_ENABLED;
+}
+
static struct gsm_bts_model model_rbs2k = {
.type = GSM_BTS_TYPE_RBS2000,
.name = "rbs2000",
.start = bts_model_rbs2k_start,
.oml_rcvmsg = &abis_om2k_rcvmsg,
+ .oml_is_ts_ready = bts_model_rbs2k_is_ts_ready,
.config_write_bts = &config_write_bts,
.e1line_bind_ops = &bts_model_rbs2k_e1line_bind_ops,
};
diff --git a/src/libbsc/bts_ipaccess_nanobts.c b/src/libbsc/bts_ipaccess_nanobts.c
index 3eb7e0e4d..d5b3b21af 100644
--- a/src/libbsc/bts_ipaccess_nanobts.c
+++ b/src/libbsc/bts_ipaccess_nanobts.c
@@ -56,12 +56,18 @@ static char *get_oml_status(const struct gsm_bts *bts)
return "disconnected";
}
+static bool oml_is_ts_ready(const struct gsm_bts_trx_ts *ts)
+{
+ return ts && ts->mo.nm_state.operational == NM_OPSTATE_ENABLED;
+}
+
struct gsm_bts_model bts_model_nanobts = {
.type = GSM_BTS_TYPE_NANOBTS,
.name = "nanobts",
.start = bts_model_nanobts_start,
.oml_rcvmsg = &abis_nm_rcvmsg,
.oml_status = &get_oml_status,
+ .oml_is_ts_ready = oml_is_ts_ready,
.e1line_bind_ops = bts_model_nanobts_e1line_bind_ops,
.nm_att_tlvdef = {
.def = {
@@ -320,7 +326,7 @@ static void nm_rx_opstart_ack_chan(struct abis_om_fom_hdr *foh)
return;
}
- dyn_ts_init(ts);
+ gsm_ts_check_init(ts);
}
static void nm_rx_opstart_ack(struct abis_om_fom_hdr *foh)
@@ -426,6 +432,8 @@ void ipaccess_drop_oml(struct gsm_bts *bts)
llist_for_each_entry(trx, &bts->trx_list, list)
ipaccess_drop_rsl(trx);
+ gsm_bts_mark_all_ts_uninitialized(bts);
+
bts->ip_access.flags = 0;
/*
diff --git a/src/libbsc/bts_nokia_site.c b/src/libbsc/bts_nokia_site.c
index 67281bbf1..4a24c3931 100644
--- a/src/libbsc/bts_nokia_site.c
+++ b/src/libbsc/bts_nokia_site.c
@@ -55,6 +55,8 @@ static void bootstrap_om_bts(struct gsm_bts *bts)
{
LOGP(DNM, LOGL_NOTICE, "bootstrapping OML for BTS %u\n", bts->nr);
+ gsm_bts_mark_all_ts_uninitialized(bts);
+
if (!bts->nokia.skip_reset) {
if (!bts->nokia.did_reset)
abis_nm_reset(bts, 1);
@@ -66,6 +68,8 @@ static void bootstrap_om_trx(struct gsm_bts_trx *trx)
{
LOGP(DNM, LOGL_NOTICE, "bootstrapping OML for TRX %u/%u\n",
trx->bts->nr, trx->nr);
+
+ gsm_trx_mark_all_ts_uninitialized(trx);
}
static int shutdown_om(struct gsm_bts *bts)
diff --git a/src/libbsc/bts_siemens_bs11.c b/src/libbsc/bts_siemens_bs11.c
index 5701e47a8..2d2351702 100644
--- a/src/libbsc/bts_siemens_bs11.c
+++ b/src/libbsc/bts_siemens_bs11.c
@@ -536,6 +536,8 @@ static int shutdown_om(struct gsm_bts *bts)
/* Reset BTS Site manager resource */
abis_nm_bs11_reset_resource(bts);
+ gsm_bts_mark_all_ts_uninitialized(bts);
+
return 0;
}