From 33860c1604cef2ea63093667b5cd8dcacc70d559 Mon Sep 17 00:00:00 2001
From: ABEILLE <abeille@ABEILLE.openair4G.eur>
Date: Mon, 19 Oct 2015 19:29:04 +0200
Subject: [PATCH] merged in changes from abeille (modifications on final svn
 version)

---
 openair1/PHY/LTE_ESTIMATION/defs.h            |   7 +-
 .../PHY/LTE_ESTIMATION/lte_eNB_measurements.c | 108 ++++++--------
 openair1/PHY/LTE_TRANSPORT/defs.h             |   6 +-
 openair1/PHY/LTE_TRANSPORT/print_stats.c      |  18 +--
 openair1/PHY/LTE_TRANSPORT/proto.h            |  28 ++--
 openair1/PHY/LTE_TRANSPORT/pucch.c            | 133 ++++++++++--------
 .../PHY/LTE_TRANSPORT/ulsch_demodulation.c    |   7 +
 openair1/PHY/TOOLS/lte_phy_scope.c            |  13 +-
 openair1/PHY/defs.h                           |   3 +
 openair1/PHY/impl_defs_top.h                  |   2 +-
 openair1/SCHED/phy_procedures_lte_eNb.c       |  61 ++++++--
 openair1/SIMULATION/LTE_PHY/pucchsim.c        |  26 ++--
 openair2/LAYER2/MAC/eNB_scheduler_dlsch.c     |  11 +-
 openair2/LAYER2/MAC/eNB_scheduler_ulsch.c     |   1 +
 targets/ARCH/COMMON/common_lib.c              |  11 +-
 .../CONF/enb.band7.tm1.usrpb210.conf          |   6 +-
 targets/RT/USER/lte-softmodem.c               |  35 +++--
 17 files changed, 277 insertions(+), 199 deletions(-)

diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h
index 10dc558c9b..903793c2b5 100644
--- a/openair1/PHY/LTE_ESTIMATION/defs.h
+++ b/openair1/PHY/LTE_ESTIMATION/defs.h
@@ -243,15 +243,16 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
 
 int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id,uint8_t subframe);
 
-void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNb,
+void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
+			     int subframe,
                              module_id_t eNB_id,
                              unsigned char clear);
 
-void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *phy_vars_eNb,
+void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *phy_vars_eNB,
                                   uint8_t sect_id);
 
 
-void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
+void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNBy,
                               module_id_t eNB_id,
                               module_id_t UE_id,
                               unsigned char init_averaging);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
index 9564b7842c..7c0c45b05c 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
@@ -39,57 +39,36 @@
 int32_t rx_power_avg_eNB[3][3];
 
 
-void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNb,
+void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
+			     int subframe,
                              unsigned char eNB_id,
                              unsigned char clear)
 {
 
-  LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNb->lte_eNB_common_vars;
-  LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNb->lte_frame_parms;
-  PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNb->PHY_measurements_eNB[eNB_id];
-
+  LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars;
+  LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
+  PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNB->PHY_measurements_eNB[eNB_id];
+  int32_t *rb_mask = phy_vars_eNB->rb_mask_ul;
 
   uint32_t aarx,rx_power_correction;
   uint32_t rb;
   int32_t *ul_ch;
   int32_t n0_power_tot;
-
+  int len;
+  int offset;
+  int Nsymb = (frame_parms->Ncp==NORMAL)?14:12;
   // noise measurements
   // for the moment we measure the noise on the 7th OFDM symbol (in S subframe)
 
   phy_measurements->n0_power_tot = 0;
 
-  /*  printf("rxdataF0 %p, rxdataF1 %p\n",
-   (&eNB_common_vars->rxdataF[0][0][(frame_parms->ofdm_symbol_size + frame_parms->first_carrier_offset)<<1 ]),
-   (&eNB_common_vars->rxdataF[0][1][(frame_parms->ofdm_symbol_size + frame_parms->first_carrier_offset)<<1 ]));
-  */
-  /*
-  for (i=0;i<512;i++)
-    printf("sector 0 antenna 0 : %d,%d\n",((short *)&eNB_common_vars->rxdataF[0][0][(19*frame_parms->ofdm_symbol_size)<<1])[i<<1],
-     ((short *)&eNB_common_vars->rxdataF[0][0][(19*frame_parms->ofdm_symbol_size)<<1])[1+(i<<1)]);
-
-  for (i=0;i<12;i++)
-    //    printf("sector 0 antenna 1 : %d,%d\n",((short *)&eNB_common_vars->rxdataF[0][1][(19*frame_parms->ofdm_symbol_size)<<1])[i<<1],
-     ((short *)&eNB_common_vars->rxdataF[0][1][(19*frame_parms->ofdm_symbol_size)<<1])[1+(i<<1)]);
-  */
-
-  if ( (frame_parms->ofdm_symbol_size == 128) ||
-       (frame_parms->ofdm_symbol_size == 512) )
-    rx_power_correction = 2;
-  else
-    rx_power_correction = 1;
-
   for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
     if (clear == 1)
       phy_measurements->n0_power[aarx]=0;
 
-#ifdef USER_MODE
+
     phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size],
                                          frame_parms->ofdm_symbol_size)) + k2*phy_measurements->n0_power[aarx])>>10;
-#else
-    phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size],
-                                         frame_parms->ofdm_symbol_size))+k2*phy_measurements->n0_power[aarx])>>10;
-#endif
     phy_measurements->n0_power[aarx] = (phy_measurements->n0_power[aarx] * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size);
     phy_measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_measurements->n0_power[aarx]);
     phy_measurements->n0_power_tot +=  phy_measurements->n0_power[aarx];
@@ -97,52 +76,49 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNb,
 
   phy_measurements->n0_power_tot_dB = (unsigned short) dB_fixed(phy_measurements->n0_power_tot);
 
-  phy_measurements->n0_power_tot_dBm = phy_measurements->n0_power_tot_dB - phy_vars_eNb->rx_total_gain_eNB_dB;
+  phy_measurements->n0_power_tot_dBm = phy_measurements->n0_power_tot_dB - phy_vars_eNB->rx_total_gain_eNB_dB;
   //      printf("n0_power %d\n",phy_measurements->n0_power_tot_dB);
 
 
   for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
 
     n0_power_tot=0;
-
-    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-
-
-      if (rb < 12)
-        //  ul_ch    = &eNB_common_vars->rxdataF[eNB_id][aarx][((19*(frame_parms->ofdm_symbol_size)) + frame_parms->first_carrier_offset + (rb*12))<<1];
-        ul_ch    = &eNB_common_vars->rxdataF[eNB_id][aarx][((7*frame_parms->ofdm_symbol_size) + frame_parms->first_carrier_offset + (rb*12))<<1];
-      else if (rb>12)
-        ul_ch    = &eNB_common_vars->rxdataF[eNB_id][aarx][((7*frame_parms->ofdm_symbol_size) + 6 + (rb-13)*12)<<1];
-      else {
-        ul_ch = NULL;
-      }
-
-      if (clear == 1)
-        phy_measurements->n0_subband_power[aarx][rb]=0;
-
-      if (ul_ch) {
-        //  for (i=0;i<24;i+=2)
-        //    printf("re %d => %d\n",i/2,ul_ch[i]);
-        phy_measurements->n0_subband_power[aarx][rb] = ((k1*(signal_energy_nodc(ul_ch,
-            24))*rx_power_correction) + (k2*phy_measurements->n0_subband_power[aarx][rb]))>>11;  // 11 and 24 to compensate for repeated signal format
-
-        phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]);
-        //  printf("eNb %d, aarx %d, rb %d : energy %d (%d dB)\n",eNB_id,aarx,rb,signal_energy_nodc(ul_ch,24),  phy_measurements->n0_subband_power_dB[aarx][rb]);
-        n0_power_tot += phy_measurements->n0_subband_power[aarx][rb];
-      } else {
-        phy_measurements->n0_subband_power[aarx][rb] = 1;
-        phy_measurements->n0_subband_power_dB[aarx][rb] = -99;
-        n0_power_tot = 1;
+    if ((rb_mask[rb>>5]&(1<<(rb&31))) == 0) {  // check that rb was not used in this subframe
+      for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
+
+      // select the 7th symbol in an uplink subframe
+	offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
+	offset += (7*frame_parms->ofdm_symbol_size);//(((Nsymb*subframe)+7)*frame_parms->ofdm_symbol_size);
+	ul_ch  = &eNB_common_vars->rxdataF[eNB_id][aarx][offset];
+	len = 12;
+	// just do first half of middle PRB for odd number of PRBs
+	if (((frame_parms->N_RB_UL&1) == 1) && 
+	    (rb==(frame_parms->N_RB_UL>>1))) {
+	  len=6;
+	}
+	if (clear == 1)
+	  phy_measurements->n0_subband_power[aarx][rb]=0;
+
+	AssertFatal(ul_ch, "RX signal buffer (freq) problem");
+
+
+	phy_measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len);
+	//((k1*(signal_energy_nodc(ul_ch,len))) 
+	  //  + (k2*phy_measurements->n0_subband_power[aarx][rb]));  
+	  
+	phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]);
+	//	printf("subframe %d (%d): eNb %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len),  
+	//	       phy_measurements->n0_subband_power_dB[aarx][rb]);
+	n0_power_tot += phy_measurements->n0_subband_power[aarx][rb];
       }
+      
+      phy_measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
+      phy_measurements->n0_subband_power_tot_dBm[rb] = phy_measurements->n0_subband_power_tot_dB[rb] - phy_vars_eNB->rx_total_gain_eNB_dB - dB_fixed(frame_parms->N_RB_UL);
+      
     }
-
-    phy_measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
-    phy_measurements->n0_subband_power_tot_dBm[rb] = phy_measurements->n0_subband_power_tot_dB[rb] - phy_vars_eNb->rx_total_gain_eNB_dB - 14;
-
   }
 }
 
-
 void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb,
                               unsigned char eNB_id,
                               unsigned char UE_id,
diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
index a21693fea0..8b23c51079 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -576,13 +576,13 @@ typedef struct {
   /// UL RSSI per receive antenna
   int32_t UL_rssi[NB_ANTENNAS_RX];
   /// PUCCH1a/b power (digital linear)
-  int32_t Po_PUCCH;
+  uint32_t Po_PUCCH;
   /// PUCCH1a/b power (dBm)
   int32_t Po_PUCCH_dBm;
   /// PUCCH1 power (digital linear), conditioned on below threshold
-  int32_t Po_PUCCH1_below;
+  uint32_t Po_PUCCH1_below;
   /// PUCCH1 power (digital linear), conditioned on above threshold
-  int32_t Po_PUCCH1_above;
+  uint32_t Po_PUCCH1_above;
   /// Indicator that Po_PUCCH has been updated by PHY
   int32_t Po_PUCCH_update;
   /// DL Wideband CQI index (2 TBs)
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index 53ca875953..ab946fc3da 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -573,11 +573,13 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length)
                    phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[0],
                    phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[1]);
 
-    len += sprintf(&buffer[len],"[eNB PROC] Subband I0: ");
+    len += sprintf(&buffer[len],"[eNB PROC] PRB I0 (%X.%X.%X.%X): ",
+		   phy_vars_eNB->rb_mask_ul[0],
+		   phy_vars_eNB->rb_mask_ul[1],phy_vars_eNB->rb_mask_ul[2],phy_vars_eNB->rb_mask_ul[3]);
 
-    for (i=0; i<25; i++)
-      len += sprintf(&buffer[len],"%2d ",
-                     phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dB[i]);
+    for (i=0; i<phy_vars_eNB->lte_frame_parms.N_RB_UL; i++)
+      len += sprintf(&buffer[len],"%4d ",
+                     phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]);
 
     len += sprintf(&buffer[len],"\n");
     len += sprintf(&buffer[len],"\n[eNB PROC] PERFORMANCE PARAMETERS\n");
@@ -634,11 +636,11 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length)
                      dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->ulsch_power[1]),
                      phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[0],
                      phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[1],
-		     dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH)-phy_vars_eNB->rx_total_gain_eNB_dB,
+		     dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
 		     phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
-		     dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below)-phy_vars_eNB->rx_total_gain_eNB_dB,
-		     dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above)-phy_vars_eNB->rx_total_gain_eNB_dB,
-		     PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm, //-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL),
+		     dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
+		     dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
+		     PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL),
                      phy_vars_eNB->eNB_UE_stats[UE_id].sector);
 
       for(i=0; i<8; i++)
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index eb32aab24e..e472e30676 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -1634,22 +1634,22 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
                          uint8_t subframe);
 
 
-int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
-                 PUCCH_FMT_t fmt,
-                 uint8_t UE_id,
-                 uint16_t n1_pucch,
-                 uint16_t n2_pucch,
-                 uint8_t shortened_format,
-                 uint8_t *payload,
-                 uint8_t subframe,
-                 uint8_t pucch1_thres);
+uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
+		  PUCCH_FMT_t fmt,
+		  uint8_t UE_id,
+		  uint16_t n1_pucch,
+		  uint16_t n2_pucch,
+		  uint8_t shortened_format,
+		  uint8_t *payload,
+		  uint8_t subframe,
+		  uint8_t pucch1_thres);
 
 int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
-                      uint8_t UE_index,
-                      PUCCH_FMT_t fmt,
-                      uint8_t n1_pucch_sel,
-                      uint8_t *payload,
-                      uint8_t subframe);
+		       uint8_t UE_index,
+		       PUCCH_FMT_t fmt,
+		       uint8_t n1_pucch_sel,
+		       uint8_t *payload,
+		       uint8_t subframe);
 
 
 /*!
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c
index 2ed5694dd1..58d08ac205 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch.c
@@ -430,15 +430,15 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
 
 }
 
-int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
-                 PUCCH_FMT_t fmt,
-                 uint8_t UE_id,
-                 uint16_t n1_pucch,
-                 uint16_t n2_pucch,
-                 uint8_t shortened_format,
-                 uint8_t *payload,
-                 uint8_t subframe,
-                 uint8_t pucch1_thres)
+uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
+		  PUCCH_FMT_t fmt,
+		  uint8_t UE_id,
+		  uint16_t n1_pucch,
+		  uint16_t n2_pucch,
+		  uint8_t shortened_format,
+		  uint8_t *payload,
+		  uint8_t subframe,
+		  uint8_t pucch1_thres)
 {
 
 
@@ -446,11 +446,11 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
   LTE_eNB_COMMON *eNB_common_vars                = &phy_vars_eNB->lte_eNB_common_vars;
   LTE_DL_FRAME_PARMS *frame_parms                    = &phy_vars_eNB->lte_frame_parms;
   //  PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &phy_vars_eNB->pucch_config_dedicated[UE_id];
-  int8_t sigma2_dB                                   = phy_vars_eNB->PHY_measurements_eNB[0].n0_power_dB[0];
-  int32_t *Po_PUCCH                                  = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH);
+  int8_t sigma2_dB                                   = phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dB[6];
+  uint32_t *Po_PUCCH                                  = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH);
   int32_t *Po_PUCCH_dBm                              = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_dBm);
-  int32_t *Po_PUCCH1_below                           = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below);
-  int32_t *Po_PUCCH1_above                           = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above);
+  uint32_t *Po_PUCCH1_below                           = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below);
+  uint32_t *Po_PUCCH1_above                           = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above);
   int32_t *Po_PUCCH_update                           = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_update);
   uint32_t u,v,n,aa;
   uint32_t z[12*14];
@@ -468,7 +468,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
   uint32_t symbol_offset;
   int16_t stat_ref_re,stat_ref_im,*cfo,chest_re,chest_im;
   int32_t stat_re=0,stat_im=0;
-  int32_t stat,stat_max=0;
+  uint32_t stat,stat_max=0;
 
   uint8_t deltaPUCCH_Shift          = frame_parms->pucch_config_common.deltaPUCCH_Shift;
   uint8_t NRB2                      = frame_parms->pucch_config_common.nRB_CQI;
@@ -478,6 +478,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
   uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30;
   uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
   uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
+  int chL;
 
   if (first_call == 1) {
     for (i=0;i<10;i++) {
@@ -508,6 +509,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
   }
   */  
 
