summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/host/trxcon/l1ctl.c24
-rw-r--r--src/host/trxcon/sched_lchan_rach.c5
-rw-r--r--src/host/trxcon/sched_trx.c6
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);
}