lchan release in error state: SACCH deact only for SACCH pchans

This is useful particularly in case where we deactivate PDCHs
which don't have a SACCH associated.  The existin code would
always attempt to deactivate a SACCH even in those cases, leading
to the BTS responsding with related error messages.

Change-Id: Iaf46782329b38ba8f3d438e6c75c2d467b852734
This commit is contained in:
Neels Hofmeyr 2016-10-17 01:03:53 +02:00 committed by Harald Welte
parent f788d93382
commit ec16c16193
3 changed files with 17 additions and 2 deletions

View File

@ -891,6 +891,7 @@ static inline uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts)
struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,
int *rc);
enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts);
uint8_t ts_subslots(struct gsm_bts_trx_ts *ts);
bool ts_is_tch(struct gsm_bts_trx_ts *ts);

View File

@ -898,9 +898,23 @@ static int rsl_rf_chan_release(struct gsm_lchan *lchan, int error,
*/
static int rsl_rf_chan_release_err(struct gsm_lchan *lchan)
{
enum sacch_deact sacch_deact;
if (lchan->state != LCHAN_S_ACTIVE)
return 0;
return rsl_rf_chan_release(lchan, 1, SACCH_DEACTIVATE);
switch (ts_pchan(lchan->ts)) {
case GSM_PCHAN_TCH_F:
case GSM_PCHAN_TCH_H:
case GSM_PCHAN_CCCH_SDCCH4:
case GSM_PCHAN_CCCH_SDCCH4_CBCH:
case GSM_PCHAN_SDCCH8_SACCH8C:
case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
sacch_deact = SACCH_DEACTIVATE;
break;
default:
sacch_deact = SACCH_NONE;
break;
}
return rsl_rf_chan_release(lchan, 1, sacch_deact);
}
static int rsl_rx_rf_chan_rel_ack(struct gsm_lchan *lchan)

View File

@ -729,7 +729,7 @@ static const uint8_t subslots_per_pchan[] = {
};
/*! Return the actual pchan type, also heeding dynamic TS. */
static enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts)
enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts)
{
switch (ts->pchan) {
case GSM_PCHAN_TCH_F_TCH_H_PDCH: