git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5757 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -2877,6 +2877,9 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
|
|||||||
dlsch[0]->harq_processes[harq_pid]->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
|
dlsch[0]->harq_processes[harq_pid]->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
|
||||||
dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
|
dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
|
||||||
|
|
||||||
|
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->first_tx,dlsch[0]->harq_processes[harq_pid]->status);
|
||||||
|
|
||||||
if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)|| // DCI has been toggled or this is the first transmission
|
if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)|| // DCI has been toggled or this is the first transmission
|
||||||
(dlsch[0]->harq_processes[harq_pid]->first_tx==1)) {
|
(dlsch[0]->harq_processes[harq_pid]->first_tx==1)) {
|
||||||
dlsch[0]->harq_processes[harq_pid]->round = 0;
|
dlsch[0]->harq_processes[harq_pid]->round = 0;
|
||||||
@@ -3000,8 +3003,8 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
|
|||||||
dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
|
dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
|
||||||
dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
|
dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
|
||||||
|
|
||||||
LOG_D(PHY,"Format1 DCI: ndi %d, old_ndi %d (first tx %d)\n",ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
|
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
|
||||||
dlsch[0]->harq_processes[harq_pid]->first_tx);
|
dlsch[0]->harq_processes[harq_pid]->first_tx,dlsch[0]->harq_processes[harq_pid]->status);
|
||||||
|
|
||||||
// printf("Format1 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
|
// printf("Format1 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
|
||||||
// dlsch[0]->harq_processes[harq_pid]->first_tx);
|
// dlsch[0]->harq_processes[harq_pid]->first_tx);
|
||||||
|
|||||||
@@ -409,7 +409,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
|||||||
dlsch->harq_ack[subframe].harq_id = harq_pid;
|
dlsch->harq_ack[subframe].harq_id = harq_pid;
|
||||||
dlsch->harq_ack[subframe].send_harq_status = 1;
|
dlsch->harq_ack[subframe].send_harq_status = 1;
|
||||||
harq_process->round++;
|
harq_process->round++;
|
||||||
// msg("DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",subframe,harq_pid,harq_process->round);
|
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
||||||
if (harq_process->round >= dlsch->Mdlharq) {
|
if (harq_process->round >= dlsch->Mdlharq) {
|
||||||
harq_process->status = SCH_IDLE;
|
harq_process->status = SCH_IDLE;
|
||||||
}
|
}
|
||||||
@@ -422,7 +422,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
|
|||||||
dlsch->harq_ack[subframe].ack = 1;
|
dlsch->harq_ack[subframe].ack = 1;
|
||||||
dlsch->harq_ack[subframe].harq_id = harq_pid;
|
dlsch->harq_ack[subframe].harq_id = harq_pid;
|
||||||
dlsch->harq_ack[subframe].send_harq_status = 1;
|
dlsch->harq_ack[subframe].send_harq_status = 1;
|
||||||
// msg("DLSCH decoding: Setting ACK for subframe %d (pid %d)\n",subframe,harq_pid);
|
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
|
||||||
|
|
||||||
}
|
}
|
||||||
// Reassembly of Transport block here
|
// Reassembly of Transport block here
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
|||||||
@@ -354,6 +354,12 @@ typedef struct
|
|||||||
uint8_t Mod_id;
|
uint8_t Mod_id;
|
||||||
uint8_t CC_id;
|
uint8_t CC_id;
|
||||||
uint8_t local_flag;
|
uint8_t local_flag;
|
||||||
|
int instance_cnt_tx;
|
||||||
|
int instance_cnt_rx;
|
||||||
|
pthread_cond_t cond_tx;
|
||||||
|
pthread_cond_t cond_rx;
|
||||||
|
pthread_mutex_t mutex_tx;
|
||||||
|
pthread_mutex_t mutex_rx;
|
||||||
uint32_t tx_total_gain_dB;
|
uint32_t tx_total_gain_dB;
|
||||||
uint32_t rx_total_gain_dB; ///this is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card
|
uint32_t rx_total_gain_dB; ///this is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card
|
||||||
uint32_t rx_gain_max[4];
|
uint32_t rx_gain_max[4];
|
||||||
@@ -365,6 +371,8 @@ typedef struct
|
|||||||
int tx_total_RE;
|
int tx_total_RE;
|
||||||
int8_t tx_power_max_dBm;
|
int8_t tx_power_max_dBm;
|
||||||
uint32_t frame;
|
uint32_t frame;
|
||||||
|
uint32_t frame_rx,frame_tx;
|
||||||
|
uint32_t slot_tx,slot_rx;
|
||||||
uint8_t n_connected_eNB;
|
uint8_t n_connected_eNB;
|
||||||
uint8_t ho_initiated;
|
uint8_t ho_initiated;
|
||||||
uint8_t ho_triggered;
|
uint8_t ho_triggered;
|
||||||
|
|||||||
@@ -321,10 +321,11 @@ uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
unsigned char subframe,
|
unsigned char subframe,
|
||||||
unsigned char *o_ACK) {
|
unsigned char *o_ACK) {
|
||||||
|
|
||||||
//printf("get_ack: SF %d\n",subframe);
|
|
||||||
uint8_t status=0;
|
uint8_t status=0;
|
||||||
uint8_t subframe_dl;
|
uint8_t subframe_dl;
|
||||||
|
|
||||||
|
printf("get_ack: SF %d\n",subframe);
|
||||||
if (frame_parms->frame_type == FDD) {
|
if (frame_parms->frame_type == FDD) {
|
||||||
if (subframe < 4)
|
if (subframe < 4)
|
||||||
subframe_dl = subframe + 6;
|
subframe_dl = subframe + 6;
|
||||||
@@ -372,6 +373,7 @@ uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
else if (harq_ack[6].send_harq_status == 1)
|
else if (harq_ack[6].send_harq_status == 1)
|
||||||
o_ACK[0] = harq_ack[6].ack;
|
o_ACK[0] = harq_ack[6].ack;
|
||||||
status = harq_ack[5].send_harq_status + (harq_ack[6].send_harq_status<<1);
|
status = harq_ack[5].send_harq_status + (harq_ack[6].send_harq_status<<1);
|
||||||
|
printf("Subframe 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
|
||||||
}
|
}
|
||||||
else if (subframe == 3) { // ACK subframes 7 and 8
|
else if (subframe == 3) { // ACK subframes 7 and 8
|
||||||
if (harq_ack[7].send_harq_status == 1) {
|
if (harq_ack[7].send_harq_status == 1) {
|
||||||
@@ -383,6 +385,7 @@ uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
o_ACK[0] = harq_ack[8].ack;
|
o_ACK[0] = harq_ack[8].ack;
|
||||||
|
|
||||||
status = harq_ack[7].send_harq_status + (harq_ack[8].send_harq_status<<1);
|
status = harq_ack[7].send_harq_status + (harq_ack[8].send_harq_status<<1);
|
||||||
|
printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
|
||||||
//printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
|
//printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
|
||||||
}
|
}
|
||||||
else if (subframe == 4) { // ACK subframes 9 and 0
|
else if (subframe == 4) { // ACK subframes 9 and 0
|
||||||
@@ -395,6 +398,7 @@ uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
o_ACK[0] = harq_ack[8].ack;
|
o_ACK[0] = harq_ack[8].ack;
|
||||||
|
|
||||||
status = harq_ack[9].send_harq_status + (harq_ack[0].send_harq_status<<1);
|
status = harq_ack[9].send_harq_status + (harq_ack[0].send_harq_status<<1);
|
||||||
|
printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe %d for tdd_config %d\n",
|
LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe %d for tdd_config %d\n",
|
||||||
|
|||||||
@@ -2208,7 +2208,7 @@ void process_HARQ_feedback(uint8_t UE_id,
|
|||||||
// but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used
|
// but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used
|
||||||
|
|
||||||
dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[0];
|
dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[0];
|
||||||
dlsch_ACK[1] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[1];
|
dlsch_ACK[1] = (phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling)?phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[0]:phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[1];
|
||||||
// printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
|
// printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2315,8 +2315,8 @@ void process_HARQ_feedback(uint8_t UE_id,
|
|||||||
if ( dlsch_ACK[mp]==0) {
|
if ( dlsch_ACK[mp]==0) {
|
||||||
// Received NAK
|
// Received NAK
|
||||||
#ifdef DEBUG_PHY_PROC
|
#ifdef DEBUG_PHY_PROC
|
||||||
LOG_I(PHY,"[eNB %d][PDSCH %x/%d] NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id,
|
LOG_I(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id,
|
||||||
dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
|
dlsch->rnti,dl_harq_pid[m],M,m,mp,dlsch_harq_proc->round);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// if (dlsch_harq_proc->round == 0)
|
// if (dlsch_harq_proc->round == 0)
|
||||||
|
|||||||
@@ -2074,6 +2074,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v
|
|||||||
#ifdef DEBUG_PHY_PROC
|
#ifdef DEBUG_PHY_PROC
|
||||||
LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",phy_vars_ue->Mod_id,dci_alloc_rx[i].format);
|
LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",phy_vars_ue->Mod_id,dci_alloc_rx[i].format);
|
||||||
dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
|
dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
|
||||||
|
LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,(last_slot>>1),last_slot,phy_vars_ue->dlsch_ue[eNB_id][0]->active);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// we received a CRNTI, so we're in PUSCH
|
// we received a CRNTI, so we're in PUSCH
|
||||||
@@ -2353,6 +2354,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v
|
|||||||
}
|
}
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,(last_slot>>1),last_slot,phy_vars_ue->dlsch_ue[eNB_id][0]->active);
|
||||||
|
|
||||||
// This is normal processing (i.e. not MBSFN)
|
// This is normal processing (i.e. not MBSFN)
|
||||||
// RX processing of symbols in last_slot
|
// RX processing of symbols in last_slot
|
||||||
for (l=0;l<n_symb;l++) {
|
for (l=0;l<n_symb;l++) {
|
||||||
@@ -2426,7 +2429,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// trigger DLSCH decoding thread
|
// trigger DLSCH decoding thread
|
||||||
if (!(last_slot%2)) // odd slots
|
if ((last_slot%2)==1) // odd slots
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0;
|
phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2435,18 +2438,20 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v
|
|||||||
// process last DLSCH symbols + invoke decoding
|
// process last DLSCH symbols + invoke decoding
|
||||||
if (((last_slot%2)==0) && (l==0)) {
|
if (((last_slot%2)==0) && (l==0)) {
|
||||||
// Regular PDSCH
|
// Regular PDSCH
|
||||||
|
|
||||||
|
LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",phy_vars_ue->Mod_id,((last_slot>>1)+9)%10,phy_vars_ue->dlsch_ue[eNB_id][0]->active);
|
||||||
if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) {
|
if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) {
|
||||||
#ifndef DLSCH_THREAD //USER_MODE
|
#ifndef DLSCH_THREAD //USER_MODE
|
||||||
harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
|
harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
|
||||||
//printf("PDSCH active in subframe %d, harq_pid %d\n",(last_slot>>1)-1,harq_pid);
|
LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",phy_vars_ue->Mod_id,((last_slot>>1)+1)%10,harq_pid);
|
||||||
if ((phy_vars_ue->transmission_mode[eNB_id] == 5) &&
|
if ((phy_vars_ue->transmission_mode[eNB_id] == 5) &&
|
||||||
(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
|
(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
|
||||||
(openair_daq_vars.use_ia_receiver ==1)) {
|
(openair_daq_vars.use_ia_receiver ==1)) {
|
||||||
dual_stream_UE = 1;
|
dual_stream_UE = 1;
|
||||||
eNB_id_i = phy_vars_ue->n_connected_eNB;
|
eNB_id_i = phy_vars_ue->n_connected_eNB;
|
||||||
i_mod = get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
|
i_mod = get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
|
||||||
if (phy_vars_ue->frame%100==0) {
|
if (phy_vars_ue->frame%100==0) {
|
||||||
LOG_I(PHY,"using IA receiver\n");
|
LOG_I(PHY,"using IA receiver\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -2541,9 +2546,9 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d,TBS %d)\n",
|
LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (last_slot %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
|
||||||
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
|
||||||
harq_pid,phy_vars_ue->frame,((last_slot>>1)==0)?9:(last_slot>>1)-1,
|
harq_pid,phy_vars_ue->frame,((last_slot>>1)==0)?9:(last_slot>>1)-1,last_slot,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
|
||||||
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
|
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
|
||||||
@@ -2943,6 +2948,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,uint8_t last_slot, PHY_VARS_UE *phy_v
|
|||||||
#ifndef DLSCH_THREAD
|
#ifndef DLSCH_THREAD
|
||||||
if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) {
|
if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) {
|
||||||
harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
|
harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
|
||||||
|
LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",phy_vars_ue->Mod_id,(last_slot>>1),last_slot,harq_pid);
|
||||||
if ((phy_vars_ue->transmission_mode[eNB_id] == 5) &&
|
if ((phy_vars_ue->transmission_mode[eNB_id] == 5) &&
|
||||||
(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
|
(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
|
||||||
(openair_daq_vars.use_ia_receiver ==1)) {
|
(openair_daq_vars.use_ia_receiver ==1)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user