Add MPH and TCH primitives to layer 1 SAP

In order to control layer 1 via primitives, MPH primitives are required.
There is only one (MPH-INFO) primitive defined in TS 04.04 for all control
and measurement functions. A type identifier inside this primitive is used
to differentiate between different functions.

The TCH primitives are used to carry traffic. TCH primitives carry voice
or data traffic, whereas PH-DATA primitives carry FACCH data.

PH_RTS and TCH_RTS (ready-to-send) primitives are used to poll requests
from upper layers.
diff --git a/include/osmocom/gsm/l1sap.h b/include/osmocom/gsm/l1sap.h
index 9547c32..485acbf 100644
--- a/include/osmocom/gsm/l1sap.h
+++ b/include/osmocom/gsm/l1sap.h
@@ -3,13 +3,27 @@
 
 #include <osmocom/core/prim.h>
 
-/*! \brief LAPDm related primitives (L1<->L2 SAP) */
+/*! \brief PH-SAP related primitives (L1<->L2 SAP) */
 enum osmo_ph_prim {
 	PRIM_PH_DATA,		/*!< \brief PH-DATA */
 	PRIM_PH_RACH,		/*!< \brief PH-RANDOM_ACCESS */
 	PRIM_PH_CONN,		/*!< \brief PH-CONNECT */
 	PRIM_PH_EMPTY_FRAME,	/*!< \brief PH-EMPTY_FRAME */
 	PRIM_PH_RTS,		/*!< \brief PH-RTS */
+	PRIM_MPH_INFO,		/*!< \brief MPH-INFO */
+	PRIM_TCH,		/*!< \brief TCH */
+	PRIM_TCH_RTS,		/*!< \brief TCH */
+};
+
+/*! \brief PH-SAP related primitives (L1<->L2 SAP) */
+enum osmo_mph_info_type {
+	PRIM_INFO_TIME,		/*!< \brief Current GSM time */
+	PRIM_INFO_MEAS,		/*!< \brief Measurement indication */
+	PRIM_INFO_ACTIVATE,	/*!< \brief Activation of channel */
+	PRIM_INFO_DEACTIVATE,	/*!< \brief Deactivation of channel */
+	PRIM_INFO_MODIFY,	/*!< \brief Mode Modify of channel */
+	PRIM_INFO_ACT_CIPH,	/*!< \brief Activation of ciphering */
+	PRIM_INFO_DEACT_CIPH,	/*!< \brief Deactivation of ciphering */
 };
 
 /*! \brief for PH-RANDOM_ACCESS.req */
@@ -28,10 +42,17 @@
 	uint32_t fn;		/*!< \brief GSM Frame Number at time of RA */
 };
 
-/*! \brief for PH-[UNIT]DATA.{req,ind} */
+/*! \brief for PH-[UNIT]DATA.{req,ind} | PH-RTS.ind */
 struct ph_data_param {
 	uint8_t link_id;	/*!< \brief Link Identifier (Like RSL) */
 	uint8_t chan_nr;	/*!< \brief Channel Number (Like RSL) */
+	uint32_t fn;		/*!< \brief GSM Frame Number */
+};
+
+/*! \brief for TCH.{req,ind} | TCH-RTS.ind */
+struct ph_tch_param {
+	uint8_t chan_nr;	/*!< \brief Channel Number (Like RSL) */
+	uint32_t fn;		/*!< \brief GSM Frame Number */
 };
 
 /*! \brief for PH-CONN.ind */
@@ -39,14 +60,62 @@
 	uint32_t fn;		/*!< \brief GSM Frame Number */
 };
 
-/*! \brief primitive header for LAPDm PH-SAP primitives */
+/*! \brief for TIME MPH-INFO.ind */
+struct info_time_ind_param {
+	uint32_t fn;		/*!< \brief GSM Frame Number */
+};
+
+/*! \brief for MEAS MPH-INFO.ind */
+struct info_meas_ind_param {
+	uint8_t chan_nr;	/*!< \brief Channel Number (Like RSL) */
+	uint16_t ber10k;	/*!< \brief BER in units of 0.01% */
+	int16_t ta_offs_qbits;	/*!< \brief timing advance offset (in qbits) */
+	int16_t c_i_cb;		/*!< \brief C/I ratio in 0.1 dB */
+	uint8_t is_sub:1;	/*!< \brief flags */
+	uint8_t inv_rssi;	/*!< \brief RSSI in dBm * -1 */
+};
+
+/*! \brief for {ACTIVATE,DEACTIVATE,MODIFY} MPH-INFO.req */
+struct info_act_req_param {
+	uint8_t chan_nr;	/*!< \brief Channel Number (Like RSL) */
+	uint8_t sacch_only;	/*!< \breif Only deactivate SACCH */
+};
+
+/*! \brief for {ACTIVATE,DEACTIVATE} MPH-INFO.cnf */
+struct info_act_cnf_param {
+	uint8_t chan_nr;	/*!< \brief Channel Number (Like RSL) */
+	uint8_t cause;		/*!< \brief RSL cause in case of nack */
+};
+
+/*! \brief for {ACTIVATE,DEACTIVATE} MPH-INFO.{req,cnf} */
+struct info_ciph_req_param {
+	uint8_t chan_nr;	/*!< \brief Channel Number (Like RSL) */
+	uint8_t downlink;	/*!< \brief Apply to downlink */
+	uint8_t uplink;		/*!< \brief Apply to uplink */
+};
+
+/*! \brief for MPH-INFO.ind */
+struct mph_info_param {
+	enum osmo_mph_info_type type; /*!< \brief Info message type */
+	union {
+		struct info_time_ind_param time_ind;
+		struct info_meas_ind_param meas_ind;
+		struct info_act_req_param act_req;
+		struct info_act_cnf_param act_cnf;
+		struct info_ciph_req_param ciph_req;
+	} u;
+};
+
+/*! \brief primitive header for PH-SAP primitives */
 struct osmo_phsap_prim {
 	struct osmo_prim_hdr oph; /*!< \brief generic primitive header */
 	union {
 		struct ph_data_param data;
+		struct ph_tch_param tch;
 		struct ph_rach_req_param rach_req;
 		struct ph_rach_ind_param rach_ind;
 		struct ph_conn_ind_param conn_ind;
+		struct mph_info_param info;
 	} u;			/*!< \brief request-specific data */
 };