prevent UL_indication from overlapping with tx process which cause the drop
This commit is contained in:
@@ -8,10 +8,10 @@
|
|||||||
#define T_MAX_ARGS 16
|
#define T_MAX_ARGS 16
|
||||||
|
|
||||||
/* maximum size of a message - increase if needed */
|
/* maximum size of a message - increase if needed */
|
||||||
#define T_BUFFER_MAX (1024*64)
|
#define T_BUFFER_MAX (10) /*(1024*64)*/
|
||||||
|
|
||||||
/* size of the local cache for messages (must be pow(2,something)) */
|
/* size of the local cache for messages (must be pow(2,something)) */
|
||||||
#define T_CACHE_SIZE (8192 * 2)
|
#define T_CACHE_SIZE (1) /*(8192 * 2)*/
|
||||||
|
|
||||||
/* maximum number of bytes a message can contain */
|
/* maximum number of bytes a message can contain */
|
||||||
#ifdef T_SEND_TIME
|
#ifdef T_SEND_TIME
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ int background_system(char *command)
|
|||||||
|
|
||||||
void start_background_system(void)
|
void start_background_system(void)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
int p[2];
|
int p[2];
|
||||||
pid_t son;
|
pid_t son;
|
||||||
|
|
||||||
|
|||||||
@@ -2265,7 +2265,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
|
|||||||
y[0] = &yseq0[0];
|
y[0] = &yseq0[0];
|
||||||
y[1] = &yseq1[0];
|
y[1] = &yseq1[0];
|
||||||
|
|
||||||
#if 0
|
#if 1
|
||||||
// reset all bits to <NIL>, here we set <NIL> elements as 2
|
// reset all bits to <NIL>, here we set <NIL> elements as 2
|
||||||
// memset(e, 2, DCI_BITS_MAX);
|
// memset(e, 2, DCI_BITS_MAX);
|
||||||
// here we interpret NIL as a random QPSK sequence. That makes power estimation easier.
|
// here we interpret NIL as a random QPSK sequence. That makes power estimation easier.
|
||||||
@@ -2276,7 +2276,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
|
|||||||
/* clear all bits, the above code may generate too much false detections
|
/* clear all bits, the above code may generate too much false detections
|
||||||
* (not sure about this, to be checked somehow)
|
* (not sure about this, to be checked somehow)
|
||||||
*/
|
*/
|
||||||
memset(e, 0, DCI_BITS_MAX);
|
//memset(e, 0, DCI_BITS_MAX);
|
||||||
|
|
||||||
e_ptr = e;
|
e_ptr = e;
|
||||||
|
|
||||||
@@ -2298,6 +2298,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (dci_alloc[i].firstCCE>=0) {
|
if (dci_alloc[i].firstCCE>=0) {
|
||||||
|
//printf("generate DCI .%d rnti %d length %d\n", subframe, dci_alloc[i].rnti, dci_alloc[i].dci_length);
|
||||||
e_ptr = generate_dci0(dci_alloc[i].dci_pdu,
|
e_ptr = generate_dci0(dci_alloc[i].dci_pdu,
|
||||||
e+(72*dci_alloc[i].firstCCE),
|
e+(72*dci_alloc[i].firstCCE),
|
||||||
dci_alloc[i].dci_length,
|
dci_alloc[i].dci_length,
|
||||||
|
|||||||
@@ -2183,6 +2183,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//printf("DCI %d.%d rnti %d harq %d TBS %d\n", frame, subframe, rel8->rnti, rel8->harq_process, dlsch0_harq->TBS);
|
||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
if (dlsch0->active)
|
if (dlsch0->active)
|
||||||
T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame), T_INT(subframe),
|
T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame), T_INT(subframe),
|
||||||
|
|||||||
@@ -646,9 +646,9 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(C >= 8 && get_nprocs()>8 && codingw)//one main three worker
|
if(C >= 8 && get_nprocs()>=16 && codingw)//one main three worker
|
||||||
{
|
{
|
||||||
encoding_return =
|
encoding_return =
|
||||||
dlsch_encoding_2threads(eNB,
|
dlsch_encoding_2threads(eNB,
|
||||||
a,
|
a,
|
||||||
num_pdcch_symbols,
|
num_pdcch_symbols,
|
||||||
@@ -663,8 +663,8 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
|
|||||||
te_wakeup_stats1,
|
te_wakeup_stats1,
|
||||||
i_stats,
|
i_stats,
|
||||||
3);
|
3);
|
||||||
}
|
}
|
||||||
else if(C >= 6 && get_nprocs()>=6 && codingw)//one main two worker
|
else if(C >= 6 && get_nprocs()>=8 && codingw)//one main two worker
|
||||||
{
|
{
|
||||||
encoding_return =
|
encoding_return =
|
||||||
dlsch_encoding_2threads(eNB,
|
dlsch_encoding_2threads(eNB,
|
||||||
|
|||||||
@@ -794,11 +794,11 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
|
|||||||
int ulsch_decoding_data_all(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
|
int ulsch_decoding_data_all(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if(codingw)
|
/*if(codingw)
|
||||||
{
|
{
|
||||||
ret = ulsch_decoding_data_2thread(eNB,UE_id,harq_pid,llr8_flag);
|
ret = ulsch_decoding_data_2thread(eNB,UE_id,harq_pid,llr8_flag);
|
||||||
}
|
}
|
||||||
else
|
else*/
|
||||||
{
|
{
|
||||||
ret = ulsch_decoding_data(eNB,UE_id,harq_pid,llr8_flag);
|
ret = ulsch_decoding_data(eNB,UE_id,harq_pid,llr8_flag);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,8 +201,9 @@ void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_pr
|
|||||||
dlsch0_harq->pdsch_start = eNB->pdcch_vars[subframe & 1].num_pdcch_symbols;
|
dlsch0_harq->pdsch_start = eNB->pdcch_vars[subframe & 1].num_pdcch_symbols;
|
||||||
|
|
||||||
if (dlsch0_harq->round==0) { //get pointer to SDU if this a new SDU
|
if (dlsch0_harq->round==0) { //get pointer to SDU if this a new SDU
|
||||||
AssertFatal(sdu!=NULL,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n",
|
//if (sdu==NULL) printf("dlsch0_harq %p harq %d\n", dlsch0_harq, harq_pid);
|
||||||
frame,subframe,
|
AssertFatal(sdu!=NULL,"sdu==%d, NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n",
|
||||||
|
*sdu,frame,subframe,
|
||||||
proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
|
proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
|
||||||
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start);
|
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start);
|
||||||
if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n",
|
if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n",
|
||||||
|
|||||||
@@ -359,6 +359,11 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
|
|||||||
&eNB->dlsch_turbo_encoding_wakeup_stats1,
|
&eNB->dlsch_turbo_encoding_wakeup_stats1,
|
||||||
&eNB->dlsch_interleaving_stats);
|
&eNB->dlsch_interleaving_stats);
|
||||||
stop_meas(&eNB->dlsch_encoding_stats);
|
stop_meas(&eNB->dlsch_encoding_stats);
|
||||||
|
//////////////////////////////////////////////////*******************************************
|
||||||
|
if(eNB->dlsch_encoding_stats.diff_now>500*3000 && opp_enabled == 1)
|
||||||
|
{
|
||||||
|
print_meas_now(&eNB->dlsch_encoding_stats,"total coding",stderr);
|
||||||
|
}
|
||||||
// 36-211
|
// 36-211
|
||||||
start_meas(&eNB->dlsch_scrambling_stats);
|
start_meas(&eNB->dlsch_scrambling_stats);
|
||||||
dlsch_scrambling(fp,
|
dlsch_scrambling(fp,
|
||||||
@@ -394,6 +399,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
|
|||||||
|
|
||||||
dlsch->active = 0;
|
dlsch->active = 0;
|
||||||
dlsch_harq->round++;
|
dlsch_harq->round++;
|
||||||
|
//printf(" dlsch_harq ++ %p %d.%d harq %d rnti %d\n", dlsch_harq, frame, subframe, harq_pid, dlsch->rnti);
|
||||||
|
|
||||||
LOG_D(PHY,"Generating DLSCH/PDSCH dlsch_harq[round:%d]\n",dlsch_harq->round);
|
LOG_D(PHY,"Generating DLSCH/PDSCH dlsch_harq[round:%d]\n",dlsch_harq->round);
|
||||||
}
|
}
|
||||||
@@ -513,7 +519,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
|||||||
//LOG_D(PHY,"Before generate_dci_top num_pdcch_symbols:%d num_dci:%d dci_alloc:dci_length:%d\n", num_pdcch_symbols, num_dci, eNB->pdcch_vars[subframe&1].dci_alloc[0].dci_length);
|
//LOG_D(PHY,"Before generate_dci_top num_pdcch_symbols:%d num_dci:%d dci_alloc:dci_length:%d\n", num_pdcch_symbols, num_dci, eNB->pdcch_vars[subframe&1].dci_alloc[0].dci_length);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
|
||||||
|
//printf("//////////************before generate_dci_top UL %d.%d TX %d.%d \n", ul_frame, ul_subframe, frame, subframe);
|
||||||
if (nfapi_mode == 0 || nfapi_mode == 1) {
|
if (nfapi_mode == 0 || nfapi_mode == 1) {
|
||||||
generate_dci_top(num_pdcch_symbols,
|
generate_dci_top(num_pdcch_symbols,
|
||||||
num_dci,
|
num_dci,
|
||||||
@@ -1641,6 +1647,9 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,
|
|||||||
// release DLSCH if needed
|
// release DLSCH if needed
|
||||||
if (ulsch_harq->o_ACK[i] == 1) release_harq(eNB,UE_id,i,frame,subframe,0xffff);
|
if (ulsch_harq->o_ACK[i] == 1) release_harq(eNB,UE_id,i,frame,subframe,0xffff);
|
||||||
|
|
||||||
|
//if (ulsch_harq->o_ACK[i] != 1)
|
||||||
|
//printf("got NACK %d.%d rnti %d harq %d\n", frame, subframe, rnti, eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10]);
|
||||||
|
|
||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
/* TODO: get correct harq pid */
|
/* TODO: get correct harq pid */
|
||||||
if (ulsch_harq->o_ACK[i] != 1)
|
if (ulsch_harq->o_ACK[i] != 1)
|
||||||
@@ -1735,6 +1744,9 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
|
|||||||
// release DLSCH if needed
|
// release DLSCH if needed
|
||||||
if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff);
|
if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff);
|
||||||
|
|
||||||
|
//if (harq_ack[0] != 1)
|
||||||
|
//printf("got NACK %d.%d rnti %d harq %d\n", frame, subframe, uci->rnti, eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10]);
|
||||||
|
|
||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
if (harq_ack[0] != 1)
|
if (harq_ack[0] != 1)
|
||||||
T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe),
|
T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe),
|
||||||
|
|||||||
@@ -928,7 +928,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
|
|||||||
|
|
||||||
eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP;
|
eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP;
|
||||||
eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
||||||
|
//printf("doing retransmission for fill_nfapi_dlsch_config frame %d subframe %d rnti = %d harq_pid = %d\n", frameP, subframeP, rnti, harq_pid);
|
||||||
fill_nfapi_dlsch_config(eNB, dl_req, TBS, -1
|
fill_nfapi_dlsch_config(eNB, dl_req, TBS, -1
|
||||||
/* retransmission, no pdu_index */
|
/* retransmission, no pdu_index */
|
||||||
, rnti, 0, // type 0 allocation from 7.1.6 in 36.213
|
, rnti, 0, // type 0 allocation from 7.1.6 in 36.213
|
||||||
@@ -1455,7 +1455,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
|
|||||||
"physicalConfigDedicated is NULL\n");
|
"physicalConfigDedicated is NULL\n");
|
||||||
AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated != NULL,
|
AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated != NULL,
|
||||||
"physicalConfigDedicated->pdsch_ConfigDedicated is NULL\n");
|
"physicalConfigDedicated->pdsch_ConfigDedicated is NULL\n");
|
||||||
|
//printf("mac DL transmition with frame = %d, subframe = %d, rnti = %d, pdu_index = %p\n", frameP, subframeP, rnti, eNB->pdu_index);
|
||||||
fill_nfapi_dlsch_config(eNB, dl_req, TBS, eNB->pdu_index[CC_id], rnti, 0, // type 0 allocation from 7.1.6 in 36.213
|
fill_nfapi_dlsch_config(eNB, dl_req, TBS, eNB->pdu_index[CC_id], rnti, 0, // type 0 allocation from 7.1.6 in 36.213
|
||||||
0, // virtual_resource_block_assignment_flag, unused here
|
0, // virtual_resource_block_assignment_flag, unused here
|
||||||
0, // resource_block_coding, to be filled in later
|
0, // resource_block_coding, to be filled in later
|
||||||
|
|||||||
+30
-33
@@ -224,6 +224,12 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
|||||||
}
|
}
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 );
|
||||||
|
|
||||||
|
if(wait_on_condition(&proc[1].mutex_rxtx,&proc[1].cond_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) {
|
||||||
|
LOG_E(PHY,"Frame %d, subframe %d: TX1 not ready\n",proc[1].frame_rx,proc[1].subframe_rx);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
if (release_thread(&proc[1].mutex_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) return(-1);
|
||||||
|
|
||||||
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
pthread_mutex_lock(&eNB->UL_INFO_mutex);
|
||||||
|
|
||||||
eNB->UL_INFO.frame = proc->frame_rx;
|
eNB->UL_INFO.frame = proc->frame_rx;
|
||||||
@@ -237,17 +243,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
|||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 );
|
||||||
if(oai_exit) return(-1);
|
if(oai_exit) return(-1);
|
||||||
if(get_nprocs() >= 8){
|
if(get_nprocs() <= 4) phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
|
||||||
wakeup_tx(eNB,eNB->proc.ru_proc);
|
|
||||||
}
|
|
||||||
else if(get_nprocs() >= 4){
|
|
||||||
|
|
||||||
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
|
|
||||||
wakeup_txfh(proc,eNB->proc.ru_proc);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
stop_meas( &softmodem_stats_rxtx_sf );
|
stop_meas( &softmodem_stats_rxtx_sf );
|
||||||
@@ -314,14 +310,6 @@ static void* tx_thread(void* param) {
|
|||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
|
|
||||||
pthread_mutex_lock( &proc->mutex_rxtx );
|
|
||||||
proc->pipe_ready++;
|
|
||||||
// the thread can now be woken up
|
|
||||||
if (pthread_cond_signal(&proc->cond_rxtx) != 0) {
|
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock( &proc->mutex_rxtx );
|
|
||||||
|
|
||||||
if (wait_on_condition(&proc->mutex_rxtx,&proc->cond_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
if (wait_on_condition(&proc->mutex_rxtx,&proc->cond_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
||||||
if (oai_exit) break;
|
if (oai_exit) break;
|
||||||
@@ -336,8 +324,16 @@ static void* tx_thread(void* param) {
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB,proc->frame_rx);
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB,proc->frame_rx);
|
||||||
|
|
||||||
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
|
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
|
||||||
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
||||||
|
|
||||||
|
pthread_mutex_lock( &proc->mutex_rxtx );
|
||||||
|
proc->pipe_ready++;
|
||||||
|
// the thread can now be woken up
|
||||||
|
if (pthread_cond_signal(&proc->cond_rxtx) != 0) {
|
||||||
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
||||||
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock( &proc->mutex_rxtx );
|
||||||
wakeup_txfh(proc,eNB_proc->ru_proc);
|
wakeup_txfh(proc,eNB_proc->ru_proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,14 +372,6 @@ static void* eNB_thread_rxtx( void* param ) {
|
|||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
|
|
||||||
pthread_mutex_lock( &proc->mutex_rxtx );
|
|
||||||
proc->pipe_ready++;
|
|
||||||
// the thread can now be woken up
|
|
||||||
if (pthread_cond_signal(&proc->cond_rxtx) != 0) {
|
|
||||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock( &proc->mutex_rxtx );
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 );
|
||||||
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx));
|
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx));
|
||||||
@@ -407,6 +395,20 @@ static void* eNB_thread_rxtx( void* param ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
|
||||||
|
pthread_mutex_lock( &proc->mutex_rxtx );
|
||||||
|
proc->pipe_ready++;
|
||||||
|
// the thread can now be woken up
|
||||||
|
if (pthread_cond_signal(&proc->cond_rxtx) != 0) {
|
||||||
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread\n");
|
||||||
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock( &proc->mutex_rxtx );
|
||||||
|
if(get_nprocs() >= 8) wakeup_tx(eNB,eNB->proc.ru_proc);
|
||||||
|
else if(get_nprocs() > 4)
|
||||||
|
{
|
||||||
|
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
|
||||||
|
wakeup_txfh(proc,eNB->proc.ru_proc);
|
||||||
|
}
|
||||||
|
|
||||||
} // while !oai_exit
|
} // while !oai_exit
|
||||||
|
|
||||||
@@ -521,11 +523,6 @@ int wakeup_tx(PHY_VARS_eNB *eNB,RU_proc_t *ru_proc) {
|
|||||||
wait.tv_nsec=5000000L;
|
wait.tv_nsec=5000000L;
|
||||||
|
|
||||||
|
|
||||||
if(wait_on_condition(&proc_rxtx1->mutex_rxtx,&proc_rxtx1->cond_rxtx,&proc_rxtx1->pipe_ready,"wakeup_tx")<0) {
|
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: TX1 not ready\n",proc_rxtx1->frame_rx,proc_rxtx1->subframe_rx);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
if (release_thread(&proc_rxtx1->mutex_rxtx,&proc_rxtx1->pipe_ready,"wakeup_tx")<0) return(-1);
|
|
||||||
|
|
||||||
if (proc_rxtx1->instance_cnt_rxtx == 0) {
|
if (proc_rxtx1->instance_cnt_rxtx == 0) {
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: TX1 thread busy, dropping\n",proc_rxtx1->frame_rx,proc_rxtx1->subframe_rx);
|
LOG_E(PHY,"Frame %d, subframe %d: TX1 thread busy, dropping\n",proc_rxtx1->frame_rx,proc_rxtx1->subframe_rx);
|
||||||
|
|||||||
@@ -1181,7 +1181,7 @@ void wakeup_eNBs(RU_t *ru) {
|
|||||||
LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top);
|
LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top);
|
||||||
|
|
||||||
|
|
||||||
if (ru->num_eNB==1 && ru->eNB_top!=0 && get_nprocs() < 4) {
|
if (ru->num_eNB==1 && ru->eNB_top!=0 && get_nprocs() <= 4) {
|
||||||
// call eNB function directly
|
// call eNB function directly
|
||||||
|
|
||||||
char string[20];
|
char string[20];
|
||||||
@@ -1556,9 +1556,13 @@ static void* ru_thread( void* param ) {
|
|||||||
pthread_cond_signal(&RC.ru_cond);
|
pthread_cond_signal(&RC.ru_cond);
|
||||||
pthread_mutex_unlock(&RC.ru_mutex);
|
pthread_mutex_unlock(&RC.ru_mutex);
|
||||||
|
|
||||||
wait_sync("ru_thread");
|
|
||||||
|
|
||||||
|
pthread_mutex_lock(&proc->mutex_FH1);
|
||||||
|
proc->instance_cnt_FH1 = 0;
|
||||||
|
pthread_mutex_unlock(&proc->mutex_FH1);
|
||||||
|
pthread_cond_signal(&proc->cond_FH1);
|
||||||
|
|
||||||
|
wait_sync("ru_thread");
|
||||||
|
|
||||||
if(!emulate_rf){
|
if(!emulate_rf){
|
||||||
// Start RF device if any
|
// Start RF device if any
|
||||||
@@ -1584,10 +1588,7 @@ static void* ru_thread( void* param ) {
|
|||||||
if ((ru->is_slave) && (ru->if_south == LOCAL_RF)) do_ru_synch(ru);
|
if ((ru->is_slave) && (ru->if_south == LOCAL_RF)) do_ru_synch(ru);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&proc->mutex_FH1);
|
|
||||||
proc->instance_cnt_FH1 = 0;
|
|
||||||
pthread_mutex_unlock(&proc->mutex_FH1);
|
|
||||||
pthread_cond_signal(&proc->cond_FH1);
|
|
||||||
|
|
||||||
|
|
||||||
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
|
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
|
||||||
@@ -1645,7 +1646,7 @@ static void* ru_thread( void* param ) {
|
|||||||
// wakeup all eNB processes waiting for this RU
|
// wakeup all eNB processes waiting for this RU
|
||||||
if (ru->num_eNB>0) wakeup_eNBs(ru);
|
if (ru->num_eNB>0) wakeup_eNBs(ru);
|
||||||
|
|
||||||
if(get_nprocs() < 4){
|
if(get_nprocs() <= 4){
|
||||||
// do TX front-end processing if needed (precoding and/or IDFTs)
|
// do TX front-end processing if needed (precoding and/or IDFTs)
|
||||||
if (ru->feptx_prec) ru->feptx_prec(ru);
|
if (ru->feptx_prec) ru->feptx_prec(ru);
|
||||||
|
|
||||||
@@ -1859,7 +1860,7 @@ void init_RU_proc(RU_t *ru) {
|
|||||||
if(emulate_rf)
|
if(emulate_rf)
|
||||||
pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
|
pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
|
||||||
|
|
||||||
if (get_nprocs() >= 4)
|
if (get_nprocs() > 4)
|
||||||
pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
|
pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
|
||||||
|
|
||||||
if (ru->function == NGFI_RRU_IF4p5) {
|
if (ru->function == NGFI_RRU_IF4p5) {
|
||||||
|
|||||||
Reference in New Issue
Block a user