From 75baa396cbd1eb4dab6211898abfb7ea404243bb Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Fri, 6 Feb 2015 13:31:03 +0000
Subject: [PATCH] Rework of UE in lte-softmodem.c for ExpressMIMO2 target

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6484 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair1/PHY/LTE_TRANSPORT/prach.c            |   2 +-
 openair1/PHY/defs.h                           |   1 +
 openair1/SCHED/phy_procedures_lte_ue.c        |  81 +-
 openair2/LAYER2/MAC/ue_procedures.c           |   2 +-
 openair2/UTIL/LOG/vcd_signal_dumper.c         |  11 +-
 openair2/UTIL/LOG/vcd_signal_dumper.h         |  11 +-
 .../CONF/enb.band13.exmimo2.conf              |   4 +-
 .../GENERIC-LTE-EPC/CONF/enb.band39.conf      |   2 +-
 .../CONF/enb.band39.tm1.exmimo2.conf          | 143 ---
 .../CONF/enb.band7.tm1.exmimo2.conf           |   6 +-
 targets/RT/USER/Makefile                      |   2 +-
 targets/RT/USER/lte-softmodem.c               | 842 +++++++++++-------
 targets/RT/USER/sched_rx_pdsch.c              |   2 +-
 targets/RT/USER/ue.gtkw                       |  26 +-
 targets/RT/USER/ue_exmimo2.gtkw               |  14 +-
 15 files changed, 611 insertions(+), 538 deletions(-)
 delete mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.exmimo2.conf

diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index e4689fb2f9..1e49475c7e 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -45,7 +45,7 @@
 #include "SCHED/extern.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
-//#define PRACH_DEBUG 1
+#define PRACH_DEBUG 1
 
 uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419};
 uint16_t NCS_restricted[15]   = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 297cc28467..c882f749f4 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -403,6 +403,7 @@ typedef struct
   uint8_t Mod_id;
   uint8_t CC_id;
   uint8_t local_flag;
+  int is_synchronized;
   int instance_cnt_tx;
   int instance_cnt_rx;
   int instance_cnt_synch;
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 3259b8910d..a26b7f1a06 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -624,7 +624,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
   int8_t Po_PUCCH;
   int32_t ulsch_start=0;
 #ifdef EXMIMO
-  int ulsch_end=0,overflow=0;
+  int overflow=0;
   int k,l;
 #endif
   int slot_tx = phy_vars_ue->slot_tx;
@@ -637,6 +637,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 #endif
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
+
   start_meas(&phy_vars_ue->phy_proc_tx);
 
 #ifdef EMOS
@@ -649,7 +650,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
     if ((abstraction_flag==0)) {      
       for (aa=0;aa<frame_parms->nb_antennas_tx;aa++){
 	memset(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti],
-	       0,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t));
+	       0,
+	       frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t));
       }
     }
 
@@ -1180,18 +1182,19 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 #endif // end CBA
 
       if (abstraction_flag == 0) {
-	if (generate_ul_signal == 1 ) {
-	  
-	  nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
-
+	nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
+	
 #ifdef EXMIMO //this is the EXPRESS MIMO case
 	ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-openair_daq_vars.timing_advance-phy_vars_ue->timing_advance-phy_vars_ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
 #else //this is the normal case
 	ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-phy_vars_ue->N_TA_offset;
 #endif //else EXMIMO
+	if (generate_ul_signal == 1 ) {
+	  
 
-	start_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
-	for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+	  
+	  start_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
+	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
 	    if (frame_parms->Ncp == 1) 
 	      PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
 #ifdef EXMIMO
@@ -1214,18 +1217,18 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 #endif
 				nsymb,
 				&phy_vars_ue->lte_frame_parms);
-
+	    
 	    /*
-	    if (subframe_tx == 8) {
+	      if (subframe_tx == 8) {
 	      printf("Symbol 0 %p (offset %d) base %p\n", 
-		     &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe],
-		     nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe,
-		     phy_vars_ue->lte_ue_common_vars.txdataF[0]);
+	      &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe],
+	      nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe,
+	      phy_vars_ue->lte_ue_common_vars.txdataF[0]);
 	      write_output("txsigF8.m","txsF8", &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe],
-			   phy_vars_ue->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);	      
+	      phy_vars_ue->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);	      
 	      write_output("txsig8.m","txs8", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe],
-			   phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);	      
-	    }
+	      phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);	      
+	      }
 	    */
 #ifndef OFDMA_ULSCH
 #ifdef EXMIMO
@@ -1236,13 +1239,13 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 	    apply_7_5_kHz(phy_vars_ue,&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],1);
 #endif
 	    /*
-	    if (subframe_tx == 8) {
+	      if (subframe_tx == 8) {
 	      write_output("txsig8_mod.m","txs8_mod", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe],
-			   phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);	      
-	    }
+	      phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);	      
+	      }
 	    */
 #endif
-
+	    
 #ifdef EXMIMO
 	    overflow = ulsch_start - 9*frame_parms->samples_per_tti;
 	    //if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow);
@@ -1257,10 +1260,15 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 		((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
 	      }
 #endif
-	  
+	    
 	  } //nb_antennas_tx
-	stop_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
+	  stop_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
 	} // generate_ul_signal == 1
+	else {  // no uplink so clear signal buffer instead
+	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+	    memset(&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2);
+	  }
+	}
       } 
     } // mode != PRACH
     //  }// slot_tx is even
@@ -1319,9 +1327,11 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 #else
 	    phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP;
 #endif
-	    start_meas(&phy_vars_ue->tx_prach);
+	    //	    start_meas(&phy_vars_ue->tx_prach);
+	    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
 	    prach_power = generate_prach(phy_vars_ue,eNB_id,subframe_tx,frame_tx);
