more fixes in the srsenb

master
Xavier Arteaga 5 years ago committed by Xavier Arteaga
parent 5dbc96458a
commit f9c3dd2748

@ -231,8 +231,8 @@ static int pucch_resource_selection(srslte_pucch_cfg_t* cfg,
static int get_pucch(srslte_enb_ul_t* q, srslte_ul_sf_cfg_t* ul_sf, srslte_pucch_cfg_t* cfg, srslte_pucch_res_t* res) static int get_pucch(srslte_enb_ul_t* q, srslte_ul_sf_cfg_t* ul_sf, srslte_pucch_cfg_t* cfg, srslte_pucch_res_t* res)
{ {
int ret = SRSLTE_SUCCESS; int ret = SRSLTE_SUCCESS;
uint32_t n_pucch_i[SRSLTE_PUCCH_CS_MAX_ACK]; uint32_t n_pucch_i[SRSLTE_PUCCH_CS_MAX_ACK] = {};
srslte_pucch_res_t pucch_res; srslte_pucch_res_t pucch_res = {};
// Drop CQI if there is collision with ACK // Drop CQI if there is collision with ACK
if (!cfg->simul_cqi_ack && srslte_uci_cfg_total_ack(&cfg->uci_cfg) > 0 && cfg->uci_cfg.cqi.data_enable) { if (!cfg->simul_cqi_ack && srslte_uci_cfg_total_ack(&cfg->uci_cfg) > 0 && cfg->uci_cfg.cqi.data_enable) {
@ -250,7 +250,7 @@ static int get_pucch(srslte_enb_ul_t* q, srslte_ul_sf_cfg_t* ul_sf, srslte_pucch
} }
// Initialise minimum correlation // Initialise minimum correlation
res->correlation = -INFINITY; res->correlation = 0.0f;
// Iterate possible resources and select the one with higher correlation // Iterate possible resources and select the one with higher correlation
for (int i = 0; i < nof_resources && ret == SRSLTE_SUCCESS; i++) { for (int i = 0; i < nof_resources && ret == SRSLTE_SUCCESS; i++) {

@ -753,12 +753,12 @@ get_npucch(srslte_pucch_cfg_t* cfg, srslte_uci_cfg_t* uci_cfg, srslte_uci_value_
{ {
uint32_t n_pucch_res = 0; uint32_t n_pucch_res = 0;
if (uci_cfg->is_scheduling_request_tti) { if (cfg->format != SRSLTE_PUCCH_FORMAT_3) {
return cfg->n_pucch_sr; if (uci_value) {
} if (uci_value->scheduling_request) {
return cfg->n_pucch_sr;
if (uci_value) { }
if (uci_value->scheduling_request) { } else if (uci_cfg->is_scheduling_request_tti) {
return cfg->n_pucch_sr; return cfg->n_pucch_sr;
} }
} }
@ -768,23 +768,14 @@ get_npucch(srslte_pucch_cfg_t* cfg, srslte_uci_cfg_t* uci_cfg, srslte_uci_value_
return 0; return 0;
} }
if (cfg->format < SRSLTE_PUCCH_FORMAT_2) { switch (cfg->format) {
if (cfg->sps_enabled) {
n_pucch_res = cfg->n_pucch_1[uci_cfg->ack[0].tpc_for_pucch % 4]; case SRSLTE_PUCCH_FORMAT_1:
} else { case SRSLTE_PUCCH_FORMAT_1A:
if (cell->frame_type == SRSLTE_FDD) { case SRSLTE_PUCCH_FORMAT_1B:
switch (cfg->ack_nack_feedback_mode) { if (cfg->sps_enabled) {
case SRSLTE_PUCCH_ACK_NACK_FEEDBACK_MODE_PUCCH3: n_pucch_res = cfg->n_pucch_1[uci_cfg->ack[0].tpc_for_pucch % 4];
n_pucch_res = cfg->n3_pucch_an_list[uci_cfg->ack[0].tpc_for_pucch % SRSLTE_PUCCH_SIZE_AN_CS]; } else if (cell->frame_type == SRSLTE_TDD) {
break;
case SRSLTE_PUCCH_ACK_NACK_FEEDBACK_MODE_CS:
n_pucch_res = get_npucch_cs(cfg, uci_cfg, uci_value);
break;
default:
n_pucch_res = uci_cfg->ack[0].ncce[0] + cfg->N_pucch_1;
break;
}
} else {
// only 1 CC supported in TDD // only 1 CC supported in TDD
if (!uci_cfg->ack[0].tdd_is_multiplex || uci_cfg->ack[0].tdd_ack_M == 1) { if (!uci_cfg->ack[0].tdd_is_multiplex || uci_cfg->ack[0].tdd_ack_M == 1) {
n_pucch_res = n_pucch_i_tdd(uci_cfg->ack[0].ncce[0], n_pucch_res = n_pucch_i_tdd(uci_cfg->ack[0].ncce[0],
@ -804,10 +795,25 @@ get_npucch(srslte_pucch_cfg_t* cfg, srslte_uci_cfg_t* uci_cfg, srslte_uci_value_
ERROR("Invalid M=%d in PUCCH TDD multiplexing\n", uci_cfg->ack[0].tdd_ack_M); ERROR("Invalid M=%d in PUCCH TDD multiplexing\n", uci_cfg->ack[0].tdd_ack_M);
} }
} }
} else if (cfg->ack_nack_feedback_mode == SRSLTE_PUCCH_ACK_NACK_FEEDBACK_MODE_CS) {
// Channel selection enabled
n_pucch_res = get_npucch_cs(cfg, uci_cfg, uci_value);
} else {
// Normal case
n_pucch_res = uci_cfg->ack[0].ncce[0] + cfg->N_pucch_1;
} }
} break;
} else { case SRSLTE_PUCCH_FORMAT_2:
n_pucch_res = cfg->n_pucch_2; case SRSLTE_PUCCH_FORMAT_2A:
case SRSLTE_PUCCH_FORMAT_2B:
n_pucch_res = cfg->n_pucch_2;
break;
case SRSLTE_PUCCH_FORMAT_3:
n_pucch_res = cfg->n3_pucch_an_list[uci_cfg->ack[0].tpc_for_pucch % SRSLTE_PUCCH_SIZE_AN_CS];
break;
case SRSLTE_PUCCH_FORMAT_ERROR:
default:
ERROR("Wrong PUCCH format %s\n", srslte_pucch_format_text_short(cfg->format));
} }
return n_pucch_res; return n_pucch_res;
@ -824,11 +830,6 @@ void srslte_ue_ul_pucch_resource_selection(srslte_cell_t* cell,
uci_cfg->cqi.data_enable = false; uci_cfg->cqi.data_enable = false;
} }
// Assume that if a scheduling request is carried, it is the right TTI
if (uci_value) {
uci_cfg->is_scheduling_request_tti |= uci_value->scheduling_request;
}
// Get PUCCH Resources // Get PUCCH Resources
cfg->format = srslte_pucch_select_format(cfg, uci_cfg, cell->cp); cfg->format = srslte_pucch_select_format(cfg, uci_cfg, cell->cp);
cfg->n_pucch = get_npucch(cfg, uci_cfg, uci_value, cell); cfg->n_pucch = get_npucch(cfg, uci_cfg, uci_value, cell);

@ -224,14 +224,14 @@ void phy_common::ue_db_set_ack_pending(uint32_t tti, uint32_t cc_idx, const srsl
uint32_t scell_idx = ue.scell_map[cc_idx]; uint32_t scell_idx = ue.scell_map[cc_idx];
uint32_t tti_idx = TTIMOD(tti); uint32_t tti_idx = TTIMOD(tti);
pending_ack_t& pending_ack = ue.pending_ack[tti_idx]; pending_ack_t& pending_ack = ue.pending_ack[tti_idx]; // Assume it has been zero'ed for the TTI
// Set DCI info // Set DCI info
pending_ack.ack[scell_idx].grant_cc_idx = scell_idx; // No cross carrier scheduling supported pending_ack.ack[scell_idx].grant_cc_idx = scell_idx; // No cross carrier scheduling supported
pending_ack.ack[scell_idx].ncce[0] = dci.location.ncce; pending_ack.ack[scell_idx].ncce[0] = dci.location.ncce;
// Set TB info // Set TB info
for (uint32_t i = 0; i < SRSLTE_MAX_TB; i++) { for (uint32_t i = 0; i < srslte_dci_format_max_tb(dci.format); i++) {
if (SRSLTE_DCI_IS_TB_EN(dci.tb[i])) { if (SRSLTE_DCI_IS_TB_EN(dci.tb[i])) {
pending_ack.ack[scell_idx].pending_tb[i] = true; pending_ack.ack[scell_idx].pending_tb[i] = true;
pending_ack.ack[scell_idx].nof_acks++; pending_ack.ack[scell_idx].nof_acks++;

@ -215,10 +215,9 @@ void sf_worker::work_imp()
} }
} }
if (dl_grants[t_tx_dl][0].cfi < 1 || dl_grants[t_tx_dl][0].cfi > 3) { // Make sure CFI is in the right range
Error("Invalid CFI=%d\n", dl_grants[t_tx_dl][0].cfi); dl_grants[t_tx_dl][0].cfi = SRSLTE_MAX(dl_grants[t_tx_dl][0].cfi, 1);
return; dl_grants[t_tx_dl][0].cfi = SRSLTE_MIN(dl_grants[t_tx_dl][0].cfi, 3);
}
// Get UL scheduling for the TX TTI from MAC // Get UL scheduling for the TX TTI from MAC
if (stack->get_ul_sched(tti_tx_ul, ul_grants[t_tx_ul]) < 0) { if (stack->get_ul_sched(tti_tx_ul, ul_grants[t_tx_ul]) < 0) {

Loading…
Cancel
Save