l1ctl: Add initial tch_mode value in DM_EST_REQ
[osmocom-bb.git] / src / host / layer23 / src / common / l1ctl.c
index 86ff59b..e59e525 100644 (file)
@@ -87,8 +87,8 @@ static int rx_l1_fbsb_conf(struct osmocom_ms *ms, struct msgb *msg)
        dl = (struct l1ctl_info_dl *) msg->l1h;
        sb = (struct l1ctl_fbsb_conf *) dl->payload;
 
-       printf("snr=%04x, arfcn=%u result=%u\n", dl->snr, ntohs(dl->band_arfcn),
-               sb->result);
+       LOGP(DL1C, LOGL_INFO, "snr=%04x, arfcn=%u result=%u\n", dl->snr,
+               ntohs(dl->band_arfcn), sb->result);
 
        if (sb->result != 0) {
                LOGP(DL1C, LOGL_ERROR, "FBSB RESP: result=%u\n", sb->result);
@@ -260,7 +260,7 @@ int l1ctl_tx_fbsb_req(struct osmocom_ms *ms, uint16_t arfcn,
        struct msgb *msg;
        struct l1ctl_fbsb_req *req;
 
-       printf("Sync Req\n");
+       LOGP(DL1C, LOGL_INFO, "Sync Req\n");
 
        msg = osmo_l1_alloc(L1CTL_FBSB_REQ);
        if (!msg)
@@ -290,7 +290,7 @@ int l1ctl_tx_ccch_mode_req(struct osmocom_ms *ms, uint8_t ccch_mode)
        struct msgb *msg;
        struct l1ctl_ccch_mode_req *req;
 
-       printf("CCCH Mode Req\n");
+       LOGP(DL1C, LOGL_INFO, "CCCH Mode Req\n");
 
        msg = osmo_l1_alloc(L1CTL_CCCH_MODE_REQ);
        if (!msg)
@@ -302,6 +302,24 @@ int l1ctl_tx_ccch_mode_req(struct osmocom_ms *ms, uint8_t ccch_mode)
        return osmo_send_l1(ms, msg);
 }
 
+/* Transmit L1CTL_TCH_MODE_REQ */
+int l1ctl_tx_tch_mode_req(struct osmocom_ms *ms, uint8_t tch_mode)
+{
+       struct msgb *msg;
+       struct l1ctl_tch_mode_req *req;
+
+       LOGP(DL1C, LOGL_INFO, "TCH Mode Req\n");
+
+       msg = osmo_l1_alloc(L1CTL_TCH_MODE_REQ);
+       if (!msg)
+               return -1;
+
+       req = (struct l1ctl_tch_mode_req *) msgb_put(msg, sizeof(*req));
+       req->tch_mode = tch_mode;
+
+       return osmo_send_l1(ms, msg);
+}
+
 /* Transmit L1CTL_PARAM_REQ */
 int l1ctl_tx_param_req(struct osmocom_ms *ms, uint8_t ta, uint8_t tx_power)
 {
@@ -368,7 +386,7 @@ int l1ctl_tx_rach_req(struct osmocom_ms *ms, uint8_t ra, uint8_t fn51,
 
 /* Transmit L1CTL_DM_EST_REQ */
 int l1ctl_tx_dm_est_req_h0(struct osmocom_ms *ms, uint16_t band_arfcn,
-                           uint8_t chan_nr, uint8_t tsc)
+                           uint8_t chan_nr, uint8_t tsc, uint8_t tch_mode)
 {
        struct msgb *msg;
        struct l1ctl_info_ul *ul;
@@ -378,8 +396,8 @@ int l1ctl_tx_dm_est_req_h0(struct osmocom_ms *ms, uint16_t band_arfcn,
        if (!msg)
                return -1;
 
-       printf("Tx Dedic.Mode Est Req (arfcn=%u, chan_nr=0x%02x)\n",
-               band_arfcn, chan_nr);
+       LOGP(DL1C, LOGL_INFO, "Tx Dedic.Mode Est Req (arfcn=%u, "
+               "chan_nr=0x%02x)\n", band_arfcn, chan_nr);
 
        memset(&ms->meas, 0, sizeof(ms->meas));
 
@@ -391,13 +409,14 @@ int l1ctl_tx_dm_est_req_h0(struct osmocom_ms *ms, uint16_t band_arfcn,
        req->tsc = tsc;
        req->h = 0;
        req->h0.band_arfcn = htons(band_arfcn);
+       req->tch_mode = tch_mode;
 
        return osmo_send_l1(ms, msg);
 }
 
 int l1ctl_tx_dm_est_req_h1(struct osmocom_ms *ms, uint8_t maio, uint8_t hsn,
                            uint16_t *ma, uint8_t ma_len,
-                           uint8_t chan_nr, uint8_t tsc)
+                           uint8_t chan_nr, uint8_t tsc, uint8_t tch_mode)
 {
        struct msgb *msg;
        struct l1ctl_info_ul *ul;
@@ -408,7 +427,7 @@ int l1ctl_tx_dm_est_req_h1(struct osmocom_ms *ms, uint8_t maio, uint8_t hsn,
        if (!msg)
                return -1;
 
-       printf("Tx Dedic.Mode Est Req (maio=%u, hsn=%u, "
+       LOGP(DL1C, LOGL_INFO, "Tx Dedic.Mode Est Req (maio=%u, hsn=%u, "
                "chan_nr=0x%02x)\n", maio, hsn, chan_nr);
 
        memset(&ms->meas, 0, sizeof(ms->meas));
@@ -425,6 +444,7 @@ int l1ctl_tx_dm_est_req_h1(struct osmocom_ms *ms, uint8_t maio, uint8_t hsn,
        req->h1.n = ma_len;
        for (i = 0; i < ma_len; i++)
                req->h1.ma[i] = htons(ma[i]);
+       req->tch_mode = tch_mode;
 
        return osmo_send_l1(ms, msg);
 }
@@ -441,7 +461,7 @@ int l1ctl_tx_dm_freq_req_h0(struct osmocom_ms *ms, uint16_t band_arfcn,
        if (!msg)
                return -1;
 
-       printf("Tx Dedic.Mode Freq Req (arfcn=%u, fn=%d)\n",
+       LOGP(DL1C, LOGL_INFO, "Tx Dedic.Mode Freq Req (arfcn=%u, fn=%d)\n",
                band_arfcn, fn);
 
        ul = (struct l1ctl_info_ul *) msgb_put(msg, sizeof(*ul));
@@ -470,7 +490,7 @@ int l1ctl_tx_dm_freq_req_h1(struct osmocom_ms *ms, uint8_t maio, uint8_t hsn,
        if (!msg)
                return -1;
 
-       printf("Tx Dedic.Mode Freq Req (maio=%u, hsn=%u, "
+       LOGP(DL1C, LOGL_INFO, "Tx Dedic.Mode Freq Req (maio=%u, hsn=%u, "
                "fn=%d)\n", maio, hsn, fn);
 
        ul = (struct l1ctl_info_ul *) msgb_put(msg, sizeof(*ul));
@@ -500,7 +520,7 @@ int l1ctl_tx_dm_rel_req(struct osmocom_ms *ms)
        if (!msg)
                return -1;
 
-       printf("Tx Dedic.Mode Rel Req\n");
+       LOGP(DL1C, LOGL_INFO, "Tx Dedic.Mode Rel Req\n");
 
        memset(&ms->meas, 0, sizeof(ms->meas));
 
@@ -547,7 +567,7 @@ static int rx_l1_sim_conf(struct osmocom_ms *ms, struct msgb *msg)
        uint16_t len = msg->len - sizeof(struct l1ctl_hdr);
        uint8_t *data = msg->data + sizeof(struct l1ctl_hdr);
        
-       printf("SIM %s\n", hexdump(data, len));
+       LOGP(DL1C, LOGL_INFO, "SIM %s\n", hexdump(data, len));
        
        /* pull the L1 header from the msgb */
        msgb_pull(msg, sizeof(struct l1ctl_hdr));
@@ -569,7 +589,7 @@ int l1ctl_tx_pm_req_range(struct osmocom_ms *ms, uint16_t arfcn_from,
        if (!msg)
                return -1;
 
-       printf("Tx PM Req (%u-%u)\n", arfcn_from, arfcn_to);
+       LOGP(DL1C, LOGL_INFO, "Tx PM Req (%u-%u)\n", arfcn_from, arfcn_to);
        pm = (struct l1ctl_pm_req *) msgb_put(msg, sizeof(*pm));
        pm->type = 1;
        pm->range.band_arfcn_from = htons(arfcn_from);
@@ -588,7 +608,7 @@ int l1ctl_tx_reset_req(struct osmocom_ms *ms, uint8_t type)
        if (!msg)
                return -1;
 
-       printf("Tx Reset Req (%u)\n", type);
+       LOGP(DL1C, LOGL_INFO, "Tx Reset Req (%u)\n", type);
        res = (struct l1ctl_reset *) msgb_put(msg, sizeof(*res));
        res->type = type;
 
@@ -598,7 +618,7 @@ int l1ctl_tx_reset_req(struct osmocom_ms *ms, uint8_t type)
 /* Receive L1CTL_RESET_IND */
 static int rx_l1_reset(struct osmocom_ms *ms)
 {
-       printf("Layer1 Reset indication\n");
+       LOGP(DL1C, LOGL_INFO, "Layer1 Reset indication\n");
        dispatch_signal(SS_L1CTL, S_L1CTL_RESET, ms);
 
        return 0;
@@ -622,21 +642,21 @@ static int rx_l1_pm_conf(struct osmocom_ms *ms, struct msgb *msg)
        return 0;
 }
 
-/* Receive L1CTL_MODE_CONF */
+/* Receive L1CTL_CCCH_MODE_CONF */
 static int rx_l1_ccch_mode_conf(struct osmocom_ms *ms, struct msgb *msg)
 {
        struct osmobb_ccch_mode_conf mc;
        struct l1ctl_ccch_mode_conf *conf;
 
        if (msgb_l3len(msg) < sizeof(*conf)) {
-               LOGP(DL1C, LOGL_ERROR, "MODE CONF: MSG too short %u\n",
+               LOGP(DL1C, LOGL_ERROR, "CCCH MODE CONF: MSG too short %u\n",
                        msgb_l3len(msg));
                return -1;
        }
 
        conf = (struct l1ctl_ccch_mode_conf *) msg->l1h;
 
-       printf("mode=%u\n", conf->ccch_mode);
+       LOGP(DL1C, LOGL_INFO, "CCCH MODE CONF: mode=%u\n", conf->ccch_mode);
 
        mc.ccch_mode = conf->ccch_mode;
        mc.ms = ms;
@@ -645,6 +665,29 @@ static int rx_l1_ccch_mode_conf(struct osmocom_ms *ms, struct msgb *msg)
        return 0;
 }
 
+/* Receive L1CTL_TCH_MODE_CONF */
+static int rx_l1_tch_mode_conf(struct osmocom_ms *ms, struct msgb *msg)
+{
+       struct osmobb_tch_mode_conf mc;
+       struct l1ctl_tch_mode_conf *conf;
+
+       if (msgb_l3len(msg) < sizeof(*conf)) {
+               LOGP(DL1C, LOGL_ERROR, "TCH MODE CONF: MSG too short %u\n",
+                       msgb_l3len(msg));
+               return -1;
+       }
+
+       conf = (struct l1ctl_tch_mode_conf *) msg->l1h;
+
+       LOGP(DL1C, LOGL_INFO, "TCH MODE CONF: mode=%u\n", conf->tch_mode);
+
+       mc.tch_mode = conf->tch_mode;
+       mc.ms = ms;
+       dispatch_signal(SS_L1CTL, S_L1CTL_TCH_MODE_CONF, &mc);
+
+       return 0;
+}
+
 /* Receive incoming data from L1 using L1CTL format */
 int l1ctl_recv(struct osmocom_ms *ms, struct msgb *msg)
 {
@@ -694,11 +737,15 @@ int l1ctl_recv(struct osmocom_ms *ms, struct msgb *msg)
                rc = rx_l1_ccch_mode_conf(ms, msg);
                msgb_free(msg);
                break;
+       case L1CTL_TCH_MODE_CONF:
+               rc = rx_l1_tch_mode_conf(ms, msg);
+               msgb_free(msg);
+               break;
        case L1CTL_SIM_CONF:
                rc = rx_l1_sim_conf(ms, msg);
                break;
        default:
-               fprintf(stderr, "Unknown MSG: %u\n", l1h->msg_type);
+               LOGP(DL1C, LOGL_ERROR, "Unknown MSG: %u\n", l1h->msg_type);
                msgb_free(msg);
                break;
        }