configure only 1 BWP at a given time (1st active BWP)

This commit is contained in:
francescomani
2025-09-04 18:43:12 +02:00
parent db93bc022f
commit 22cd4e9312
+114 -151
View File
@@ -1665,8 +1665,7 @@ static NR_SetupRelease_PDSCH_Config_t *config_pdsch(uint64_t ssb_bitmap, int bwp
return setup_pdsch_Config; return setup_pdsch_Config;
} }
static void config_downlinkBWP(NR_BWP_Downlink_t *bwp, static NR_BWP_Downlink_t *config_downlinkBWP(const NR_ServingCellConfigCommon_t *scc,
const NR_ServingCellConfigCommon_t *scc,
const NR_UE_NR_Capability_t *uecap, const NR_UE_NR_Capability_t *uecap,
int dl_antenna_ports, int dl_antenna_ports,
bool force_256qam_off, bool force_256qam_off,
@@ -1674,6 +1673,7 @@ static void config_downlinkBWP(NR_BWP_Downlink_t *bwp,
bool is_SA, bool is_SA,
const nr_mac_config_t *configuration) const nr_mac_config_t *configuration)
{ {
NR_BWP_Downlink_t *bwp = calloc_or_fail(1, sizeof(*bwp));
bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common)); bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common));
if(configuration->num_additional_bwps > 0) { if(configuration->num_additional_bwps > 0) {
const nr_bwp_config_t *bwp_config = &configuration->bwp_config[bwp_loop]; const nr_bwp_config_t *bwp_config = &configuration->bwp_config[bwp_loop];
@@ -1772,10 +1772,10 @@ static void config_downlinkBWP(NR_BWP_Downlink_t *bwp,
force_256qam_off ? NULL : uecap, force_256qam_off ? NULL : uecap,
bwp->bwp_Dedicated, bwp->bwp_Dedicated,
scc); scc);
return bwp;
} }
static void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, static NR_BWP_Uplink_t *config_uplinkBWP(long bwp_loop,
long bwp_loop,
bool is_SA, bool is_SA,
int uid, int uid,
int maxMIMO_Layers, int maxMIMO_Layers,
@@ -1783,6 +1783,7 @@ static void config_uplinkBWP(NR_BWP_Uplink_t *ubwp,
const NR_ServingCellConfigCommon_t *scc, const NR_ServingCellConfigCommon_t *scc,
const NR_UE_NR_Capability_t *uecap) const NR_UE_NR_Capability_t *uecap)
{ {
NR_BWP_Uplink_t *ubwp = calloc_or_fail(1, sizeof(*ubwp));
ubwp->bwp_Common = calloc(1, sizeof(*ubwp->bwp_Common)); ubwp->bwp_Common = calloc(1, sizeof(*ubwp->bwp_Common));
if(configuration->num_additional_bwps > 0) { if(configuration->num_additional_bwps > 0) {
ubwp->bwp_Id = configuration->bwp_config[bwp_loop].id; ubwp->bwp_Id = configuration->bwp_config[bwp_loop].id;
@@ -1843,6 +1844,7 @@ static void config_uplinkBWP(NR_BWP_Uplink_t *ubwp,
ubwp->bwp_Dedicated->configuredGrantConfig = NULL; ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL; ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
return ubwp;
} }
static void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig) static void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig)
@@ -3103,16 +3105,28 @@ static NR_MAC_CellGroupConfig_t *configure_mac_cellgroup(const nr_mac_timers_t *
return mac_CellGroupConfig; return mac_CellGroupConfig;
} }
// Set HARQ related IEs according to the number of DL, UL harqprocesses configured static void allocate_32_harq(NR_PDSCH_Config_t *pdsch_Config)
static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_ulharq)
{ {
if (!pdsch_Config->ext3)
pdsch_Config->ext3 = calloc(1, sizeof(*pdsch_Config->ext3));
asn1cCallocOne(pdsch_Config->ext3->harq_ProcessNumberSizeDCI_1_1_r17, 5);
}
AssertFatal(scc && scc->pdsch_ServingCellConfig && static void allocate_32_ul_harq(NR_PUSCH_Config_t *pusch_Config)
scc->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup, {
if (!pusch_Config->ext2)
pusch_Config->ext2 = calloc(1, sizeof(*pusch_Config->ext2));
asn1cCallocOne(pusch_Config->ext2->harq_ProcessNumberSizeDCI_0_1_r17, 5);
}
// Set HARQ related IEs according to the number of DL, UL harqprocesses configured
static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_ulharq, int bwp_id)
{
AssertFatal(scc
&& scc->pdsch_ServingCellConfig
&& scc->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
"PDSCH_Servingcellconfig IEs NOT present\n"); "PDSCH_Servingcellconfig IEs NOT present\n");
NR_PDSCH_ServingCellConfig_t *pdsch_scc = scc->pdsch_ServingCellConfig->choice.setup; NR_PDSCH_ServingCellConfig_t *pdsch_scc = scc->pdsch_ServingCellConfig->choice.setup;
switch (num_dlharq) { switch (num_dlharq) {
case 2: case 2:
*pdsch_scc->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n2; *pdsch_scc->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n2;
@@ -3141,34 +3155,27 @@ static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_u
pdsch_scc->ext3 = calloc(1, sizeof(*pdsch_scc->ext3)); pdsch_scc->ext3 = calloc(1, sizeof(*pdsch_scc->ext3));
asn1cCallocOne(pdsch_scc->ext3->nrofHARQ_ProcessesForPDSCH_v1700, asn1cCallocOne(pdsch_scc->ext3->nrofHARQ_ProcessesForPDSCH_v1700,
NR_PDSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPDSCH_v1700_n32); NR_PDSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPDSCH_v1700_n32);
NR_BWP_DownlinkDedicated_t *dlbwp = scc->initialDownlinkBWP; NR_BWP_DownlinkDedicated_t *dlbwp = NULL;
if (dlbwp && dlbwp->pdsch_Config && if (bwp_id == 0) {
dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup) { dlbwp = scc->initialDownlinkBWP;
NR_PDSCH_Config_t *dlcfg = scc->initialDownlinkBWP->pdsch_Config->choice.setup; if (dlbwp && dlbwp->pdsch_Config && dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup)
if (!dlcfg->ext3) allocate_32_harq(scc->initialDownlinkBWP->pdsch_Config->choice.setup);
dlcfg->ext3 = calloc(1, sizeof(*dlcfg->ext3)); } else {
asn1cCallocOne(dlcfg->ext3->harq_ProcessNumberSizeDCI_1_1_r17, 5); for (int i = 0; i < scc->downlinkBWP_ToAddModList->list.count; i++) {
} if (scc->downlinkBWP_ToAddModList->list.array[i]->bwp_Id != bwp_id)
int num_dl_bwp = 0; continue;
if (scc->downlinkBWP_ToAddModList)
num_dl_bwp = scc->downlinkBWP_ToAddModList->list.count;
for (int i = 0;i < num_dl_bwp; i++) {
dlbwp = scc->downlinkBWP_ToAddModList->list.array[i]->bwp_Dedicated; dlbwp = scc->downlinkBWP_ToAddModList->list.array[i]->bwp_Dedicated;
if (dlbwp && dlbwp->pdsch_Config && if (dlbwp && dlbwp->pdsch_Config && dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup)
dlbwp->pdsch_Config->present == NR_SetupRelease_PDSCH_Config_PR_setup) { allocate_32_harq(dlbwp->pdsch_Config->choice.setup);
NR_PDSCH_Config_t *dlcfg = dlbwp->pdsch_Config->choice.setup;
if (!dlcfg->ext3)
dlcfg->ext3 = calloc(1, sizeof(*dlcfg->ext3));
asn1cCallocOne(dlcfg->ext3->harq_ProcessNumberSizeDCI_1_1_r17, 5);
} }
} }
break; break;
default: // Already IE should have been set to 16 harq processes default: // Already IE should have been set to 16 harq processes
AssertFatal(false, "Invalid number of HARQ processes\n");
break; break;
} }
AssertFatal(scc->uplinkConfig, "uplinkConfig IE NOT present\n");
AssertFatal(scc->uplinkConfig,"uplinkConfig IE NOT present\n");
if (num_ulharq == 32) { if (num_ulharq == 32) {
if (!scc->uplinkConfig->pusch_ServingCellConfig) if (!scc->uplinkConfig->pusch_ServingCellConfig)
@@ -3181,25 +3188,18 @@ static void fill_harq_IEs(NR_ServingCellConfig_t *scc, int num_dlharq, int num_u
pusch_scc->ext3 = calloc(1, sizeof(*pusch_scc->ext3)); pusch_scc->ext3 = calloc(1, sizeof(*pusch_scc->ext3));
asn1cCallocOne(pusch_scc->ext3->nrofHARQ_ProcessesForPUSCH_r17, asn1cCallocOne(pusch_scc->ext3->nrofHARQ_ProcessesForPUSCH_r17,
NR_PUSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPUSCH_r17_n32); NR_PUSCH_ServingCellConfig__ext3__nrofHARQ_ProcessesForPUSCH_r17_n32);
NR_BWP_UplinkDedicated_t *ulbwp = scc->uplinkConfig->initialUplinkBWP; NR_BWP_UplinkDedicated_t *ulbwp = NULL;
if (ulbwp && ulbwp->pusch_Config && if (bwp_id == 0) {
ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup) { ulbwp = scc->uplinkConfig->initialUplinkBWP;
NR_PUSCH_Config_t *ulcfg = ulbwp->pusch_Config->choice.setup; if (ulbwp && ulbwp->pusch_Config && ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup)
if (!ulcfg->ext2) allocate_32_ul_harq(ulbwp->pusch_Config->choice.setup);
ulcfg->ext2 = calloc(1, sizeof(*ulcfg->ext2)); } else {
asn1cCallocOne(ulcfg->ext2->harq_ProcessNumberSizeDCI_0_1_r17, 5); for (int i = 0; i < scc->uplinkConfig->uplinkBWP_ToAddModList->list.count; i++) {
} if (bwp_id != scc->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Id)
int num_ul_bwp = 0; continue;
if (scc->uplinkConfig->uplinkBWP_ToAddModList)
num_ul_bwp = scc->uplinkConfig->uplinkBWP_ToAddModList->list.count;
for (int i = 0;i < num_ul_bwp; i++) {
ulbwp = scc->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Dedicated; ulbwp = scc->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Dedicated;
if (ulbwp && ulbwp->pusch_Config && if (ulbwp && ulbwp->pusch_Config && ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup)
ulbwp->pusch_Config->present == NR_SetupRelease_PUSCH_Config_PR_setup) { allocate_32_ul_harq(ulbwp->pusch_Config->choice.setup);
NR_PUSCH_Config_t *ulcfg = ulbwp->pusch_Config->choice.setup;
if (!ulcfg->ext2)
ulcfg->ext2 = calloc(1, sizeof(*ulcfg->ext2));
asn1cCallocOne(ulcfg->ext2->harq_ProcessNumberSizeDCI_0_1_r17, 5);
} }
} }
} }
@@ -3321,43 +3321,29 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
} }
uint64_t bitmap = get_ssb_bitmap(scc); uint64_t bitmap = get_ssb_bitmap(scc);
int first_active_bwp = 0;
if (configuration->num_additional_bwps > 0)
first_active_bwp = configuration->first_active_bwp;
asn1cCallocOne(configDedicated->firstActiveDownlinkBWP_Id, first_active_bwp);
asn1cCallocOne(uplinkConfig->firstActiveUplinkBWP_Id, first_active_bwp);
if (first_active_bwp == 0) {
uplinkConfig->initialUplinkBWP = configure_initial_ul_bwp(scc, configuration, maxMIMO_Layers, uid); uplinkConfig->initialUplinkBWP = configure_initial_ul_bwp(scc, configuration, maxMIMO_Layers, uid);
configDedicated->initialDownlinkBWP = configure_initial_dl_bwp(scc, pdsch_AntennaPorts, bitmap, configuration); configDedicated->initialDownlinkBWP = configure_initial_dl_bwp(scc, pdsch_AntennaPorts, bitmap, configuration);
} else {
// Downlink BWPs
int n_dl_bwp = configuration->num_additional_bwps;
int first_active_dl_bwp = 0;
if (n_dl_bwp > 0) {
configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList)); configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { NR_BWP_Downlink_t *bwp = config_downlinkBWP(scc,
NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
config_downlinkBWP(bwp,
scc,
NULL, NULL,
0, 0,
false, false,
bwp_loop, first_active_bwp - 1,
true, true,
configuration); configuration);
asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp); asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp);
}
first_active_dl_bwp = configuration->first_active_bwp;
}
asn1cCallocOne(configDedicated->firstActiveDownlinkBWP_Id, first_active_dl_bwp);
// Uplink BWPs
int n_ul_bwp = configuration->num_additional_bwps;
int first_active_ul_bwp = 0;
if (n_ul_bwp > 0) {
uplinkConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*uplinkConfig->uplinkBWP_ToAddModList)); uplinkConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*uplinkConfig->uplinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { NR_BWP_Uplink_t *ubwp = config_uplinkBWP(first_active_bwp - 1, true, uid, maxMIMO_Layers, configuration, scc, NULL);
NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp));
config_uplinkBWP(ubwp, bwp_loop, true, uid, maxMIMO_Layers, configuration, scc, NULL);
asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ubwp); asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ubwp);
} }
first_active_ul_bwp = configuration->first_active_bwp;
}
asn1cCallocOne(uplinkConfig->firstActiveUplinkBWP_Id, first_active_ul_bwp);
configDedicated->csi_MeasConfig = calloc(1, sizeof(*configDedicated->csi_MeasConfig)); configDedicated->csi_MeasConfig = calloc(1, sizeof(*configDedicated->csi_MeasConfig));
configDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup; configDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup;
@@ -3384,23 +3370,21 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
} }
asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list, ssbresset0); asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list, ssbresset0);
int bwp_loop_end = n_dl_bwp + 1;
for (int bwp_loop = 0; bwp_loop < bwp_loop_end; bwp_loop++) {
int curr_bwp, bwp_id; int curr_bwp, bwp_id;
struct NR_SetupRelease_PDSCH_Config *pdsch_Config; NR_SetupRelease_PDSCH_Config_t *pdsch_Config;
if (bwp_loop == 0) { if (first_active_bwp == 0) {
pdsch_Config = configDedicated->initialDownlinkBWP->pdsch_Config; pdsch_Config = configDedicated->initialDownlinkBWP->pdsch_Config;
curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
bwp_id = 0; bwp_id = 0;
} else { } else {
NR_BWP_Downlink_t *bwp = configDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop - 1]; NR_BWP_Downlink_t *bwp = configDedicated->downlinkBWP_ToAddModList->list.array[0];
pdsch_Config = bwp->bwp_Dedicated->pdsch_Config; pdsch_Config = bwp->bwp_Dedicated->pdsch_Config;
curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
bwp_id = bwp->bwp_Id; bwp_id = bwp->bwp_Id;
} }
config_csirs(scc, csi_MeasConfig, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, bwp_loop); config_csirs(scc, csi_MeasConfig, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, first_active_bwp);
config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, bwp_loop); config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, first_active_bwp);
NR_CSI_ResourceConfig_t *csires1 = calloc(1, sizeof(*csires1)); NR_CSI_ResourceConfig_t *csires1 = calloc(1, sizeof(*csires1));
csires1->csi_ResourceConfigId = bwp_id + 20; csires1->csi_ResourceConfigId = bwp_id + 20;
@@ -3417,7 +3401,6 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires1); asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires1);
int pucch_Resource = 2; int pucch_Resource = 2;
if (configuration->do_CSIRS) { if (configuration->do_CSIRS) {
NR_CSI_ResourceConfig_t *csires0 = calloc(1, sizeof(*csires0)); NR_CSI_ResourceConfig_t *csires0 = calloc(1, sizeof(*csires0));
csires0->csi_ResourceConfigId = bwp_id; csires0->csi_ResourceConfigId = bwp_id;
@@ -3427,7 +3410,7 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList =
calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList)); calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1, sizeof(*nzp0)); NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1, sizeof(*nzp0));
*nzp0 = bwp_loop; *nzp0 = first_active_bwp;
asn1cSeqAdd(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list, nzp0); asn1cSeqAdd(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list, nzp0);
csires0->bwp_Id = bwp_id; csires0->bwp_Id = bwp_id;
csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
@@ -3441,7 +3424,7 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList = csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList =
calloc(1, sizeof(*csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList)); calloc(1, sizeof(*csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList));
NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1, sizeof(*csiim00)); NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1, sizeof(*csiim00));
*csiim00 = bwp_loop; *csiim00 = first_active_bwp;
asn1cSeqAdd(&csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list, csiim00); asn1cSeqAdd(&csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list, csiim00);
csires2->bwp_Id = bwp_id; csires2->bwp_Id = bwp_id;
csires2->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; csires2->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
@@ -3472,9 +3455,8 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
curr_bwp, curr_bwp,
pdsch_AntennaPorts, pdsch_AntennaPorts,
configuration->do_SINR); configuration->do_SINR);
}
fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq); fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq, first_active_bwp);
SpCellConfig->spCellConfigDedicated = configDedicated; SpCellConfig->spCellConfigDedicated = configDedicated;
if (LOG_DEBUGFLAG(DEBUG_ASN1)) { if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
@@ -3709,33 +3691,24 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
{ {
DevAssert(cellGroupConfig != NULL); DevAssert(cellGroupConfig != NULL);
DevAssert(cellGroupConfig->spCellConfig != NULL); DevAssert(cellGroupConfig->spCellConfig != NULL);
DevAssert(cellGroupConfig->spCellConfig->spCellConfigDedicated != NULL);
DevAssert(configuration != NULL); DevAssert(configuration != NULL);
DevAssert(scc != NULL); DevAssert(scc != NULL);
NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
NR_ServingCellConfig_t *spCellConfigDedicated = SpCellConfig->spCellConfigDedicated;
NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup; NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup;
set_dl_maxmimolayers(pdsch_servingcellconfig, scc, uecap, configuration->maxMIMO_layers); set_dl_maxmimolayers(pdsch_servingcellconfig, scc, uecap, configuration->maxMIMO_layers);
NR_CSI_MeasConfig_t *csi_MeasConfig = SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup; NR_CSI_MeasConfig_t *csi_MeasConfig = spCellConfigDedicated->csi_MeasConfig->choice.setup;
for (int report = 0; report < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; report++) { for (int report = 0; report < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; report++) {
NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[report]; NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[report];
if(csirep->codebookConfig) if(csirep->codebookConfig)
config_csi_codebook(&configuration->pdsch_AntennaPorts, *pdsch_servingcellconfig->ext1->maxMIMO_Layers, csirep->codebookConfig); config_csi_codebook(&configuration->pdsch_AntennaPorts, *pdsch_servingcellconfig->ext1->maxMIMO_Layers, csirep->codebookConfig);
} }
int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); NR_UplinkConfig_t *uplinkConfig = spCellConfigDedicated->uplinkConfig;
NR_UplinkConfig_t *uplinkConfig =
SpCellConfig && SpCellConfig->spCellConfigDedicated ? SpCellConfig->spCellConfigDedicated->uplinkConfig : NULL;
long maxMIMO_Layers = set_ul_max_layers(configuration, uecap); long maxMIMO_Layers = set_ul_max_layers(configuration, uecap);
if (uplinkConfig->initialUplinkBWP->pusch_Config) {
NR_PUSCH_Config_t *pusch_Config = uplinkConfig->initialUplinkBWP->pusch_Config->choice.setup;
if (pusch_Config->maxRank == NULL) {
pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
}
*pusch_Config->maxRank = maxMIMO_Layers;
}
if (!uplinkConfig->pusch_ServingCellConfig) if (!uplinkConfig->pusch_ServingCellConfig)
uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig)); uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig));
uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup; uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup;
@@ -3746,64 +3719,57 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1)); calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1));
asn1cCallocOne(uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers, maxMIMO_Layers); asn1cCallocOne(uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers, maxMIMO_Layers);
// UL and SRS configuration // Update UL BWP
if (configuration->do_SRS && uplinkConfig && uplinkConfig->initialUplinkBWP) { NR_BWP_UplinkDedicated_t *ul_bwp_Dedicated = NULL;
ASN_STRUCT_FREE(asn_DEF_NR_SetupRelease_SRS_Config, uplinkConfig->initialUplinkBWP->srs_Config); int curr_bwp = 0;
uplinkConfig->initialUplinkBWP->srs_Config = get_config_srs(scc, int bwp_id = 0;
if (uplinkConfig && uplinkConfig->initialUplinkBWP) {
ul_bwp_Dedicated = uplinkConfig->initialUplinkBWP;
curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
} else if (uplinkConfig && uplinkConfig->uplinkBWP_ToAddModList) {
struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig->uplinkBWP_ToAddModList;
AssertFatal(UL_BWP_list->list.count == 1, "We should only have 1 BWP configured at a given time\n");
NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[0];
curr_bwp = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
ul_bwp_Dedicated = ul_bwp->bwp_Dedicated;
bwp_id = ul_bwp->bwp_Id;
}
if (ul_bwp_Dedicated) {
NR_PUSCH_Config_t *pusch_Config = ul_bwp_Dedicated->pusch_Config->choice.setup;
if (!pusch_Config->maxRank)
pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
*pusch_Config->maxRank = maxMIMO_Layers;
if (configuration->do_SRS) {
ASN_STRUCT_FREE(asn_DEF_NR_SetupRelease_SRS_Config, ul_bwp_Dedicated->srs_Config);
ul_bwp_Dedicated->srs_Config = get_config_srs(scc,
uecap, uecap,
curr_bwp, curr_bwp,
uid, uid,
0, bwp_id,
maxMIMO_Layers, maxMIMO_Layers,
configuration->minRXTXTIME, configuration->minRXTXTIME,
configuration->do_SRS); configuration->do_SRS);
} }
// Set DL MCS table
NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
configuration->force_256qam_off ? NULL : uecap,
bwp_Dedicated,
scc);
NR_BWP_UplinkDedicated_t *ul_bwp_Dedicated = SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
set_ul_mcs_table(configuration->force_UL256qam_off ? NULL : uecap, scc, ul_bwp_Dedicated->pusch_Config->choice.setup);
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list =
SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig ? uplinkConfig->uplinkBWP_ToAddModList : NULL;
if (DL_BWP_list) {
for (int i = 0; i < DL_BWP_list->list.count; i++) {
NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i];
int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, bwp->bwp_Dedicated, scc);
}
}
if (UL_BWP_list) {
for (int i = 0; i < UL_BWP_list->list.count; i++) {
NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[i];
int bwp_size = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
if (ul_bwp->bwp_Dedicated->pusch_Config) {
NR_PUSCH_Config_t *pusch_Config = ul_bwp->bwp_Dedicated->pusch_Config->choice.setup;
set_ul_mcs_table(configuration->force_UL256qam_off ? NULL : uecap, scc, pusch_Config); set_ul_mcs_table(configuration->force_UL256qam_off ? NULL : uecap, scc, pusch_Config);
if (pusch_Config->maxRank == NULL) {
pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank));
}
*pusch_Config->maxRank = maxMIMO_Layers;
} }
ASN_STRUCT_FREE(asn_DEF_NR_SetupRelease_SRS_Config, ul_bwp->bwp_Dedicated->srs_Config); // Update DL BWP
ul_bwp->bwp_Dedicated->srs_Config = get_config_srs(scc, NR_BWP_DownlinkDedicated_t *bwp_Dedicated = NULL;
uecap, int scs = -1;
bwp_size, if (spCellConfigDedicated->initialDownlinkBWP) {
uid, bwp_Dedicated = spCellConfigDedicated->initialDownlinkBWP;
i + 1, scs = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
maxMIMO_Layers, } else if (spCellConfigDedicated->downlinkBWP_ToAddModList) {
configuration->minRXTXTIME, struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = spCellConfigDedicated->downlinkBWP_ToAddModList;
configuration->do_SRS); AssertFatal(DL_BWP_list->list.count == 1, "We should only have 1 BWP configured at a given time\n");
} NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[0];
bwp_Dedicated = bwp->bwp_Dedicated;
scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
} }
if (bwp_Dedicated) {
set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, bwp_Dedicated, scc);
update_cqitables(bwp_Dedicated->pdsch_Config, csi_MeasConfig); update_cqitables(bwp_Dedicated->pdsch_Config, csi_MeasConfig);
}
} }
void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig) void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig)
@@ -3935,9 +3901,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
} }
configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList)); configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) {
NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); NR_BWP_Downlink_t *bwp = config_downlinkBWP(servingcellconfigcommon,
config_downlinkBWP(bwp,
servingcellconfigcommon,
uecap, uecap,
dl_antenna_ports, dl_antenna_ports,
configuration->force_256qam_off, configuration->force_256qam_off,
@@ -3961,8 +3925,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
if (n_ul_bwp > 0) { if (n_ul_bwp > 0) {
ulConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*ulConfig->uplinkBWP_ToAddModList)); ulConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*ulConfig->uplinkBWP_ToAddModList));
for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) {
NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp)); NR_BWP_Uplink_t *ubwp = config_uplinkBWP(bwp_loop, false, uid, maxMIMO_Layers, configuration, servingcellconfigcommon, uecap);
config_uplinkBWP(ubwp, bwp_loop, false, uid, maxMIMO_Layers, configuration, servingcellconfigcommon, uecap);
asn1cSeqAdd(&ulConfig->uplinkBWP_ToAddModList->list, ubwp); asn1cSeqAdd(&ulConfig->uplinkBWP_ToAddModList->list, ubwp);
} }
ulConfig->firstActiveUplinkBWP_Id = calloc(1, sizeof(*ulConfig->firstActiveUplinkBWP_Id)); ulConfig->firstActiveUplinkBWP_Id = calloc(1, sizeof(*ulConfig->firstActiveUplinkBWP_Id));
@@ -4125,7 +4088,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
configDedicated->pathlossReferenceLinking = NULL; configDedicated->pathlossReferenceLinking = NULL;
configDedicated->servingCellMO = NULL; configDedicated->servingCellMO = NULL;
fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq); fill_harq_IEs(configDedicated, configuration->num_dlharq, configuration->num_ulharq, firstActiveDownlinkBWP_Id);
secondaryCellGroup->spCellConfig->spCellConfigDedicated = configDedicated; secondaryCellGroup->spCellConfig->spCellConfigDedicated = configDedicated;
if (LOG_DEBUGFLAG(DEBUG_ASN1)) { if (LOG_DEBUGFLAG(DEBUG_ASN1)) {