dyn TS: fix: ts_subslots() for TCH/F_PDCH in PDCH mode
In gsm_data_shared.c, add ts_pchan() to determine actual pchan type for dynamic and non-dynamic TS. Use in ts_subslots() to fix the value returned for TCH/F_PDCH in PDCH mode. Adjust the assertion in channel_test.c accordingly. Drop GSM_PCHAN_TCH_F_PDCH, which is now handled in ts_pchan(). Explicitly add GSM_PCHAN_PDCH as zero in subslots_per_pchan[] (cosmetic). Adjust the comment in subslots_per_pchan[]. The fix for the number of subslots affects only one caller: bts_chan_load() in chan_alloc.c. Before this, it would always include a TCH/F_PDCH in the load_counter->total, now it is skipped when in PDCH mode. Whether this is the way bts_chan_load() should handle dynamic TS is a separate discussion, so far I'm only making sure that the two dyn TS kinds act in the same way: TCH/F_TCH/H_PDCH is only counted when in TCH mode, and TCH/F_PDCH should match. Change-Id: Icd6668667ad2be7ad20866ffd185bf3b8711ccd6
This commit is contained in:
parent
2afffd5cf6
commit
c3f72f63af
|
@ -712,24 +712,38 @@ struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,
|
||||||
static const uint8_t subslots_per_pchan[] = {
|
static const uint8_t subslots_per_pchan[] = {
|
||||||
[GSM_PCHAN_NONE] = 0,
|
[GSM_PCHAN_NONE] = 0,
|
||||||
[GSM_PCHAN_CCCH] = 0,
|
[GSM_PCHAN_CCCH] = 0,
|
||||||
|
[GSM_PCHAN_PDCH] = 0,
|
||||||
[GSM_PCHAN_CCCH_SDCCH4] = 4,
|
[GSM_PCHAN_CCCH_SDCCH4] = 4,
|
||||||
[GSM_PCHAN_TCH_F] = 1,
|
[GSM_PCHAN_TCH_F] = 1,
|
||||||
[GSM_PCHAN_TCH_H] = 2,
|
[GSM_PCHAN_TCH_H] = 2,
|
||||||
[GSM_PCHAN_SDCCH8_SACCH8C] = 8,
|
[GSM_PCHAN_SDCCH8_SACCH8C] = 8,
|
||||||
[GSM_PCHAN_TCH_F_PDCH] = 1,
|
|
||||||
[GSM_PCHAN_CCCH_SDCCH4_CBCH] = 4,
|
[GSM_PCHAN_CCCH_SDCCH4_CBCH] = 4,
|
||||||
[GSM_PCHAN_SDCCH8_SACCH8C_CBCH] = 8,
|
[GSM_PCHAN_SDCCH8_SACCH8C_CBCH] = 8,
|
||||||
/*
|
/*
|
||||||
* GSM_PCHAN_TCH_F_TCH_H_PDCH should not be part of this, those TS are
|
* GSM_PCHAN_TCH_F_PDCH and GSM_PCHAN_TCH_F_TCH_H_PDCH should not be
|
||||||
* handled according to their ts->dyn state.
|
* part of this, those TS are handled according to their dynamic state.
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*! Return the actual pchan type, also heeding dynamic TS. */
|
||||||
|
static enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts)
|
||||||
|
{
|
||||||
|
switch (ts->pchan) {
|
||||||
|
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
|
||||||
|
return ts->dyn.pchan_is;
|
||||||
|
case GSM_PCHAN_TCH_F_PDCH:
|
||||||
|
if (ts->flags & TS_F_PDCH_ACTIVE)
|
||||||
|
return GSM_PCHAN_PDCH;
|
||||||
|
else
|
||||||
|
return GSM_PCHAN_TCH_F;
|
||||||
|
default:
|
||||||
|
return ts->pchan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*! According to ts->pchan and possibly ts->dyn_pchan, return the number of
|
/*! According to ts->pchan and possibly ts->dyn_pchan, return the number of
|
||||||
* logical channels available in the timeslot. */
|
* logical channels available in the timeslot. */
|
||||||
uint8_t ts_subslots(struct gsm_bts_trx_ts *ts)
|
uint8_t ts_subslots(struct gsm_bts_trx_ts *ts)
|
||||||
{
|
{
|
||||||
if (ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH)
|
return subslots_per_pchan[ts_pchan(ts)];
|
||||||
return subslots_per_pchan[ts->dyn.pchan_is];
|
|
||||||
return subslots_per_pchan[ts->pchan];
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,7 +109,7 @@ void test_dyn_ts_subslots(void)
|
||||||
ts.flags = 0; /* TCH_F mode */
|
ts.flags = 0; /* TCH_F mode */
|
||||||
OSMO_ASSERT(ts_subslots(&ts) == 1);
|
OSMO_ASSERT(ts_subslots(&ts) == 1);
|
||||||
ts.flags = TS_F_PDCH_ACTIVE;
|
ts.flags = TS_F_PDCH_ACTIVE;
|
||||||
OSMO_ASSERT(ts_subslots(&ts) == 1 /* SHOULD BE 0 */);
|
OSMO_ASSERT(ts_subslots(&ts) == 0);
|
||||||
|
|
||||||
ts.pchan = GSM_PCHAN_TCH_F_TCH_H_PDCH;
|
ts.pchan = GSM_PCHAN_TCH_F_TCH_H_PDCH;
|
||||||
ts.dyn.pchan_is = GSM_PCHAN_TCH_F;
|
ts.dyn.pchan_is = GSM_PCHAN_TCH_F;
|
||||||
|
|
Loading…
Reference in New Issue