making global dmrs_symbol in pusch_vars local to avoid race conditions
This commit is contained in:
@@ -1282,6 +1282,13 @@ static void inner_rx(PHY_VARS_gNB *gNB,
|
||||
|
||||
memset(rxFext, 0, sizeof(c16_t) * nb_rx_ant * buffer_length);
|
||||
memset(chFext, 0, sizeof(c16_t) * nb_layer * nb_rx_ant* buffer_length);
|
||||
int dmrs_symbol;
|
||||
if (gNB->chest_time == 0)
|
||||
dmrs_symbol = dmrs_symbol_flag ? symbol : get_valid_dmrs_idx_for_channel_est(rel15_ul->ul_dmrs_symb_pos, symbol);
|
||||
else { // average of channel estimates stored in first symbol
|
||||
int end_symbol = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
|
||||
dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, end_symbol);
|
||||
}
|
||||
|
||||
for (int aarx = 0; aarx < nb_rx_ant; aarx++) {
|
||||
for (int aatx = 0; aatx < nb_layer; aatx++) {
|
||||
@@ -1290,7 +1297,7 @@ static void inner_rx(PHY_VARS_gNB *gNB,
|
||||
rxFext[aarx],
|
||||
chFext[aatx][aarx],
|
||||
soffset+(symbol * frame_parms->ofdm_symbol_size),
|
||||
pusch_vars->dmrs_symbol * frame_parms->ofdm_symbol_size,
|
||||
dmrs_symbol * frame_parms->ofdm_symbol_size,
|
||||
aarx,
|
||||
dmrs_symbol_flag,
|
||||
rel15_ul,
|
||||
@@ -1412,15 +1419,7 @@ static void nr_pusch_symbol_processing(void *arg)
|
||||
int ulsch_id = rdata->ulsch_id;
|
||||
int slot = rdata->slot;
|
||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id];
|
||||
for (int symbol = rdata->startSymbol; symbol < rdata->startSymbol+rdata->numSymbols; symbol++) {
|
||||
int dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
||||
if (dmrs_symbol_flag == 1)
|
||||
{
|
||||
if ((rel15_ul->ul_dmrs_symb_pos >> ((symbol + 1) % frame_parms->symbols_per_slot)) & 0x01)
|
||||
AssertFatal(1==0,"Double DMRS configuration is not yet supported\n");
|
||||
gNB->pusch_vars[ulsch_id].dmrs_symbol = symbol;
|
||||
}
|
||||
|
||||
for (int symbol = rdata->startSymbol; symbol < rdata->startSymbol + rdata->numSymbols; symbol++) {
|
||||
if (gNB->pusch_vars[ulsch_id].ul_valid_re_per_slot[symbol] == 0)
|
||||
continue;
|
||||
int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
|
||||
@@ -1469,7 +1468,6 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id].harq_process->ulsch_pdu;
|
||||
|
||||
NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id];
|
||||
pusch_vars->dmrs_symbol = INVALID_VALUE;
|
||||
int nbSymb = 0;
|
||||
uint32_t bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start) * NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size;
|
||||
LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset);
|
||||
@@ -1481,13 +1479,12 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
start_meas(&gNB->ulsch_channel_estimation_stats);
|
||||
int max_ch = 0;
|
||||
uint32_t nvar = 0;
|
||||
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) {
|
||||
int end_symbol = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
|
||||
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < end_symbol; symbol++) {
|
||||
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
||||
LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag);
|
||||
|
||||
if (dmrs_symbol_flag == 1) {
|
||||
if (pusch_vars->dmrs_symbol == INVALID_VALUE)
|
||||
pusch_vars->dmrs_symbol = symbol;
|
||||
|
||||
for (int nl = 0; nl < rel15_ul->nrOfLayers; nl++) {
|
||||
uint32_t nvar_tmp = 0;
|
||||
@@ -1535,18 +1532,13 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
nvar /= (rel15_ul->nr_of_symbols * rel15_ul->nrOfLayers * frame_parms->nb_antennas_rx);
|
||||
|
||||
// averaging time domain channel estimates
|
||||
if (gNB->chest_time == 1)
|
||||
{
|
||||
if (gNB->chest_time == 1)
|
||||
nr_chest_time_domain_avg(frame_parms,
|
||||
pusch_vars->ul_ch_estimates,
|
||||
rel15_ul->nr_of_symbols,
|
||||
rel15_ul->start_symbol_index,
|
||||
rel15_ul->ul_dmrs_symb_pos,
|
||||
rel15_ul->rb_size);
|
||||
pusch_vars->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos,
|
||||
rel15_ul->start_symbol_index,
|
||||
rel15_ul->nr_of_symbols);
|
||||
}
|
||||
|
||||
stop_meas(&gNB->ulsch_channel_estimation_stats);
|
||||
|
||||
@@ -1554,7 +1546,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
|
||||
// Scrambling initialization
|
||||
int number_dmrs_symbols = 0;
|
||||
for (int l = rel15_ul->start_symbol_index; l < rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols; l++)
|
||||
for (int l = rel15_ul->start_symbol_index; l < end_symbol; l++)
|
||||
number_dmrs_symbols += ((rel15_ul->ul_dmrs_symb_pos)>>l) & 0x01;
|
||||
int nb_re_dmrs;
|
||||
if (rel15_ul->dmrs_config_type == pusch_dmrs_type1)
|
||||
@@ -1593,9 +1585,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
// first the computation of channel levels
|
||||
|
||||
int nb_re_pusch = 0, meas_symbol = -1;
|
||||
for(meas_symbol = rel15_ul->start_symbol_index;
|
||||
meas_symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);
|
||||
meas_symbol++)
|
||||
for(meas_symbol = rel15_ul->start_symbol_index; meas_symbol < end_symbol; meas_symbol++)
|
||||
if ((nb_re_pusch = get_nb_re_pusch(frame_parms,rel15_ul,meas_symbol)) > 0)
|
||||
break;
|
||||
|
||||
@@ -1606,6 +1596,11 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
int soffset = (slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
|
||||
|
||||
nb_re_pusch = (nb_re_pusch + 15) & ~15;
|
||||
int dmrs_symbol;
|
||||
if (gNB->chest_time == 0)
|
||||
dmrs_symbol = get_valid_dmrs_idx_for_channel_est(rel15_ul->ul_dmrs_symb_pos, meas_symbol);
|
||||
else // average of channel estimates stored in first symbol
|
||||
dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, end_symbol);
|
||||
|
||||
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
|
||||
for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++)
|
||||
@@ -1614,7 +1609,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
(c16_t*)&pusch_vars->rxdataF_ext[aarx][meas_symbol * nb_re_pusch],
|
||||
(c16_t*)&pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][meas_symbol * nb_re_pusch],
|
||||
soffset + meas_symbol * frame_parms->ofdm_symbol_size,
|
||||
pusch_vars->dmrs_symbol * frame_parms->ofdm_symbol_size,
|
||||
dmrs_symbol * frame_parms->ofdm_symbol_size,
|
||||
aarx,
|
||||
(rel15_ul->ul_dmrs_symb_pos >> meas_symbol) & 0x01,
|
||||
rel15_ul,
|
||||
@@ -1662,9 +1657,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
start_meas(&gNB->rx_pusch_symbol_processing_stats);
|
||||
int numSymbols = gNB->num_pusch_symbols_per_thread;
|
||||
|
||||
for(uint8_t symbol = rel15_ul->start_symbol_index;
|
||||
symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);
|
||||
symbol += numSymbols)
|
||||
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < end_symbol; symbol += numSymbols)
|
||||
{
|
||||
int total_res = 0;
|
||||
for (int s = 0; s < numSymbols;s++) {
|
||||
|
||||
@@ -357,8 +357,6 @@ typedef struct {
|
||||
/// - first index: ? [0..3] (hard coded)
|
||||
/// - first index: ? [0..1179743] (hard coded)
|
||||
int16_t **llr_layers;
|
||||
/// DMRS symbol index, to be updated every DMRS symbol within a slot.
|
||||
uint8_t dmrs_symbol;
|
||||
// PTRS symbol index, to be updated every PTRS symbol within a slot.
|
||||
uint8_t ptrs_symbol_index;
|
||||
/// bit mask of PT-RS ofdm symbol indicies
|
||||
|
||||
Reference in New Issue
Block a user