diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2016-06-16 17:22:50 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2016-06-17 15:50:47 +0000 |
commit | f8bf95fa6b9ae881b498a3ea08feb8f1bae9c6c7 (patch) | |
tree | 4b3d84ba5662eed4b1c375e1ba5d19470217af85 /src | |
parent | e6cc04827a5591cf70ac9ed724140158876cb645 (diff) |
dyn PDCH: pcu_tx_info_ind(): handle TCH/F_PDCH in PDCH mode
Introduce a static function to encapsulate the decision whether a TS is
used for PDCH. Depending on the ts->flags, handle a TCH/F_PDCH TS exactly like
a standard PDCH TS.
Change-Id: Ic72fd06ecc99609823efa3edcf773007cc514b5b
Diffstat (limited to 'src')
-rw-r--r-- | src/common/pcu_sock.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c index ea4267de..cfffb2e6 100644 --- a/src/common/pcu_sock.c +++ b/src/common/pcu_sock.c @@ -95,6 +95,24 @@ struct msgb *pcu_msgb_alloc(uint8_t msg_type, uint8_t bts_nr) return msg; } +static bool ts_is_pdch(struct gsm_bts_trx_ts *ts) { + if (ts->pchan == GSM_PCHAN_PDCH) + return true; + if (ts->pchan == GSM_PCHAN_TCH_F_PDCH) { + /* When we're busy deactivating the PDCH, we first set + * DEACT_PENDING, tell the PCU about it and wait for a + * response. So DEACT_PENDING means "no PDCH" to the PCU. + * Similarly, when we're activating PDCH, we set the + * ACT_PENDING and wait for an activation response from the + * PCU, so ACT_PENDING means "is PDCH". */ + if (ts->flags & TS_F_PDCH_ACTIVE) + return !(ts->flags & TS_F_PDCH_DEACT_PENDING); + else + return (ts->flags & TS_F_PDCH_ACT_PENDING); + } + return false; +} + int pcu_tx_info_ind(void) { struct gsm_network *net = &bts_gsmnet; @@ -207,7 +225,7 @@ int pcu_tx_info_ind(void) for (j = 0; j < 8; j++) { ts = &trx->ts[j]; if (ts->mo.nm_state.operational == NM_OPSTATE_ENABLED - && ts->pchan == GSM_PCHAN_PDCH) { + && ts_is_pdch(ts)) { info_ind->trx[i].pdch_mask |= (1 << j); info_ind->trx[i].tsc[j] = (ts->tsc >= 0) ? ts->tsc : bts->bsic & 7; |