-	    stop_meas(&phy_vars_ue->tx_prach);
+	    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
+	    //	    stop_meas(&phy_vars_ue->tx_prach);
 	    LOG_D(PHY,"[UE  %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n",
 		  Mod_id,
 		  get_PL(Mod_id,CC_id,eNB_id),
@@ -1394,8 +1404,8 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
   LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
   //  int aa;
 #if defined(EXMIMO) && defined(DRIVER2013)
-  exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr;
-  int aa;
+  //  exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr;
+  //  int aa;
 #endif
   int Mod_id=phy_vars_ue->Mod_id;
   int slot_rx = phy_vars_ue->slot_rx;
@@ -2117,7 +2127,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 	     (dci_alloc_rx[i].format == format1A)) {
       
 #ifdef DEBUG_PHY_PROC
-      LOG_I(PHY,"[UE  %d] subframe %d: Found rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i);
+      LOG_D(PHY,"[UE  %d] subframe %d: Found rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i);
       /*
       if (((frame_rx%100) == 0) || (frame_rx < 20))
 	dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
@@ -2194,7 +2204,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
       else if( (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && 
 	       (dci_alloc_rx[i].format == format0)) {
 #ifdef DEBUG_PHY_PROC
-	LOG_I(PHY,"[UE  %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n",
+	LOG_D(PHY,"[UE  %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n",
 	      phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i);
 	/*
 	  if (((frame_rx%100) == 0) || (frame_rx < 20))
@@ -2332,8 +2342,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 #endif
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
-  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_UE, (slot_rx + 1) % 20);
-  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_UE, frame_rx);
+
 
   start_meas(&phy_vars_ue->phy_proc_rx);
 #ifdef DEBUG_PHY_PROC
@@ -2641,7 +2650,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
       // SI_DLSCH
       if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) {
 #ifdef DEBUG_PHY_PROC
-	LOG_I(PHY,"SI is active in subframe %d\n",subframe_prev);
+	LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev);
 #endif
 	
 	// process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding
@@ -2688,7 +2697,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 		    frame_rx,subframe_prev);
 	    
 #ifdef DEBUG_PHY_PROC
-	    LOG_I(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0],
+	    LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0],
 		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
 		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G,
 		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS);
@@ -2731,7 +2740,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 	  if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) {
 	    phy_vars_ue->dlsch_SI_errors[eNB_id]++;
 #ifdef DEBUG_PHY_PROC
-	    LOG_I(PHY,"[UE  %d] Frame %d, subframe %d, received SI in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev);
+	    LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev);
 #endif
 
 #ifdef USER_MODE
@@ -2746,7 +2755,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 
 #ifdef DEBUG_PHY_PROC
 	    //if ((frame_rx % 100) == 0)
-	    LOG_I(PHY,"[UE  %d] Frame %d, subframe %d, received SI for TBS %d\n",
+	    LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI for TBS %d\n",
 		  phy_vars_ue->Mod_id,frame_rx,subframe_prev,phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS);
 #endif
 
@@ -3609,11 +3618,11 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold
 #endif
 
   if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_UL)||
-      (phy_vars_ue->lte_frame_parms.frame_type == 0)){
+      (phy_vars_ue->lte_frame_parms.frame_type == FDD)){
     phy_procedures_UE_TX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type);
   }
   if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx)==SF_DL) ||
-      (phy_vars_ue->lte_frame_parms.frame_type == 0)){
+      (phy_vars_ue->lte_frame_parms.frame_type == FDD)){
 #ifdef Rel10 
     if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 )
 #endif 
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index c3212fd423..01b84cd019 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -345,7 +345,7 @@ void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frameP,uint8_t *s
 #ifdef DEBUG_HEADER_PARSING
         LOG_D(MAC,"[UE] CE %d : UE Timing Advance : %d\n",i,payload_ptr[0]);
 #endif
-        //mac_xface->process_timing_advance(module_idP,payload_ptr[0]);
+        mac_xface->process_timing_advance(module_idP,CC_id,payload_ptr[0]);
         payload_ptr++;
         break;
       case DRX_CMD:
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 968b6d07c2..79c0a8dc14 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -77,9 +77,15 @@ struct vcd_module_s {
 const char* eurecomVariablesNames[] = {
     "frame_number_TX_eNB",
     "frame_number_RX_eNB",
-    "frame_number_UE",
-    "slot_number_UE",
+    "frame_number_TX_UE",
+    "frame_number_RX_UE",
+    "slot_number_TX_UE",
+    "slot_number_RX_UE",
+    "subframe_number_TX_UE",
+    "subframe_number_RX_UE",
     "daq_mbox",
+    "rx_offset_mbox",
+    "ue_rx_offset",
     "diff2",
     "hw_subframe",
     "hw_frame",
@@ -164,6 +170,7 @@ const char* eurecomFunctionsNames[] = {
     "phy_enb_prach_rx",
     "phy_enb_pdcch_tx",
     "phy_enb_rs_tx",
+    "phy_ue_generate_prach",
     "phy_ue_ulsch_modulation",
     "phy_ue_ulsch_encoding",
     "phy_ue_ulsch_scrambling",
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index fcb85bd0dc..c2c777d8f0 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -50,9 +50,15 @@ typedef enum
 {
     VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB = 0,
     VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB,
-    VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_UE,
-    VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_UE,
+    VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_UE,
+    VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_UE,
+    VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_TX_UE,
+    VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_RX_UE,
+    VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_UE,
+    VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_UE,
     VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX,
+    VCD_SIGNAL_DUMPER_VARIABLES_UE_OFFSET_MBOX,
+    VCD_SIGNAL_DUMPER_VARIABLES_UE_RX_OFFSET,
     VCD_SIGNAL_DUMPER_VARIABLES_DIFF,
     VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME,
     VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME,
@@ -139,6 +145,7 @@ typedef enum {
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_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,
   VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_MODULATION,
   VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING,
   VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_SCRAMBLING,
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.exmimo2.conf
index b356258a33..aabbeec72d 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.exmimo2.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.exmimo2.conf
@@ -115,10 +115,10 @@ eNBs =
     NETWORK_INTERFACES : 
     {
         ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.13.82/24";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.13.171/24";
 
         ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.13.82/24";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.13.171/24";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
     
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.conf
index 434be4ba52..81f25ff1b5 100755
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.conf
@@ -43,7 +43,7 @@ eNBs =
                            uplink_frequency_offset 			      = 0;
   
   			   Nid_cell					      = 0;
-                           N_RB_DL                 			      = 50;
+                           N_RB_DL                 			      = 25;
                            Nid_cell_mbsfn          			      = 0;
                            nb_antennas_tx          			      = 1;
                            nb_antennas_rx          			      = 1; 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.exmimo2.conf
deleted file mode 100644
index 083061a99b..0000000000
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.exmimo2.conf
+++ /dev/null
@@ -1,143 +0,0 @@
-Active_eNBs = ( "eNB_Eurecom_LTEBox");
-# Asn1_verbosity, choice in: none, info, annoying
-Asn1_verbosity = "none";
-
-eNBs =
-(
- {
-    # real_time choice in {hard, rt-preempt, no}
-    real_time       =  "no";
-    ////////// Identification parameters:
-    eNB_ID    =  0xe00;
-    
-    cell_type =  "CELL_MACRO_ENB";
-    
-    eNB_name  =  "eNB_Eurecom_LTEBox";
-    
-    // Tracking area code, 0x0000 and 0xfffe are reserved values
-    tracking_area_code  =  "1";
-    
-    mobile_country_code =  "208";
-    
-    mobile_network_code =  "92";
-    
-    ////////// Physical parameters:
-    
-    component_carriers = (
-    		       	 {
-  			   frame_type					      = "TDD";	
-                           tdd_config 					      = 3;
-                           tdd_config_s            			      = 0;
- 			   prefix_type             			      = "NORMAL";
-  			   eutra_band              			      = 39;
-                           downlink_frequency      			      = 1907600000L;
-                           uplink_frequency_offset 			      = 0;
-  
-  			   Nid_cell					      = 0;
-                           N_RB_DL                 			      = 25;
-                           Nid_cell_mbsfn          			      = 0;
-                           nb_antennas_tx          			      = 1;
-                           nb_antennas_rx          			      = 1;
-                           tx_gain                                            = 10;
-                           rx_gain                                            = 10;
-                           prach_root              			      = 0;
-                           prach_config_index      			      = 0;
-                           prach_high_speed        			      = "DISABLE";
-  	                   prach_zero_correlation  			      = 1;
-                           prach_freq_offset       			      = 2;
-			   pucch_delta_shift       			      = 1;
-                           pucch_nRB_CQI           			      = 1;
-                           pucch_nCS_AN            			      = 0;
-                           pucch_n1_AN             			      = 32;
-                           pdsch_referenceSignalPower 			      = -24;
-                           pdsch_p_b                  			      = 0;
-                           pusch_n_SB                 			      = 1; 
-                           pusch_enable64QAM          			      = "DISABLE";
-			   pusch_hoppingMode                                  = "interSubFrame";
-			   pusch_hoppingOffset                                = 0;
-     	                   pusch_groupHoppingEnabled  			      = "ENABLE";
-	                   pusch_groupAssignment      			      = 0;
-	                   pusch_sequenceHoppingEnabled		   	      = "DISABLE";
-	                   pusch_nDMRS1                                       = 0;
-	                   phich_duration                                     = "NORMAL";
-	                   phich_resource                                     = "ONESIXTH";
-	                   srs_enable                                         = "DISABLE";
-	               /*  srs_BandwidthConfig                                =;
-	                   srs_SubframeConfig                                 =;
-	                   srs_ackNackST                                      =;
-	                   srs_MaxUpPts                                       =;*/  
-
-	                   pusch_p0_Nominal                                   = -95; 
-	                   pusch_alpha                                        = "AL1";
-	                   pucch_p0_Nominal                                   = -108;
-	                   msg3_delta_Preamble                                = 6;
-	                   pucch_deltaF_Format1                               = "deltaF2";
-	                   pucch_deltaF_Format1b                              = "deltaF3";
-	                   pucch_deltaF_Format2                               = "deltaF0";
-	                   pucch_deltaF_Format2a                              = "deltaF0";
-  	                   pucch_deltaF_Format2b		    	      = "deltaF0";
-	
-                           rach_numberOfRA_Preambles                          = 64;
-                           rach_preamblesGroupAConfig                         = "DISABLE";
-/*
-                           rach_sizeOfRA_PreamblesGroupA                      = ;
-                           rach_messageSizeGroupA                             = ;
-                           rach_messagePowerOffsetGroupB                      = ; 
-*/
-                           rach_powerRampingStep                              = 2;
-	                   rach_preambleInitialReceivedTargetPower            = -104;
-                           rach_preambleTransMax                              = 6;
-	                   rach_raResponseWindowSize                          = 10;
-	                   rach_macContentionResolutionTimer                  = 48;
-	                   rach_maxHARQ_Msg3Tx                                = 4;
-
-			   pcch_default_PagingCycle                           = 128;
-			   pcch_nB                                            = "oneT";
-			   bcch_modificationPeriodCoeff			      = 2;
-			   ue_TimersAndConstants_t300			      = 1000;
-			   ue_TimersAndConstants_t301			      = 1000;
-			   ue_TimersAndConstants_t310			      = 1000;
-			   ue_TimersAndConstants_t311			      = 10000;
-			   ue_TimersAndConstants_n310			      = 20;
-			   ue_TimersAndConstants_n311			      = 1;
-			 }
-			 );
-    
-    ////////// MME parameters:
-    mme_ip_address      = ( { ipv4       = "192.168.13.11";
-                              ipv6       = "192:168:30::17";
-                              active     = "yes";
-                              preference = "ipv4";
-                            }
-                          );
-
-    NETWORK_INTERFACES : 
-    {
-        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.13.10/24";
-
-        ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.13.10/24";
-        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
-    };
-    
-    log_config : 
-    {
-	global_log_level                      ="info"; 
-    	global_log_verbosity                  ="medium";
-	hw_log_level                          ="info"; 
-    	hw_log_verbosity                      ="medium";
-	phy_log_level                         ="info"; 
-    	phy_log_verbosity                     ="medium";
-	mac_log_level                         ="info"; 
-    	mac_log_verbosity                     ="high";
-	rlc_log_level                         ="info"; 
-    	rlc_log_verbosity                     ="medium";
-	pdcp_log_level                        ="info"; 
-    	pdcp_log_verbosity                    ="medium";
-	rrc_log_level                         ="info"; 
-    	rrc_log_verbosity                     ="medium";
-   };	
-   
-  }
-);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf
index e082622056..fc8a19e8bc 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf
@@ -114,10 +114,10 @@ eNBs =
     NETWORK_INTERFACES : 
     {
         ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.13.10/24";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.13.171/24";
 
         ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.13.10/24";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.13.171/24";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
     
@@ -135,7 +135,7 @@ eNBs =
     	rlc_log_verbosity                     ="medium";
 	pdcp_log_level                        ="info"; 
     	pdcp_log_verbosity                    ="medium";
-	rrc_log_level                         ="debug"; 
+	rrc_log_level                         ="info"; 
     	rrc_log_verbosity                     ="medium";
    };	
    
diff --git a/targets/RT/USER/Makefile b/targets/RT/USER/Makefile
index b691183b51..fa9b5ee3b3 100644
--- a/targets/RT/USER/Makefile
+++ b/targets/RT/USER/Makefile
@@ -164,7 +164,7 @@ CFLAGS += -DSMBV
 endif
 
 CFLAGS += -DPHYSIM -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 
