diff options
-rw-r--r-- | src/host/trxcon/l1ctl.c | 24 | ||||
-rw-r--r-- | src/host/trxcon/sched_lchan_rach.c | 5 | ||||
-rw-r--r-- | src/host/trxcon/sched_trx.c | 6 |
3 files changed, 20 insertions, 15 deletions
diff --git a/src/host/trxcon/l1ctl.c b/src/host/trxcon/l1ctl.c index 30f43d07..e722624c 100644 --- a/src/host/trxcon/l1ctl.c +++ b/src/host/trxcon/l1ctl.c @@ -512,7 +512,6 @@ static int l1ctl_rx_rach_req(struct l1ctl_link *l1l, struct msgb *msg, bool ext) struct l1ctl_rach_req *req; struct l1ctl_info_ul *ul; struct trx_ts_prim *prim; - uint8_t chan_nr, link_id; size_t len; int rc; @@ -537,25 +536,24 @@ static int l1ctl_rx_rach_req(struct l1ctl_link *l1l, struct msgb *msg, bool ext) "(offset=%u, ra=0x%02x)\n", req->offset, req->ra); } - /** - * FIXME: l1ctl_info_ul doesn't provide channel description - * FIXME: Can we use other than TS0? - */ - chan_nr = RSL_CHAN_RACH; - link_id = 0x00; + /* The controlling L1CTL side always does include the UL info header, + * but may leave it empty. We assume RACH is on TS0 in this case. */ + if (ul->chan_nr == 0x00) { + LOGP(DL1C, LOGL_NOTICE, "The UL info header is empty, " + "assuming RACH is on TS0\n"); + ul->chan_nr = RSL_CHAN_RACH; + } /* Init a new primitive */ - rc = sched_prim_init(l1l->trx, &prim, len, chan_nr, link_id); + rc = sched_prim_init(l1l->trx, &prim, len, ul->chan_nr, ul->link_id); if (rc) goto exit; /** - * Push this primitive to transmit queue - * - * FIXME: what if requested TS is not configured? - * Or what if one (such as TCH) has no TRXC_RACH slots? + * Push this primitive to the transmit queue. + * Indicated timeslot needs to be configured. */ - rc = sched_prim_push(l1l->trx, prim, chan_nr); + rc = sched_prim_push(l1l->trx, prim, ul->chan_nr); if (rc) { talloc_free(prim); goto exit; diff --git a/src/host/trxcon/sched_lchan_rach.c b/src/host/trxcon/sched_lchan_rach.c index 7d202b89..e96a0e6b 100644 --- a/src/host/trxcon/sched_lchan_rach.c +++ b/src/host/trxcon/sched_lchan_rach.c @@ -155,9 +155,10 @@ int tx_rach_fn(struct trx_instance *trx, struct trx_ts *ts, /* BN85-156: tail bits & extended guard period */ memset(burst_ptr, 0, burst + GSM_BURST_LEN - burst_ptr); - LOGP(DSCHD, LOGL_DEBUG, "Transmitting %s RACH (%s) fn=%u\n", + LOGP(DSCHD, LOGL_NOTICE, "Transmitting %s RACH (%s) on fn=%u, tn=%u, lchan=%s\n", PRIM_IS_RACH11(lchan->prim) ? "extended (11-bit)" : "regular (8-bit)", - get_value_string(rach_synch_seq_names, synch_seq), fn); + get_value_string(rach_synch_seq_names, synch_seq), fn, + ts->index, trx_lchan_desc[lchan->type].name); /* Forward burst to scheduler */ rc = sched_trx_handle_tx_burst(trx, ts, lchan, fn, burst); diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c index 62fe8703..37d1acf6 100644 --- a/src/host/trxcon/sched_trx.c +++ b/src/host/trxcon/sched_trx.c @@ -35,6 +35,7 @@ #include <osmocom/core/logging.h> #include <osmocom/core/linuxlist.h> +#include "l1ctl_proto.h" #include "scheduler.h" #include "sched_trx.h" #include "trx_if.h" @@ -116,6 +117,11 @@ static void sched_frame_clck_cb(struct trx_sched *sched) if (lchan->prim == NULL) continue; + /* Handover RACH needs to be handled regardless of the + * current channel type and the associated handler. */ + if (PRIM_IS_RACH(lchan->prim) && lchan->prim->chan != TRXC_RACH) + handler = trx_lchan_desc[TRXC_RACH].tx_fn; + /* Poke lchan handler */ handler(trx, ts, lchan, fn, bid); } |