common structure for non-BWP servingcell info
This commit is contained in:
@@ -569,7 +569,6 @@ typedef struct NR_UE_DL_BWP {
|
|||||||
uint16_t initial_BWPStart;
|
uint16_t initial_BWPStart;
|
||||||
NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList_Common;
|
NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList_Common;
|
||||||
NR_PDSCH_Config_t *pdsch_Config;
|
NR_PDSCH_Config_t *pdsch_Config;
|
||||||
NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig;
|
|
||||||
uint8_t mcsTableIdx;
|
uint8_t mcsTableIdx;
|
||||||
nr_dci_format_t dci_format;
|
nr_dci_format_t dci_format;
|
||||||
int bw_tbslbrm;
|
int bw_tbslbrm;
|
||||||
@@ -585,13 +584,11 @@ typedef struct NR_UE_UL_BWP {
|
|||||||
uint16_t initial_BWPSize;
|
uint16_t initial_BWPSize;
|
||||||
uint16_t initial_BWPStart;
|
uint16_t initial_BWPStart;
|
||||||
NR_RACH_ConfigCommon_t *rach_ConfigCommon;
|
NR_RACH_ConfigCommon_t *rach_ConfigCommon;
|
||||||
NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig;
|
|
||||||
NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList_Common;
|
NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList_Common;
|
||||||
NR_ConfiguredGrantConfig_t *configuredGrantConfig;
|
NR_ConfiguredGrantConfig_t *configuredGrantConfig;
|
||||||
NR_PUSCH_Config_t *pusch_Config;
|
NR_PUSCH_Config_t *pusch_Config;
|
||||||
NR_PUCCH_Config_t *pucch_Config;
|
NR_PUCCH_Config_t *pucch_Config;
|
||||||
NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon;
|
NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon;
|
||||||
NR_UplinkConfig_t *supplementaryUplink;
|
|
||||||
NR_CSI_MeasConfig_t *csi_MeasConfig;
|
NR_CSI_MeasConfig_t *csi_MeasConfig;
|
||||||
NR_SRS_Config_t *srs_Config;
|
NR_SRS_Config_t *srs_Config;
|
||||||
long *msg3_DeltaPreamble;
|
long *msg3_DeltaPreamble;
|
||||||
@@ -602,6 +599,21 @@ typedef struct NR_UE_UL_BWP {
|
|||||||
int max_fb_time;
|
int max_fb_time;
|
||||||
} NR_UE_UL_BWP_t;
|
} NR_UE_UL_BWP_t;
|
||||||
|
|
||||||
|
// non-BWP seving cell configuration
|
||||||
|
typedef struct {
|
||||||
|
NR_CrossCarrierSchedulingConfig_t *crossCarrierSchedulingConfig;
|
||||||
|
NR_SRS_CarrierSwitching_t *carrierSwitching;
|
||||||
|
NR_UplinkConfig_t *supplementaryUplink;
|
||||||
|
NR_PDSCH_CodeBlockGroupTransmission_t *pdsch_CGB_Transmission;
|
||||||
|
long *xOverhead_PDSCH;
|
||||||
|
long *nrofHARQ_ProcessesForPDSCH;
|
||||||
|
long *maxMIMO_Layers_PDSCH;
|
||||||
|
NR_PUSCH_CodeBlockGroupTransmission_t *pusch_CGB_Transmission;
|
||||||
|
long *rateMatching_PUSCH;
|
||||||
|
long *xOverhead_PUSCH;
|
||||||
|
long *maxMIMO_Layers_PUSCH;
|
||||||
|
} NR_UE_ServingCell_Info_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
defaultA = 0,
|
defaultA = 0,
|
||||||
defaultB = 1,
|
defaultB = 1,
|
||||||
|
|||||||
@@ -2865,7 +2865,7 @@ uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// #define DEBUG_SRS_RESOURCE_IND
|
// #define DEBUG_SRS_RESOURCE_IND
|
||||||
uint8_t compute_srs_resource_indicator(NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig,
|
uint8_t compute_srs_resource_indicator(long *maxMIMO_Layers,
|
||||||
NR_PUSCH_Config_t *pusch_Config,
|
NR_PUSCH_Config_t *pusch_Config,
|
||||||
NR_SRS_Config_t *srs_config,
|
NR_SRS_Config_t *srs_config,
|
||||||
nr_srs_feedback_t *srs_feedback,
|
nr_srs_feedback_t *srs_feedback,
|
||||||
@@ -2930,15 +2930,10 @@ uint8_t compute_srs_resource_indicator(NR_PUSCH_ServingCellConfig_t *pusch_servi
|
|||||||
// - otherwise, Lmax is given by the maximum number of layers for PUSCH supported by the UE for the serving cell
|
// - otherwise, Lmax is given by the maximum number of layers for PUSCH supported by the UE for the serving cell
|
||||||
// for non-codebook based operation.
|
// for non-codebook based operation.
|
||||||
int Lmax = 0;
|
int Lmax = 0;
|
||||||
if (pusch_servingcellconfig != NULL) {
|
if (maxMIMO_Layers != NULL)
|
||||||
if (pusch_servingcellconfig->ext1->maxMIMO_Layers != NULL) {
|
Lmax = *maxMIMO_Layers;
|
||||||
Lmax = *pusch_servingcellconfig->ext1->maxMIMO_Layers;
|
else
|
||||||
} else {
|
|
||||||
AssertFatal(1 == 0, "MIMO on PUSCH not supported, maxMIMO_Layers needs to be set to 1\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
AssertFatal(1 == 0, "MIMO on PUSCH not supported, maxMIMO_Layers needs to be set to 1\n");
|
AssertFatal(1 == 0, "MIMO on PUSCH not supported, maxMIMO_Layers needs to be set to 1\n");
|
||||||
}
|
|
||||||
int lmin = 0;
|
int lmin = 0;
|
||||||
int lsum = 0;
|
int lsum = 0;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
@@ -3278,7 +3273,7 @@ uint16_t get_rb_bwp_dci(nr_dci_format_t format,
|
|||||||
|
|
||||||
uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
||||||
const NR_UE_UL_BWP_t *UL_BWP,
|
const NR_UE_UL_BWP_t *UL_BWP,
|
||||||
const NR_CrossCarrierSchedulingConfig_t *crossCarrierSchedulingConfig,
|
const NR_UE_ServingCell_Info_t *sc_info,
|
||||||
long pdsch_HARQ_ACK_Codebook,
|
long pdsch_HARQ_ACK_Codebook,
|
||||||
dci_pdu_rel15_t *dci_pdu,
|
dci_pdu_rel15_t *dci_pdu,
|
||||||
nr_dci_format_t format,
|
nr_dci_format_t format,
|
||||||
@@ -3329,13 +3324,13 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
|||||||
/// fixed: Format identifier 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2, ULSCH indicator 1 --16
|
/// fixed: Format identifier 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2, ULSCH indicator 1 --16
|
||||||
size += 16;
|
size += 16;
|
||||||
// Carrier indicator
|
// Carrier indicator
|
||||||
if (crossCarrierSchedulingConfig != NULL) {
|
if (sc_info->crossCarrierSchedulingConfig) {
|
||||||
dci_pdu->carrier_indicator.nbits=3;
|
dci_pdu->carrier_indicator.nbits = 3;
|
||||||
size += dci_pdu->carrier_indicator.nbits;
|
size += dci_pdu->carrier_indicator.nbits;
|
||||||
}
|
}
|
||||||
// UL/SUL indicator
|
// UL/SUL indicator
|
||||||
if (UL_BWP->supplementaryUplink != NULL) {
|
if (sc_info->supplementaryUplink) {
|
||||||
dci_pdu->carrier_indicator.nbits=1;
|
dci_pdu->carrier_indicator.nbits = 1;
|
||||||
size += dci_pdu->ul_sul_indicator.nbits;
|
size += dci_pdu->ul_sul_indicator.nbits;
|
||||||
}
|
}
|
||||||
// BWP Indicator
|
// BWP Indicator
|
||||||
@@ -3384,12 +3379,12 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
|||||||
size += dci_pdu->dai[0].nbits;
|
size += dci_pdu->dai[0].nbits;
|
||||||
LOG_D(NR_MAC, "DAI1 nbits %d\n", dci_pdu->dai[0].nbits);
|
LOG_D(NR_MAC, "DAI1 nbits %d\n", dci_pdu->dai[0].nbits);
|
||||||
// 2nd DAI
|
// 2nd DAI
|
||||||
if (DL_BWP->pdsch_servingcellconfig && DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission != NULL) {
|
if (sc_info->pdsch_CGB_Transmission) {
|
||||||
dci_pdu->dai[1].nbits = 2;
|
dci_pdu->dai[1].nbits = 2;
|
||||||
size += dci_pdu->dai[1].nbits;
|
size += dci_pdu->dai[1].nbits;
|
||||||
}
|
}
|
||||||
// SRS resource indicator
|
// SRS resource indicator
|
||||||
dci_pdu->srs_resource_indicator.nbits = compute_srs_resource_indicator(UL_BWP->pusch_servingcellconfig, pusch_Config, srs_config, NULL, NULL);
|
dci_pdu->srs_resource_indicator.nbits = compute_srs_resource_indicator(sc_info->maxMIMO_Layers_PUSCH, pusch_Config, srs_config, NULL, NULL);
|
||||||
size += dci_pdu->srs_resource_indicator.nbits;
|
size += dci_pdu->srs_resource_indicator.nbits;
|
||||||
LOG_D(NR_MAC, "dci_pdu->srs_resource_indicator.nbits %d\n", dci_pdu->srs_resource_indicator.nbits);
|
LOG_D(NR_MAC, "dci_pdu->srs_resource_indicator.nbits %d\n", dci_pdu->srs_resource_indicator.nbits);
|
||||||
// Precoding info and number of layers
|
// Precoding info and number of layers
|
||||||
@@ -3417,7 +3412,7 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
|||||||
size += dci_pdu->antenna_ports.nbits;
|
size += dci_pdu->antenna_ports.nbits;
|
||||||
LOG_D(NR_MAC,"dci_pdu->antenna_ports.nbits = %d\n",dci_pdu->antenna_ports.nbits);
|
LOG_D(NR_MAC,"dci_pdu->antenna_ports.nbits = %d\n",dci_pdu->antenna_ports.nbits);
|
||||||
// SRS request
|
// SRS request
|
||||||
if (UL_BWP->supplementaryUplink == NULL)
|
if (sc_info->supplementaryUplink == NULL)
|
||||||
dci_pdu->srs_request.nbits = 2;
|
dci_pdu->srs_request.nbits = 2;
|
||||||
else
|
else
|
||||||
dci_pdu->srs_request.nbits = 3;
|
dci_pdu->srs_request.nbits = 3;
|
||||||
@@ -3430,8 +3425,8 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// CBGTI
|
// CBGTI
|
||||||
if (UL_BWP->pusch_servingcellconfig && UL_BWP->pusch_servingcellconfig->codeBlockGroupTransmission != NULL) {
|
if (sc_info->pusch_CGB_Transmission) {
|
||||||
int num = UL_BWP->pusch_servingcellconfig->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
|
int num = sc_info->pusch_CGB_Transmission->maxCodeBlockGroupsPerTransportBlock;
|
||||||
dci_pdu->cbgti.nbits = 2 + (num<<1);
|
dci_pdu->cbgti.nbits = 2 + (num<<1);
|
||||||
size += dci_pdu->cbgti.nbits;
|
size += dci_pdu->cbgti.nbits;
|
||||||
}
|
}
|
||||||
@@ -3482,8 +3477,8 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
|||||||
// Format identifier
|
// Format identifier
|
||||||
size = 1;
|
size = 1;
|
||||||
// Carrier indicator
|
// Carrier indicator
|
||||||
if (crossCarrierSchedulingConfig != NULL) {
|
if (sc_info->crossCarrierSchedulingConfig) {
|
||||||
dci_pdu->carrier_indicator.nbits=3;
|
dci_pdu->carrier_indicator.nbits = 3;
|
||||||
size += dci_pdu->carrier_indicator.nbits;
|
size += dci_pdu->carrier_indicator.nbits;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3576,20 +3571,20 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
|||||||
size += dci_pdu->transmission_configuration_indication.nbits;
|
size += dci_pdu->transmission_configuration_indication.nbits;
|
||||||
}
|
}
|
||||||
// SRS request
|
// SRS request
|
||||||
if (UL_BWP->supplementaryUplink == NULL)
|
if (sc_info->supplementaryUplink == NULL)
|
||||||
dci_pdu->srs_request.nbits = 2;
|
dci_pdu->srs_request.nbits = 2;
|
||||||
else
|
else
|
||||||
dci_pdu->srs_request.nbits = 3;
|
dci_pdu->srs_request.nbits = 3;
|
||||||
size += dci_pdu->srs_request.nbits;
|
size += dci_pdu->srs_request.nbits;
|
||||||
// CBGTI
|
// CBGTI
|
||||||
if (DL_BWP->pdsch_servingcellconfig && DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission != NULL) {
|
if (sc_info->pdsch_CGB_Transmission) {
|
||||||
uint8_t maxCBGperTB = (DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock + 1) * 2;
|
uint8_t maxCBGperTB = (sc_info->pdsch_CGB_Transmission->maxCodeBlockGroupsPerTransportBlock + 1) * 2;
|
||||||
long *maxCWperDCI_rrc = pdsch_Config->maxNrofCodeWordsScheduledByDCI;
|
long *maxCWperDCI_rrc = pdsch_Config->maxNrofCodeWordsScheduledByDCI;
|
||||||
uint8_t maxCW = (maxCWperDCI_rrc == NULL) ? 1 : *maxCWperDCI_rrc;
|
uint8_t maxCW = (maxCWperDCI_rrc == NULL) ? 1 : *maxCWperDCI_rrc;
|
||||||
dci_pdu->cbgti.nbits = maxCBGperTB * maxCW;
|
dci_pdu->cbgti.nbits = maxCBGperTB * maxCW;
|
||||||
size += dci_pdu->cbgti.nbits;
|
size += dci_pdu->cbgti.nbits;
|
||||||
// CBGFI
|
// CBGFI
|
||||||
if (DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator) {
|
if (sc_info->pdsch_CGB_Transmission->codeBlockGroupFlushIndicator) {
|
||||||
dci_pdu->cbgfi.nbits = 1;
|
dci_pdu->cbgfi.nbits = 1;
|
||||||
size += dci_pdu->cbgfi.nbits;
|
size += dci_pdu->cbgfi.nbits;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ bool is_nr_DL_slot(NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon, s
|
|||||||
|
|
||||||
bool is_nr_UL_slot(NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon, slot_t slotP, frame_type_t frame_type);
|
bool is_nr_UL_slot(NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon, slot_t slotP, frame_type_t frame_type);
|
||||||
|
|
||||||
uint8_t compute_srs_resource_indicator(NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig,
|
uint8_t compute_srs_resource_indicator(long *maxMIMO_Layers,
|
||||||
NR_PUSCH_Config_t *pusch_Config,
|
NR_PUSCH_Config_t *pusch_Config,
|
||||||
NR_SRS_Config_t *srs_config,
|
NR_SRS_Config_t *srs_config,
|
||||||
nr_srs_feedback_t *srs_feedback,
|
nr_srs_feedback_t *srs_feedback,
|
||||||
@@ -95,7 +95,7 @@ NR_tda_info_t get_dl_tda_info(const NR_UE_DL_BWP_t *dl_BWP, int ss_type, int tda
|
|||||||
|
|
||||||
uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
||||||
const NR_UE_UL_BWP_t *UL_BWP,
|
const NR_UE_UL_BWP_t *UL_BWP,
|
||||||
const NR_CrossCarrierSchedulingConfig_t *crossCarrierSchedulingConfig,
|
const NR_UE_ServingCell_Info_t *sc_info,
|
||||||
long pdsch_HARQ_ACK_Codebook,
|
long pdsch_HARQ_ACK_Codebook,
|
||||||
dci_pdu_rel15_t *dci_pdu,
|
dci_pdu_rel15_t *dci_pdu,
|
||||||
nr_dci_format_t format,
|
nr_dci_format_t format,
|
||||||
|
|||||||
@@ -744,11 +744,7 @@ void configure_current_BWP(NR_UE_MAC_INST_t *mac,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(spCellConfigDedicated) {
|
if(spCellConfigDedicated) {
|
||||||
UL_BWP->supplementaryUplink = spCellConfigDedicated->supplementaryUplink;
|
|
||||||
UL_BWP->csi_MeasConfig = spCellConfigDedicated->csi_MeasConfig ? spCellConfigDedicated->csi_MeasConfig->choice.setup : NULL;
|
UL_BWP->csi_MeasConfig = spCellConfigDedicated->csi_MeasConfig ? spCellConfigDedicated->csi_MeasConfig->choice.setup : NULL;
|
||||||
UL_BWP->pusch_servingcellconfig =
|
|
||||||
spCellConfigDedicated->uplinkConfig && spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig ? spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL;
|
|
||||||
DL_BWP->pdsch_servingcellconfig = spCellConfigDedicated->pdsch_ServingCellConfig ? spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup : NULL;
|
|
||||||
|
|
||||||
if (spCellConfigDedicated->firstActiveDownlinkBWP_Id)
|
if (spCellConfigDedicated->firstActiveDownlinkBWP_Id)
|
||||||
DL_BWP->bwp_id = *spCellConfigDedicated->firstActiveDownlinkBWP_Id;
|
DL_BWP->bwp_id = *spCellConfigDedicated->firstActiveDownlinkBWP_Id;
|
||||||
@@ -1013,6 +1009,109 @@ void configure_maccellgroup(NR_UE_MAC_INST_t *mac, const NR_MAC_CellGroupConfig_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info,
|
||||||
|
NR_ServingCellConfig_t *scd)
|
||||||
|
{
|
||||||
|
if (scd->supplementaryUplink)
|
||||||
|
updateMACie(sc_info->supplementaryUplink,
|
||||||
|
scd->supplementaryUplink,
|
||||||
|
NR_UplinkConfig_t);
|
||||||
|
if (scd->crossCarrierSchedulingConfig)
|
||||||
|
updateMACie(sc_info->crossCarrierSchedulingConfig,
|
||||||
|
scd->crossCarrierSchedulingConfig,
|
||||||
|
NR_CrossCarrierSchedulingConfig_t);
|
||||||
|
if (scd->pdsch_ServingCellConfig) {
|
||||||
|
switch (scd->pdsch_ServingCellConfig->present) {
|
||||||
|
case NR_SetupRelease_PDSCH_ServingCellConfig_PR_NOTHING :
|
||||||
|
break;
|
||||||
|
case NR_SetupRelease_PDSCH_ServingCellConfig_PR_release :
|
||||||
|
// release all configurations
|
||||||
|
if (sc_info->pdsch_CGB_Transmission) {
|
||||||
|
ASN_STRUCT_FREE(asn_DEF_NR_PDSCH_CodeBlockGroupTransmission,
|
||||||
|
sc_info->pdsch_CGB_Transmission);
|
||||||
|
sc_info->pdsch_CGB_Transmission = NULL;
|
||||||
|
}
|
||||||
|
if (sc_info->xOverhead_PDSCH) {
|
||||||
|
free(sc_info->xOverhead_PDSCH);
|
||||||
|
sc_info->xOverhead_PDSCH = NULL;
|
||||||
|
}
|
||||||
|
if (sc_info->maxMIMO_Layers_PDSCH) {
|
||||||
|
free(sc_info->maxMIMO_Layers_PDSCH);
|
||||||
|
sc_info->maxMIMO_Layers_PDSCH = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup : {
|
||||||
|
NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = scd->pdsch_ServingCellConfig->choice.setup;
|
||||||
|
if (pdsch_servingcellconfig->codeBlockGroupTransmission)
|
||||||
|
handleMACsetuprelease(sc_info->pdsch_CGB_Transmission,
|
||||||
|
pdsch_servingcellconfig->codeBlockGroupTransmission,
|
||||||
|
NR_PDSCH_CodeBlockGroupTransmission_t,
|
||||||
|
asn_DEF_NR_PDSCH_CodeBlockGroupTransmission);
|
||||||
|
updateMACie(sc_info->xOverhead_PDSCH,
|
||||||
|
pdsch_servingcellconfig->xOverhead,
|
||||||
|
long);
|
||||||
|
if (pdsch_servingcellconfig->ext1 &&
|
||||||
|
pdsch_servingcellconfig->ext1->maxMIMO_Layers)
|
||||||
|
updateMACie(sc_info->maxMIMO_Layers_PDSCH,
|
||||||
|
pdsch_servingcellconfig->ext1->maxMIMO_Layers,
|
||||||
|
long);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default :
|
||||||
|
AssertFatal(false, "Invalid case\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (scd->uplinkConfig &&
|
||||||
|
scd->uplinkConfig->pusch_ServingCellConfig) {
|
||||||
|
switch (scd->uplinkConfig->pusch_ServingCellConfig->present) {
|
||||||
|
case NR_SetupRelease_PUSCH_ServingCellConfig_PR_NOTHING :
|
||||||
|
break;
|
||||||
|
case NR_SetupRelease_PUSCH_ServingCellConfig_PR_release :
|
||||||
|
// release all configurations
|
||||||
|
if (sc_info->pusch_CGB_Transmission) {
|
||||||
|
ASN_STRUCT_FREE(asn_DEF_NR_PUSCH_CodeBlockGroupTransmission,
|
||||||
|
sc_info->pusch_CGB_Transmission);
|
||||||
|
sc_info->pdsch_CGB_Transmission = NULL;
|
||||||
|
}
|
||||||
|
if (sc_info->rateMatching_PUSCH) {
|
||||||
|
free(sc_info->rateMatching_PUSCH);
|
||||||
|
sc_info->rateMatching_PUSCH = NULL;
|
||||||
|
}
|
||||||
|
if (sc_info->xOverhead_PUSCH) {
|
||||||
|
free(sc_info->xOverhead_PUSCH);
|
||||||
|
sc_info->xOverhead_PUSCH = NULL;
|
||||||
|
}
|
||||||
|
if (sc_info->maxMIMO_Layers_PUSCH) {
|
||||||
|
free(sc_info->maxMIMO_Layers_PUSCH);
|
||||||
|
sc_info->maxMIMO_Layers_PUSCH = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup : {
|
||||||
|
NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig = scd->uplinkConfig->pusch_ServingCellConfig->choice.setup;
|
||||||
|
updateMACie(sc_info->rateMatching_PUSCH,
|
||||||
|
pusch_servingcellconfig->rateMatching,
|
||||||
|
long);
|
||||||
|
updateMACie(sc_info->xOverhead_PUSCH,
|
||||||
|
pusch_servingcellconfig->xOverhead,
|
||||||
|
long);
|
||||||
|
if (pusch_servingcellconfig->ext1 &&
|
||||||
|
pusch_servingcellconfig->ext1->maxMIMO_Layers)
|
||||||
|
updateMACie(sc_info->maxMIMO_Layers_PUSCH,
|
||||||
|
pusch_servingcellconfig->ext1->maxMIMO_Layers,
|
||||||
|
long);
|
||||||
|
if (pusch_servingcellconfig->codeBlockGroupTransmission)
|
||||||
|
handleMACsetuprelease(sc_info->pusch_CGB_Transmission,
|
||||||
|
pusch_servingcellconfig->codeBlockGroupTransmission,
|
||||||
|
NR_PUSCH_CodeBlockGroupTransmission_t,
|
||||||
|
asn_DEF_NR_PUSCH_CodeBlockGroupTransmission);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default :
|
||||||
|
AssertFatal(false, "Invalid case\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void nr_rrc_mac_config_req_cg(module_id_t module_id,
|
void nr_rrc_mac_config_req_cg(module_id_t module_id,
|
||||||
int cc_idP,
|
int cc_idP,
|
||||||
NR_CellGroupConfig_t *cell_group_config)
|
NR_CellGroupConfig_t *cell_group_config)
|
||||||
@@ -1029,14 +1128,15 @@ void nr_rrc_mac_config_req_cg(module_id_t module_id,
|
|||||||
|
|
||||||
if (cell_group_config->spCellConfig) {
|
if (cell_group_config->spCellConfig) {
|
||||||
NR_SpCellConfig_t *spCellConfig = cell_group_config->spCellConfig;
|
NR_SpCellConfig_t *spCellConfig = cell_group_config->spCellConfig;
|
||||||
|
NR_ServingCellConfig_t *scd = spCellConfig->spCellConfigDedicated;
|
||||||
mac->servCellIndex = spCellConfig->servCellIndex ? *spCellConfig->servCellIndex : 0;
|
mac->servCellIndex = spCellConfig->servCellIndex ? *spCellConfig->servCellIndex : 0;
|
||||||
if (spCellConfig->reconfigurationWithSync) {
|
if (spCellConfig->reconfigurationWithSync) {
|
||||||
LOG_A(NR_MAC, "Received reconfigurationWithSync\n");
|
LOG_A(NR_MAC, "Received reconfigurationWithSync\n");
|
||||||
handle_reconfiguration_with_sync(mac, module_id, cc_idP, spCellConfig->reconfigurationWithSync);
|
handle_reconfiguration_with_sync(mac, module_id, cc_idP, spCellConfig->reconfigurationWithSync);
|
||||||
}
|
}
|
||||||
if (spCellConfig->spCellConfigDedicated) {
|
if (scd) {
|
||||||
mac->crossCarrierSchedulingConfig = spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig;
|
configure_servingcell_info(&mac->sc_info, scd);
|
||||||
configure_current_BWP(mac, NULL, spCellConfig->spCellConfigDedicated);
|
configure_current_BWP(mac, NULL, scd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -445,6 +445,7 @@ typedef struct {
|
|||||||
int si_window_start;
|
int si_window_start;
|
||||||
ssb_list_info_t ssb_list;
|
ssb_list_info_t ssb_list;
|
||||||
|
|
||||||
|
NR_UE_ServingCell_Info_t sc_info;
|
||||||
NR_UE_DL_BWP_t current_DL_BWP;
|
NR_UE_DL_BWP_t current_DL_BWP;
|
||||||
NR_UE_UL_BWP_t current_UL_BWP;
|
NR_UE_UL_BWP_t current_UL_BWP;
|
||||||
NR_BWP_DownlinkCommon_t *bwp_dlcommon;
|
NR_BWP_DownlinkCommon_t *bwp_dlcommon;
|
||||||
@@ -464,7 +465,6 @@ typedef struct {
|
|||||||
NR_SearchSpace_t *search_space_zero;
|
NR_SearchSpace_t *search_space_zero;
|
||||||
|
|
||||||
NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon;
|
NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon;
|
||||||
NR_CrossCarrierSchedulingConfig_t *crossCarrierSchedulingConfig;
|
|
||||||
|
|
||||||
bool phy_config_request_sent;
|
bool phy_config_request_sent;
|
||||||
frame_type_t frame_type;
|
frame_type_t frame_type;
|
||||||
|
|||||||
@@ -39,11 +39,22 @@
|
|||||||
#define NR_DL_MAX_DAI (4) /* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */
|
#define NR_DL_MAX_DAI (4) /* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */
|
||||||
#define NR_DL_MAX_NB_CW (2) /* number of downlink code word */
|
#define NR_DL_MAX_NB_CW (2) /* number of downlink code word */
|
||||||
|
|
||||||
#define updateMACie(destination, origin, type) { \
|
#define updateMACie(destination, origin, type) { \
|
||||||
type *tmp = origin; \
|
type *tmp = origin; \
|
||||||
origin = destination; \
|
origin = destination; \
|
||||||
destination = tmp; \
|
destination = tmp; \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
|
#define handleMACsetuprelease(destination, origin, type, asn_DEF) { \
|
||||||
|
if (origin->present == 1) { \
|
||||||
|
ASN_STRUCT_FREE(asn_DEF, destination); \
|
||||||
|
destination = NULL; \
|
||||||
|
} \
|
||||||
|
if (origin->present == 2) \
|
||||||
|
updateMACie(destination, \
|
||||||
|
origin->choice.setup, \
|
||||||
|
type); \
|
||||||
|
} \
|
||||||
|
|
||||||
/**\brief initialize the field in nr_mac instance
|
/**\brief initialize the field in nr_mac instance
|
||||||
\param module_id module id */
|
\param module_id module id */
|
||||||
|
|||||||
@@ -175,20 +175,20 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0;
|
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NR_UE_ServingCell_Info_t *sc_info = &mac->sc_info;
|
||||||
// loop over RNTI type and configure resource allocation for DCI
|
// loop over RNTI type and configure resource allocation for DCI
|
||||||
for (int i = 0; i < rel15->num_dci_options; i++) {
|
for (int i = 0; i < rel15->num_dci_options; i++) {
|
||||||
rel15->ss_type_options[i] = ss->searchSpaceType->present;
|
rel15->ss_type_options[i] = ss->searchSpaceType->present;
|
||||||
const int dci_format = rel15->dci_format_options[i];
|
const int dci_format = rel15->dci_format_options[i];
|
||||||
uint16_t alt_size = 0;
|
uint16_t alt_size = 0;
|
||||||
if(current_DL_BWP) {
|
if(current_DL_BWP) {
|
||||||
|
|
||||||
// computing alternative size for padding
|
// computing alternative size for padding
|
||||||
dci_pdu_rel15_t temp_pdu;
|
dci_pdu_rel15_t temp_pdu;
|
||||||
if(dci_format == NR_DL_DCI_FORMAT_1_0)
|
if(dci_format == NR_DL_DCI_FORMAT_1_0)
|
||||||
alt_size =
|
alt_size =
|
||||||
nr_dci_size(current_DL_BWP,
|
nr_dci_size(current_DL_BWP,
|
||||||
current_UL_BWP,
|
current_UL_BWP,
|
||||||
mac->crossCarrierSchedulingConfig,
|
sc_info,
|
||||||
mac->pdsch_HARQ_ACK_Codebook,
|
mac->pdsch_HARQ_ACK_Codebook,
|
||||||
&temp_pdu,
|
&temp_pdu,
|
||||||
NR_UL_DCI_FORMAT_0_0,
|
NR_UL_DCI_FORMAT_0_0,
|
||||||
@@ -202,7 +202,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
alt_size =
|
alt_size =
|
||||||
nr_dci_size(current_DL_BWP,
|
nr_dci_size(current_DL_BWP,
|
||||||
current_UL_BWP,
|
current_UL_BWP,
|
||||||
mac->crossCarrierSchedulingConfig,
|
sc_info,
|
||||||
mac->pdsch_HARQ_ACK_Codebook,
|
mac->pdsch_HARQ_ACK_Codebook,
|
||||||
&temp_pdu,
|
&temp_pdu,
|
||||||
NR_DL_DCI_FORMAT_1_0,
|
NR_DL_DCI_FORMAT_1_0,
|
||||||
@@ -216,7 +216,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
rel15->dci_length_options[i] = nr_dci_size(current_DL_BWP,
|
rel15->dci_length_options[i] = nr_dci_size(current_DL_BWP,
|
||||||
current_UL_BWP,
|
current_UL_BWP,
|
||||||
mac->crossCarrierSchedulingConfig,
|
sc_info,
|
||||||
mac->pdsch_HARQ_ACK_Codebook,
|
mac->pdsch_HARQ_ACK_Codebook,
|
||||||
&mac->def_dci_pdu_rel15[dl_config->slot][dci_format],
|
&mac->def_dci_pdu_rel15[dl_config->slot][dci_format],
|
||||||
dci_format,
|
dci_format,
|
||||||
|
|||||||
@@ -715,7 +715,11 @@ static int nr_ue_process_dci_dl_10(module_id_t module_id,
|
|||||||
int R = nr_get_code_rate_dl(dlsch_pdu->mcs, dlsch_pdu->mcs_table);
|
int R = nr_get_code_rate_dl(dlsch_pdu->mcs, dlsch_pdu->mcs_table);
|
||||||
if (R > 0) {
|
if (R > 0) {
|
||||||
dlsch_pdu->targetCodeRate = R;
|
dlsch_pdu->targetCodeRate = R;
|
||||||
int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
|
int nb_rb_oh;
|
||||||
|
if (mac->sc_info.xOverhead_PDSCH)
|
||||||
|
nb_rb_oh = 6 * (1 + *mac->sc_info.xOverhead_PDSCH);
|
||||||
|
else
|
||||||
|
nb_rb_oh = 0;
|
||||||
int nb_re_dmrs = ((dlsch_pdu->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) ? 6 : 4) * dlsch_pdu->n_dmrs_cdm_groups;
|
int nb_re_dmrs = ((dlsch_pdu->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) ? 6 : 4) * dlsch_pdu->n_dmrs_cdm_groups;
|
||||||
dlsch_pdu->TBS = nr_compute_tbs(dlsch_pdu->qamModOrder,
|
dlsch_pdu->TBS = nr_compute_tbs(dlsch_pdu->qamModOrder,
|
||||||
R,
|
R,
|
||||||
@@ -1133,7 +1137,13 @@ static int nr_ue_process_dci_dl_11(module_id_t module_id,
|
|||||||
if ((dlsch_pdu->dmrs_ports >> i) & 0x01)
|
if ((dlsch_pdu->dmrs_ports >> i) & 0x01)
|
||||||
Nl += 1;
|
Nl += 1;
|
||||||
}
|
}
|
||||||
int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
|
|
||||||
|
NR_UE_ServingCell_Info_t *sc_info = &mac->sc_info;
|
||||||
|
int nb_rb_oh;
|
||||||
|
if (sc_info->xOverhead_PDSCH)
|
||||||
|
nb_rb_oh = 6 * (1 + *sc_info->xOverhead_PDSCH);
|
||||||
|
else
|
||||||
|
nb_rb_oh = 0;
|
||||||
int nb_re_dmrs = ((dmrs_type == NULL) ? 6 : 4) * dlsch_pdu->n_dmrs_cdm_groups;
|
int nb_re_dmrs = ((dmrs_type == NULL) ? 6 : 4) * dlsch_pdu->n_dmrs_cdm_groups;
|
||||||
|
|
||||||
NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dci->harq_pid];
|
NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dci->harq_pid];
|
||||||
@@ -1158,9 +1168,8 @@ static int nr_ue_process_dci_dl_11(module_id_t module_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TBS_LBRM according to section 5.4.2.1 of 38.212
|
// TBS_LBRM according to section 5.4.2.1 of 38.212
|
||||||
long *maxMIMO_Layers = current_DL_BWP->pdsch_servingcellconfig->ext1->maxMIMO_Layers;
|
AssertFatal(sc_info->maxMIMO_Layers_PDSCH != NULL, "Option with max MIMO layers not configured is not supported\n");
|
||||||
AssertFatal(maxMIMO_Layers != NULL, "Option with max MIMO layers not configured is not supported\n");
|
int nl_tbslbrm = *sc_info->maxMIMO_Layers_PDSCH < 4 ? *sc_info->maxMIMO_Layers_PDSCH : 4;
|
||||||
int nl_tbslbrm = *maxMIMO_Layers < 4 ? *maxMIMO_Layers : 4;
|
|
||||||
dlsch_pdu->tbslbrm = nr_compute_tbslbrm(dlsch_pdu->mcs_table, current_DL_BWP->bw_tbslbrm, nl_tbslbrm);
|
dlsch_pdu->tbslbrm = nr_compute_tbslbrm(dlsch_pdu->mcs_table, current_DL_BWP->bw_tbslbrm, nl_tbslbrm);
|
||||||
/*PTRS configuration */
|
/*PTRS configuration */
|
||||||
dlsch_pdu->pduBitmap = 0;
|
dlsch_pdu->pduBitmap = 0;
|
||||||
@@ -1306,7 +1315,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
|||||||
fapi_nr_ul_config_pucch_pdu *pucch_pdu)
|
fapi_nr_ul_config_pucch_pdu *pucch_pdu)
|
||||||
{
|
{
|
||||||
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
|
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
|
||||||
NR_UE_DL_BWP_t *current_DL_BWP = &mac->current_DL_BWP;
|
NR_UE_ServingCell_Info_t *sc_info = &mac->sc_info;
|
||||||
NR_PUCCH_FormatConfig_t *pucchfmt;
|
NR_PUCCH_FormatConfig_t *pucchfmt;
|
||||||
long *pusch_id = NULL;
|
long *pusch_id = NULL;
|
||||||
long *id0 = NULL;
|
long *id0 = NULL;
|
||||||
@@ -1363,7 +1372,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
|||||||
mac->pdsch_HARQ_ACK_Codebook != NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic) {
|
mac->pdsch_HARQ_ACK_Codebook != NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic) {
|
||||||
LOG_E(MAC,"PUCCH Unsupported cell group configuration\n");
|
LOG_E(MAC,"PUCCH Unsupported cell group configuration\n");
|
||||||
return;
|
return;
|
||||||
} else if (current_DL_BWP && current_DL_BWP->pdsch_servingcellconfig && current_DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission != NULL) {
|
} else if (sc_info->pdsch_CGB_Transmission) {
|
||||||
LOG_E(MAC,"PUCCH Unsupported code block group for serving cell config\n");
|
LOG_E(MAC,"PUCCH Unsupported code block group for serving cell config\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -429,6 +429,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
int rnti_type = get_rnti_type(mac, rnti);
|
int rnti_type = get_rnti_type(mac, rnti);
|
||||||
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
|
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
|
||||||
|
NR_UE_ServingCell_Info_t *sc_info = &mac->sc_info;
|
||||||
|
|
||||||
// Common configuration
|
// Common configuration
|
||||||
pusch_config_pdu->dmrs_config_type = pusch_dmrs_type1;
|
pusch_config_pdu->dmrs_config_type = pusch_dmrs_type1;
|
||||||
@@ -657,14 +658,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
pusch_config_pdu->start_symbol_index,
|
pusch_config_pdu->start_symbol_index,
|
||||||
mac->dmrs_TypeA_Position);
|
mac->dmrs_TypeA_Position);
|
||||||
|
|
||||||
// Num PRB Overhead from PUSCH-ServingCellConfig
|
if (sc_info->xOverhead_PUSCH)
|
||||||
if (current_UL_BWP->pusch_servingcellconfig && current_UL_BWP->pusch_servingcellconfig->xOverhead)
|
N_PRB_oh = 6 * (1 + *sc_info->xOverhead_PUSCH);
|
||||||
N_PRB_oh = *current_UL_BWP->pusch_servingcellconfig->xOverhead;
|
|
||||||
else
|
else
|
||||||
N_PRB_oh = 0;
|
N_PRB_oh = 0;
|
||||||
|
|
||||||
if (current_UL_BWP->pusch_servingcellconfig && current_UL_BWP->pusch_servingcellconfig->rateMatching) {
|
if (sc_info->rateMatching_PUSCH) {
|
||||||
long *maxMIMO_Layers = current_UL_BWP->pusch_servingcellconfig->ext1->maxMIMO_Layers;
|
long *maxMIMO_Layers = sc_info->maxMIMO_Layers_PUSCH;
|
||||||
if (!maxMIMO_Layers)
|
if (!maxMIMO_Layers)
|
||||||
maxMIMO_Layers = pusch_Config ? pusch_Config->maxRank : NULL;
|
maxMIMO_Layers = pusch_Config ? pusch_Config->maxRank : NULL;
|
||||||
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
|
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
|
||||||
|
|||||||
@@ -825,9 +825,7 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
|
|||||||
dci_pdu_rel15_t uldci_payload;
|
dci_pdu_rel15_t uldci_payload;
|
||||||
memset(&uldci_payload, 0, sizeof(uldci_payload));
|
memset(&uldci_payload, 0, sizeof(uldci_payload));
|
||||||
|
|
||||||
const NR_SIB1_t *sib1 = cc->sib1 ? cc->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
|
config_uldci(NULL,
|
||||||
config_uldci(sib1,
|
|
||||||
scc,
|
|
||||||
pusch_pdu,
|
pusch_pdu,
|
||||||
&uldci_payload,
|
&uldci_payload,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -836,8 +834,7 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
|
|||||||
1, // Not toggling NDI in msg3 retransmissions
|
1, // Not toggling NDI in msg3 retransmissions
|
||||||
ul_bwp);
|
ul_bwp);
|
||||||
|
|
||||||
fill_dci_pdu_rel15(scc,
|
fill_dci_pdu_rel15(NULL, // parameter not needed for DCI 0_0
|
||||||
ra->CellGroup,
|
|
||||||
&ra->DL_BWP,
|
&ra->DL_BWP,
|
||||||
ul_bwp,
|
ul_bwp,
|
||||||
dci_pdu,
|
dci_pdu,
|
||||||
@@ -1363,8 +1360,7 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
pdcch_pdu_rel15->StartSymbolIndex,
|
pdcch_pdu_rel15->StartSymbolIndex,
|
||||||
pdcch_pdu_rel15->DurationSymbols);
|
pdcch_pdu_rel15->DurationSymbols);
|
||||||
|
|
||||||
fill_dci_pdu_rel15(scc,
|
fill_dci_pdu_rel15(NULL, // parameter not needed for DCI 1_0
|
||||||
ra->CellGroup,
|
|
||||||
dl_bwp,
|
dl_bwp,
|
||||||
&ra->UL_BWP,
|
&ra->UL_BWP,
|
||||||
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
||||||
@@ -1586,8 +1582,7 @@ static void prepare_dl_pdus(gNB_MAC_INST *nr_mac,
|
|||||||
pdcch_pdu_rel15->DurationSymbols,
|
pdcch_pdu_rel15->DurationSymbols,
|
||||||
pdsch_pdu_rel15->BWPSize);
|
pdsch_pdu_rel15->BWPSize);
|
||||||
|
|
||||||
fill_dci_pdu_rel15(scc,
|
fill_dci_pdu_rel15(NULL, // parameter not needed for DCI 1_0
|
||||||
ra->CellGroup,
|
|
||||||
dl_bwp,
|
dl_bwp,
|
||||||
&ra->UL_BWP,
|
&ra->UL_BWP,
|
||||||
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
||||||
|
|||||||
@@ -495,8 +495,7 @@ static void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
|
|||||||
int dci_format = NR_DL_DCI_FORMAT_1_0;
|
int dci_format = NR_DL_DCI_FORMAT_1_0;
|
||||||
int rnti_type = NR_RNTI_SI;
|
int rnti_type = NR_RNTI_SI;
|
||||||
|
|
||||||
fill_dci_pdu_rel15(scc,
|
fill_dci_pdu_rel15(NULL,
|
||||||
NULL,
|
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
||||||
|
|||||||
@@ -932,7 +932,6 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
|
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
|
||||||
UE->mac_stats.dl.current_bytes = 0;
|
UE->mac_stats.dl.current_bytes = 0;
|
||||||
UE->mac_stats.dl.current_rbs = 0;
|
UE->mac_stats.dl.current_rbs = 0;
|
||||||
NR_CellGroupConfig_t *cg = UE->CellGroup;
|
|
||||||
|
|
||||||
/* update TA and set ta_apply every 10 frames.
|
/* update TA and set ta_apply every 10 frames.
|
||||||
* Possible improvement: take the periodicity from input file.
|
* Possible improvement: take the periodicity from input file.
|
||||||
@@ -1080,10 +1079,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
pdsch_pdu->precodingAndBeamforming.prg_size = pdsch_pdu->rbSize;
|
pdsch_pdu->precodingAndBeamforming.prg_size = pdsch_pdu->rbSize;
|
||||||
pdsch_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = sched_pdsch->pm_index;
|
pdsch_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = sched_pdsch->pm_index;
|
||||||
// TBS_LBRM according to section 5.4.2.1 of 38.212
|
// TBS_LBRM according to section 5.4.2.1 of 38.212
|
||||||
// TODO: verify the case where pdsch_servingcellconfig is NULL, in which case
|
// TODO: verify the case where maxMIMO_Layers is NULL, in which case
|
||||||
// in principle maxMIMO_layers should be given by the maximum number of layers
|
// in principle maxMIMO_layers should be given by the maximum number of layers
|
||||||
// for PDSCH supported by the UE for the serving cell (5.4.2.1 of 38.212)
|
// for PDSCH supported by the UE for the serving cell (5.4.2.1 of 38.212)
|
||||||
long maxMIMO_Layers = current_BWP->pdsch_servingcellconfig ? *current_BWP->pdsch_servingcellconfig->ext1->maxMIMO_Layers : 1;
|
long maxMIMO_Layers = UE->sc_info.maxMIMO_Layers_PDSCH ? *UE->sc_info.maxMIMO_Layers_PDSCH : 1;
|
||||||
const int nl_tbslbrm = min(maxMIMO_Layers, 4);
|
const int nl_tbslbrm = min(maxMIMO_Layers, 4);
|
||||||
// Maximum number of PRBs across all configured DL BWPs
|
// Maximum number of PRBs across all configured DL BWPs
|
||||||
pdsch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(current_BWP->mcsTableIdx,
|
pdsch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(current_BWP->mcsTableIdx,
|
||||||
@@ -1187,8 +1186,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
pucch->timing_indicator);
|
pucch->timing_indicator);
|
||||||
|
|
||||||
const int rnti_type = NR_RNTI_C;
|
const int rnti_type = NR_RNTI_C;
|
||||||
fill_dci_pdu_rel15(scc,
|
fill_dci_pdu_rel15(&UE->sc_info,
|
||||||
cg,
|
|
||||||
current_BWP,
|
current_BWP,
|
||||||
&UE->current_UL_BWP,
|
&UE->current_UL_BWP,
|
||||||
dci_pdu,
|
dci_pdu,
|
||||||
|
|||||||
@@ -677,8 +677,7 @@ int get_mcs_from_bler(const NR_bler_options_t *bler_options,
|
|||||||
return new_mcs;
|
return new_mcs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void config_uldci(const NR_SIB1_t *sib1,
|
void config_uldci(const NR_UE_ServingCell_Info_t *sc_info,
|
||||||
const NR_ServingCellConfigCommon_t *scc,
|
|
||||||
const nfapi_nr_pusch_pdu_t *pusch_pdu,
|
const nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||||
dci_pdu_rel15_t *dci_pdu_rel15,
|
dci_pdu_rel15_t *dci_pdu_rel15,
|
||||||
nr_srs_feedback_t *srs_feedback,
|
nr_srs_feedback_t *srs_feedback,
|
||||||
@@ -717,7 +716,7 @@ void config_uldci(const NR_SIB1_t *sib1,
|
|||||||
pusch_Config->txConfig != NULL) {
|
pusch_Config->txConfig != NULL) {
|
||||||
AssertFatal(*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_codebook,
|
AssertFatal(*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_codebook,
|
||||||
"Non Codebook configuration non supported\n");
|
"Non Codebook configuration non supported\n");
|
||||||
compute_srs_resource_indicator(ul_bwp->pusch_servingcellconfig, pusch_Config, ul_bwp->srs_Config, srs_feedback, &dci_pdu_rel15->srs_resource_indicator.val);
|
compute_srs_resource_indicator(sc_info->maxMIMO_Layers_PUSCH, pusch_Config, ul_bwp->srs_Config, srs_feedback, &dci_pdu_rel15->srs_resource_indicator.val);
|
||||||
}
|
}
|
||||||
compute_precoding_information(pusch_Config,
|
compute_precoding_information(pusch_Config,
|
||||||
ul_bwp->srs_Config,
|
ul_bwp->srs_Config,
|
||||||
@@ -1052,10 +1051,12 @@ void set_r_pucch_parms(int rsetindex,
|
|||||||
*start_symbol_index = default_pucch_firstsymb[rsetindex];
|
*start_symbol_index = default_pucch_firstsymb[rsetindex];
|
||||||
}
|
}
|
||||||
|
|
||||||
void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *current_BWP, const NR_ControlResourceSet_t *coreset, dci_pdu_rel15_t *dci_pdu_rel15, nr_dci_format_t format)
|
void prepare_dci(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||||
|
const NR_UE_DL_BWP_t *current_BWP,
|
||||||
|
const NR_ControlResourceSet_t *coreset,
|
||||||
|
dci_pdu_rel15_t *dci_pdu_rel15,
|
||||||
|
nr_dci_format_t format)
|
||||||
{
|
{
|
||||||
AssertFatal(CellGroup!=NULL,"CellGroup shouldn't be null here\n");
|
|
||||||
|
|
||||||
const NR_PDSCH_Config_t *pdsch_Config = current_BWP ? current_BWP->pdsch_Config : NULL;
|
const NR_PDSCH_Config_t *pdsch_Config = current_BWP ? current_BWP->pdsch_Config : NULL;
|
||||||
|
|
||||||
switch(format) {
|
switch(format) {
|
||||||
@@ -1063,10 +1064,10 @@ void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *cu
|
|||||||
// format indicator
|
// format indicator
|
||||||
dci_pdu_rel15->format_indicator = 0;
|
dci_pdu_rel15->format_indicator = 0;
|
||||||
// carrier indicator
|
// carrier indicator
|
||||||
if (CellGroup->spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig != NULL)
|
if (servingCellInfo->crossCarrierSchedulingConfig != NULL)
|
||||||
AssertFatal(1==0,"Cross Carrier Scheduling Config currently not supported\n");
|
AssertFatal(1==0,"Cross Carrier Scheduling Config currently not supported\n");
|
||||||
// supplementary uplink
|
// supplementary uplink
|
||||||
if (CellGroup->spCellConfig->spCellConfigDedicated->supplementaryUplink != NULL)
|
if (servingCellInfo->supplementaryUplink != NULL)
|
||||||
AssertFatal(1==0,"Supplementary Uplink currently not supported\n");
|
AssertFatal(1==0,"Supplementary Uplink currently not supported\n");
|
||||||
// SRS request
|
// SRS request
|
||||||
dci_pdu_rel15->srs_request.val = 0;
|
dci_pdu_rel15->srs_request.val = 0;
|
||||||
@@ -1076,7 +1077,7 @@ void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *cu
|
|||||||
// format indicator
|
// format indicator
|
||||||
dci_pdu_rel15->format_indicator = 1;
|
dci_pdu_rel15->format_indicator = 1;
|
||||||
// carrier indicator
|
// carrier indicator
|
||||||
if (CellGroup->spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig != NULL)
|
if (servingCellInfo->crossCarrierSchedulingConfig != NULL)
|
||||||
AssertFatal(1==0,"Cross Carrier Scheduling Config currently not supported\n");
|
AssertFatal(1==0,"Cross Carrier Scheduling Config currently not supported\n");
|
||||||
//vrb to prb mapping
|
//vrb to prb mapping
|
||||||
if (pdsch_Config->vrb_ToPRB_Interleaver==NULL)
|
if (pdsch_Config->vrb_ToPRB_Interleaver==NULL)
|
||||||
@@ -1097,10 +1098,9 @@ void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *cu
|
|||||||
if (coreset->tci_PresentInDCI != NULL)
|
if (coreset->tci_PresentInDCI != NULL)
|
||||||
AssertFatal(1==0,"TCI in DCI currently not supported\n");
|
AssertFatal(1==0,"TCI in DCI currently not supported\n");
|
||||||
//srs resource set
|
//srs resource set
|
||||||
if (CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->carrierSwitching!=NULL) {
|
if (servingCellInfo->carrierSwitching) {
|
||||||
NR_SRS_CarrierSwitching_t *cs = CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->carrierSwitching->choice.setup;
|
if (servingCellInfo->carrierSwitching->srs_TPC_PDCCH_Group){
|
||||||
if (cs->srs_TPC_PDCCH_Group!=NULL){
|
switch(servingCellInfo->carrierSwitching->srs_TPC_PDCCH_Group->present) {
|
||||||
switch(cs->srs_TPC_PDCCH_Group->present) {
|
|
||||||
case NR_SRS_CarrierSwitching__srs_TPC_PDCCH_Group_PR_NOTHING:
|
case NR_SRS_CarrierSwitching__srs_TPC_PDCCH_Group_PR_NOTHING:
|
||||||
dci_pdu_rel15->srs_request.val = 0;
|
dci_pdu_rel15->srs_request.val = 0;
|
||||||
break;
|
break;
|
||||||
@@ -1118,8 +1118,7 @@ void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *cu
|
|||||||
else
|
else
|
||||||
dci_pdu_rel15->srs_request.val = 0;
|
dci_pdu_rel15->srs_request.val = 0;
|
||||||
// CBGTI and CBGFI
|
// CBGTI and CBGFI
|
||||||
if (current_BWP->pdsch_servingcellconfig &&
|
if (servingCellInfo->pdsch_CGB_Transmission)
|
||||||
current_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission != NULL)
|
|
||||||
AssertFatal(1==0,"CBG transmission currently not supported\n");
|
AssertFatal(1==0,"CBG transmission currently not supported\n");
|
||||||
break;
|
break;
|
||||||
default :
|
default :
|
||||||
@@ -1127,8 +1126,7 @@ void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *cu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
void fill_dci_pdu_rel15(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||||
const NR_CellGroupConfig_t *CellGroup,
|
|
||||||
const NR_UE_DL_BWP_t *current_DL_BWP,
|
const NR_UE_DL_BWP_t *current_DL_BWP,
|
||||||
const NR_UE_UL_BWP_t *current_UL_BWP,
|
const NR_UE_UL_BWP_t *current_UL_BWP,
|
||||||
nfapi_nr_dl_dci_pdu_t *pdcch_dci_pdu,
|
nfapi_nr_dl_dci_pdu_t *pdcch_dci_pdu,
|
||||||
@@ -1141,7 +1139,6 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
long pdsch_HARQ_ACK_Codebook,
|
long pdsch_HARQ_ACK_Codebook,
|
||||||
uint16_t cset0_bwp_size)
|
uint16_t cset0_bwp_size)
|
||||||
{
|
{
|
||||||
NR_CrossCarrierSchedulingConfig_t *crossCarrierSchedulingConfig = NULL; // TODO configure
|
|
||||||
uint8_t fsize = 0, pos = 0;
|
uint8_t fsize = 0, pos = 0;
|
||||||
uint64_t *dci_pdu = (uint64_t *)pdcch_dci_pdu->Payload;
|
uint64_t *dci_pdu = (uint64_t *)pdcch_dci_pdu->Payload;
|
||||||
*dci_pdu = 0;
|
*dci_pdu = 0;
|
||||||
@@ -1161,7 +1158,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
if(dci_format == NR_DL_DCI_FORMAT_1_0)
|
if(dci_format == NR_DL_DCI_FORMAT_1_0)
|
||||||
alt_size = nr_dci_size(current_DL_BWP,
|
alt_size = nr_dci_size(current_DL_BWP,
|
||||||
current_UL_BWP,
|
current_UL_BWP,
|
||||||
crossCarrierSchedulingConfig,
|
servingCellInfo,
|
||||||
pdsch_HARQ_ACK_Codebook,
|
pdsch_HARQ_ACK_Codebook,
|
||||||
&temp_pdu,
|
&temp_pdu,
|
||||||
NR_UL_DCI_FORMAT_0_0,
|
NR_UL_DCI_FORMAT_0_0,
|
||||||
@@ -1175,7 +1172,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
if(dci_format == NR_UL_DCI_FORMAT_0_0)
|
if(dci_format == NR_UL_DCI_FORMAT_0_0)
|
||||||
alt_size = nr_dci_size(current_DL_BWP,
|
alt_size = nr_dci_size(current_DL_BWP,
|
||||||
current_UL_BWP,
|
current_UL_BWP,
|
||||||
crossCarrierSchedulingConfig,
|
servingCellInfo,
|
||||||
pdsch_HARQ_ACK_Codebook,
|
pdsch_HARQ_ACK_Codebook,
|
||||||
&temp_pdu,
|
&temp_pdu,
|
||||||
NR_DL_DCI_FORMAT_1_0,
|
NR_DL_DCI_FORMAT_1_0,
|
||||||
@@ -1192,7 +1189,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
|
|
||||||
int dci_size = nr_dci_size(current_DL_BWP,
|
int dci_size = nr_dci_size(current_DL_BWP,
|
||||||
current_UL_BWP,
|
current_UL_BWP,
|
||||||
crossCarrierSchedulingConfig,
|
servingCellInfo,
|
||||||
pdsch_HARQ_ACK_Codebook,
|
pdsch_HARQ_ACK_Codebook,
|
||||||
dci_pdu_rel15,
|
dci_pdu_rel15,
|
||||||
dci_format,
|
dci_format,
|
||||||
@@ -1205,7 +1202,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
pdcch_dci_pdu->PayloadSizeBits = dci_size;
|
pdcch_dci_pdu->PayloadSizeBits = dci_size;
|
||||||
AssertFatal(dci_size <= 64, "DCI sizes above 64 bits not yet supported");
|
AssertFatal(dci_size <= 64, "DCI sizes above 64 bits not yet supported");
|
||||||
if (dci_format == NR_DL_DCI_FORMAT_1_1 || dci_format == NR_UL_DCI_FORMAT_0_1)
|
if (dci_format == NR_DL_DCI_FORMAT_1_1 || dci_format == NR_UL_DCI_FORMAT_0_1)
|
||||||
prepare_dci(CellGroup, current_DL_BWP, coreset, dci_pdu_rel15, dci_format);
|
prepare_dci(servingCellInfo, current_DL_BWP, coreset, dci_pdu_rel15, dci_format);
|
||||||
|
|
||||||
/// Payload generation
|
/// Payload generation
|
||||||
switch (dci_format) {
|
switch (dci_format) {
|
||||||
@@ -2064,11 +2061,6 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
|
|||||||
CellGroup->spCellConfig->spCellConfigDedicated) {
|
CellGroup->spCellConfig->spCellConfigDedicated) {
|
||||||
|
|
||||||
servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated;
|
servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated;
|
||||||
UL_BWP->supplementaryUplink = servingCellConfig->supplementaryUplink;
|
|
||||||
DL_BWP->pdsch_servingcellconfig = servingCellConfig->pdsch_ServingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
|
|
||||||
UL_BWP->pusch_servingcellconfig = servingCellConfig->uplinkConfig && servingCellConfig->uplinkConfig->pusch_ServingCellConfig ?
|
|
||||||
servingCellConfig->uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL;
|
|
||||||
|
|
||||||
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
||||||
|
|
||||||
if(dl_bwp_switch >= 0 && ul_bwp_switch >= 0) {
|
if(dl_bwp_switch >= 0 && ul_bwp_switch >= 0) {
|
||||||
@@ -2189,6 +2181,35 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(UE) {
|
if(UE) {
|
||||||
|
NR_UE_ServingCell_Info_t *sc_info = &UE->sc_info;
|
||||||
|
if (servingCellConfig) {
|
||||||
|
if (servingCellConfig->pdsch_ServingCellConfig &&
|
||||||
|
servingCellConfig->pdsch_ServingCellConfig->choice.setup) {
|
||||||
|
NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = servingCellConfig->pdsch_ServingCellConfig->choice.setup;
|
||||||
|
sc_info->nrofHARQ_ProcessesForPDSCH = pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH;
|
||||||
|
if (pdsch_servingcellconfig->ext1)
|
||||||
|
sc_info->maxMIMO_Layers_PDSCH = pdsch_servingcellconfig->ext1->maxMIMO_Layers;
|
||||||
|
if (pdsch_servingcellconfig->codeBlockGroupTransmission &&
|
||||||
|
pdsch_servingcellconfig->codeBlockGroupTransmission->choice.setup)
|
||||||
|
sc_info->pdsch_CGB_Transmission = pdsch_servingcellconfig->codeBlockGroupTransmission->choice.setup;
|
||||||
|
}
|
||||||
|
sc_info->crossCarrierSchedulingConfig = servingCellConfig->crossCarrierSchedulingConfig;
|
||||||
|
sc_info->supplementaryUplink = servingCellConfig->supplementaryUplink;
|
||||||
|
if (servingCellConfig->uplinkConfig) {
|
||||||
|
if (servingCellConfig->uplinkConfig->carrierSwitching)
|
||||||
|
sc_info->carrierSwitching = servingCellConfig->uplinkConfig->carrierSwitching->choice.setup;
|
||||||
|
if (servingCellConfig->uplinkConfig->pusch_ServingCellConfig &&
|
||||||
|
servingCellConfig->uplinkConfig->pusch_ServingCellConfig->choice.setup) {
|
||||||
|
NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig = servingCellConfig->uplinkConfig->pusch_ServingCellConfig->choice.setup;
|
||||||
|
if (pusch_servingcellconfig->ext1)
|
||||||
|
sc_info->maxMIMO_Layers_PUSCH = pusch_servingcellconfig->ext1->maxMIMO_Layers;
|
||||||
|
sc_info->rateMatching_PUSCH = pusch_servingcellconfig->rateMatching;
|
||||||
|
if (pusch_servingcellconfig->codeBlockGroupTransmission &&
|
||||||
|
pusch_servingcellconfig->codeBlockGroupTransmission->choice.setup)
|
||||||
|
sc_info->pusch_CGB_Transmission = pusch_servingcellconfig->codeBlockGroupTransmission->choice.setup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (CellGroup && CellGroup->physicalCellGroupConfig)
|
if (CellGroup && CellGroup->physicalCellGroupConfig)
|
||||||
UE->pdsch_HARQ_ACK_Codebook = CellGroup->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook;
|
UE->pdsch_HARQ_ACK_Codebook = CellGroup->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook;
|
||||||
@@ -2347,7 +2368,7 @@ NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConf
|
|||||||
|
|
||||||
/* get Number of HARQ processes for this UE */
|
/* get Number of HARQ processes for this UE */
|
||||||
// pdsch_servingcellconfig == NULL in SA -> will create default (8) number of HARQ processes
|
// pdsch_servingcellconfig == NULL in SA -> will create default (8) number of HARQ processes
|
||||||
create_dl_harq_list(sched_ctrl, dl_bwp->pdsch_servingcellconfig);
|
create_dl_harq_list(sched_ctrl, &UE->sc_info);
|
||||||
// add all available UL HARQ processes for this UE
|
// add all available UL HARQ processes for this UE
|
||||||
// nb of ul harq processes not configurable
|
// nb of ul harq processes not configurable
|
||||||
create_nr_list(&sched_ctrl->available_ul_harq, 16);
|
create_nr_list(&sched_ctrl->available_ul_harq, 16);
|
||||||
@@ -2410,9 +2431,10 @@ void free_sched_pucch_list(NR_UE_sched_ctrl_t *sched_ctrl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
|
void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
|
||||||
const NR_PDSCH_ServingCellConfig_t *pdsch) {
|
const NR_UE_ServingCell_Info_t *sc_info)
|
||||||
const int nrofHARQ = pdsch && pdsch->nrofHARQ_ProcessesForPDSCH ?
|
{
|
||||||
get_nrofHARQ_ProcessesForPDSCH(*pdsch->nrofHARQ_ProcessesForPDSCH) : 8;
|
const int nrofHARQ = sc_info && sc_info->nrofHARQ_ProcessesForPDSCH ?
|
||||||
|
get_nrofHARQ_ProcessesForPDSCH(*sc_info->nrofHARQ_ProcessesForPDSCH) : 8;
|
||||||
// add all available DL HARQ processes for this UE
|
// add all available DL HARQ processes for this UE
|
||||||
AssertFatal(sched_ctrl->available_dl_harq.len == sched_ctrl->feedback_dl_harq.len
|
AssertFatal(sched_ctrl->available_dl_harq.len == sched_ctrl->feedback_dl_harq.len
|
||||||
&& sched_ctrl->available_dl_harq.len == sched_ctrl->retrans_dl_harq.len,
|
&& sched_ctrl->available_dl_harq.len == sched_ctrl->retrans_dl_harq.len,
|
||||||
@@ -2810,7 +2832,7 @@ static void nr_mac_apply_cellgroup(gNB_MAC_INST *mac, NR_UE_info_t *UE, frame_t
|
|||||||
|
|
||||||
if (get_softmodem_params()->sa) {
|
if (get_softmodem_params()->sa) {
|
||||||
// add all available DL HARQ processes for this UE in SA
|
// add all available DL HARQ processes for this UE in SA
|
||||||
create_dl_harq_list(sched_ctrl, UE->current_DL_BWP.pdsch_servingcellconfig);
|
create_dl_harq_list(sched_ctrl, &UE->sc_info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2075,13 +2075,11 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n
|
|||||||
|
|
||||||
NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
|
NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
|
||||||
NR_UEs_t *UE_info = &nr_mac->UE_info;
|
NR_UEs_t *UE_info = &nr_mac->UE_info;
|
||||||
const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
|
|
||||||
UE_iterator( UE_info->list, UE) {
|
UE_iterator( UE_info->list, UE) {
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||||
if (sched_ctrl->ul_failure && !get_softmodem_params()->phy_test)
|
if (sched_ctrl->ul_failure && !get_softmodem_params()->phy_test)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
NR_CellGroupConfig_t *cg = UE->CellGroup;
|
|
||||||
NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP;
|
NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP;
|
||||||
|
|
||||||
UE->mac_stats.ul.current_bytes = 0;
|
UE->mac_stats.ul.current_bytes = 0;
|
||||||
@@ -2281,10 +2279,11 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n
|
|||||||
pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
|
pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
|
||||||
|
|
||||||
pusch_pdu->maintenance_parms_v3.ldpcBaseGraph = get_BG(sched_pusch->tb_size<<3,sched_pusch->R);
|
pusch_pdu->maintenance_parms_v3.ldpcBaseGraph = get_BG(sched_pusch->tb_size<<3,sched_pusch->R);
|
||||||
if(current_BWP->pusch_servingcellconfig &&
|
|
||||||
current_BWP->pusch_servingcellconfig->rateMatching) {
|
NR_UE_ServingCell_Info_t *sc_info = &UE->sc_info;
|
||||||
|
if(sc_info->rateMatching_PUSCH) {
|
||||||
// TBS_LBRM according to section 5.4.2.1 of 38.212
|
// TBS_LBRM according to section 5.4.2.1 of 38.212
|
||||||
long *maxMIMO_Layers = current_BWP->pusch_servingcellconfig->ext1->maxMIMO_Layers;
|
long *maxMIMO_Layers = sc_info->maxMIMO_Layers_PUSCH;
|
||||||
if (!maxMIMO_Layers)
|
if (!maxMIMO_Layers)
|
||||||
maxMIMO_Layers = current_BWP->pusch_Config->maxRank;
|
maxMIMO_Layers = current_BWP->pusch_Config->maxRank;
|
||||||
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
|
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
|
||||||
@@ -2373,8 +2372,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n
|
|||||||
dci_pdu_rel15_t uldci_payload;
|
dci_pdu_rel15_t uldci_payload;
|
||||||
memset(&uldci_payload, 0, sizeof(uldci_payload));
|
memset(&uldci_payload, 0, sizeof(uldci_payload));
|
||||||
|
|
||||||
config_uldci(sib1,
|
config_uldci(&UE->sc_info,
|
||||||
scc,
|
|
||||||
pusch_pdu,
|
pusch_pdu,
|
||||||
&uldci_payload,
|
&uldci_payload,
|
||||||
&sched_ctrl->srs_feedback,
|
&sched_ctrl->srs_feedback,
|
||||||
@@ -2383,8 +2381,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot, n
|
|||||||
cur_harq->ndi,
|
cur_harq->ndi,
|
||||||
current_BWP);
|
current_BWP);
|
||||||
|
|
||||||
fill_dci_pdu_rel15(scc,
|
fill_dci_pdu_rel15(&UE->sc_info,
|
||||||
cg,
|
|
||||||
&UE->current_DL_BWP,
|
&UE->current_DL_BWP,
|
||||||
current_BWP,
|
current_BWP,
|
||||||
dci_pdu,
|
dci_pdu,
|
||||||
|
|||||||
@@ -143,8 +143,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
|
|||||||
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234);
|
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234);
|
||||||
|
|
||||||
|
|
||||||
void config_uldci(const NR_SIB1_t *sib1,
|
void config_uldci(const NR_UE_ServingCell_Info_t *sc_info,
|
||||||
const NR_ServingCellConfigCommon_t *scc,
|
|
||||||
const nfapi_nr_pusch_pdu_t *pusch_pdu,
|
const nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||||
dci_pdu_rel15_t *dci_pdu_rel15,
|
dci_pdu_rel15_t *dci_pdu_rel15,
|
||||||
nr_srs_feedback_t *srs_feedback,
|
nr_srs_feedback_t *srs_feedback,
|
||||||
@@ -225,8 +224,7 @@ void fill_pdcch_vrb_map(gNB_MAC_INST *mac,
|
|||||||
int first_cce,
|
int first_cce,
|
||||||
int aggregation);
|
int aggregation);
|
||||||
|
|
||||||
void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
void fill_dci_pdu_rel15(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||||
const NR_CellGroupConfig_t *CellGroup,
|
|
||||||
const NR_UE_DL_BWP_t *current_DL_BWP,
|
const NR_UE_DL_BWP_t *current_DL_BWP,
|
||||||
const NR_UE_UL_BWP_t *current_UL_BWP,
|
const NR_UE_UL_BWP_t *current_UL_BWP,
|
||||||
nfapi_nr_dl_dci_pdu_t *pdcch_dci_pdu,
|
nfapi_nr_dl_dci_pdu_t *pdcch_dci_pdu,
|
||||||
@@ -239,7 +237,11 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
long pdsch_HARQ_ACK_Codebook,
|
long pdsch_HARQ_ACK_Codebook,
|
||||||
uint16_t cset0_bwp_size);
|
uint16_t cset0_bwp_size);
|
||||||
|
|
||||||
void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *current_BWP, const NR_ControlResourceSet_t *coreset, dci_pdu_rel15_t *dci_pdu_rel15, nr_dci_format_t format);
|
void prepare_dci(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||||
|
const NR_UE_DL_BWP_t *current_BWP,
|
||||||
|
const NR_ControlResourceSet_t *coreset,
|
||||||
|
dci_pdu_rel15_t *dci_pdu_rel15,
|
||||||
|
nr_dci_format_t format);
|
||||||
|
|
||||||
void set_r_pucch_parms(int rsetindex,
|
void set_r_pucch_parms(int rsetindex,
|
||||||
int r_pucch,
|
int r_pucch,
|
||||||
@@ -354,7 +356,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
const uint16_t rssi);
|
const uint16_t rssi);
|
||||||
|
|
||||||
void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
|
void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
|
||||||
const NR_PDSCH_ServingCellConfig_t *pdsch);
|
const NR_UE_ServingCell_Info_t *sc_info);
|
||||||
|
|
||||||
void reset_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl);
|
void reset_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl);
|
||||||
|
|
||||||
|
|||||||
@@ -699,6 +699,7 @@ typedef struct {
|
|||||||
NR_UE_sched_ctrl_t UE_sched_ctrl;
|
NR_UE_sched_ctrl_t UE_sched_ctrl;
|
||||||
NR_UE_DL_BWP_t current_DL_BWP;
|
NR_UE_DL_BWP_t current_DL_BWP;
|
||||||
NR_UE_UL_BWP_t current_UL_BWP;
|
NR_UE_UL_BWP_t current_UL_BWP;
|
||||||
|
NR_UE_ServingCell_Info_t sc_info;
|
||||||
NR_mac_stats_t mac_stats;
|
NR_mac_stats_t mac_stats;
|
||||||
/// currently active CellGroupConfig
|
/// currently active CellGroupConfig
|
||||||
NR_CellGroupConfig_t *CellGroup;
|
NR_CellGroupConfig_t *CellGroup;
|
||||||
|
|||||||
Reference in New Issue
Block a user