Do not expect all BTSs support TSC != BCC

We introduce a new feature indicating if the given BTS model
supports a TSC that is different from the BCC (lower 3 bits of BSIC).
diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c
index 3b85892..b906c2e 100644
--- a/openbsc/src/libbsc/bsc_vty.c
+++ b/openbsc/src/libbsc/bsc_vty.c
@@ -491,8 +491,10 @@
 	vty_out(vty, "  cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
 	vty_out(vty, "  location_area_code %u%s", bts->location_area_code,
 		VTY_NEWLINE);
-	vty_out(vty, "  training_sequence_code %u%s", bts->tsc, VTY_NEWLINE);
 	vty_out(vty, "  base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
+	if (bts->tsc != (bts->bsic & 7))
+		vty_out(vty, "  training_sequence_code %u%s", bts->tsc,
+			VTY_NEWLINE);
 	if (bts->tz.override != 0) {
 		if (bts->tz.dst)
 			vty_out(vty, "  timezone %d %d %d%s",
@@ -1634,6 +1636,13 @@
 	struct gsm_bts *bts = vty->index;
 	int tsc = atoi(argv[0]);
 
+	if (!gsm_bts_has_feature(bts, BTS_FEAT_MULTI_TSC)) {
+		vty_out(vty, "%% This BTS does not support a TSC != BCC, "
+			"falling back to BCC%s", VTY_NEWLINE);
+		bts->tsc = bts->bsic & 7;
+		return CMD_WARNING;
+	}
+
 	bts->tsc = tsc;
 
 	return CMD_SUCCESS;
@@ -1655,6 +1664,11 @@
 	}
 	bts->bsic = bsic;
 
+	/* automatically re-configuer the TSC if we change the BCC
+	 * which is the lower 3 bits of the BSIC */
+	if (!gsm_bts_has_feature(bts, BTS_FEAT_MULTI_TSC))
+		bts->tsc = bts->bsic & 7;
+
 	return CMD_SUCCESS;
 }
 
@@ -2977,6 +2991,13 @@
 {
 	struct gsm_bts_trx_ts *ts = vty->index;
 
+	if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
+		vty_out(vty, "%% This BTS does not support a TSC != BCC, "
+			"falling back to BCC%s", VTY_NEWLINE);
+		ts->tsc = -1;
+		return CMD_WARNING;
+	}
+
 	ts->tsc = atoi(argv[0]);
 
 	return CMD_SUCCESS;
diff --git a/openbsc/src/libbsc/bts_ericsson_rbs2000.c b/openbsc/src/libbsc/bts_ericsson_rbs2000.c
index ba5ebe5..7f056f1 100644
--- a/openbsc/src/libbsc/bts_ericsson_rbs2000.c
+++ b/openbsc/src/libbsc/bts_ericsson_rbs2000.c
@@ -262,6 +262,7 @@
 
 	gsm_btsmodel_set_feature(&model_rbs2k, BTS_FEAT_HOPPING);
 	gsm_btsmodel_set_feature(&model_rbs2k, BTS_FEAT_HSCSD);
+	gsm_btsmodel_set_feature(&model_rbs2k, BTS_FEAT_MULTI_TSC);
 
 	osmo_signal_register_handler(SS_L_INPUT, inp_sig_cb, NULL);
 	osmo_signal_register_handler(SS_L_GLOBAL, gbl_sig_cb, NULL);
diff --git a/openbsc/src/libbsc/bts_ipaccess_nanobts.c b/openbsc/src/libbsc/bts_ipaccess_nanobts.c
index dfc8d16..c254127 100644
--- a/openbsc/src/libbsc/bts_ipaccess_nanobts.c
+++ b/openbsc/src/libbsc/bts_ipaccess_nanobts.c
@@ -510,6 +510,7 @@
 
 	gsm_btsmodel_set_feature(&bts_model_nanobts, BTS_FEAT_GPRS);
 	gsm_btsmodel_set_feature(&bts_model_nanobts, BTS_FEAT_EGPRS);
+	gsm_btsmodel_set_feature(&bts_model_nanobts, BTS_FEAT_MULTI_TSC);
 
 	return gsm_bts_model_register(&bts_model_nanobts);
 }
diff --git a/openbsc/src/libbsc/bts_nokia_site.c b/openbsc/src/libbsc/bts_nokia_site.c
index 36e3fac..376a048 100644
--- a/openbsc/src/libbsc/bts_nokia_site.c
+++ b/openbsc/src/libbsc/bts_nokia_site.c
@@ -1724,6 +1724,7 @@
 
 	gsm_btsmodel_set_feature(&model_nokia_site, BTS_FEAT_HOPPING);
 	gsm_btsmodel_set_feature(&model_nokia_site, BTS_FEAT_HSCSD);
+	gsm_btsmodel_set_feature(&model_nokia_site, BTS_FEAT_MULTI_TSC);
 
 	osmo_signal_register_handler(SS_L_INPUT, inp_sig_cb, NULL);
 	osmo_signal_register_handler(SS_L_GLOBAL, gbl_sig_cb, NULL);
diff --git a/openbsc/src/libbsc/bts_siemens_bs11.c b/openbsc/src/libbsc/bts_siemens_bs11.c
index 101e996..160563b 100644
--- a/openbsc/src/libbsc/bts_siemens_bs11.c
+++ b/openbsc/src/libbsc/bts_siemens_bs11.c
@@ -594,6 +594,7 @@
 
 	gsm_btsmodel_set_feature(&model_bs11, BTS_FEAT_HOPPING);
 	gsm_btsmodel_set_feature(&model_bs11, BTS_FEAT_HSCSD);
+	gsm_btsmodel_set_feature(&model_bs11, BTS_FEAT_MULTI_TSC);
 
 	osmo_signal_register_handler(SS_L_INPUT, inp_sig_cb, NULL);
 	osmo_signal_register_handler(SS_L_GLOBAL, gbl_sig_cb, NULL);
diff --git a/openbsc/src/libbsc/bts_sysmobts.c b/openbsc/src/libbsc/bts_sysmobts.c
index 754e277..e1bf661 100644
--- a/openbsc/src/libbsc/bts_sysmobts.c
+++ b/openbsc/src/libbsc/bts_sysmobts.c
@@ -51,6 +51,7 @@
 	model_sysmobts.features.data = &model_sysmobts._features_data[0];
 	model_sysmobts.features.data_len =
 				sizeof(model_sysmobts._features_data);
+	memset(model_sysmobts.features.data, 0, sizeof(model_sysmobts.features.data_len));
 
 	gsm_btsmodel_set_feature(&model_sysmobts, BTS_FEAT_GPRS);
 	gsm_btsmodel_set_feature(&model_sysmobts, BTS_FEAT_EGPRS);