DCI 0_1/1_1 for SA UE, arbitrary initialBWP configuration
This commit is contained in:
+1
-1
@@ -776,7 +776,7 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
|
|||||||
// prepare tx buffer pointers
|
// prepare tx buffer pointers
|
||||||
txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
|
txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
|
||||||
timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension,
|
timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension,
|
||||||
txpsiglen+sf_extension,
|
txp,
|
||||||
siglen+sf_extension,
|
siglen+sf_extension,
|
||||||
ru->nb_tx,
|
ru->nb_tx,
|
||||||
flags);
|
flags);
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
|
|||||||
LOG_I(PHY, "Set UE frame_type %d\n", fp->frame_type);
|
LOG_I(PHY, "Set UE frame_type %d\n", fp->frame_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(PHY, "Set UE nb_rx_antenna %d, nb_tx_antenna %d, threequarter_fs %d\n", fp->nb_antennas_rx, fp->nb_antennas_tx, fp->threequarter_fs);
|
LOG_I(PHY, "Set UE nb_rx_antenna %d, nb_tx_antenna %d, threequarter_fs %d, ssb_start_subcarrier %d\n", fp->nb_antennas_rx, fp->nb_antennas_tx, fp->threequarter_fs, fp->ssb_start_subcarrier);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
|
|||||||
int32_t *ul_ch;
|
int32_t *ul_ch;
|
||||||
int32_t n0_power_tot[275];
|
int32_t n0_power_tot[275];
|
||||||
|
|
||||||
|
LOG_D(PHY,"slot %d Doing I0 for first_symb %d, num_symb %d\n",slot,first_symb,num_symb);
|
||||||
for (int s=first_symb;s<(first_symb+num_symb);s++) {
|
for (int s=first_symb;s<(first_symb+num_symb);s++) {
|
||||||
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
||||||
|
|
||||||
|
|||||||
@@ -97,12 +97,12 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex;
|
cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex;
|
||||||
cset_nsymb = pdcch_pdu_rel15->DurationSymbols;
|
cset_nsymb = pdcch_pdu_rel15->DurationSymbols;
|
||||||
dci_idx = 0;
|
dci_idx = 0;
|
||||||
LOG_I(PHY, "Coreset rb_offset %d, nb_rb %d BWP Start %d\n",rb_offset,n_rb,pdcch_pdu_rel15->BWPStart);
|
LOG_D(PHY, "Coreset rb_offset %d, nb_rb %d BWP Start %d\n",rb_offset,n_rb,pdcch_pdu_rel15->BWPStart);
|
||||||
LOG_I(PHY, "Coreset starting subcarrier %d on symbol %d (%d symbols)\n", cset_start_sc, cset_start_symb, cset_nsymb);
|
LOG_D(PHY, "Coreset starting subcarrier %d on symbol %d (%d symbols)\n", cset_start_sc, cset_start_symb, cset_nsymb);
|
||||||
// DMRS length is per OFDM symbol
|
// DMRS length is per OFDM symbol
|
||||||
uint32_t dmrs_length = n_rb*6; //2(QPSK)*3(per RB)*6(REG per CCE)
|
uint32_t dmrs_length = n_rb*6; //2(QPSK)*3(per RB)*6(REG per CCE)
|
||||||
uint32_t encoded_length = dci_pdu->AggregationLevel*108; //2(QPSK)*9(per RB)*6(REG per CCE)
|
uint32_t encoded_length = dci_pdu->AggregationLevel*108; //2(QPSK)*9(per RB)*6(REG per CCE)
|
||||||
LOG_I(PHY, "DL_DCI : DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d,reg_mapping %d)\n", dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType);
|
LOG_D(PHY, "DL_DCI : DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d,reg_mapping %d)\n", dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType);
|
||||||
dmrs_length += rb_offset*6; // To accommodate more DMRS symbols in case of rb offset
|
dmrs_length += rb_offset*6; // To accommodate more DMRS symbols in case of rb offset
|
||||||
|
|
||||||
/// DMRS QPSK modulation
|
/// DMRS QPSK modulation
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m, nfapi_nr_dl_tti_pdcch_pdu_r
|
|||||||
C = N_reg/(bsize*R);
|
C = N_reg/(bsize*R);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdcch_pdu_rel15->dci_pdu[d].RNTI != 0xFFFF) LOG_I(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d CceIndex %d\n", m, bsize, R, pdcch_pdu_rel15->dci_pdu[d].CceIndex);
|
if (pdcch_pdu_rel15->dci_pdu[d].RNTI != 0xFFFF) LOG_D(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d CceIndex %d\n", m, bsize, R, pdcch_pdu_rel15->dci_pdu[d].CceIndex);
|
||||||
for (uint8_t cce_idx=0; cce_idx<L; cce_idx++) {
|
for (uint8_t cce_idx=0; cce_idx<L; cce_idx++) {
|
||||||
cce = &gNB->cce_list[d][cce_idx];
|
cce = &gNB->cce_list[d][cce_idx];
|
||||||
cce->cce_idx = pdcch_pdu_rel15->dci_pdu[d].CceIndex + cce_idx;
|
cce->cce_idx = pdcch_pdu_rel15->dci_pdu[d].CceIndex + cce_idx;
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(PHY,"PUCCH IDFT = (%d,%d)=>%f\n",corr_re[0],corr_im[0],10*log10((double)corr_re[0]*corr_re[0] + (double)corr_im[0]*corr_im[0]));
|
LOG_D(PHY,"PUCCH IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re[0],corr_im[0],10*log10((double)corr_re[0]*corr_re[0] + (double)corr_im[0]*corr_im[0]));
|
||||||
if (l>1) LOG_D(PHY,"PUCCH 2nd symbol IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re[1],corr_im[1],10*log10((double)corr_re[1]*corr_re[1] + (double)corr_im[1]*corr_im[1]));
|
if (l>1) LOG_D(PHY,"PUCCH 2nd symbol IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re[1],corr_im[1],10*log10((double)corr_re[1]*corr_re[1] + (double)corr_im[1]*corr_im[1]));
|
||||||
|
|
||||||
if (pucch_pdu->freq_hop_flag == 0 && l==1) // non-coherent correlation
|
if (pucch_pdu->freq_hop_flag == 0 && l==1) // non-coherent correlation
|
||||||
@@ -397,8 +397,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->harq->harq_confidence_level = no_conf ? 1 : 0;
|
uci_pdu->harq->harq_confidence_level = no_conf ? 1 : 0;
|
||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
||||||
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
||||||
LOG_I(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ value %d with confidence level (0 is good, 1 is bad) %d xrt_mag %d n0 %d pucch0_thres %d, cqi %d, SNRtimes10 %d\n",
|
LOG_I(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ value %d with confidence level (0 is good, 1 is bad) %d xrt_mag %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d\n",
|
||||||
frame,slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,max_n0,uci_stats->pucch0_thres,cqi,SNRtimes10);
|
frame,slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,max_n0,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,cqi,SNRtimes10);
|
||||||
|
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
|
|||||||
// the value of u,v (delta always 0 for PUCCH) has to be calculated according to TS 38.211 Subclause 6.3.2.2.1
|
// the value of u,v (delta always 0 for PUCCH) has to be calculated according to TS 38.211 Subclause 6.3.2.2.1
|
||||||
uint8_t u[2]={0,0},v[2]={0,0};
|
uint8_t u[2]={0,0},v[2]={0,0};
|
||||||
|
|
||||||
LOG_D(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, mcs %d\n",pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->mcs);
|
LOG_I(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, mcs %d\n",pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->mcs);
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
#ifdef DEBUG_NR_PUCCH_TX
|
||||||
@@ -116,9 +116,9 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
|
|||||||
pucch_pdu->mcs,l,
|
pucch_pdu->mcs,l,
|
||||||
pucch_pdu->start_symbol_index,
|
pucch_pdu->start_symbol_index,
|
||||||
nr_slot_tx);
|
nr_slot_tx);
|
||||||
#ifdef DEBUG_NR_PUCCH_TX
|
//#ifdef DEBUG_NR_PUCCH_TX
|
||||||
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u[l],v[l],alpha,l);
|
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u[l],v[l],alpha,l);
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
for (int n=0; n<12; n++) {
|
for (int n=0; n<12; n++) {
|
||||||
x_n_re[l][n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u[l]][n])>>15)
|
x_n_re[l][n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u[l]][n])>>15)
|
||||||
|
|||||||
@@ -272,7 +272,7 @@
|
|||||||
#define NB_NUMEROLOGIES_NR (5)
|
#define NB_NUMEROLOGIES_NR (5)
|
||||||
#define TDD_CONFIG_NB_FRAMES (2)
|
#define TDD_CONFIG_NB_FRAMES (2)
|
||||||
#define NR_MAX_SLOTS_PER_FRAME (160) /* number of slots per frame */
|
#define NR_MAX_SLOTS_PER_FRAME (160) /* number of slots per frame */
|
||||||
#define NR_UE_CAPABILITY_SLOT_RX_TO_TX (6) /* FFS_NR_TODO it defines ue capability which is the number of slots */
|
#define NR_UE_CAPABILITY_SLOT_RX_TO_TX (5) /* FFS_NR_TODO it defines ue capability which is the number of slots */
|
||||||
/* - between reception of pdsch and tarnsmission of its acknowlegment */
|
/* - between reception of pdsch and tarnsmission of its acknowlegment */
|
||||||
/* - between reception of un uplink grant and its related transmission */
|
/* - between reception of un uplink grant and its related transmission */
|
||||||
#ifndef NO_RAT_NR
|
#ifndef NO_RAT_NR
|
||||||
|
|||||||
@@ -531,9 +531,11 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
(pucch->frame == frame_rx) &&
|
(pucch->frame == frame_rx) &&
|
||||||
(pucch->slot == slot_rx) ) {
|
(pucch->slot == slot_rx) ) {
|
||||||
nfapi_nr_pucch_pdu_t *pucch_pdu = &pucch->pucch_pdu;
|
nfapi_nr_pucch_pdu_t *pucch_pdu = &pucch->pucch_pdu;
|
||||||
|
LOG_D(PHY,"%d.%d pucch %d : start_symbol %d, nb_symbols %d, prb_size %d\n",frame_rx,slot_rx,i,pucch_pdu->start_symbol_index,pucch_pdu->nr_of_symbols,pucch_pdu->prb_size);
|
||||||
for (int symbol=pucch_pdu->start_symbol_index ; symbol<(pucch_pdu->start_symbol_index+pucch_pdu->nr_of_symbols);symbol++) {
|
for (int symbol=pucch_pdu->start_symbol_index ; symbol<(pucch_pdu->start_symbol_index+pucch_pdu->nr_of_symbols);symbol++) {
|
||||||
for (rb=0; rb<pucch_pdu->prb_size; rb++) {
|
for (rb=0; rb<pucch_pdu->prb_size; rb++) {
|
||||||
rb2 = rb+pucch_pdu->prb_start+pucch_pdu->bwp_start;
|
rb2 = rb+(symbol < pucch_pdu->start_symbol_index+(pucch_pdu->nr_of_symbols>>1) ? pucch_pdu->prb_start : pucch_pdu->second_hop_prb)+pucch_pdu->bwp_start;
|
||||||
|
LOG_D(PHY,"%d.%d pucch %d : symbol %d, rb %d\n",frame_rx,slot_rx,i,symbol,rb2);
|
||||||
gNB->rb_mask_ul[symbol][rb2>>5] |= (1<<(rb2&31));
|
gNB->rb_mask_ul[symbol][rb2>>5] |= (1<<(rb2&31));
|
||||||
}
|
}
|
||||||
if (symbol==pucch_pdu->start_symbol_index) nb_rb+=pucch_pdu->prb_size;
|
if (symbol==pucch_pdu->start_symbol_index) nb_rb+=pucch_pdu->prb_size;
|
||||||
|
|||||||
@@ -516,12 +516,12 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
|
|||||||
else if (scd->defaultDownlinkBWP_Id)
|
else if (scd->defaultDownlinkBWP_Id)
|
||||||
mac->DL_BWP_Id = *scd->defaultDownlinkBWP_Id;
|
mac->DL_BWP_Id = *scd->defaultDownlinkBWP_Id;
|
||||||
else
|
else
|
||||||
mac->DL_BWP_Id = 1;
|
mac->DL_BWP_Id = 0;
|
||||||
|
|
||||||
if (scd->uplinkConfig && scd->uplinkConfig->firstActiveUplinkBWP_Id)
|
if (scd->uplinkConfig && scd->uplinkConfig->firstActiveUplinkBWP_Id)
|
||||||
mac->UL_BWP_Id = *scd->uplinkConfig->firstActiveUplinkBWP_Id;
|
mac->UL_BWP_Id = *scd->uplinkConfig->firstActiveUplinkBWP_Id;
|
||||||
else
|
else
|
||||||
mac->UL_BWP_Id = 1;
|
mac->UL_BWP_Id = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -537,20 +537,21 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
|
|||||||
void config_control_ue(NR_UE_MAC_INST_t *mac){
|
void config_control_ue(NR_UE_MAC_INST_t *mac){
|
||||||
|
|
||||||
uint8_t coreset_id = 1, ss_id;
|
uint8_t coreset_id = 1, ss_id;
|
||||||
|
|
||||||
NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
|
|
||||||
AssertFatal(scd->downlinkBWP_ToAddModList != NULL, "downlinkBWP_ToAddModList is null\n");
|
|
||||||
AssertFatal(scd->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList->list->count is %d\n", scd->downlinkBWP_ToAddModList->list.count);
|
|
||||||
|
|
||||||
config_bwp_ue(mac, NULL, NULL);
|
|
||||||
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
||||||
AssertFatal(dl_bwp_id != 0, "DL_BWP_Id is 0!");
|
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
|
NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
|
||||||
|
NR_BWP_DownlinkCommon_t *bwp_Common = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Common :
|
||||||
|
&mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
|
||||||
|
|
||||||
NR_BWP_DownlinkCommon_t *bwp_Common = scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Common;
|
|
||||||
AssertFatal(bwp_Common != NULL, "bwp_Common is null\n");
|
|
||||||
|
|
||||||
NR_BWP_DownlinkDedicated_t *dl_bwp_Dedicated = scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Dedicated;
|
if (dl_bwp_id > 0 ) {
|
||||||
|
AssertFatal(scd->downlinkBWP_ToAddModList != NULL, "downlinkBWP_ToAddModList is null\n");
|
||||||
|
AssertFatal(scd->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList->list->count is %d\n", scd->downlinkBWP_ToAddModList->list.count);
|
||||||
|
}
|
||||||
|
NR_BWP_DownlinkDedicated_t *dl_bwp_Dedicated = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Dedicated:
|
||||||
|
scd->initialDownlinkBWP;
|
||||||
AssertFatal(dl_bwp_Dedicated != NULL, "dl_bwp_Dedicated is null\n");
|
AssertFatal(dl_bwp_Dedicated != NULL, "dl_bwp_Dedicated is null\n");
|
||||||
|
config_bwp_ue(mac, NULL, NULL);
|
||||||
|
|
||||||
NR_SetupRelease_PDCCH_Config_t *pdcch_Config = dl_bwp_Dedicated->pdcch_Config;
|
NR_SetupRelease_PDCCH_Config_t *pdcch_Config = dl_bwp_Dedicated->pdcch_Config;
|
||||||
AssertFatal(pdcch_Config != NULL, "pdcch_Config is null\n");
|
AssertFatal(pdcch_Config != NULL, "pdcch_Config is null\n");
|
||||||
@@ -574,16 +575,17 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
|||||||
AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_CORESET, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
|
AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_CORESET, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
|
||||||
|
|
||||||
struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList;
|
struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList;
|
||||||
AssertFatal(uplinkBWP_ToAddModList != NULL, "uplinkBWP_ToAddModList is null\n");
|
if (ul_bwp_id > 0) {
|
||||||
AssertFatal(uplinkBWP_ToAddModList->list.count == 1, "uplinkBWP_ToAddModList->list->count is %d\n", uplinkBWP_ToAddModList->list.count);
|
AssertFatal(uplinkBWP_ToAddModList != NULL, "uplinkBWP_ToAddModList is null\n");
|
||||||
|
AssertFatal(uplinkBWP_ToAddModList->list.count == 1, "uplinkBWP_ToAddModList->list->count is %d\n", uplinkBWP_ToAddModList->list.count);
|
||||||
|
}
|
||||||
// check pdcch_Config, pdcch_ConfigCommon and DL BWP
|
// check pdcch_Config, pdcch_ConfigCommon and DL BWP
|
||||||
mac->DLbwp[0] = scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1];
|
mac->DLbwp[0] = dl_bwp_id>0?scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]:NULL;
|
||||||
mac->coreset[dl_bwp_id - 1][coreset_id - 1] = controlResourceSetToAddModList->list.array[0];
|
mac->coreset[dl_bwp_id][coreset_id - 1] = controlResourceSetToAddModList->list.array[0];
|
||||||
|
|
||||||
// Check dedicated UL BWP and pass to MAC
|
// Check dedicated UL BWP and pass to MAC
|
||||||
mac->ULbwp[0] = uplinkBWP_ToAddModList->list.array[0];
|
mac->ULbwp[0] = ul_bwp_id>0?uplinkBWP_ToAddModList->list.array[0]:NULL;
|
||||||
AssertFatal(mac->ULbwp[0]->bwp_Dedicated != NULL, "UL bwp_Dedicated is null\n");
|
if (mac->ULbwp[0]) AssertFatal(mac->ULbwp[0]->bwp_Dedicated != NULL, "UL bwp_Dedicated is null\n");
|
||||||
|
|
||||||
// check available Search Spaces in the searchSpacesToAddModList and pass to MAC
|
// check available Search Spaces in the searchSpacesToAddModList and pass to MAC
|
||||||
// note: the network configures at most 10 Search Spaces per BWP per cell (including UE-specific and common Search Spaces).
|
// note: the network configures at most 10 Search Spaces per BWP per cell (including UE-specific and common Search Spaces).
|
||||||
@@ -591,10 +593,10 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
|||||||
NR_SearchSpace_t *ss = searchSpacesToAddModList->list.array[ss_id];
|
NR_SearchSpace_t *ss = searchSpacesToAddModList->list.array[ss_id];
|
||||||
AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
|
AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
|
||||||
AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
|
AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
|
||||||
AssertFatal(*ss->controlResourceSetId == mac->coreset[dl_bwp_id - 1][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
|
AssertFatal(*ss->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
|
||||||
AssertFatal(ss->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n");
|
AssertFatal(ss->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n");
|
||||||
AssertFatal(ss->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n");
|
AssertFatal(ss->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n");
|
||||||
mac->SSpace[0][0][ss_id] = ss;
|
mac->SSpace[dl_bwp_id][0][ss_id] = ss;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check available CSSs in the commonSearchSpaceList (list of additional common search spaces)
|
// Check available CSSs in the commonSearchSpaceList (list of additional common search spaces)
|
||||||
@@ -602,11 +604,12 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
|||||||
for (int css_id = 0; css_id < commonSearchSpaceList->list.count; css_id++) {
|
for (int css_id = 0; css_id < commonSearchSpaceList->list.count; css_id++) {
|
||||||
NR_SearchSpace_t *css = commonSearchSpaceList->list.array[css_id];
|
NR_SearchSpace_t *css = commonSearchSpaceList->list.array[css_id];
|
||||||
AssertFatal(css->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
|
AssertFatal(css->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
|
||||||
AssertFatal(*css->controlResourceSetId == mac->coreset[dl_bwp_id - 1][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
|
AssertFatal(*css->controlResourceSetId == 0 || *css->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "css->controlResourceSetId %d is unknown, mac->coreset[%d][%d]->controlResourceSetId %d\n",*css->controlResourceSetId,dl_bwp_id,coreset_id-1,mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId);
|
||||||
|
|
||||||
AssertFatal(css->searchSpaceType != NULL, "css->searchSpaceType is null\n");
|
AssertFatal(css->searchSpaceType != NULL, "css->searchSpaceType is null\n");
|
||||||
AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n");
|
AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n");
|
||||||
AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
|
AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
|
||||||
mac->SSpace[0][0][ss_id] = css;
|
mac->SSpace[dl_bwp_id][0][ss_id] = css;
|
||||||
ss_id++;
|
ss_id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -671,8 +674,8 @@ int nr_rrc_mac_config_req_ue(
|
|||||||
LOG_I(MAC,"Applying CellGroupConfig from gNodeB\n");
|
LOG_I(MAC,"Applying CellGroupConfig from gNodeB\n");
|
||||||
mac->cg = cell_group_config;
|
mac->cg = cell_group_config;
|
||||||
mac->servCellIndex = cell_group_config->spCellConfig->servCellIndex ? *cell_group_config->spCellConfig->servCellIndex : 0;
|
mac->servCellIndex = cell_group_config->spCellConfig->servCellIndex ? *cell_group_config->spCellConfig->servCellIndex : 0;
|
||||||
// config_control_ue(mac);
|
config_control_ue(mac);
|
||||||
// config_common_ue(mac,module_id,cc_idP);
|
//config_common_ue(mac,module_id,cc_idP);
|
||||||
/*
|
/*
|
||||||
if(mac_cell_group_configP != NULL){
|
if(mac_cell_group_configP != NULL){
|
||||||
if(mac_cell_group_configP->drx_Config != NULL ){
|
if(mac_cell_group_configP->drx_Config != NULL ){
|
||||||
|
|||||||
@@ -309,6 +309,7 @@ typedef struct {
|
|||||||
bool ack_received;
|
bool ack_received;
|
||||||
uint8_t pucch_resource_indicator;
|
uint8_t pucch_resource_indicator;
|
||||||
uint16_t feedback_to_ul;
|
uint16_t feedback_to_ul;
|
||||||
|
int is_common;
|
||||||
frame_t dl_frame;
|
frame_t dl_frame;
|
||||||
int dl_slot;
|
int dl_slot;
|
||||||
uint8_t ack;
|
uint8_t ack;
|
||||||
@@ -335,6 +336,7 @@ typedef struct {
|
|||||||
uint32_t csi_part2_payload;
|
uint32_t csi_part2_payload;
|
||||||
int resource_indicator;
|
int resource_indicator;
|
||||||
int resource_set_id;
|
int resource_set_id;
|
||||||
|
int is_common;
|
||||||
int initial_pucch_id;
|
int initial_pucch_id;
|
||||||
NR_PUCCH_Resource_t *pucch_resource;
|
NR_PUCCH_Resource_t *pucch_resource;
|
||||||
int n_CCE;
|
int n_CCE;
|
||||||
|
|||||||
@@ -188,6 +188,14 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
|
|||||||
|
|
||||||
void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl_config, frame_t frame, int slot);
|
void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl_config, frame_t frame, int slot);
|
||||||
|
|
||||||
|
void get_bwp_info(NR_UE_MAC_INST_t *mac,
|
||||||
|
int dl_bwp_id,
|
||||||
|
int ul_bwp_id,
|
||||||
|
NR_BWP_DownlinkDedicated_t **bwpd,
|
||||||
|
NR_BWP_DownlinkCommon_t **bwpc,
|
||||||
|
NR_BWP_UplinkDedicated_t **ubwpd,
|
||||||
|
NR_BWP_UplinkCommon_t **ubwpc);
|
||||||
|
|
||||||
uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
||||||
uint8_t dci_format,
|
uint8_t dci_format,
|
||||||
uint8_t dci_length,
|
uint8_t dci_length,
|
||||||
@@ -195,7 +203,12 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
|||||||
uint64_t *dci_pdu,
|
uint64_t *dci_pdu,
|
||||||
dci_pdu_rel15_t *nr_pdci_info_extracted);
|
dci_pdu_rel15_t *nr_pdci_info_extracted);
|
||||||
|
|
||||||
|
NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon);
|
||||||
|
NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon);
|
||||||
|
|
||||||
int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
|
int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
|
||||||
|
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList,
|
||||||
|
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
|
||||||
nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
|
nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
|
||||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
|
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
|
||||||
uint8_t time_domain_ind,
|
uint8_t time_domain_ind,
|
||||||
@@ -218,6 +231,7 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
|
|||||||
uint8_t dai,
|
uint8_t dai,
|
||||||
int n_CCE,
|
int n_CCE,
|
||||||
int N_CCE,
|
int N_CCE,
|
||||||
|
int is_common,
|
||||||
frame_t frame,
|
frame_t frame,
|
||||||
int slot);
|
int slot);
|
||||||
|
|
||||||
|
|||||||
@@ -82,18 +82,14 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
|
|||||||
if (scc!=NULL || scc_SIB != NULL) {
|
if (scc!=NULL || scc_SIB != NULL) {
|
||||||
initialDownlinkBWP = scc!=NULL ? scc->downlinkConfigCommon->initialDownlinkBWP : &scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
|
initialDownlinkBWP = scc!=NULL ? scc->downlinkConfigCommon->initialDownlinkBWP : &scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
|
||||||
initialUplinkBWP = scc!=NULL ? scc->uplinkConfigCommon->initialUplinkBWP : &scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
initialUplinkBWP = scc!=NULL ? scc->uplinkConfigCommon->initialUplinkBWP : &scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
||||||
|
|
||||||
bwp_Common = bwp_id>0 ? mac->DLbwp[bwp_id-1]->bwp_Common : NULL;
|
|
||||||
}
|
}
|
||||||
|
bwp_Common = bwp_id>0 ? mac->DLbwp[bwp_id-1]->bwp_Common : NULL;
|
||||||
|
|
||||||
NR_SearchSpace_t *ss;
|
NR_SearchSpace_t *ss;
|
||||||
NR_ControlResourceSet_t *coreset;
|
NR_ControlResourceSet_t *coreset;
|
||||||
if(ss_id>=0) {
|
if(ss_id>=0) {
|
||||||
AssertFatal(mac->scc != NULL, "scc is null\n");
|
ss = mac->SSpace[bwp_id][coreset_id - 1][ss_id];
|
||||||
initialDownlinkBWP = scc->downlinkConfigCommon->initialDownlinkBWP;
|
coreset = mac->coreset[bwp_id][coreset_id - 1];
|
||||||
bwp_Common = mac->DLbwp[bwp_id - 1]->bwp_Common;
|
|
||||||
ss = mac->SSpace[bwp_id - 1][coreset_id - 1][ss_id];
|
|
||||||
coreset = mac->coreset[bwp_id - 1][coreset_id - 1];
|
|
||||||
rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
|
rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
|
||||||
} else {
|
} else {
|
||||||
ss = mac->search_space_zero;
|
ss = mac->search_space_zero;
|
||||||
@@ -161,10 +157,11 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
|
|||||||
sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
|
sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
|
||||||
monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
|
monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
|
||||||
rel15->rnti = mac->ra.ra_rnti;
|
rel15->rnti = mac->ra.ra_rnti;
|
||||||
rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
|
||||||
if (get_softmodem_params()->sa) {
|
if (get_softmodem_params()->sa) {
|
||||||
rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
rel15->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs;
|
||||||
|
rel15->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
|
||||||
} else { // NSA mode is not using the Initial BWP
|
} else { // NSA mode is not using the Initial BWP
|
||||||
|
rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
}
|
}
|
||||||
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
|
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
|
||||||
@@ -179,8 +176,8 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
|
|||||||
sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
|
sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
|
||||||
monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
|
monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
|
||||||
rel15->rnti = mac->ra.t_crnti;
|
rel15->rnti = mac->ra.t_crnti;
|
||||||
rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
rel15->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs;
|
||||||
rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
rel15->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
|
||||||
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
|
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
|
||||||
rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_TC, rel15->BWPSize, bwp_id);
|
rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_TC, rel15->BWPSize, bwp_id);
|
||||||
break;
|
break;
|
||||||
@@ -247,20 +244,19 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
RA_config_t *ra = &mac->ra;
|
RA_config_t *ra = &mac->ra;
|
||||||
int ss_id;
|
int ss_id;
|
||||||
|
|
||||||
uint8_t bwp_id = (mac->cg) ? 1 : 0, coreset_id = (mac->cg) ? 1 : 0;
|
uint8_t bwp_id = (mac->cg) ? mac->DL_BWP_Id : 0, coreset_id = (mac->cg) ? 1 : 0;
|
||||||
//NR_ServingCellConfig_t *scd = mac->scg->spCellConfig->spCellConfigDedicated;
|
//NR_ServingCellConfig_t *scd = mac->scg->spCellConfig->spCellConfigDedicated;
|
||||||
NR_BWP_Downlink_t *bwp = (mac->cg) ? mac->DLbwp[bwp_id - 1] : NULL;
|
NR_BWP_DownlinkDedicated_t *bwpd = (bwp_id>0) ? mac->DLbwp[bwp_id-1]->bwp_Dedicated : mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
|
||||||
|
NR_BWP_DownlinkCommon_t *bwp_Common = (bwp_id>0) ? mac->DLbwp[bwp_id-1]->bwp_Common : &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
|
||||||
|
|
||||||
LOG_D(MAC, "[DCI_CONFIG] ra_rnti %p (%x) crnti %p (%x) t_crnti %p (%x)\n", &ra->ra_rnti, ra->ra_rnti, &mac->crnti, mac->crnti, &ra->t_crnti, ra->t_crnti);
|
LOG_I(MAC, "[DCI_CONFIG] ra_rnti %p (%x) crnti %p (%x) t_crnti %p (%x)\n", &ra->ra_rnti, ra->ra_rnti, &mac->crnti, mac->crnti, &ra->t_crnti, ra->t_crnti);
|
||||||
|
|
||||||
if (mac->cg) { // do this only after we have a Master or Secondary Cell group
|
// loop over all available SS for CORESET ID 1
|
||||||
// loop over all available SS for BWP ID 1, CORESET ID 1
|
if (bwpd) {
|
||||||
if (bwp) {
|
for (ss_id = 0; ss_id < FAPI_NR_MAX_SS_PER_CORESET && mac->SSpace[bwp_id][coreset_id - 1][ss_id] != NULL; ss_id++){
|
||||||
for (ss_id = 0; ss_id < FAPI_NR_MAX_SS_PER_CORESET && mac->SSpace[bwp_id - 1][coreset_id - 1][ss_id] != NULL; ss_id++){
|
LOG_I(MAC, "[DCI_CONFIG] ss_id %d\n",ss_id);
|
||||||
LOG_D(MAC, "[DCI_CONFIG] ss_id %d\n",ss_id);
|
NR_SearchSpace_t *ss = mac->SSpace[bwp_id][coreset_id - 1][ss_id];
|
||||||
NR_SearchSpace_t *ss = mac->SSpace[bwp_id - 1][coreset_id - 1][ss_id];
|
|
||||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
||||||
NR_BWP_DownlinkCommon_t *bwp_Common = bwp->bwp_Common;
|
|
||||||
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
|
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
|
||||||
struct NR_PhysicalCellGroupConfig *phy_cgc = mac->cg->physicalCellGroupConfig;
|
struct NR_PhysicalCellGroupConfig *phy_cgc = mac->cg->physicalCellGroupConfig;
|
||||||
switch (ss->searchSpaceType->present){
|
switch (ss->searchSpaceType->present){
|
||||||
@@ -274,7 +270,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
|
pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
|
||||||
}
|
}
|
||||||
*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = 0;
|
*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = 0;
|
||||||
LOG_D(MAC, "[DCI_CONFIG] Configure SearchSpace#0 of the initial BWP\n");
|
LOG_I(MAC, "[DCI_CONFIG] Configure SearchSpace#0 of the initial BWP\n");
|
||||||
}
|
}
|
||||||
if (ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0){
|
if (ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0){
|
||||||
// check available SS IDs
|
// check available SS IDs
|
||||||
@@ -359,50 +355,47 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
break;
|
break;
|
||||||
case NR_SearchSpace__searchSpaceType_PR_ue_Specific:
|
case NR_SearchSpace__searchSpaceType_PR_ue_Specific:
|
||||||
// this is an USS
|
// this is an USS
|
||||||
if (ss->searchSpaceType->choice.ue_Specific){
|
if (ss->searchSpaceType->choice.ue_Specific &&
|
||||||
if(ss->searchSpaceType->choice.ue_Specific->dci_Formats == NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1){
|
ss->searchSpaceType->choice.ue_Specific->dci_Formats == NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1 &&
|
||||||
|
(ra->ra_state == RA_SUCCEEDED || get_softmodem_params()->phy_test) &&
|
||||||
|
mac->crnti > 0) {
|
||||||
// Monitors DCI 01 and 11 scrambled with C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
|
// Monitors DCI 01 and 11 scrambled with C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
|
||||||
if ((ra->ra_state == RA_SUCCEEDED || get_softmodem_params()->phy_test) && mac->crnti > 0) {
|
LOG_I(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in the user specific search space\n");
|
||||||
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in the user specific search space\n");
|
rel15->num_dci_options = 2;
|
||||||
rel15->num_dci_options = 2;
|
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_1;
|
||||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_1;
|
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_1;
|
||||||
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_1;
|
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C, ss_id);
|
||||||
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C, ss_id);
|
fill_dci_search_candidates(ss, rel15);
|
||||||
fill_dci_search_candidates(ss, rel15);
|
|
||||||
|
|
||||||
#ifdef DEBUG_DCI
|
//#ifdef DEBUG_DCI
|
||||||
LOG_D(MAC, "[DCI_CONFIG] ss %d ue_Specific %p searchSpaceType->present %d dci_Formats %d\n",
|
LOG_I(MAC, "[DCI_CONFIG] ss %d ue_Specific %p searchSpaceType->present %d dci_Formats %d\n",
|
||||||
ss_id,
|
ss_id,
|
||||||
ss->searchSpaceType->choice.ue_Specific,
|
ss->searchSpaceType->choice.ue_Specific,
|
||||||
ss->searchSpaceType->present,
|
(int)ss->searchSpaceType->present,
|
||||||
ss->searchSpaceType->choice.ue_Specific->dci_Formats);
|
(int)ss->searchSpaceType->choice.ue_Specific->dci_Formats);
|
||||||
#endif
|
//#endif
|
||||||
}
|
}
|
||||||
if (phy_cgc){
|
if (phy_cgc){
|
||||||
if (phy_cgc->cs_RNTI){
|
if (phy_cgc->cs_RNTI){
|
||||||
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in user specific search space for dci_Format0_0_AndFormat1_0 with CRC scrambled by CS-RNTI...\n");
|
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in user specific search space for dci_Format0_0_AndFormat1_0 with CRC scrambled by CS-RNTI...\n");
|
||||||
LOG_W(MAC, "[DCI_CONFIG] This RNTI should not be configured yet...");
|
LOG_W(MAC, "[DCI_CONFIG] This RNTI should not be configured yet...");
|
||||||
}
|
}
|
||||||
if (phy_cgc->sp_CSI_RNTI){
|
if (phy_cgc->sp_CSI_RNTI){
|
||||||
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in user specific search space for dci_Format0_0_AndFormat1_0 with CRC scrambled by SP-CSI-RNTI...\n");
|
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in user specific search space for dci_Format0_0_AndFormat1_0 with CRC scrambled by SP-CSI-RNTI...\n");
|
||||||
LOG_W(MAC, "[DCI_CONFIG] This RNTI should not be configured yet...");
|
LOG_W(MAC, "[DCI_CONFIG] This RNTI should not be configured yet...");
|
||||||
}
|
}
|
||||||
if (phy_cgc->ext1){
|
if (phy_cgc->ext1 &&
|
||||||
if (phy_cgc->ext1->mcs_C_RNTI){
|
phy_cgc->ext1->mcs_C_RNTI){
|
||||||
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in user specific search space for dci_Format0_0_AndFormat1_0 with CRC scrambled by MCS-C-RNTI...\n");
|
LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in user specific search space for dci_Format0_0_AndFormat1_0 with CRC scrambled by MCS-C-RNTI...\n");
|
||||||
LOG_W(MAC, "[DCI_CONFIG] This RNTI should not be configured yet...");
|
LOG_W(MAC, "[DCI_CONFIG] This RNTI should not be configured yet...");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
AssertFatal(1 == 0, "[DCI_CONFIG] Unrecognized search space type...");
|
AssertFatal(1 == 0, "[DCI_CONFIG] Unrecognized search space type...");
|
||||||
break;
|
break;
|
||||||
}
|
} // switch searchspace
|
||||||
}
|
} // for ss_id
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
@@ -410,8 +403,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
}
|
}
|
||||||
// Search space 0, CORESET ID 0
|
// Search space 0, CORESET ID 0
|
||||||
|
|
||||||
NR_BWP_DownlinkCommon_t *bwp_Common = bwp ? bwp->bwp_Common : NULL;
|
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
|
||||||
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp?bwp_Common->pdcch_ConfigCommon:NULL;
|
|
||||||
|
|
||||||
if (pdcch_ConfigCommon &&
|
if (pdcch_ConfigCommon &&
|
||||||
pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){
|
pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){
|
||||||
|
|||||||
@@ -135,6 +135,82 @@ const initial_pucch_resource_t initial_pucch_resource[16] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void get_bwp_info(NR_UE_MAC_INST_t *mac,
|
||||||
|
int dl_bwp_id,
|
||||||
|
int ul_bwp_id,
|
||||||
|
NR_BWP_DownlinkDedicated_t **bwpd,
|
||||||
|
NR_BWP_DownlinkCommon_t **bwpc,
|
||||||
|
NR_BWP_UplinkDedicated_t **ubwpd,
|
||||||
|
NR_BWP_UplinkCommon_t **ubwpc) {
|
||||||
|
|
||||||
|
if (dl_bwp_id > 0) {
|
||||||
|
AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n",
|
||||||
|
(int)dl_bwp_id-1);
|
||||||
|
*bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated;
|
||||||
|
if (mac->DLbwp[dl_bwp_id-1]->bwp_Common) *bwpc = mac->DLbwp[dl_bwp_id-1]->bwp_Common;
|
||||||
|
else if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
|
||||||
|
else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
|
||||||
|
AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
|
||||||
|
} else {
|
||||||
|
if (mac->cg &&
|
||||||
|
mac->cg->spCellConfig &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
|
||||||
|
*bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
|
||||||
|
if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
|
||||||
|
else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
|
||||||
|
AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ul_bwp_id > 0) {
|
||||||
|
AssertFatal(mac->ULbwp[ul_bwp_id-1]!=NULL,"mac->ULbwp[%d] is null, shouldn't be\n",
|
||||||
|
ul_bwp_id-1);
|
||||||
|
*ubwpd = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated;
|
||||||
|
if (mac->ULbwp[ul_bwp_id-1]->bwp_Common) *ubwpc = mac->ULbwp[ul_bwp_id-1]->bwp_Common;
|
||||||
|
else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
||||||
|
else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
|
||||||
|
AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (mac->cg &&
|
||||||
|
mac->cg->spCellConfig &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
||||||
|
*ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
||||||
|
if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
||||||
|
else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
|
||||||
|
AssertFatal(*ubwpc!=NULL,"ubwpc shouldn't be null\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon) {
|
||||||
|
|
||||||
|
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList=NULL;
|
||||||
|
|
||||||
|
if (pdsch_Config &&
|
||||||
|
pdsch_Config->pdsch_TimeDomainAllocationList)
|
||||||
|
pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
|
||||||
|
else if (pdsch_ConfigCommon->pdsch_TimeDomainAllocationList)
|
||||||
|
pdsch_TimeDomainAllocationList = pdsch_ConfigCommon->pdsch_TimeDomainAllocationList;
|
||||||
|
|
||||||
|
return(pdsch_TimeDomainAllocationList);
|
||||||
|
}
|
||||||
|
|
||||||
|
NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon) {
|
||||||
|
|
||||||
|
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList=NULL;
|
||||||
|
|
||||||
|
if (pusch_Config &&
|
||||||
|
pusch_Config->pusch_TimeDomainAllocationList)
|
||||||
|
pusch_TimeDomainAllocationList = pusch_Config->pusch_TimeDomainAllocationList->choice.setup;
|
||||||
|
else if (pusch_ConfigCommon->pusch_TimeDomainAllocationList)
|
||||||
|
pusch_TimeDomainAllocationList = pusch_ConfigCommon->pusch_TimeDomainAllocationList;
|
||||||
|
|
||||||
|
return(pusch_TimeDomainAllocationList);
|
||||||
|
}
|
||||||
|
|
||||||
int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti){
|
int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti){
|
||||||
|
|
||||||
RA_config_t *ra = &mac->ra;
|
RA_config_t *ra = &mac->ra;
|
||||||
@@ -342,6 +418,8 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p
|
|||||||
}
|
}
|
||||||
|
|
||||||
int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
|
int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
|
||||||
|
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList,
|
||||||
|
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
|
||||||
nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
|
nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
|
||||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
|
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
|
||||||
uint8_t time_domain_ind,
|
uint8_t time_domain_ind,
|
||||||
@@ -398,17 +476,6 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
|
|||||||
* TS 38.214 subclause 5.1.2.1 Resource allocation in time domain (downlink)
|
* TS 38.214 subclause 5.1.2.1 Resource allocation in time domain (downlink)
|
||||||
*/
|
*/
|
||||||
if(dlsch_config_pdu != NULL){
|
if(dlsch_config_pdu != NULL){
|
||||||
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
|
|
||||||
if (mac->DLbwp[0] &&
|
|
||||||
mac->DLbwp[0]->bwp_Dedicated &&
|
|
||||||
mac->DLbwp[0]->bwp_Dedicated->pdsch_Config &&
|
|
||||||
mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
|
|
||||||
pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup;
|
|
||||||
else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
|
|
||||||
pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
|
||||||
else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
|
|
||||||
pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
|
||||||
|
|
||||||
if (pdsch_TimeDomainAllocationList && use_default==false) {
|
if (pdsch_TimeDomainAllocationList && use_default==false) {
|
||||||
|
|
||||||
if (time_domain_ind >= pdsch_TimeDomainAllocationList->list.count) {
|
if (time_domain_ind >= pdsch_TimeDomainAllocationList->list.count) {
|
||||||
@@ -446,23 +513,6 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
|
|||||||
* TS 38.214 subclause 6.1.2.1 Resource allocation in time domain (uplink)
|
* TS 38.214 subclause 6.1.2.1 Resource allocation in time domain (uplink)
|
||||||
*/
|
*/
|
||||||
if(pusch_config_pdu != NULL){
|
if(pusch_config_pdu != NULL){
|
||||||
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
|
|
||||||
if (mac->ULbwp[0] &&
|
|
||||||
mac->ULbwp[0]->bwp_Dedicated &&
|
|
||||||
mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
|
|
||||||
mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
|
|
||||||
mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
|
|
||||||
pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
|
|
||||||
}
|
|
||||||
else if (mac->ULbwp[0] &&
|
|
||||||
mac->ULbwp[0]->bwp_Common &&
|
|
||||||
mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon &&
|
|
||||||
mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
|
|
||||||
mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
|
|
||||||
pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
|
||||||
}
|
|
||||||
else pusch_TimeDomainAllocationList = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
|
||||||
|
|
||||||
if (pusch_TimeDomainAllocationList && use_default==false) {
|
if (pusch_TimeDomainAllocationList && use_default==false) {
|
||||||
if (time_domain_ind >= pusch_TimeDomainAllocationList->list.count) {
|
if (time_domain_ind >= pusch_TimeDomainAllocationList->list.count) {
|
||||||
LOG_E(MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n",
|
LOG_E(MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n",
|
||||||
@@ -633,7 +683,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
// Config PUSCH PDU
|
// Config PUSCH PDU
|
||||||
ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format);
|
ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format);
|
||||||
|
|
||||||
}
|
} else AssertFatal(1==0,"Cannot schedule PUSCH\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -694,7 +744,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
|
|
||||||
NR_PDSCH_Config_t *pdsch_config= (mac->DLbwp[0]) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
|
NR_PDSCH_Config_t *pdsch_config= (mac->DLbwp[0]) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
|
||||||
uint16_t BWPSize = n_RB_DLBWP;
|
uint16_t BWPSize = n_RB_DLBWP;
|
||||||
|
int is_common=0;
|
||||||
if(rnti == SI_RNTI) {
|
if(rnti == SI_RNTI) {
|
||||||
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config;
|
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config;
|
||||||
default_abc = type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
|
default_abc = type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
|
||||||
@@ -711,9 +761,10 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
||||||
}
|
}
|
||||||
if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) {
|
if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) {
|
||||||
if (mac->scc == NULL) {
|
if (mac->scc == NULL) { // use coreset0
|
||||||
dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
dlsch_config_pdu_1_0->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs;
|
||||||
dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
dlsch_config_pdu_1_0->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
|
||||||
|
is_common=1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
@@ -739,15 +790,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
|
|
||||||
/* IDENTIFIER_DCI_FORMATS */
|
/* IDENTIFIER_DCI_FORMATS */
|
||||||
/* FREQ_DOM_RESOURCE_ASSIGNMENT_DL */
|
/* FREQ_DOM_RESOURCE_ASSIGNMENT_DL */
|
||||||
if (nr_ue_process_dci_freq_dom_resource_assignment(NULL,dlsch_config_pdu_1_0,0,BWPSize,dci->frequency_domain_assignment.val) < 0) {
|
if (nr_ue_process_dci_freq_dom_resource_assignment(NULL,dlsch_config_pdu_1_0,0,dlsch_config_pdu_1_0->BWPSize,dci->frequency_domain_assignment.val) < 0) {
|
||||||
LOG_W(MAC, "[%d.%d] Invalid frequency_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
|
LOG_W(MAC, "[%d.%d] Invalid frequency_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* TIME_DOM_RESOURCE_ASSIGNMENT */
|
|
||||||
if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_0,dci->time_domain_assignment.val,default_abc,rnti==SI_RNTI) < 0) {
|
|
||||||
LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
|
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
|
||||||
if (mac->DLbwp[0] &&
|
if (mac->DLbwp[0] &&
|
||||||
@@ -760,6 +807,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
|
else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
|
||||||
pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
||||||
|
|
||||||
|
/* TIME_DOM_RESOURCE_ASSIGNMENT */
|
||||||
|
if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,pdsch_TimeDomainAllocationList,NULL,dlsch_config_pdu_1_0,dci->time_domain_assignment.val,default_abc,rnti==SI_RNTI) < 0) {
|
||||||
|
LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
int mappingtype = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType : ((dlsch_config_pdu_1_0->start_symbol <= 3)? typeA: typeB);
|
int mappingtype = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType : ((dlsch_config_pdu_1_0->start_symbol <= 3)? typeA: typeB);
|
||||||
|
|
||||||
/* dmrs symbol positions*/
|
/* dmrs symbol positions*/
|
||||||
@@ -846,7 +898,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
dlsch_config_pdu_1_0->accumulated_delta_PUCCH,
|
dlsch_config_pdu_1_0->accumulated_delta_PUCCH,
|
||||||
1+dci->pdsch_to_harq_feedback_timing_indicator.val,
|
1+dci->pdsch_to_harq_feedback_timing_indicator.val,
|
||||||
dci->dai[0].val,
|
dci->dai[0].val,
|
||||||
dci_ind->n_CCE,dci_ind->N_CCE,
|
dci_ind->n_CCE,dci_ind->N_CCE,is_common,
|
||||||
frame,slot);
|
frame,slot);
|
||||||
|
|
||||||
LOG_D(MAC,"(nr_ue_procedures.c) rnti = %x dl_config->number_pdus = %d\n",
|
LOG_D(MAC,"(nr_ue_procedures.c) rnti = %x dl_config->number_pdus = %d\n",
|
||||||
@@ -912,22 +964,29 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
* 47 DMRS_SEQ_INI:
|
* 47 DMRS_SEQ_INI:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (dci->bwp_indicator.val != 1) {
|
if (dci->bwp_indicator.val > 1) {
|
||||||
LOG_W(MAC, "[%d.%d] bwp_indicator != 1! Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
|
LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > 1 Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
config_bwp_ue(mac, &dci->bwp_indicator.val, &dci_format);
|
config_bwp_ue(mac, &dci->bwp_indicator.val, &dci_format);
|
||||||
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
||||||
NR_PDSCH_Config_t *pdsch_config=mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup;
|
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
|
NR_PDSCH_Config_t *pdsch_Config=NULL;
|
||||||
|
NR_BWP_DownlinkDedicated_t *bwpd=NULL;
|
||||||
|
NR_BWP_DownlinkCommon_t *bwpc=NULL;
|
||||||
|
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
|
||||||
|
NR_BWP_UplinkCommon_t *ubwpc=NULL;
|
||||||
|
get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
|
||||||
|
|
||||||
|
pdsch_Config = bwpd->pdsch_Config->choice.setup;
|
||||||
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
||||||
dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti;
|
dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti;
|
||||||
|
|
||||||
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_1 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15;
|
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_1 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15;
|
||||||
|
|
||||||
dlsch_config_pdu_1_1->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
dlsch_config_pdu_1_1->BWPSize = NRRIV2BW(bwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
dlsch_config_pdu_1_1->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
dlsch_config_pdu_1_1->BWPStart = NRRIV2PRBOFFSET(bwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
dlsch_config_pdu_1_1->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing;
|
dlsch_config_pdu_1_1->SubcarrierSpacing = bwpc->genericParameters.subcarrierSpacing;
|
||||||
|
|
||||||
/* IDENTIFIER_DCI_FORMATS */
|
/* IDENTIFIER_DCI_FORMATS */
|
||||||
/* CARRIER_IND */
|
/* CARRIER_IND */
|
||||||
@@ -939,38 +998,28 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* TIME_DOM_RESOURCE_ASSIGNMENT */
|
/* TIME_DOM_RESOURCE_ASSIGNMENT */
|
||||||
if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_1,dci->time_domain_assignment.val,0,false) < 0) {
|
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = choose_dl_tda_list(pdsch_Config,bwpc->pdsch_ConfigCommon->choice.setup);
|
||||||
|
if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,pdsch_TimeDomainAllocationList,NULL,dlsch_config_pdu_1_1,dci->time_domain_assignment.val,0,false) < 0) {
|
||||||
LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
|
LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
|
|
||||||
if (mac->DLbwp[0] &&
|
|
||||||
mac->DLbwp[0]->bwp_Dedicated &&
|
|
||||||
mac->DLbwp[0]->bwp_Dedicated->pdsch_Config &&
|
|
||||||
mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
|
|
||||||
pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup;
|
|
||||||
else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
|
|
||||||
pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
|
||||||
else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
|
|
||||||
pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
|
||||||
|
|
||||||
int mappingtype = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType : ((dlsch_config_pdu_1_1->start_symbol <= 3)? typeA: typeB);
|
int mappingtype = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType : ((dlsch_config_pdu_1_1->start_symbol <= 3)? typeA: typeB);
|
||||||
|
|
||||||
/* dmrs symbol positions*/
|
/* dmrs symbol positions*/
|
||||||
dlsch_config_pdu_1_1->dlDmrsSymbPos = fill_dmrs_mask(pdsch_config,
|
dlsch_config_pdu_1_1->dlDmrsSymbPos = fill_dmrs_mask(pdsch_Config,
|
||||||
mac->scc->dmrs_TypeA_Position,
|
mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position,
|
||||||
dlsch_config_pdu_1_1->number_symbols,
|
dlsch_config_pdu_1_1->number_symbols,
|
||||||
dlsch_config_pdu_1_1->start_symbol,
|
dlsch_config_pdu_1_1->start_symbol,
|
||||||
mappingtype);
|
mappingtype);
|
||||||
|
|
||||||
dlsch_config_pdu_1_1->dmrsConfigType = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? NFAPI_NR_DMRS_TYPE1 : NFAPI_NR_DMRS_TYPE2;
|
dlsch_config_pdu_1_1->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? NFAPI_NR_DMRS_TYPE1 : NFAPI_NR_DMRS_TYPE2;
|
||||||
|
|
||||||
/* TODO: fix number of DM-RS CDM groups without data according to subclause 5.1.6.2 of 3GPP TS 38.214,
|
/* TODO: fix number of DM-RS CDM groups without data according to subclause 5.1.6.2 of 3GPP TS 38.214,
|
||||||
using tables 7.3.1.2.2-1, 7.3.1.2.2-2, 7.3.1.2.2-3, 7.3.1.2.2-4 of 3GPP TS 38.212 */
|
using tables 7.3.1.2.2-1, 7.3.1.2.2-2, 7.3.1.2.2-3, 7.3.1.2.2-4 of 3GPP TS 38.212 */
|
||||||
dlsch_config_pdu_1_1->n_dmrs_cdm_groups = 1;
|
dlsch_config_pdu_1_1->n_dmrs_cdm_groups = 1;
|
||||||
/* VRB_TO_PRB_MAPPING */
|
/* VRB_TO_PRB_MAPPING */
|
||||||
if ((pdsch_config->resourceAllocation == 1) && (pdsch_config->vrb_ToPRB_Interleaver != NULL))
|
if ((pdsch_Config->resourceAllocation == 1) && (pdsch_Config->vrb_ToPRB_Interleaver != NULL))
|
||||||
dlsch_config_pdu_1_1->vrb_to_prb_mapping = (dci->vrb_to_prb_mapping.val == 0) ? vrb_to_prb_mapping_non_interleaved:vrb_to_prb_mapping_interleaved;
|
dlsch_config_pdu_1_1->vrb_to_prb_mapping = (dci->vrb_to_prb_mapping.val == 0) ? vrb_to_prb_mapping_non_interleaved:vrb_to_prb_mapping_interleaved;
|
||||||
/* PRB_BUNDLING_SIZE_IND */
|
/* PRB_BUNDLING_SIZE_IND */
|
||||||
dlsch_config_pdu_1_1->prb_bundling_size_ind = dci->prb_bundling_size_indicator.val;
|
dlsch_config_pdu_1_1->prb_bundling_size_ind = dci->prb_bundling_size_indicator.val;
|
||||||
@@ -1011,9 +1060,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
|
|
||||||
// Sanity check for pucch_resource_indicator value received to check for false DCI.
|
// Sanity check for pucch_resource_indicator value received to check for false DCI.
|
||||||
valid = 0;
|
valid = 0;
|
||||||
pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
|
pucch_res_set_cnt = ubwpd->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
|
||||||
for (int id = 0; id < pucch_res_set_cnt; id++) {
|
for (int id = 0; id < pucch_res_set_cnt; id++) {
|
||||||
if (dci->pucch_resource_indicator < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
|
if (dci->pucch_resource_indicator < ubwpd->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
|
||||||
valid = 1;
|
valid = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1027,13 +1076,13 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
uint8_t n_codewords = 1; // FIXME!!!
|
uint8_t n_codewords = 1; // FIXME!!!
|
||||||
long *max_length = NULL;
|
long *max_length = NULL;
|
||||||
long *dmrs_type = NULL;
|
long *dmrs_type = NULL;
|
||||||
if (pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA) {
|
if (pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA) {
|
||||||
max_length = pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength;
|
max_length = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength;
|
||||||
dmrs_type = pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type;
|
dmrs_type = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type;
|
||||||
}
|
}
|
||||||
if (pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeB) {
|
if (pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB) {
|
||||||
max_length = pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->maxLength;
|
max_length = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->maxLength;
|
||||||
dmrs_type = pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type;
|
dmrs_type = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type;
|
||||||
}
|
}
|
||||||
if ((dmrs_type == NULL) && (max_length == NULL)){
|
if ((dmrs_type == NULL) && (max_length == NULL)){
|
||||||
// Table 7.3.1.2.2-1: Antenna port(s) (1000 + DMRS port), dmrs-Type=1, maxLength=1
|
// Table 7.3.1.2.2-1: Antenna port(s) (1000 + DMRS port), dmrs-Type=1, maxLength=1
|
||||||
@@ -1128,9 +1177,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
|
|
||||||
/* PDSCH_TO_HARQ_FEEDBACK_TIME_IND */
|
/* PDSCH_TO_HARQ_FEEDBACK_TIME_IND */
|
||||||
// according to TS 38.213 Table 9.2.3-1
|
// according to TS 38.213 Table 9.2.3-1
|
||||||
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
|
||||||
uint8_t feedback_ti =
|
uint8_t feedback_ti =
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
|
ubwpd->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
|
||||||
|
|
||||||
// set the harq status at MAC for feedback
|
// set the harq status at MAC for feedback
|
||||||
set_harq_status(mac,dci->pucch_resource_indicator,
|
set_harq_status(mac,dci->pucch_resource_indicator,
|
||||||
@@ -1138,7 +1186,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
dlsch_config_pdu_1_1->accumulated_delta_PUCCH,
|
dlsch_config_pdu_1_1->accumulated_delta_PUCCH,
|
||||||
feedback_ti,
|
feedback_ti,
|
||||||
dci->dai[0].val,
|
dci->dai[0].val,
|
||||||
dci_ind->n_CCE,dci_ind->N_CCE,
|
dci_ind->n_CCE,dci_ind->N_CCE,0,
|
||||||
frame,slot);
|
frame,slot);
|
||||||
|
|
||||||
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
|
||||||
@@ -1146,10 +1194,10 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
|
|
||||||
dl_config->number_pdus = dl_config->number_pdus + 1;
|
dl_config->number_pdus = dl_config->number_pdus + 1;
|
||||||
/* TODO same calculation for MCS table as done in UL */
|
/* TODO same calculation for MCS table as done in UL */
|
||||||
dlsch_config_pdu_1_1->mcs_table = (pdsch_config->mcs_Table) ? (*pdsch_config->mcs_Table + 1) : 0;
|
dlsch_config_pdu_1_1->mcs_table = (pdsch_Config->mcs_Table) ? (*pdsch_Config->mcs_Table + 1) : 0;
|
||||||
/*PTRS configuration */
|
/*PTRS configuration */
|
||||||
if(mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS != NULL) {
|
if(pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS != NULL) {
|
||||||
valid_ptrs_setup = set_dl_ptrs_values(mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup,
|
valid_ptrs_setup = set_dl_ptrs_values(pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup,
|
||||||
dlsch_config_pdu_1_1->number_rbs, dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table,
|
dlsch_config_pdu_1_1->number_rbs, dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table,
|
||||||
&dlsch_config_pdu_1_1->PTRSFreqDensity,&dlsch_config_pdu_1_1->PTRSTimeDensity,
|
&dlsch_config_pdu_1_1->PTRSFreqDensity,&dlsch_config_pdu_1_1->PTRSTimeDensity,
|
||||||
&dlsch_config_pdu_1_1->PTRSPortIndex,&dlsch_config_pdu_1_1->nEpreRatioOfPDSCHToPTRS,
|
&dlsch_config_pdu_1_1->PTRSPortIndex,&dlsch_config_pdu_1_1->nEpreRatioOfPDSCHToPTRS,
|
||||||
@@ -1208,6 +1256,7 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
|
|||||||
uint8_t dai,
|
uint8_t dai,
|
||||||
int n_CCE,
|
int n_CCE,
|
||||||
int N_CCE,
|
int N_CCE,
|
||||||
|
int is_common,
|
||||||
frame_t frame,
|
frame_t frame,
|
||||||
int slot) {
|
int slot) {
|
||||||
|
|
||||||
@@ -1217,6 +1266,7 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
|
|||||||
current_harq->ack_received = false;
|
current_harq->ack_received = false;
|
||||||
current_harq->pucch_resource_indicator = pucch_id;
|
current_harq->pucch_resource_indicator = pucch_id;
|
||||||
current_harq->feedback_to_ul = data_toul_fb;
|
current_harq->feedback_to_ul = data_toul_fb;
|
||||||
|
current_harq->is_common = is_common;
|
||||||
current_harq->dai = dai;
|
current_harq->dai = dai;
|
||||||
current_harq->n_CCE = n_CCE;
|
current_harq->n_CCE = n_CCE;
|
||||||
current_harq->N_CCE = N_CCE;
|
current_harq->N_CCE = N_CCE;
|
||||||
@@ -1225,6 +1275,7 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
|
|||||||
current_harq->dl_frame = frame;
|
current_harq->dl_frame = frame;
|
||||||
current_harq->dl_slot = slot;
|
current_harq->dl_slot = slot;
|
||||||
|
|
||||||
|
LOG_D(PHY,"Setting harq_status for harq_id %d, dl %d.%d\n",harq_id,frame,slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1237,6 +1288,8 @@ void update_harq_status(nr_downlink_indication_t *dl_info, int pdu_id) {
|
|||||||
if (current_harq->active) {
|
if (current_harq->active) {
|
||||||
current_harq->ack = dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack;
|
current_harq->ack = dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack;
|
||||||
current_harq->ack_received = true;
|
current_harq->ack_received = true;
|
||||||
|
LOG_D(PHY,"Updating harq_status for harq_id %d,ack/nak %d\n",harq_pid,current_harq->ack);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//shouldn't get here
|
//shouldn't get here
|
||||||
@@ -1278,6 +1331,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
pucch_pdu->rnti = rnti;
|
pucch_pdu->rnti = rnti;
|
||||||
|
|
||||||
|
LOG_I(NR_MAC,"initial_pucch_id %d, pucch_resource %p\n",pucch->initial_pucch_id,pucch->pucch_resource);
|
||||||
// configure pucch from Table 9.2.1-1
|
// configure pucch from Table 9.2.1-1
|
||||||
if (pucch->initial_pucch_id > -1 &&
|
if (pucch->initial_pucch_id > -1 &&
|
||||||
pucch->pucch_resource == NULL) {
|
pucch->pucch_resource == NULL) {
|
||||||
@@ -1383,33 +1437,6 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
|||||||
}
|
}
|
||||||
else AssertFatal(1==0,"no pucch_Config\n");
|
else AssertFatal(1==0,"no pucch_Config\n");
|
||||||
|
|
||||||
NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon;
|
|
||||||
if (mac->scc) pucch_ConfigCommon = mac->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup;
|
|
||||||
else pucch_ConfigCommon = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup;
|
|
||||||
if (pucch_ConfigCommon->hoppingId != NULL)
|
|
||||||
pucch_pdu->hopping_id = *pucch_ConfigCommon->hoppingId;
|
|
||||||
else
|
|
||||||
pucch_pdu->hopping_id = mac->physCellId;
|
|
||||||
|
|
||||||
switch (pucch_ConfigCommon->pucch_GroupHopping){
|
|
||||||
case 0 :
|
|
||||||
// if neither, both disabled
|
|
||||||
pucch_pdu->group_hop_flag = 0;
|
|
||||||
pucch_pdu->sequence_hop_flag = 0;
|
|
||||||
break;
|
|
||||||
case 1 :
|
|
||||||
// if enable, group enabled
|
|
||||||
pucch_pdu->group_hop_flag = 1;
|
|
||||||
pucch_pdu->sequence_hop_flag = 0;
|
|
||||||
break;
|
|
||||||
case 2 :
|
|
||||||
// if disable, sequence disabled
|
|
||||||
pucch_pdu->group_hop_flag = 0;
|
|
||||||
pucch_pdu->sequence_hop_flag = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1==0,"Group hopping flag undefined (0,1,2) \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
pucch_pdu->prb_start = pucchres->startingPRB;
|
pucch_pdu->prb_start = pucchres->startingPRB;
|
||||||
pucch_pdu->freq_hop_flag = pucchres->intraSlotFrequencyHopping!= NULL ? 1 : 0;
|
pucch_pdu->freq_hop_flag = pucchres->intraSlotFrequencyHopping!= NULL ? 1 : 0;
|
||||||
@@ -1511,6 +1538,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
|||||||
default :
|
default :
|
||||||
AssertFatal(1==0,"Undefined PUCCH format \n");
|
AssertFatal(1==0,"Undefined PUCCH format \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
pucch_pdu->pucch_tx_power = get_pucch_tx_power_ue(mac,
|
pucch_pdu->pucch_tx_power = get_pucch_tx_power_ue(mac,
|
||||||
pucch_Config,
|
pucch_Config,
|
||||||
pucch,
|
pucch,
|
||||||
@@ -1518,11 +1546,47 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
|||||||
pucch_pdu->prb_size,
|
pucch_pdu->prb_size,
|
||||||
pucch_pdu->freq_hop_flag,
|
pucch_pdu->freq_hop_flag,
|
||||||
pucch_pdu->add_dmrs_flag,
|
pucch_pdu->add_dmrs_flag,
|
||||||
pucch_pdu->nr_of_symbols,
|
pucch_pdu->nr_of_symbols,
|
||||||
subframe_number,
|
subframe_number,
|
||||||
O_ACK, O_SR,
|
O_ACK, O_SR,
|
||||||
O_CSI, O_CRC);
|
O_CSI, O_CRC);
|
||||||
}
|
}
|
||||||
|
else AssertFatal(1==0,"problem with pucch configuration\n");
|
||||||
|
|
||||||
|
NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon;
|
||||||
|
if (bwp_id>0 &&
|
||||||
|
mac->ULbwp[bwp_id-1] &&
|
||||||
|
mac->ULbwp[bwp_id-1]->bwp_Common &&
|
||||||
|
mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon)
|
||||||
|
pucch_ConfigCommon = mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup;
|
||||||
|
else if (mac->scc) pucch_ConfigCommon = mac->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup;
|
||||||
|
else pucch_ConfigCommon = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup;
|
||||||
|
if (pucch_ConfigCommon->hoppingId != NULL)
|
||||||
|
pucch_pdu->hopping_id = *pucch_ConfigCommon->hoppingId;
|
||||||
|
else
|
||||||
|
pucch_pdu->hopping_id = mac->physCellId;
|
||||||
|
|
||||||
|
switch (pucch_ConfigCommon->pucch_GroupHopping){
|
||||||
|
case 0 :
|
||||||
|
// if neither, both disabled
|
||||||
|
pucch_pdu->group_hop_flag = 0;
|
||||||
|
pucch_pdu->sequence_hop_flag = 0;
|
||||||
|
break;
|
||||||
|
case 1 :
|
||||||
|
// if enable, group enabled
|
||||||
|
pucch_pdu->group_hop_flag = 1;
|
||||||
|
pucch_pdu->sequence_hop_flag = 0;
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
|
// if disable, sequence disabled
|
||||||
|
pucch_pdu->group_hop_flag = 0;
|
||||||
|
pucch_pdu->sequence_hop_flag = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Group hopping flag undefined (0,1,2) \n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1756,7 +1820,8 @@ void select_pucch_resource(NR_UE_MAC_INST_t *mac,
|
|||||||
NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
|
NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
|
||||||
int n_list;
|
int n_list;
|
||||||
|
|
||||||
if ((bwp_id == 0 &&
|
if (pucch->is_common == 1 ||
|
||||||
|
(bwp_id == 0 &&
|
||||||
mac->cg == NULL) ||
|
mac->cg == NULL) ||
|
||||||
(bwp_id == 0 &&
|
(bwp_id == 0 &&
|
||||||
mac->cg &&
|
mac->cg &&
|
||||||
@@ -1876,33 +1941,27 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
|
|||||||
int V_DAI_m_DL = 0;
|
int V_DAI_m_DL = 0;
|
||||||
NR_UE_HARQ_STATUS_t *current_harq;
|
NR_UE_HARQ_STATUS_t *current_harq;
|
||||||
int sched_frame,sched_slot;
|
int sched_frame,sched_slot;
|
||||||
NR_BWP_UplinkCommon_t *initialUplinkBWP;
|
|
||||||
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
|
|
||||||
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
|
||||||
int slots_per_frame,scs;
|
int slots_per_frame,scs;
|
||||||
|
|
||||||
if (mac->DLbwp[0] &&
|
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
||||||
mac->DLbwp[0]->bwp_Dedicated &&
|
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
mac->DLbwp[0]->bwp_Dedicated->pdsch_Config &&
|
NR_PDSCH_Config_t *pdsch_Config=NULL;
|
||||||
mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup &&
|
NR_BWP_DownlinkDedicated_t *bwpd=NULL;
|
||||||
mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0] == 2) {
|
NR_BWP_DownlinkCommon_t *bwpc=NULL;
|
||||||
|
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
|
||||||
|
NR_BWP_UplinkCommon_t *ubwpc=NULL;
|
||||||
|
get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
|
||||||
|
|
||||||
|
if (bwpd &&
|
||||||
|
bwpd->pdsch_Config &&
|
||||||
|
bwpd->pdsch_Config->choice.setup &&
|
||||||
|
bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI &&
|
||||||
|
bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0] == 2) {
|
||||||
two_transport_blocks = TRUE;
|
two_transport_blocks = TRUE;
|
||||||
number_of_code_word = 2;
|
number_of_code_word = 2;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
number_of_code_word = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
|
scs = ubwpc->genericParameters.subcarrierSpacing;
|
||||||
if (mac->cg && ubwp &&
|
|
||||||
mac->cg->spCellConfig &&
|
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated &&
|
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
|
||||||
scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
|
|
||||||
|
|
||||||
slots_per_frame = nr_slots_per_frame[scs];
|
slots_per_frame = nr_slots_per_frame[scs];
|
||||||
|
|
||||||
@@ -1921,7 +1980,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
|
|||||||
sched_slot %= slots_per_frame;
|
sched_slot %= slots_per_frame;
|
||||||
sched_frame++;
|
sched_frame++;
|
||||||
}
|
}
|
||||||
|
LOG_D(PHY,"HARQ pid %d is active for %d.%d (dl_slot %d, feedback_to_ul %d, is_common %d\n",dl_harq_pid, sched_frame,sched_slot,current_harq->dl_slot,current_harq->feedback_to_ul,current_harq->is_common);
|
||||||
/* check if current tx slot should transmit downlink acknowlegment */
|
/* check if current tx slot should transmit downlink acknowlegment */
|
||||||
if (sched_frame == frame && sched_slot == slot) {
|
if (sched_frame == frame && sched_slot == slot) {
|
||||||
|
|
||||||
@@ -1954,6 +2013,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
|
|||||||
pucch->n_CCE = current_harq->n_CCE;
|
pucch->n_CCE = current_harq->n_CCE;
|
||||||
pucch->N_CCE = current_harq->N_CCE;
|
pucch->N_CCE = current_harq->N_CCE;
|
||||||
pucch->delta_pucch = current_harq->delta_pucch;
|
pucch->delta_pucch = current_harq->delta_pucch;
|
||||||
|
pucch->is_common = current_harq->is_common;
|
||||||
current_harq->active = false;
|
current_harq->active = false;
|
||||||
current_harq->ack_received = false;
|
current_harq->ack_received = false;
|
||||||
}
|
}
|
||||||
@@ -1981,7 +2041,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
|
|||||||
if (mac->cg != NULL &&
|
if (mac->cg != NULL &&
|
||||||
mac->cg->physicalCellGroupConfig != NULL &&
|
mac->cg->physicalCellGroupConfig != NULL &&
|
||||||
mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL) {
|
mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL) {
|
||||||
int N_TB_max_DL = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0];
|
int N_TB_max_DL = bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0];
|
||||||
pucch->n_HARQ_ACK = (((V_DAI_m_DL - U_DAI_c)%4) * N_TB_max_DL) + N_m_c_rx + N_SPS_c;
|
pucch->n_HARQ_ACK = (((V_DAI_m_DL - U_DAI_c)%4) * N_TB_max_DL) + N_m_c_rx + N_SPS_c;
|
||||||
NR_TST_PHY_PRINTF("PUCCH power n(%d) = ( V(%d) - U(%d) )mod4 * N_TB(%d) + N(%d) \n", pucch->n_HARQ_ACK, V_DAI_m_DL, U_DAI_c, N_TB_max_DL, N_m_c_rx);
|
NR_TST_PHY_PRINTF("PUCCH power n(%d) = ( V(%d) - U(%d) )mod4 * N_TB(%d) + N(%d) \n", pucch->n_HARQ_ACK, V_DAI_m_DL, U_DAI_c, N_TB_max_DL, N_m_c_rx);
|
||||||
}
|
}
|
||||||
@@ -2106,7 +2166,9 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
|
|||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
|
||||||
pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
|
pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
|
||||||
}
|
}
|
||||||
if(!pucch_Config || pucch_Config->schedulingRequestResourceToAddModList->list.count==0)
|
if(!pucch_Config ||
|
||||||
|
!pucch_Config->schedulingRequestResourceToAddModList ||
|
||||||
|
pucch_Config->schedulingRequestResourceToAddModList->list.count==0)
|
||||||
return false; // SR not configured
|
return false; // SR not configured
|
||||||
|
|
||||||
for (int SR_resource_id =0; SR_resource_id < pucch_Config->schedulingRequestResourceToAddModList->list.count;SR_resource_id++) {
|
for (int SR_resource_id =0; SR_resource_id < pucch_Config->schedulingRequestResourceToAddModList->list.count;SR_resource_id++) {
|
||||||
@@ -2456,7 +2518,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
|||||||
switch(rnti_type) {
|
switch(rnti_type) {
|
||||||
case NR_RNTI_RA:
|
case NR_RNTI_RA:
|
||||||
if(mac->scc_SIB) {
|
if(mac->scc_SIB) {
|
||||||
N_RB = NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
N_RB = mac->type0_PDCCH_CSS_config.num_rbs;
|
||||||
} else {
|
} else {
|
||||||
N_RB = get_n_rb(mac, rnti_type);
|
N_RB = get_n_rb(mac, rnti_type);
|
||||||
}
|
}
|
||||||
@@ -2693,7 +2755,8 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
// check BWP id
|
// check BWP id
|
||||||
if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
else N_RB=NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
else N_RB=mac->type0_PDCCH_CSS_config.num_rbs;
|
||||||
|
;
|
||||||
|
|
||||||
// indicating a DL DCI format 1bit
|
// indicating a DL DCI format 1bit
|
||||||
pos++;
|
pos++;
|
||||||
|
|||||||
@@ -301,10 +301,20 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
|
|||||||
void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
|
void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
|
||||||
|
|
||||||
/* ANTENNA_PORTS */
|
/* ANTENNA_PORTS */
|
||||||
uint8_t rank = 0; // We need to initialize rank FIXME!!!
|
uint8_t rank = 1; // We need to initialize rank FIXME!!!
|
||||||
|
|
||||||
NR_ServingCellConfigCommon_t *scc = mac->scc;
|
NR_ServingCellConfigCommon_t *scc = mac->scc;
|
||||||
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup;
|
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
|
||||||
|
|
||||||
|
if (mac->cg &&
|
||||||
|
mac->cg->spCellConfig &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
||||||
|
ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
||||||
|
|
||||||
|
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
|
||||||
|
AssertFatal(pusch_Config!=NULL,"pusch_Config shouldn't be null\n");
|
||||||
|
|
||||||
long transformPrecoder;
|
long transformPrecoder;
|
||||||
if (pusch_Config->transformPrecoder)
|
if (pusch_Config->transformPrecoder)
|
||||||
@@ -317,6 +327,8 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
|
|||||||
}
|
}
|
||||||
long *max_length = NULL;
|
long *max_length = NULL;
|
||||||
long *dmrs_type = NULL;
|
long *dmrs_type = NULL;
|
||||||
|
LOG_D(NR_MAC,"transformPrecoder %s\n",transformPrecoder==NR_PUSCH_Config__transformPrecoder_disabled?"disabled":"enabled");
|
||||||
|
|
||||||
if (pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA) {
|
if (pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA) {
|
||||||
max_length = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup->maxLength;
|
max_length = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup->maxLength;
|
||||||
dmrs_type = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup->dmrs_Type;
|
dmrs_type = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup->dmrs_Type;
|
||||||
@@ -326,7 +338,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
|
|||||||
dmrs_type = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->dmrs_Type;
|
dmrs_type = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->dmrs_Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_D(NR_MAC,"MappingType%s max_length %s, dmrs_type %s, antenna_ports %d\n",pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA?"A":"B",max_length?"len2":"len1",dmrs_type?"type2":"type1",dci->antenna_ports.val);
|
||||||
if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) &&
|
if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) &&
|
||||||
(dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6
|
(dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6
|
||||||
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
|
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
|
||||||
@@ -481,6 +493,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
|
|||||||
//pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME
|
//pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, dmrs_ports %d\n",pusch_config_pdu->num_dmrs_cdm_grps_no_data,pusch_config_pdu->dmrs_ports);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configuration of Msg3 PDU according to clauses:
|
// Configuration of Msg3 PDU according to clauses:
|
||||||
@@ -626,22 +639,23 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
pusch_config_pdu->pusch_data.num_cb = 0;
|
pusch_config_pdu->pusch_data.num_cb = 0;
|
||||||
|
|
||||||
} else if (dci) {
|
} else if (dci) {
|
||||||
|
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
||||||
|
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
|
NR_BWP_DownlinkDedicated_t *bwpd=NULL;
|
||||||
|
NR_BWP_DownlinkCommon_t *bwpc=NULL;
|
||||||
|
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
|
||||||
|
NR_BWP_UplinkCommon_t *ubwpc=NULL;
|
||||||
|
get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
|
||||||
|
|
||||||
int target_ss;
|
int target_ss;
|
||||||
bool valid_ptrs_setup = 0;
|
bool valid_ptrs_setup = 0;
|
||||||
uint16_t n_RB_ULBWP;
|
uint16_t n_RB_ULBWP;
|
||||||
if (mac->ULbwp[0] && mac->ULbwp[0]->bwp_Common) {
|
n_RB_ULBWP = NRRIV2BW(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
n_RB_ULBWP = NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
pusch_config_pdu->bwp_start = NRRIV2PRBOFFSET(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
pusch_config_pdu->bwp_start = NRRIV2PRBOFFSET(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pusch_config_pdu->bwp_start = NRRIV2PRBOFFSET(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
|
||||||
n_RB_ULBWP = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
pusch_config_pdu->bwp_size = n_RB_ULBWP;
|
pusch_config_pdu->bwp_size = n_RB_ULBWP;
|
||||||
|
|
||||||
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
|
AssertFatal(ubwpd->pusch_Config != NULL,"pusch_Config shouldn't be null\n");
|
||||||
|
NR_PUSCH_Config_t *pusch_Config = ubwpd->pusch_Config->choice.setup;
|
||||||
|
|
||||||
// Basic sanity check for MCS value to check for a false or erroneous DCI
|
// Basic sanity check for MCS value to check for a false or erroneous DCI
|
||||||
if (dci->mcs > 28) {
|
if (dci->mcs > 28) {
|
||||||
@@ -661,12 +675,9 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
} else if (*dci_format == NR_UL_DCI_FORMAT_0_1) {
|
} else if (*dci_format == NR_UL_DCI_FORMAT_0_1) {
|
||||||
|
|
||||||
/* BANDWIDTH_PART_IND */
|
|
||||||
if (dci->bwp_indicator.val != 1) {
|
|
||||||
LOG_W(NR_MAC, "bwp_indicator != 1! Possibly due to false DCI. Ignoring DCI!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
config_bwp_ue(mac, &dci->bwp_indicator.val, dci_format);
|
config_bwp_ue(mac, &dci->bwp_indicator.val, dci_format);
|
||||||
|
get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
|
||||||
|
|
||||||
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
||||||
ul_layers_config(mac, pusch_config_pdu, dci);
|
ul_layers_config(mac, pusch_config_pdu, dci);
|
||||||
ul_ports_config(mac, pusch_config_pdu, dci);
|
ul_ports_config(mac, pusch_config_pdu, dci);
|
||||||
@@ -677,21 +688,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon = ubwpc->pusch_ConfigCommon->choice.setup;
|
||||||
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
|
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = choose_ul_tda_list(pusch_Config,pusch_ConfigCommon);
|
||||||
if (pusch_Config && pusch_Config->pusch_TimeDomainAllocationList) {
|
|
||||||
pusch_TimeDomainAllocationList = pusch_Config->pusch_TimeDomainAllocationList->choice.setup;
|
|
||||||
}
|
|
||||||
else if (mac->ULbwp[0] &&
|
|
||||||
mac->ULbwp[0]->bwp_Common&&
|
|
||||||
mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon&&
|
|
||||||
mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
|
|
||||||
mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
|
|
||||||
pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
|
||||||
}
|
|
||||||
else if (mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList)
|
|
||||||
pusch_TimeDomainAllocationList=mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
|
||||||
else AssertFatal(1==0,"need to fall back to default PUSCH time-domain allocations\n");
|
|
||||||
|
|
||||||
int mappingtype = pusch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType;
|
int mappingtype = pusch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType;
|
||||||
|
|
||||||
@@ -735,7 +733,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* TIME_DOM_RESOURCE_ASSIGNMENT */
|
/* TIME_DOM_RESOURCE_ASSIGNMENT */
|
||||||
if (nr_ue_process_dci_time_dom_resource_assignment(mac, pusch_config_pdu, NULL, dci->time_domain_assignment.val,0,false) < 0) {
|
if (nr_ue_process_dci_time_dom_resource_assignment(mac, pusch_TimeDomainAllocationList, NULL, pusch_config_pdu, NULL, dci->time_domain_assignment.val,0,false) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1842,6 +1840,7 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in
|
|||||||
pucch,
|
pucch,
|
||||||
pucch_pdu,
|
pucch_pdu,
|
||||||
O_SR, O_ACK, O_CSI);
|
O_SR, O_ACK, O_CSI);
|
||||||
|
LOG_D(NR_MAC,"Configuring pucch, is_common = %d\n",pucch->is_common);
|
||||||
fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PUCCH);
|
fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PUCCH);
|
||||||
nr_scheduled_response_t scheduled_response;
|
nr_scheduled_response_t scheduled_response;
|
||||||
fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id);
|
fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id);
|
||||||
|
|||||||
@@ -1245,7 +1245,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
|||||||
int r_pucch = ((CCEIndex<<1)/N_cce)+(delta_PRI<<1);
|
int r_pucch = ((CCEIndex<<1)/N_cce)+(delta_PRI<<1);
|
||||||
|
|
||||||
LOG_I(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, N_cce %d, nb_of_candidates %d,delta_PRI %d)\n",r_pucch,CCEIndex,N_cce,nr_of_candidates,delta_PRI);
|
LOG_I(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, N_cce %d, nb_of_candidates %d,delta_PRI %d)\n",r_pucch,CCEIndex,N_cce,nr_of_candidates,delta_PRI);
|
||||||
int alloc = nr_acknack_scheduling(module_idP, UE_id, frameP, slotP, r_pucch);
|
int alloc = nr_acknack_scheduling(module_idP, UE_id, frameP, slotP, r_pucch, 1);
|
||||||
AssertFatal(alloc>=0,"Couldn't find a pucch allocation for ack nack (msg4)\n");
|
AssertFatal(alloc>=0,"Couldn't find a pucch allocation for ack nack (msg4)\n");
|
||||||
NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[alloc];
|
NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[alloc];
|
||||||
harq->feedback_slot = pucch->ul_slot;
|
harq->feedback_slot = pucch->ul_slot;
|
||||||
|
|||||||
@@ -532,7 +532,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
|
|
||||||
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
|
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
|
||||||
* allocation after CCE alloc fail would be more complex) */
|
* allocation after CCE alloc fail would be more complex) */
|
||||||
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1);
|
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1,0);
|
||||||
if (alloc<0) {
|
if (alloc<0) {
|
||||||
LOG_D(MAC,
|
LOG_D(MAC,
|
||||||
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
|
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
|
||||||
@@ -673,7 +673,7 @@ void pf_dl(module_id_t module_id,
|
|||||||
|
|
||||||
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
|
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
|
||||||
* allocation after CCE alloc fail would be more complex) */
|
* allocation after CCE alloc fail would be more complex) */
|
||||||
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1);
|
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1,0);
|
||||||
if (alloc<0) {
|
if (alloc<0) {
|
||||||
LOG_D(NR_MAC,
|
LOG_D(NR_MAC,
|
||||||
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
|
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
|
|||||||
__func__,
|
__func__,
|
||||||
UE_id);
|
UE_id);
|
||||||
|
|
||||||
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1);
|
const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1,0);
|
||||||
if (alloc < 0) {
|
if (alloc < 0) {
|
||||||
LOG_D(MAC,
|
LOG_D(MAC,
|
||||||
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
|
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
|
||||||
|
|||||||
@@ -905,6 +905,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
pucch_pdu->nr_of_symbols = pucchres->format.choice.format0->nrofSymbols;
|
pucch_pdu->nr_of_symbols = pucchres->format.choice.format0->nrofSymbols;
|
||||||
pucch_pdu->start_symbol_index = pucchres->format.choice.format0->startingSymbolIndex;
|
pucch_pdu->start_symbol_index = pucchres->format.choice.format0->startingSymbolIndex;
|
||||||
pucch_pdu->sr_flag = O_sr;
|
pucch_pdu->sr_flag = O_sr;
|
||||||
|
pucch_pdu->prb_size = 1;
|
||||||
break;
|
break;
|
||||||
case NR_PUCCH_Resource__format_PR_format1 :
|
case NR_PUCCH_Resource__format_PR_format1 :
|
||||||
pucch_pdu->format_type = 1;
|
pucch_pdu->format_type = 1;
|
||||||
@@ -913,6 +914,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
pucch_pdu->start_symbol_index = pucchres->format.choice.format1->startingSymbolIndex;
|
pucch_pdu->start_symbol_index = pucchres->format.choice.format1->startingSymbolIndex;
|
||||||
pucch_pdu->time_domain_occ_idx = pucchres->format.choice.format1->timeDomainOCC;
|
pucch_pdu->time_domain_occ_idx = pucchres->format.choice.format1->timeDomainOCC;
|
||||||
pucch_pdu->sr_flag = O_sr;
|
pucch_pdu->sr_flag = O_sr;
|
||||||
|
pucch_pdu->prb_size = 1;
|
||||||
break;
|
break;
|
||||||
case NR_PUCCH_Resource__format_PR_format2 :
|
case NR_PUCCH_Resource__format_PR_format2 :
|
||||||
pucch_pdu->format_type = 2;
|
pucch_pdu->format_type = 2;
|
||||||
@@ -999,6 +1001,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
pucch_pdu->start_symbol_index = default_pucch_firstsymb[rsetindex];
|
pucch_pdu->start_symbol_index = default_pucch_firstsymb[rsetindex];
|
||||||
if (pucch_pdu->format_type == 1) pucch_pdu->time_domain_occ_idx = 0; // check this!!
|
if (pucch_pdu->format_type == 1) pucch_pdu->time_domain_occ_idx = 0; // check this!!
|
||||||
pucch_pdu->sr_flag = O_sr;
|
pucch_pdu->sr_flag = O_sr;
|
||||||
|
pucch_pdu->prb_size=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1161,7 +1161,8 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
int UE_id,
|
int UE_id,
|
||||||
frame_t frame,
|
frame_t frame,
|
||||||
sub_frame_t slot,
|
sub_frame_t slot,
|
||||||
int r_pucch)
|
int r_pucch,
|
||||||
|
int is_common)
|
||||||
{
|
{
|
||||||
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
|
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
|
||||||
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
||||||
@@ -1238,7 +1239,7 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
||||||
ubwpd = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
ubwpd = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
||||||
|
|
||||||
NR_SearchSpace__searchSpaceType_PR ss_type = (sched_ctrl->active_bwp || ubwpd) ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common;
|
NR_SearchSpace__searchSpaceType_PR ss_type = (is_common==0 && (sched_ctrl->active_bwp || ubwpd)) ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common;
|
||||||
uint8_t pdsch_to_harq_feedback[8];
|
uint8_t pdsch_to_harq_feedback[8];
|
||||||
int bwp_Id = 0;
|
int bwp_Id = 0;
|
||||||
if (sched_ctrl->active_ubwp) bwp_Id = sched_ctrl->active_ubwp->bwp_Id;
|
if (sched_ctrl->active_ubwp) bwp_Id = sched_ctrl->active_ubwp->bwp_Id;
|
||||||
@@ -1268,7 +1269,7 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
memset(pucch, 0, sizeof(*pucch));
|
memset(pucch, 0, sizeof(*pucch));
|
||||||
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
|
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
|
||||||
pucch->ul_slot = (s + 1) % n_slots_frame;
|
pucch->ul_slot = (s + 1) % n_slots_frame;
|
||||||
return nr_acknack_scheduling(mod_id, UE_id, frame, slot, pucch->r_pucch);
|
return nr_acknack_scheduling(mod_id, UE_id, frame, slot, pucch->r_pucch,is_common);
|
||||||
}
|
}
|
||||||
|
|
||||||
pucch->timing_indicator = i;
|
pucch->timing_indicator = i;
|
||||||
@@ -1337,7 +1338,7 @@ int nr_acknack_scheduling(int mod_id,
|
|||||||
memset(pucch, 0, sizeof(*pucch));
|
memset(pucch, 0, sizeof(*pucch));
|
||||||
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
|
pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
|
||||||
pucch->ul_slot = (s + 1) % n_slots_frame;
|
pucch->ul_slot = (s + 1) % n_slots_frame;
|
||||||
return nr_acknack_scheduling(mod_id, UE_id, frame, slot, -1);
|
return nr_acknack_scheduling(mod_id, UE_id, frame, slot, -1,is_common);
|
||||||
}
|
}
|
||||||
// multiplexing harq and csi in a pucch
|
// multiplexing harq and csi in a pucch
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -195,7 +195,8 @@ int nr_acknack_scheduling(int Mod_idP,
|
|||||||
int UE_id,
|
int UE_id,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP,
|
sub_frame_t slotP,
|
||||||
int r_pucch);
|
int r_pucch,
|
||||||
|
int do_common);
|
||||||
|
|
||||||
void get_pdsch_to_harq_feedback(int Mod_idP,
|
void get_pdsch_to_harq_feedback(int Mod_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
|
|||||||
Reference in New Issue
Block a user