diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 58c18bfd36..f389fbf33b 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -1441,3 +1441,32 @@ unsigned short get_m_srs(int c_srs, int b_srs) { unsigned short get_N_b_srs(int c_srs, int b_srs) { return srs_bandwidth_config[c_srs][b_srs][1]; } + +frequency_range_t get_freq_range_from_freq(uint64_t freq) +{ + // 3GPP TS 38.101-1 Version 19.0.0 Table 5.1-1: Definition of frequency ranges + if (freq >= 410000000 && freq <= 7125000000) + return FR1; + + if (freq >= 24250000000 && freq <= 71000000000) + return FR2; + + AssertFatal(false, "Undefined Frequency Range for frequency %ld Hz\n", freq); +} + +frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn) +{ + // 3GPP TS 38.101-1 Version 19.0.0 Table 5.1-1: Definition of frequency ranges + if (arfcn >= 82000 && arfcn <= 875000) + return FR1; + + if (arfcn >= 2016667 && arfcn <= 2795832) + return FR2; + + AssertFatal(false, "Undefined Frequency Range for ARFCN %d\n", arfcn); +} + +frequency_range_t get_freq_range_from_band(uint16_t band) +{ + return band <= 256 ? FR1 : FR2; +} diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 1dc6a1169d..dcacea4ff0 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -299,6 +299,10 @@ unsigned int get_prach_K(int prach_sequence_length, int prach_fmt_id, int pusch_ int get_slot_idx_in_period(const int slot, const frame_structure_t *fs); +frequency_range_t get_freq_range_from_freq(uint64_t freq); +frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn); +frequency_range_t get_freq_range_from_band(uint16_t band); + #define CEILIDIV(a,b) ((a+b-1)/b) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 451144dfee..495f26e986 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -354,7 +354,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB, } fp->threequarter_fs = 0; - frequency_range_t frequency_range = fp->nr_band > 256 ? FR2 : FR1; + frequency_range_t frequency_range = get_freq_range_from_band(fp->nr_band); int bw_index = get_supported_band_index(mu, frequency_range, N_RB_DL); gNB_config->carrier_config.dl_bandwidth.value = get_supported_bw_mhz(frequency_range, bw_index); diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 1f5c22c71e..5163ab3bb8 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -321,7 +321,7 @@ void nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg, NR_DL_FRAME_PARMS * fp->get_samples_slot_timestamp = &get_samples_slot_timestamp; fp->get_slot_from_timestamp = &get_slot_from_timestamp; fp->samples_per_frame = 10 * fp->samples_per_subframe; - fp->freq_range = (fp->dl_CarrierFreq < 6e9) ? FR1 : FR2; + fp->freq_range = get_freq_range_from_freq(fp->dl_CarrierFreq); fp->Ncp = Ncp; @@ -405,7 +405,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp, fp->get_samples_per_slot = &get_samples_per_slot; fp->get_samples_slot_timestamp = &get_samples_slot_timestamp; fp->samples_per_frame = 10 * fp->samples_per_subframe; - fp->freq_range = (fp->dl_CarrierFreq < 6e9) ? FR1 : FR2; + fp->freq_range = get_freq_range_from_freq(fp->dl_CarrierFreq); uint8_t sco = 0; if (((fp->freq_range == FR1) && (config->ssb_table.ssb_subcarrier_offset < 24)) || @@ -439,7 +439,9 @@ void nr_init_frame_parms_ue_sa(NR_DL_FRAME_PARMS *frame_parms, uint64_t downlink frame_parms->numerology_index = mu; frame_parms->dl_CarrierFreq = downlink_frequency; frame_parms->ul_CarrierFreq = downlink_frequency + delta_duplex; - frame_parms->freq_range = (frame_parms->dl_CarrierFreq < 6e9)? FR1 : FR2; + if (get_softmodem_params()->sl_mode == 0) { + frame_parms->freq_range = get_freq_range_from_freq(frame_parms->dl_CarrierFreq); + } frame_parms->N_RB_UL = frame_parms->N_RB_DL; frame_parms->nr_band = nr_band; @@ -570,7 +572,7 @@ int nr_init_frame_parms_ue_sl(NR_DL_FRAME_PARMS *fp, fp->get_samples_per_slot = &get_samples_per_slot; fp->get_samples_slot_timestamp = &get_samples_slot_timestamp; fp->samples_per_frame = 10 * fp->samples_per_subframe; - fp->freq_range = (fp->sl_CarrierFreq < 6e9) ? FR1 : FR2; + fp->freq_range = get_freq_range_from_freq(fp->sl_CarrierFreq); // ssb_offset_pointa points to the first RE where Sidelink-PSBCH starts fp->ssb_start_subcarrier = config->sl_bwp_config.sl_ssb_offset_point_a; diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index eb3537650b..51cb585079 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -481,7 +481,7 @@ int main(int argc, char **argv){ gNB->gNB_config.prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *) malloc(num_prach_fd_occasions*sizeof(nfapi_nr_num_prach_fd_occasions_t)); gNB->proc.slot_rx = slot; - frequency_range_t freq_range = absoluteFrequencyPointA > 2016666 ? FR2 : FR1; + frequency_range_t freq_range = get_freq_range_from_arfcn(absoluteFrequencyPointA); nr_prach_info_t prach_info = get_nr_prach_occasion_info_from_index(config_index, freq_range, frame_parms->frame_type); int ret = get_nr_prach_sched_from_info(prach_info, config_index, diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index 2da3d9df93..d30c51ecc1 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -1630,7 +1630,7 @@ uint16_t get_nr_prach_format_from_index(uint8_t index, uint32_t pointa, uint8_t { uint8_t format2 = 0xff; uint16_t format; - if (pointa > 2016666) { // FR2 + if (get_freq_range_from_arfcn(pointa) == FR2) { if (table_6_3_3_2_4_prachConfig_Index[index][1] != -1) format2 = (uint8_t)table_6_3_3_2_4_prachConfig_Index[index][1]; format = ((uint8_t)table_6_3_3_2_4_prachConfig_Index[index][0]) | (format2 << 8); diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 8c905a8f58..1f0e552ba0 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -324,7 +324,7 @@ static void config_common_ue(NR_UE_MAC_INST_t *mac, NR_ServingCellConfigCommon_t if (frequencyInfoDL) { // NeedM for inter-freq handover mac->nr_band = *frequencyInfoDL->frequencyBandList.list.array[0]; frame_type = get_frame_type(mac->nr_band, get_softmodem_params()->numerology); - mac->frequency_range = mac->nr_band < 256 ? FR1 : FR2; + mac->frequency_range = get_freq_range_from_band(mac->nr_band); int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, mac->frequency_range, diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 0abe35b80d..d0a737e61c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -410,7 +410,7 @@ static void config_common(gNB_MAC_INST *nrmac, // Carrier configuration struct NR_FrequencyInfoDL *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL; - frequency_range_t frequency_range = *frequencyInfoDL->frequencyBandList.list.array[0] > 256 ? FR2 : FR1; + frequency_range_t frequency_range = get_freq_range_from_band(*frequencyInfoDL->frequencyBandList.list.array[0]); int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing, frequency_range, frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); @@ -440,7 +440,7 @@ static void config_common(gNB_MAC_INST *nrmac, } struct NR_FrequencyInfoUL *frequencyInfoUL = scc->uplinkConfigCommon->frequencyInfoUL; int scs = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; - frequency_range = *frequencyInfoUL->frequencyBandList->list.array[0] > 256 ? FR2 : FR1; + frequency_range = get_freq_range_from_band(*frequencyInfoUL->frequencyBandList->list.array[0]); bw_index = get_supported_band_index(scs, frequency_range, frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); cfg->carrier_config.uplink_bandwidth.value = get_supported_bw_mhz(frequency_range, bw_index); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 9bf8b739bf..3a64ac16c9 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -92,7 +92,7 @@ static int16_t ssb_index_from_prach(module_id_t module_idP, msgacc = scc->uplinkConfigCommon->initialUplinkBWP->ext1->msgA_ConfigCommon_r16->choice.setup; const int ul_mu = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; const int mu = nr_get_prach_or_ul_mu(msgacc, rach_ConfigCommon, ul_mu); - frequency_range_t freq_range = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666 ? FR2 : FR1; + frequency_range_t freq_range = get_freq_range_from_arfcn(scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); get_nr_prach_sched_from_info(cc->prach_info, config_index, frameP, slotP, mu, freq_range, &RA_sfn_index, cc->frame_type); uint8_t index = 0, slot_index = 0; @@ -184,7 +184,7 @@ void find_SSB_and_RO_available(gNB_MAC_INST *nrmac) } // prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4 - frequency_range_t freq_range = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666 ? FR2 : FR1; + frequency_range_t freq_range = get_freq_range_from_arfcn(scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); nr_prach_info_t prach_info = get_nr_prach_occasion_info_from_index(config_index, freq_range, cc->frame_type); float num_ssb_per_RO = ssb_per_rach_occasion[cfg->prach_config.ssb_per_rach.value]; @@ -380,7 +380,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP) const int mu = nr_get_prach_or_ul_mu(msgacc, rach_ConfigCommon, ul_mu); // prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4 uint16_t RA_sfn_index = -1; - frequency_range_t freq_range = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666 ? FR2 : FR1; + frequency_range_t freq_range = get_freq_range_from_arfcn(scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); if (get_nr_prach_sched_from_info(cc->prach_info, config_index, frameP, slotP, mu, freq_range, &RA_sfn_index, cc->frame_type)) { uint16_t format0 = cc->prach_info.format & 0xff; // first column of format from table uint16_t format1 = (cc->prach_info.format >> 8) & 0xff; // second column of format from table diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index a6c2ae1c9c..9976a2d39c 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -610,7 +610,7 @@ void set_dl_maxmimolayers(NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig, NR_SCS_SpecificCarrier_t *scs_carrier = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]; int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; - const frequency_range_t freq_range = band < 257 ? FR1 : FR2; + const frequency_range_t freq_range = get_freq_range_from_band(band); const int scs = scs_carrier->subcarrierSpacing; const int bw_size = scs_carrier->carrierBandwidth; @@ -918,7 +918,7 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, *bandNRinfo->pusch_256QAM = NR_BandNR__pusch_256QAM_supported; } if (mcs_table_dl == 1) { - const frequency_range_t freq_range = band < 257 ? FR1 : FR2; + const frequency_range_t freq_range = get_freq_range_from_band(band); if (freq_range == FR2) { bandNRinfo->pdsch_256QAM_FR2 = calloc(1, sizeof(*bandNRinfo->pdsch_256QAM_FR2)); *bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported; @@ -1368,7 +1368,7 @@ static void set_dl_mcs_table(int scs, AssertFatal(bw_rb > 0,"Could not find scs-SpecificCarrierList element for scs %d", scs); bool supported = false; - const frequency_range_t freq_range = band > 256 ? FR2 : FR1; + const frequency_range_t freq_range = get_freq_range_from_band(band); if (freq_range == FR2) { for (int i = 0; i < cap->rf_Parameters.supportedBandListNR.list.count; i++) { NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i]; @@ -2511,7 +2511,7 @@ NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const NR_ServingCellConfigCommon_t *scc, frequencyInfoDL->frequencyBandList.list.array[i]; } - frequency_range_t frequency_range = band > 256 ? FR2 : FR1; + frequency_range_t frequency_range = get_freq_range_from_band(band); sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = get_ssb_offset_to_pointA(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA, scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index d0d1273776..dc1cb72baa 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -1614,7 +1614,7 @@ static void handle_measid_addmod(rrcPerNB_t *rrc, struct NR_MeasIdToAddModList * else if (obj_nr->refFreqCSI_RS) freq = *obj_nr->refFreqCSI_RS; AssertFatal(freq > 0, "Invalid ARFCN frequency for this measurement object\n"); - if (freq > 2016666) + if (get_freq_range_from_arfcn(freq) == FR2) nr_timer_setup(&timers->T321, 16000, 10); // 16 seconds for FR2 else nr_timer_setup(&timers->T321, 2000, 10); // 2 seconds for FR1