|
|
|
@@ -31,7 +31,7 @@
|
|
|
|
|
|
|
|
|
|
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
|
|
|
|
#include "executables/softmodem-common.h"
|
|
|
|
|
//#define ENABLE_MAC_PAYLOAD_DEBUG 1
|
|
|
|
|
#include "common/utils/nr/nr_common.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void nr_process_mac_pdu(
|
|
|
|
@@ -418,5 +418,382 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
long get_K2(NR_BWP_Uplink_t *ubwp, int time_domain_assignment, int mu) {
|
|
|
|
|
DevAssert(ubwp);
|
|
|
|
|
const NR_PUSCH_TimeDomainResourceAllocation_t *tda_list = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[time_domain_assignment];
|
|
|
|
|
if (tda_list->k2)
|
|
|
|
|
return *tda_list->k2;
|
|
|
|
|
else if (mu < 2)
|
|
|
|
|
return 1;
|
|
|
|
|
else if (mu == 2)
|
|
|
|
|
return 2;
|
|
|
|
|
else
|
|
|
|
|
return 3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int8_t select_ul_harq_pid(NR_UE_sched_ctrl_t *sched_ctrl) {
|
|
|
|
|
|
|
|
|
|
uint8_t hrq_id;
|
|
|
|
|
uint8_t max_ul_harq_pids = 3; // temp: for testing
|
|
|
|
|
// schedule active harq processes
|
|
|
|
|
NR_UE_ul_harq_t cur_harq;
|
|
|
|
|
for (hrq_id=0; hrq_id < max_ul_harq_pids; hrq_id++) {
|
|
|
|
|
cur_harq = sched_ctrl->ul_harq_processes[hrq_id];
|
|
|
|
|
if (cur_harq.state==ACTIVE_NOT_SCHED) {
|
|
|
|
|
#ifdef UL_HARQ_PRINT
|
|
|
|
|
printf("[SCHED] Found ulharq id %d, scheduling it for retransmission\n",hrq_id);
|
|
|
|
|
#endif
|
|
|
|
|
return hrq_id;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// schedule new harq processes
|
|
|
|
|
for (hrq_id=0; hrq_id < max_ul_harq_pids; hrq_id++) {
|
|
|
|
|
cur_harq = sched_ctrl->ul_harq_processes[hrq_id];
|
|
|
|
|
if (cur_harq.state==INACTIVE) {
|
|
|
|
|
#ifdef UL_HARQ_PRINT
|
|
|
|
|
printf("[SCHED] Found new ulharq id %d, scheduling it\n",hrq_id);
|
|
|
|
|
#endif
|
|
|
|
|
return hrq_id;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
LOG_E(MAC,"All UL HARQ processes are busy. Cannot schedule ULSCH\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nr_schedule_ulsch(module_id_t module_id,
|
|
|
|
|
frame_t frame,
|
|
|
|
|
sub_frame_t slot,
|
|
|
|
|
int num_slots_per_tdd,
|
|
|
|
|
int ul_slots,
|
|
|
|
|
uint64_t ulsch_in_slot_bitmap) {
|
|
|
|
|
gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
|
|
|
|
|
NR_COMMON_channels_t *cc = nr_mac->common_channels;
|
|
|
|
|
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
|
|
|
|
|
|
|
|
|
const int bwp_id=1;
|
|
|
|
|
const int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
|
|
|
|
|
const int UE_id = 0;
|
|
|
|
|
NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
|
|
|
|
|
AssertFatal(UE_info->active[UE_id],"Cannot find UE_id %d is not active\n",UE_id);
|
|
|
|
|
|
|
|
|
|
NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
|
|
|
|
|
AssertFatal(secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
|
|
|
|
|
"downlinkBWP_ToAddModList has %d BWP!\n",
|
|
|
|
|
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
|
|
|
|
|
NR_BWP_Uplink_t *ubwp =
|
|
|
|
|
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig
|
|
|
|
|
->uplinkBWP_ToAddModList->list.array[bwp_id - 1];
|
|
|
|
|
const int n_ubwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
|
|
|
|
|
NR_BWP_Downlink_t *bwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
|
|
|
|
|
NR_PUSCH_Config_t *pusch_Config = ubwp->bwp_Dedicated->pusch_Config->choice.setup;
|
|
|
|
|
|
|
|
|
|
const int tda = 1; // hardcoded for the moment
|
|
|
|
|
AssertFatal(tda<ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.count,
|
|
|
|
|
"time domain assignment %d >= %d\n",tda,ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.count);
|
|
|
|
|
|
|
|
|
|
int K2 = get_K2(ubwp, tda, mu);
|
|
|
|
|
/* check if slot is UL, and for phy test verify that it is in first TDD
|
|
|
|
|
* period, slot 8 (for K2=2, this is at slot 6 in the gNB; because of UE
|
|
|
|
|
* limitations). Note that if K2 or the TDD configuration is changed, below
|
|
|
|
|
* conditions might exclude each other and never be true */
|
|
|
|
|
const int slot_idx = (slot + K2) % num_slots_per_tdd;
|
|
|
|
|
if (is_xlsch_in_slot(ulsch_in_slot_bitmap, slot_idx)
|
|
|
|
|
&& (!get_softmodem_params()->phy_test || slot_idx == 8)) {
|
|
|
|
|
nfapi_nr_ul_dci_request_t *UL_dci_req = &RC.nrmac[module_id]->UL_dci_req[0];
|
|
|
|
|
UL_dci_req->SFN = frame;
|
|
|
|
|
UL_dci_req->Slot = slot;
|
|
|
|
|
nfapi_nr_ul_dci_request_pdus_t *ul_dci_request_pdu;
|
|
|
|
|
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList!=NULL,"searchPsacesToAddModList is null\n");
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count>0,
|
|
|
|
|
"searchPsacesToAddModList is empty\n");
|
|
|
|
|
|
|
|
|
|
uint16_t rnti = UE_info->rnti[UE_id];
|
|
|
|
|
|
|
|
|
|
int first_ul_slot = num_slots_per_tdd - ul_slots;
|
|
|
|
|
NR_sched_pusch *pusch_sched = &UE_info->UE_sched_ctrl[UE_id].sched_pusch[slot+K2-first_ul_slot];
|
|
|
|
|
pusch_sched->frame = frame;
|
|
|
|
|
pusch_sched->slot = slot + K2;
|
|
|
|
|
pusch_sched->active = true;
|
|
|
|
|
nfapi_nr_pusch_pdu_t *pusch_pdu = &pusch_sched->pusch_pdu;
|
|
|
|
|
memset(pusch_pdu,0,sizeof(nfapi_nr_pusch_pdu_t));
|
|
|
|
|
|
|
|
|
|
LOG_D(MAC, "Scheduling UE specific PUSCH\n");
|
|
|
|
|
//UL_tti_req = &nr_mac->UL_tti_req[CC_id];
|
|
|
|
|
|
|
|
|
|
int dci_formats[2];
|
|
|
|
|
int rnti_types[2];
|
|
|
|
|
|
|
|
|
|
NR_SearchSpace_t *ss;
|
|
|
|
|
int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
|
|
|
|
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList!=NULL,"searchPsacesToAddModList is null\n");
|
|
|
|
|
AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count>0,
|
|
|
|
|
"searchPsacesToAddModList is empty\n");
|
|
|
|
|
|
|
|
|
|
int found=0;
|
|
|
|
|
|
|
|
|
|
for (int i=0;i<bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;i++) {
|
|
|
|
|
ss=bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
|
|
|
|
|
AssertFatal(ss->controlResourceSetId != NULL,"ss->controlResourceSetId is null\n");
|
|
|
|
|
AssertFatal(ss->searchSpaceType != NULL,"ss->searchSpaceType is null\n");
|
|
|
|
|
if (ss->searchSpaceType->present == target_ss) {
|
|
|
|
|
found=1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
AssertFatal(found==1,"Couldn't find an adequate searchspace\n");
|
|
|
|
|
|
|
|
|
|
if (ss->searchSpaceType->choice.ue_Specific->dci_Formats)
|
|
|
|
|
dci_formats[0] = NR_UL_DCI_FORMAT_0_1;
|
|
|
|
|
else
|
|
|
|
|
dci_formats[0] = NR_UL_DCI_FORMAT_0_0;
|
|
|
|
|
|
|
|
|
|
rnti_types[0] = NR_RNTI_C;
|
|
|
|
|
|
|
|
|
|
//Resource Allocation in time domain
|
|
|
|
|
int startSymbolAndLength=0;
|
|
|
|
|
int StartSymbolIndex,NrOfSymbols,mapping_type;
|
|
|
|
|
|
|
|
|
|
startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[tda]->startSymbolAndLength;
|
|
|
|
|
SLIV2SL(startSymbolAndLength,&StartSymbolIndex,&NrOfSymbols);
|
|
|
|
|
pusch_pdu->start_symbol_index = StartSymbolIndex;
|
|
|
|
|
pusch_pdu->nr_of_symbols = NrOfSymbols;
|
|
|
|
|
|
|
|
|
|
mapping_type = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[tda]->mappingType;
|
|
|
|
|
|
|
|
|
|
pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
|
|
|
|
|
pusch_pdu->rnti = rnti;
|
|
|
|
|
pusch_pdu->handle = 0; //not yet used
|
|
|
|
|
|
|
|
|
|
pusch_pdu->bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275);
|
|
|
|
|
pusch_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275);
|
|
|
|
|
pusch_pdu->subcarrier_spacing = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
|
|
|
|
|
pusch_pdu->cyclic_prefix = 0;
|
|
|
|
|
|
|
|
|
|
if (pusch_Config->transformPrecoder == NULL) {
|
|
|
|
|
if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL)
|
|
|
|
|
pusch_pdu->transform_precoding = 1;
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->transform_precoding = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->transform_precoding = *pusch_Config->transformPrecoder;
|
|
|
|
|
if (pusch_Config->dataScramblingIdentityPUSCH != NULL)
|
|
|
|
|
pusch_pdu->data_scrambling_id = *pusch_Config->dataScramblingIdentityPUSCH;
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->data_scrambling_id = *scc->physCellId;
|
|
|
|
|
|
|
|
|
|
pusch_pdu->mcs_index = 9;
|
|
|
|
|
if (pusch_pdu->transform_precoding)
|
|
|
|
|
pusch_pdu->mcs_table = get_pusch_mcs_table(pusch_Config->mcs_Table, 0,
|
|
|
|
|
dci_formats[0], rnti_types[0], target_ss, false);
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->mcs_table = get_pusch_mcs_table(pusch_Config->mcs_TableTransformPrecoder, 1,
|
|
|
|
|
dci_formats[0], rnti_types[0], target_ss, false);
|
|
|
|
|
|
|
|
|
|
pusch_pdu->target_code_rate = nr_get_code_rate_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
|
|
|
|
|
pusch_pdu->qam_mod_order = nr_get_Qm_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
|
|
|
|
|
if (pusch_Config->tp_pi2BPSK!=NULL) {
|
|
|
|
|
if(((pusch_pdu->mcs_table==3)&&(pusch_pdu->mcs_index<2)) ||
|
|
|
|
|
((pusch_pdu->mcs_table==4)&&(pusch_pdu->mcs_index<6))) {
|
|
|
|
|
pusch_pdu->target_code_rate = pusch_pdu->target_code_rate>>1;
|
|
|
|
|
pusch_pdu->qam_mod_order = pusch_pdu->qam_mod_order<<1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
pusch_pdu->nrOfLayers = 1;
|
|
|
|
|
|
|
|
|
|
//Pusch Allocation in frequency domain [TS38.214, sec 6.1.2.2]
|
|
|
|
|
if (pusch_Config->resourceAllocation==NR_PUSCH_Config__resourceAllocation_resourceAllocationType1) {
|
|
|
|
|
pusch_pdu->resource_alloc = 1; //type 1
|
|
|
|
|
pusch_pdu->rb_start = 0;
|
|
|
|
|
if (get_softmodem_params()->phy_test==1)
|
|
|
|
|
pusch_pdu->rb_size = 50;
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->rb_size = pusch_pdu->bwp_size;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
AssertFatal(1==0,"Only frequency resource allocation type 1 is currently supported\n");
|
|
|
|
|
|
|
|
|
|
pusch_pdu->vrb_to_prb_mapping = 0;
|
|
|
|
|
|
|
|
|
|
if (pusch_Config->frequencyHopping==NULL)
|
|
|
|
|
pusch_pdu->frequency_hopping = 0;
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->frequency_hopping = 1;
|
|
|
|
|
|
|
|
|
|
//pusch_pdu->tx_direct_current_location;//The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE]
|
|
|
|
|
//pusch_pdu->uplink_frequency_shift_7p5khz = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --------------------
|
|
|
|
|
// ------- DMRS -------
|
|
|
|
|
// --------------------
|
|
|
|
|
NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig;
|
|
|
|
|
if (mapping_type == NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA)
|
|
|
|
|
NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup;
|
|
|
|
|
else
|
|
|
|
|
NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
|
|
|
|
|
if (NR_DMRS_UplinkConfig->dmrs_Type == NULL)
|
|
|
|
|
pusch_pdu->dmrs_config_type = 0;
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->dmrs_config_type = 1;
|
|
|
|
|
pusch_pdu->scid = 0; // DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]
|
|
|
|
|
if (pusch_pdu->transform_precoding) { // transform precoding disabled
|
|
|
|
|
long *scramblingid;
|
|
|
|
|
if (pusch_pdu->scid == 0)
|
|
|
|
|
scramblingid = NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0;
|
|
|
|
|
else
|
|
|
|
|
scramblingid = NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1;
|
|
|
|
|
if (scramblingid == NULL)
|
|
|
|
|
pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId;
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->ul_dmrs_scrambling_id = *scramblingid;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId;
|
|
|
|
|
if (NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity != NULL)
|
|
|
|
|
pusch_pdu->pusch_identity = *NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity;
|
|
|
|
|
else
|
|
|
|
|
pusch_pdu->pusch_identity = *scc->physCellId;
|
|
|
|
|
}
|
|
|
|
|
pusch_dmrs_AdditionalPosition_t additional_pos;
|
|
|
|
|
if (NR_DMRS_UplinkConfig->dmrs_AdditionalPosition == NULL)
|
|
|
|
|
additional_pos = 2;
|
|
|
|
|
else {
|
|
|
|
|
if (*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition == NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos3)
|
|
|
|
|
additional_pos = 3;
|
|
|
|
|
else
|
|
|
|
|
additional_pos = *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition;
|
|
|
|
|
}
|
|
|
|
|
pusch_maxLength_t pusch_maxLength;
|
|
|
|
|
if (NR_DMRS_UplinkConfig->maxLength == NULL)
|
|
|
|
|
pusch_maxLength = 1;
|
|
|
|
|
else
|
|
|
|
|
pusch_maxLength = 2;
|
|
|
|
|
uint16_t l_prime_mask = get_l_prime(pusch_pdu->nr_of_symbols, mapping_type, additional_pos, pusch_maxLength);
|
|
|
|
|
pusch_pdu->ul_dmrs_symb_pos = l_prime_mask << pusch_pdu->start_symbol_index;
|
|
|
|
|
|
|
|
|
|
pusch_pdu->num_dmrs_cdm_grps_no_data = 1;
|
|
|
|
|
pusch_pdu->dmrs_ports = 1;
|
|
|
|
|
// --------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
// --------------------
|
|
|
|
|
// ------- PTRS -------
|
|
|
|
|
// --------------------
|
|
|
|
|
if (NR_DMRS_UplinkConfig->phaseTrackingRS != NULL) {
|
|
|
|
|
// TODO to be fixed from RRC config
|
|
|
|
|
uint8_t ptrs_mcs1 = 2; // higher layer parameter in PTRS-UplinkConfig
|
|
|
|
|
uint8_t ptrs_mcs2 = 4; // higher layer parameter in PTRS-UplinkConfig
|
|
|
|
|
uint8_t ptrs_mcs3 = 10; // higher layer parameter in PTRS-UplinkConfig
|
|
|
|
|
uint16_t n_rb0 = 25; // higher layer parameter in PTRS-UplinkConfig
|
|
|
|
|
uint16_t n_rb1 = 75; // higher layer parameter in PTRS-UplinkConfig
|
|
|
|
|
pusch_pdu->pusch_ptrs.ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, pusch_pdu->mcs_index, pusch_pdu->mcs_table);
|
|
|
|
|
pusch_pdu->pusch_ptrs.ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, pusch_pdu->rb_size);
|
|
|
|
|
pusch_pdu->pusch_ptrs.ptrs_ports_list = (nfapi_nr_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ptrs_ports_t));
|
|
|
|
|
pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
|
|
|
|
|
|
|
|
|
|
pusch_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS; // enable PUSCH PTRS
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
pusch_pdu->pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
//Pusch Allocation in frequency domain [TS38.214, sec 6.1.2.2]
|
|
|
|
|
//Optional Data only included if indicated in pduBitmap
|
|
|
|
|
int8_t harq_id = select_ul_harq_pid(&UE_info->UE_sched_ctrl[UE_id]);
|
|
|
|
|
if (harq_id < 0) return;
|
|
|
|
|
NR_UE_ul_harq_t *cur_harq = &UE_info->UE_sched_ctrl[UE_id].ul_harq_processes[harq_id];
|
|
|
|
|
pusch_pdu->pusch_data.harq_process_id = harq_id;
|
|
|
|
|
pusch_pdu->pusch_data.new_data_indicator = cur_harq->ndi;
|
|
|
|
|
pusch_pdu->pusch_data.rv_index = nr_rv_round_map[cur_harq->round];
|
|
|
|
|
|
|
|
|
|
cur_harq->state = ACTIVE_SCHED;
|
|
|
|
|
cur_harq->last_tx_slot = pusch_sched->slot;
|
|
|
|
|
|
|
|
|
|
uint8_t num_dmrs_symb = 0;
|
|
|
|
|
|
|
|
|
|
for(int dmrs_counter = pusch_pdu->start_symbol_index; dmrs_counter < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; dmrs_counter++)
|
|
|
|
|
num_dmrs_symb += ((pusch_pdu->ul_dmrs_symb_pos >> dmrs_counter) & 1);
|
|
|
|
|
|
|
|
|
|
uint8_t N_PRB_DMRS;
|
|
|
|
|
if (pusch_pdu->dmrs_config_type == 0) {
|
|
|
|
|
N_PRB_DMRS = pusch_pdu->num_dmrs_cdm_grps_no_data*6;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
N_PRB_DMRS = pusch_pdu->num_dmrs_cdm_grps_no_data*4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->qam_mod_order,
|
|
|
|
|
pusch_pdu->target_code_rate,
|
|
|
|
|
pusch_pdu->rb_size,
|
|
|
|
|
pusch_pdu->nr_of_symbols,
|
|
|
|
|
N_PRB_DMRS * num_dmrs_symb,
|
|
|
|
|
0, //nb_rb_oh
|
|
|
|
|
0,
|
|
|
|
|
pusch_pdu->nrOfLayers)>>3;
|
|
|
|
|
|
|
|
|
|
UE_info->mac_stats[UE_id].ulsch_rounds[cur_harq->round]++;
|
|
|
|
|
if (cur_harq->round == 0) UE_info->mac_stats[UE_id].ulsch_total_bytes_scheduled+=pusch_pdu->pusch_data.tb_size;
|
|
|
|
|
|
|
|
|
|
pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
|
|
|
|
|
//pusch_pdu->pusch_data.cb_present_and_position;
|
|
|
|
|
//pusch_pdu->pusch_uci;
|
|
|
|
|
//pusch_pdu->pusch_ptrs;
|
|
|
|
|
//pusch_pdu->dfts_ofdm;
|
|
|
|
|
//beamforming
|
|
|
|
|
//pusch_pdu->beamforming; //not used for now
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ul_dci_request_pdu = &UL_dci_req->ul_dci_pdu_list[UL_dci_req->numPdus];
|
|
|
|
|
memset((void*)ul_dci_request_pdu,0,sizeof(nfapi_nr_ul_dci_request_pdus_t));
|
|
|
|
|
ul_dci_request_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE;
|
|
|
|
|
ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
|
|
|
|
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
|
|
|
|
UL_dci_req->numPdus+=1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LOG_D(MAC,"Configuring ULDCI/PDCCH in %d.%d\n", frame,slot);
|
|
|
|
|
|
|
|
|
|
uint8_t nr_of_candidates, aggregation_level;
|
|
|
|
|
find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
|
|
|
|
|
NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 1 /* dedicated */);
|
|
|
|
|
int cid = coreset->controlResourceSetId;
|
|
|
|
|
const uint16_t Y = UE_info->Y[UE_id][cid][slot];
|
|
|
|
|
const int m = UE_info->num_pdcch_cand[UE_id][cid];
|
|
|
|
|
int CCEIndex = allocate_nr_CCEs(nr_mac,
|
|
|
|
|
bwp,
|
|
|
|
|
coreset,
|
|
|
|
|
aggregation_level,
|
|
|
|
|
Y,
|
|
|
|
|
m,
|
|
|
|
|
nr_of_candidates);
|
|
|
|
|
if (CCEIndex < 0) {
|
|
|
|
|
LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PUSCH\n", __func__);
|
|
|
|
|
pusch_sched->active = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
UE_info->num_pdcch_cand[UE_id][cid]++;
|
|
|
|
|
nr_configure_pdcch(nr_mac,
|
|
|
|
|
pdcch_pdu_rel15,
|
|
|
|
|
UE_info->rnti[UE_id],
|
|
|
|
|
ss,
|
|
|
|
|
coreset,
|
|
|
|
|
scc,
|
|
|
|
|
bwp,
|
|
|
|
|
aggregation_level,
|
|
|
|
|
CCEIndex);
|
|
|
|
|
|
|
|
|
|
dci_pdu_rel15_t *dci_pdu_rel15 = calloc(MAX_DCI_CORESET,sizeof(dci_pdu_rel15_t));
|
|
|
|
|
config_uldci(ubwp,pusch_pdu,pdcch_pdu_rel15,&dci_pdu_rel15[0],dci_formats,rnti_types,tda,UE_info->UE_sched_ctrl[UE_id].tpc0,n_ubwp,bwp_id);
|
|
|
|
|
fill_dci_pdu_rel15(scc,secondaryCellGroup,pdcch_pdu_rel15,dci_pdu_rel15,dci_formats,rnti_types,pusch_pdu->bwp_size,bwp_id);
|
|
|
|
|
free(dci_pdu_rel15);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|