-CFLAGS += -DOPENAIR_LTE -DENABLE_FXP -DOPENAIR1 -DDLSCH_THREAD #-DULSCH_THREAD
+CFLAGS += -DOPENAIR_LTE -DENABLE_FXP -DOPENAIR1 #-DDLSCH_THREAD #-DULSCH_THREAD
 
 
 ifeq ($(EXMIMO),1)
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index e7454a820d..aabcd8d086 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -199,6 +199,7 @@ RTIME T0;
 pthread_attr_t                  attr_UE_init_synch;
 pthread_attr_t                  attr_UE_thread_tx;
 pthread_attr_t                  attr_UE_thread_rx;
+struct sched_param              sched_param_UE_thread;
 struct sched_param              sched_param_UE_init_synch;
 struct sched_param              sched_param_UE_thread_tx;
 struct sched_param              sched_param_UE_thread_rx;
@@ -379,7 +380,7 @@ int transmission_mode=1;
 
 int16_t           glog_level         = LOG_DEBUG;
 int16_t           glog_verbosity     = LOG_MED;
-int16_t           hw_log_level       = LOG_DEBUG;
+int16_t           hw_log_level       = LOG_INFO;
 int16_t           hw_log_verbosity   = LOG_MED;
 int16_t           phy_log_level      = LOG_DEBUG;
 int16_t           phy_log_verbosity  = LOG_MED;
@@ -387,9 +388,9 @@ int16_t           mac_log_level      = LOG_DEBUG;
 int16_t           mac_log_verbosity  = LOG_MED;
 int16_t           rlc_log_level      = LOG_DEBUG;
 int16_t           rlc_log_verbosity  = LOG_MED;
-int16_t           pdcp_log_level     = LOG_DEBUG;
+int16_t           pdcp_log_level     = LOG_INFO;
 int16_t           pdcp_log_verbosity = LOG_MED;
-int16_t           rrc_log_level      = LOG_DEBUG;
+int16_t           rrc_log_level      = LOG_INFO;
 int16_t           rrc_log_verbosity  = LOG_MED;
 # if defined(ENABLE_USE_MME)
 int16_t           gtpu_log_level     = LOG_DEBUG;
@@ -1821,12 +1822,6 @@ static void *eNB_thread(void *arg)
   return 0;
 }
 
-#ifdef USRP_DEBUG
-int is_synchronized=1;
-#else
-int is_synchronized=0;
-#endif
-
 typedef enum {
   pss=0,
   pbch=1,
@@ -1841,9 +1836,9 @@ static void *UE_thread_synch(void *arg) {
   int current_offset = 0;
   sync_mode_t sync_mode = pss;
 
+  UE->is_synchronized = 0;
   printf("UE_thread_sync in with PHY_vars_UE %p\n",arg);
-#ifdef USRP
-  printf("waiting for USRP sync (UE_thread_synch) \n");
+  printf("waiting for sync (UE_thread_synch) \n");
 #ifdef RTAI
   rt_sem_wait(sync_sem);
 #else
@@ -1856,7 +1851,6 @@ static void *UE_thread_synch(void *arg) {
   printf("unlocked sync_mutex (UE_sync_thread)\n");
 #endif
   printf("starting UE synch thread\n");
-#endif
 
   if (UE_scan == 1) {
     for (card=0;card<MAX_CARDS;card++) {
@@ -1866,7 +1860,7 @@ static void *UE_thread_synch(void *arg) {
     
 	openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i];
 	openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i];
-	openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB-USRP_GAIN_OFFSET;  
+	openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB-USRP_GAIN_OFFSET;  
 #ifdef USRP
 #ifndef USRP_DEBUG
 	openair0_set_rx_frequencies(&openair0,&openair0_cfg[0]);
@@ -1924,11 +1918,11 @@ static void *UE_thread_synch(void *arg) {
 	  
 	  openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+openair_daq_vars.freq_offset;
 	  openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+openair_daq_vars.freq_offset;
-	  openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB-USRP_GAIN_OFFSET;  // 65 calibrated for USRP B210 @ 2.6 GHz
+	  openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB-USRP_GAIN_OFFSET;  // 65 calibrated for USRP B210 @ 2.6 GHz
 #ifdef USRP
 #ifndef USRP_DEBUG
-	openair0_set_rx_frequencies(&openair0,&openair0_cfg[0]);
-	//	openair0_set_gains(&openair0,&openair0_cfg[0]);
+	  openair0_set_rx_frequencies(&openair0,&openair0_cfg[0]);
+	  //	openair0_set_gains(&openair0,&openair0_cfg[0]);
 #endif
 #endif
 	}
@@ -1937,7 +1931,7 @@ static void *UE_thread_synch(void *arg) {
       break;
     case pbch:
       
-      if (initial_sync(PHY_vars_UE_g[0][0],mode)==0) {
+      if (initial_sync(UE,mode)==0) {
 	/*
 	  lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms,
 	  PHY_vars_UE_g[0],
@@ -1954,65 +1948,67 @@ static void *UE_thread_synch(void *arg) {
 	
 	T0 = rt_get_time_ns();
 	
-	is_synchronized = 1;
-	PHY_vars_UE_g[0][0]->slot_rx = 0;
-	//oai_exit=1;
-	//start the DMA transfers
-	//LOG_D(HW,"Before openair0_start_rt_acquisition \n");
-	//openair0_start_rt_acquisition(0);
-	  
-	hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti;
+	UE->is_synchronized = 1;
+#ifndef EXMIMO
+	UE->slot_rx = 0;
+	UE->slot_tx = 4;
+#else
+	UE->slot_rx = 18;
+	UE->slot_tx = 2;
+#endif
+	hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti;
 	LOG_I(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset);
 	  
       }
-	else {
+      else {
 	  
 	if (openair_daq_vars.freq_offset >= 0) {
-	openair_daq_vars.freq_offset += 100;
-	openair_daq_vars.freq_offset *= -1;
-      }
+	  openair_daq_vars.freq_offset += 100;
+	  openair_daq_vars.freq_offset *= -1;
+	}
 	else {
-	openair_daq_vars.freq_offset *= -1;
-      }
+	  openair_daq_vars.freq_offset *= -1;
+	}
 	if (abs(openair_daq_vars.freq_offset) > 7500) {
-	LOG_I(PHY,"[initial_sync] No cell synchronization found, abandoning\n");
-	mac_xface->macphy_exit("No cell synchronization found, abandoning");
-      }
+	  LOG_I(PHY,"[initial_sync] No cell synchronization found, abandoning\n");
+	  mac_xface->macphy_exit("No cell synchronization found, abandoning");
+	}
 	else {
-	LOG_I(PHY,"[initial_sync] trying carrier off %d Hz, rxgain %d\n",openair_daq_vars.freq_offset,
-	  PHY_vars_UE_g[0][0]->rx_total_gain_dB);
-	for (card=0;card<MAX_CARDS;card++) {
-	for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
-	openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+openair_daq_vars.freq_offset;
-	openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+openair_daq_vars.freq_offset;
-	openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB-USRP_GAIN_OFFSET;  // 65 calibrated for USRP B210 @ 2.6 GHz
+	  LOG_I(PHY,"[initial_sync] trying carrier off %d Hz, rxgain %d\n",openair_daq_vars.freq_offset,
+		UE->rx_total_gain_dB);
+	  for (card=0;card<MAX_CARDS;card++) {
+	    for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
+	      openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+openair_daq_vars.freq_offset;
+	      openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+openair_daq_vars.freq_offset;
+	      openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB-USRP_GAIN_OFFSET;  // 65 calibrated for USRP B210 @ 2.6 GHz
 #ifdef USRP
 #ifndef USRP_DEBUG
-	openair0_set_frequencies(&openair0,&openair0_cfg[0]);
-	//	    openair0_set_gains(&openair0,&openair0_cfg[0]);
+	      openair0_set_frequencies(&openair0,&openair0_cfg[0]);
+	      //	    openair0_set_gains(&openair0,&openair0_cfg[0]);
 #endif
 #endif
-      }
-    }
+	    }
+	  }
 	    
-	//	    openair0_dump_config(&openair0_cfg[0],UE_flag);
+	  //	    openair0_dump_config(&openair0_cfg[0],UE_flag);
 	    
-	//	    rt_sleep_ns(FRAME_PERIOD);
-  } // freq_offset
-} // initial_sync=0
-  break;
- case si:
- default:
-break;
-}
+	  //	    rt_sleep_ns(FRAME_PERIOD);
+	} // freq_offset
+      } // initial_sync=0
+      break;
+    case si:
+    default:
+      break;
+    }
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,0);  
-    if (pthread_mutex_lock(&PHY_vars_UE_g[0][0]->mutex_synch) != 0) {
+    printf("Finished synch : Locking synch mutex (thread_sync)\n");
+    if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
       printf("[openair][SCHED][eNB] error locking mutex for UE synch\n");
     }
     else {
-      PHY_vars_UE_g[0][0]->instance_cnt_synch--;
+      UE->instance_cnt_synch--;
       
-      if (pthread_mutex_unlock(&PHY_vars_UE_g[0][0]->mutex_synch) != 0) {	
+      if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {	
 	printf("[openair][SCHED][eNB] error unlocking mutex for UE synch\n");
       }
     }
@@ -2027,15 +2023,10 @@ static void *UE_thread_tx(void *arg) {
   struct sched_attr attr;
   unsigned int flags = 0;
 #endif
+  int ret;
 
   PHY_VARS_UE *UE = (PHY_VARS_UE*)arg;
 
-#ifndef OPENAIR2
-  UE->UE_mode[eNB_id]=PUSCH;
-  UE->prach_resources[eNB_id] = &prach_resources_local;
-  prach_resources_local.ra_RNTI = 0xbeef;
-  prach_resources_local.ra_PreambleIndex = 0;
-#endif
   UE->instance_cnt_tx=-1;
 
 #ifdef LOWLATENCY
@@ -2046,9 +2037,10 @@ static void *UE_thread_tx(void *arg) {
   
   /* This creates a 1ms reservation every 10ms period*/
   attr.sched_policy = SCHED_DEADLINE;
-  attr.sched_runtime = 1 * 1000000;  // each tx thread requires 1ms to finish its job
+  attr.sched_runtime = 1 * 500000;  // each tx thread requires .5ms to finish its job
   attr.sched_deadline =1 * 1000000; // each tx thread will finish within 1ms
-  attr.sched_period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point
+  attr.sched_period = 1 * 1000000; // each tx thread has a period of 1ms from the starting point
+
   
   if (sched_setattr(0, &attr, flags) < 0 ){
     perror("[SCHED] eNB tx thread: sched_setattr failed\n");
@@ -2056,6 +2048,22 @@ static void *UE_thread_tx(void *arg) {
   }
 #endif
 
+#ifndef EXMIMO
+  printf("waiting for sync (UE_thread_tx)\n");
+#ifdef RTAI
+  rt_sem_wait(sync_sem);
+#else
+  pthread_mutex_lock(&sync_mutex);
+  printf("Locked sync_mutex, waiting (UE_thread_tx)\n");
+  while (sync_var<0)
+    pthread_cond_wait(&sync_cond, &sync_mutex);
+  pthread_mutex_unlock(&sync_mutex);
+  printf("unlocked sync_mutex, waiting (UE_thread_tx)\n");
+#endif
+#endif
+
+  printf("Starting UE TX thread\n");
+
   mlockall(MCL_CURRENT | MCL_FUTURE);
 
   while (!oai_exit) {
@@ -2074,17 +2082,46 @@ static void *UE_thread_tx(void *arg) {
 	exit_fun("nothing to add");
       }
     }
-  
-
-    if ((subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1)==SF_UL)||
-	(UE->lte_frame_parms.frame_type == FDD)){
+    
+    
+    if ((subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1)==SF_UL)){
       phy_procedures_UE_TX(UE,eNB_id,0,mode,no_relay);
     }
     if ((subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1)==SF_S) &&
 	((UE->slot_tx&1)==1)) {
       phy_procedures_UE_S_TX(UE,eNB_id,0,no_relay);
     }
-
+    
+    
+    if (UE->lte_frame_parms.frame_type == TDD) {
+      
+      ret = mac_xface->ue_scheduler(UE->Mod_id, 
+				    UE->frame_tx,
+				    UE->slot_rx>>1, 
+				    subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1),
+				    eNB_id);
+      
+      if (ret == CONNECTION_LOST) {
+	LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",UE->Mod_id,
+	      UE->frame_rx,UE->slot_tx>>1);
+	UE->UE_mode[eNB_id] = PRACH;
+	//      mac_xface->macphy_exit("Connection lost");
+      }
+      else if (ret == PHY_RESYNCH) {
+	LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n",
+	      UE->Mod_id,
+	      UE->frame_rx,UE->slot_tx>>1);
+	UE->UE_mode[eNB_id] = RESYNCH;
+	//     mac_xface->macphy_exit("Connection lost");
+	//exit(-1);
+      } else if (ret == PHY_HO_PRACH) {
+	LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n",
+	      UE->Mod_id,UE->frame_rx,UE->slot_tx>>1);
+	UE->UE_mode[eNB_id] = PRACH;
+      }
+    }
+    
+    
     if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
       printf("[openair][SCHED][eNB] error locking mutex for UE TX thread\n");
     }
@@ -2095,12 +2132,14 @@ static void *UE_thread_tx(void *arg) {
 	printf("[openair][SCHED][eNB] error unlocking mutex for UE\n");
       }
     }
