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");
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 */
{
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) {
}
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;
}
/* 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;
/* 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;
}