pcuif: Improve BTS-supported CS/MCS handling

Take into account the MCS values supported by the BTS. In osmo-bts,
in general all MCS are enabled if "mode egprs" is selected in BSC,
and none otherwise.

Change-Id: Ie8f0215ba17da1e545e98bec9325c02f1e8efaea
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index 8a825a1..7e51763 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -551,7 +551,7 @@
 	struct gprs_bssgp_pcu *pcu;
 	int rc = 0;
 	unsigned int trx_nr, ts_nr;
-	int i;
+	unsigned int i;
 
 	if (info_ind->version != PCU_IF_VERSION) {
 		fprintf(stderr, "PCU interface version number of BTS (%u) is "
@@ -613,16 +613,32 @@
 	LOGP(DL1IF, LOGL_DEBUG, " dl_tbf_ext=%d\n", info_ind->dl_tbf_ext);
 	LOGP(DL1IF, LOGL_DEBUG, " ul_tbf_ext=%d\n", info_ind->ul_tbf_ext);
 	bts->bsic = info_ind->bsic;
+
+	bts->cs_mask = 1 << 0; /* We need at least 1 CS, let's enable CS1 */
 	for (i = 0; i < 4; i++) {
-		if ((info_ind->flags & (PCU_IF_FLAG_CS1 << i)))
-			LOGP(DL1IF, LOGL_DEBUG, " Use CS%d\n", i+1);
+		uint8_t allowed = !!(info_ind->flags & (PCU_IF_FLAG_CS1 << i));
+		bts->cs_mask |= allowed << i;
+		if (allowed)
+			LOGP(DL1IF, LOGL_DEBUG, " Use CS%d\n",  i + 1);
 	}
+
+	bts->mcs_mask = 0;
 	for (i = 0; i < 9; i++) {
-		if ((info_ind->flags & (PCU_IF_FLAG_MCS1 << i)))
-			LOGP(DL1IF, LOGL_DEBUG, " Use MCS%d\n", i+1);
+		uint8_t allowed = !!(info_ind->flags & (PCU_IF_FLAG_MCS1 << i));
+		bts->mcs_mask |= allowed << i;
+		if (allowed)
+			LOGP(DL1IF, LOGL_DEBUG, " Use MCS%d\n", i + 1);
 	}
+
 	LOGP(DL1IF, LOGL_DEBUG, " initial_cs=%d\n", info_ind->initial_cs);
 	LOGP(DL1IF, LOGL_DEBUG, " initial_mcs=%d\n", info_ind->initial_mcs);
+	if (!bts->force_cs) {
+		if (info_ind->initial_cs < 1 || info_ind->initial_cs > 4)
+			bts->initial_cs_dl = 1;
+		else
+			bts->initial_cs_dl = info_ind->initial_cs;
+		bts->initial_cs_ul = bts->initial_cs_dl;
+	}
 
 	pcu = gprs_bssgp_init(
 			bts,
@@ -640,12 +656,6 @@
 		goto bssgp_failed;
 	}
 
-	bts->cs1 = !!(info_ind->flags & PCU_IF_FLAG_CS1);
-	bts->cs2 = !!(info_ind->flags & PCU_IF_FLAG_CS2);
-	bts->cs3 = !!(info_ind->flags & PCU_IF_FLAG_CS3);
-	bts->cs4 = !!(info_ind->flags & PCU_IF_FLAG_CS4);
-	if (!bts->cs1 && !bts->cs2 && !bts->cs3 && !bts->cs4)
-		bts->cs1 = 1;
 	if (info_ind->t3142) { /* if timer values are set */
 		osmo_tdef_set(bts->T_defs_bts, 3142, info_ind->t3142, OSMO_TDEF_S);
 		osmo_tdef_set(bts->T_defs_bts, 3169, info_ind->t3169, OSMO_TDEF_S);
@@ -656,13 +666,6 @@
 		bts->n3103 = info_ind->n3103;
 		bts->n3105 = info_ind->n3105;
 	}
-	if (!bts->force_cs) {
-		if (info_ind->initial_cs < 1 || info_ind->initial_cs > 4)
-			bts->initial_cs_dl = 1;
-		else
-			bts->initial_cs_dl = info_ind->initial_cs;
-		bts->initial_cs_ul = bts->initial_cs_dl;
-	}
 
 	for (trx_nr = 0; trx_nr < ARRAY_SIZE(bts->trx); trx_nr++) {
 		bts->trx[trx_nr].arfcn = info_ind->trx[trx_nr].arfcn;