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:
parent
f788d93382
commit
ec16c16193
|
@ -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,
|
struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,
|
||||||
int *rc);
|
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);
|
uint8_t ts_subslots(struct gsm_bts_trx_ts *ts);
|
||||||
bool ts_is_tch(struct gsm_bts_trx_ts *ts);
|
bool ts_is_tch(struct gsm_bts_trx_ts *ts);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
static int rsl_rf_chan_release_err(struct gsm_lchan *lchan)
|
||||||
{
|
{
|
||||||
|
enum sacch_deact sacch_deact;
|
||||||
if (lchan->state != LCHAN_S_ACTIVE)
|
if (lchan->state != LCHAN_S_ACTIVE)
|
||||||
return 0;
|
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)
|
static int rsl_rx_rf_chan_rel_ack(struct gsm_lchan *lchan)
|
||||||
|
|
|
@ -729,7 +729,7 @@ static const uint8_t subslots_per_pchan[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! Return the actual pchan type, also heeding dynamic TS. */
|
/*! 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) {
|
switch (ts->pchan) {
|
||||||
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
|
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
|
||||||
|
|
Loading…
Reference in New Issue