Review at https://gerrit.osmocom.org/6760
host/trxcon/scheduler: pass trx_lchan_state to lchan handlers It's better to pass a trx_lchan_state instance directly from caller to lchan handler instead of passing trx_lchan_type. This way a handler wouldn't need to find lchan itself. Change-Id: I47a40542b03ab31da12b0abb1c263c83662ff018 --- M src/host/trxcon/sched_lchan_desc.c M src/host/trxcon/sched_lchan_rach.c M src/host/trxcon/sched_lchan_sch.c M src/host/trxcon/sched_lchan_xcch.c M src/host/trxcon/sched_trx.c M src/host/trxcon/sched_trx.h 6 files changed, 36 insertions(+), 39 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/60/6760/1 diff --git a/src/host/trxcon/sched_lchan_desc.c b/src/host/trxcon/sched_lchan_desc.c index e3998fa..dee8f6a 100644 --- a/src/host/trxcon/sched_lchan_desc.c +++ b/src/host/trxcon/sched_lchan_desc.c @@ -39,19 +39,19 @@ /* Forward declaration of handlers */ int rx_data_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, uint8_t bid, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, sbit_t *bits, uint16_t nbits, int8_t rssi, float toa); int tx_data_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, uint16_t *nbits); int rx_sch_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, uint8_t bid, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, sbit_t *bits, uint16_t nbits, int8_t rssi, float toa); int tx_rach_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, uint16_t *nbits); const struct trx_lchan_desc trx_lchan_desc[_TRX_CHAN_MAX] = { diff --git a/src/host/trxcon/sched_lchan_rach.c b/src/host/trxcon/sched_lchan_rach.c index 0e8d2e8..6a10ab8 100644 --- a/src/host/trxcon/sched_lchan_rach.c +++ b/src/host/trxcon/sched_lchan_rach.c @@ -58,7 +58,7 @@ /* Obtain a to-be-transmitted RACH burst */ int tx_rach_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, uint16_t *nbits) { struct trx_ts_prim *prim; diff --git a/src/host/trxcon/sched_lchan_sch.c b/src/host/trxcon/sched_lchan_sch.c index 9e854bb..aff8fb6 100644 --- a/src/host/trxcon/sched_lchan_sch.c +++ b/src/host/trxcon/sched_lchan_sch.c @@ -73,7 +73,7 @@ } int rx_sch_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, uint8_t bid, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, sbit_t *bits, uint16_t nbits, int8_t rssi, float toa) { sbit_t payload[2 * 39]; @@ -117,8 +117,8 @@ return -ENOMEM; /* Fill in some downlink info */ - data->chan_nr = trx_lchan_desc[chan].chan_nr | ts->index; - data->link_id = trx_lchan_desc[chan].link_id; + data->chan_nr = trx_lchan_desc[lchan->type].chan_nr | ts->index; + data->link_id = trx_lchan_desc[lchan->type].link_id; data->band_arfcn = htons(trx->band_arfcn); data->frame_nr = htonl(fn); data->rx_level = -rssi; diff --git a/src/host/trxcon/sched_lchan_xcch.c b/src/host/trxcon/sched_lchan_xcch.c index 81bd305..aa95656 100644 --- a/src/host/trxcon/sched_lchan_xcch.c +++ b/src/host/trxcon/sched_lchan_xcch.c @@ -83,26 +83,19 @@ }; int rx_data_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, uint8_t bid, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, sbit_t *bits, uint16_t nbits, int8_t rssi, float toa) { + const struct trx_lchan_desc *lchan_desc; int n_errors, n_bits_total, rc; - struct trx_lchan_state *lchan; uint8_t *rssi_num, *toa_num; float *rssi_sum, *toa_sum; sbit_t *buffer, *offset; uint8_t l2[23], *mask; uint32_t *first_fn; - LOGP(DSCH, LOGL_DEBUG, "Data received on %s: fn=%u ts=%u bid=%u\n", - trx_lchan_desc[chan].name, fn, ts->index, bid); - - /* Find required channel state */ - lchan = sched_trx_find_lchan(ts, chan); - if (lchan == NULL) - return -EINVAL; - /* Set up pointers */ + lchan_desc = &trx_lchan_desc[lchan->type]; first_fn = &lchan->rx_first_fn; mask = &lchan->rx_burst_mask; buffer = lchan->rx_bursts; @@ -111,6 +104,9 @@ rssi_num = &lchan->rssi_num; toa_sum = &lchan->toa_sum; toa_num = &lchan->toa_num; + + LOGP(DSCH, LOGL_DEBUG, "Data received on %s: fn=%u ts=%u bid=%u\n", + lchan_desc->name, fn, ts->index, bid); /* Clear buffer & store frame number of first burst */ if (bid == 0) { @@ -147,7 +143,7 @@ "fn=%u (%u/%u) for %s\n", *first_fn, (*first_fn) % ts->mf_layout->period, ts->mf_layout->period, - trx_lchan_desc[chan].name); + lchan_desc->name); return -1; } @@ -159,7 +155,7 @@ "(%u/%u) for %s\n", *first_fn, (*first_fn) % ts->mf_layout->period, ts->mf_layout->period, - trx_lchan_desc[chan].name); + lchan_desc->name); return rc; } @@ -170,8 +166,8 @@ return -ENOMEM; /* Fill in some downlink info */ - data->chan_nr = trx_lchan_desc[chan].chan_nr | ts->index; - data->link_id = trx_lchan_desc[chan].link_id; + data->chan_nr = lchan_desc->chan_nr | ts->index; + data->link_id = lchan_desc->link_id; data->band_arfcn = htons(trx->band_arfcn); data->frame_nr = htonl(*first_fn); data->rx_level = -(*rssi_sum / *rssi_num); @@ -193,10 +189,10 @@ } int tx_data_fn(struct trx_instance *trx, struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, + struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid, uint16_t *nbits) { - struct trx_lchan_state *lchan; + const struct trx_lchan_desc *lchan_desc; struct trx_ts_prim *prim; struct l1ctl_info_ul *ul; ubit_t burst[GSM_BURST_LEN]; @@ -205,12 +201,8 @@ const uint8_t *tsc; int rc; - /* Find required channel state */ - lchan = sched_trx_find_lchan(ts, chan); - if (lchan == NULL) - return -EINVAL; - /* Set up pointers */ + lchan_desc = &trx_lchan_desc[lchan->type]; mask = &lchan->tx_burst_mask; buffer = lchan->tx_bursts; @@ -262,7 +254,7 @@ *nbits = GSM_BURST_LEN; LOGP(DSCH, LOGL_DEBUG, "Transmitting %s fn=%u ts=%u burst=%u\n", - trx_lchan_desc[chan].name, fn, ts->index, bid); + lchan_desc->name, fn, ts->index, bid); /* Send burst to transceiver */ rc = trx_if_tx_burst(trx, ts->index, fn, 10, burst); diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c index 40d1446..b9f1889 100644 --- a/src/host/trxcon/sched_trx.c +++ b/src/host/trxcon/sched_trx.c @@ -49,6 +49,7 @@ { struct trx_instance *trx = (struct trx_instance *) sched->data; const struct trx_frame *frame; + struct trx_lchan_state *lchan; trx_lchan_tx_func *handler; struct trx_ts_prim *prim; enum trx_lchan_type chan; @@ -86,12 +87,17 @@ if (!handler) continue; + /* Make sure that lchan was allocated and activated */ + lchan = sched_trx_find_lchan(ts, chan); + if (lchan == NULL) + 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); + handler(trx, ts, lchan, fn, bid, NULL); } } @@ -500,7 +506,7 @@ /* Put burst to handler */ if (fn == burst_fn) { /* TODO: decrypt if required */ - handler(trx, ts, fn, chan, bid, bits, nbits, rssi, toa); + handler(trx, ts, lchan, fn, bid, bits, nbits, rssi, toa); } next_frame: diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h index 7ebfa15..f8a8b53 100644 --- a/src/host/trxcon/sched_trx.h +++ b/src/host/trxcon/sched_trx.h @@ -23,6 +23,7 @@ #define MAX_A5_KEY_LEN (128 / 8) /* Forward declaration to avoid mutual include */ +struct trx_lchan_state; struct trx_instance; struct trx_ts; @@ -78,15 +79,13 @@ }; typedef int trx_lchan_rx_func(struct trx_instance *trx, - struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, - uint8_t bid, sbit_t *bits, uint16_t nbits, - int8_t rssi, float toa); + struct trx_ts *ts, struct trx_lchan_state *lchan, + uint32_t fn, uint8_t bid, sbit_t *bits, + uint16_t nbits, int8_t rssi, float toa); typedef int trx_lchan_tx_func(struct trx_instance *trx, - struct trx_ts *ts, - uint32_t fn, enum trx_lchan_type chan, - uint8_t bid, uint16_t *nbits); + struct trx_ts *ts, struct trx_lchan_state *lchan, + uint32_t fn, uint8_t bid, uint16_t *nbits); struct trx_lchan_desc { /*! \brief TRX Channel Type */ -- To view, visit https://gerrit.osmocom.org/6760 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I47a40542b03ab31da12b0abb1c263c83662ff018 Gerrit-PatchSet: 1 Gerrit-Project: osmocom-bb Gerrit-Branch: master Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>