From ca2c8357c9f3496e102aa4fb4825d8d9b25c3099 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Wed, 19 Apr 2017 02:51:15 +0200
Subject: [PATCH] vcd for rru/rau. bug fixing on fronthaul interfaces

---
 openair1/SCHED/ru_procedures.c        | 12 +++----
 openair2/UTIL/LOG/vcd_signal_dumper.c |  6 +++-
 openair2/UTIL/LOG/vcd_signal_dumper.h |  6 +++-
 targets/RT/USER/lte-ru.c              | 51 ++++++++++++++++-----------
 targets/SIMU/USER/channel_sim.c       |  5 ++-
 5 files changed, 49 insertions(+), 31 deletions(-)

diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c
index fe77dbbfc0..66331cc71f 100644
--- a/openair1/SCHED/ru_procedures.c
+++ b/openair1/SCHED/ru_procedures.c
@@ -73,7 +73,7 @@ void feptx_ofdm(RU_t *ru) {
 
 //  int CC_id = ru->proc.CC_id;
 
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 );
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 );
 
   //  slot_offset_F = (subframe<<1)*slot_sizeF;
 
@@ -189,7 +189,7 @@ void feptx_ofdm(RU_t *ru) {
 	   dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF)));
     }
   }
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 );
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 );
 }
 
 void feptx_prec(RU_t *ru) {
@@ -216,7 +216,7 @@ void feptx_prec(RU_t *ru) {
 		       aa);
       }
     }
-    LOG_I(PHY,"feptx_prec: frame %d, subframe %d: txp (freq) %d dB\n",
+    LOG_D(PHY,"feptx_prec: frame %d, subframe %d: txp (freq) %d dB\n",
 	  ru->proc.frame_tx,subframe,
 	  dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[0],2*fp->symbols_per_tti*fp->ofdm_symbol_size)));
   }
@@ -294,7 +294,6 @@ void ru_fep_full_2thread(RU_t *ru) {
   wait.tv_sec=0;
   wait.tv_nsec=5000000L;
 
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1);
   start_meas(&ru->ofdm_demod_stats);
 
   if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) {
@@ -339,7 +338,6 @@ void fep_full(RU_t *ru) {
 
   start_meas(&ru->ofdm_demod_stats);
 
-  if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1);
 
   remove_7_5_kHz(ru,proc->subframe_rx<<1);
   remove_7_5_kHz(ru,1+(proc->subframe_rx<<1));
@@ -359,7 +357,6 @@ void fep_full(RU_t *ru) {
   }
   stop_meas(&ru->ofdm_demod_stats);
   
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0);
   
 }
 
