From 63b048b2ff647d63df52a8bd92dee0502fc770b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Teodora=20Vladi=C4=87?= Date: Wed, 4 Mar 2026 17:08:51 +0100 Subject: [PATCH] [FHI72] Refactor PRACH code Move PRACH slot checking from oaioran.c to oran_isolate.c because xran_is_prach_slot() compared the current slot instead of the scheduled. The current and the scheduled slot are the same in case of short format, but different in case of format 0. Therefore, with this commit, in xran_is_prach_slot() we check the `prach_id->slot` and not `slot`. --- radio/fhi_72/oaioran.c | 14 ++------------ radio/fhi_72/oran_isolate.c | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/radio/fhi_72/oaioran.c b/radio/fhi_72/oaioran.c index 617243b0fd..24adfe50b2 100644 --- a/radio/fhi_72/oaioran.c +++ b/radio/fhi_72/oaioran.c @@ -182,21 +182,11 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot) int prach_end_sym = prach_info.N_dur + prach_start_sym; struct xran_ru_config *ru_conf = &fh_cfg->ru_conf; int slots_per_frame = 10 << fh_cfg->frame_conf.nNumerology; - int slots_per_subframe = 1 << fh_cfg->frame_conf.nNumerology; - int tti = slots_per_frame * (frame) + (slot); - uint32_t subframe = slot / slots_per_subframe; - // PRACH occasion in a frame if and only if SFN % x == y, TS 38.211 Table 6.3.3.2-2/3/4 - uint32_t is_prach_frame = (frame % prach_info.x == prach_info.y); - uint32_t is_prach_slot = is_prach_frame && xran_is_prach_slot(0, subframe, (slot % slots_per_subframe)); int nb_rx_per_ru = ru->nb_rx / fh_init->xran_ports; /* If it is PRACH slot, copy prach IQ from XRAN PRACH buffer to OAI PRACH buffer */ - if (is_prach_slot) { - if (!ru->prach_buf) { - LOG_W(HW, "we get rach data from ru, but it is not scheduled %d.%d\n", frame, slot); - return -1; - } + if (ru->prach_buf) { for (sym_idx = prach_start_sym; sym_idx < prach_end_sym; sym_idx++) { for (int aa = 0; aa < ru->nb_rx; aa++) { int16_t *dst, *src; @@ -249,7 +239,7 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot) } // COMPMETHOD_BLKFLOAT } // aa } // symb_indx - } // is_prach_slot + } // ru->prach_buf return (0); } diff --git a/radio/fhi_72/oran_isolate.c b/radio/fhi_72/oran_isolate.c index d19d2c1f00..1881eae163 100644 --- a/radio/fhi_72/oran_isolate.c +++ b/radio/fhi_72/oran_isolate.c @@ -213,16 +213,31 @@ int trx_oran_ctlrecv(openair0_device_t *device, void *msg, ssize_t msg_len) void oran_fh_if4p5_south_in(RU_t *ru, int *frame, int *slot) { - prach_item_t *prach_id = find_nr_prach(&ru->gNB_list[0]->prach_list, *frame, *slot, SEARCH_EXIST); ru_info_t ru_info = { .nb_rx = ru->nb_rx * ru->num_beams_period, .nb_tx = ru->nb_tx * ru->num_beams_period, .rxdataF = ru->common.rxdataF, .beam_id = ru->common.beam_id, .num_beams_period = ru->num_beams_period, - .prach_buf = prach_id ? prach_id->rxsigF : NULL, + .prach_buf = NULL, }; + prach_item_t *prach_id = find_nr_prach(&ru->gNB_list[0]->prach_list, *frame, *slot, SEARCH_EXIST); + if (prach_id) { + struct xran_fh_config *fh_cfg = get_xran_fh_config(0); + int slots_per_subframe = 1 << fh_cfg->frame_conf.nNumerology; + uint32_t subframe = *slot / slots_per_subframe; // `slot` = slot in which PRACH is received + // PRACH occasion in a frame if and only if SFN % x == y, TS 38.211 Table 6.3.3.2-2/3/4 + nr_prach_info_t prach_info = get_prach_info(0); + bool is_prach_frame = (*frame % prach_info.x == prach_info.y); + bool is_prach_slot = is_prach_frame && xran_is_prach_slot(0, subframe, (prach_id->slot % slots_per_subframe)); // `prach_id->slot` = slot in which PRACH is scheduled + if (is_prach_slot) { + ru_info.prach_buf = prach_id->rxsigF; + } else { + LOG_W(HW, "[%d.%d] Expected PRACH reception of scheduled slot %d\n", *frame, *slot, prach_id->slot); + } + } + RU_proc_t *proc = &ru->proc; int f, sl; LOG_D(HW, "Read rxdataF %p,%p\n", ru_info.rxdataF[0], ru_info.rxdataF[1]);