From 731f75c5942db2fe3fd77f64e38bf33fcdde6788 Mon Sep 17 00:00:00 2001
From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr>
Date: Thu, 21 Nov 2013 10:39:13 +0000
Subject: [PATCH] lte-softmodem now uses new thread for pdcp updated llr
 scaling for PDCCH and PDSCH in TM5 initialized all newly allocated memory to
 0 in new_eNB/UE_ulsch/dlsch and setting pointers to 0 after freeing memory in
 free_eNB/UE_ulsch/dlsch some small modifications related to EMOS (from the
 MU-MIMO measurement campaign)

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4480 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair1/PHY/LTE_TRANSPORT/dci.c              |  2 +-
 openair1/PHY/LTE_TRANSPORT/dlsch_coding.c     | 21 ++++--
 openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c   | 32 ++++++--
 .../PHY/LTE_TRANSPORT/dlsch_demodulation.c    | 24 ++++--
 openair1/PHY/LTE_TRANSPORT/ulsch_coding.c     | 21 ++++--
 openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c   | 28 +++++--
 openair1/SCHED/phy_procedures_lte_eNb.c       | 34 ++++++---
 openair1/SCHED/phy_procedures_lte_ue.c        | 75 ++++++++++---------
 openair1/SIMULATION/LTE_PHY/dlsim.c           | 18 +++--
 openair1/SIMULATION/TOOLS/random_channel.c    | 53 ++++++++++++-
 openair2/LAYER2/MAC/eNB_scheduler.c           |  5 +-
 openair2/LAYER2/MAC/rar_tools.c               |  2 +-
 openair2/LAYER2/MAC/ue_procedures.c           |  5 +-
 .../USERSPACE/OCTAVE/freq_calibration.m       |  7 +-
 .../ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc |  2 +-
 .../EXMIMO/USERSPACE/OCTAVE/initial_sync.m    |  7 +-
 .../ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal.m   |  8 +-
 .../EXMIMO/USERSPACE/OCTAVE/lime_cal_rx.m     | 16 ++--
 .../USERSPACE/OCTAVE/rx_calibration_rffe.m    | 11 +--
 .../ARCH/EXMIMO/USERSPACE/OCTAVE/rx_spec.m    | 17 ++---
 targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m  | 40 +++++-----
 targets/PROJECTS/TDDREC/initparams.m          |  4 +-
 targets/RTAI/USER/.runinfo                    |  4 +-
 targets/RTAI/USER/Makefile                    |  2 +-
 targets/RTAI/USER/lte-softmodem.c             | 34 +++++++--
 targets/RTAI/USER/sched_dlsch.c               |  6 +-
 targets/RTAI/USER/sched_rx_pdsch.c            | 12 ++-
 27 files changed, 332 insertions(+), 158 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index 4c0ade2903..e9af45d613 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -1750,7 +1750,7 @@ s32 rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
     for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
       avgs = cmax(avgs,avgP[(aarx<<1)+aatx]);
   
-  log2_maxh = (log2_approx(avgs)/2);
+  log2_maxh = (log2_approx(avgs)/2) + 2 + frame_parms->nb_antennas_rx - 1;
 #ifdef DEBUG_PHY
   msg("[PDCCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgP[0],avgs);
 #endif
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index feb30915c6..3fb09dabd5 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -75,11 +75,12 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) {
 	msg("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]);
 #endif
 	if (dlsch->harq_processes[i]->b) {
-        free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
+	  free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
+	  dlsch->harq_processes[i]->b = NULL;
 #ifdef DEBUG_DLSCH_FREE
 	  msg("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b);
 #endif
-    }
+	}
 	if (dlsch->harq_processes[i]->c) {
 #ifdef DEBUG_DLSCH_FREE
 	  msg("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c);
@@ -89,14 +90,18 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) {
 #ifdef DEBUG_DLSCH_FREE
 	    msg("Freeing dlsch process %d c[%d] (%p)\n",i,r,dlsch->harq_processes[i]->c[r]);
 #endif
-	    if (dlsch->harq_processes[i]->c[r]) 
+	    if (dlsch->harq_processes[i]->c[r]) {
 	      free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
+	      dlsch->harq_processes[i]->c[r] = NULL;
+	    }
 	  }
 	}
 	free16(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
+	dlsch->harq_processes[i] = NULL;
       }
     }
     free16(dlsch,sizeof(LTE_eNB_DLSCH_t));
+    dlsch = NULL;
   }
   
 }
