Review at  https://gerrit.osmocom.org/6714

host/trxcon/scheduler: implement TX queue handling

Change-Id: I2b7bae53901156524134c4904ea1179268d85601
---
M src/host/trxcon/sched_trx.c
M src/host/trxcon/sched_trx.h
2 files changed, 43 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/14/6714/1

diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c
index 32e6a59..3c5e265 100644
--- a/src/host/trxcon/sched_trx.c
+++ b/src/host/trxcon/sched_trx.c
@@ -48,12 +48,44 @@
 static void sched_frame_clck_cb(struct trx_sched *sched)
 {
        struct trx_instance *trx = (struct trx_instance *) sched->data;
+       const struct trx_frame *frame;
+       trx_lchan_tx_func *handler;
+       struct trx_ts_prim *prim;
+       enum trx_lchan_type chan;
+       uint8_t offset, bid;
+       struct trx_ts *ts;
+       uint32_t fn;
 
        /* If we have no active timeslots, nothing to do */
        if (llist_empty(&trx->ts_list))
                return;
 
-       /* Do nothing for now */
+       /* For each allocated timeslot */
+       llist_for_each_entry(ts, &trx->ts_list, list) {
+               if (llist_empty(&ts->tx_prims))
+                       continue;
+
+               /* Get frame from multiframe */
+               fn = sched->fn_counter_proc;
+               offset = fn % ts->mf_layout->period;
+               frame = ts->mf_layout->frames + offset;
+
+               /* Get required info from frame */
+               bid = frame->ul_bid;
+               chan = frame->ul_chan;
+               handler = trx_lchan_desc[chan].tx_fn;
+
+               /* Omit lchans without handler */
+               if (!handler)
+                       continue;
+
+               /* Get a message from TX queue */
+               prim = llist_entry(ts->tx_prims.next, struct trx_ts_prim, list);
+
+               /* Poke lchan handler */
+               if (prim->chan == chan)
+                       handler(trx, ts, fn, chan, bid, NULL);
+       }
 }
 
 int sched_trx_init(struct trx_instance *trx)
diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h
index 41662e0..809a324 100644
--- a/src/host/trxcon/sched_trx.h
+++ b/src/host/trxcon/sched_trx.h
@@ -230,6 +230,16 @@
        struct llist_head list;
 };
 
+/* Represents one TX primitive in the queue of trx_ts */
+struct trx_ts_prim {
+       /*! \brief Link to queue of TS */
+       struct llist_head list;
+       /*! \brief Logical channel type */
+       enum trx_lchan_type chan;
+       /*! \brief Payload */
+       uint8_t payload[0];
+};
+
 extern const struct trx_lchan_desc trx_lchan_desc[_TRX_CHAN_MAX];
 const struct trx_multiframe *sched_mframe_layout(
        enum gsm_phys_chan_config config, int ts_num);

-- 
To view, visit https://gerrit.osmocom.org/6714
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2b7bae53901156524134c4904ea1179268d85601
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>

Reply via email to