Commit c581eda5 authored by Sandeep Kumar's avatar Sandeep Kumar

eNB tx working

parent 631b4cac
...@@ -604,10 +604,8 @@ static void* eNB_thread_rxtx( void* param ) { ...@@ -604,10 +604,8 @@ static void* eNB_thread_rxtx( void* param ) {
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 );
printf( "Exiting eNB thread RXn_TXnp4\n"); printf( "Exiting eNB thread RXn_TXnp4\n");
eNB_thread_rxtx_status = 0; eNB_thread_rxtx_status = 0;
return &eNB_thread_rxtx_status; return &eNB_thread_rxtx_status;
} }
...@@ -679,7 +677,6 @@ static void* eNB_thread_asynch_rx( void* param ) { ...@@ -679,7 +677,6 @@ static void* eNB_thread_asynch_rx( void* param ) {
prach_rx = 0; prach_rx = 0;
do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );
recv_IF4(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number); recv_IF4(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 );
...@@ -691,9 +688,6 @@ static void* eNB_thread_asynch_rx( void* param ) { ...@@ -691,9 +688,6 @@ static void* eNB_thread_asynch_rx( void* param ) {
// wake up thread for PRACH RX // wake up thread for PRACH RX
prach_rx = 1; prach_rx = 1;
} }
} while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0));
if (proc->first_rx == 0) { if (proc->first_rx == 0) {
...@@ -732,15 +726,11 @@ static void* eNB_thread_FH( void* param ) { ...@@ -732,15 +726,11 @@ static void* eNB_thread_FH( void* param ) {
int i; int i;
int prach_rx; int prach_rx;
uint16_t packet_type; uint16_t packet_type;
uint32_t symbol_number=0; uint32_t symbol_number=0;
uint32_t symbol_mask, symbol_mask_full; uint32_t symbol_mask, symbol_mask_full;
int subframe = proc->subframe_rx; int subframe=0, frame=0;
int frame = proc->frame_rx;
wait.tv_sec=0; wait.tv_sec=0;
wait.tv_nsec=5000000L; wait.tv_nsec=5000000L;
...@@ -835,7 +825,7 @@ static void* eNB_thread_FH( void* param ) { ...@@ -835,7 +825,7 @@ static void* eNB_thread_FH( void* param ) {
exit_fun("Error getting thread priority"); exit_fun("Error getting thread priority");
} }
LOG_I(HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), LOG_I(HW, "[SCHED][eNB] FH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(),
(policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" : (policy == SCHED_OTHER) ? "SCHED_OTHER" :
...@@ -849,7 +839,7 @@ static void* eNB_thread_FH( void* param ) { ...@@ -849,7 +839,7 @@ static void* eNB_thread_FH( void* param ) {
mlockall(MCL_CURRENT | MCL_FUTURE); mlockall(MCL_CURRENT | MCL_FUTURE);
// wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads
printf( "waiting for sync (eNB_thread_rx_common)\n"); printf( "waiting for sync (eNB_thread_FH)\n");
pthread_mutex_lock( &sync_mutex ); pthread_mutex_lock( &sync_mutex );
while (sync_var<0) while (sync_var<0)
...@@ -894,11 +884,10 @@ static void* eNB_thread_FH( void* param ) { ...@@ -894,11 +884,10 @@ static void* eNB_thread_FH( void* param ) {
if (oai_exit) break; if (oai_exit) break;
// This case is for synchronization to another thread
if ((eNB->node_timing == synch_to_other) && if ((eNB->node_timing == synch_to_other) &&
((eNB->node_function == NGFI_RRU_IF4) || ((eNB->node_function == NGFI_RCC_IF4) ||
(eNB->node_function == NGFI_RRU_IF5) || (eNB->node_function == eNodeB_3GPP_BBU))) {
(eNB->node_function == eNodeB_3GPP))) { // This case is for synchronization to another thread
//wait for event //wait for event
// how long should we wait here, for MOBIPASS this could be long // how long should we wait here, for MOBIPASS this could be long
...@@ -914,10 +903,8 @@ static void* eNB_thread_FH( void* param ) { ...@@ -914,10 +903,8 @@ static void* eNB_thread_FH( void* param ) {
// proc->instance_cnt_prach is -1 // proc->instance_cnt_prach is -1
pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again
} }
proc->instance_cnt_FH++; proc->instance_cnt_FH++;
} }
// Remaining cases are all for synchronization on FH interface // Remaining cases are all for synchronization on FH interface
else if ((eNB->node_timing == synch_to_ext_device) && else if ((eNB->node_timing == synch_to_ext_device) &&
...@@ -930,7 +917,6 @@ static void* eNB_thread_FH( void* param ) { ...@@ -930,7 +917,6 @@ static void* eNB_thread_FH( void* param ) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
// sanitycheck
if (subframe==9) { if (subframe==9) {
subframe=0; subframe=0;
frame++; frame++;
...@@ -944,24 +930,27 @@ static void* eNB_thread_FH( void* param ) { ...@@ -944,24 +930,27 @@ static void* eNB_thread_FH( void* param ) {
rxp, rxp,
fp->samples_per_tti, fp->samples_per_tti,
fp->nb_antennas_rx); fp->nb_antennas_rx);
proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023;
proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10;
if (proc->first_rx == 0) { if (proc->first_rx == 0) {
if (proc->subframe_rx != subframe){ if (proc->subframe_rx != subframe){
LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe);
exit_fun("Exiting"); exit_fun("Exiting");
} }
if (proc->frame_rx != frame) { if (proc->frame_rx != frame) {
LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame);
exit_fun("Exiting"); exit_fun("Exiting");
} }
} else { } else {
proc->first_rx = 0; proc->first_rx = 0;
frame = proc->frame_rx;
subframe = proc->subframe_rx;
} }
// printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx );
...@@ -986,11 +975,12 @@ static void* eNB_thread_FH( void* param ) { ...@@ -986,11 +975,12 @@ static void* eNB_thread_FH( void* param ) {
if (proc->first_rx == 0) { if (proc->first_rx == 0) {
if (proc->subframe_rx != subframe){ if (proc->subframe_rx != subframe){
LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe);
//exit_fun("Exiting"); exit_fun("Exiting");
} }
if (proc->frame_rx != frame) { if (proc->frame_rx != frame) {
LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame);
//exit_fun("Exiting"); exit_fun("Exiting");
} }
} else { } else {
proc->first_rx = 0; proc->first_rx = 0;
...@@ -999,13 +989,12 @@ static void* eNB_thread_FH( void* param ) { ...@@ -999,13 +989,12 @@ static void* eNB_thread_FH( void* param ) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx );
} // eNodeB_3GPP_BBU && node_timing == synch_to_ext_device
} // eNodeB_3GPP_BBU && node_timing == synch_to_ext_device
else if ((eNB->node_timing == synch_to_ext_device) && else if ((eNB->node_timing == synch_to_ext_device) &&
(eNB->node_function == NGFI_RCC_IF4)) { (eNB->node_function == NGFI_RCC_IF4)) {
/// **** recv_IF4 of rxdataF from RRU **** /// /// **** recv_IF4 of rxdataF from RRU **** ///
/// **** recv_IF4 of rxsigF from RRU **** /// /// **** recv_IF4 of rxsigF from RRU **** ///
// get frame/subframe information from IF4 interface
// timed loop (200 us) // timed loop (200 us)
symbol_number = 0; symbol_number = 0;
...@@ -1014,7 +1003,6 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1014,7 +1003,6 @@ static void* eNB_thread_FH( void* param ) {
prach_rx = 0; prach_rx = 0;
do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );
recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 );
...@@ -1026,9 +1014,6 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1026,9 +1014,6 @@ static void* eNB_thread_FH( void* param ) {
// wake up thread for PRACH RX // wake up thread for PRACH RX
prach_rx = 1; prach_rx = 1;
} }
} while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0));
if (proc->first_rx == 0) { if (proc->first_rx == 0) {
...@@ -1048,7 +1033,6 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1048,7 +1033,6 @@ static void* eNB_thread_FH( void* param ) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx );
} // node_timing == synch_to_externs, node_function = NGFI_IF4 } // node_timing == synch_to_externs, node_function = NGFI_IF4
else { // should not get here else { // should not get here
AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function);
...@@ -1065,6 +1049,7 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1065,6 +1049,7 @@ static void* eNB_thread_FH( void* param ) {
exit_fun( "error locking mutex_rxtx" ); exit_fun( "error locking mutex_rxtx" );
break; break;
} }
int cnt_slave = ++slave_proc->instance_cnt_FH; int cnt_slave = ++slave_proc->instance_cnt_FH;
slave_proc->frame_rx = proc->frame_rx; slave_proc->frame_rx = proc->frame_rx;
slave_proc->subframe_rx = proc->subframe_rx; slave_proc->subframe_rx = proc->subframe_rx;
...@@ -1102,7 +1087,7 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1102,7 +1087,7 @@ static void* eNB_thread_FH( void* param ) {
// We have just received and processed the common part of a subframe, say n. // We have just received and processed the common part of a subframe, say n.
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
// transmitted timestamp of the next TX slot (first). // transmitted timestamp of the next TX slot (first).
// The last (TS_rx mod samples_pexr_frame) was n*samples_per_tti, // The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
// we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti,
// and proc->subframe_tx = proc->subframe_rx+3 // and proc->subframe_tx = proc->subframe_rx+3
proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti);
...@@ -1126,11 +1111,10 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1126,11 +1111,10 @@ static void* eNB_thread_FH( void* param ) {
break; break;
} }
stop_meas( &softmodem_stats_rxtx_sf ); stop_meas( &softmodem_stats_rxtx_sf );
#ifdef DEADLINE_SCHEDULER #ifdef DEADLINE_SCHEDULER
if (opp_enabled){ if (opp_enabled){
if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0);
} }
} }
...@@ -1153,7 +1137,6 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1153,7 +1137,6 @@ static void* eNB_thread_FH( void* param ) {
printf( "Exiting FH thread \n"); printf( "Exiting FH thread \n");
eNB_thread_FH_status = 0; eNB_thread_FH_status = 0;
return &eNB_thread_FH_status; return &eNB_thread_FH_status;
} }
...@@ -1167,8 +1150,6 @@ static void* eNB_thread_FH( void* param ) { ...@@ -1167,8 +1150,6 @@ static void* eNB_thread_FH( void* param ) {
static void* eNB_thread_prach( void* param ) { static void* eNB_thread_prach( void* param ) {
static int eNB_thread_prach_status; static int eNB_thread_prach_status;
eNB_proc_t *proc = (eNB_proc_t*)param; eNB_proc_t *proc = (eNB_proc_t*)param;
PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id]; PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id];
...@@ -1315,10 +1296,8 @@ static void* eNB_thread_prach( void* param ) { ...@@ -1315,10 +1296,8 @@ static void* eNB_thread_prach( void* param ) {
} }
} }
printf( "Exiting eNB thread PRACH\n"); printf( "Exiting eNB thread PRACH\n");
eNB_thread_prach_status = 0; eNB_thread_prach_status = 0;
return &eNB_thread_prach_status; return &eNB_thread_prach_status;
} }
......
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