pcuif: Improve BTS-supported CS/MCS handling
Take into account the MCS values supported by the BTS. In osmo-bts, in general all MCS are enabled if "mode egprs" is selected in BSC, and none otherwise. Change-Id: Ie8f0215ba17da1e545e98bec9325c02f1e8efaea
This commit is contained in:
parent
46fd7a0316
commit
d87722d03c
|
@ -210,7 +210,7 @@ static void bts_init(struct gprs_rlcmac_bts *bts, BTS* bts_obj)
|
|||
bts->fc_interval = 1;
|
||||
bts->initial_cs_dl = bts->initial_cs_ul = 1;
|
||||
bts->initial_mcs_dl = bts->initial_mcs_ul = 1;
|
||||
bts->cs1 = 1;
|
||||
bts->cs_mask = 1 << 0; /* CS-1 always enabled by default */
|
||||
bts->n3101 = 10;
|
||||
bts->n3103 = 4;
|
||||
bts->n3105 = 8;
|
||||
|
|
|
@ -110,10 +110,8 @@ struct gprs_rlcmac_bts {
|
|||
uint32_t fc_bvc_leak_rate;
|
||||
uint32_t fc_ms_bucket_size;
|
||||
uint32_t fc_ms_leak_rate;
|
||||
uint8_t cs1;
|
||||
uint8_t cs2;
|
||||
uint8_t cs3;
|
||||
uint8_t cs4;
|
||||
uint8_t cs_mask; /* Allowed CS mask from BTS */
|
||||
uint16_t mcs_mask; /* Allowed MCS mask from BTS */
|
||||
uint8_t initial_cs_dl, initial_cs_ul;
|
||||
uint8_t initial_mcs_dl, initial_mcs_ul;
|
||||
uint8_t max_cs_dl, max_cs_ul;
|
||||
|
|
|
@ -738,40 +738,49 @@ static int get_and_reset_measured_leak_rate(int *usage_by_1000, unsigned num_pdc
|
|||
|
||||
static enum CodingScheme max_coding_scheme_dl(struct gprs_rlcmac_bts *bts)
|
||||
{
|
||||
int num;
|
||||
int num = 0;
|
||||
int i;
|
||||
|
||||
if (bts->egprs_enabled) {
|
||||
if (!bts->cs_adj_enabled) {
|
||||
if (bts->initial_mcs_dl)
|
||||
if (bts->initial_mcs_dl) {
|
||||
num = bts->initial_mcs_dl;
|
||||
else
|
||||
num = 1;
|
||||
} else {
|
||||
for (i = 8; i >= 0; i--) {
|
||||
if (bts->mcs_mask & (1 << i)) {
|
||||
num = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (bts->max_mcs_dl) {
|
||||
num = bts->max_mcs_dl;
|
||||
} else {
|
||||
num = 9;
|
||||
}
|
||||
|
||||
return mcs_get_egprs_by_num(num);
|
||||
if (num)
|
||||
return mcs_get_egprs_by_num(num);
|
||||
}
|
||||
|
||||
if (!bts->cs_adj_enabled) {
|
||||
if (bts->initial_cs_dl)
|
||||
if (bts->initial_cs_dl) {
|
||||
num = bts->initial_cs_dl;
|
||||
else if (bts->cs4)
|
||||
num = 4;
|
||||
else if (bts->cs3)
|
||||
num = 3;
|
||||
else if (bts->cs2)
|
||||
num = 2;
|
||||
else
|
||||
num = 1;
|
||||
} else {
|
||||
for (i = 3; i >= 0; i--) {
|
||||
if (bts->cs_mask & (1 << i)) {
|
||||
num = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (bts->max_cs_dl) {
|
||||
num = bts->max_cs_dl;
|
||||
} else {
|
||||
num = 4;
|
||||
}
|
||||
|
||||
if (!num)
|
||||
num = 4;
|
||||
|
||||
return mcs_get_gprs_by_num(num);
|
||||
}
|
||||
|
||||
|
|
|
@ -551,7 +551,7 @@ static int pcu_rx_info_ind(const struct gsm_pcu_if_info_ind *info_ind)
|
|||
struct gprs_bssgp_pcu *pcu;
|
||||
int rc = 0;
|
||||
unsigned int trx_nr, ts_nr;
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
if (info_ind->version != PCU_IF_VERSION) {
|
||||
fprintf(stderr, "PCU interface version number of BTS (%u) is "
|
||||
|
@ -613,16 +613,32 @@ bssgp_failed:
|
|||
LOGP(DL1IF, LOGL_DEBUG, " dl_tbf_ext=%d\n", info_ind->dl_tbf_ext);
|
||||
LOGP(DL1IF, LOGL_DEBUG, " ul_tbf_ext=%d\n", info_ind->ul_tbf_ext);
|
||||
bts->bsic = info_ind->bsic;
|
||||
|
||||
bts->cs_mask = 1 << 0; /* We need at least 1 CS, let's enable CS1 */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if ((info_ind->flags & (PCU_IF_FLAG_CS1 << i)))
|
||||
LOGP(DL1IF, LOGL_DEBUG, " Use CS%d\n", i+1);
|
||||
uint8_t allowed = !!(info_ind->flags & (PCU_IF_FLAG_CS1 << i));
|
||||
bts->cs_mask |= allowed << i;
|
||||
if (allowed)
|
||||
LOGP(DL1IF, LOGL_DEBUG, " Use CS%d\n", i + 1);
|
||||
}
|
||||
|
||||
bts->mcs_mask = 0;
|
||||
for (i = 0; i < 9; i++) {
|
||||
if ((info_ind->flags & (PCU_IF_FLAG_MCS1 << i)))
|
||||
LOGP(DL1IF, LOGL_DEBUG, " Use MCS%d\n", i+1);
|
||||
uint8_t allowed = !!(info_ind->flags & (PCU_IF_FLAG_MCS1 << i));
|
||||
bts->mcs_mask |= allowed << i;
|
||||
if (allowed)
|
||||
LOGP(DL1IF, LOGL_DEBUG, " Use MCS%d\n", i + 1);
|
||||
}
|
||||
|
||||
LOGP(DL1IF, LOGL_DEBUG, " initial_cs=%d\n", info_ind->initial_cs);
|
||||
LOGP(DL1IF, LOGL_DEBUG, " initial_mcs=%d\n", info_ind->initial_mcs);
|
||||
if (!bts->force_cs) {
|
||||
if (info_ind->initial_cs < 1 || info_ind->initial_cs > 4)
|
||||
bts->initial_cs_dl = 1;
|
||||
else
|
||||
bts->initial_cs_dl = info_ind->initial_cs;
|
||||
bts->initial_cs_ul = bts->initial_cs_dl;
|
||||
}
|
||||
|
||||
pcu = gprs_bssgp_init(
|
||||
bts,
|
||||
|
@ -640,12 +656,6 @@ bssgp_failed:
|
|||
goto bssgp_failed;
|
||||
}
|
||||
|
||||
bts->cs1 = !!(info_ind->flags & PCU_IF_FLAG_CS1);
|
||||
bts->cs2 = !!(info_ind->flags & PCU_IF_FLAG_CS2);
|
||||
bts->cs3 = !!(info_ind->flags & PCU_IF_FLAG_CS3);
|
||||
bts->cs4 = !!(info_ind->flags & PCU_IF_FLAG_CS4);
|
||||
if (!bts->cs1 && !bts->cs2 && !bts->cs3 && !bts->cs4)
|
||||
bts->cs1 = 1;
|
||||
if (info_ind->t3142) { /* if timer values are set */
|
||||
osmo_tdef_set(bts->T_defs_bts, 3142, info_ind->t3142, OSMO_TDEF_S);
|
||||
osmo_tdef_set(bts->T_defs_bts, 3169, info_ind->t3169, OSMO_TDEF_S);
|
||||
|
@ -656,13 +666,6 @@ bssgp_failed:
|
|||
bts->n3103 = info_ind->n3103;
|
||||
bts->n3105 = info_ind->n3105;
|
||||
}
|
||||
if (!bts->force_cs) {
|
||||
if (info_ind->initial_cs < 1 || info_ind->initial_cs > 4)
|
||||
bts->initial_cs_dl = 1;
|
||||
else
|
||||
bts->initial_cs_dl = info_ind->initial_cs;
|
||||
bts->initial_cs_ul = bts->initial_cs_dl;
|
||||
}
|
||||
|
||||
for (trx_nr = 0; trx_nr < ARRAY_SIZE(bts->trx); trx_nr++) {
|
||||
bts->trx[trx_nr].arfcn = info_ind->trx[trx_nr].arfcn;
|
||||
|
|
|
@ -68,7 +68,7 @@ static void init_main_bts()
|
|||
struct gprs_rlcmac_bts *bts = bts_main_data();
|
||||
bts->fc_interval = 100;
|
||||
bts->initial_cs_dl = bts->initial_cs_ul = 1;
|
||||
bts->cs1 = 1;
|
||||
bts->cs_mask = 1 << 0; /* CS-1 always enabled by default */
|
||||
bts->n3101 = 10;
|
||||
bts->n3103 = 4;
|
||||
bts->n3105 = 8;
|
||||
|
|
Loading…
Reference in New Issue