@@ -137,7 +142,10 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne
       if (dlsch->harq_processes[i]) {
           bzero(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
           dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
-          if (!dlsch->harq_processes[i]->b) {
+          if (dlsch->harq_processes[i]->b) {
+	    bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
+	  }
+	  else {
               msg("Can't get b\n");
               exit_flag=1;
           }
@@ -145,7 +153,10 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne
 	  for (r=0;r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling;r++) {
 	    // account for filler in first segment and CRCs for multiple segment case
 	    dlsch->harq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+ 768);  
-	    if (!dlsch->harq_processes[i]->c[r]) {
+	    if (dlsch->harq_processes[i]->c[r]) {
+	      bzero(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+ 768);
+	    } 
+	    else {
 	      msg("Can't get c\n");
 	      exit_flag=2;
 	    }
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
index 5f62d2d2ee..2c21c74727 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
@@ -54,19 +54,27 @@ void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) {
   if (dlsch) {
     for (i=0;i<dlsch->Mdlharq;i++) {
       if (dlsch->harq_processes[i]) {
-	if (dlsch->harq_processes[i]->b)
+	if (dlsch->harq_processes[i]->b) {
 	  free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
+	  dlsch->harq_processes[i]->b = NULL;
+	}
 	if (dlsch->harq_processes[i]->c) {
-	  for (r=0;r<MAX_NUM_DLSCH_SEGMENTS;r++)
+	  for (r=0;r<MAX_NUM_DLSCH_SEGMENTS;r++) {
 	    free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
+	    dlsch->harq_processes[i]->c[r] = NULL;
+	  }
 	}
 	for (r=0;r<MAX_NUM_DLSCH_SEGMENTS;r++)
-	  if (dlsch->harq_processes[i]->d[r])
+	  if (dlsch->harq_processes[i]->d[r]) {
 	    free16(dlsch->harq_processes[i]->d[r],((3*8*6144)+12+96)*sizeof(short));
+	    dlsch->harq_processes[i]->d[r] = NULL;
+	  }
 	free16(dlsch->harq_processes[i],sizeof(LTE_DL_UE_HARQ_t));
+	dlsch->harq_processes[i] = NULL;
       }
     }
   free16(dlsch,sizeof(LTE_UE_DLSCH_t));
+  dlsch = NULL;
   }
 }
 
@@ -93,6 +101,7 @@ LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t max_turbo_ite
   }
   dlsch = (LTE_UE_DLSCH_t *)malloc16(sizeof(LTE_UE_DLSCH_t));
   if (dlsch) {
+    memset(dlsch,0,sizeof(LTE_UE_DLSCH_t));
     dlsch->Kmimo = Kmimo;
     dlsch->Mdlharq = Mdlharq;
     dlsch->max_turbo_iterations = max_turbo_iterations;
@@ -101,15 +110,24 @@ LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t max_turbo_ite
       //      msg("new_ue_dlsch: Harq process %d\n",i);
       dlsch->harq_processes[i] = (LTE_DL_UE_HARQ_t *)malloc16(sizeof(LTE_DL_UE_HARQ_t));
       if (dlsch->harq_processes[i]) {
+	memset(dlsch->harq_processes[i],0,sizeof(LTE_DL_UE_HARQ_t));
 	dlsch->harq_processes[i]->b = (uint8_t*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
+	if (dlsch->harq_processes[i]->b) 
+	  memset(dlsch->harq_processes[i]->b,0,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
+	else
+	  exit_flag=3;
 	if (abstraction_flag == 0) {
-	  if (!dlsch->harq_processes[i]->b)
-	    exit_flag=3;
 	  for (r=0;r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling;r++) {
-	    dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+ 768);	
-	    if (!dlsch->harq_processes[i]->c[r])
+	    dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+ 768);
+	    if (dlsch->harq_processes[i]->c[r])
+	      memset(dlsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+ 768);
+	    else
 	      exit_flag=2;
 	    dlsch->harq_processes[i]->d[r] = (short*)malloc16(((3*8*6144)+12+96)*sizeof(short));
+	    if (dlsch->harq_processes[i]->d[r])
+	      memset(dlsch->harq_processes[i]->d[r],0,((3*8*6144)+12+96)*sizeof(short));
+	    else
+	      exit_flag=2;
 	  }
 	}
       }	else {
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index 8b817c0f45..0bf67b6906 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -70,9 +70,23 @@ __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,avg128D;
 int avg[4];
 
 // [MCS][i_mod (0,1,2) = (2,4,6)]
-unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,0},{3,3,0}, // QPSK
-                                               {6,6,0},{5,5,0},{5,5,0},{3,3,0},{2,2,0},{2,2,0},{2,2,2}, // 16-QAM
-                                               {3,3,3},{3,3,3},{3,3,3},{3,0,0},{2,2,0},{2,2,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM
+unsigned char offset_mumimo_llr_drange_fix=0;
+/*
+//original values from sebastion + same hand tuning
+unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,4},{1,2,4}, // QPSK
+                                               {5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM
+                                               {2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM
+*/
+/*
+//first optimization try
+unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
+*/
+//second optimization try
+/*
+unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};  w
+*/
+unsigned char offset_mumimo_llr_drange[29][3]={{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
+
 
 int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
              PDSCH_t type,
@@ -363,8 +377,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 	// effective channel of desired user is always stronger than interfering eff. channel
 	dlsch_channel_level_prec(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext,	avg, symbol, nb_rb);
 	
-    //    msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1]);
-    avg[0] = log2_approx(avg[0]) - 13;// + offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1];
+	//    msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1]);
+	avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1];
 
 	lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
 	//printf("log1_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
index 0a44e30111..f8a9b18b3e 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
@@ -81,6 +81,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
 #endif
 	if (ulsch->harq_processes[i]->b) {
 	  free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES);
+	  ulsch->harq_processes[i]->b = NULL;
 #ifdef DEBUG_ULSCH_FREE
 	  msg("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b);
 #endif
@@ -94,14 +95,18 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
 #ifdef DEBUG_ULSCH_FREE
 	    msg("Freeing ulsch process %d c[%d] (%p)\n",i,r,ulsch->harq_processes[i]->c[r]);
 #endif
-	    if (ulsch->harq_processes[i]->c[r]) 
+	    if (ulsch->harq_processes[i]->c[r]) {
 	      free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
+	      ulsch->harq_processes[i]->c[r] = NULL;
+	    }
 	  }
 	}
 	free16(ulsch->harq_processes[i],sizeof(LTE_UL_UE_HARQ_t));
+	ulsch->harq_processes[i] = NULL;
       }
     }
     free16(ulsch,sizeof(LTE_UE_ULSCH_t));
+    ulsch = NULL;
   }
   
 }