-
-    UE->slot_tx++;
-    if (UE->slot_tx==20) {
-      UE->slot_tx=0;
+    
+    UE->slot_tx+=2;
+    if (UE->slot_tx>=20) {
+      UE->slot_tx-=20;
       UE->frame_tx++;
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_UE, UE->frame_tx);
     }
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_UE, UE->slot_tx>>1);
   }
   return(0);
 }
@@ -2109,32 +2148,33 @@ static void *UE_thread_rx(void *arg) {
   
   PHY_VARS_UE *UE = (PHY_VARS_UE*)arg;
   int i;
-  /*
-    #ifdef LOWLATENCY
-    struct sched_attr attr;
-    unsigned int flags = 0;
-    #endif
-  */
+  int ret;
+  
+#ifdef LOWLATENCY
+  struct sched_attr attr;
+  unsigned int flags = 0;
+#endif
+  
   UE->instance_cnt_rx=-1;
-  /*
-    #ifdef LOWLATENCY
-    attr.size = sizeof(attr);
-    attr.sched_flags = 0;
-    attr.sched_nice = 0;
-    attr.sched_priority = 0;
   
-    // This creates a 1ms reservation every 10ms period
-    attr.sched_policy = SCHED_DEADLINE;
-    attr.sched_runtime = 1 * 800000;  // each tx thread requires 1ms to finish its job
-    attr.sched_deadline =1 * 1000000; // each tx thread will finish within 1ms
-    attr.sched_period = 1 * 1000000; // each tx thread has a period of 10ms from the starting point
+#ifdef LOWLATENCY
+  attr.size = sizeof(attr);
+  attr.sched_flags = 0;
+  attr.sched_nice = 0;
+  attr.sched_priority = 0;
   
-    if (sched_setattr(0, &attr, flags) < 0 ){
+  // This creates a 1ms reservation every 10ms period
+  attr.sched_policy = SCHED_DEADLINE;
+  attr.sched_runtime = 1 * 800000;  // each rx thread requires 1ms to finish its job
+  attr.sched_deadline =1 * 1000000; // each rx thread will finish within 1ms
+  attr.sched_period = 1 * 1000000; // each rx thread has a period of 1ms from the starting point
+  
+  if (sched_setattr(0, &attr, flags) < 0 ){
     perror("[SCHED] eNB tx thread: sched_setattr failed\n");
     exit(-1);
-    }  
-    #endif
-  */
+  }  
+#endif
+  
   mlockall(MCL_CURRENT | MCL_FUTURE);
   
 #ifndef EXMIMO
@@ -2150,22 +2190,19 @@ static void *UE_thread_rx(void *arg) {
   printf("unlocked sync_mutex, waiting (UE_thread_rx)\n");
 #endif
 #endif
-
+  
   printf("Starting UE RX thread\n");
-
+  
   while (!oai_exit) { 
-    printf("UE_thread_rx: locking UE RX mutex\n");
+    //   printf("UE_thread_rx: locking UE RX mutex\n");
     if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
       LOG_E(PHY,"[SCHED][eNB] error locking mutex for UE RX\n");
       exit_fun("nothing to add");
     }
     else {
       
-      printf("UE_thread_rx: unlocking UE RX mutex (IC %d)\n",UE->instance_cnt_rx);
       while (UE->instance_cnt_rx < 0) {
-	printf("Waiting for cond_rx (%p)\n",(void*)&UE->cond_rx);
 	pthread_cond_wait(&UE->cond_rx,&UE->mutex_rx);
-	printf("Got UE RX condition, IC %d @ %llu\n",UE->instance_cnt_rx,rt_get_time_ns()-T0);
       }
       if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {	
 	LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for UE RX\n");
@@ -2173,40 +2210,71 @@ static void *UE_thread_rx(void *arg) {
       }
       
       for (i=0;i<2;i++) {
-	printf("UE_thread_rx: processing slot %d (slot rx %d) @ %llu\n",i,UE->slot_rx,rt_get_time_ns()-T0);
-	if ((subframe_select(&UE->lte_frame_parms,UE->slot_rx>>1)==SF_DL) ||
-	    (UE->lte_frame_parms.frame_type == FDD)){
+	if ((subframe_select(&UE->lte_frame_parms,UE->slot_rx>>1)==SF_DL) |
+            (UE->lte_frame_parms.frame_type == FDD)) {
 	  phy_procedures_UE_RX(UE,eNB_id,0,mode,no_relay,NULL);
 	}
 	if ((subframe_select(&UE->lte_frame_parms,UE->slot_rx>>1)==SF_S) &&
 	    ((UE->slot_rx&1)==0)) {
 	  phy_procedures_UE_RX(UE,eNB_id,0,mode,no_relay,NULL);
 	}
+      	
+	if (i==0) {
+	  ret = mac_xface->ue_scheduler(UE->Mod_id, 
+					UE->frame_tx,
+					UE->slot_rx>>1,
+					subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1),
+					eNB_id);
+	  
+	  if (ret == CONNECTION_LOST) {
+	    LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",UE->Mod_id,
+		  UE->frame_rx,UE->slot_tx>>1);
+	    UE->UE_mode[eNB_id] = PRACH;
+	    //      mac_xface->macphy_exit("Connection lost");
+	  }
+	  else if (ret == PHY_RESYNCH) {
+	    LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n",
+		  UE->Mod_id,
+		  UE->frame_rx,UE->slot_tx>>1);
+	    UE->UE_mode[eNB_id] = RESYNCH;
+	    //     mac_xface->macphy_exit("Connection lost");
+	    //exit(-1);
+	  } 
+	  else if (ret == PHY_HO_PRACH) {
+	    LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n",
+		  UE->Mod_id,UE->frame_rx,UE->slot_tx>>1);
+	    UE->UE_mode[eNB_id] = PRACH;
+	  }
+	}	  
 	
 	UE->slot_rx++;
+	
 	if (UE->slot_rx==20) {
-	  UE->slot_rx=0;
-	  UE->frame_rx++;
-	}    
-      }
-    }
-    
-    if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
-      printf("[openair][SCHED][eNB] error locking mutex for UE RX\n");
-    }
-    else {
-      UE->instance_cnt_rx--;
+	UE->slot_rx=0;
+	UE->frame_rx++;
+	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_UE, UE->frame_rx);
+      } 
+	
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_UE, UE->slot_rx>>1);
       
