aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2019-11-06 17:33:31 +0700
committerlaforge <laforge@osmocom.org>2019-11-19 01:01:45 +0000
commitb37b3263a917aa554f99315e847f5accc470e10b (patch)
tree63a1f7ad18aa79c3c2afe4caf5e1f3905b6ed8fc
parentc693067b7e99a643da673cb3e2a36162cbd0f59c (diff)
osmo-bts-trx: general handling of NOPE / IDLE indications
Each logical channel can now optionally have an additional handler, that will be called when a NOPE / IDLE indication is received from the transceiver. The aim of that handler is to keep the logical channel state updated in case if one or more Uplink bursts are lost. Change-Id: I71c552f44c25e56e9779d8b8ef5d4de9f8475637 Related: OS#3428
-rw-r--r--include/osmo-bts/scheduler_backend.h2
-rw-r--r--src/common/scheduler.c15
-rw-r--r--src/osmo-bts-trx/trx_if.c11
3 files changed, 20 insertions, 8 deletions
diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h
index d7139008..51c957cc 100644
--- a/include/osmo-bts/scheduler_backend.h
+++ b/include/osmo-bts/scheduler_backend.h
@@ -31,6 +31,8 @@ struct trx_chan_desc {
trx_sched_dl_func *dl_fn;
/*! \brief function to call when burst received from PHY */
trx_sched_ul_func *ul_fn;
+ /*! \brief function to call when NOPE.ind received from PHY */
+ trx_sched_ul_func *nope_fn;
/*! \brief channel flags, see TRX_CHAN_FLAG_* */
uint8_t flags;
};
diff --git a/src/common/scheduler.c b/src/common/scheduler.c
index 3adfc498..fe93c32b 100644
--- a/src/common/scheduler.c
+++ b/src/common/scheduler.c
@@ -1349,6 +1349,13 @@ int trx_sched_ul_burst(struct l1sched_trx *l1t, struct trx_ul_burst_ind *bi)
l1cs = &l1ts->chan_state[chan];
func = trx_chan_desc[chan].ul_fn;
+ /* TODO: handle noise measurements */
+ if (chan == TRXC_IDLE && bi->flags & TRX_BI_F_NOPE_IND) {
+ LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,
+ "Rx noise measurement (%d)\n", bi->rssi);
+ return -ENOTSUP;
+ }
+
/* check if channel is active */
if (!TRX_CHAN_IS_ACTIVE(l1cs, chan))
return -EINVAL;
@@ -1364,6 +1371,14 @@ int trx_sched_ul_burst(struct l1sched_trx *l1t, struct trx_ul_burst_ind *bi)
l1cs->last_tdma_fn = bi->fn;
l1cs->proc_tdma_fs++;
+ /* handle NOPE indications (if the handler is present) */
+ if (bi->flags & TRX_BI_F_NOPE_IND) {
+ func = trx_chan_desc[chan].nope_fn;
+ if (!func)
+ return 0;
+ return func(l1t, chan, bid, bi);
+ }
+
/* decrypt */
if (bi->burst_len && l1cs->ul_encr_algo) {
ubit_t ks[114];
diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c
index 920f441f..dbf78058 100644
--- a/src/osmo-bts-trx/trx_if.c
+++ b/src/osmo-bts-trx/trx_if.c
@@ -1018,14 +1018,8 @@ static int trx_data_read_cb(struct osmo_fd *ofd, unsigned int what)
if (hdr_len < 0)
return hdr_len;
- /* TODO: we can use NOPE indications to get noise levels on IDLE
- * TDMA frames, and properly drive scheduler if nothing has been
- * detected on non-IDLE channels. */
- if (bi.flags & TRX_BI_F_NOPE_IND) {
- LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG,
- "IDLE / NOPE indications are not (yet) supported\n");
- return -ENOTSUP;
- }
+ if (bi.flags & TRX_BI_F_NOPE_IND)
+ goto skip_burst;
/* We're done with the header now */
buf_len -= hdr_len;
@@ -1047,6 +1041,7 @@ static int trx_data_read_cb(struct osmo_fd *ofd, unsigned int what)
if (rc < 0)
return rc;
+skip_burst:
/* Print header & burst info */
LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG, "Rx %s (hdr_ver=%u): %s\n",
(bi.flags & TRX_BI_F_NOPE_IND) ? "NOPE.ind" : "UL burst",