@@ -371,7 +368,7 @@ void do_prach_ru(RU_t *ru) {
 
   // check if we have to detect PRACH first
   if (is_prach_subframe(fp,proc->frame_prach,proc->subframe_prach)>0) { 
-    /* accept some delay in processing - up to 5ms */
+    //accept some delay in processing - up to 5ms
     int i;
     for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) {
       LOG_W(PHY,"Frame %d Subframe %d, PRACH thread busy (IC %d)!!\n", proc->frame_prach,proc->subframe_prach,
@@ -403,3 +400,4 @@ void do_prach_ru(RU_t *ru) {
   }
 
 }
+
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 8f7c83673f..1e415d1b60 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -240,9 +240,12 @@ const char* eurecomFunctionsNames[] = {
   "phy_procedures_eNb_tx1",
   "phy_procedures_ru_feprx0",
   "phy_procedures_ru_feprx1",
+  "phy_procedures_ru_feptx_ofdm0",
+  "phy_procedures_ru_feptx_ofdm1",
+  "phy_procedures_ru_feptx_prec0",
+  "phy_procedures_ru_feptx_prec1",
   "phy_procedures_eNb_rx_uespec0",
   "phy_procedures_eNb_rx_uespec1",
-  "phy_eNB_slot_fep",
   "phy_procedures_ue_tx",
   "phy_procedures_ue_rx",
   "phy_procedures_ue_tx_ulsch_uespec",
@@ -292,6 +295,7 @@ const char* eurecomFunctionsNames[] = {
   "phy_enb_ulsch_decoding7",
   "phy_enb_sfgen",
   "phy_enb_prach_rx",
+  "phy_ru_prach_rx",
   "phy_enb_pdcch_tx",
   "phy_enb_rs_tx",
   "phy_ue_generate_prach",
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index fdd590a7b7..925fdd9333 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -214,9 +214,12 @@ typedef enum {
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX1,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX1,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM1,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC1,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC1,
-  VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,
@@ -266,6 +269,7 @@ typedef enum {
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING7,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,
   VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH,
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 2696df5db4..e7328c549d 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -137,7 +137,7 @@ static inline void fh_if5_mobipass_south_out(RU_t *ru) {
 // southbound IF4p5 fronthaul
 static inline void fh_if4p5_south_out(RU_t *ru) {
   if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
-  LOG_I(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.subframe_tx);
+  LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.subframe_tx);
   send_IF4p5(ru,ru->proc.frame_tx, ru->proc.subframe_tx, IF4p5_PDLFFT, 0);
 }
 
@@ -206,12 +206,9 @@ void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) {
       if ((proc->first_rx==0) && (sf!=*subframe)) 	
 	LOG_E(PHY,"rx_fh_if4p5: PULTICK received subframe %d != expected %d (first_rx %d)\n",sf,*subframe,proc->first_rx);       
       break;     
+      
     } else if (packet_type == IF4p5_PRACH) {
-      if (ru->do_prach==1) {
-	proc->subframe_prach = sf;
-	proc->frame_prach    = f;
-	do_prach_ru(ru);
-      }
+      // nothing in RU for RAU
     }
 
   } while(proc->symbol_mask[*subframe] != symbol_mask_full);    
@@ -453,7 +450,14 @@ void fh_if4p5_north_asynch_in(RU_t *ru,int *frame,int *subframe) {
   } while (symbol_mask != symbol_mask_full);    
 
   proc->subframe_tx = subframe_tx;
+  proc->frame_tx    = frame_tx;
 
+    // dump VCD output for first RU in list
+  if (ru == RC.ru[0]) {
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame_tx );
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_RU, subframe_tx );
+  }
+  
   if (ru->feptx_ofdm) ru->feptx_ofdm(ru);
   if (ru->fh_south_out) ru->fh_south_out(ru);
 } 
@@ -527,6 +531,11 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
   proc->subframe_tx  = (proc->subframe_rx+4)%10;
   proc->frame_tx     = (proc->subframe_rx>5) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
 
+    // dump VCD output for first RU in list
+  if (ru == RC.ru[0]) {
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_RU, proc->frame_rx );
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_RU, proc->subframe_rx );
+  }
   
   if (proc->first_rx == 0) {
     if (proc->subframe_rx != *subframe){
@@ -631,7 +640,7 @@ static void* ru_thread_asynch_rxtx( void* param ) {
     } else {
       subframe++;
     }      
-    LOG_I(PHY,"ru_thread_asynch_rxtx: Waiting on incoming fronthaul\n");
+    LOG_D(PHY,"ru_thread_asynch_rxtx: Waiting on incoming fronthaul\n");
     // asynchronous receive from south (Mobipass)
     if (ru->fh_south_asynch_in) ru->fh_south_asynch_in(ru,&frame,&subframe);
     // asynchronous receive from north (RRU IF4/IF5)
@@ -707,15 +716,15 @@ static void* ru_thread_prach( void* param ) {
   while (!oai_exit) {
     
     if (oai_exit) break;
-
     if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break;
-    
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 );      
     rx_prach(NULL,
 	     ru,
              NULL,
              NULL,
              proc->frame_prach,
              0);
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0 );      
     if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break;
   }
 
@@ -857,17 +866,15 @@ static inline int wakeup_prach(RU_t *ru) {
     exit_fun( "error locking mutex_rxtx" );
     return(-1);
   }
-  ++ru->proc.instance_cnt_prach;
-  ru->proc.frame_prach    = ru->proc.frame_rx;
-  ru->proc.subframe_prach = ru->proc.subframe_rx;
-  
-  // the thread can now be woken up
-  if (pthread_cond_signal(&ru->proc.cond_prach) != 0) {
-    LOG_E( PHY, "[RU] ERROR pthread_cond_signal for RU prach thread\n");
-    exit_fun( "ERROR pthread_cond_signal" );
-    return(-1);
+  if (ru->proc.instance_cnt_prach==-1) {
+    ++ru->proc.instance_cnt_prach;
+    ru->proc.frame_prach    = ru->proc.frame_rx;
+    ru->proc.subframe_prach = ru->proc.subframe_rx;
+    
+    // the thread can now be woken up
+    AssertFatal(pthread_cond_signal(&ru->proc.cond_prach) == 0, "ERROR pthread_cond_signal for RU prach thread\n");
   }
-  
+  else LOG_W(PHY,"RU prach thread busy, skipping\n");
   pthread_mutex_unlock( &ru->proc.mutex_prach );
 
   return(0);
@@ -956,8 +963,10 @@ static void* ru_thread( void* param ) {
     else AssertFatal(1==0, "No fronthaul interface at south port");
 
 
-    LOG_D(PHY,"RU thread (proc %p), received frame %d (%p), subframe %d (%p)\n",
-	  proc, proc->frame_tx,&frame,subframe,&subframe);
+    LOG_D(PHY,"RU thread (do_prach %d, is_prach_subframe %d), received frame %d, subframe %d \n",
+	  ru->do_prach,
+	  is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx),
+	  proc->frame_rx,proc->subframe_rx);
  
     if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0))
       wakeup_prach(ru);
diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c
index 52a8f9732f..101170df7c 100644
--- a/targets/SIMU/USER/channel_sim.c
+++ b/targets/SIMU/USER/channel_sim.c
@@ -251,7 +251,10 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
                               frame_parms->N_RB_DL*12);
 
 #ifdef DEBUG_SIM
-      LOG_D(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n",
+      LOG_I(PHY,"[SIM][DL] subframe %d: txp (time) %d dB\n",
+	    subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],frame_parms->samples_per_tti)));
+	    
+      LOG_I(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n",
             ru_id,CC_id,
             10*log10(tx_pwr),
             frame_parms->pdsch_config_common.referenceSignalPower,
-- 
GitLab