+    
   if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) {
     LOG_E(PHY,"[eNB] rx_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift);
     return(-1);
@@ -737,30 +739,35 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
           cfo =  (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase] : &cfo_pucch_ep[12*phase];
 
           for (l=0; l<(nsymb>>1); l++) {
-            stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
-            stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
+            stat_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/nsymb;
+            stat_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/nsymb;
             off+=2;
+
+		    
 #ifdef DEBUG_PUCCH_RX
-            LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
+            LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re,
                   rxcomp[aa][off],rxcomp[aa][1+off],
                   cfo[l<<1],cfo[1+(l<<1)],
-                  stat_re,stat_im);
+                  stat_re,stat_im,stat);
 #endif
           }
 
           for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
-            stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
-            stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15);
+            stat_re += (((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15))/nsymb;
+            stat_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15))/nsymb;
             off+=2;
+
 #ifdef DEBUG_PUCCH_RX
-            LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re,
+            LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re,
                   rxcomp[aa][off],rxcomp[aa][1+off],
                   cfo[l2<<1],cfo[1+(l2<<1)],
-                  stat_re,stat_im);
+                  stat_re,stat_im,stat);
 #endif
 
+
           }
-	  stat += (stat_re*stat_re) + (stat_im*stat_im);
+	  stat += ((stat_re*stat_re) + (stat_im*stat_im));
+
        } //re
       } // aa
 
@@ -772,16 +779,18 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
 
     } //phase
 
