diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-09-06 15:01:26 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-09-09 10:27:04 +0200 |
commit | 923b4bc9a2d70c085d9680ba36e1e5ea9d010977 (patch) | |
tree | bf75c4f518fb3d8d1b327a471fd1719eff5f8370 /Transceiver52M | |
parent | 0d56d75dbb5febd5aa8e9bc29dfb03249a505aa6 (diff) |
Transceiver: Don't stop TRX if pulling from OFF timeslot
BTS may have any timeslot disabled, or may have not yet sent initial
SETSLOT cmd to properly configure the timeslot.
Change-Id: Icf62e5d1200c7a440f255bb46023cdbf61532b7f
Diffstat (limited to 'Transceiver52M')
-rw-r--r-- | Transceiver52M/Transceiver.cpp | 24 | ||||
-rw-r--r-- | Transceiver52M/Transceiver.h | 2 |
2 files changed, 17 insertions, 9 deletions
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index 3901997..2f4018c 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -587,9 +587,11 @@ void writeToFile(radioVector *radio_burst, size_t chan) /* * Pull bursts from the FIFO and handle according to the slot * and burst correlation type. Equalzation is currently disabled. - * returns true on success (bi filled), false on error (bi content undefined). + * returns 0 on success (bi filled), negative on error (bi content undefined): + * -ENOENT: timeslot is off (fn and tn in bi are filled), + * -EIO: read error */ -bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi) +int Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi) { int rc; struct estim_burst_params ebp; @@ -605,7 +607,7 @@ bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi) radioVector *radio_burst = mReceiveFIFO[chan]->read(); if (!radio_burst) { LOGCHAN(chan, DMAIN, ERROR) << "ReceiveFIFO->read() returned no burst"; - return false; + return -EIO; } /* Set time and determine correlation type */ @@ -635,7 +637,7 @@ bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi) * Not even power level or noise calculation. */ if (type == OFF) { delete radio_burst; - return false; + return -ENOENT; } /* Select the diversity channel with highest energy */ @@ -702,12 +704,12 @@ bool Transceiver::pullRadioVector(size_t chan, struct trx_ul_burst_ind *bi) delete rxBurst; delete radio_burst; - return true; + return 0; ret_idle: bi->idle = true; delete radio_burst; - return true; + return 0; } void Transceiver::reset() @@ -1032,9 +1034,15 @@ void Transceiver::logRxBurst(size_t chan, const struct trx_ul_burst_ind *bi) bool Transceiver::driveReceiveFIFO(size_t chan) { struct trx_ul_burst_ind bi; + int rc; - if (!pullRadioVector(chan, &bi)) - return false; + if ((rc = pullRadioVector(chan, &bi)) < 0) { + if (rc == -ENOENT) { /* timeslot off, continue processing */ + LOGCHAN(chan, DMAIN, DEBUG) << unsigned(bi.tn) << ":" << bi.fn << " timeslot is off"; + return true; + } + return false; /* other errors: we want to stop the process */ + } if (!bi.idle) logRxBurst(chan, &bi); diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h index 0d09854..30f6a60 100644 --- a/Transceiver52M/Transceiver.h +++ b/Transceiver52M/Transceiver.h @@ -182,7 +182,7 @@ private: void pushRadioVector(GSM::Time &nowTime); /** Pull and demodulate a burst from the receive FIFO */ - bool pullRadioVector(size_t chan, struct trx_ul_burst_ind *ind); + int pullRadioVector(size_t chan, struct trx_ul_burst_ind *ind); /** Set modulus for specific timeslot */ void setModulus(size_t timeslot, size_t chan); |