@@ -128,22 +133,26 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char Mdlharq,unsigned char N_RB_UL, u8 abs
   }
   ulsch = (LTE_UE_ULSCH_t *)malloc16(sizeof(LTE_UE_ULSCH_t));
   if (ulsch) {
-
+    memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
     ulsch->Mdlharq = Mdlharq;
     for (i=0;i<Mdlharq;i++) {
       ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
-      memset(ulsch->harq_processes[i], 0, sizeof(LTE_UL_UE_HARQ_t));
       //      printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
       if (ulsch->harq_processes[i]) {
-	ulsch->harq_processes[i]->b          = (unsigned char*)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
-	if (!ulsch->harq_processes[i]->b) {
+	memset(ulsch->harq_processes[i], 0, sizeof(LTE_UL_UE_HARQ_t));
+	ulsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
+	if (ulsch->harq_processes[i]->b) 
+	  memset(ulsch->harq_processes[i]->b,0,MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
+	else {
 	  LOG_E(PHY,"Can't get b\n");
 	  exit_flag=1;
 	}
 	if (abstraction_flag==0) {
 	  for (r=0;r<MAX_NUM_ULSCH_SEGMENTS;r++) {
 	    ulsch->harq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+768);  // account for filler in first segment and CRCs for multiple segment case
-	    if (!ulsch->harq_processes[i]->c[r]) {
+	    if (ulsch->harq_processes[i]->c[r]) 
+	      memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768);
+	    else {
 	      LOG_E(PHY,"Can't get c\n");
 	      exit_flag=2;
 	    }
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index fdc69170b7..3e1ec7c958 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -73,19 +73,27 @@ void free_eNB_ulsch(LTE_eNB_ULSCH_t *ulsch) {
   if (ulsch) {
     for (i=0;i<ulsch->Mdlharq;i++) {
       if (ulsch->harq_processes[i]) {
-	if (ulsch->harq_processes[i]->b)
+	if (ulsch->harq_processes[i]->b) {
 	  free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES);
+	  ulsch->harq_processes[i]->b = NULL;
+	}
 	if (ulsch->harq_processes[i]->c) {
-	  for (r=0;r<MAX_NUM_ULSCH_SEGMENTS;r++)
+	  for (r=0;r<MAX_NUM_ULSCH_SEGMENTS;r++) {
 	    free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 768);
+	    ulsch->harq_processes[i]->c[r] = NULL;
+	  }
 	}
 	for (r=0;r<MAX_NUM_ULSCH_SEGMENTS;r++)
-	  if (ulsch->harq_processes[i]->d[r])
+	  if (ulsch->harq_processes[i]->d[r]) {
 	    free16(ulsch->harq_processes[i]->d[r],((3*8*6144)+12+96)*sizeof(short));
+	    ulsch->harq_processes[i]->d[r] = NULL;
+	  }
 	free16(ulsch->harq_processes[i],sizeof(LTE_UL_eNB_HARQ_t));
+	ulsch->harq_processes[i] = NULL;
       }
     }
   free16(ulsch,sizeof(LTE_eNB_ULSCH_t));
+  ulsch = NULL;
   }
 }
 
@@ -112,6 +120,7 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t Mdlharq,uint8_t max_turbo_iterations,uint
   
   ulsch = (LTE_eNB_ULSCH_t *)malloc16(sizeof(LTE_eNB_ULSCH_t));
   if (ulsch) {
+    memset(ulsch,0,sizeof(LTE_eNB_ULSCH_t));
     ulsch->Mdlharq = Mdlharq;
     ulsch->max_turbo_iterations = max_turbo_iterations;
 
@@ -119,15 +128,24 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t Mdlharq,uint8_t max_turbo_iterations,uint
       //      msg("new_ue_ulsch: Harq process %d\n",i);
       ulsch->harq_processes[i] = (LTE_UL_eNB_HARQ_t *)malloc16(sizeof(LTE_UL_eNB_HARQ_t));
       if (ulsch->harq_processes[i]) {
+	memset(ulsch->harq_processes[i],0,sizeof(LTE_UL_eNB_HARQ_t));
 	ulsch->harq_processes[i]->b = (uint8_t*)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
-	if (!ulsch->harq_processes[i]->b)
+	if (ulsch->harq_processes[i]->b)
+	  memset(ulsch->harq_processes[i]->b,0,MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
+	else
 	  exit_flag=3;
 	if (abstraction_flag==0) {
 	  for (r=0;r<MAX_NUM_ULSCH_SEGMENTS/bw_scaling;r++) {
 	    ulsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+768);	
-	    if (!ulsch->harq_processes[i]->c[r])
+	    if (ulsch->harq_processes[i]->c[r])
+	      memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768);
+	    else
 	      exit_flag=2;
 	    ulsch->harq_processes[i]->d[r] = (short*)malloc16(((3*8*6144)+12+96)*sizeof(short));
+	    if (ulsch->harq_processes[i]->d[r])
+	      memset(ulsch->harq_processes[i]->d[r],0,((3*8*6144)+12+96)*sizeof(short));
+	    else
+	      exit_flag=2;
 	  }
 	  ulsch->harq_processes[i]->subframe_scheduling_flag = 0;
 	}
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 77ce055905..9325be1f3a 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -503,7 +503,7 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
   u8 cooperation_flag = phy_vars_eNB->cooperation_flag;
   u8 transmission_mode = phy_vars_eNB->transmission_mode[0];
 
-  u32 rballoc = 0x00F0;
+  u32 rballoc = 0x7FFF;
   u32 rballoc2 = 0x000F;
   /*
     u32 rand = taus();
@@ -572,10 +572,12 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
       DLSCH_alloc_pdu.dai              = 0;
       DLSCH_alloc_pdu.harq_pid         = 0;
       DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      //DLSCH_alloc_pdu.mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);      
       DLSCH_alloc_pdu.ndi              = 1;
       DLSCH_alloc_pdu.rv               = 0;
       memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
 
+      /*
       //user2
       DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; 
       DCI_pdu->dci_alloc[1].L          = 2;
@@ -587,16 +589,18 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
       DLSCH_alloc_pdu.TPC              = 0;
       DLSCH_alloc_pdu.dai              = 0;
       DLSCH_alloc_pdu.harq_pid         = 1;
+      //DLSCH_alloc_pdu.mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);      
       DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
       DLSCH_alloc_pdu.ndi              = 1;
       DLSCH_alloc_pdu.rv               = 0;
       memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
-          }
+      */
+    }
     else if (transmission_mode==5) {
       DCI_pdu->Num_ue_spec_dci = 2;
       // user 1
       DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
-      DCI_pdu->dci_alloc[0].L          = 2;
+      DCI_pdu->dci_alloc[0].L          = 3;
       DCI_pdu->dci_alloc[0].rnti       = 0x1235;
       DCI_pdu->dci_alloc[0].format     = format1E_2A_M10PRB;
       DCI_pdu->dci_alloc[0].ra_flag    = 0;
@@ -604,7 +608,11 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
       DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
       DLSCH_alloc_pdu1E.rv               = 0;
       DLSCH_alloc_pdu1E.ndi              = 1;
-      DLSCH_alloc_pdu1E.mcs              = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];//openair_daq_vars.target_ue_dl_mcs;
+      //DLSCH_alloc_pdu1E.mcs            = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
+      DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);      
+      phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
       DLSCH_alloc_pdu1E.harq_pid         = 0;
       DLSCH_alloc_pdu1E.dai              = 0;
       DLSCH_alloc_pdu1E.TPC              = 0;
@@ -615,12 +623,15 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
       
       //user 2
       DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
-      DCI_pdu->dci_alloc[1].L          = 2;
+      DCI_pdu->dci_alloc[1].L          = 0;
       DCI_pdu->dci_alloc[1].rnti       = 0x1236;
       DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
       DCI_pdu->dci_alloc[1].ra_flag    = 0;
       //DLSCH_alloc_pdu1E.mcs            = openair_daq_vars.target_ue_dl_mcs; 
-      DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+      DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((phy_vars_eNB->frame%1024)/3)%28);
+      phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
       
       memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
 
@@ -1252,14 +1263,17 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8
 #else
     DCI_pdu = &DCI_pdu_tmp;
 #ifdef EMOS
-    if ((phy_vars_eNB->frame%1000 == 0) && (phy_vars_eNB->frame>1000) && (next_slot == 0) && (openair_daq_vars.target_ue_dl_mcs<28)) {
-      openair_daq_vars.target_ue_dl_mcs++;
-      msg("[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->frame,openair_daq_vars.target_ue_dl_mcs);
+    if (((phy_vars_eNB->frame%1024)%3 == 0) && (next_slot == 0)) {
+      //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28;
+      openair_daq_vars.target_ue_dl_mcs = taus()%28;
+      LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->frame,openair_daq_vars.target_ue_dl_mcs);
     }
+    /*
     if (phy_vars_eNB->frame > 28000) {
       LOG_E(PHY,"More that 28000 frames reached! Exiting!\n");
       mac_xface->macphy_exit("");
-    }      
+    } 
+    */     
 #endif
 #ifdef EMOS_CHANNEL
     fill_dci_emos(DCI_pdu,next_slot>>1,phy_vars_eNB);
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index af9ecf9dc1..7efa1da91b 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -1979,9 +1979,9 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 
 #endif      
 #ifdef DIAG_PHY
-      if (!((((last_slot>>1) == 6) && (dci_alloc_rx[i].format == format2_2A_M10PRB)) ||
+      if (!((((last_slot>>1) == 7) && (dci_alloc_rx[i].format == format1E_2A_M10PRB)) ||
 	    (((last_slot>>1) == 7) && (dci_alloc_rx[i].format == format1)))) {
-	LOG_D(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,last_slot>>1,dci_alloc_rx[i].format);
+	LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,last_slot>>1,dci_alloc_rx[i].format);
 	phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++;
 	phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++;
         vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
@@ -2001,7 +2001,13 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 					    0,
 					    P_RNTI)==0) {
 
-          //	dump_dci(&phy_vars_ue->lte_frame_parms,(void *)&dci_alloc_rx[i]);
+#ifdef DIAG_PHY
+	if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs != (((phy_vars_ue->frame%1024)%28))){
+	    LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: wrong mcs!\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,last_slot>>1,phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs);
+	    dump_dci(&phy_vars_ue->lte_frame_parms,(void *)&dci_alloc_rx[i]);
+	  }
+#endif
+
 
 	phy_vars_ue->dlsch_received[eNB_id]++;
 	
@@ -2114,7 +2120,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	*/
 #endif      
 #ifdef DIAG_PHY
-	if ((last_slot>>1) != 8) {
+	if ((last_slot>>1) != 9) {
 	  LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format 0!\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,last_slot>>1);
 	  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++;
 	  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++;
@@ -2156,6 +2162,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	  dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
 	*/
 #endif      
+	/*
 #ifdef DIAG_PHY
 	if ((last_slot>>1) != 8) {
 	  LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received CBA RNTI Format 0!\n",
@@ -2166,6 +2173,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	  return(-1);
 	}
 #endif
+	*/
 	
 	phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0;
 	//dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]);
@@ -2238,8 +2246,11 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	phy_vars_ue->Mod_id,phy_vars_ue->frame, last_slot>>1, last_slot);
 #endif
 #ifdef EMOS
-  if ((phy_vars_ue->frame%500 == 0) && (phy_vars_ue->frame>=500) && (last_slot == 0)) {
-    openair_daq_vars.use_ia_receiver = !openair_daq_vars.use_ia_receiver;
+  if ((last_slot == 0)) {
+    if (phy_vars_ue->frame%1024 == 0)
+      openair_daq_vars.use_ia_receiver = 0;
+    else
+      openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3;
     LOG_I(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n",phy_vars_ue->frame,openair_daq_vars.use_ia_receiver, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,phy_vars_ue->bitrate[eNB_id]);
   } 
 #endif
@@ -2476,29 +2487,13 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 				   phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3,
 				   eNB_id);
 #endif
-	    //	    if (phy_vars_ue->current_dlsch_cqi[eNB_id] <28)
-	    //	      phy_vars_ue->current_dlsch_cqi[eNB_id]++;
-	    //LOG_I(PHY,"Current TBS = %d\n",phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS);
 	    phy_vars_ue->total_TBS[eNB_id] =  phy_vars_ue->total_TBS[eNB_id] +
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
+	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
 	    phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
+	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
 	  }
 	}
             
-	if (phy_vars_ue->frame % 10 == 0) {
-	  if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0) 
-	    phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]);
-	
-	  //phy_vars_ue->bitrate[eNB_id] = (phy_vars_ue->total_TBS[eNB_id] - phy_vars_ue->total_TBS_last[eNB_id]);
-	  
-	  phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id];
-	  phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id];
-	  //phy_vars_ue->total_TBS_last[eNB_id] = phy_vars_ue->total_TBS[eNB_id];
-	  
-	  // CQI adaptation when current MCS is odd, even is handled by eNB
-	}
-
 
 #ifdef DEBUG_PHY_PROC
 	LOG_I(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
@@ -2525,17 +2520,6 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[(((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1))].send_harq_status = 0;
       }
     
-      //      if ((phy_vars_ue->frame % 10 == 0) && (last_slot==2)) {
-      if (last_slot==2) {
-          phy_vars_ue->bitrate[eNB_id] = (phy_vars_ue->total_TBS[eNB_id] - phy_vars_ue->total_TBS_last[eNB_id])*100;
-          LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,phy_vars_ue->total_TBS[eNB_id],phy_vars_ue->total_TBS_last[eNB_id],(float) phy_vars_ue->bitrate[eNB_id]/1000.0);
-          phy_vars_ue->total_TBS_last[eNB_id] = phy_vars_ue->total_TBS[eNB_id];
-      }
-      if ((phy_vars_ue->frame % 100 == 0) && (last_slot==2)) {
-          LOG_I(PHY,"Throughput %5.1f kbps\n",(float) phy_vars_ue->bitrate[eNB_id]/1000.0);
-      }
-
-
       // SI_DLSCH
       if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) {
 #ifdef DEBUG_PHY_PROC
@@ -2991,6 +2975,27 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
     } // abstraction_flag==0   
   }// l loop
 
+  // calculate some statistics
+  if (last_slot==19) {
+    if (phy_vars_ue->frame % 10 == 0) {
+      if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0) 
+	phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]);
+      
+      phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id];
+      phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id];
+    }
+    
+    phy_vars_ue->bitrate[eNB_id] = (phy_vars_ue->total_TBS[eNB_id] - phy_vars_ue->total_TBS_last[eNB_id])*100;
+    phy_vars_ue->total_TBS_last[eNB_id] = phy_vars_ue->total_TBS[eNB_id];
+    LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n",
+	  phy_vars_ue->Mod_id,phy_vars_ue->frame,phy_vars_ue->total_TBS[eNB_id],
+	  phy_vars_ue->total_TBS_last[eNB_id],(float) phy_vars_ue->bitrate[eNB_id]/1000.0);
+  
+    if ((phy_vars_ue->frame % 100 == 0)) {
+      LOG_I(PHY,"Throughput %5.1f kbps\n",(float) phy_vars_ue->bitrate[eNB_id]/1000.0);
+    }
+  }
+  
   if (is_pmch_subframe(((last_slot>>1)==9?-1:0)+phy_vars_ue->frame,last_slot>>1,&phy_vars_ue->lte_frame_parms)) {
  
     if ((last_slot%2)==1) {
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 386853f3c0..c2a7235f1f 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -19,6 +19,7 @@
 #include "UTIL/LOG/log.h"
 
 extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
+extern unsigned char offset_mumimo_llr_drange_fix;
 
 #ifdef XFORMS
 #include "PHY/TOOLS/lte_phy_scope.h"
@@ -297,7 +298,7 @@ int main(int argc, char **argv) {
   snr0 = 0;
   num_layers = 1;
 
-  while ((c = getopt (argc, argv, "hadpDe:m:n:o:s:f:t:c:g:r:F:x:y:z:M:N:I:i:R:S:C:T:b:u:v:w:B:PL")) != -1) {
+  while ((c = getopt (argc, argv, "hadpDe:m:n:o:s:f:t:c:g:r:F:x:y:z:M:N:I:i:R:S:C:T:b:u:v:w:B:PLl:")) != -1) {
     switch (c)
       {
       case 'a':
@@ -486,6 +487,9 @@ int main(int argc, char **argv) {
       case 'L':
 	llr8_flag=1;
 	break;
+      case 'l':
+	offset_mumimo_llr_drange_fix=atoi(optarg);
+	break;
       case 'h':
       default:
 	printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs -n n_frames -s snr0 -x transmission mode (1,2,5,6) -y TXant -z RXant -I trch_file\n",argv[0]);
@@ -1082,7 +1086,7 @@ int main(int argc, char **argv) {
 	  }
 	  memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
 	  dci_alloc[num_dci].dci_length = dci_length;
-	  dci_alloc[num_dci].L          = 2;
+	  dci_alloc[num_dci].L          = 1;
 	  dci_alloc[num_dci].rnti       = SI_RNTI;
 	  dci_alloc[num_dci].format     = format1A;
 	  dci_alloc[num_dci].nCCE       = 0;
@@ -2401,12 +2405,12 @@ int main(int argc, char **argv) {
 	  }
 	
       } //ABStraction
-       if(num_rounds==1){
-      bler= (double)errs[0]/(round_trials[0]);
+      if(num_rounds==1){
+	bler= (double)errs[0]/(round_trials[0]);
 	if (bler<1)
-	 {snr_step = input_snr_step;     saving_bler = 0;}
+	  {snr_step = input_snr_step;     saving_bler = 0;}
 	else
-	 {snr_step = 1; saving_bler = 1;} 
+	  {snr_step = 1; saving_bler = 1;} 
       }
       if (((double)errs[0]/(round_trials[0]))<1e-2) 
 	break;
@@ -2459,6 +2463,8 @@ int main(int argc, char **argv) {
   
   //  lte_sync_time_free();
   
+  printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0]));
+
   return(0);
 }
   
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index ef6e6397e2..b42049f520 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -237,9 +237,56 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
     }
     break;
   case SCM_D:
-    LOG_W(OCM,"channel model not yet supported\n");
-    free(chan_desc);
-    return(NULL);
+    LOG_W(OCM,"This is not the real SCM-D model! It is just SCM-C with an additional Rice factor!\n");
+    chan_desc->nb_taps        = 18;
+    chan_desc->Td             = 4.625;
+    chan_desc->channel_length = (int) (2*chan_desc->BW*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->BW*chan_desc->Td));
+    sum_amps = 0;
+    chan_desc->amps           = (double*) malloc(chan_desc->nb_taps*sizeof(double));
+    for (i = 0; i<chan_desc->nb_taps; i++) {
+      chan_desc->amps[i]      = pow(10,.1*scm_c_amps_dB[i]); 
+      sum_amps += chan_desc->amps[i];
+    }
+    for (i = 0; i<chan_desc->nb_taps; i++)
+      chan_desc->amps[i] /= sum_amps;
+    chan_desc->delays         = scm_c_delays;
+    chan_desc->ricean_factor  = 0.1;
+    chan_desc->aoa            = 0;
+    chan_desc->random_aoa     = 0;
+    chan_desc->ch             = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
+    chan_desc->chF            = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*));
+    chan_desc->a              = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*));
+    for (i = 0; i<nb_tx*nb_rx; i++) 
+      chan_desc->ch[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); 
+    for (i = 0; i<nb_tx*nb_rx; i++) 
+      chan_desc->chF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); 
+    for (i = 0; i<chan_desc->nb_taps; i++) 
+      chan_desc->a[i]         = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex));
+
+    chan_desc->R_sqrt  = (struct complex**) malloc(6*sizeof(struct complex**));
+    if (nb_tx==2 && nb_rx==2) {
+      for (i = 0; i<6; i++) 
+	chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0];
+    }
+    else if (nb_tx==2 && nb_rx==1) {
+      for (i = 0; i<6; i++) 
+	chan_desc->R_sqrt[i] = (struct complex*) &R21_sqrt[i][0];
+    }
+    else if (nb_tx==1 && nb_rx==2) {
+      for (i = 0; i<6; i++) 
+	chan_desc->R_sqrt[i] = (struct complex*) &R12_sqrt[i][0];
+    }
+    else {
+      for (i = 0; i<6; i++) {
+	chan_desc->R_sqrt[i]    = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+	for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
+	  chan_desc->R_sqrt[i][j].x = 1.0;
+	  chan_desc->R_sqrt[i][j].y = 0.0;
+	}
+	LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
+      }
+    }
+    break;
   case EPA:
     chan_desc->nb_taps        = 7;
     chan_desc->Td             = .410;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index d2008436fc..3b46a6328d 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -4269,8 +4269,8 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf
 
   //if (subframe%5 == 0)
 #ifdef EXMIMO 
-  //pdcp_run(frame, 1, 0, Mod_id);
- 
+  pdcp_run(frame, 1, 0, Mod_id);
+  /*
   ret = pthread_mutex_trylock (&pdcp_mutex);
   if (ret != 0) {
     if (ret==EBUSY)
@@ -4293,6 +4293,7 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf
       LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt);
     }
   }
+  */
 #endif
 #ifdef CELLULAR
   rrc_rx_tx(Mod_id, frame, 0, 0);
diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c
index 0682fc4077..89bbd0d1b1 100644
--- a/openair2/LAYER2/MAC/rar_tools.c
+++ b/openair2/LAYER2/MAC/rar_tools.c
@@ -99,7 +99,7 @@ unsigned short fill_rar(u8 Mod_id,
   rballoc = mac_xface->computeRIV(N_RB_UL,1,1); // first PRB only for UL Grant
   rar[1] |= (rballoc>>7)&7; // Hopping = 0 (bit 3), 3 MSBs of rballoc
   rar[2] = ((uint8_t)(rballoc&0xff))<<1; // 7 LSBs of rballoc
-  mcs = 10;
+  mcs = 9;
   TPC = 4;
   ULdelay = 0;
   cqireq = 0;
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index 97f3d38bd6..7f1d6df335 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -1319,8 +1319,8 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire
   //Rrc_xface->Frame_index=Mac_rlc_xface->frame;
   //if (subframe%5 == 0)
 #ifdef EXMIMO
-  //pdcp_run(frame, 0, Mod_id, eNB_index);
-  
+  pdcp_run(frame, 0, Mod_id, eNB_index);
+  /*
   ret = pthread_mutex_trylock (&pdcp_mutex);
   if (ret != 0) {
     if (ret==EBUSY)
@@ -1343,6 +1343,7 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire
       LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt);
     }
   }
+  */
 #endif 
   UE_mac_inst[Mod_id].frame = frame;
   UE_mac_inst[Mod_id].subframe = subframe;
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/freq_calibration.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/freq_calibration.m
index 46690b7f4b..906a53fa4f 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/freq_calibration.m
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/freq_calibration.m
@@ -23,7 +23,7 @@ limeparms;
 rf_mode = (RXEN+0+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM+DMAMODE_RX+0)*[1 0 0 0];
 freq_rx = fc*[1 0 0 0];
 freq_tx = freq_rx+1920000;
-rx_gain = 30*[1 1 1 1];
+rx_gain = 0*[1 1 1 1];
 tx_gain = 25*[1 1 1 1];
 %rf_local=rf_local*[1 1 1 1];
 rf_local = [8254813 8255016 8254813 8254813]; %exmimo2_2
@@ -33,8 +33,9 @@ rf_vcocal=rf_vcocal_19G*[1 1 1 1];
 tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
 syncmode = SYNCMODE_FREE;
 rffe_rxg_low = 63*[1 1 1 1];
-rffe_rxg_final = 63*[1 1 1 1];
+rffe_rxg_final = 31*[1 1 1 1];
 rffe_band = B19G_TDD*[1 1 1 1];
+autocal = [1 1 1 1];
 
 %gpib_send(gpib_card,gpib_device,'*RST;*CLS');   % reset and configure the signal generator
 %gpib_send(gpib_card,gpib_device,['POW ' int2str(power_dBm+cables_loss_dB) 'dBm']);
@@ -55,7 +56,7 @@ do
   fc
   freq_rx = fc*[1 0 0 0];
   freq_tx = freq_rx+1920000;
-  oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,0,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band);
+  oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,0,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal);
 
   i=i+1;
   sleep(1);
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc
index 0a94b3ab68..0801f98b8e 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc
@@ -5,7 +5,7 @@
 // compile with: mkoctfile -I/usr/local/include/gpib -lgpib gpib_send.cc
 
 #include <octave/oct.h>
-#include "ib.h"
+#include <gpib/ib.h>
 
 
 
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/initial_sync.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/initial_sync.m
index 902b2366df..6a0988f14f 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/initial_sync.m
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/initial_sync.m
@@ -7,6 +7,7 @@ primary_synch; %loads the primary sync signal
 sss_gen; %loads the secondary sync signal
 
 % grab a frame
+ch=1;
 rx_spec;
 
 % load frame
@@ -18,7 +19,7 @@ figure(1)
 plot(real(s))
 
 pss_t = upsample(primary_synch0_time,4);
-[corr,lag] = xcorr(s(:,1),pss_t);
+[corr,lag] = xcorr(s(:,ch).',pss_t);
 figure(2);
 plot(lag,abs(corr));
 
@@ -31,9 +32,9 @@ pss_pos = lag(pss_pos0);
 sss_pos = pss_pos - 1648; %TDD normal CP
 %sss_pos = pss_pos - 1920; %TDD extended CP
 
-psst = s([pss_pos:(pss_pos+511)],1);
+psst = s([pss_pos:(pss_pos+511)],ch);
 pssf = fft(psst);
-ssst = s([sss_pos:(sss_pos+511)],1);
+ssst = s([sss_pos:(sss_pos+511)],ch);
 sssf = fft(ssst);
 
 pssf_ext = pssf([(512-30):512 2:32]); % extract innter 62 subcarriers
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal.m
index 92274b20cd..86b0af66ea 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal.m
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal.m
@@ -4,10 +4,10 @@ card=0;
 limeparms;
 TX_LO_LEAKAGE_MIN0 = 99999;
 TX_LO_LEAKAGE_MIN1 = 99999;
-%freq_rx = 1907588000*[1 1 1 1];
-freq_rx = 859500000*[1 1 1 1];
-freq_tx = freq_rx; %+1920000;
-rf_vcocal = rf_vcocal_859*[1 1 1 1];
+freq_rx = 1907600000*[1 1 1 1];
+%freq_rx = 859500000*[1 1 1 1];
+freq_tx = freq_rx+1920000;
+rf_vcocal = rf_vcocal_19G*[1 1 1 1];
 rf_rxdc   = rf_rxdc*[1 1 1 1];
 rxgain = 30*[1 1 1 1];
 txgain = 25*[1 1 1 1];
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal_rx.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal_rx.m
index 4040743d40..b6786c4fb4 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal_rx.m
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/lime_cal_rx.m
@@ -3,23 +3,23 @@ close all
 card=0;
 
 limeparms;
-%freq_rx = 1907588000*[1 1 1 1];
+freq_rx = 1907600000*[1 1 1 1];
 %freq_rx = 700600000*[1 1 1 1];
-freq_rx = 748000000*[1 1 1 1];
-freq_tx = freq_rx; %+1920000;
-rxgain = 0*[1 1 1 1];
+%freq_rx = 748000000*[1 1 1 1];
+freq_tx = freq_rx+1920000;
+rxgain = 30*[1 1 1 1];
 txgain = 0*[1 1 1 1];
 tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
 syncmode = SYNCMODE_FREE;
 
-%rf_local = [8254813 8255016 8254813 8254813]; % from the tx calibration
+rf_local = [8254813 8255016 8254813 8254813]; % from the tx calibration
 %rf_local = [8255842   8255064   8257340   8257340]; % 700MHz
-rf_local = [8256776   8255788   8257340   8257340]; % 850MHz
+%rf_local = [8256776   8255788   8257340   8257340]; % 850MHz
 rf_rxdc  = rf_rxdc*[1 1 1 1]; % initial value
-rf_vcocal= rf_vcocal_850*[1 1 1 1];
+rf_vcocal= rf_vcocal_19G*[1 1 1 1];
 rffe_rxg_low = 31*[1 1 1 1];
 rffe_rxg_final = 31*[1 1 1 1];
-rffe_band = TVWS_TDD*[1 1 1 1];
+rffe_band = B19G_TDD*[1 1 1 1];
 
 
 sleepafterconfig=0.2
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_calibration_rffe.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_calibration_rffe.m
index 5f44921886..adb65c6deb 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_calibration_rffe.m
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_calibration_rffe.m
@@ -33,22 +33,23 @@ rf_rxdc = [37059   35459   36300   36999]; %exmimo2_2
 rf_rxdc = [34689   34756   36300   36999]; %exmimo2_2 with external RF
 rf_vcocal=rf_vcocal_19G*[1 1 1 1];
 eNBflag = 0;
-tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
+tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTRX;
 syncmode = SYNCMODE_FREE;
 rffe_rxg_low = 31*[1 1 1 1];
 rffe_rxg_final = 31*[1 1 1 1];
 rffe_band = B19G_TDD*[1 1 1 1];
-
+autocal = [1 1 1 1];
 
 gpib_send(gpib_card,gpib_device,'*RST;*CLS');   % reset and configure the signal generator
 %gpib_send(gpib_card,gpib_device,sprintf("POW %ddBm",power_dBm+cables_loss_dB));
-gpib_send(gpib_card,gpib_device,sprintf("POW %ddBm",-14));
+gpib_send(gpib_card,gpib_device,sprintf("POW %ddBm",0));
 %gpib_send(gpib_card,gpib_device,'FREQ 1.91860GHz');
 %gpib_send(gpib_card,gpib_device,'FREQ 1.919225GHz');
 %gpib_send(gpib_card,gpib_device,'FREQ 1.909225GHz');
 gpib_send(gpib_card,gpib_device,sprintf("FREQ %dHz",fref));
 
-oarf_config_exmimo(card,freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNBflag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band);
+oarf_config_exmimo(card,freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNBflag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal);
+autocal = [0 0 0 0];
 
 %ALL_rxrfmode = [LNAByp LNAMed LNAMax];
 %ALL_gain     = 0:10:30;
@@ -87,7 +88,7 @@ for LNA=ALL_rxrfmode
       for rffe_rxg_final=ALL_rffe_rxg_final
 	rffe_rxg_final = rffe_rxg_final*[1 1 1 1];
   
-	oarf_config_exmimo(card,freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNBflag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band);
+	oarf_config_exmimo(card,freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNBflag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal);
 	sleep(1);
 	
 				% signal measurement
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_spec.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_spec.m
index 7b68759d2b..ad1a5a3914 100755
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_spec.m
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/rx_spec.m
@@ -1,21 +1,19 @@
 dual_tx=0;
 card=0;
 limeparms;
-active_rf = [1 1 1 1];
+active_rf = [1 1 0 0];
 %rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM)*[1 1 1 1];
-rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM)*active_rf;
+rf_mode = (RXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM)*active_rf;
 rf_mode = rf_mode+(DMAMODE_RX*active_rf);
 %freq_rx = 2540000000*[1 1 1 1];
 freq_rx = 1907600000*active_rf;
 %freq_rx = 1912600000*active_rf; %+ 2540000000*[0 1 0 0]; % + 859500000*[0 0 1 0];
 %freq_rx = 1912600000*[1 1 1 1];
 %freq_rx = 859500000*[1 1 1 1];
-freq_tx = freq_rx; %+1.92e6;
-%freq_tx = 2660000000*[1 1 1 1];
+freq_tx = freq_rx;
 tx_gain = 0*[1 1 1 1];
-rx_gain = 30*[1 1 1 1];
-rf_local= [8254744   8255063   8257340   8257340]; %rf_local*[1 1 1 1];
-%rf_local= [8254212   8256991   8257340   8257340]; %exmimo2 850mhz
+rx_gain = 0*[1 1 1 1];
+rf_local= rf_local*[1 1 1 1];
 rf_rxdc = rf_rxdc*[1 1 1 1];
 %rf_vcocal=rf_vcocal_859*[1 1 1 1];
 rf_vcocal=rf_vcocal_19G*[1 1 1 1];
@@ -23,10 +21,11 @@ eNBflag = 0;
 tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTRX; 
 %tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
 syncmode = SYNCMODE_FREE;
-rffe_rxg_low = 61*active_rf;
-rffe_rxg_final = 61*active_rf;
+rffe_rxg_low = 63*active_rf;
+rffe_rxg_final = 31*active_rf;
 rffe_band = B19G_TDD*active_rf;
 autocal = [1 1 1 1];
+autocal = [1 1 1 1];
 
 oarf_config_exmimo(card,freq_rx,freq_tx,tdd_config,syncmode,rx_gain,tx_gain,eNBflag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal)
 
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m
index 9bb708b129..bef95551f9 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m
@@ -2,36 +2,39 @@
 fc  = 1907600000;
 %fc = 859.5e6;
 
-rxgain=30;
+rxgain=0;
 txgain=25;
 eNB_flag = 0;
 card = 0;
+%chan_sel = zeros(1,4);
+%chan_sel(ch) = 1;
+chan_sel = [1 0 0 0];
 
 limeparms;
-rf_mode   = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM) * [1 1 1 1];
-rf_mode = rf_mode + (DMAMODE_TX)*[1 1 1 1];
+rf_mode   = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM) * chan_sel;
+rf_mode = rf_mode + (DMAMODE_TX)*chan_sel;
 %rf_mode   = RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAByp+RFBBLNA1;
 %rf_local= [8253704   8253704   8257340   8257340]; %eNB2tx %850MHz
 %rf_local= [8255004   8253440   8257340   8257340]; % ex2 700 MHz
 rf_local = [8254744   8255063   8257340   8257340]; %eNB2tx 1.9GHz
 %rf_local = [8257292   8257300   8257340   8257340]; %ex2 850 MHz
-%rf_local  = rf_local * ones(1,4);
-rf_rxdc = rf_rxdc * ones(1,4);
-%rf_vcocal = rf_vcocal_859 * ones(1,4);
-rf_vcocal = rf_vcocal_19G * ones(1,4);
-%rf_vcocal = rf_vcocal_26G_eNB * ones(1,4);
-rxgain = rxgain*ones(1,4);
-txgain = txgain*ones(1,4);
-freq_tx = fc*[1 1 1 1];
+%rf_local  = rf_local * chan_sel;
+rf_rxdc = rf_rxdc * chan_sel;
+%rf_vcocal = rf_vcocal_859 * chan_sel;
+rf_vcocal = rf_vcocal_19G * chan_sel;
+%rf_vcocal = rf_vcocal_26G_eNB * chan_sel;
+rxgain = rxgain*chan_sel;
+txgain = txgain*chan_sel;
+freq_tx = fc*chan_sel;
 freq_rx = freq_tx;
-%freq_rx = freq_tx-120000000*[1 1 1 1];
+%freq_rx = freq_tx-120000000*chan_sel;
 %freq_tx = freq_rx+1920000;
 tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTTX;
 syncmode = SYNCMODE_FREE;
-rffe_rxg_low = 61*[1 1 1 1];
-rffe_rxg_final = 61*[1 1 1 1];
-rffe_band = B19G_TDD*[1 1 1 1];
-autocal = [1 1 1 1];
+rffe_rxg_low = 61*chan_sel;
+rffe_rxg_final = 61*chan_sel;
+rffe_band = B19G_TDD*chan_sel;
+autocal = chan_sel;
 
 oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,eNB_flag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal);
 amp = pow2(14)-1;
@@ -56,7 +59,7 @@ case 2
 case 3
   for i=0:(12*5-1)
     s((38401+640*i):(38400+640*(i+1)),1)=floor(linspace(-127,128,640)); %+1j*floor(linspace(128,-127,640));
-    end
+  end
 
 case 4
   pss0_f0=[0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0];
@@ -86,9 +89,10 @@ sleep (1)
 %keyboard
 
 oarf_send_frame(card,s,n_bit);
-
+%r = oarf_get_frame(card);
 figure(1)
 hold off
 plot(real(s(:,1)),'r')
 hold on
 plot(imag(s(:,2)),'b')
+hold off
diff --git a/targets/PROJECTS/TDDREC/initparams.m b/targets/PROJECTS/TDDREC/initparams.m
index 59b464d142..b42d892bef 100644
--- a/targets/PROJECTS/TDDREC/initparams.m
+++ b/targets/PROJECTS/TDDREC/initparams.m
@@ -15,8 +15,8 @@ eNB_flag = 0;
 card = 0;
 Ntrx=4;
 dual_tx=0;