-      if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {	
+	}
+	
+	if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
+	printf("[openair][SCHED][eNB] error locking mutex for UE RX\n");
+      }
+	else {
+	UE->instance_cnt_rx--;
+	
+	if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {	
 	printf("[openair][SCHED][eNB] error unlocking mutex for UE RX\n");
       }
-    }
-    printf("UE_thread_rx done\n");
-  }
-       
-  return(0);
-}
-
+      }
+	//    printf("UE_thread_rx done\n");
+      }
+      }      
+	return(0);
+      }
+    
 
 
 
@@ -2217,7 +2285,8 @@ static void *UE_thread_rx(void *arg) {
 
 static void *UE_thread(void *arg) {
 
-  LTE_DL_FRAME_PARMS *frame_parms=&PHY_vars_UE_g[0][0]->lte_frame_parms;
+  LTE_DL_FRAME_PARMS *frame_parms=&UE->lte_frame_parms;
+  PHY_VARS_UE *UE=PHY_vars_UE_g[0][0];
 
   int slot=1,frame=0,hw_subframe=0,rx_cnt=0,tx_cnt=0;
   // unsigned int aa;
@@ -2294,13 +2363,13 @@ static void *UE_thread(void *arg) {
   
 #ifndef USRP_DEBUG
 
-      for (i=0;i<PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx;i++)
+      for (i=0;i<UE->lte_frame_parms.nb_antennas_rx;i++)
 	rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rx_cnt*samples_per_packets] : (void*)dummy[i];
       rxs = openair0.trx_read_func(&openair0,
 				   &timestamp,
 				   rxp,
 				   samples_per_packets - ((rx_cnt==0) ? rx_off_diff : 0),
-				   PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx);
+				   UE->lte_frame_parms.nb_antennas_rx);
       if (rxs != (samples_per_packets- ((rx_cnt==0) ? rx_off_diff : 0)))
 	exit_fun("problem in rx");
 
@@ -2310,19 +2379,19 @@ static void *UE_thread(void *arg) {
       // Transmit TX buffer based on timestamp from RX
       if (tx_enabled) {
 	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,1);
-	for (i=0;i<PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx;i++)
+	for (i=0;i<UE->lte_frame_parms.nb_antennas_tx;i++)
 	  txp[i] = (void*)&txdata[i][tx_cnt*samples_per_packets];
 	openair0.trx_write_func(&openair0,
 				(timestamp+samples_per_packets*tx_delay-tx_forward_nsamps),
 				txp,
 				samples_per_packets,
-				PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx,
+				UE->lte_frame_parms.nb_antennas_tx,
 				1);
 				
 	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0);
       }
 #else
-      rt_sleep_ns(10000000);
+      rt_sleep_ns(1000000);
 #endif
       rx_cnt++;
       tx_cnt++;