-    stat_max /= (nsymb*12); // normalize to energy per symbol and RE
+    stat_max *= nsymb;  // normalize to energy per symbol
+    stat_max /= (frame_parms->N_RB_UL*12); // 
 #ifdef DEBUG_PUCCH_RX
     LOG_D(PHY,"[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
 #endif
 
 #ifdef DEBUG_PUCCH_RX
-    LOG_D(PHY,"[eNB] PUCCH fmt0:  stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
+    LOG_D(PHY,"[eNB] PUCCH fmt1:  stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,phase_max);
 #endif
 
     phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max;
+    phy_vars_eNB->pucch1_stats_thres[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres;
     phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023;
 
     /*
@@ -798,13 +807,13 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
     if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres))  {
       *payload = 1;
       *Po_PUCCH1_above = ((*Po_PUCCH1_above<<9) + (stat_max<<9)+1024)>>10;
-
+      //      LOG_I(PHY,"[eNB] PUCCH fmt1:  stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max);
     }
     else {
       *payload = 0;
       *Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10;
     }
-    LOG_D(PHY,"[eNB] PUCCH fmt0:  stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above));
+    LOG_D(PHY,"[eNB] PUCCH fmt1:  stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above));
     *Po_PUCCH_update = 1;
 
   } else if ((fmt == pucch_format1a)||(fmt == pucch_format1b)) {
@@ -813,7 +822,7 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
     LOG_I(PHY,"Doing PUCCH detection for format 1a/1b\n");
 #endif
 
-    for (phase=0; phase<7; phase++) {
+    for (phase=3;phase<4;phase++){ //phase=0; phase<7; phase++) {
       stat=0;
 
       for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
@@ -844,6 +853,9 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
 #endif
           }
 
+
+
+
           for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) {
             if ((l2<2) || ((l2>(nsymb>>1) - 3)) ) {  // data symbols
               stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
@@ -863,34 +875,36 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
 
           }
 
-          stat += (((stat_re*stat_re)) + ((stat_im*stat_im)) +
-                   ((stat_ref_re*stat_ref_re)) + ((stat_ref_im*stat_ref_im)));
 #ifdef DEBUG_PUCCH_RX
           LOG_D(PHY,"aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat);
 #endif
+
+	  stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) +
+		    ((stat_ref_re*stat_ref_re)) + ((stat_ref_im*stat_ref_im)))/nsymb);
+
+
         } //re
       } // aa
 
 #ifdef DEBUG_PUCCH_RX
-      LOG_I(PHY,"phase %d : stat %d\n",phase,stat);
+      LOG_I(PHY,"Format 1A: phase %d : stat %d\n",phase,stat);
 #endif
-
       if (stat>stat_max) {
         stat_max = stat;
         phase_max = phase;
       }
     } //phase
 
-    stat_max/=(nsymb*12);  //normalize to energy per symbol and RE
-#ifdef DEBUG_PUCCH_RX
-    LOG_I(PHY,"[eNB] PUCCH fmt1:  stat_max : %d, phase_max : %d\n",stat_max,phase_max);
-#endif
+    stat_max/=(12);  //normalize to energy per symbol and RE
+    //#ifdef DEBUG_PUCCH_RX
+    LOG_D(PHY,"[eNB] PUCCH fmt1a/b:  stat_max : %d, phase_max : %d\n",stat_max,phase_max);
+    //#endif
 
     stat_re=0;
     stat_im=0;
     LOG_D(PHY,"PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH);
-    *Po_PUCCH = ((*Po_PUCCH<<9) + (stat_max<<9)+1024)>>10;
-    *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH) - phy_vars_eNB->rx_total_gain_eNB_dB;
+    *Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1));
+    *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - phy_vars_eNB->rx_total_gain_eNB_dB;
     *Po_PUCCH_update = 1;
  
     LOG_D(PHY,"PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n",
@@ -906,6 +920,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
 
       *Po_PUCCH = ((*Po_PUCCH*1023) + stat_max)>>10;
 
+      chL = (nsymb>>1)-4;
+
       for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
         for (re=0; re<12; re++) {
           chest_re=0;
@@ -915,8 +931,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
           // channel estimate for first slot
           for (l=2; l<(nsymb>>1)-2; l++) {
             off=(re<<1) + (24*l);
-            chest_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
-            chest_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
+            chest_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL;
+	    chest_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL;
           }
 
 #ifdef DEBUG_PUCCH_RX
@@ -928,8 +944,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
             off=(re<<1) + (24*l);
             tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
             tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
-            stat_re += ((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15);
-            stat_im += ((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15);
+            stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
+            stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
             off+=2;
 #ifdef DEBUG_PUCCH_RX
             LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
@@ -943,8 +959,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
             off=(re<<1) + (24*l);
             tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
             tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
-            stat_re += ((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15);
-            stat_im += ((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15);
+            stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15)/4);
+            stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4);
             off+=2;
 #ifdef DEBUG_PUCCH_RX
             LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
@@ -960,8 +976,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
           // channel estimate for second slot
           for (l=2; l<(nsymb>>1)-2; l++) {
             off=(re<<1) + (24*l) + (nsymb>>1)*24;
-            chest_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
-            chest_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
+            chest_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL;
+	    chest_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL;
           }
 
 #ifdef DEBUG_PUCCH_RX
@@ -973,8 +989,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
             off=(re<<1) + (24*l) + (nsymb>>1)*24;
             tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
             tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
-            stat_re += ((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15);
-            stat_im += ((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15);
+            stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
+            stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
             off+=2;
 #ifdef DEBUG_PUCCH_RX
             LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
@@ -988,8 +1004,8 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
             off=(re<<1) + (24*l) + (nsymb>>1)*24;
             tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15)     - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15);
             tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15);
-            stat_re += ((tmp_re*chest_re)>>9) + ((tmp_im*chest_im)>>9);
-            stat_im += ((tmp_re*chest_im)>>9) - ((tmp_im*chest_re)>>9);
+            stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4;
+            stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4;
             off+=2;
 #ifdef DEBUG_PUCCH_RX
             LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re,
@@ -1007,20 +1023,27 @@ int32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
       } // aa
 
 #ifdef DEBUG_PUCCH_RX
-      LOG_D(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im,
+      LOG_I(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im,
 	    (subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]));
 #endif
- 
-      ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[0] = stat_re;
-      ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[1] = stat_im;
-      phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
 
+	((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
+	((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im);
+	phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
+
+
+	  
       *payload = (stat_re<0) ? 1 : 0;
 
       if (fmt==pucch_format1b)
         *(1+payload) = (stat_im<0) ? 1 : 0;
     } else { // insufficient energy on PUCCH so NAK
       *payload = 0;
+      ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
+      ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im);
+      phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023;
+
+      *payload = (stat_re<0) ? 1 : 0;
 
       if (fmt==pucch_format1b)
         *(1+payload) = 0;
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index 606b2692d5..f2e4dea58a 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1657,8 +1657,15 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
     }
   } else {
     for (i=0; i<frame_parms->nb_antennas_rx; i++) {
+      /*
       eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
                                        ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
+
+      */
+      
+      eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
+							  ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12);
+      
 #ifdef LOCALIZATION
       eNB_pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t));
       eNB_pusch_vars->active_subcarrier = subcarrier_energy(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index 49cafa19b5..e9820d0604 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -119,7 +119,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
   fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
 
   // I/Q PUCCH comp (format 1)
-  fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH I/Q of MF Output" );
+  fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH1 Energy (SR)" );
   fl_set_object_boxtype( fdui->pucch_comp1, FL_EMBOSSED_BOX );
   fl_set_object_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW );
   fl_set_object_lcolor( fdui->pucch_comp1, FL_WHITE ); // Label color
@@ -171,11 +171,12 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
   int16_t *pusch_llr;
   int16_t *pusch_comp;
   int32_t *pucch1_comp;
+  int32_t *pucch1_thres;
   int16_t *pucch1ab_comp;
   float Re,Im,ymax;
   float *llr, *bit;
   float I[nsymb_ce*2], Q[nsymb_ce*2];
-  float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240];
+  float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
   float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES];
   float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
   float *chest_f_abs;
@@ -206,6 +207,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
   pusch_llr = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->llr;
   pusch_comp = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][0];
   pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id];
+  pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id];
   pucch1ab_comp = (int16_t*) phy_vars_enb->pucch1ab_stats[UE_id];
 
   // Received signal in time domain of receive antenna 0
@@ -341,12 +343,13 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
       Q_pucch[ind] = pucch1ab_comp[2*ind+1];
       A_pucch[ind] = 10*log10(pucch1_comp[ind]);
       B_pucch[ind] = ind;
+      C_pucch[ind] = (float)pucch1_thres[ind]; 
     }
     fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
     fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
-    fl_set_xyplot_xbounds(form->pucch_comp,-200,200);
-    fl_set_xyplot_ybounds(form->pucch_comp,-100,100);
-    fl_set_xyplot_ybounds(form->pucch_comp1,10,40);
+    fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED);
+    //    fl_set_xyplot_ybounds(form->pucch_comp,-100,100);
+    fl_set_xyplot_ybounds(form->pucch_comp1,20,80);
   }
 
 
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 398861cabf..c0b61806a6 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -313,6 +313,8 @@ typedef struct PHY_VARS_eNB_s {
   struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];
 
 
+  uint32_t rb_mask_ul[4];
+
   /// Information regarding TM5
   MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
 
@@ -378,6 +380,7 @@ typedef struct PHY_VARS_eNB_s {
 
   int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
   int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024];
+  int32_t pucch1_stats_thres[NUMBER_OF_UE_MAX][10*1024];
   int32_t pucch1ab_stats_cnt[NUMBER_OF_UE_MAX][10];
   int32_t pucch1ab_stats[NUMBER_OF_UE_MAX][10*1024];
 
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index c84b7d3ece..80530c932f 100755
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -257,7 +257,7 @@
 #define AMP_OVER_2 (AMP>>1)
 
 /// Threshold for PUCCH Format 1 detection
-#define PUCCH1_THRES 10
+#define PUCCH1_THRES 4
 /// Threshold for PUCCH Format 1a/1b detection
 #define PUCCH1a_THRES 4
 
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 165f2fbac6..b9cb618ea0 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -104,7 +104,6 @@ extern uint8_t smbv_frame_cnt;
 #ifdef DIAG_PHY
 extern int rx_sig_fifo;
 #endif
-static unsigned char I0_clear = 1;
 
 uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe)
 {
@@ -476,6 +475,7 @@ void phy_procedures_eNB_S_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars
 
   if (abstraction_flag == 0) {
     lte_eNB_I0_measurements(phy_vars_eNB,
+			    subframe,
                             0,
                             phy_vars_eNB->first_run_I0_measurements);
   }
@@ -489,8 +489,6 @@ void phy_procedures_eNB_S_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars
 #endif
 
 
-  if (I0_clear == 1)
-    I0_clear = 0;
 }
 
 
@@ -3247,6 +3245,11 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
 	    phy_vars_eNB->lte_frame_parms.samples_per_tti);
 #endif
   */
+  phy_vars_eNB->rb_mask_ul[0]=0;
+  phy_vars_eNB->rb_mask_ul[1]=0;
+  phy_vars_eNB->rb_mask_ul[2]=0;
+  phy_vars_eNB->rb_mask_ul[3]=0;
+
   if (abstraction_flag == 0) {
     remove_7_5_kHz(phy_vars_eNB,subframe<<1);
     remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1);
@@ -3395,6 +3398,12 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
       pusch_active = 1;
       round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
 
+      for (int rb=0;
+           rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
+	   rb++) {
+	int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb;
+	phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
+      }
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n",
             phy_vars_eNB->Mod_id,harq_pid,
@@ -3715,13 +3724,19 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
         for (j=0; j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; j++)
           //this is the RSSI per RB
           phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] =
+	    
             dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*
                      (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/
                      phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) -
             phy_vars_eNB->rx_total_gain_eNB_dB -
             hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
             get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;
-
+	    
+	    /*
+            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb) -
+            phy_vars_eNB->rx_total_gain_eNB_dB -
+            hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
+            get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;*/
         phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
         phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
         phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
@@ -3915,6 +3930,34 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
       } else {
         // otherwise we have some PUCCH detection to do
 
+	// Null out PUCCH PRBs for noise measurement
+	switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) {
+	case 6:
+	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5
+	  break;
+	case 15:
+	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14
+	  break;
+	case 25:
+	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24
+	  break;
+	case 50:
+	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
+	  phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32)
+	  break;
+	case 75:
+	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
+	  phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64)
+	  break;
+	case 100:
+	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
+	  phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96)
+	  break;
+	default:
+	  LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL);
+	  break;
+	}
+
         if (do_SR == 1) {
           phy_vars_eNB->eNB_UE_stats[i].sr_total++;
 
@@ -3924,7 +3967,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
                                i,
                                phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
                                0, // n2_pucch
-                               1, // shortened format
+                               0, // shortened format, should be use_srs flag, later
                                &SR_payload,
                                subframe,
                                PUCCH1_THRES);
@@ -4336,13 +4379,15 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
 
   } // loop i=0 ... NUMBER_OF_UE_MAX-1
 
-  if (pusch_active == 0) {
+  //  if (pusch_active == 0) {
     if (abstraction_flag == 0) {
       //      LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n",
       //    (((subframe)==9)?-1:0) + phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
       lte_eNB_I0_measurements(phy_vars_eNB,
+			      subframe,
                               0,
                               phy_vars_eNB->first_run_I0_measurements);
+      phy_vars_eNB->first_run_I0_measurements = 0;
     }
 
 #ifdef PHY_ABSTRACTION
@@ -4354,9 +4399,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
 #endif
 
 
-    if (I0_clear == 1)
-      I0_clear = 0;
-  }
+    //}
 
 #ifdef EMOS
   phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB);
diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c
index 919bec144d..cd29554b90 100644
--- a/openair1/SIMULATION/LTE_PHY/pucchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c
@@ -248,7 +248,7 @@ int main(int argc, char **argv)
         break;
 
       default:
-        msg("Unsupported channel model!\n");
+        printf("Unsupported channel model!\n");
         exit(-1);
       }
 
@@ -260,13 +260,13 @@ int main(int argc, char **argv)
 
     case 's':
       snr0 = atof(optarg);
-      msg("Setting SNR0 to %f\n",snr0);
+      printf("Setting SNR0 to %f\n",snr0);
       break;
 
     case 'S':
       snr1 = atof(optarg);
       snr1set=1;
-      msg("Setting SNR1 to %f\n",snr1);
+      printf("Setting SNR1 to %f\n",snr1);
       break;
 
     case 'p':
@@ -289,7 +289,7 @@ int main(int argc, char **argv)
       if ((transmission_mode!=1) &&
           (transmission_mode!=2) &&
           (transmission_mode!=6)) {
-        msg("Unsupported transmission mode %d\n",transmission_mode);
+        printf("Unsupported transmission mode %d\n",transmission_mode);
         exit(-1);
       }
 
@@ -299,7 +299,7 @@ int main(int argc, char **argv)
       n_tx=atoi(optarg);
 
       if ((n_tx==0) || (n_tx>2)) {
-        msg("Unsupported number of tx antennas %d\n",n_tx);
+        printf("Unsupported number of tx antennas %d\n",n_tx);
         exit(-1);
       }
 
@@ -309,7 +309,7 @@ int main(int argc, char **argv)
       n_rx=atoi(optarg);
 
       if ((n_rx==0) || (n_rx>2)) {
-        msg("Unsupported number of rx antennas %d\n",n_rx);
+        printf("Unsupported number of rx antennas %d\n",n_rx);
         exit(-1);
       }
 
@@ -414,7 +414,7 @@ int main(int argc, char **argv)
 
 
 
-  msg("[SIM] Using SCM/101\n");
+  printf("[SIM] Using SCM/101\n");
   UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
                                 PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
                                 channel_model,
@@ -425,7 +425,7 @@ int main(int argc, char **argv)
 
 
   if (UE2eNB==NULL) {
-    msg("Problem generating channel model. Exiting.\n");
+    printf("Problem generating channel model. Exiting.\n");
     exit(-1);
   }
 
@@ -453,7 +453,7 @@ int main(int argc, char **argv)
   PHY_vars_UE->lte_frame_parms.pucch_config_common.nRB_CQI          = 0;
   PHY_vars_UE->lte_frame_parms.pucch_config_common.nCS_AN           = 0;
 
-  pucch_payload = 1;
+  pucch_payload = 0;
 
   generate_pucch(PHY_vars_UE->lte_ue_common_vars.txdataF,
                  frame_parms,
@@ -596,9 +596,7 @@ int main(int argc, char **argv)
           }
         }
 
-        lte_eNB_I0_measurements(PHY_vars_eNB,
-                                0,
-                                1);
+
 
         for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
           for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
@@ -646,6 +644,10 @@ int main(int argc, char **argv)
 
         //      if (sig == 1)
         //    printf("*");
