gsm: Introduce helper rach_tx_integer_raw2val()

Change-Id: I6ef085ee92b2064cb46fa5ec3ae98a0ca59ad599
diff --git a/TODO-RELEASE b/TODO-RELEASE
index a6d16d2..0ae28c0 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -10,3 +10,4 @@
 libosmogsm      ABI BREAKAGE            CELL_IDENT_WHOLE_GLOBAL_PS changed enum number
 libosmogsm	add struct member	Add codec_list_bss_supported to gsm0808_handover_request_ack (more_items flag ensures ABI compat)
 libosmogb	ABI BREAKAGE		Add reset_ack_notification function pointer to struct bssgp_bvc_fsm_ops
+libosmogsm      add API                 Add rach_tx_integer_raw2val() in gsm_utils.h
diff --git a/include/osmocom/gsm/gsm_utils.h b/include/osmocom/gsm/gsm_utils.h
index 07b6a8b..fef2fdd 100644
--- a/include/osmocom/gsm/gsm_utils.h
+++ b/include/osmocom/gsm/gsm_utils.h
@@ -152,6 +152,13 @@
 	const int tbl[4] = { 1, 2, 4, 7 };
 	return tbl[raw & 3];
 }
+static inline uint8_t rach_tx_integer_raw2val(uint8_t raw) {
+	const int tbl[6] = { 14, 16, 20, 25, 32, 50 };
+	raw &= 0x0f;
+	if (raw <= 9)
+		return raw + 3;
+	return tbl[raw - 10];
+}
 
 #define	ARFCN_PCS	0x8000
 #define	ARFCN_UPLINK	0x4000
diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c
index cdccf53..2aceefa 100644
--- a/tests/gsm0408/gsm0408_test.c
+++ b/tests/gsm0408/gsm0408_test.c
@@ -1732,6 +1732,16 @@
 	VERIFY(rc, <, 0);
 }
 
+static void test_rach_tx_integer_raw2val()
+{
+	unsigned int raw;
+	for (raw = 0; raw <= 0x0f; raw++) {
+		unsigned int val = rach_tx_integer_raw2val(raw);
+		printf("rach_tx_integer_raw2val(0x0%x): %u slots used to spread transmission\n",
+			raw, val);
+	}
+}
+
 int main(int argc, char **argv)
 {
 	test_bearer_cap();
@@ -1750,6 +1760,7 @@
 	test_print_encoding();
 	test_range_encoding();
 	test_power_ctrl();
+	test_rach_tx_integer_raw2val();
 
 	return EXIT_SUCCESS;
 }
diff --git a/tests/gsm0408/gsm0408_test.ok b/tests/gsm0408/gsm0408_test.ok
index 52c4ea7..97bf083 100644
--- a/tests/gsm0408/gsm0408_test.ok
+++ b/tests/gsm0408/gsm0408_test.ok
@@ -791,3 +791,19 @@
 Random range test: range 255, max num ARFCNs 22
 Random range test: range 511, max num ARFCNs 18
 Random range test: range 1023, max num ARFCNs 16
+rach_tx_integer_raw2val(0x00): 3 slots used to spread transmission
+rach_tx_integer_raw2val(0x01): 4 slots used to spread transmission
+rach_tx_integer_raw2val(0x02): 5 slots used to spread transmission
+rach_tx_integer_raw2val(0x03): 6 slots used to spread transmission
+rach_tx_integer_raw2val(0x04): 7 slots used to spread transmission
+rach_tx_integer_raw2val(0x05): 8 slots used to spread transmission
+rach_tx_integer_raw2val(0x06): 9 slots used to spread transmission
+rach_tx_integer_raw2val(0x07): 10 slots used to spread transmission
+rach_tx_integer_raw2val(0x08): 11 slots used to spread transmission
+rach_tx_integer_raw2val(0x09): 12 slots used to spread transmission
+rach_tx_integer_raw2val(0x0a): 14 slots used to spread transmission
+rach_tx_integer_raw2val(0x0b): 16 slots used to spread transmission
+rach_tx_integer_raw2val(0x0c): 20 slots used to spread transmission
+rach_tx_integer_raw2val(0x0d): 25 slots used to spread transmission
+rach_tx_integer_raw2val(0x0e): 32 slots used to spread transmission
+rach_tx_integer_raw2val(0x0f): 50 slots used to spread transmission