Commit e7a8eb95 authored by Robert Schmidt's avatar Robert Schmidt

NR MAC: make many functions static

To know which functions are used from outside and which are
module-local, make many functions static. This will allow us to protect
only those functions with a mutex for which it is necessary.
parent 2a0142fb
...@@ -140,8 +140,8 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche ...@@ -140,8 +140,8 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche
} }
void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) { static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc)
{
nfapi_nr_config_request_scf_t *cfg = &nrmac->config[0]; nfapi_nr_config_request_scf_t *cfg = &nrmac->config[0];
nrmac->common_channels[0].ServingCellConfigCommon = scc; nrmac->common_channels[0].ServingCellConfigCommon = scc;
......
...@@ -51,11 +51,15 @@ ...@@ -51,11 +51,15 @@
extern RAN_CONTEXT_t RC; extern RAN_CONTEXT_t RC;
void schedule_ssb(frame_t frame, sub_frame_t slot, static void schedule_ssb(frame_t frame,
sub_frame_t slot,
NR_ServingCellConfigCommon_t *scc, NR_ServingCellConfigCommon_t *scc,
nfapi_nr_dl_tti_request_body_t *dl_req, nfapi_nr_dl_tti_request_body_t *dl_req,
int i_ssb, uint8_t scoffset, uint16_t offset_pointa, uint32_t payload) { int i_ssb,
uint8_t scoffset,
uint16_t offset_pointa,
uint32_t payload)
{
uint8_t beam_index = 0; uint8_t beam_index = 0;
nfapi_nr_dl_tti_request_pdu_t *dl_config_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; nfapi_nr_dl_tti_request_pdu_t *dl_config_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
memset((void *) dl_config_pdu, 0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); memset((void *) dl_config_pdu, 0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
...@@ -86,7 +90,19 @@ void schedule_ssb(frame_t frame, sub_frame_t slot, ...@@ -86,7 +90,19 @@ void schedule_ssb(frame_t frame, sub_frame_t slot,
dl_req->nPDUs++; dl_req->nPDUs++;
LOG_D(MAC,"Scheduling ssb %d at frame %d and slot %d\n",i_ssb,frame,slot); LOG_D(MAC,"Scheduling ssb %d at frame %d and slot %d\n",i_ssb,frame,slot);
}
static void fill_ssb_vrb_map(NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id)
{
AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing !=
NR_SubcarrierSpacing_kHz240,
"240kHZ subcarrier won't work with current VRB map because a single SSB might be across 2 slots\n");
uint16_t *vrb_map = cc[CC_id].vrb_map;
const int extra_prb = ssb_subcarrier_offset > 0;
for (int rb = 0; rb < 20+extra_prb; rb++)
vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4);
} }
void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, nfapi_nr_dl_tti_request_t *DL_req) void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, nfapi_nr_dl_tti_request_t *DL_req)
...@@ -254,33 +270,15 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, ...@@ -254,33 +270,15 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
} }
} }
void schedule_nr_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { static uint32_t schedule_control_sib1(module_id_t module_id,
//----------------------------------------
}
void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id) {
AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing !=
NR_SubcarrierSpacing_kHz240,
"240kHZ subcarrier won't work with current VRB map because a single SSB might be across 2 slots\n");
uint16_t *vrb_map = cc[CC_id].vrb_map;
const int extra_prb = ssb_subcarrier_offset > 0;
for (int rb = 0; rb < 20+extra_prb; rb++)
vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4);
}
uint32_t schedule_control_sib1(module_id_t module_id,
int CC_id, int CC_id,
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
int time_domain_allocation, int time_domain_allocation,
NR_pdsch_dmrs_t *dmrs_parms, NR_pdsch_dmrs_t *dmrs_parms,
NR_tda_info_t *tda_info, NR_tda_info_t *tda_info,
uint8_t candidate_idx, uint8_t candidate_idx,
uint16_t num_total_bytes) { uint16_t num_total_bytes)
{
gNB_MAC_INST *gNB_mac = RC.nrmac[module_id]; gNB_MAC_INST *gNB_mac = RC.nrmac[module_id];
NR_COMMON_channels_t *cc = &gNB_mac->common_channels[CC_id]; NR_COMMON_channels_t *cc = &gNB_mac->common_channels[CC_id];
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
...@@ -377,14 +375,14 @@ uint32_t schedule_control_sib1(module_id_t module_id, ...@@ -377,14 +375,14 @@ uint32_t schedule_control_sib1(module_id_t module_id,
return TBS; return TBS;
} }
void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, static void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
nfapi_nr_dl_tti_request_body_t *dl_req, nfapi_nr_dl_tti_request_body_t *dl_req,
int pdu_index, int pdu_index,
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
uint32_t TBS, uint32_t TBS,
int StartSymbolIndex, int StartSymbolIndex,
int NrOfSymbols) { int NrOfSymbols)
{
gNB_MAC_INST *gNB_mac = RC.nrmac[Mod_idP]; gNB_MAC_INST *gNB_mac = RC.nrmac[Mod_idP];
NR_COMMON_channels_t *cc = gNB_mac->common_channels; NR_COMMON_channels_t *cc = gNB_mac->common_channels;
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
......
...@@ -311,10 +311,8 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, ...@@ -311,10 +311,8 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP,
return offset; return offset;
} }
void nr_store_dlsch_buffer(module_id_t module_id, static void nr_store_dlsch_buffer(module_id_t module_id, frame_t frame, sub_frame_t slot)
frame_t frame, {
sub_frame_t slot) {
UE_iterator(RC.nrmac[module_id]->UE_info.list, UE) { UE_iterator(RC.nrmac[module_id]->UE_info.list, UE) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
sched_ctrl->num_total_bytes = 0; sched_ctrl->num_total_bytes = 0;
...@@ -375,7 +373,7 @@ void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid) { ...@@ -375,7 +373,7 @@ void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid) {
} }
bool allocate_dl_retransmission(module_id_t module_id, static bool allocate_dl_retransmission(module_id_t module_id,
frame_t frame, frame_t frame,
sub_frame_t slot, sub_frame_t slot,
uint16_t *rballoc_mask, uint16_t *rballoc_mask,
...@@ -549,7 +547,7 @@ static int comparator(const void *p, const void *q) { ...@@ -549,7 +547,7 @@ static int comparator(const void *p, const void *q) {
return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef; return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef;
} }
void pf_dl(module_id_t module_id, static void pf_dl(module_id_t module_id,
frame_t frame, frame_t frame,
sub_frame_t slot, sub_frame_t slot,
NR_UE_info_t **UE_list, NR_UE_info_t **UE_list,
...@@ -557,7 +555,6 @@ void pf_dl(module_id_t module_id, ...@@ -557,7 +555,6 @@ void pf_dl(module_id_t module_id,
int n_rb_sched, int n_rb_sched,
uint16_t *rballoc_mask) uint16_t *rballoc_mask)
{ {
gNB_MAC_INST *mac = RC.nrmac[module_id]; gNB_MAC_INST *mac = RC.nrmac[module_id];
NR_ServingCellConfigCommon_t *scc=mac->common_channels[0].ServingCellConfigCommon; NR_ServingCellConfigCommon_t *scc=mac->common_channels[0].ServingCellConfigCommon;
// UEs that could be scheduled // UEs that could be scheduled
...@@ -784,7 +781,7 @@ void pf_dl(module_id_t module_id, ...@@ -784,7 +781,7 @@ void pf_dl(module_id_t module_id,
} }
} }
void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) static void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot)
{ {
NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info; NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
......
...@@ -509,7 +509,7 @@ void fill_pdcch_vrb_map(gNB_MAC_INST *mac, ...@@ -509,7 +509,7 @@ void fill_pdcch_vrb_map(gNB_MAC_INST *mac,
} }
} }
bool multiple_2_3_5(int rb) static bool multiple_2_3_5(int rb)
{ {
while (rb % 2 == 0) while (rb % 2 == 0)
rb /= 2; rb /= 2;
......
...@@ -42,7 +42,8 @@ const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 4 ...@@ -42,7 +42,8 @@ const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 4
160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256, 160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256,
256, 264, 272, 272, 272 }; 256, 264, 272, 272, 272 };
uint32_t max4(uint32_t a, uint32_t b,uint32_t c,uint32_t d) { static uint32_t max4(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
{
int x = max(a, b); int x = max(a, b);
x = max(x, c); x = max(x, c);
x = max(x, d); x = max(x, d);
...@@ -137,7 +138,14 @@ void nr_srs_ri_computation(const nfapi_nr_srs_normalized_channel_iq_matrix_t *nr ...@@ -137,7 +138,14 @@ void nr_srs_ri_computation(const nfapi_nr_srs_normalized_channel_iq_matrix_t *nr
} }
void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int slot, int module_id, int CC_id, NR_UE_info_t *UE, NR_SRS_ResourceSet_t *srs_resource_set, NR_SRS_Resource_t *srs_resource, int buffer_index) static void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu,
int slot,
int module_id,
int CC_id,
NR_UE_info_t *UE,
NR_SRS_ResourceSet_t *srs_resource_set,
NR_SRS_Resource_t *srs_resource,
int buffer_index)
{ {
NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP; NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP;
...@@ -196,7 +204,13 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int slot, int module_id, int ...@@ -196,7 +204,13 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int slot, int module_id, int
vrb_map_UL[i + srs_pdu->bwp_start] |= mask; vrb_map_UL[i + srs_pdu->bwp_start] |= mask;
} }
void nr_fill_nfapi_srs(int module_id, int CC_id, NR_UE_info_t* UE, int frame, int slot, NR_SRS_ResourceSet_t *srs_resource_set, NR_SRS_Resource_t *srs_resource) static void nr_fill_nfapi_srs(int module_id,
int CC_id,
NR_UE_info_t *UE,
int frame,
int slot,
NR_SRS_ResourceSet_t *srs_resource_set,
NR_SRS_Resource_t *srs_resource)
{ {
int index = ul_buffer_index(frame, slot, UE->current_UL_BWP.scs, RC.nrmac[module_id]->UL_tti_req_ahead_size); int index = ul_buffer_index(frame, slot, UE->current_UL_BWP.scs, RC.nrmac[module_id]->UL_tti_req_ahead_size);
......
...@@ -144,7 +144,7 @@ static const int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = { ...@@ -144,7 +144,7 @@ static const int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = {
-30 // 10 - 15 -30 // 10 - 15
}; };
int get_pucch_index(int frame, int slot, int n_slots_frame, const NR_TDD_UL_DL_Pattern_t *tdd, int sched_pucch_size) static int get_pucch_index(int frame, int slot, int n_slots_frame, const NR_TDD_UL_DL_Pattern_t *tdd, int sched_pucch_size)
{ {
// PUCCH structures are indexed by slot in the PUCCH period determined by sched_pucch_size number of UL slots // PUCCH structures are indexed by slot in the PUCCH period determined by sched_pucch_size number of UL slots
// this functions return the index to the structure for slot passed to the function // this functions return the index to the structure for slot passed to the function
...@@ -324,8 +324,8 @@ static void handle_dl_harq(NR_UE_info_t * UE, ...@@ -324,8 +324,8 @@ static void handle_dl_harq(NR_UE_info_t * UE,
} }
} }
int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, NR_UE_info_t * UE) { static int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, NR_UE_info_t *UE)
{
const NR_PDSCH_Config_t *pdsch_Config = UE->current_DL_BWP.pdsch_Config; const NR_PDSCH_Config_t *pdsch_Config = UE->current_DL_BWP.pdsch_Config;
int nb_tci_states = pdsch_Config ? pdsch_Config->tci_StatesToAddModList->list.count : 0; int nb_tci_states = pdsch_Config ? pdsch_Config->tci_StatesToAddModList->list.count : 0;
NR_TCI_State_t *tci =NULL; NR_TCI_State_t *tci =NULL;
...@@ -350,8 +350,8 @@ int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, NR_UE_info_t * ...@@ -350,8 +350,8 @@ int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, NR_UE_info_t *
return -1; return -1;
} }
int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, NR_UE_info_t *UE) { static int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, NR_UE_info_t *UE)
{
NR_TCI_State_t *tci =NULL; NR_TCI_State_t *tci =NULL;
NR_TCI_StateId_t *tci_id = NULL; NR_TCI_StateId_t *tci_id = NULL;
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
...@@ -390,7 +390,8 @@ int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, NR_UE_info_t *UE) { ...@@ -390,7 +390,8 @@ int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, NR_UE_info_t *UE) {
} }
//returns the measured RSRP value (upper limit) //returns the measured RSRP value (upper limit)
int get_measured_rsrp(uint8_t index) { static int get_measured_rsrp(uint8_t index)
{
//if index is invalid returning minimum rsrp -140 //if index is invalid returning minimum rsrp -140
if(index <= 15 || index >= 114) if(index <= 15 || index >= 114)
return MIN_RSRP_VALUE; return MIN_RSRP_VALUE;
...@@ -399,7 +400,7 @@ int get_measured_rsrp(uint8_t index) { ...@@ -399,7 +400,7 @@ int get_measured_rsrp(uint8_t index) {
} }
//returns the differential RSRP value (upper limit) //returns the differential RSRP value (upper limit)
int get_diff_rsrp(uint8_t index, int strongest_rsrp) { static int get_diff_rsrp(uint8_t index, int strongest_rsrp) {
if(strongest_rsrp != -1) { if(strongest_rsrp != -1) {
return strongest_rsrp + diff_rsrp_ssb_csi_meas_10_1_6_1_2[index]; return strongest_rsrp + diff_rsrp_ssb_csi_meas_10_1_6_1_2[index];
} else } else
...@@ -409,8 +410,8 @@ int get_diff_rsrp(uint8_t index, int strongest_rsrp) { ...@@ -409,8 +410,8 @@ int get_diff_rsrp(uint8_t index, int strongest_rsrp) {
//identifies the target SSB Beam index //identifies the target SSB Beam index
//keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally //keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally
//handles triggering of PDCCH and PDSCH MAC CEs //handles triggering of PDCCH and PDSCH MAC CEs
void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) { static void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot)
{
int strongest_ssb_rsrp = 0; int strongest_ssb_rsrp = 0;
int cqi_idx = 0; int cqi_idx = 0;
int curr_ssb_beam_index = 0; //ToDo: yet to know how to identify the serving ssb beam index int curr_ssb_beam_index = 0; //ToDo: yet to know how to identify the serving ssb beam index
...@@ -583,24 +584,23 @@ void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) { ...@@ -583,24 +584,23 @@ void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) {
} }
}//tci_presentInDCI }//tci_presentInDCI
}//is-triggering_beam_switch }//is-triggering_beam_switch
}//tci handling } // tci handling
static uint8_t pickandreverse_bits(uint8_t *payload, uint16_t bitlen, uint8_t start_bit)
uint8_t pickandreverse_bits(uint8_t *payload, uint16_t bitlen, uint8_t start_bit) { {
uint8_t rev_bits = 0; uint8_t rev_bits = 0;
for (int i=0; i<bitlen; i++) for (int i=0; i<bitlen; i++)
rev_bits |= ((payload[(start_bit+i)/8]>>((start_bit+i)%8))&0x01)<<(bitlen-i-1); rev_bits |= ((payload[(start_bit+i)/8]>>((start_bit+i)%8))&0x01)<<(bitlen-i-1);
return rev_bits; return rev_bits;
} }
static void evaluate_rsrp_report(NR_UE_info_t *UE,
void evaluate_rsrp_report(NR_UE_info_t *UE,
NR_UE_sched_ctrl_t *sched_ctrl, NR_UE_sched_ctrl_t *sched_ctrl,
uint8_t csi_report_id, uint8_t csi_report_id,
uint8_t *payload, uint8_t *payload,
int *cumul_bits, int *cumul_bits,
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type){ NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type)
{
nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id]; nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
uint8_t cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen; uint8_t cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen;
uint16_t curr_payload; uint16_t curr_payload;
...@@ -659,21 +659,18 @@ void evaluate_rsrp_report(NR_UE_info_t *UE, ...@@ -659,21 +659,18 @@ void evaluate_rsrp_report(NR_UE_info_t *UE,
stats->num_rsrp_meas++; stats->num_rsrp_meas++;
} }
void evaluate_cri_report(uint8_t *payload, static void evaluate_cri_report(uint8_t *payload, uint8_t cri_bitlen, int cumul_bits, NR_UE_sched_ctrl_t *sched_ctrl)
uint8_t cri_bitlen, {
int cumul_bits,
NR_UE_sched_ctrl_t *sched_ctrl){
uint8_t temp_cri = pickandreverse_bits(payload, cri_bitlen, cumul_bits); uint8_t temp_cri = pickandreverse_bits(payload, cri_bitlen, cumul_bits);
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cri = temp_cri; sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cri = temp_cri;
} }
int evaluate_ri_report(uint8_t *payload, static int evaluate_ri_report(uint8_t *payload,
uint8_t ri_bitlen, uint8_t ri_bitlen,
uint8_t ri_restriction, uint8_t ri_restriction,
int cumul_bits, int cumul_bits,
NR_UE_sched_ctrl_t *sched_ctrl){ NR_UE_sched_ctrl_t *sched_ctrl)
{
uint8_t ri_index = pickandreverse_bits(payload, ri_bitlen, cumul_bits); uint8_t ri_index = pickandreverse_bits(payload, ri_bitlen, cumul_bits);
int count=0; int count=0;
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
...@@ -689,8 +686,7 @@ int evaluate_ri_report(uint8_t *payload, ...@@ -689,8 +686,7 @@ int evaluate_ri_report(uint8_t *payload,
AssertFatal(1==0, "Decoded ri %d does not correspond to any valid value in ri_restriction %d\n",ri_index,ri_restriction); AssertFatal(1==0, "Decoded ri %d does not correspond to any valid value in ri_restriction %d\n",ri_index,ri_restriction);
} }
static void evaluate_cqi_report(uint8_t *payload,
void evaluate_cqi_report(uint8_t *payload,
nr_csi_report_t *csi_report, nr_csi_report_t *csi_report,
int cumul_bits, int cumul_bits,
uint8_t ri, uint8_t ri,
...@@ -723,13 +719,12 @@ void evaluate_cqi_report(uint8_t *payload, ...@@ -723,13 +719,12 @@ void evaluate_cqi_report(uint8_t *payload,
sched_ctrl->dl_max_mcs = get_mcs_from_cqi(mcs_table, cqi_Table, cqi_idx); sched_ctrl->dl_max_mcs = get_mcs_from_cqi(mcs_table, cqi_Table, cqi_idx);
} }
static uint8_t evaluate_pmi_report(uint8_t *payload,
uint8_t evaluate_pmi_report(uint8_t *payload,
nr_csi_report_t *csi_report, nr_csi_report_t *csi_report,
int cumul_bits, int cumul_bits,
uint8_t ri, uint8_t ri,
NR_UE_sched_ctrl_t *sched_ctrl){ NR_UE_sched_ctrl_t *sched_ctrl)
{
int x1_bitlen = csi_report->csi_meas_bitlen.pmi_x1_bitlen[ri]; int x1_bitlen = csi_report->csi_meas_bitlen.pmi_x1_bitlen[ri];
int x2_bitlen = csi_report->csi_meas_bitlen.pmi_x2_bitlen[ri]; int x2_bitlen = csi_report->csi_meas_bitlen.pmi_x2_bitlen[ri];
int tot_bitlen = x1_bitlen + x2_bitlen; int tot_bitlen = x1_bitlen + x2_bitlen;
...@@ -744,16 +739,14 @@ uint8_t evaluate_pmi_report(uint8_t *payload, ...@@ -744,16 +739,14 @@ uint8_t evaluate_pmi_report(uint8_t *payload,
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2);
return tot_bitlen; return tot_bitlen;
} }
static int evaluate_li_report(uint8_t *payload,
int evaluate_li_report(uint8_t *payload,
nr_csi_report_t *csi_report, nr_csi_report_t *csi_report,
int cumul_bits, int cumul_bits,
uint8_t ri, uint8_t ri,
NR_UE_sched_ctrl_t *sched_ctrl){ NR_UE_sched_ctrl_t *sched_ctrl)
{
int li_bitlen = csi_report->csi_meas_bitlen.li_bitlen[ri]; int li_bitlen = csi_report->csi_meas_bitlen.li_bitlen[ri];
if (li_bitlen>0) { if (li_bitlen>0) {
...@@ -762,14 +755,10 @@ int evaluate_li_report(uint8_t *payload, ...@@ -762,14 +755,10 @@ int evaluate_li_report(uint8_t *payload,
sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.li = temp_li; sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.li = temp_li;
} }
return li_bitlen; return li_bitlen;
} }
void skip_zero_padding(int *cumul_bits, static void skip_zero_padding(int *cumul_bits, nr_csi_report_t *csi_report, uint8_t ri, uint16_t max_bitlen)
nr_csi_report_t *csi_report, {
uint8_t ri,
uint16_t max_bitlen) {
// actual number of reported bits depends on the reported rank // actual number of reported bits depends on the reported rank
// zero padding bits are added to have a predetermined max bit length to decode // zero padding bits are added to have a predetermined max bit length to decode
...@@ -783,8 +772,7 @@ void skip_zero_padding(int *cumul_bits, ...@@ -783,8 +772,7 @@ void skip_zero_padding(int *cumul_bits,
*cumul_bits+=(max_bitlen-reported_bitlen); *cumul_bits+=(max_bitlen-reported_bitlen);
} }
static void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu, const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu,
frame_t frame, frame_t frame,
slot_t slot, slot_t slot,
...@@ -1031,7 +1019,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id, ...@@ -1031,7 +1019,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
} }
} }
void set_pucch_allocation(const NR_UE_UL_BWP_t *ul_bwp, const int r_pucch, const int bwp_size, NR_sched_pucch_t *pucch) static void set_pucch_allocation(const NR_UE_UL_BWP_t *ul_bwp, const int r_pucch, const int bwp_size, NR_sched_pucch_t *pucch)
{ {
if(r_pucch<0){ if(r_pucch<0){
const NR_PUCCH_Resource_t *resource = ul_bwp->pucch_Config->resourceToAddModList->list.array[0]; const NR_PUCCH_Resource_t *resource = ul_bwp->pucch_Config->resourceToAddModList->list.array[0];
...@@ -1053,11 +1041,8 @@ void set_pucch_allocation(const NR_UE_UL_BWP_t *ul_bwp, const int r_pucch, const ...@@ -1053,11 +1041,8 @@ void set_pucch_allocation(const NR_UE_UL_BWP_t *ul_bwp, const int r_pucch, const
} }
} }
bool test_pucch0_vrb_occupation(const NR_sched_pucch_t *pucch, static bool test_pucch0_vrb_occupation(const NR_sched_pucch_t *pucch, uint16_t *vrb_map_UL, const int bwp_start, const int bwp_size)
uint16_t *vrb_map_UL, {
const int bwp_start,
const int bwp_size) {
// We assume initial cyclic shift is always 0 so different pucch resources can't overlap // We assume initial cyclic shift is always 0 so different pucch resources can't overlap
// verifying occupation of PRBs for ACK/NACK on dedicated pucch // verifying occupation of PRBs for ACK/NACK on dedicated pucch
...@@ -1076,9 +1061,7 @@ bool test_pucch0_vrb_occupation(const NR_sched_pucch_t *pucch, ...@@ -1076,9 +1061,7 @@ bool test_pucch0_vrb_occupation(const NR_sched_pucch_t *pucch,
return true; return true;
} }
void set_pucch0_vrb_occupation(const NR_sched_pucch_t *pucch, static void set_pucch0_vrb_occupation(const NR_sched_pucch_t *pucch, uint16_t *vrb_map_UL, const int bwp_start)
uint16_t *vrb_map_UL,
const int bwp_start)
{ {
for (int l=0; l<pucch->nr_of_symb; l++) { for (int l=0; l<pucch->nr_of_symb; l++) {
uint16_t symb = SL_to_bitmap(pucch->start_symb+l, 1); uint16_t symb = SL_to_bitmap(pucch->start_symb+l, 1);
......
...@@ -61,14 +61,8 @@ const int get_ul_tda(gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *sc ...@@ -61,14 +61,8 @@ const int get_ul_tda(gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *sc
return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots) return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots)
} }
int compute_ph_factor(int mu, static int compute_ph_factor(int mu, int tbs_bits, int rb, int n_layers, int n_symbols, int n_dmrs, long *deltaMCS)
int tbs_bits, {
int rb,
int n_layers,
int n_symbols,
int n_dmrs,
long *deltaMCS) {
// 38.213 7.1.1 // 38.213 7.1.1
// if the PUSCH transmission is over more than one layer delta_tf = 0 // if the PUSCH transmission is over more than one layer delta_tf = 0
int delta_tf = 0; int delta_tf = 0;
...@@ -109,8 +103,8 @@ int compute_ph_factor(int mu, ...@@ -109,8 +103,8 @@ int compute_ph_factor(int mu,
// F: length of L is 0:8 or 1:16 bits wide // F: length of L is 0:8 or 1:16 bits wide
// R: Reserved bit, set to zero. // R: Reserved bit, set to zero.
int nr_process_mac_pdu(instance_t module_idP, static int nr_process_mac_pdu(instance_t module_idP,
NR_UE_info_t* UE, NR_UE_info_t *UE,
uint8_t CC_id, uint8_t CC_id,
frame_t frameP, frame_t frameP,
sub_frame_t slot, sub_frame_t slot,
...@@ -462,7 +456,7 @@ int nr_process_mac_pdu(instance_t module_idP, ...@@ -462,7 +456,7 @@ int nr_process_mac_pdu(instance_t module_idP,
return 0; return 0;
} }
void abort_nr_ul_harq(NR_UE_info_t *UE, int8_t harq_pid) static void abort_nr_ul_harq(NR_UE_info_t *UE, int8_t harq_pid)
{ {
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_UE_ul_harq_t *harq = &sched_ctrl->ul_harq_processes[harq_pid]; NR_UE_ul_harq_t *harq = &sched_ctrl->ul_harq_processes[harq_pid];
...@@ -479,7 +473,7 @@ void abort_nr_ul_harq(NR_UE_info_t *UE, int8_t harq_pid) ...@@ -479,7 +473,7 @@ void abort_nr_ul_harq(NR_UE_info_t *UE, int8_t harq_pid)
sched_ctrl->sched_ul_bytes = 0; sched_ctrl->sched_ul_bytes = 0;
} }
bool get_UE_waiting_CFRA_msg3(const gNB_MAC_INST *gNB_mac, const int CC_id, const frame_t frame, const sub_frame_t slot) static bool get_UE_waiting_CFRA_msg3(const gNB_MAC_INST *gNB_mac, const int CC_id, const frame_t frame, const sub_frame_t slot)
{ {
bool UE_waiting_CFRA_msg3 = false; bool UE_waiting_CFRA_msg3 = false;
for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
...@@ -841,8 +835,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, ...@@ -841,8 +835,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
} }
} }
uint32_t calc_power_complex(const int16_t *x, const int16_t *y, const uint32_t size) { static uint32_t calc_power_complex(const int16_t *x, const int16_t *y, const uint32_t size)
{
// Real part value // Real part value
int64_t sum_x = 0; int64_t sum_x = 0;
int64_t sum_x2 = 0; int64_t sum_x2 = 0;
...@@ -864,7 +858,8 @@ uint32_t calc_power_complex(const int16_t *x, const int16_t *y, const uint32_t s ...@@ -864,7 +858,8 @@ uint32_t calc_power_complex(const int16_t *x, const int16_t *y, const uint32_t s
return power_re+power_im; return power_re+power_im;
} }
c16_t nr_h_times_w(c16_t h, char w) { static c16_t nr_h_times_w(c16_t h, char w)
{
c16_t output; c16_t output;
switch (w) { switch (w) {
case '0': // 0 case '0': // 0
...@@ -893,11 +888,11 @@ c16_t nr_h_times_w(c16_t h, char w) { ...@@ -893,11 +888,11 @@ c16_t nr_h_times_w(c16_t h, char w) {
return output; return output;
} }
uint8_t get_max_tpmi(const NR_PUSCH_Config_t *pusch_Config, static uint8_t get_max_tpmi(const NR_PUSCH_Config_t *pusch_Config,
const uint16_t num_ue_srs_ports, const uint16_t num_ue_srs_ports,
const uint8_t *nrOfLayers, const uint8_t *nrOfLayers,
int *additional_max_tpmi) { int *additional_max_tpmi)
{
uint8_t max_tpmi = 0; uint8_t max_tpmi = 0;
if ((pusch_Config && pusch_Config->txConfig != NULL && *pusch_Config->txConfig == NR_PUSCH_Config__txConfig_nonCodebook) || if ((pusch_Config && pusch_Config->txConfig != NULL && *pusch_Config->txConfig == NR_PUSCH_Config__txConfig_nonCodebook) ||
...@@ -1056,7 +1051,7 @@ uint8_t get_max_tpmi(const NR_PUSCH_Config_t *pusch_Config, ...@@ -1056,7 +1051,7 @@ uint8_t get_max_tpmi(const NR_PUSCH_Config_t *pusch_Config,
return max_tpmi; return max_tpmi;
} }
void get_precoder_matrix_coef(char *w, static void get_precoder_matrix_coef(char *w,
const uint8_t ul_ri, const uint8_t ul_ri,
const uint16_t num_ue_srs_ports, const uint16_t num_ue_srs_ports,
const long transform_precoding, const long transform_precoding,
...@@ -1085,7 +1080,7 @@ void get_precoder_matrix_coef(char *w, ...@@ -1085,7 +1080,7 @@ void get_precoder_matrix_coef(char *w,
} }
} }
int nr_srs_tpmi_estimation(const NR_PUSCH_Config_t *pusch_Config, static int nr_srs_tpmi_estimation(const NR_PUSCH_Config_t *pusch_Config,
const long transform_precoding, const long transform_precoding,
const uint8_t *channel_matrix, const uint8_t *channel_matrix,
const uint8_t normalized_iq_representation, const uint8_t normalized_iq_representation,
...@@ -1093,7 +1088,8 @@ int nr_srs_tpmi_estimation(const NR_PUSCH_Config_t *pusch_Config, ...@@ -1093,7 +1088,8 @@ int nr_srs_tpmi_estimation(const NR_PUSCH_Config_t *pusch_Config,
const uint16_t num_ue_srs_ports, const uint16_t num_ue_srs_ports,
const uint16_t prg_size, const uint16_t prg_size,
const uint16_t num_prgs, const uint16_t num_prgs,
const uint8_t ul_ri) { const uint8_t ul_ri)
{
if (ul_ri > 1) { if (ul_ri > 1) {
LOG_D(NR_MAC, "TPMI computation for ul_ri %i is not implemented yet!\n", ul_ri); LOG_D(NR_MAC, "TPMI computation for ul_ri %i is not implemented yet!\n", ul_ri);
return 0; return 0;
...@@ -1363,7 +1359,7 @@ static bool nr_UE_is_to_be_scheduled(const NR_ServingCellConfigCommon_t *scc, in ...@@ -1363,7 +1359,7 @@ static bool nr_UE_is_to_be_scheduled(const NR_ServingCellConfigCommon_t *scc, in
return has_data || sched_ctrl->SR || high_inactivity; return has_data || sched_ctrl->SR || high_inactivity;
} }
void update_ul_ue_R_Qm(int mcs, int mcs_table, const NR_PUSCH_Config_t *pusch_Config, uint16_t *R, uint8_t *Qm) static void update_ul_ue_R_Qm(int mcs, int mcs_table, const NR_PUSCH_Config_t *pusch_Config, uint16_t *R, uint8_t *Qm)
{ {
*R = nr_get_code_rate_ul(mcs, mcs_table); *R = nr_get_code_rate_ul(mcs, mcs_table);
*Qm = nr_get_Qm_ul(mcs, mcs_table); *Qm = nr_get_Qm_ul(mcs, mcs_table);
...@@ -1374,7 +1370,14 @@ void update_ul_ue_R_Qm(int mcs, int mcs_table, const NR_PUSCH_Config_t *pusch_Co ...@@ -1374,7 +1370,14 @@ void update_ul_ue_R_Qm(int mcs, int mcs_table, const NR_PUSCH_Config_t *pusch_Co
} }
} }
void nr_ue_max_mcs_min_rb(int mu, int ph_limit, NR_sched_pusch_t *sched_pusch, NR_UE_UL_BWP_t *ul_bwp, uint16_t minRb, uint32_t tbs, uint16_t *Rb, uint8_t *mcs) static void nr_ue_max_mcs_min_rb(int mu,
int ph_limit,
NR_sched_pusch_t *sched_pusch,
NR_UE_UL_BWP_t *ul_bwp,
uint16_t minRb,
uint32_t tbs,
uint16_t *Rb,
uint8_t *mcs)
{ {
AssertFatal(*Rb >= minRb, "illegal Rb %d < minRb %d\n", *Rb, minRb); AssertFatal(*Rb >= minRb, "illegal Rb %d < minRb %d\n", *Rb, minRb);
AssertFatal(*mcs >= 0 && *mcs <= 28, "illegal MCS %d\n", *mcs); AssertFatal(*mcs >= 0 && *mcs <= 28, "illegal MCS %d\n", *mcs);
...@@ -1577,7 +1580,7 @@ static int comparator(const void *p, const void *q) { ...@@ -1577,7 +1580,7 @@ static int comparator(const void *p, const void *q) {
return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef; return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef;
} }
void pf_ul(module_id_t module_id, static void pf_ul(module_id_t module_id,
frame_t frame, frame_t frame,
sub_frame_t slot, sub_frame_t slot,
NR_UE_info_t *UE_list[], NR_UE_info_t *UE_list[],
...@@ -1870,7 +1873,7 @@ void pf_ul(module_id_t module_id, ...@@ -1870,7 +1873,7 @@ void pf_ul(module_id_t module_id,
} }
} }
bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) static bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot)
{ {
gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
NR_COMMON_channels_t *cc = nr_mac->common_channels; NR_COMMON_channels_t *cc = nr_mac->common_channels;
......
...@@ -40,8 +40,6 @@ void set_cset_offset(uint16_t); ...@@ -40,8 +40,6 @@ void set_cset_offset(uint16_t);
void mac_top_init_gNB(ngran_node_t node_type); void mac_top_init_gNB(ngran_node_t node_type);
void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc);
int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP,
rnti_t rnti, rnti_t rnti,
NR_SubcarrierSpacing_t subcarrierSpacing, NR_SubcarrierSpacing_t subcarrierSpacing,
...@@ -87,15 +85,6 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -87,15 +85,6 @@ void nr_schedule_ue_spec(module_id_t module_id,
nfapi_nr_dl_tti_request_t *DL_req, nfapi_nr_dl_tti_request_t *DL_req,
nfapi_nr_tx_data_request_t *TX_req); nfapi_nr_tx_data_request_t *TX_req);
uint32_t schedule_control_sib1(module_id_t module_id,
int CC_id,
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
int time_domain_allocation,
NR_pdsch_dmrs_t *dmrs_parms,
NR_tda_info_t *tda_info,
uint8_t candidate_idx,
uint16_t num_total_bytes);
/* \brief default FR1 DL preprocessor init routine, returns preprocessor to call */ /* \brief default FR1 DL preprocessor init routine, returns preprocessor to call */
nr_pp_impl_dl nr_init_fr1_dlsch_preprocessor(int CC_id); nr_pp_impl_dl nr_init_fr1_dlsch_preprocessor(int CC_id);
...@@ -139,41 +128,6 @@ void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, NR_RA_t ...@@ -139,41 +128,6 @@ void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, NR_RA_t
int nr_allocate_CCEs(int module_idP, int CC_idP, frame_t frameP, sub_frame_t slotP, int test_only); int nr_allocate_CCEs(int module_idP, int CC_idP, frame_t frameP, sub_frame_t slotP, int test_only);
void nr_get_Msg3alloc(module_id_t module_id,
int CC_id,
NR_ServingCellConfigCommon_t *scc,
sub_frame_t current_subframe,
frame_t current_frame,
NR_RA_t *ra,
int16_t *tdd_beam_association);
void nr_generate_Msg3_retransmission(module_id_t module_idP,
int CC_id,
frame_t frameP,
sub_frame_t slotP,
NR_RA_t *ra,
nfapi_nr_ul_dci_request_t *ul_dci_req);
/* \brief Function in gNB to fill RAR pdu when requested by PHY.
@param ra Instance of RA resources of gNB
@param dlsch_buffer Pointer to RAR input buffer
@param N_RB_UL Number of UL resource blocks
*/
void nr_fill_rar(uint8_t Mod_idP,
NR_RA_t * ra,
uint8_t * dlsch_buffer,
nfapi_nr_pusch_pdu_t *pusch_pdu);
void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
NR_ServingCellConfigCommon_t *scc,
int round,
int startSymbolAndLength,
rnti_t rnti, int scs,
int bwp_size, int bwp_start,
int mappingtype, int fh,
int msg3_first_rb, int msg3_nb_rb);
void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP); void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP);
uint16_t nr_mac_compute_RIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs); uint16_t nr_mac_compute_RIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs);
...@@ -380,39 +334,10 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, ...@@ -380,39 +334,10 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP,
unsigned char drx_cmd, unsigned char drx_cmd,
unsigned char *ue_cont_res_id); unsigned char *ue_cont_res_id);
void nr_generate_Msg2(module_id_t module_idP,
int CC_id,
frame_t frameP,
sub_frame_t slotP,
NR_RA_t *ra,
nfapi_nr_dl_tti_request_t *dl_req,
nfapi_nr_tx_data_request_t *TX_req);
void nr_generate_Msg4(module_id_t module_idP,
int CC_id,
frame_t frameP,
sub_frame_t slotP,
NR_RA_t *ra,
nfapi_nr_dl_tti_request_t *DL_req,
nfapi_nr_tx_data_request_t *TX_req);
void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra);
void nr_generate_Msg3_dcch_dtch_response(module_id_t module_idP,
int CC_id,
frame_t frameP,
sub_frame_t slotP,
NR_RA_t *ra,
nfapi_nr_dl_tti_request_t *DL_req,
nfapi_nr_tx_data_request_t *TX_req);
int binomial(int n, int k); int binomial(int n, int k);
bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot); bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot);
void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id);
/* \brief Function to indicate a received SDU on ULSCH. /* \brief Function to indicate a received SDU on ULSCH.
@param Mod_id Instance ID of gNB @param Mod_id Instance ID of gNB
@param CC_id Component carrier index @param CC_id Component carrier index
...@@ -451,13 +376,6 @@ void handle_nr_srs_measurements(const module_id_t module_id, ...@@ -451,13 +376,6 @@ void handle_nr_srs_measurements(const module_id_t module_id,
const sub_frame_t slot, const sub_frame_t slot,
nfapi_nr_srs_indication_pdu_t *srs_ind); nfapi_nr_srs_indication_pdu_t *srs_ind);
int16_t ssb_index_from_prach(module_id_t module_idP,
frame_t frameP,
sub_frame_t slotP,
uint16_t preamble_index,
uint8_t freq_index,
uint8_t symbol);
void find_SSB_and_RO_available(gNB_MAC_INST *nrmac); void find_SSB_and_RO_available(gNB_MAC_INST *nrmac);
NR_pdsch_dmrs_t get_dl_dmrs_params(const NR_ServingCellConfigCommon_t *scc, NR_pdsch_dmrs_t get_dl_dmrs_params(const NR_ServingCellConfigCommon_t *scc,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment