From a118499139162c03030a86652af4ec3f1fb5b678 Mon Sep 17 00:00:00 2001
From: knopp <knopp@mycompany.com>
Date: Tue, 21 Jul 2015 08:21:32 +0000
Subject: [PATCH] fixed some SIB display messages in rrc_UE.c. Scheduling
 policy and priorities in lte-ue.c for SCHED_FIFO operation (with USRP B210).

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7714 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair1/PHY/LTE_TRANSPORT/dci.c             |   9 +-
 openair1/PHY/LTE_TRANSPORT/phich.c           |   2 +-
 openair1/PHY/TOOLS/lte_phy_scope.c           |   6 +-
 openair1/SCHED/phy_procedures_lte_ue.c       |  26 ++---
 openair2/RRC/LITE/rrc_UE.c                   |  35 +++---
 targets/ARCH/COMMON/common_lib.h             |  13 ++-
 targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp |  59 +++++++++-
 targets/RT/USER/lte-softmodem.c              |  26 +++--
 targets/RT/USER/lte-ue.c                     | 108 ++++++++++++++-----
 9 files changed, 204 insertions(+), 80 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index 541349fa552..1f4dddd0a7f 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -533,7 +533,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t
 
   for (i=0; i<Mquad; i++) {
     zptr = &z[i<<2];
-    /*
+    /*    
     printf("deinterleaving ; quad %d  => (%d,%d,%d,%d,%d,%d,%d,%d)\n",i,
      ((int8_t *)zptr)[0],
      ((int8_t *)zptr)[1],
@@ -543,7 +543,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t
      ((int8_t *)zptr)[5],
      ((int8_t *)zptr)[6],
      ((int8_t *)zptr)[7]);
-    */    
+    */  
   }
 
 }
@@ -1872,6 +1872,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
   if (n_pdcch_symbols>3)
     n_pdcch_symbols=1;
 
+
 #ifdef DEBUG_DCI_DECODING
   msg("[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols);
 
@@ -2543,7 +2544,9 @@ uint16_t get_nCCE_max(uint8_t Mod_id,uint8_t CC_id)
   return(get_nCCE(3,&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,1)); // 5, 15,21
 }
 
-void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,int do_common,uint8_t subframe,
+void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,
+			     int do_common,
+			     uint8_t subframe,
                              DCI_ALLOC_t *dci_alloc,
                              int16_t eNB_id,
                              LTE_DL_FRAME_PARMS *frame_parms,
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index d9a67cb0ef9..68f625365a0 100644
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -309,7 +309,7 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
 	 pcfich_reg[frame_parms->pcfich_first_reg_idx],
 	 n0,
 	 n1,
-	 ((frame_parms->Nid_cell*n0)/n1)%n0);
+	 ((frame_parms->Nid_cell))%n0);
   //#endif
 
   // This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ...
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index ad5290c3986..3e7296f4a8b 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -215,7 +215,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
 
     if (chest_t[0] !=NULL) {
       for (i=0; i<(frame_parms->ofdm_symbol_size); i++) {
-        chest_t_abs[0][i] = (float) (chest_t[0][2*i]*chest_t[0][2*i]+chest_t[0][2*i+1]*chest_t[0][2*i+1]);
+        chest_t_abs[0][i] = 10*log10((float) (chest_t[0][2*i]*chest_t[0][2*i]+chest_t[0][2*i+1]*chest_t[0][2*i+1]));
 
         if (chest_t_abs[0][i] > ymax)
           ymax = chest_t_abs[0][i];
@@ -227,8 +227,8 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
     for (arx=1; arx<nb_antennas_rx; arx++) {
       if (chest_t[arx] !=NULL) {
         for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
-          chest_t_abs[arx][i] = (float) (chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]);
-
+          chest_t_abs[arx][i] = 10*log10((float) (chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
+ 
           if (chest_t_abs[arx][i] > ymax)
             ymax = chest_t_abs[arx][i];
         }
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index be4405ae1ee..6e2581d8155 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -2139,16 +2139,17 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 #endif
       
       //      dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
-      if (generate_ue_dlsch_params_from_dci(subframe_rx,
-					    (void *)&dci_alloc_rx[i].dci_pdu,
-					    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
-					    dci_alloc_rx[i].format,
-					    phy_vars_ue->dlsch_ue[eNB_id],
-					    &phy_vars_ue->lte_frame_parms,
-					    phy_vars_ue->pdsch_config_dedicated,
-					    SI_RNTI,
-					    0,
-					    P_RNTI)==0) {
+      if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) &&
+	  (generate_ue_dlsch_params_from_dci(subframe_rx,
+					     (void *)&dci_alloc_rx[i].dci_pdu,
+					     phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
+					     dci_alloc_rx[i].format,
+					     phy_vars_ue->dlsch_ue[eNB_id],
+					     &phy_vars_ue->lte_frame_parms,
+					     phy_vars_ue->pdsch_config_dedicated,
+					     SI_RNTI,
+					     0,
+					     P_RNTI)==0)) {
 
 #ifdef DIAG_PHY
 	
@@ -3098,10 +3099,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
       //      rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns());
       if (lte_ue_pdcch_procedures(eNB_id,phy_vars_ue,abstraction_flag) == -1) {
 #ifdef DEBUG_PHY_PROC
-        LOG_E(PHY,"[UE  %d] Frame %d, slot %d: Error in pdcch procedures\n",phy_vars_ue->Mod_id,frame_rx,slot_rx);
+	  LOG_E(PHY,"[UE  %d] Frame %d, slot %d: Error in pdcch procedures\n",phy_vars_ue->Mod_id,frame_rx,slot_rx);
 #endif
-        return(-1);
+	  return(-1);
       }
+    
 
       //      rt_printk("[PDCCH] Frame %d, slot %d, stop  %llu\n",frame_rx,slot_rx,rt_get_time_ns());
 #ifdef DEBUG_PHY_PROC
diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c
index bfeb3ef7e8e..cc2555663bd 100644
--- a/openair2/RRC/LITE/rrc_UE.c
+++ b/openair2/RRC/LITE/rrc_UE.c
@@ -3026,19 +3026,19 @@ uint64_t arfcn_to_freq(long arfcn) {
   else if (arfcn <6000) // Band 18
     return((uint64_t)860000000 + ((arfcn-5850)*100000));
   else if (arfcn <6150) // Band 19
-    return((uint64_t)875000000 + ((arfcn-5850)*100000));
+    return((uint64_t)875000000 + ((arfcn-6000)*100000));
   else if (arfcn <6450) // Band 20
-    return((uint64_t)791000000 + ((arfcn-5850)*100000));
+    return((uint64_t)791000000 + ((arfcn-6150)*100000));
   else if (arfcn <6600) // Band 21
-    return((uint64_t)1495900000 + ((arfcn-5850)*100000));
+    return((uint64_t)1495900000 + ((arfcn-6450)*100000));
   else if (arfcn <7500) // Band 22
-    return((uint64_t)351000000 + ((arfcn-5850)*100000));
+    return((uint64_t)351000000 + ((arfcn-6600)*100000));
   else if (arfcn <7700) // Band 23
-    return((uint64_t)2180000000 + ((arfcn-5850)*100000));
+    return((uint64_t)2180000000 + ((arfcn-7500)*100000));
   else if (arfcn <8040) // Band 24
-    return((uint64_t)1525000000 + ((arfcn-5850)*100000));
+    return((uint64_t)1525000000 + ((arfcn-7700)*100000));
   else if (arfcn <8690) // Band 25
-    return((uint64_t)1930000000 + ((arfcn-5850)*100000));
+    return((uint64_t)1930000000 + ((arfcn-8040)*100000));
   else if (arfcn <36200) // Band 33
     return((uint64_t)1900000000 + ((arfcn-36000)*100000));
   else if (arfcn <36350) // Band 34
@@ -3068,7 +3068,7 @@ uint64_t arfcn_to_freq(long arfcn) {
 static void dump_sib5( SystemInformationBlockType5_t *sib5 )
 {
   InterFreqCarrierFreqList_t interFreqCarrierFreqList = sib5->interFreqCarrierFreqList;
-  int i;
+  int i,j;
   InterFreqCarrierFreqInfo_t *ifcfInfo;
 
   LOG_I( RRC, "Dumping SIB5 (see TS36.331 V8.21.0)\n" );
@@ -3118,27 +3118,28 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 )
 	    *ifcfInfo->cellReselectionPriority);
     }
     LOG_I(RRC,"   NeighCellConfig  : ");
-    for (i=0;i<ifcfInfo->neighCellConfig.size;i++) {
-      LOG_T(RRC,"%2x ",ifcfInfo->neighCellConfig.buf[i]);
+    for (j=0;j<ifcfInfo->neighCellConfig.size;j++) {
+      printf("%2x ",ifcfInfo->neighCellConfig.buf[j]);
     }
+    printf("\n");
     if (ifcfInfo->q_OffsetFreq)
-      LOG_I(RRC,"   Q_OffsetFreq : %d",Qoffsettab[*ifcfInfo->q_OffsetFreq]);
+      LOG_I(RRC,"   Q_OffsetFreq : %d\n",Qoffsettab[*ifcfInfo->q_OffsetFreq]);
     if (ifcfInfo->interFreqNeighCellList) {
       
-      for (i=0;i<ifcfInfo->interFreqNeighCellList->list.count;i++) {
+      for (j=0;j<ifcfInfo->interFreqNeighCellList->list.count;j++) {
 	LOG_I(RRC,"   Cell %d\n");
-	LOG_I(RRC,"      PhysCellId : %d",ifcfInfo->interFreqNeighCellList->list.array[i]->physCellId);
-	LOG_I(RRC,"      Q_OffsetRange : %d",ifcfInfo->interFreqNeighCellList->list.array[i]->q_OffsetCell);
+	LOG_I(RRC,"      PhysCellId : %d\n",ifcfInfo->interFreqNeighCellList->list.array[j]->physCellId);
+	LOG_I(RRC,"      Q_OffsetRange : %d\n",ifcfInfo->interFreqNeighCellList->list.array[j]->q_OffsetCell);
 	
       }
     }
     if (ifcfInfo->interFreqBlackCellList) {
       
-      for (i=0;i<ifcfInfo->interFreqBlackCellList->list.count;i++) {
+      for (j=0;j<ifcfInfo->interFreqBlackCellList->list.count;j++) {
 	LOG_I(RRC,"   Cell %d\n");
-	LOG_I(RRC,"      PhysCellId start: %d\n",ifcfInfo->interFreqBlackCellList->list.array[i]->start);
+	LOG_I(RRC,"      PhysCellId start: %d\n",ifcfInfo->interFreqBlackCellList->list.array[j]->start);
 	if (ifcfInfo->interFreqBlackCellList->list.array[i]->range) {
-	  LOG_I(RRC,"      PhysCellId Range : %d\n",ifcfInfo->interFreqBlackCellList->list.array[i]->range);
+	  LOG_I(RRC,"      PhysCellId Range : %d\n",ifcfInfo->interFreqBlackCellList->list.array[j]->range);
 	}
       }
     }
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 9560117b2ea..0e31dc9f3b4 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -51,12 +51,18 @@ typedef struct openair0_device_t openair0_device;
 #define MAX_CARDS 1
 #endif
 
-#define USRP_GAIN_OFFSET (56.0)  // 86 calibrated for USRP B210 @ 2.6 GHz to get equivalent RS EPRE in OAI to SMBV100 output
+//#define USRP_GAIN_OFFSET (56.0)  // 86 calibrated for USRP B210 @ 2.6 GHz to get equivalent RS EPRE in OAI to SMBV100 output
 
 typedef enum {
   max_gain=0,med_gain,byp_gain
 } rx_gain_t;
 
+typedef struct {
+  //! Frequency for which RX chain was calibrated
+  double freq;
+  //! Offset to be applied to RX gain
+  double offset;
+} rx_gain_calib_table_t;
 
 typedef struct {
   //! Module ID for this configuration
@@ -85,11 +91,14 @@ typedef struct {
   //! \brief Center frequency in Hz for TX.
   //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels
   double tx_freq[4];
-  //! mode for rxgain (ExpressMIMO2)
+  //! mode for rxgain (ExpressMIMO2) 
   rx_gain_t rxg_mode[4];
   //! \brief Gain for RX in dB.
   //! index: [0..rx_num_channels]
   double rx_gain[4];
+  //! \brief Gain offset (for calibration) in dB
+  //! index: [0..rx_num_channels]
+  double rx_gain_offset[4];
   //! gain for TX in dB
   double tx_gain[4];
   //! RX bandwidth in Hz
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index cf15321c8d9..2ad4de98893 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -227,20 +227,58 @@ int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *open
   
 }
 
-int openair0_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) {
+int openair0_set_gains(openair0_device* device, 
+		       openair0_config_t *openair0_cfg) {
 
   usrp_state_t *s = (usrp_state_t*)device->priv;
 
   s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[0]);
-  s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]);
+  ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(0);
+  // limit to maximum gain
+  if (openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] > gain_range.stop()) {
+    
+    printf("RX Gain 0 too high, reduce by %f dB\n",
+	   openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] - gain_range.stop());	   
+    exit(-1);
+  }
+  s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]);
+  printf("Setting USRP RX gain to %f\n", openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]);
+
   return(0);
 }
 
 int openair0_stop(int card) {
-
   return(0);
 
 }
+
+rx_gain_calib_table_t calib_table[] = {
+  {3500000000.0,46.0},
+  {2660000000.0,53.0},
+  {2300000000.0,54.0},
+  {1880000000.0,55.0},
+  {816000000.0,62.0},
+  {-1,0}};
+
+void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
+
+  int i=0;
+  // loop through calibration table to find best adjustment factor for RX frequency
+  double min_diff = 6e9,diff;
+ 
+  while (calib_table[i].freq>0) {
+    diff = fabs(openair0_cfg->rx_freq[chain_index] - calib_table[i].freq);
+    printf("cal %d: freq %f, offset %f, diff %f\n",
+	   i,calib_table[i].freq,calib_table[i].offset,diff);
+    if (min_diff > diff) {
+      min_diff = diff;
+      openair0_cfg->rx_gain_offset[chain_index] = calib_table[i].offset;
+    }
+    i++;
+  }
+  
+}
+
 int openair0_print_stats(openair0_device* device) {
 
   return(0);
@@ -252,6 +290,7 @@ int openair0_reset_stats(openair0_device* device) {
 
 }
 //int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_cfg)
+
 int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg)
 {
   uhd::set_thread_priority_safe(1.0);
@@ -320,7 +359,19 @@ int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cf
       s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i);
       printf("Setting rx freq/gain on channel %lu/%lu\n",i,s->usrp->get_rx_num_channels());
       s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i);
-      s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i],i);
+      set_rx_gain_offset(&openair0_cfg[0],i);
+
+      ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i);
+      // limit to maximum gain
+      if (openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] > gain_range.stop()) {
+	
+        printf("RX Gain %lu too high, lower by %f dB\n",i,openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop());
+	exit(-1);
+      }
+      s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i);
+      printf("RX Gain %lu %f (%f) => %f (max %f)\n",i,
+	     openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i],
+	     openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop());
     }
   }
   for(i=0;i<s->usrp->get_tx_num_channels();i++) {
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index f0d03257845..1f85ced28c9 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -2921,10 +2921,22 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
 
     for (i=0; i<4; i++) {
 
+      openair0_cfg[card].tx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] : downlink_frequency[0][i]+uplink_frequency_offset[0][i];
+      openair0_cfg[card].rx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] + uplink_frequency_offset[0][i] : downlink_frequency[0][i];
+      printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
+             card,i, openair0_cfg[card].tx_gain[i],
+             openair0_cfg[card].rx_gain[i],
+             openair0_cfg[card].tx_freq[i],
+             openair0_cfg[card].rx_freq[i]);
+      
       openair0_cfg[card].autocal[i] = 1;
       openair0_cfg[card].tx_gain[i] = tx_gain[0][i];
-      openair0_cfg[card].rx_gain[i] = ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->rx_total_gain_eNB_dB :
-                                       PHY_vars_UE_g[0][0]->rx_total_gain_dB) - USRP_GAIN_OFFSET;  // calibrated for USRP B210 @ 2.6 GHz, 30.72 MS/s
+      if (UE_flag == 0) {
+	openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_eNB_dB;
+      }
+      else {
+	openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB;// - USRP_GAIN_OFFSET;  // calibrated for USRP B210 @ 2.6 GHz, 30.72 MS/s
+      }
 
       switch(frame_parms[0]->N_RB_DL) {
       case 6:
@@ -2943,13 +2955,6 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
         break;
       }
 
-      openair0_cfg[card].tx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] : downlink_frequency[0][i]+uplink_frequency_offset[0][i];
-      openair0_cfg[card].rx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] + uplink_frequency_offset[0][i] : downlink_frequency[0][i];
-      printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
-             card,i, openair0_cfg[card].tx_gain[i],
-             openair0_cfg[card].rx_gain[i],
-             openair0_cfg[card].tx_freq[i],
-             openair0_cfg[card].rx_freq[i]);
 
     }
 
@@ -3302,8 +3307,7 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
 #ifndef EXMIMO
 #ifndef USRP_DEBUG
   if (mode!=loop_through_memory)
-    openair0.trx_request_func(&openair0);
-  //  printf("returning from usrp start streaming: %llu\n",get_usrp_time(&openair0));
+    openair0.trx_start_func(&openair0);//request_func(&openair0);
 #endif
 #endif
 
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index dc624b6050a..88b7be5138d 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -277,8 +277,9 @@ 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];
 #ifdef OAI_USRP
-        openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB-USRP_GAIN_OFFSET;
+        openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
 
+	
         switch(UE->lte_frame_parms.N_RB_DL) {
         case 6:
           openair0_cfg[card].rx_gain[i] -= 12;
@@ -292,11 +293,15 @@ static void *UE_thread_synch(void *arg)
           openair0_cfg[card].rx_gain[i] -= 3;
           break;
 
+        case 100:
+          openair0_cfg[card].rx_gain[i] -= 0;
+          break;
+
         default:
           printf( "Unknown number of RBs %d\n", UE->lte_frame_parms.N_RB_DL );
           break;
         }
-
+	
         printf( "UE synch: setting RX gain (%d,%d) to %f\n", card, i, openair0_cfg[card].rx_gain[i] );
 #endif
       }
@@ -351,8 +356,8 @@ 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];
 #ifdef OAI_USRP
-          openair0_cfg[card].rx_gain[i] = UE->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
+	  
           switch(UE->lte_frame_parms.N_RB_DL) {
           case 6:
             openair0_cfg[card].rx_gain[i] -= 12;
@@ -366,10 +371,15 @@ static void *UE_thread_synch(void *arg)
             openair0_cfg[card].rx_gain[i] -= 3;
             break;
 
+          case 100:
+            openair0_cfg[card].rx_gain[i] -= 0;
+            break;
+
           default:
             printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL);
             break;
           }
+	  
 
           printf("UE synch: setting RX gain (%d,%d) to %f\n",card,i,openair0_cfg[card].rx_gain[i]);
 #endif
@@ -406,42 +416,65 @@ static void *UE_thread_synch(void *arg)
 	    freq_offset=0;	    
 	  }
 
-	  openair0_stop(0);
-	  sleep(1);
+	  // reconfigure for potentially different bandwidth
 	  switch(UE->lte_frame_parms.N_RB_DL) {
 	  case 6:
 	    openair0_cfg[0].sample_rate =1.92e6;
 	    openair0_cfg[0].rx_bw          =.96e6;
 	    openair0_cfg[0].tx_bw          =.96e6;
+            openair0_cfg[0].rx_gain[0] -= 12;
 	    break;
 	  case 25:
 	    openair0_cfg[0].sample_rate =7.68e6;
 	    openair0_cfg[0].rx_bw          =2.5e6;
 	    openair0_cfg[0].tx_bw          =2.5e6;
+            openair0_cfg[0].rx_gain[0] -= 6;
 	    break;
 	  case 50:
 	    openair0_cfg[0].sample_rate =15.36e6;
 	    openair0_cfg[0].rx_bw          =5.0e6;
 	    openair0_cfg[0].tx_bw          =5.0e6;
+            openair0_cfg[0].rx_gain[0] -= 3;
 	    break;
 	  case 100:
 	    openair0_cfg[0].sample_rate=30.72e6;
 	    openair0_cfg[0].rx_bw=10.0e6;
 	    openair0_cfg[0].tx_bw=10.0e6;
+            openair0_cfg[0].rx_gain[0] -= 0;
 	    break;
 	  }
+	  openair0_set_frequencies(&openair0,&openair0_cfg[0],0);
+	  openair0_set_gains(&openair0,&openair0_cfg[0]);
+	  openair0_stop(0);
+	  sleep(1);
 
-	  // reconfigure for potentially different bandwidth
 	  init_frame_parms(&UE->lte_frame_parms,1);
 	}
 	else {
 	  UE->is_synchronized = 1;
 
 	 if( UE->mode == rx_dump_frame ){
-		write_output("rxsig_frame0.m","rxsf0", &UE->lte_ue_common_vars.rxdata[0][0],10*UE->lte_frame_parms.samples_per_tti,1,1);
-		LOG_I(PHY,"Dummping Frame ... bye bye \n");
-		exit(0);
+	   FILE *fd;
+	   if ((UE->frame_rx&1) == 0) {  // this guarantees SIB1 is present 
+	     if (fd = fopen("rxsig_frame0.dat","w")) {
+	       fwrite((void*)&UE->lte_ue_common_vars.rxdata[0][0],
+		      sizeof(int32_t),
+		      10*UE->lte_frame_parms.samples_per_tti,
+		      fd);
+	       LOG_I(PHY,"Dummping Frame ... bye bye \n");
+	       fclose(fd);
+	       exit(0);
+	     }
+	     else {
+	       LOG_E(PHY,"Cannot open file for writing\n");
+	       exit(0);
+	     }
+	   }
+	   else {
+	     UE->is_synchronized = 0;
+	   }
 	 }
+	 
 
 #ifndef EXMIMO
 	  UE->slot_rx = 0;
@@ -482,10 +515,11 @@ static void *UE_thread_synch(void *arg)
             openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+freq_offset;
             openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+freq_offset;
 #ifdef OAI_USRP
-            openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB-USRP_GAIN_OFFSET;
+            openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
 
 	    openair0_set_frequencies(&openair0,&openair0_cfg[0],0);
 
+	    
             switch(UE->lte_frame_parms.N_RB_DL) {
             case 6:
               openair0_cfg[card].rx_gain[i] -= 12;
@@ -496,14 +530,18 @@ static void *UE_thread_synch(void *arg)
               break;
 
             case 50:
-              openair0_cfg[card].rx_gain[i] -= 3;
+              openair0_cfg[card].rx_gain[i] -= 0;//3;
+              break;
+
+            case 100:
+              openair0_cfg[card].rx_gain[i] -= 0;
               break;
 
             default:
               printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL);
               break;
             }
-
+	    
 #endif
           }
         }
@@ -582,10 +620,10 @@ static void *UE_thread_tx(void *arg)
   attr.sched_priority = 0;
 
   /* This creates a 1ms reservation every 10ms period*/
-  attr.sched_policy = SCHED_DEADLINE;
-  attr.sched_runtime  = (0.9 * 100) * 10000;  // each tx thread requires .5ms to finish its job
-  attr.sched_deadline = (1   * 100) * 10000; // each tx thread will finish within 1ms
-  attr.sched_period   = (1   * 100) * 10000; // each tx thread has a period of 1ms from the starting point
+  attr.sched_policy   = SCHED_DEADLINE;
+  attr.sched_runtime  = 900000;  // each tx thread requires .5ms to finish its job
+  attr.sched_deadline = 1000000; // each tx thread will finish within 1ms
+  attr.sched_period   = 1000000; // each tx thread has a period of 1ms from the starting point
 
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
@@ -593,6 +631,11 @@ static void *UE_thread_tx(void *arg)
     return &UE_thread_tx_retval;
   }
 
+#else
+  struct sched_param sp;
+  sp.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
+  pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
+
 #endif
 #endif
 
@@ -731,16 +774,21 @@ static void *UE_thread_rx(void *arg)
   attr.sched_priority = 0;
 
   // This creates a .5ms reservation every 1ms period
-  attr.sched_policy = SCHED_DEADLINE;
-  attr.sched_runtime   = (0.9 * 100) * 10000;//900000;  // each rx thread requires 1ms to finish its job
-  attr.sched_deadline  = (1   * 100) * 10000; // each rx thread will finish within 1ms
-  attr.sched_period    = (1   * 100) * 10000; // each rx thread has a period of 1ms from the starting point
+  attr.sched_policy   = SCHED_DEADLINE;
+  attr.sched_runtime  = 900000;  // each rx thread requires 1ms to finish its job
+  attr.sched_deadline = 1000000; // each rx thread will finish within 1ms
+  attr.sched_period   = 1000000; // each rx thread has a period of 1ms from the starting point
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
     perror("[SCHED] UE_thread_rx : sched_setattr failed\n");
     return &UE_thread_rx_retval;
   }
 
+#else
+  struct sched_param sp;
+  sp.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
+  pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
+
 #endif
 #endif
 
@@ -972,9 +1020,9 @@ void *UE_thread(void *arg)
 
   // This creates a .5 ms  reservation
   attr.sched_policy = SCHED_DEADLINE;
-  attr.sched_runtime  = (0.25 * 100) * 10000;
-  attr.sched_deadline = (0.25 * 100) * 10000;
-  attr.sched_period   = (0.5 * 100)  * 10000;
+  attr.sched_runtime  = 100000;
+  attr.sched_deadline = 500000;
+  attr.sched_period   = 500000;
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
     perror("[SCHED] main eNB thread: sched_setattr failed\n");
@@ -984,6 +1032,10 @@ void *UE_thread(void *arg)
   LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %lu started on CPU %d\n",
         (unsigned long)gettid(), sched_getcpu());
 
+#else
+  struct sched_param sp;
+  sp.sched_priority = sched_get_priority_max(SCHED_FIFO);
+  pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
 #endif
 #endif
 
@@ -1015,7 +1067,6 @@ void *UE_thread(void *arg)
     while (rxpos < (1+hw_subframe)*UE->lte_frame_parms.samples_per_tti) {
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
 
-
 #ifndef USRP_DEBUG
 
       DevAssert( UE->lte_frame_parms.nb_antennas_rx <= 2 );
@@ -1046,7 +1097,7 @@ void *UE_thread(void *arg)
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
 
       // Transmit TX buffer based on timestamp from RX
-      if ((tx_enabled) && (UE->mode!=loop_through_memory)) {
+      if ((tx_enabled==1) && (UE->mode!=loop_through_memory)) {
         VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
 
         DevAssert( UE->lte_frame_parms.nb_antennas_tx <= 2 );
@@ -1088,6 +1139,7 @@ void *UE_thread(void *arg)
       LOG_D( HW, "UE_thread: hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
 
       if (start_rx_stream == 1) {
+	LOG_D(PHY,"Locking mutex_rx (IC %d)\n",UE->instance_cnt_rx);
         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");
@@ -1096,6 +1148,7 @@ void *UE_thread(void *arg)
 
         int instance_cnt_rx = ++UE->instance_cnt_rx;
 
+	LOG_D(PHY,"Unlocking mutex_rx (IC %d)\n",instance_cnt_rx);
         if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {
           LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX thread\n" );
           exit_fun("nothing to add");
@@ -1144,7 +1197,8 @@ void *UE_thread(void *arg)
           return &UE_thread_retval;
         }
 
-        if ((tx_enabled)&&(UE->mode != loop_through_memory)) {
+       
+        if ((tx_enabled==1)&&(UE->mode != loop_through_memory)) {
 
 	  if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
 	    LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" );
-- 
GitLab