-active_rfA=[1 0 0 0];
-active_rfB=[0 1 1 1];
+active_rfA=[1 1 0 0];
+active_rfB=[0 0 1 1];
 active_rf=active_rfA+active_rfB;
 
 if(active_rfA*active_rfB'!=0) error("The A and B transceive chains must be orthogonal./n") endif
diff --git a/targets/RTAI/USER/.runinfo b/targets/RTAI/USER/.runinfo
index b69c5f60de..42308212cf 100644
--- a/targets/RTAI/USER/.runinfo
+++ b/targets/RTAI/USER/.runinfo
@@ -7,9 +7,9 @@ eNB_test:lxrt+sem+mbx+msg+smi:!sudo ./lte-softmodem -S -F enb2tx;sleep 1;popall:
 UE:lxrt+sem+mbx+msg+fifos:!sudo ./synctest -U -d -T 108;sleep 1;popall:control_c
 #UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907602944 -V;sleep 1;popall:control_c
 #EXMIMO2 card 1
-#UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907600480 -V;sleep 1;popall:control_c
+UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907600480 -V;sleep 1;popall:control_c
 #EXMIMO2 card 5 
-UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907597440 -V;sleep 1;popall:control_c
+#UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907597240 -V;sleep 1;popall:control_c
 UE0_smbv:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907598252 -V;sleep 1;popall:control_c
 UE850:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 859498000 -F ex2_850;sleep 1;popall:control_c
 eNB850:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -d -C 859500000 -F ex2_850;sleep 1;popall:control_c
diff --git a/targets/RTAI/USER/Makefile b/targets/RTAI/USER/Makefile
index 7a810b5464..0a851dad32 100644
--- a/targets/RTAI/USER/Makefile
+++ b/targets/RTAI/USER/Makefile
@@ -104,7 +104,7 @@ ifeq ($(OPENAIR2),1)
 ASN1_MSG_OBJS1=$(addprefix $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/, $(ASN1_MSG_OBJS))
 OBJ += $(L2_OBJS) $(LIST_OBJ) $(TIMER_OBJ) $(MEM_OBJ) $(OTG_OBJS) $(MATH_OBJS) 
 OBJ += $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/netlink_init.o
-OBJ += $(PDCP_DIR)/pdcp_thread.o
+#OBJ += $(PDCP_DIR)/pdcp_thread.o
 CFLAGS += -DOPENAIR2 -DNO_RRM -DPUCCH -DMAC_CONTEXT=1
 endif
 
diff --git a/targets/RTAI/USER/lte-softmodem.c b/targets/RTAI/USER/lte-softmodem.c
index dae158d599..ccd0528736 100644
--- a/targets/RTAI/USER/lte-softmodem.c
+++ b/targets/RTAI/USER/lte-softmodem.c
@@ -171,7 +171,8 @@ int otg_enabled;
 #endif
 int number_of_cards = 1;
 
-int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
+//int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
+int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
 
 int init_dlsch_threads(void);
 void cleanup_dlsch_threads(void);
@@ -956,6 +957,7 @@ int main(int argc, char **argv) {
   char line[1000];
   int l;
   int ret, ant;
+  int ant_offset=0;
 
   int error_code;
 
@@ -1135,7 +1137,7 @@ int main(int argc, char **argv) {
   }
   else { //UE_flag==1
     frame_parms->nb_antennas_tx     = 1;
-    frame_parms->nb_antennas_rx     = 1;
+    frame_parms->nb_antennas_rx     = 2;
   }
   frame_parms->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; //initial value overwritten by initial sync later
   frame_parms->mode1_flag         = (transmission_mode == 1) ? 1 : 0;
@@ -1347,6 +1349,7 @@ int main(int argc, char **argv) {
   p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
   p_exmimo_config->framing.resampling_factor = 2;
  
+
   for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++) 
     p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
   for (ant=0;ant<frame_parms->nb_antennas_tx;ant++)
@@ -1358,6 +1361,21 @@ int main(int argc, char **argv) {
     carrier_freq[ant] = 0; //this turns off all other LIMEs
   }
 
+  /*
+  ant_offset = 3;
+  for (ant=0; ant<4; ant++) {
+    if (ant==ant_offset) {
+      p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
+      p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
+      p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
+    }
+    else {
+      p_exmimo_config->rf.rf_mode[ant] = 0;
+      carrier_freq[ant] = 0; //this turns off all other LIMEs
+    }
+  }
+  */
+
   for (ant = 0; ant<4; ant++) { 
     p_exmimo_config->rf.do_autocal[ant] = 1;
     p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant];
@@ -1383,8 +1401,8 @@ int main(int argc, char **argv) {
 
     p_exmimo_config->rf.rffe_gain_txlow[ant] = 31;
     p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31;
-    p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 31;
-    p_exmimo_config->rf.rffe_gain_rxlow[ant] = 63;
+    p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52;
+    p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31;
   }
 
 
@@ -1424,7 +1442,7 @@ int main(int argc, char **argv) {
 #endif
 
 #ifdef OPENAIR2
-    init_pdcp_thread();
+    //init_pdcp_thread();
 #endif
 
     number_of_cards = openair0_num_detected_cards;
@@ -1435,7 +1453,7 @@ int main(int argc, char **argv) {
 
   // connect the TX/RX buffers
   if (UE_flag==1) {
-      setup_ue_buffers(PHY_vars_UE_g[0],frame_parms,0);
+      setup_ue_buffers(PHY_vars_UE_g[0],frame_parms,ant_offset);
       printf("Setting UE buffer to all-RX\n");
       // Set LSBs for antenna switch (ExpressMIMO)
       for (i=0; i<frame_parms->samples_per_tti*10; i++)
@@ -1445,7 +1463,7 @@ int main(int argc, char **argv) {
       //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;      
   }
   else {
-    setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,0);
+    setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,ant_offset);
       if (fs4_test==0)
         {
           printf("Setting eNB buffer to all-RX\n");
@@ -1702,7 +1720,7 @@ int main(int argc, char **argv) {
   }
 
 #ifdef OPENAIR2
-  cleanup_pdcp_thread();
+  //cleanup_pdcp_thread();
 #endif
 
 #ifdef RTAI
diff --git a/targets/RTAI/USER/sched_dlsch.c b/targets/RTAI/USER/sched_dlsch.c
index 64965cebe2..e6a2cfd6b5 100644
--- a/targets/RTAI/USER/sched_dlsch.c
+++ b/targets/RTAI/USER/sched_dlsch.c
@@ -232,14 +232,16 @@ static void * dlsch_thread(void *param) {
 	phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_received_bits[eNB_id] + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS;
       }
     }
-    
+
+    // this is done in main thread
+    /*    
     if (phy_vars_ue->frame % 100 == 0) {
       if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0) 
 	phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]);
       phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id];
       phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id];
-      
     }
+    */
 
     time_out = rt_get_time_ns();
 
diff --git a/targets/RTAI/USER/sched_rx_pdsch.c b/targets/RTAI/USER/sched_rx_pdsch.c
index d951dc30a7..7b6f748232 100644
--- a/targets/RTAI/USER/sched_rx_pdsch.c
+++ b/targets/RTAI/USER/sched_rx_pdsch.c
@@ -170,10 +170,14 @@ static void * rx_pdsch_thread(void *param) {
 
       if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && 
           (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-          (openair_daq_vars.use_ia_receiver ==1)) {
-      dual_stream_UE = 1;
-      eNB_id_i = phy_vars_ue->n_connected_eNB;
-      i_mod =  get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
+          (openair_daq_vars.use_ia_receiver > 0)) {
+	dual_stream_UE = 1;
+	eNB_id_i = phy_vars_ue->n_connected_eNB;
+	if (openair_daq_vars.use_ia_receiver == 2) {
+	  i_mod =  get_Qm(((phy_vars_ue->frame%1024)/3)%28);
+	} else {
+	  i_mod =  get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
+	}
       }
       else {
           dual_stream_UE = 0;
-- 
GitLab