OM2000: More work on the TS configuration request

It seems the differences for the various channel combinations are big
diff --git a/openbsc/src/libbsc/abis_om2000.c b/openbsc/src/libbsc/abis_om2000.c
index 9eadff2..9906ec1 100644
--- a/openbsc/src/libbsc/abis_om2000.c
+++ b/openbsc/src/libbsc/abis_om2000.c
@@ -214,9 +214,11 @@
 	OM2K_DEI_EXT_RANGE			= 0x47,
 	OM2K_DEI_REQ_IND			= 0x48,
 	OM2K_DEI_REPL_UNIT_MAP			= 0x50,
+	OM2K_DEI_ICM_BOUND_PARAMS		= 0x74,
 	OM2K_DEI_LSC				= 0x79,
 	OM2K_DEI_LSC_FILT_TIME			= 0x7a,
 	OM2K_DEI_CALL_SUPV_TIME			= 0x7b,
+	OM2K_DEI_ICM_CHAN_RATE			= 0x7e,
 	OM2K_DEI_HW_INFO_SIG			= 0x84,
 	OM2K_DEI_TTA				= 0x87,
 	OM2K_DEI_CAPA_SIG			= 0x8a,
@@ -279,9 +281,11 @@
 		[OM2K_DEI_EXT_RANGE] =		{ TLV_TYPE_TV },
 		[OM2K_DEI_REQ_IND] =		{ TLV_TYPE_TV },
 		[OM2K_DEI_REPL_UNIT_MAP] =	{ TLV_TYPE_FIXED, 6 },
+		[OM2K_DEI_ICM_BOUND_PARAMS] =	{ TLV_TYPE_FIXED, 5 },
 		[OM2K_DEI_LSC] =		{ TLV_TYPE_TV },
 		[OM2K_DEI_LSC_FILT_TIME] =	{ TLV_TYPE_TV },
 		[OM2K_DEI_CALL_SUPV_TIME] =	{ TLV_TYPE_TV },
+		[OM2K_DEI_ICM_CHAN_RATE] =	{ TLV_TYPE_TV },
 		[OM2K_DEI_HW_INFO_SIG] =	{ TLV_TYPE_FIXED, 2 },
 		[OM2K_DEI_TTA] =		{ TLV_TYPE_TV },
 		[OM2K_DEI_CAPA_SIG] =		{ TLV_TYPE_FIXED, 2 },
@@ -960,6 +964,8 @@
 	return len;
 }
 
+const uint8_t icm_bound_params[] = { 0x02, 0x06, 0x0c, 0x16, 0x06 };
+
 int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts)
 {
 	struct msgb *msg = om2k_msgb_alloc();
@@ -991,13 +997,26 @@
 	msgb_tv_put(msg, OM2K_DEI_INTERF_REJ_COMB, 0x00);
 	switch (ts->pchan) {
 	case GSM_PCHAN_CCCH:
-	case GSM_PCHAN_CCCH_SDCCH4:
 		msgb_tv_put(msg, OM2K_DEI_BA_PA_MFRMS, 0x06);
 		msgb_tv_put(msg, OM2K_DEI_BS_AG_BKS_RES, 0x01);
 		msgb_tv_put(msg, OM2K_DEI_DRX_DEV_MAX, 0x05);
 		/* Repeat Paging/IMM.ASS: True, Allow Paging Type 3: Yes, Page for 5 seconds (default) */
 		msgb_tv_put(msg, OM2K_DEI_CCCH_OPTIONS, 0x01);
 		break;
+	case GSM_PCHAN_CCCH_SDCCH4:
+		msgb_tv_put(msg, OM2K_DEI_T3105, 0x04);
+		msgb_tv_put(msg, OM2K_DEI_NY1, 35);
+		msgb_tv_put(msg, OM2K_DEI_BA_PA_MFRMS, 0x06);
+		msgb_tv_put(msg, OM2K_DEI_CBCH_INDICATOR, 0);
+		msgb_tv_put(msg, OM2K_DEI_TSC, ts->trx->bts->tsc);
+		msgb_tv_put(msg, OM2K_DEI_BS_AG_BKS_RES, 0x01);
+		msgb_tv_put(msg, OM2K_DEI_ICM_INDICATOR, 0);
+		msgb_tv_put(msg, OM2K_DEI_DRX_DEV_MAX, 0x05);
+		/* Repeat Paging/IMM.ASS: True, Allow Paging Type 3: Yes, Page for 5 seconds (default) */
+		msgb_tv_put(msg, OM2K_DEI_CCCH_OPTIONS, 0x01);
+		msgb_tv_fixed_put(msg, OM2K_DEI_ICM_BOUND_PARAMS,
+				  sizeof(icm_bound_params), icm_bound_params);
+		break;
 	case GSM_PCHAN_SDCCH8_SACCH8C:
 		msgb_tv_put(msg, OM2K_DEI_T3105, 0x04);
 		msgb_tv_put(msg, OM2K_DEI_NY1, 35);
@@ -1005,15 +1024,22 @@
 		msgb_tv_put(msg, OM2K_DEI_TSC, ts->trx->bts->tsc);
 		/* Disable RF RESOURCE INDICATION on idle channels */
 		msgb_tv_put(msg, OM2K_DEI_ICM_INDICATOR, 0);
+		msgb_tv_fixed_put(msg, OM2K_DEI_ICM_BOUND_PARAMS,
+				  sizeof(icm_bound_params), icm_bound_params);
 		break;
 	default:
 		msgb_tv_put(msg, OM2K_DEI_T3105, 0x04);
 		msgb_tv_put(msg, OM2K_DEI_NY1, 35);
-		msgb_tv_put(msg, OM2K_DEI_CBCH_INDICATOR, 0);
 		msgb_tv_put(msg, OM2K_DEI_TSC, ts->trx->bts->tsc);
 		/* Disable RF RESOURCE INDICATION on idle channels */
 		msgb_tv_put(msg, OM2K_DEI_ICM_INDICATOR, 0);
+		msgb_tv_fixed_put(msg, OM2K_DEI_ICM_BOUND_PARAMS,
+				  sizeof(icm_bound_params), icm_bound_params);
 		msgb_tv_put(msg, OM2K_DEI_TTA, 10); /* Timer for Time Alignment */
+		if (ts->pchan == GSM_PCHAN_TCH_H)
+			msgb_tv_put(msg, OM2K_DEI_ICM_CHAN_RATE, 1); /* TCH/H */
+		else
+			msgb_tv_put(msg, OM2K_DEI_ICM_CHAN_RATE, 0); /* TCH/F */
 		msgb_tv_put(msg, OM2K_DEI_LSC, 1); /* enabled */
 		msgb_tv_put(msg, OM2K_DEI_LSC_FILT_TIME, 160);	/* units of 100ms */
 		msgb_tv_put(msg, OM2K_DEI_CALL_SUPV_TIME, 8);