+        lte_eNB_I0_measurements(PHY_vars_eNB,
+                                subframe,
+				0,
+                                1);
         PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(12*NB_RB)));
         stat = rx_pucch(PHY_vars_eNB,
                         pucch_format,
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 52e0f60d65..3dea35f053 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -1166,7 +1166,7 @@ schedule_ue_spec(
           // this is the normalized RX power
 	  eNB_UE_stats =  mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
 	  normalized_rx_power = eNB_UE_stats->Po_PUCCH_dBm; 
-	  target_rx_power = mac_xface->get_target_pucch_rx_power(module_idP,CC_id) + 10;
+	  target_rx_power = mac_xface->get_target_pucch_rx_power(module_idP,CC_id) + 20;
 	    
           // this assumes accumulated tpc
 	  // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
@@ -1178,6 +1178,7 @@ schedule_ue_spec(
 
 	      UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame=frameP;
 	      UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe=subframeP;
+	      
 	      if (normalized_rx_power>(target_rx_power+1)) {
 		tpc = 0; //-1
 		tpc_accumulated--;
@@ -1187,9 +1188,11 @@ schedule_ue_spec(
 	      } else {
 		tpc = 1; //0
 	      }
-	      LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n",
+	      /*	      
+	      LOG_I(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n",
 		    module_idP,frameP, subframeP,harq_pid,tpc,
-		    tpc_accumulated,normalized_rx_power,target_rx_power);
+		    tpc_accumulated,normalized_rx_power,target_rx_power);*/
+
 	    } // Po_PUCCH has been updated 
 	    else {
 	      tpc = 1; //0
@@ -1561,7 +1564,7 @@ fill_DLSCH_dci(
       eNB->common_channels[CC_id].bcch_active = 0;
       LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d: BCCH active\n", module_idP, CC_id, frameP, subframeP);
       // randomize frequency allocation for SI
-      first_rb = 10;//(unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
+      first_rb = 0;//10;//(unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4));
 
       /*  Where is this from, should be removed!!!!
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 1018c6e7d8..10c728f2a7 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -750,6 +750,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
           LOG_T(MAC,"[eNB %d] Frame %d, subframeP %d, UE %d CC %d : got harq pid %d  round %d (nCCE %d, rnti %x,mode %s)\n",
                 module_idP,frameP,subframeP,UE_id,CC_id, harq_pid, round,nCCE[CC_id],rnti,mode_string[eNB_UE_stats->mode]);
 
+#undef EXMIMO_IOT
 #ifndef EXMIMO_IOT
 
         if (((UE_is_to_be_scheduled(module_idP,CC_id,UE_id)>0)) || (round>0) || ((frameP%10)==0))
diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c
index 8b91a74b49..f0bf1f6847 100644
--- a/targets/ARCH/COMMON/common_lib.c
+++ b/targets/ARCH/COMMON/common_lib.c
@@ -45,20 +45,23 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf
 #ifdef ETHERNET 
   device->type=ETH_IF; 
   device->func_type = BBU_FUNC;
-  openair0_dev_init_eth(device, openair0_cfg);
   printf(" openair0_dev_init_eth ...\n");
+  return(openair0_dev_init_eth(device, openair0_cfg));
+
 #elif EXMIMO
   device->type=EXMIMO_IF;
-  openair0_dev_init_exmimo(device, openair0_cfg);
   printf("openair0_dev_init_exmimo...\n");
+  return(openair0_dev_init_exmimo(device, openair0_cfg));
 #elif OAI_USRP
   device->type=USRP_IF;
-  openair0_dev_init_usrp(device, openair0_cfg);
   printf("openair0_dev_init_usrp ...\n");
+  return(openair0_dev_init_usrp(device, openair0_cfg));
+
 #elif OAI_BLADERF  
   device->type=BLADERF_IF;
-  openair0_dev_init_bladerf(device, openair0_cfg);	
   printf(" openair0_dev_init_bladerf ...\n");   
+  return(openair0_dev_init_bladerf(device, openair0_cfg));	
+
 #endif 
    
 }
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf
index 2f11e42ba9..2974ce8551 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf
@@ -28,7 +28,7 @@ eNBs =
       tdd_config_s            			      = 0;
       prefix_type             			      = "NORMAL";
       eutra_band              			      = 7;
-      downlink_frequency      			      = 2680000000L;
+      downlink_frequency      			      = 2660000000L;
       uplink_frequency_offset 			      = -120000000;
       Nid_cell					      = 0;
       N_RB_DL                 			      = 25;
@@ -143,10 +143,10 @@ eNBs =
     NETWORK_INTERFACES :
     {
         ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.216/24";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.213/24";
 
         ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.216/24";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.213/24";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
 
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index b96a7ae529..623a83da2a 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -1631,6 +1631,8 @@ static void* eNB_thread( void* arg )
 
   pthread_mutex_unlock(&sync_mutex);
 
+  printf( "got sync (eNB_thread)\n" );
+
   int frame = 0;
 
 #ifndef EXMIMO
@@ -2893,12 +2895,12 @@ int main( int argc, char **argv )
       bw          = 0.96e6;
 #ifndef EXMIMO
       openair0_cfg[card].sample_rate=1.92e6;
-      openair0_cfg[card].samples_per_packet = 256;
+      openair0_cfg[card].samples_per_packet = 640;
       openair0_cfg[card].samples_per_frame = 19200;
       openair0_cfg[card].tx_bw = 1.5e6;
       openair0_cfg[card].rx_bw = 1.5e6;
       openair0_cfg[card].tx_forward_nsamps = 40;
-      openair0_cfg[card].tx_delay = 8;
+      openair0_cfg[card].tx_delay = 6;
 #endif
     }
     
@@ -2992,10 +2994,14 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
   openair0.func_type = BBU_FUNC;
   openair0_cfg[0].log_level = glog_level;
 
-  if ((mode!=loop_through_memory) && 
-      (openair0_device_init(&openair0, &openair0_cfg[0]) <0)) {
-    printf("Exiting, cannot initialize device\n");
-    exit(-1);
+  if (mode!=loop_through_memory){
+    int ret;
+    ret= openair0_device_init(&openair0, &openair0_cfg[0]);
+    printf("openair0_device_init returns %d\n",ret);
+    if (ret<0) {
+      printf("Exiting, cannot initialize device\n");
+      exit(-1);
+    }
   }
   else if (mode==loop_through_memory) {    
   }
@@ -3279,6 +3285,16 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
 
 #endif
     printf("UE threads created\n");
+#ifdef USE_MME
+
+    while (start_UE == 0) {
+      sleep(1);
+    }
+
+#endif
+
+
+
   } else {
     if (multi_thread>0) {
       init_eNB_proc();
@@ -3306,13 +3322,7 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
   // Sleep to allow all threads to setup
   sleep(1);
 
-#ifdef USE_MME
 
-  while (start_UE == 0) {
-    sleep(1);
-  }
-
-#endif
 
 #ifndef EXMIMO
 
@@ -3325,6 +3335,7 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
 
 #endif
 
+  printf("Sending sync to all threads\n");
 
   pthread_mutex_lock(&sync_mutex);
   sync_var=0;
-- 
GitLab