Merge remote-tracking branch 'origin/NR_MSG3_TPC' into integration_2025_w02 (!3130)
NR gNB MSG3 TPC This MR improves the handling of MSG3 TPC commands at MAC gNB. TODO: Compute TPC when PRACH sends a valid power measurements (currently not the case for OAI L1, to be verified with Aerial L1) Closes #866
This commit is contained in:
@@ -675,14 +675,25 @@ static NR_RA_t *find_free_nr_RA(NR_RA_t *ra_base, int ra_count, uint16_t preambl
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t nr_get_msg3_tpc(uint32_t preamble_power)
|
||||||
|
{
|
||||||
|
// TODO not sure how to implement TPC for MSG3 to be sent in RAR
|
||||||
|
// maybe using preambleReceivedTargetPower as a term of comparison
|
||||||
|
// in any case OAI L1 sets this as invalid
|
||||||
|
// and Aerial report doesn't seem to be reliable (not matching preambleReceivedTargetPower)
|
||||||
|
// so for now we feedback 0dB TPC
|
||||||
|
return 3; // it means 0dB
|
||||||
|
}
|
||||||
|
|
||||||
void nr_initiate_ra_proc(module_id_t module_idP,
|
void nr_initiate_ra_proc(module_id_t module_idP,
|
||||||
int CC_id,
|
int CC_id,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP,
|
int slotP,
|
||||||
uint16_t preamble_index,
|
uint16_t preamble_index,
|
||||||
uint8_t freq_index,
|
uint8_t freq_index,
|
||||||
uint8_t symbol,
|
uint8_t symbol,
|
||||||
int16_t timing_offset)
|
int16_t timing_offset,
|
||||||
|
uint32_t preamble_power)
|
||||||
{
|
{
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1);
|
||||||
|
|
||||||
@@ -713,6 +724,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
|
|||||||
ra->preamble_slot = slotP;
|
ra->preamble_slot = slotP;
|
||||||
ra->preamble_index = preamble_index;
|
ra->preamble_index = preamble_index;
|
||||||
ra->timing_offset = timing_offset;
|
ra->timing_offset = timing_offset;
|
||||||
|
ra->msg3_TPC = nr_get_msg3_tpc(preamble_power);
|
||||||
uint8_t ul_carrier_id = 0; // 0 for NUL 1 for SUL
|
uint8_t ul_carrier_id = 0; // 0 for NUL 1 for SUL
|
||||||
ra->RA_rnti = nr_get_ra_rnti(symbol, slotP, freq_index, ul_carrier_id);
|
ra->RA_rnti = nr_get_ra_rnti(symbol, slotP, freq_index, ul_carrier_id);
|
||||||
|
|
||||||
@@ -2335,9 +2347,7 @@ static void nr_fill_rar(uint8_t Mod_idP, NR_RA_t *ra, uint8_t *dlsch_buffer, nfa
|
|||||||
NR_RA_HEADER_BI *rarbi = (NR_RA_HEADER_BI *) dlsch_buffer;
|
NR_RA_HEADER_BI *rarbi = (NR_RA_HEADER_BI *) dlsch_buffer;
|
||||||
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) (dlsch_buffer + 1);
|
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) (dlsch_buffer + 1);
|
||||||
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 2);
|
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 2);
|
||||||
unsigned char csi_req = 0, tpc_command;
|
unsigned char csi_req = 0;
|
||||||
|
|
||||||
tpc_command = 3; // This is 0 dB in RAR UL grant
|
|
||||||
|
|
||||||
/// E/T/R/R/BI subheader ///
|
/// E/T/R/R/BI subheader ///
|
||||||
// E = 1, MAC PDU includes another MAC sub-PDU (RAPID)
|
// E = 1, MAC PDU includes another MAC sub-PDU (RAPID)
|
||||||
@@ -2369,8 +2379,6 @@ static void nr_fill_rar(uint8_t Mod_idP, NR_RA_t *ra, uint8_t *dlsch_buffer, nfa
|
|||||||
|
|
||||||
// UL grant
|
// UL grant
|
||||||
|
|
||||||
ra->msg3_TPC = 1; // This is 0 dB in UL DCI
|
|
||||||
|
|
||||||
if (pusch_pdu->frequency_hopping)
|
if (pusch_pdu->frequency_hopping)
|
||||||
AssertFatal(1==0,"PUSCH with frequency hopping currently not supported");
|
AssertFatal(1==0,"PUSCH with frequency hopping currently not supported");
|
||||||
|
|
||||||
@@ -2379,7 +2387,7 @@ static void nr_fill_rar(uint8_t Mod_idP, NR_RA_t *ra, uint8_t *dlsch_buffer, nfa
|
|||||||
int valid_bits = 14;
|
int valid_bits = 14;
|
||||||
int f_alloc = prb_alloc & ((1 << valid_bits) - 1);
|
int f_alloc = prb_alloc & ((1 << valid_bits) - 1);
|
||||||
|
|
||||||
uint32_t ul_grant = csi_req | (tpc_command << 1) | (pusch_pdu->mcs_index << 4) | (ra->Msg3_tda_id << 8) | (f_alloc << 12) | (pusch_pdu->frequency_hopping << 26);
|
uint32_t ul_grant = csi_req | (ra->msg3_TPC << 1) | (pusch_pdu->mcs_index << 4) | (ra->Msg3_tda_id << 8) | (f_alloc << 12) | (pusch_pdu->frequency_hopping << 26);
|
||||||
|
|
||||||
rar->UL_GRANT_1 = (uint8_t) (ul_grant >> 24) & 0x07;
|
rar->UL_GRANT_1 = (uint8_t) (ul_grant >> 24) & 0x07;
|
||||||
rar->UL_GRANT_2 = (uint8_t) (ul_grant >> 16) & 0xff;
|
rar->UL_GRANT_2 = (uint8_t) (ul_grant >> 16) & 0xff;
|
||||||
@@ -2409,9 +2417,12 @@ static void nr_fill_rar(uint8_t Mod_idP, NR_RA_t *ra, uint8_t *dlsch_buffer, nfa
|
|||||||
rar->TA2 + (rar->TA1 << 5),
|
rar->TA2 + (rar->TA1 << 5),
|
||||||
rar->UL_GRANT_4 >> 4,
|
rar->UL_GRANT_4 >> 4,
|
||||||
rar->UL_GRANT_1 >> 2,
|
rar->UL_GRANT_1 >> 2,
|
||||||
tpc_command,
|
ra->msg3_TPC,
|
||||||
csi_req,
|
csi_req,
|
||||||
rar->TCRNTI_2 + (rar->TCRNTI_1 << 8));
|
rar->TCRNTI_2 + (rar->TCRNTI_1 << 8));
|
||||||
|
|
||||||
|
// resetting msg3 TPC to 0dB for possible retransmissions
|
||||||
|
ra->msg3_TPC = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_schedule_RA(module_id_t module_idP,
|
void nr_schedule_RA(module_id_t module_idP,
|
||||||
|
|||||||
@@ -987,9 +987,12 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
if (ra->ra_state != nrRA_WAIT_Msg3)
|
if (ra->ra_state != nrRA_WAIT_Msg3)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( (frameP!=ra->Msg3_frame) || (slotP!=ra->Msg3_slot))
|
if((frameP!=ra->Msg3_frame) || (slotP!=ra->Msg3_slot))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (ul_cqi != 0xff)
|
||||||
|
ra->msg3_TPC = nr_get_tpc(target_snrx10, ul_cqi, 30, 0);
|
||||||
|
|
||||||
handle_msg3_failed_rx(ra, i, gNB_mac->ul_bler.harq_round_max);
|
handle_msg3_failed_rx(ra, i, gNB_mac->ul_bler.harq_round_max);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,16 +120,15 @@ void nr_schedule_RA(module_id_t module_idP,
|
|||||||
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);
|
||||||
|
|
||||||
/* \brief Function to indicate a received preamble on PRACH. It initiates the RA procedure.
|
void nr_initiate_ra_proc(module_id_t module_idP,
|
||||||
@param module_idP Instance ID of gNB
|
int CC_id,
|
||||||
@param preamble_index index of the received RA request
|
frame_t frameP,
|
||||||
@param slotP Slot number on which to act
|
int slotP,
|
||||||
@param timing_offset Offset in samples of the received PRACH w.r.t. eNB timing. This is used to
|
uint16_t preamble_index,
|
||||||
@param rnti RA rnti corresponding to this PRACH preamble
|
uint8_t freq_index,
|
||||||
@param rach_resource type (0=non BL/CE,1 CE level 0,2 CE level 1, 3 CE level 2,4 CE level 3)
|
uint8_t symbol,
|
||||||
*/
|
int16_t timing_offset,
|
||||||
void nr_initiate_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP,
|
uint32_t preamble_power);
|
||||||
uint16_t preamble_index, uint8_t freq_index, uint8_t symbol, int16_t timing_offset);
|
|
||||||
|
|
||||||
void nr_clear_ra_proc(NR_RA_t *ra);
|
void nr_clear_ra_proc(NR_RA_t *ra);
|
||||||
|
|
||||||
|
|||||||
@@ -94,7 +94,8 @@ void handle_nr_rach(NR_UL_IND_t *UL_info)
|
|||||||
UL_info->rach_ind.pdu_list[i].preamble_list[0].preamble_index,
|
UL_info->rach_ind.pdu_list[i].preamble_list[0].preamble_index,
|
||||||
UL_info->rach_ind.pdu_list[i].freq_index,
|
UL_info->rach_ind.pdu_list[i].freq_index,
|
||||||
UL_info->rach_ind.pdu_list[i].symbol_index,
|
UL_info->rach_ind.pdu_list[i].symbol_index,
|
||||||
UL_info->rach_ind.pdu_list[i].preamble_list[0].timing_advance);
|
UL_info->rach_ind.pdu_list[i].preamble_list[0].timing_advance,
|
||||||
|
UL_info->rach_ind.pdu_list[i].preamble_list[0].preamble_pwr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user