@@ -2336,42 +2405,42 @@ static void *UE_thread(void *arg) {
 
 
     
-    if (is_synchronized==1)  {
+    if (UE->is_synchronized==1)  {
       LOG_D(HW,"UE_thread: hw_frame %d, hw_subframe %d (time %llu)\n",frame,hw_subframe,rt_get_time_ns()-T0);
 
       if (start_rx_stream==1) {
 	//	printf("UE_thread: locking UE mutex_rx\n");
-	if (pthread_mutex_lock(&PHY_vars_UE_g[0][0]->mutex_rx) != 0) {
+	if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
 	  LOG_E(PHY,"[SCHED][UE] error locking mutex for UE RX thread\n");
 	  exit_fun("nothing to add");
 	}
 	else {
  	  
-	  PHY_vars_UE_g[0][0]->instance_cnt_rx++;
+	  UE->instance_cnt_rx++;
 	  //	  printf("UE_thread: Unlocking UE mutex_rx\n");
-	  pthread_mutex_unlock(&PHY_vars_UE_g[0][0]->mutex_rx);
-	  if (PHY_vars_UE_g[0][0]->instance_cnt_rx == 0) {
-	    LOG_D(HW,"Scheduling UE RX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",PHY_vars_UE_g[0][0]->frame_rx,frame,hw_subframe,PHY_vars_UE_g[0][0]->slot_rx>>1,mode);
-	    if (pthread_cond_signal(&PHY_vars_UE_g[0][0]->cond_rx) != 0) {
+	  pthread_mutex_unlock(&UE->mutex_rx);
+	  if (UE->instance_cnt_rx == 0) {
+	    // LOG_D(HW,"Scheduling UE RX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_rx,frame,hw_subframe,UE->slot_rx>>1,mode);
+	    if (pthread_cond_signal(&UE->cond_rx) != 0) {
 	      LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n");
 	      exit_fun("nothing to add");
 	    }
 	    else {
-	      //	      printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&PHY_vars_UE_g[0][0]->cond_rx,rt_get_time_ns()-T0);
+	      //	      printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0);
 	    }
 	    if (mode == rx_calib_ue) {
 	      if (frame == 10) {
 		LOG_D(PHY,"[SCHED][UE] Found cell with N_RB_DL %d, PHICH CONFIG (%d,%d), Nid_cell %d, NB_ANTENNAS_TX %d, initial frequency offset %d Hz, frequency offset %d Hz, RSSI (digital) %d dB, measured Gain %d dB, total_rx_gain %d dB, USRP rx gain %f dB\n",
-		      PHY_vars_UE_g[0][0]->lte_frame_parms.N_RB_DL,
-		      PHY_vars_UE_g[0][0]->lte_frame_parms.phich_config_common.phich_duration,
-		      PHY_vars_UE_g[0][0]->lte_frame_parms.phich_config_common.phich_resource,
-		      PHY_vars_UE_g[0][0]->lte_frame_parms.Nid_cell,
-		      PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx_eNB,
+		      UE->lte_frame_parms.N_RB_DL,
+		      UE->lte_frame_parms.phich_config_common.phich_duration,
+		      UE->lte_frame_parms.phich_config_common.phich_resource,
+		      UE->lte_frame_parms.Nid_cell,
+		      UE->lte_frame_parms.nb_antennas_tx_eNB,
 		      openair_daq_vars.freq_offset,
-		      PHY_vars_UE_g[0][0]->lte_ue_common_vars.freq_offset,
-		      PHY_vars_UE_g[0][0]->PHY_measurements.rx_power_avg_dB[0],
-		      PHY_vars_UE_g[0][0]->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm,
-		      PHY_vars_UE_g[0][0]->rx_total_gain_dB,
+		      UE->lte_ue_common_vars.freq_offset,
+		      UE->PHY_measurements.rx_power_avg_dB[0],
+		      UE->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm,
+		      UE->rx_total_gain_dB,
 		      openair0_cfg[0].rx_gain[0]
 		      );
 		exit_fun("[HW][UE] UE in RX calibration mode, exiting");
@@ -2389,17 +2458,17 @@ static void *UE_thread(void *arg) {
       
       if ((hw_subframe == 9)&&(dummy_dump == 0)) {
 	// Wake up initial synch thread
-	if (pthread_mutex_lock(&PHY_vars_UE_g[0][0]->mutex_synch) != 0) {
+	if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
 	  LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n");
 	  exit_fun("nothing to add");
 	}
 	else {
 	  
-	  PHY_vars_UE_g[0][0]->instance_cnt_synch++;
-	  pthread_mutex_unlock(&PHY_vars_UE_g[0][0]->mutex_synch);
+	  UE->instance_cnt_synch++;
+	  pthread_mutex_unlock(&UE->mutex_synch);
 	  dummy_dump = 1;
-	  if (PHY_vars_UE_g[0][0]->instance_cnt_synch == 0) {
-	    if (pthread_cond_signal(&PHY_vars_UE_g[0][0]->cond_synch) != 0) {
+	  if (UE->instance_cnt_synch == 0) {
+	    if (pthread_cond_signal(&UE->cond_synch) != 0) {
 	      LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n");
 	      exit_fun("nothing to add");
 	    }
@@ -2411,10 +2480,6 @@ static void *UE_thread(void *arg) {
 	}
       }
     }
-    /*
-      if ((slot%2000)<10)
-      LOG_D(HW,"fun0: doing very hard work\n");
-    */
     
     hw_subframe++;
     slot+=2;
@@ -2422,12 +2487,12 @@ static void *UE_thread(void *arg) {
       hw_subframe = 0;
       frame++;
       slot = 1;
-      if (PHY_vars_UE_g[0][0]->instance_cnt_synch < 0) {
-	if (is_synchronized == 1) {
+      if (UE->instance_cnt_synch < 0) {
+	if (UE->is_synchronized == 1) {
 	  //	  openair0_set_gains(&openair0,&openair0_cfg[0]);
 	  rx_off_diff = 0;
-	  //	  LOG_D(PHY,"HW RESYNC: hw_frame %d: rx_offset = %d\n",frame,PHY_vars_UE_g[0][0]->rx_offset);
-	  if ((PHY_vars_UE_g[0][0]->rx_offset > RX_OFF_MAX)&&(start_rx_stream==0)) {
+	  //	  LOG_D(PHY,"HW RESYNC: hw_frame %d: rx_offset = %d\n",frame,UE->rx_offset);
+	  if ((UE->rx_offset > RX_OFF_MAX)&&(start_rx_stream==0)) {
 	    start_rx_stream=1;
 	    //LOG_D(PHY,"HW RESYNC: hw_frame %d: Resynchronizing sample stream\n");
 	    frame=0;
@@ -2437,18 +2502,18 @@ static void *UE_thread(void *arg) {
 	    rxs = openair0.trx_read_func(&openair0,
 					 &timestamp,
 					 (void**)rxdata,
-					 PHY_vars_UE_g[0][0]->rx_offset,
-					 PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx);
+					 UE->rx_offset,
+					 UE->lte_frame_parms.nb_antennas_rx);
 #else
 	    rt_sleep_ns(10000000);
 #endif
-	    PHY_vars_UE_g[0][0]->rx_offset=0;
+	    UE->rx_offset=0;
 	  }
-	  else if ((PHY_vars_UE_g[0][0]->rx_offset < RX_OFF_MIN)&&(start_rx_stream==1)) {
-	    //	    rx_off_diff = -PHY_vars_UE_g[0][0]->rx_offset + RX_OFF_MIN;
+	  else if ((UE->rx_offset < RX_OFF_MIN)&&(start_rx_stream==1)) {
+	    //	    rx_off_diff = -UE->rx_offset + RX_OFF_MIN;
 	  }
-	  else if ((PHY_vars_UE_g[0][0]->rx_offset > (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MAX)) &&(start_rx_stream==1) && (rx_correction_timer == 0)) {
-	    rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES-PHY_vars_UE_g[0][0]->rx_offset;
+	  else if ((UE->rx_offset > (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MAX)) &&(start_rx_stream==1) && (rx_correction_timer == 0)) {
+	    rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES-UE->rx_offset;
 	    rx_correction_timer = 5;
 	  }
 	  if (rx_correction_timer>0)
@@ -2472,13 +2537,13 @@ static void *UE_thread(void *arg) {
 #ifdef EXMIMO
 /* This is the main UE thread. Initially it is doing a periodic get_frame. One synchronized it gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */
 static void *UE_thread(void *arg) {
+  PHY_VARS_UE *UE=PHY_vars_UE_g[0][0];
 #ifdef RTAI
   RT_TASK *task;
 #endif
   // RTIME in, out, diff;
   int slot=0,frame=0,hw_slot,last_slot,next_slot;
   // unsigned int aa;
-  static int is_synchronized = 0;
   int delay_cnt;
   RTIME time_in;
   int hw_slot_offset=0,rx_offset_mbox=0,mbox_target=0,mbox_current=0;
@@ -2486,11 +2551,29 @@ static void *UE_thread(void *arg) {
   int i, ret;
   int CC_id,card;
   volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
-#ifndef USRP
-  //exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;;
+
+  int wait_sync_cnt = 0;
+  int first_synch = 1;
+#ifdef LOWLATENCY
+  struct sched_attr attr;
+  unsigned int flags = 0;
+  unsigned long mask = 1; // processor 0 
 #endif
 
+  printf("waiting for sync (UE_thread)\n");
+#ifdef RTAI
+  rt_sem_wait(sync_sem);
+#else
+  pthread_mutex_lock(&sync_mutex);
+  printf("Locked sync_mutex, waiting (UE_thread)\n");
+  while (sync_var<0)
+    pthread_cond_wait(&sync_cond, &sync_mutex);
+  pthread_mutex_unlock(&sync_mutex);
+  printf("unlocked sync_mutex, waiting (UE_thread)\n");
+#endif
 
+  printf("starting UE thread\n");
+  
 #if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
   /* Wait for NAS UE to start cell selection */
   wait_system_ready ("Waiting for UE to be activated by UserProcess %s\r", &start_UE);
@@ -2505,29 +2588,58 @@ static void *UE_thread(void *arg) {
   rt_make_hard_real_time();
 #endif
 
+
+#ifdef LOWLATENCY
+  attr.size = sizeof(attr);
+  attr.sched_flags = 0;
+  attr.sched_nice = 0;
+  attr.sched_priority = 0;
+  
+  // This creates a .25 ms  reservation
+  attr.sched_policy = SCHED_DEADLINE;
+  attr.sched_runtime  = 0.25 * 1000000;
+  attr.sched_deadline = 0.25 * 1000000;
+  attr.sched_period   = 0.5 * 1000000;
+  
+  // pin the UE main thread to CPU0
+  // if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) {
+  //   perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n");
+  //   }
+  
+  if (sched_setattr(0, &attr, flags) < 0 ){
+    perror("[SCHED] main UE thread: sched_setattr failed\n");
+    exit_fun("Nothing to add");
+  } else {
+    LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n",
+	  gettid(),sched_getcpu());
+  }
+#endif
+  
+
   mlockall(MCL_CURRENT | MCL_FUTURE);
 
   openair_daq_vars.freq_offset = 0; //-7500;
-  /*
-    if (mode == rx_calib_ue) {
-    openair_daq_vars.freq_offset = -7500;
-    for (i=0; i<4; i++) {
-    p_exmimo_config->rf.rf_freq_rx[i] = p_exmimo_config->rf.rf_freq_rx[i]+openair_daq_vars.freq_offset;
-    p_exmimo_config->rf.rf_freq_tx[i] = p_exmimo_config->rf.rf_freq_rx[i]+openair_daq_vars.freq_offset;
-    }
-    openair0_dump_config(0);
-    }
-  */
+
+  first_synch = 1;
+
   while (!oai_exit)  {
 
     hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store
 
      
-    if (is_synchronized) {
+    if (UE->is_synchronized) {
 
+      if (first_synch == 1) {
+	first_synch = 0;
+	for (card=0;card<openair0_num_detected_cards;card++)
+          openair0_start_rt_acquisition(card);
+	rt_sleep_ns(FRAME_PERIOD/10);
+      }
 
       //this is the mbox counter that indicates the start of the frame
-      rx_offset_mbox = (PHY_vars_UE_g[0][0]->rx_offset * 150) / (10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti);
+      rx_offset_mbox = (UE->rx_offset * 150) / (10*UE->lte_frame_parms.samples_per_tti);
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_UE_RX_OFFSET, UE->rx_offset);
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_UE_OFFSET_MBOX, rx_offset_mbox);
       //this is the mbox counter where we should be
       mbox_target = (((((slot+1)%20)*15+1)>>1) + rx_offset_mbox + 1)%150;
       // round up to the next multiple of two (mbox counter from express MIMO gives only even numbers)
@@ -2552,160 +2664,235 @@ static void *UE_thread(void *arg) {
 	    LOG_W(HW,"[UE] just missed slot (total missed slots %ld)\n", num_missed_slots);
 	  }
 	}
-	slot++;
-	if (slot==20) {
-	  slot=0;
-	  frame++;
+        slot++;
+        if (slot==20) {
+          slot=0;
+          frame++;
+        }
+	// update thread slot/frame counters because of skipped slot
+	UE->slot_rx++;
+	UE->slot_tx++;
+	
+	if (UE->slot_rx == 20) {
+	  UE->slot_rx = 0;
+	  UE->frame_rx++;
+	}
+	if (UE->slot_tx == 20) {
+	  UE->slot_tx = 0;
+	  UE->frame_tx++;
 	}
 	continue;
       }
       if (diff2>8)
 	LOG_D(HW,"UE Frame %d: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, slot, hw_slot, mbox_current, mbox_target, diff2);
 	
-      /*
-	if (frame%100==0)
-	LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, rx_offset_mbox %d, mbox_target %d, mbox_current %d, diff %d\n",frame, PHY_vars_UE_g[0]->frame, slot,hw_slot,rx_offset_mbox,mbox_target,mbox_current,diff2);
-      */
 	
       vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
       vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
 	
+
+
+      // This loop implements the delay of 1 slot to allow for processing
       delay_cnt = 0;
-      while ((diff2>0) && (!oai_exit) && (is_synchronized) )  {
-	time_in = rt_get_time_ns();
-	//LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in);
-	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
-	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
-	ret = rt_sleep_ns(diff2*DAQ_PERIOD);
-	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
-	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
-	if (ret)
-	  LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
+      while ((diff2>0) && (!oai_exit) )  {
+        time_in = rt_get_time_ns();
+        //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in);
+        vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
+        ret = rt_sleep_ns(diff2*DAQ_PERIOD);
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
+        vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
+        if (ret)
+          LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
+          
+        hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
+        //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
+        delay_cnt++;
+        if (delay_cnt == 30)  {
+          LOG_D(HW,"UE frame %d: HW stopped ... \n",frame);
+          exit_fun("[HW][UE] HW stopped");
+        }
+        mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
+        if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround
+          diff2 = 150-mbox_current+mbox_target;
+        else if ((mbox_current<15) && (mbox_target>=135))
+          diff2 = -150+mbox_target-mbox_current;
+        else
+          diff2 = mbox_target - mbox_current;
+          
+        vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
+        vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
+      }
+
+      // on even slots, schedule processing of entire subframe
+      if ((slot&1) == 0)  {
+	
+	if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
+	  LOG_E(PHY,"[SCHED][UE] error locking mutex for UE RX thread\n");
+	  exit_fun("nothing to add");
+	}
+	else {
 	  
-	hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
-	//LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
-	delay_cnt++;
-	if (delay_cnt == 30)  {
-	  LOG_D(HW,"UE frame %d: HW stopped ... \n",frame);
-	  exit_fun("[HW][UE] HW stopped");
+	  UE->instance_cnt_rx++;
+	  //printf("UE_thread: Unlocking UE mutex_rx\n");
+	  pthread_mutex_unlock(&UE->mutex_rx);
+	  if (UE->instance_cnt_rx == 0) {
+	    LOG_D(HW,"Scheduling UE RX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_rx,frame,slot>>1,UE->slot_rx>>1,mode);
+	    if (pthread_cond_signal(&UE->cond_rx) != 0) {
+	      LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n");
+	      exit_fun("nothing to add");
+	    }
+	    else {
+	      //	      printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0);
+	    }
+	    if (mode == rx_calib_ue) {
+	      if (frame == 10) {
+		LOG_D(PHY,"[SCHED][UE] Found cell with N_RB_DL %d, PHICH CONFIG (%d,%d), Nid_cell %d, NB_ANTENNAS_TX %d, initial frequency offset %d Hz, frequency offset %d Hz, RSSI (digital) %d dB, measured Gain %d dB, total_rx_gain %d dB, USRP rx gain %f dB\n",
+		      UE->lte_frame_parms.N_RB_DL,
+		      UE->lte_frame_parms.phich_config_common.phich_duration,
+		      UE->lte_frame_parms.phich_config_common.phich_resource,
+		      UE->lte_frame_parms.Nid_cell,
+		      UE->lte_frame_parms.nb_antennas_tx_eNB,
+		      openair_daq_vars.freq_offset,
+		      UE->lte_ue_common_vars.freq_offset,
+		      UE->PHY_measurements.rx_power_avg_dB[0],
+		      UE->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm,
+		      UE->rx_total_gain_dB,
+		      openair0_cfg[0].rx_gain[0]
+		      );
+		exit_fun("[HW][UE] UE in RX calibration mode, exiting");
+	      }
+	    }
+	  }
+	  else {
+	    LOG_E(PHY,"[SCHED][UE] UE RX thread busy!!\n");
+	    exit_fun("nothing to add");
+	  }
 	}
-	mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
-	if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround
-	  diff2 = 150-mbox_current+mbox_target;
-	else if ((mbox_current<15) && (mbox_target>=135))
-	  diff2 = -150+mbox_target-mbox_current;
-	else
-	  diff2 = mbox_target - mbox_current;
+
+	if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
+	  LOG_E(PHY,"[SCHED][UE] error locking mutex for UE TX thread\n");
+	  exit_fun("nothing to add");
+	}
+	else {
 	  
-	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
-	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
+	  UE->instance_cnt_tx++;
+	  //printf("UE_thread: Unlocking UE mutex_rx\n");
+	  pthread_mutex_unlock(&UE->mutex_tx);
+	  if (UE->instance_cnt_tx == 0) {
+	    LOG_D(HW,"Scheduling UE TX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_tx,frame,slot>>1,UE->slot_tx>>1,mode);
+	    if (pthread_cond_signal(&UE->cond_tx) != 0) {
+	      LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n");
+	      exit_fun("nothing to add");
+	    }
+	    else {
+	      //	      printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0);
+	    }
+	  }
+	  else {
+	    LOG_E(PHY,"[SCHED][UE] UE TX thread busy!!\n");
+	    exit_fun("nothing to add");
+	  }
+	}
       }
-	
-    }
-      
-    last_slot = (slot)%LTE_SLOTS_PER_FRAME;
-    if (last_slot <0)
-      last_slot+=LTE_SLOTS_PER_FRAME;
-    next_slot = (slot+3)%LTE_SLOTS_PER_FRAME;
-
-    PHY_vars_UE_g[0][0]->slot_rx = last_slot;
-    PHY_vars_UE_g[0][0]->slot_tx = next_slot;
-    if (PHY_vars_UE_g[0][0]->slot_rx==20) 
-      PHY_vars_UE_g[0][0]->frame_rx++;
-    if (PHY_vars_UE_g[0][0]->slot_tx==20) 
-      PHY_vars_UE_g[0][0]->frame_tx++;
 
-      
-    if (is_synchronized)  {
-      phy_procedures_UE_lte (PHY_vars_UE_g[0][0], 0, 0, mode, 0, NULL);
-	
-    }
-    else {  // we are not yet synchronized
+      /*
+	if ((slot%2000)<10)
+	LOG_D(HW,"fun0: doing very hard work\n");
+      */
+      // now increment slot and frame counters
+      slot++;
+      if (slot==20) {
+	slot=0;
+	frame++;
+      }
+    }	
+    else if (UE->is_synchronized == 0) {  // we are not yet synchronized
       hw_slot_offset = 0;
-	
+      first_synch = 1;
       slot = 0;
-      openair0_get_frame(0);
-      //          LOG_D(HW,"after get_frame\n");
-      //          rt_sleep_ns(FRAME_PERIOD);
-      //          LOG_D(HW,"after sleep\n");
-	
-      if (initial_sync(PHY_vars_UE_g[0][0],mode)==0) {
-	/*
-	  lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms,
-	  PHY_vars_UE_g[0],
-	  0,
-	  1,
-	  16384);
-	*/
-	//for better visualization afterwards
-	/*
-	  for (aa=0; aa<PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx; aa++)
-	  memset(PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[aa],0,
-	  PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int));
-	*/
-	
-	/*if (mode == rx_calib_ue) {
-	  exit_fun("[HW][UE] UE in RX calibration mode");
-	  }
-	  else {*/
-	is_synchronized = 1;
-	//start the DMA transfers
-	//LOG_D(HW,"Before openair0_start_rt_acquisition \n");
-	for (card=0;card<openair0_num_detected_cards;card++)
-	  openair0_start_rt_acquisition(card);
-	    
-	hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti;
-	//LOG_D(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset);
-	oai_exit=1;
-	/*}*/
+
+
+      // wait until we can lock mutex_synch
+      if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
+	LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n");
+	exit_fun("noting to add");
       }
       else {
-	if (openair_daq_vars.freq_offset >= 0) {
-	  openair_daq_vars.freq_offset += 100;
-	  openair_daq_vars.freq_offset *= -1;
-	}
-	else {
-	  openair_daq_vars.freq_offset *= -1;
-	}
-	if (abs(openair_daq_vars.freq_offset) > 7500) {
-	  LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n");
-	  mac_xface->macphy_exit("No cell synchronization found, abondoning");
+	if (UE->instance_cnt_synch < 0) {
+
+	  wait_sync_cnt=0;
+	  openair0_get_frame(0);
+	  // increment instance count for sync thread
+	  UE->instance_cnt_synch++;
+	  pthread_mutex_unlock(&UE->mutex_synch);
+	  if (pthread_cond_signal(&UE->cond_synch) != 0) {
+	    LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n");
+	    exit_fun("nothing to add");
+	  }
 	}
 	else {
-	  //	  LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
-#ifndef USRP
-	  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
-	    for (i=0; i<openair0_cfg[rf_map[CC_id].card].rx_num_channels; i++) 
-	      openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+openair_daq_vars.freq_offset;
-	    for (i=0; i<openair0_cfg[rf_map[CC_id].card].tx_num_channels; i++) 
-	      openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+openair_daq_vars.freq_offset;
-	  }
-	  openair0_config(&openair0_cfg[0],UE_flag);
-#endif
-	  rt_sleep_ns(FRAME_PERIOD);
+	  wait_sync_cnt++;
+	  pthread_mutex_unlock(&UE->mutex_synch);
+	  if (wait_sync_cnt>1000)
+	    exit_fun("waiting to long for synch thread");
+	  else
+	    rt_sleep_ns(FRAME_PERIOD);
 	}
-      }
-    }
-    
-    /*
-      if ((slot%2000)<10)
-      LOG_D(HW,"fun0: doing very hard work\n");
-    */
-    slot++;
-    if (slot==20) {
-      slot=0;
-      frame++;
+      }	  
+
+      
+      /*            
+		    if (initial_sync(UE,mode)==0) {
+
+		    if (mode == rx_calib_ue) {
+		    exit_fun("[HW][UE] UE in RX calibration mode");
+		    }
+		    else {
+		    is_synchronized = 1;
+		    //start the streaming DMA transfers
+		    for (card=0;card<openair0_num_detected_cards;card++)
+		    openair0_start_rt_acquisition(card);
+	  
+		    hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti;
+		    }
+		    }
+		    else {
+		    if (openair_daq_vars.freq_offset >= 0) {
+		    openair_daq_vars.freq_offset += 100;
+		    openair_daq_vars.freq_offset *= -1;
+		    }
+		    else {
+		    openair_daq_vars.freq_offset *= -1;
+		    }
+		    if (abs(openair_daq_vars.freq_offset) > 7500) {
+		    LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n");
+		    mac_xface->macphy_exit("No cell synchronization found, abondoning");
+		    }
+		    else {
+		    //	  LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
+		    #ifndef USRP
+		    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+		    for (i=0; i<openair0_cfg[rf_map[CC_id].card].rx_num_channels; i++) 
+		    openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+openair_daq_vars.freq_offset;
+		    for (i=0; i<openair0_cfg[rf_map[CC_id].card].tx_num_channels; i++) 
+		    openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+openair_daq_vars.freq_offset;
+		    }
+		    openair0_config(&openair0_cfg[0],UE_flag);
+		    #endif
+		    rt_sleep_ns(FRAME_PERIOD);
+		    }
+		    }
+      */
     }
-#if defined(ENABLE_ITTI)
-    itti_update_lte_time(frame, slot);
-#endif
   }
-  LOG_D(HW,"UE_thread: finished, ran %d times.\n",frame);
 
+  LOG_D(HW,"UE_thread: finished, ran %d times.\n",frame);
+  
 #ifdef HARD_RT
   rt_make_soft_real_time();
 #endif
-
+  
   // clean task
 #ifdef RTAI
   rt_task_delete(task);
@@ -2724,13 +2911,13 @@ void init_UE_threads(void) {
   PHY_VARS_UE *UE=PHY_vars_UE_g[0][0];
 
   pthread_attr_init(&attr_UE_thread_tx);
-  pthread_attr_setstacksize(&attr_UE_thread_tx,PTHREAD_STACK_MIN);
+  pthread_attr_setstacksize(&attr_UE_thread_tx,16*PTHREAD_STACK_MIN);
   sched_param_UE_thread_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
   pthread_attr_setschedparam  (&attr_UE_thread_tx, &sched_param_UE_thread_tx);
   pthread_attr_setschedpolicy (&attr_UE_thread_tx, SCHED_FIFO);
 
   pthread_attr_init(&attr_UE_thread_rx);
-  pthread_attr_setstacksize(&attr_UE_thread_rx,PTHREAD_STACK_MIN);
+  pthread_attr_setstacksize(&attr_UE_thread_rx,8*PTHREAD_STACK_MIN);
   sched_param_UE_thread_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
   pthread_attr_setschedparam  (&attr_UE_thread_rx, &sched_param_UE_thread_rx);
   pthread_attr_setschedpolicy (&attr_UE_thread_rx, SCHED_FIFO);
@@ -2748,19 +2935,9 @@ void init_UE_threads(void) {
   pthread_create(&UE->thread_rx,NULL,UE_thread_rx,(void*)UE);
   pthread_create(&UE->thread_rx,NULL,UE_thread_synch,(void*)UE);
   UE->frame_tx = 0;
-
-#ifndef EXMIMO
-  UE->slot_tx = 2;
-  UE->slot_rx = 0;
-  UE->frame_rx = 0;
-#else
-  UE->slot_tx = 1;
-  UE->slot_rx = 19;
   UE->frame_rx = 0;
-#endif
 
   
-  
 }
 
 
@@ -3297,7 +3474,7 @@ int main(int argc, char **argv) {
     else
       { //UE_flag==1
 	frame_parms[CC_id]->nb_antennas_tx     = 1;
-	frame_parms[CC_id]->nb_antennas_rx     = 2;
+	frame_parms[CC_id]->nb_antennas_rx     = 1;
 	frame_parms[CC_id]->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; //initial value overwritten by initial sync later
       }
     frame_parms[CC_id]->mode1_flag         = (transmission_mode == 1) ? 1 : 0;
@@ -3592,10 +3769,12 @@ int main(int argc, char **argv) {
 #endif
   }
 
+  printf("Initializing openair0 ...");
   if (openair0_device_init(&openair0, &openair0_cfg[0]) <0) {
     printf("Exiting, cannot initialize device\n");
     exit(-1);
   }
+  printf("Done\n");
 
   mac_xface = malloc(sizeof(MAC_xface));
 
@@ -3621,6 +3800,7 @@ int main(int argc, char **argv) {
   printf("ITTI tasks created\n");
 #endif
 
+  printf("Filling UE band info\n");
   if (UE_flag==1)
     fill_ue_band_info();
 
@@ -3648,7 +3828,7 @@ int main(int argc, char **argv) {
   number_of_cards = 1;
 #endif 
 
-  openair_daq_vars.timing_advance = 0;
+
 
   for(CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
     rf_map[CC_id].card=0;
@@ -3657,6 +3837,7 @@ int main(int argc, char **argv) {
 
   // connect the TX/RX buffers
   if (UE_flag==1) {
+    openair_daq_vars.timing_advance = 170;
     if (setup_ue_buffers(PHY_vars_UE_g[0],&openair0_cfg[0],rf_map)!=0) {
       printf("Error setting up eNB buffer\n");
       exit(-1);
@@ -3671,6 +3852,7 @@ int main(int argc, char **argv) {
     //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
   }
   else {
+    openair_daq_vars.timing_advance = 0;
     if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) {
       printf("Error setting up eNB buffer\n");
       exit(-1);
@@ -3809,18 +3991,20 @@ int main(int argc, char **argv) {
 
 #ifndef RTAI
   pthread_attr_init (&attr_dlsch_threads);
-  pthread_attr_setstacksize(&attr_dlsch_threads,PTHREAD_STACK_MIN);
+  pthread_attr_setstacksize(&attr_dlsch_threads,4*PTHREAD_STACK_MIN);
 
   pthread_attr_init (&attr_UE_thread);
-  pthread_attr_setstacksize(&attr_UE_thread,4*PTHREAD_STACK_MIN);
+  pthread_attr_setstacksize(&attr_UE_thread,8192);//5*PTHREAD_STACK_MIN);
 
 #ifndef LOWLATENCY
+  sched_param_UE_thread.sched_priority = sched_get_priority_max(SCHED_FIFO);
+  pthread_attr_setschedparam(&attr_UE_thread,&sched_param_UE_thread);
   sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
   pthread_attr_setschedparam  (&attr_dlsch_threads, &sched_param_dlsch);
   pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
 #endif 
   pthread_attr_init (&attr_UE_init_synch);
-  pthread_attr_setstacksize(&attr_UE_init_synch,PTHREAD_STACK_MIN);
+  pthread_attr_setstacksize(&attr_UE_init_synch,8*PTHREAD_STACK_MIN);
   sched_param_UE_init_synch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
   pthread_attr_setschedparam  (&attr_UE_init_synch, &sched_param_UE_init_synch);
   pthread_attr_setschedpolicy (&attr_UE_init_synch, SCHED_FIFO);
@@ -3830,6 +4014,12 @@ int main(int argc, char **argv) {
   // start the main thread
   if (UE_flag == 1) {
     init_UE_threads();
+#ifdef DLSCH_THREAD
+    init_rx_pdsch_thread();
+    rt_sleep_ns(FRAME_PERIOD/10);
+    init_dlsch_threads();
+#endif
+    printf("UE threads created\n");
     sleep(1);
 #ifdef RTAI
     main_ue_thread = rt_thread_create(UE_thread, NULL, 100000000);
@@ -3843,12 +4033,6 @@ int main(int argc, char **argv) {
       LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n");
     }
 #endif
-#ifdef DLSCH_THREAD
-    init_rx_pdsch_thread();
-    rt_sleep_ns(FRAME_PERIOD/10);
-    init_dlsch_threads();
-#endif
-    printf("UE threads created\n");
   }
   else {
 
diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c
index 710fa258fd..4cbd764121 100644
--- a/targets/RT/USER/sched_rx_pdsch.c
+++ b/targets/RT/USER/sched_rx_pdsch.c
@@ -187,7 +187,7 @@ static void * rx_pdsch_thread(void *param) {
         //time0 = rt_get_time_ns();
         //        rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",UE->frame,last_slot,rt_get_time_ns());
         for (m=pilot2;m<UE->lte_frame_parms.symbols_per_tti;m++) {
-
+ 
             rx_pdsch(UE,
                      PDSCH,
                      eNB_id,
diff --git a/targets/RT/USER/ue.gtkw b/targets/RT/USER/ue.gtkw
index 1b98219f60..bd87b29b72 100644
--- a/targets/RT/USER/ue.gtkw
+++ b/targets/RT/USER/ue.gtkw
@@ -1,26 +1,31 @@
 [*]
 [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
-[*] Sat Jan  3 21:45:58 2015
+[*] Thu Feb  5 10:38:10 2015
 [*]
 [dumpfile] "/tmp/openair_dump_UE.vcd"
-[dumpfile_mtime] "Sat Jan  3 21:45:33 2015"
-[dumpfile_size] 98393197
-[savefile] "/home/haswell/openair4G_knopp/targets/RT/USER/ue.gtkw"
-[timestart] 72755430000
+[dumpfile_mtime] "Thu Feb  5 10:38:10 2015"
+[dumpfile_size] 63195810
+[savefile] "/home/ephese/openair4G/targets/RT/USER/ue.gtkw"
+[timestart] 55175040000
 [size] 1221 600
-[pos] 251 123
-*-21.000000 72759034000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+[pos] -1 -1
+*-17.000000 55175269780 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 [sst_width] 224
 [signals_width] 262
 [sst_expanded] 1
 [sst_vpaned_height] 143
 @24
 variables.hw_subframe[63:0]
-variables.frame_number_UE[63:0]
-@25
-variables.slot_number_UE[63:0]
 @28
 functions.phy_procedures_ue_rx
+functions.phy_procedures_ue_tx
+@24
+variables.frame_number_RX_UE[63:0]
+variables.frame_number_TX_UE[63:0]
+@25
+variables.subframe_number_RX_UE[63:0]
+variables.subframe_number_TX_UE[63:0]
+@28
 functions.ue_slot_fep
 functions.lte_ue_measurement_procedures
 functions.ue_rrc_measurements
@@ -30,6 +35,7 @@ functions.lte_ue_pbch_procedures
 functions.lte_ue_pdcch_procedures
 functions.rx_pdcch
 functions.dci_decoding
+functions.phy_ue_generate_prach
 functions.phy_ue_ulsch_encoding
 functions.phy_ue_ulsch_modulation
 functions.phy_ue_ulsch_scrambling
diff --git a/targets/RT/USER/ue_exmimo2.gtkw b/targets/RT/USER/ue_exmimo2.gtkw
index 334120e10a..e9cac85100 100644
--- a/targets/RT/USER/ue_exmimo2.gtkw
+++ b/targets/RT/USER/ue_exmimo2.gtkw
@@ -1,15 +1,15 @@
 [*]
 [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
-[*] Thu Feb  5 10:24:50 2015
+[*] Thu Feb  5 17:45:30 2015
 [*]
 [dumpfile] "/tmp/openair_dump_UE.vcd"
-[dumpfile_mtime] "Thu Feb  5 10:24:33 2015"
-[dumpfile_size] 57929998
+[dumpfile_mtime] "Thu Feb  5 17:10:05 2015"
+[dumpfile_size] 18764854
 [savefile] "/home/ephese/openair4G/targets/RT/USER/ue_exmimo2.gtkw"
-[timestart] 7161510000
+[timestart] 4937140000
 [size] 1463 640
 [pos] 105 102
-*-22.000000 7171400000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+*-22.000000 4947033063 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 [sst_width] 224
 [signals_width] 262
 [sst_expanded] 1
@@ -19,13 +19,15 @@ variables.hw_subframe[63:0]
 variables.daq_mbox[63:0]
 variables.diff2[63:0]
 variables.ue_rx_offset[63:0]
-@25
 variables.rx_offset_mbox[63:0]
 @28
 functions.rt_sleep
 @24
 variables.subframe_number_RX_UE[63:0]
 variables.subframe_number_TX_UE[63:0]
+variables.slot_number_RX_UE[63:0]
+@25
+variables.slot_number_RX_UE[63:0]
 @28
 functions.phy_procedures_ue_rx
 functions.phy_procedures_ue_tx
-- 
GitLab