From cecfec82a87c4083b37ec88d97f92964494b54bd Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Thu, 20 Nov 2025 14:38:00 -0500 Subject: [PATCH] mac: harmonize csi_payload_t struct 1. Reuse csi_payload_t struct to hold CSI report payload on PUSCH and PUCCH PDU. 2. Move the struct to fapi header file --- .../nfapi/public_inc/fapi_nr_ue_interface.h | 12 ++-- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 20 +++--- openair1/SIMULATION/NR_PHY/ulsim.c | 30 ++++---- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 11 +-- openair2/LAYER2/NR_MAC_UE/mac_proto.h | 6 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 69 ++++++++++--------- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 27 ++++---- 7 files changed, 84 insertions(+), 91 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index 4c99da4e35..481f704da1 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -260,6 +260,13 @@ typedef struct } nfapi_nr_ue_pusch_data_t; +typedef struct csi_payload { + uint64_t part1_payload; + uint64_t part2_payload; + int p1_bits; + int p2_bits; +} nfapi_nr_ue_csi_payload_t; + typedef struct { // payloads with fixed array size @@ -267,10 +274,7 @@ typedef struct // vector without L1 implementation uint16_t harq_ack_bit_length; uint64_t harq_payload; - uint16_t csi_part1_bit_length; - uint64_t csi_part1_payload; - uint16_t csi_part2_bit_length; - uint64_t csi_part2_payload; + nfapi_nr_ue_csi_payload_t csi_payload; uint8_t alpha_scaling; // 0 = 0.5, 1 = 0.65, 2 = 0.8, 3 = 1 uint8_t beta_offset_harq_ack; uint8_t beta_offset_csi1; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 109165263d..57f26e3624 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -772,13 +772,13 @@ static rate_match_info_uci_t calc_rate_match_info_uci(const nfapi_nr_ue_pusch_pd const double beta_csi1 = get_beta_offset_csi(pusch_pdu->pusch_uci.beta_offset_csi1); // get the number of coded CSI part 1 symbols and bits, TS 38.212 section 6.3.2.4.1.2 - const uint16_t ocsi1 = pusch_pdu->pusch_uci.csi_part1_bit_length; + const uint16_t ocsi1 = pusch_pdu->pusch_uci.csi_payload.p1_bits; rminfo.Q_dash_CSI1 = get_Qd(ocsi1, beta_csi1, alpha, sumKr, s1, s1, rminfo.Q_dash_ACK); rminfo.E_uci_CSI1 = rminfo.Q_dash_CSI1 * nlqm; // get the number of coded CSI part 2 symbols and bits, TS 38.212 section 6.3.2.4.1.3 const double beta_csi2 = get_beta_offset_csi(pusch_pdu->pusch_uci.beta_offset_csi2); - const uint16_t ocsi2 = pusch_pdu->pusch_uci.csi_part2_bit_length; + const uint16_t ocsi2 = pusch_pdu->pusch_uci.csi_payload.p2_bits; rminfo.Q_dash_CSI2 = get_Qd(ocsi2, beta_csi2, alpha, sumKr, s1, s1, rminfo.Q_dash_ACK + rminfo.Q_dash_CSI1); rminfo.E_uci_CSI2 = rminfo.Q_dash_CSI2 * nlqm; @@ -1253,7 +1253,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, return; } - bool uci_present = (pusch_pdu->pusch_uci.harq_ack_bit_length != 0) || (pusch_pdu->pusch_uci.csi_part1_bit_length != 0); + bool uci_present = (pusch_pdu->pusch_uci.harq_ack_bit_length != 0) || (pusch_pdu->pusch_uci.csi_payload.p1_bits != 0); if (uci_present) { rm_info = calc_rate_match_info_uci(pusch_pdu, harq_process_ul_ue, nl_qm, &G[pusch_id]); } @@ -1301,9 +1301,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uint64_t b_csi1[16] = {0}; // limit to 1024-bit encoded length uint64_t b_csi2[16] = {0}; // limit to 1024-bit encoded length - if (pusch_pdu->pusch_uci.csi_part1_bit_length != 0) { - nr_uci_encoding(pusch_pdu->pusch_uci.csi_part1_payload, - pusch_pdu->pusch_uci.csi_part1_bit_length, + if (pusch_pdu->pusch_uci.csi_payload.p1_bits != 0) { + nr_uci_encoding(pusch_pdu->pusch_uci.csi_payload.part1_payload, + pusch_pdu->pusch_uci.csi_payload.p1_bits, pucch_pdu->prb_size, true, rm_info.E_uci_CSI1, @@ -1313,9 +1313,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uci_present |= true; // Process CSI Part 2 if any - if (pusch_pdu->pusch_uci.csi_part2_bit_length > 0) - nr_uci_encoding(pusch_pdu->pusch_uci.csi_part2_payload, - pusch_pdu->pusch_uci.csi_part2_bit_length, + if (pusch_pdu->pusch_uci.csi_payload.p2_bits > 0) + nr_uci_encoding(pusch_pdu->pusch_uci.csi_payload.part2_payload, + pusch_pdu->pusch_uci.csi_payload.p2_bits, pucch_pdu->prb_size, true, rm_info.E_uci_CSI2, @@ -1376,7 +1376,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////////////////////ULSCH scrambling///////////////////////// uint32_t available_bits; - bool is_uci_on_pusch = (pusch_pdu->pusch_uci.harq_ack_bit_length != 0 || pusch_pdu->pusch_uci.csi_part1_bit_length != 0); + bool is_uci_on_pusch = (pusch_pdu->pusch_uci.harq_ack_bit_length != 0 || pusch_pdu->pusch_uci.csi_payload.p1_bits != 0); if (is_uci_on_pusch) { // UCI on PUSCH is present, so available bits are the total codeword length diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index d6407e0a5a..3e199d2156 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -257,15 +257,15 @@ static void prepare_ue_pusch_pdu_from_matlab_vector(const bool uci_on_pusch, p_vec_bits += var.A; copy_bytes_to_packed_bits(p_vec_bits, var.oack, false, pb); - pusch_config_pdu->pusch_uci.csi_part1_bit_length = var.ocsi1; - pb = (uint8_t *)&pusch_config_pdu->pusch_uci.csi_part1_payload; - memset(pb, 0, sizeof(pusch_config_pdu->pusch_uci.csi_part1_payload)); + pusch_config_pdu->pusch_uci.csi_payload.p1_bits = var.ocsi1; + pb = (uint8_t *)&pusch_config_pdu->pusch_uci.csi_payload.part1_payload; + memset(pb, 0, sizeof(pusch_config_pdu->pusch_uci.csi_payload.part1_payload)); p_vec_bits += var.oack; copy_bytes_to_packed_bits(p_vec_bits, var.ocsi1, false, pb); - pusch_config_pdu->pusch_uci.csi_part2_bit_length = var.ocsi2; - pb = (uint8_t *)&pusch_config_pdu->pusch_uci.csi_part2_payload; - memset(pb, 0, sizeof(pusch_config_pdu->pusch_uci.csi_part2_payload)); + pusch_config_pdu->pusch_uci.csi_payload.p2_bits = var.ocsi2; + pb = (uint8_t *)&pusch_config_pdu->pusch_uci.csi_payload.part2_payload; + memset(pb, 0, sizeof(pusch_config_pdu->pusch_uci.csi_payload.part2_payload)); p_vec_bits += var.ocsi1; copy_bytes_to_packed_bits(p_vec_bits, var.ocsi2, false, pb); } @@ -1342,16 +1342,14 @@ int main(int argc, char *argv[]) pusch_config_pdu->num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data; } if (uci_on_pusch) { - const nfapi_nr_ue_pusch_uci_t pusch_uci = {.alpha_scaling = 3, - .beta_offset_csi1 = 13, - .beta_offset_csi2 = 13, - .beta_offset_harq_ack = 11, - .harq_ack_bit_length = 3, - .harq_payload = 3, - .csi_part1_bit_length = 4, - .csi_part1_payload = 15, - .csi_part2_bit_length = 4, - .csi_part2_payload = 15}; + const nfapi_nr_ue_pusch_uci_t pusch_uci = { + .alpha_scaling = 3, + .beta_offset_csi1 = 13, + .beta_offset_csi2 = 13, + .beta_offset_harq_ack = 11, + .harq_ack_bit_length = 3, + .harq_payload = 3, + .csi_payload = {.p1_bits = 4, .part1_payload = 15, .p2_bits = 4, .part2_payload = 15}}; pusch_config_pdu->pusch_uci = pusch_uci; prepare_ue_pusch_pdu_from_matlab_vector(uci_on_pusch, uci_ulsch_matlab_vec, pusch_config_pdu, cw_buf); } diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 65bf66505b..21b0889654 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -310,10 +310,8 @@ typedef struct { NR_PUCCH_Resource_t *pucch_resource; uint32_t ack_payload; uint8_t sr_payload; - uint64_t csi_part1_payload; - uint64_t csi_part2_payload; + nfapi_nr_ue_csi_payload_t csi_payload; int n_sr; - int n_csi; int n_harq; int n_CCE; int N_CCE; @@ -490,13 +488,6 @@ typedef struct { A_SEQUENCE_OF(NR_SearchSpace_t) list_SS; } NR_BWP_PDCCH_t; -typedef struct csi_payload { - uint64_t part1_payload; - uint64_t part2_payload; - int p1_bits; - int p2_bits; -} csi_payload_t; - typedef enum { WIDEBAND_ON_PUCCH, SUBBAND_ON_PUCCH, diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 15e9cac60e..10851a3499 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -124,7 +124,7 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac, void nr_ue_ul_scheduler(NR_UE_MAC_INST_t *mac, nr_uplink_indication_t *ul_info); void nr_ue_dl_scheduler(NR_UE_MAC_INST_t *mac, nr_downlink_indication_t *dl_info); -csi_payload_t nr_ue_aperiodic_csi_reporting(NR_UE_MAC_INST_t *mac, dci_field_t csi_request, int tda, long *K2); +nfapi_nr_ue_csi_payload_t nr_ue_aperiodic_csi_reporting(NR_UE_MAC_INST_t *mac, dci_field_t csi_request, int tda, long *K2); nr_dci_format_t nr_ue_process_dci_indication_pdu(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci); @@ -139,7 +139,7 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, int nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sched_t *pucch); -csi_payload_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac, +nfapi_nr_ue_csi_payload_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac, int csi_report_id, CSI_mapping_t mapping_type, const NR_CSI_MeasConfig_t *csi_MeasConfig); @@ -330,7 +330,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, NR_tda_info_t *tda_info, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci, - csi_payload_t *csi_report, + nfapi_nr_ue_csi_payload_t *csi_report, RAR_grant_t *rar_grant, rnti_t rnti, int ss_type, diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index ee9529ed8c..3a8f17b471 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -632,7 +632,7 @@ static int nr_ue_process_dci_ul_01(NR_UE_MAC_INST_t *mac, /* CSI_REQUEST */ long csi_K2 = -1; - csi_payload_t csi_report = {0}; + nfapi_nr_ue_csi_payload_t csi_report = {0}; if (dci->csi_request.nbits > 0 && dci->csi_request.val > 0) csi_report = nr_ue_aperiodic_csi_reporting(mac, dci->csi_request, dci->time_domain_assignment.val, &csi_K2); @@ -1609,7 +1609,7 @@ int nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, pucch_pdu->second_hop_prb = pucchres->secondHopPRB!= NULL ? *pucchres->secondHopPRB : 0; pucch_pdu->prb_size = 1; // format 0 or 1 - int n_uci = pucch->n_sr + pucch->n_harq + pucch->n_csi; + int n_uci = pucch->n_sr + pucch->n_harq + pucch->csi_payload.p1_bits; if (n_uci > (sizeof(uint64_t) * 8)) { LOG_E(NR_MAC, "PUCCH number of UCI bits exceeds payload size\n"); return -1; @@ -1651,14 +1651,15 @@ int nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, pucch_pdu->dmrs_scrambling_id = id0 != NULL ? *id0 : mac->physCellId; pucch_pdu->prb_size = compute_pucch_prb_size(2, pucchres->format.choice.format2->nrofPRBs, - pucch->n_csi, + pucch->csi_payload.p1_bits, pucch->n_harq, pucch->n_sr, pucch_Config->format2->choice.setup->maxCodeRate, 2, pucchres->format.choice.format2->nrofSymbols, 8); - pucch_pdu->payload = (pucch->csi_part1_payload << (pucch->n_harq + pucch->n_sr)) | (pucch->sr_payload << pucch->n_harq) | pucch->ack_payload; + pucch_pdu->payload = (pucch->csi_payload.part1_payload << (pucch->n_harq + pucch->n_sr)) + | (pucch->sr_payload << pucch->n_harq) | pucch->ack_payload; break; case NR_PUCCH_Resource__format_PR_format3 : pucch_pdu->format_type = 3; @@ -1686,14 +1687,15 @@ int nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, } pucch_pdu->prb_size = compute_pucch_prb_size(3, pucchres->format.choice.format3->nrofPRBs, - pucch->n_csi, + pucch->csi_payload.p1_bits, pucch->n_harq, pucch->n_sr, pucch_Config->format3->choice.setup->maxCodeRate, 2 - pucch_pdu->pi_2bpsk, pucchres->format.choice.format3->nrofSymbols - f3_dmrs_symbols, 12); - pucch_pdu->payload = (pucch->csi_part1_payload << (pucch->n_harq + pucch->n_sr)) | (pucch->sr_payload << pucch->n_harq) | pucch->ack_payload; + pucch_pdu->payload = (pucch->csi_payload.part1_payload << (pucch->n_harq + pucch->n_sr)) + | (pucch->sr_payload << pucch->n_harq) | pucch->ack_payload; break; case NR_PUCCH_Resource__format_PR_format4 : pucch_pdu->format_type = 4; @@ -1711,7 +1713,8 @@ int nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ? 1 : 0; pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ? 1 : 0; } - pucch_pdu->payload = (pucch->csi_part1_payload << (pucch->n_harq + pucch->n_sr)) | (pucch->sr_payload << pucch->n_harq) | pucch->ack_payload; + pucch_pdu->payload = (pucch->csi_payload.part1_payload << (pucch->n_harq + pucch->n_sr)) + | (pucch->sr_payload << pucch->n_harq) | pucch->ack_payload; break; default : LOG_E(NR_MAC, "Undefined PUCCH format \n"); @@ -2152,8 +2155,8 @@ void merge_resources(PUCCH_sched_t *res, int num_res, NR_PUCCH_Config_t *pucch_C case NR_PUCCH_Resource__format_PR_format2: case NR_PUCCH_Resource__format_PR_format4: case NR_PUCCH_Resource__format_PR_format3: - if (res[i + 1].n_csi > 0) { - AssertFatal(res[i].n_csi == 0, "Multiplexing multiple CSI report in a single PUCCH not supported yet\n"); + if (res[i + 1].csi_payload.p1_bits > 0) { + AssertFatal(res[i].csi_payload.p1_bits == 0, "Multiplexing multiple CSI report in a single PUCCH not supported yet\n"); AssertFatal(res[i].n_harq > 0 && res[i + 1].n_harq == 0, "There is CSI in next F2 or above resource, since there is no CSI in current one, we expect HARQ in " "there and not in next\n"); @@ -2166,8 +2169,8 @@ void merge_resources(PUCCH_sched_t *res, int num_res, NR_PUCCH_Config_t *pucch_C res[i].n_sr = res[i + 1].n_sr; res[i].sr_payload = res[i + 1].sr_payload; } - res[i].n_csi = res[i + 1].n_csi; - res[i].csi_part1_payload = res[i + 1].csi_part1_payload; + res[i].csi_payload.p1_bits = res[i + 1].csi_payload.p1_bits; + res[i].csi_payload.part1_payload = res[i + 1].csi_payload.part1_payload; res[i + 1] = res[i]; res[i] = empty; } else { @@ -2188,8 +2191,8 @@ void merge_resources(PUCCH_sched_t *res, int num_res, NR_PUCCH_Config_t *pucch_C res[i] = empty; } } - } else if (res[i].n_csi > 0) { - AssertFatal(res[i + 1].n_csi == 0, "Multiplexing multiple CSI report in a single PUCCH not supported yet\n"); + } else if (res[i].csi_payload.p1_bits > 0) { + AssertFatal(res[i + 1].csi_payload.p1_bits == 0, "Multiplexing multiple CSI report in a single PUCCH not supported yet\n"); AssertFatal(res[i + 1].n_harq > 0 && res[i].n_harq == 0, "There is CSI in next F2 or above resource, since there is no CSI in current one, we expect HARQ in " "there and not in next\n"); @@ -2202,8 +2205,8 @@ void merge_resources(PUCCH_sched_t *res, int num_res, NR_PUCCH_Config_t *pucch_C res[i + 1].n_sr = res[i].n_sr; res[i + 1].sr_payload = res[i].sr_payload; } - res[i + 1].n_csi = res[i].n_csi; - res[i + 1].csi_part1_payload = res[i].csi_part1_payload; + res[i + 1].csi_payload.p1_bits = res[i].csi_payload.p1_bits; + res[i + 1].csi_payload.part1_payload = res[i].csi_payload.part1_payload; res[i] = empty; } else { if (res[i + 1].n_sr > 0) { @@ -2701,10 +2704,10 @@ static int compare_ssb_sinr(const void *a, const void *b) return mb->ssb_sinr_dB - ma->ssb_sinr_dB; } -static csi_payload_t get_ssb_sinr_payload(NR_UE_MAC_INST_t *mac, - const struct NR_CSI_ReportConfig *csi_reportconfig, - const NR_CSI_ResourceConfigId_t csi_ResourceConfigId, - const NR_CSI_MeasConfig_t *csi_MeasConfig) +static nfapi_nr_ue_csi_payload_t get_ssb_sinr_payload(NR_UE_MAC_INST_t *mac, + const struct NR_CSI_ReportConfig *csi_reportconfig, + const NR_CSI_ResourceConfigId_t csi_ResourceConfigId, + const NR_CSI_MeasConfig_t *csi_MeasConfig) { int nb_ssb = 0; // nb of ssb in the resource int nb_meas = 0; // nb of ssb to report measurements on @@ -2775,9 +2778,9 @@ static csi_payload_t get_ssb_sinr_payload(NR_UE_MAC_INST_t *mac, break; // resource found } } - int max_bits = sizeof(((csi_payload_t *)0)->part1_payload) * 8; + int max_bits = sizeof(((nfapi_nr_ue_csi_payload_t *)0)->part1_payload) * 8; AssertFatal(bits <= max_bits, "Not supporting CSI report with more than %d bits (payload: %d bits)\n", max_bits, bits); - csi_payload_t csi = {.part1_payload = temp_payload, .part2_payload = 0, .p1_bits = bits, csi.p2_bits = 0}; + nfapi_nr_ue_csi_payload_t csi = {.part1_payload = temp_payload, .part2_payload = 0, .p1_bits = bits, csi.p2_bits = 0}; return csi; } @@ -2800,7 +2803,7 @@ static uint8_t get_rsrp_diff_index(int best_rsrp, int current_rsrp) return (diff>>1); } -static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, +static nfapi_nr_ue_csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, const struct NR_CSI_ReportConfig *csi_reportconfig, const NR_CSI_ResourceConfigId_t csi_ResourceConfigId, const NR_CSI_MeasConfig_t *csi_MeasConfig) @@ -2875,14 +2878,14 @@ static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, break; // resource found } } - int max_bits = sizeof(((csi_payload_t *)0)->part1_payload) * 8; + int max_bits = sizeof(((nfapi_nr_ue_csi_payload_t *)0)->part1_payload) * 8; AssertFatal(bits <= max_bits, "Not supporting CSI report with more than %d bits (payload: %d bits)\n", max_bits, bits); - csi_payload_t csi = {.part1_payload = temp_payload, .part2_payload = 0, .p1_bits = bits, .p2_bits = 0}; + nfapi_nr_ue_csi_payload_t csi = {.part1_payload = temp_payload, .part2_payload = 0, .p1_bits = bits, .p2_bits = 0}; return csi; } -static csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, +static nfapi_nr_ue_csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, const struct NR_CSI_ReportConfig *csi_reportconfig, const NR_CSI_ResourceConfigId_t csi_ResourceConfigId, const NR_CSI_MeasConfig_t *csi_MeasConfig, @@ -2954,11 +2957,11 @@ static csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, } } AssertFatal(p1_bits <= 32 && p2_bits <= 32, "Not supporting CSI report with more than 32 bits\n"); - csi_payload_t csi = {.part1_payload = temp_payload_1, .part2_payload = temp_payload_2, .p1_bits = p1_bits, csi.p2_bits = p2_bits}; + nfapi_nr_ue_csi_payload_t csi = {.part1_payload = temp_payload_1, .part2_payload = temp_payload_2, .p1_bits = p1_bits, csi.p2_bits = p2_bits}; return csi; } -static csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, +static nfapi_nr_ue_csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, const struct NR_CSI_ReportConfig *csi_reportconfig, const NR_CSI_ResourceConfigId_t csi_ResourceConfigId, const NR_CSI_MeasConfig_t *csi_MeasConfig) @@ -3007,17 +3010,17 @@ static csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, } } AssertFatal(n_bits <= 32, "Not supporting CSI report with more than 32 bits\n"); - csi_payload_t csi = {.part1_payload = temp_payload, .p1_bits = n_bits, csi.p2_bits = 0}; + nfapi_nr_ue_csi_payload_t csi = {.part1_payload = temp_payload, .p1_bits = n_bits, csi.p2_bits = 0}; return csi; } -csi_payload_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac, - int csi_report_id, - CSI_mapping_t mapping_type, - const NR_CSI_MeasConfig_t *csi_MeasConfig) +nfapi_nr_ue_csi_payload_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac, + int csi_report_id, + CSI_mapping_t mapping_type, + const NR_CSI_MeasConfig_t *csi_MeasConfig) { AssertFatal(csi_MeasConfig->csi_ReportConfigToAddModList->list.count > 0,"No CSI Report configuration available\n"); - csi_payload_t csi = {0}; + nfapi_nr_ue_csi_payload_t csi = {0}; struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]; NR_CSI_ResourceConfigId_t csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement; if (csi_reportconfig->ext2 && csi_reportconfig->ext2->reportQuantity_r16) { diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 8eb0e5b3eb..ab1a190abb 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -353,7 +353,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, NR_tda_info_t *tda_info, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci, - csi_payload_t *csi_report, + nfapi_nr_ue_csi_payload_t *csi_report, RAR_grant_t *rar_grant, rnti_t rnti, int ss_type, @@ -534,10 +534,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, pusch_config_pdu->ulsch_indicator = dci->ulsch_indicator; if (dci->csi_request.nbits > 0 && dci->csi_request.val > 0) { AssertFatal(csi_report, "CSI report needs to be present in case of CSI request\n"); - pusch_config_pdu->pusch_uci.csi_part1_bit_length = csi_report->p1_bits; - pusch_config_pdu->pusch_uci.csi_part1_payload = csi_report->part1_payload; - pusch_config_pdu->pusch_uci.csi_part2_bit_length = csi_report->p2_bits; - pusch_config_pdu->pusch_uci.csi_part2_payload = csi_report->part2_payload; + pusch_config_pdu->pusch_uci.csi_payload = *csi_report; AssertFatal(pusch_Config && pusch_Config->uci_OnPUSCH, "UCI on PUSCH need to be configured\n"); NR_UCI_OnPUSCH_t *onPusch = pusch_Config->uci_OnPUSCH->choice.setup; AssertFatal(onPusch && @@ -546,17 +543,17 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, "Only semistatic beta offset is supported\n"); NR_BetaOffsets_t *beta_offsets = onPusch->betaOffsets->choice.semiStatic; - pusch_config_pdu->pusch_uci.beta_offset_csi1 = pusch_config_pdu->pusch_uci.csi_part1_bit_length < 12 ? + pusch_config_pdu->pusch_uci.beta_offset_csi1 = pusch_config_pdu->pusch_uci.csi_payload.p1_bits < 12 ? *beta_offsets->betaOffsetCSI_Part1_Index1 : *beta_offsets->betaOffsetCSI_Part1_Index2; - pusch_config_pdu->pusch_uci.beta_offset_csi2 = pusch_config_pdu->pusch_uci.csi_part2_bit_length < 12 ? + pusch_config_pdu->pusch_uci.beta_offset_csi2 = pusch_config_pdu->pusch_uci.csi_payload.p2_bits < 12 ? *beta_offsets->betaOffsetCSI_Part2_Index1 : *beta_offsets->betaOffsetCSI_Part2_Index2; pusch_config_pdu->pusch_uci.alpha_scaling = onPusch->scaling; } else { - pusch_config_pdu->pusch_uci.csi_part1_bit_length = 0; - pusch_config_pdu->pusch_uci.csi_part2_bit_length = 0; + pusch_config_pdu->pusch_uci.csi_payload.p1_bits = 0; + pusch_config_pdu->pusch_uci.csi_payload.p2_bits = 0; } pusch_config_pdu->pusch_uci.harq_ack_bit_length = 0; @@ -864,13 +861,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, return 0; } -csi_payload_t nr_ue_aperiodic_csi_reporting(NR_UE_MAC_INST_t *mac, dci_field_t csi_request, int tda, long *k2) +nfapi_nr_ue_csi_payload_t nr_ue_aperiodic_csi_reporting(NR_UE_MAC_INST_t *mac, dci_field_t csi_request, int tda, long *k2) { NR_CSI_AperiodicTriggerStateList_t *aperiodicTriggerStateList = mac->sc_info.aperiodicTriggerStateList; AssertFatal(aperiodicTriggerStateList, "Received CSI request via DCI but aperiodicTriggerStateList is not present\n"); int n_states = aperiodicTriggerStateList->list.count; int n_ts = csi_request.nbits; - csi_payload_t csi = {0}; + nfapi_nr_ue_csi_payload_t csi = {0}; AssertFatal(n_states <= ((1 << n_ts) - 1), "Case of subselection indication of trigger states not supported yet\n"); int num_trig = 0; for (int i = 0; i < n_ts; i++) { @@ -1791,9 +1788,9 @@ static bool schedule_uci_on_pusch(NR_UE_MAC_INST_t *mac, LOG_E(NR_MAC, "UCI on PUSCH need to be configured to schedule UCI on PUSCH\n"); } } - if (pusch_pdu->pusch_uci.csi_part1_bit_length == 0 && pusch_pdu->pusch_uci.csi_part2_bit_length == 0) { + if (pusch_pdu->pusch_uci.csi_payload.p1_bits == 0 && pusch_pdu->pusch_uci.csi_payload.p1_bits == 0) { // To support this we would need to shift some bits into CSI part2 -> need to change the logic - AssertFatal(pucch->n_csi == 0, "Multiplexing periodic CSI on PUSCH not supported\n"); + AssertFatal(pucch->csi_payload.p1_bits == 0, "Multiplexing periodic CSI on PUSCH not supported\n"); } release_ul_config(ulcfg_pdu, false); @@ -1845,14 +1842,14 @@ static void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frame, int slot } for (int j = 0; j < num_res; j++) { - if (pucch[j].n_harq + pucch[j].n_sr + pucch[j].n_csi != 0) { + if (pucch[j].n_harq + pucch[j].n_sr + pucch[j].csi_payload.p1_bits != 0) { LOG_D(NR_MAC, "%d.%d configure pucch, O_ACK %d, O_SR %d, O_CSI %d\n", frame, slot, pucch[j].n_harq, pucch[j].n_sr, - pucch[j].n_csi); + pucch[j].csi_payload.p1_bits); // checking if we need to schedule pucch[j] on PUSCH if (schedule_uci_on_pusch(mac, frame, slot, &pucch[j], mac->current_UL_BWP))