L1: don't hexdump every packet we receive from L1CTL to console
[osmocom-bb.git] / src / target / firmware / layer1 / l23_api.c
index e1c3591..d37d18d 100644 (file)
@@ -79,14 +79,12 @@ static enum mframe_task chan_nr2mf_task(uint8_t chan_nr)
        return 0;
 }
 
-struct msgb *l1_create_l2_msg(int msg_type, uint32_t fn, uint16_t snr,
-                             uint16_t arfcn)
+struct msgb *l1ctl_msgb_alloc(uint8_t msg_type)
 {
-       struct l1ctl_hdr *l1h;
-       struct l1ctl_info_dl *dl;
        struct msgb *msg;
+       struct l1ctl_hdr *l1h;
 
-       msg = msgb_alloc_headroom(L3_MSG_SIZE, L3_MSG_HEAD, "l1_burst");
+       msg = msgb_alloc_headroom(L3_MSG_SIZE, L3_MSG_HEAD, "l1ctl");
        if (!msg) {
                while (1) {
                        puts("OOPS. Out of buffers...\n");
@@ -94,24 +92,50 @@ struct msgb *l1_create_l2_msg(int msg_type, uint32_t fn, uint16_t snr,
 
                return NULL;
        }
-
        l1h = (struct l1ctl_hdr *) msgb_put(msg, sizeof(*l1h));
        l1h->msg_type = msg_type;
+       l1h->flags = 0;
+
+       msg->l1h = l1h;
+
+       return msg;
+}
+
+struct msgb *l1_create_l2_msg(int msg_type, uint32_t fn, uint16_t snr,
+                             uint16_t arfcn)
+{
+       struct l1ctl_info_dl *dl;
+       struct msgb *msg = l1ctl_msgb_alloc(msg_type);
 
        dl = (struct l1ctl_info_dl *) msgb_put(msg, sizeof(*dl));
        dl->frame_nr = htonl(fn);
        dl->snr = snr;
-       dl->band_arfcn = arfcn;
+       dl->band_arfcn = htons(arfcn);
 
        return msg;
 }
 
+/* receive a L1CTL_PM_REQ from L23 */
 void l1ctl_rx_pm_req(struct msgb *msg)
 {
        struct l1ctl_hdr *l1h = (struct l1ctl_hdr *) msg->data;
        struct l1ctl_pm_req *pm_req = (struct l1ctl_pm_req *) l1h->data;
 
-       /* FIXME */
+       switch (pm_req->type) {
+       case 1:
+               l1s.pm.mode = 1;
+               l1s.pm.range.arfcn_start =
+                               ntohs(pm_req->range.band_arfcn_from);
+               l1s.pm.range.arfcn_next =
+                               ntohs(pm_req->range.band_arfcn_from);
+               l1s.pm.range.arfcn_end =
+                               ntohs(pm_req->range.band_arfcn_to);
+               printf("L1CTL_PM_REQ start=%u end=%u\n",
+                       l1s.pm.range.arfcn_start, l1s.pm.range.arfcn_end);
+               break;
+       }
+
+       l1s_pm_test(1, l1s.pm.range.arfcn_next);
 }
 
 /* callback from SERCOMM when L2 sends a message to L1 */
@@ -119,20 +143,20 @@ static void l1a_l23_rx_cb(uint8_t dlci, struct msgb *msg)
 {
        struct l1ctl_hdr *l1h = (struct l1ctl_hdr *) msg->data;
        struct l1ctl_info_ul *ul = (struct l1ctl_info_ul *) l1h->data;
-       struct l1ctl_sync_new_ccch_req *sync_req;
+       struct l1ctl_fbsb_req *sync_req;
        struct l1ctl_rach_req *rach_req;
        struct l1ctl_dm_est_req *est_req;
        struct l1ctl_data_ind *data_ind;
        struct llist_head *tx_queue;
-
+#if 0
        {
                int i;
-               puts("l1a_l23_rx_cb: ");
+               printf("l1a_l23_rx_cb (%u): ", msg->len);
                for (i = 0; i < msg->len; i++)
                        printf("%02x ", msg->data[i]);
                puts("\n");
        }
-
+#endif
        msg->l1h = msg->data;
 
        if (sizeof(*l1h) > msg->len) {
@@ -141,31 +165,31 @@ static void l1a_l23_rx_cb(uint8_t dlci, struct msgb *msg)
        }
 
        switch (l1h->msg_type) {
-       case L1CTL_NEW_CCCH_REQ:
+       case L1CTL_FBSB_REQ:
                if (sizeof(*sync_req) > msg->len) {
                        printf("Short sync msg. %u\n", msg->len);
                        break;
                }
 
-               sync_req = (struct l1ctl_sync_new_ccch_req *) l1h->data;
-               printd("L1CTL_DM_EST_REQ (arfcn=%u)\n", sync_req->band_arfcn);
+               sync_req = (struct l1ctl_fbsb_req *) l1h->data;
+               printd("L1CTL_FBSB_REQ (arfcn=%u, flags=0x%x)\n",
+                       ntohs(sync_req->band_arfcn), sync_req->flags);
 
                /* reset scheduler and hardware */
-               tdma_sched_reset();
-               l1s_dsp_abort();
+               l1s_reset();
 
                /* tune to specified frequency */
-               trf6151_rx_window(0, sync_req->band_arfcn, 40, 0);
+               trf6151_rx_window(0, ntohs(sync_req->band_arfcn), 40, 0);
                tpu_end_scenario();
 
                printd("Starting FCCH Recognition\n");
-               l1s_fb_test(1, 0);
+               l1s_fbsb_req(1, sync_req);
                break;
        case L1CTL_DM_EST_REQ:
                est_req = (struct l1ctl_dm_est_req *) ul->payload;
                printd("L1CTL_DM_EST_REQ (arfcn=%u, chan_nr=0x%02x)\n",
-                       est_req->band_arfcn, ul->chan_nr);
-               if (est_req->band_arfcn != l1s.serving_cell.arfcn) {
+                       ntohs(est_req->band_arfcn), ul->chan_nr);
+               if (ntohs(est_req->band_arfcn) != l1s.serving_cell.arfcn) {
                        /* FIXME: ARFCN */
                        puts("We don't support ARFCN switches yet\n");
                        break;
@@ -181,7 +205,7 @@ static void l1a_l23_rx_cb(uint8_t dlci, struct msgb *msg)
                }
                /* FIXME: set TSC of ded chan according to est_req.h0.tsc */
                /* figure out which MF tasks to enable */
-               l1s.mf_tasks = (1 << chan_nr2mf_task(ul->chan_nr));
+               l1a_mftask_set(1 << chan_nr2mf_task(ul->chan_nr));
                break;
        case L1CTL_RACH_REQ:
                rach_req = (struct l1ctl_rach_req *) ul->payload;
@@ -202,7 +226,6 @@ static void l1a_l23_rx_cb(uint8_t dlci, struct msgb *msg)
                /* we have to keep the msgb, not free it! */
                goto exit_nofree;
        case L1CTL_PM_REQ:
-               printd("L1CTL_PM_REQ\n");
                l1ctl_rx_pm_req(msg);
                break;
        }