From 6379350f51ab9b39d1ee7f93be8b6cf1550955ab Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Thu, 16 May 2024 15:27:36 +0200 Subject: [PATCH] Correct data offset for unscrambling in PUSCH processing Correctly compute the offset of data to unscramble in PUSCH processing at the gNB. Rename variables to make them easier to spot (instead of "s"), and remove a global variable. Closes: #734 --- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 36 +++++++++++++------ openair1/PHY/defs_gNB.h | 15 -------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 8ed0988ba6..723d13f65e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1389,6 +1389,20 @@ static void inner_rx(PHY_VARS_gNB *gNB, rel15_ul->qam_mod_order); } +typedef struct puschSymbolProc_s { + PHY_VARS_gNB *gNB; + NR_DL_FRAME_PARMS *frame_parms; + nfapi_nr_pusch_pdu_t *rel15_ul; + int ulsch_id; + int slot; + int startSymbol; + int numSymbols; + int16_t *llr; + int16_t **llr_layers; + int16_t *scramblingSequence; + uint32_t nvar; +} puschSymbolProc_t; + static void nr_pusch_symbol_processing(void *arg) { puschSymbolProc_t *rdata=(puschSymbolProc_t*)arg; @@ -1438,8 +1452,10 @@ static void nr_pusch_symbol_processing(void *arg) } // unscrambling int16_t *llr16 = (int16_t*)&rdata->llr[pusch_vars->llr_offset[symbol] * rel15_ul->nrOfLayers]; - for (int i = 0; i < (nb_re_pusch * rel15_ul->qam_mod_order * rel15_ul->nrOfLayers); i++) - llr16[i] = llr_ptr[i] * rdata->s[i]; + int16_t *s = rdata->scramblingSequence + pusch_vars->llr_offset[symbol] * rel15_ul->nrOfLayers; + const int end = nb_re_pusch * rel15_ul->qam_mod_order * rel15_ul->nrOfLayers; + for (int i = 0; i < end; i++) + llr16[i] = llr_ptr[i] * s[i]; } } @@ -1455,7 +1471,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id]; pusch_vars->dmrs_symbol = INVALID_VALUE; - gNB->nbSymb = 0; + 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); LOG_D(PHY,"pusch %d.%d : ul_dmrs_symb_pos %x\n",frame,slot,rel15_ul->ul_dmrs_symb_pos); @@ -1571,9 +1587,9 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, gNB->ulsch[ulsch_id].unav_res = unav_res; // initialize scrambling sequence // - int16_t s[G+96] __attribute__((aligned(32))); + int16_t scramblingSequence[G + 96] __attribute__((aligned(32))); - nr_codeword_unscrambling_init(s, G, 0, rel15_ul->data_scrambling_id, rel15_ul->rnti); + nr_codeword_unscrambling_init(scramblingSequence, G, 0, rel15_ul->data_scrambling_id, rel15_ul->rnti); // first the computation of channel levels @@ -1674,23 +1690,23 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, rdata->ulsch_id = ulsch_id; rdata->llr = pusch_vars->llr; rdata->llr_layers = pusch_vars->llr_layers; - rdata->s = &s[pusch_vars->llr_offset[symbol]*rel15_ul->nrOfLayers]; + rdata->scramblingSequence = scramblingSequence; rdata->nvar = nvar; if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { nr_pusch_symbol_processing(rdata); } else { pushTpool(&gNB->threadPool, req); - gNB->nbSymb++; + nbSymb++; } - LOG_D(PHY,"%d.%d Added symbol %d (count %d) to process, in pipe\n",frame,slot,symbol,gNB->nbSymb); + LOG_D(PHY, "%d.%d Added symbol %d (count %d) to process, in pipe\n", frame, slot, symbol, nbSymb); } } // symbol loop - while (gNB->nbSymb > 0) { + while (nbSymb) { notifiedFIFO_elt_t *req = pullTpool(&gNB->respPuschSymb, &gNB->threadPool); - gNB->nbSymb--; + nbSymb--; delNotifiedFIFO_elt(req); } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index c31a5e007e..20413098bd 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -716,7 +716,6 @@ typedef struct PHY_VARS_gNB_s { notifiedFIFO_t L1_rx_out; notifiedFIFO_t resp_RU_tx; tpool_t threadPool; - int nbSymb; int num_pusch_symbols_per_thread; pthread_t L1_rx_thread; int L1_rx_thread_core; @@ -728,20 +727,6 @@ typedef struct PHY_VARS_gNB_s { rt_L1_profiling_t rt_L1_profiling; } PHY_VARS_gNB; -typedef struct puschSymbolProc_s { - PHY_VARS_gNB *gNB; - NR_DL_FRAME_PARMS *frame_parms; - nfapi_nr_pusch_pdu_t *rel15_ul; - int ulsch_id; - int slot; - int startSymbol; - int numSymbols; - int16_t *llr; - int16_t **llr_layers; - int16_t *s; - uint32_t nvar; -} puschSymbolProc_t; - struct puschSymbolReqId { uint16_t ulsch_id; uint16_t frame;