From 7b0d904dcbb885ce8b774435fc82cb7723e8e378 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Mon, 4 Aug 2014 16:18:26 +0000
Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5645
 818b1a75-f10b-46b9-bf7c-635c3b92a50f

---
 openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c |   8 +-
 .../lte_ul_channel_estimation.c               |   6 +-
 openair1/PHY/LTE_TRANSPORT/dci_tools.c        |   9 +-
 openair1/PHY/LTE_TRANSPORT/phich.c            |  16 +--
 openair1/PHY/LTE_TRANSPORT/pmch.c             |   8 +-
 openair1/PHY/LTE_TRANSPORT/prach.c            |   2 +-
 openair1/PHY/LTE_TRANSPORT/pucch.c            |   6 +-
 openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c   |  12 +-
 .../PHY/LTE_TRANSPORT/ulsch_demodulation.c    |  14 +--
 openair1/PHY/defs.h                           |  22 +++-
 openair1/SCHED/phy_procedures_lte_common.c    |   2 +-
 openair1/SCHED/phy_procedures_lte_eNb.c       | 105 +++++++++---------
 openair1/SCHED/pusch_pc.c                     |   1 +
 openair1/SIMULATION/LTE_PHY/pdcchsim.c        |   5 +-
 openair1/SIMULATION/LTE_PHY/prachsim.c        |   1 -
 openair1/SIMULATION/LTE_PHY/pucchsim.c        |   1 -
 openair1/SIMULATION/LTE_PHY/ulsim.c           |  22 ++--
 17 files changed, 129 insertions(+), 111 deletions(-)

diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 3a1639022ec..5e05f51710f 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -151,7 +151,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
 }
 
 
-int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_t subframe)
+int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe)
 {
   static int first_run=1;
   static int max_pos_fil2=0;
@@ -162,14 +162,14 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_
   LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
   LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id];
   int32_t **ul_ch_estimates_time=  eNB_pusch_vars->drs_ch_estimates_time[0];
-  int subframe_sched = (subframe==9) ? 0 : (subframe+1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
   uint8_t harq_pid;
   uint8_t Ns = 1; //we take the estimate from the second slot
   uint8_t cyclic_shift = 0;//(frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
     //phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS2 +
     //frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+Ns]) % 12;
 
-  harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[subframe_sched].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
 
   int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size);
 
@@ -197,7 +197,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_
     max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15;
   
 #ifdef DEBUG_PHY
-  LOG_I(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",phy_vars_eNB->proc[subframe_sched].frame_rx,max_pos,max_pos_fil2,sync_pos);
+  LOG_I(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",phy_vars_eNB->proc[sched_subframe].frame_rx,max_pos,max_pos_fil2,sync_pos);
 #endif //DEBUG_PHY
 
   return(max_pos_fil2-sync_pos);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
index 24771f17e5c..c778982ef4d 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
@@ -34,7 +34,7 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32
 int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
 			      uint8_t eNB_id,
 			      uint8_t UE_id,
-			      uint8_t subframe,
+			      uint8_t sched_subframe,
 			      unsigned char l,
 			      unsigned char Ns,
 			      uint8_t cooperation_flag) {
@@ -46,8 +46,8 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
   int32_t **ul_ch_estimates_0=  eNB_pusch_vars->drs_ch_estimates_0[eNB_id];
   int32_t **ul_ch_estimates_1=  eNB_pusch_vars->drs_ch_estimates_1[eNB_id];
   int32_t **rxdataF_ext=  eNB_pusch_vars->rxdataF_ext[eNB_id];
-  int subframe_sched = (subframe == 9) ? 0 : (subframe+1);
-  uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[subframe_sched].frame_rx,subframe);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
+  uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
   int16_t delta_phase = 0;
   int16_t *ru1 = ru_90;
   int16_t *ru2 = ru_90;
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index f3fd0a31c12..ad9d15d5cd3 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -4482,7 +4482,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
 
 int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
 				       uint16_t rnti,
-				       uint8_t subframe,
+				       uint8_t sched_subframe,
 				       DCI_format_t dci_format,
 				       uint8_t UE_id,
 				       PHY_VARS_eNB *phy_vars_eNB,
@@ -4498,7 +4498,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
   ANFBmode_t AckNackFBMode = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
   LTE_eNB_ULSCH_t *ulsch=phy_vars_eNB->ulsch_eNB[UE_id];
   LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
-  int subframe_sched = (subframe == 0) ? 9 : (subframe-1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
 
   uint32_t cqi_req = 0;
   uint32_t dai = 0;
@@ -4520,7 +4520,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
 
     harq_pid = subframe2harq_pid(frame_parms,			      
 				 pdcch_alloc2ul_frame(frame_parms,
-						      phy_vars_eNB->proc[subframe_sched].frame_tx,
+						      phy_vars_eNB->proc[sched_subframe].frame_tx,
 						      subframe),
 				 pdcch_alloc2ul_subframe(frame_parms,subframe));
 
@@ -4786,8 +4786,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
 
 
     LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n",
-	  phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[subframe_sched].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift);
-
+	  phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift);
 
 
 
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index 3b5b45657f6..70b6dab928a 100644
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -1313,7 +1313,7 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue,
 }
 
 void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
-			unsigned char subframe,
+			unsigned char sched_subframe,
 			int16_t amp,
 			uint8_t sect_id,
 			uint8_t abstraction_flag) {
@@ -1328,7 +1328,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
   uint8_t pusch_subframe;
   uint8_t UE_id;
   uint32_t pusch_frame;
-  int subframe_sched = (subframe == 0) ? 9 : (subframe-1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
 
   // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211
   
@@ -1338,7 +1338,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
 
   if (frame_parms->Ncp == 1)
     NSF_PHICH = 2;
-  pusch_frame = phich_frame2_pusch_frame(frame_parms,phy_vars_eNB->proc[subframe_sched].frame_tx,subframe);
+  pusch_frame = phich_frame2_pusch_frame(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
   pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe);
   harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe);
 
@@ -1348,7 +1348,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
       if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active == 1) {
 
       LOG_D(PHY,"[eNB][PUSCH %x/%d] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n",
-	  ulsch_eNB[UE_id]->rnti,harq_pid,phy_vars_eNB->proc[subframe_sched].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active);
+	  ulsch_eNB[UE_id]->rnti,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active);
       
 	ngroup_PHICH = (ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb + 
 			ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH;
@@ -1361,7 +1361,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
 		      ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH);
 #ifdef DEBUG_PHICH
 	LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n",
-	    phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[subframe_sched].frame_tx,
+	    phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,
 	    subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
 	    ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK,
 	    ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb,
@@ -1370,7 +1370,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
 #endif
 	if (ulsch_eNB[UE_id]->Msg3_active == 1) {
 	  LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n",
-	      phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[subframe_sched].frame_tx,subframe,
+	      phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
 	      UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK,
 	      ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb);
 	}
@@ -1399,7 +1399,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
 	    (ulsch_eNB[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ){
 	  if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ){
 	    LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH ACK / (no format0 DCI) Setting subframe_scheduling_flag\n",
-		phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[subframe_sched].frame_tx,subframe);
+		phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
 	    ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
 	    //	    ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0;
 	    //	    ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; //this is already done in phy_procedures
@@ -1407,7 +1407,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
 	  }
 	  else {
 	    LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n",
-		phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[subframe_sched].frame_tx,subframe);
+		phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
 	    ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
 	    ulsch_eNB[UE_id]->harq_processes[harq_pid]->round=0;
 	  }
diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c
index ccea403c6be..e468b47cc68 100644
--- a/openair1/PHY/LTE_TRANSPORT/pmch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pmch.c
@@ -224,10 +224,10 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN
   }
 }
 
- void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int subframe,uint8_t *a,int abstraction_flag) {
+ void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int sched_subframe,uint8_t *a,int abstraction_flag) {
 
   int G;
-  int subframe_sched = (subframe==0) ? 9 : (subframe-1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
 
   if (abstraction_flag != 0) {
     if (eNB_transport_info_TB_index[phy_vars_eNB->Mod_id]!=0)
@@ -249,7 +249,7 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN
 	      phy_vars_eNB->lte_frame_parms.N_RB_DL,
 	      phy_vars_eNB->dlsch_eNB_MCH->rb_alloc,
 	      get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs),1,
-	      2,phy_vars_eNB->proc[subframe_sched].frame_tx,subframe);
+	      2,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
     
     generate_mbsfn_pilot(phy_vars_eNB,
 			 phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
@@ -260,7 +260,7 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN
 		       &phy_vars_eNB->lte_frame_parms,
 		       1,
 		       phy_vars_eNB->dlsch_eNB_MCH,
-		       phy_vars_eNB->proc[subframe_sched].frame_tx,
+		       phy_vars_eNB->proc[sched_subframe].frame_tx,
 		       subframe,
 		       &phy_vars_eNB->dlsch_rate_matching_stats,
 		       &phy_vars_eNB->dlsch_turbo_encoding_stats,
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index 15f3b2db690..6f51350a6bc 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -254,7 +254,7 @@ int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t su
   uint8_t t1_ra;
   uint8_t t2_ra;
 
-  //  printf("In is_prach_subframe ..., prach_ConfigIndex %d\n",prach_ConfigIndex);
+
   if (frame_parms->frame_type == FDD) { //FDD
     //implement Table 5.7.1-2 from 36.211 (Rel-10, p.41)
     if ((((frame&1) == 1) && (subframe < 9)) ||
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c
index 88cd4a44c67..37c3bb79546 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch.c
@@ -948,10 +948,10 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
 		  PUCCH_FMT_t fmt,
 		  uint8_t n1_pucch_sel,
 		  uint8_t *payload,
-		  uint8_t subframe) {
+		  uint8_t sched_subframe) {
   uint8_t UE_id;
   uint16_t rnti;
-  int subframe_sched = (subframe==0)?9:(subframe-1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
 
   rnti = phy_vars_eNB->ulsch_eNB[UE_index]->rnti;
   for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
@@ -974,7 +974,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
     payload[1] = PHY_vars_UE_g[UE_id]->pucch_payload[1];    
   }
   else 
-    LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",phy_vars_eNB->proc[subframe_sched].frame_rx);
+    LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",phy_vars_eNB->proc[sched_subframe].frame_rx);
 
   if (PHY_vars_UE_g[UE_id]->pucch_sel[subframe] == n1_pucch_sel)
     return(99);
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 2054e47d282..d90783cbc59 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -210,7 +210,7 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) {
 
 unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
 			     uint8_t UE_id,
-			     uint8_t subframe,
+			     uint8_t sched_subframe,
 			     uint8_t control_only_flag,
 			     uint8_t Nbundled,
 			     uint8_t llr8_flag) {
@@ -249,7 +249,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
   int16_t cseq[6*14*1200];
   int off;
   int status[20];
-  int subframe_sched = (subframe == 9) ? 0 : (subframe+1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
 
   uint8_t (*tc)(int16_t *y,
 		uint8_t *,
@@ -273,7 +273,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
   x2 = ((uint32_t)ulsch->rnti<<14) + ((uint32_t)subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1
   
   //  harq_pid = (ulsch->RRCConnRequest_flag == 0) ? subframe2harq_pid_tdd(frame_parms->tdd_config,subframe) : 0;
-  harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[subframe_sched].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
 
   if (harq_pid==255) {
     LOG_E(PHY, "ulsch_decoding.c: FATAL ERROR: illegal harq_pid, returning\n");
@@ -1669,16 +1669,16 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb
 #endif
 
 uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB,
-			     uint8_t subframe,
+			     uint8_t sched_subframe,
 			     uint8_t UE_index,
 			     uint16_t *crnti) {
 
   uint8_t UE_id;
   uint16_t rnti;
-  int subframe_sched = (subframe == 9) ? 0 : (subframe+1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
   uint8_t harq_pid;
 
-  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe_sched].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
   
   rnti = phy_vars_eNB->ulsch_eNB[UE_index]->rnti;
 #ifdef DEBUG_PHY
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index 4c0cf36aaa4..a75410e6948 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1258,7 +1258,7 @@ int32_t ulsch_power_0[2],ulsch_power_1[2];// For the distributed Alamouti Scheme
 */
 
 void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
-	      uint32_t subframe,
+	      uint32_t sched_subframe,
 	      uint8_t eNB_id,  // this is the effective sector id
 	      uint8_t UE_id,
 	      LTE_eNB_ULSCH_t **ulsch,
@@ -1283,9 +1283,9 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
   uint8_t Qm;
   uint16_t rx_power_correction;
   int16_t *llrp;
-  int subframe_sched = (subframe == 9) ? 0 : (subframe+1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
 
-  harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[subframe_sched].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
   Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs);
 #ifdef DEBUG_ULSCH
   msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, cooperation_flag);
@@ -1314,7 +1314,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
     lte_ul_channel_estimation(phy_vars_eNB,
 			      eNB_id,
 			      UE_id,
-			      subframe,
+			      sched_subframe,
 			      l%(frame_parms->symbols_per_tti/2),
 			      l/(frame_parms->symbols_per_tti/2),
 			      cooperation_flag);
@@ -1556,13 +1556,13 @@ void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB,
 }
 
 
-void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t subframe, uint8_t UE_id) {
+void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t sched_subframe, uint8_t UE_id) {
 
   uint32_t nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12;
   uint8_t harq_pid;
-  int subframe_sched = (subframe==9)?0 : (subframe+1);
+  int subframe = PHY_vars_eNB->proc[sched_subframe].subframe_rx;
 
-  harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->proc[subframe_sched].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->proc[sched_subframe].frame_rx,subframe);
 
   printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs),PHY_vars_eNB->ulsch_eNB[UE_id]->Nsymb_pusch);
 #ifndef OAI_EMU 
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 4bfb1c3dc38..98b9b930e9a 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -138,18 +138,34 @@ enum transmission_access_mode{
   }ral_threshold_phy_t;
 #endif
 
+/// Context data structure for eNB subframe processing
 typedef struct {
+  /// subframe index
+  int subframe;
+  /// subframe to act upon for transmission 
+  int subframe_tx;
+  /// subframe to act upon for reception 
+  int subframe_rx;
+  /// frame to act upon for transmission 
+  int frame_tx;
+  /// frame to act upon for reception 
+  int frame_rx;
+  /// instance count for tx processing thread
   int instance_cnt_tx;
+  /// instance count for rx processing thread
   int instance_cnt_rx;
+  /// pthread structure for tx processing thread
   pthread_t pthread_tx;
+  /// pthread structure for rx processing thread
   pthread_t pthread_rx;
+  /// condition variable for tx processing thread
   pthread_cond_t cond_tx;
+  /// condition variable for rx processing thread
   pthread_cond_t cond_rx;
+  /// mutex for tx processing thread
   pthread_mutex_t mutex_tx;
+  /// mutex for tx processing thread
   pthread_mutex_t mutex_rx;
-  int subframe;
-  int frame_rx;
-  int frame_tx;
 } eNB_proc_t;
 
 /// Top-level PHY Data Structure for eNB 
diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c
index 405a611976b..430f7989054 100755
--- a/openair1/SCHED/phy_procedures_lte_common.c
+++ b/openair1/SCHED/phy_procedures_lte_common.c
@@ -258,7 +258,7 @@ unsigned char ul_ACK_subframe2_dl_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsig
 	return(4);  // To be updated
       }
       else {
-	LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
+	LOG_E(PHY,"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d\n",
 	    subframe,frame_parms->tdd_config);
 	return(0);
       }
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 7698f4758d2..3b139e43041 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -423,10 +423,11 @@ void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_
   }
 */ 
 
-void phy_procedures_eNB_S_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
+void phy_procedures_eNB_S_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
 
   //  unsigned char sect_id=0; 
-
+  int subframe = phy_vars_eNB->proc[subframe].subframe_rx;
+ 
 #ifdef DEBUG_PHY_PROC
   LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_S_RX(%d)\n", phy_vars_eNB->Mod_id,phy_vars_eNB->proc[subframe].frame_rx, subframe);
 #endif    
@@ -502,7 +503,7 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN
 #endif
 
 #ifndef OPENAIR2
-void fill_dci(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) {
+void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB) {
 
   int i;
   uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
@@ -510,7 +511,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) {
 
   uint32_t rballoc = 0x7FFF;
   uint32_t rballoc2 = 0x000F;
-  int sched_subframe = (subframe == 0) ? 9 : (subframe-1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
   /*
     uint32_t rand = taus();
     if ((subframe==8) || (subframe==9) || (subframe==0))
@@ -1005,7 +1006,7 @@ void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshol
 
 
 
-void phy_procedures_eNB_TX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,
+void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,
 			   relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
   uint8_t *pbch_pdu=&phy_vars_eNB->pbch_pdu[0];
   //  unsigned int nb_dci_ue_spec = 0, nb_dci_common = 0;
@@ -1036,7 +1037,7 @@ void phy_procedures_eNB_TX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
   // there is at least one allocation for PDCCH
   uint8_t smbv_alloc_cnt = 1;
 #endif
-  int sched_subframe = (subframe==0)?9:(subframe-1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
   start_meas(&phy_vars_eNB->phy_proc_tx);
@@ -1125,7 +1126,7 @@ void phy_procedures_eNB_TX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
     if (mch_pduP){
       fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag);
       // Generate PMCH
-      generate_mch(phy_vars_eNB,subframe,(uint8_t*)mch_pduP->payload,abstraction_flag);
+      generate_mch(phy_vars_eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag);
 #ifdef DEBUG_PHY
       for (i=0;i<mch_pduP->Pdu_size;i++)
 	msg("%2x.",(uint8_t)mch_pduP->payload[i]);
@@ -1614,7 +1615,7 @@ void phy_procedures_eNB_TX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
       //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti);
       generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0],
 					 DCI_pdu->dci_alloc[i].rnti,
-					 (subframe),
+					 sched_subframe,
 					 format0,
 					 UE_id,
 					 phy_vars_eNB,
@@ -2072,7 +2073,7 @@ void phy_procedures_eNB_TX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 #endif
     //    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
     generate_phich_top(phy_vars_eNB,
-		       subframe,
+		       sched_subframe,
 		       AMP,
 		       0,
 		       abstraction_flag);
@@ -2090,10 +2091,10 @@ void phy_procedures_eNB_TX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
   
 }
 
-void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint8_t UE_id, uint8_t harq_pid) {
+void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) {
   // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
 
-  int sched_subframe = (subframe==9) ? 0 : (subframe+1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
   int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
 
   LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n",
@@ -2126,7 +2127,7 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint8_t UE_id, uin
 // rate-adaptation based on the error statistics derived from the ACK/NAK process
 
 void process_HARQ_feedback(uint8_t UE_id, 
-			   uint8_t subframe, 
+			   uint8_t sched_subframe, 
 			   PHY_VARS_eNB *phy_vars_eNB,
 			   uint8_t pusch_flag, 
 			   uint8_t *pucch_payload, 
@@ -2140,7 +2141,8 @@ void process_HARQ_feedback(uint8_t UE_id,
   uint8_t subframe_m4,M,m;
   int mp;
   int all_ACKed=1,nb_alloc=0,nb_ACK=0;
-  int frame = phy_vars_eNB->proc[subframe].frame_rx;
+  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
 
   if (phy_vars_eNB->lte_frame_parms.frame_type == 0){ //FDD
     subframe_m4 = (subframe<4) ? subframe+6 : subframe-4;
@@ -2507,21 +2509,21 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
 }
 
 
-void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint8_t abstraction_flag) {
+void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t abstraction_flag) {
 
   uint16_t preamble_energy_list[64],preamble_delay_list[64];
   uint16_t preamble_max,preamble_energy_max;
   uint16_t i;
   int8_t UE_id;
-  int sched_subframe = (subframe == 9) ? 0 : (subframe+1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
   int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
 
   memset(&preamble_energy_list[0],0,64*sizeof(uint16_t));
   memset(&preamble_delay_list[0],0,64*sizeof(uint16_t));
   if (abstraction_flag == 0) {
-    /*    LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id,
+    LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id,
 	  frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB);        
-    */
+    
     //    LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset);
 
     rx_prach(phy_vars_eNB,
@@ -2598,7 +2600,7 @@ void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_
 }
 
 
-void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
+void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
   //RX processing
   uint32_t l, ret=0,i,j;
   uint32_t sect_id=0;
@@ -2618,7 +2620,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
   uint16_t rnti=0;
   uint8_t access_mode;
   int num_active_cba_groups;
-  int sched_subframe = (subframe == 9) ? 0 : (subframe+1);
+  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
   int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
@@ -2634,7 +2636,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
   // check if we have to detect PRACH first
   if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) {
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
-    prach_procedures(phy_vars_eNB,subframe,abstraction_flag);
+    prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag);
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
   }
  
@@ -2744,7 +2746,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
     */
 #ifdef OPENAIR2
     if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE)
-      process_Msg3(phy_vars_eNB,subframe,i,harq_pid);
+      process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
 #endif
 
     /*
@@ -2827,7 +2829,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
       start_meas(&phy_vars_eNB->ulsch_demodulation_stats);	      	      	  
       if (abstraction_flag==0) {
 	rx_ulsch(phy_vars_eNB,
-		 subframe,
+		 sched_subframe,
 		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
 		 i,
 		 phy_vars_eNB->ulsch_eNB,
@@ -2851,7 +2853,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
       if (abstraction_flag == 0) {
 	ret = ulsch_decoding(phy_vars_eNB,
 			     i,
-			     subframe,
+			     sched_subframe,
 			     0, // control_only_flag
 			     0, //Nbundled, to be updated!!!!
 			     0);  
@@ -2859,7 +2861,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 #ifdef PHY_ABSTRACTION
       else {
 	ret = ulsch_decoding_emul(phy_vars_eNB,
-				  subframe,
+				  sched_subframe,
 				  i,
 				  &rnti);
       }
@@ -2934,7 +2936,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
 
 	LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
-	//	dump_ulsch(phy_vars_eNB, subframe, i);
+	//	dump_ulsch(phy_vars_eNB, sched_subframe, i);
 	//	exit(-1);
 
 	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
@@ -2974,7 +2976,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 	  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
 	    printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
 	  printf("\n");
-	  dump_ulsch(phy_vars_eNB,subframe,i);*/
+	  dump_ulsch(phy_vars_eNB,sched_subframe,i);*/
 	  //#ifndef EXMIMO_IOT
 	  LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,subframe);
 	  //#else 
@@ -2999,7 +3001,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 	  }
 	  
 
-	  //	  dump_ulsch(phy_vars_eNB,subframe,i);
+	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
 	  
 	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) {
 	    LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n",
@@ -3011,7 +3013,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
 	    phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
 	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]++;
-	    //dump_ulsch(phy_vars_eNB, subframe, i);
+	    //dump_ulsch(phy_vars_eNB, sched_subframe, i);
 	  }
 	
 	  // If we've dropped the UE, go back to PRACH mode for this UE
@@ -3087,7 +3089,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 	  LOG_T(PHY,"\n");
 #endif
 #endif
-	  //dump_ulsch(phy_vars_eNB,subframe,i);
+	  //dump_ulsch(phy_vars_eNB,sched_subframe,i);
  
 
 #ifdef OPENAIR2
@@ -3109,7 +3111,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 
 	// estimate timing advance for MAC
 	if (abstraction_flag == 0) {
-	  sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,subframe);
+	  sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe);
 	  phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check 
 	}
 
@@ -3132,7 +3134,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 	    i);
 #endif
       process_HARQ_feedback(i,
-			    subframe,
+			    sched_subframe,
 			    phy_vars_eNB,
 			    1, // pusch_flag
 			    0,
@@ -3220,7 +3222,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 				    pucch_format1,
 				    0,
 				    &SR_payload,
-				    subframe);
+				    sched_subframe);
 	    LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id,
 		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex);
 	  }
@@ -3277,7 +3279,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 		pucch_payload0[0],metric0);
 #endif
 
-	  process_HARQ_feedback(i,subframe,phy_vars_eNB,
+	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
 				0,// pusch_flag
 				pucch_payload0,
 				2,
@@ -3410,7 +3412,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 		frame,subframe,
 		metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
 #endif	  
-	  process_HARQ_feedback(i,subframe,phy_vars_eNB,
+	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
 				0,// pusch_flag
 				pucch_payload,
 				pucch_sel,
@@ -3448,7 +3450,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 #endif
       if (abstraction_flag==0) {
 	rx_ulsch(phy_vars_eNB,
-		 subframe,
+		 sched_subframe,
 		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
 		 i,
 		 phy_vars_eNB->ulsch_eNB,
@@ -3466,7 +3468,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
       if (abstraction_flag == 0) {
 	ret = ulsch_decoding(phy_vars_eNB,
 			     i,
-			     subframe,
+			     sched_subframe,
 			     0, // control_only_flag
 			     0,  //Nbundled, to be updated!!!!
 			     0);  
@@ -3474,7 +3476,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 #ifdef PHY_ABSTRACTION
       else {
 	ret = ulsch_decoding_emul(phy_vars_eNB,
-				  subframe,
+				  sched_subframe,
 				  i,
 				  &rnti);
       }
@@ -3500,7 +3502,7 @@ void phy_procedures_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uin
 	  (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) &&
 	  (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) {
 #ifdef DEBUG_PHY_PROC
-	LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the sched_subframeuling_flag for Ue %d cba groups %d members\n",
+	LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n",
 	      phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid,
 	      i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups);
 #endif
@@ -3625,11 +3627,6 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,ui
   int           result;
 #endif
 
-  int subframe_rx,subframe_tx;
-  
-  subframe_rx = (subframe == 0) ? 9 : (subframe-1);
-  subframe_tx = (subframe == 9) ? 0 : (subframe+1);
-
   /*
     if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000)
     mac_xface->macphy_exit("Exiting after 1000 Frames\n");
@@ -3774,25 +3771,27 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,ui
   } while(msg_p != NULL);
 #endif
 
-  if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD)&&(subframe_select(&phy_vars_eNB->lte_frame_parms,subframe_tx)==SF_DL))||
+  if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD)&&
+	(subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_tx)==SF_DL))||
        (phy_vars_eNB->lte_frame_parms.frame_type == FDD))) {
 #ifdef Rel10 
-    if (phy_procedures_RN_eNB_TX(subframe_rx, subframe_tx, r_type) != 0 ) 
+    if (phy_procedures_RN_eNB_TX(phy_vars_eNB->proc[subframe].subframe_rx, phy_vars_eNB->proc[subframe].subframe_tx, r_type) != 0 ) 
 #endif 
-      phy_procedures_eNB_TX(subframe_tx,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
+      phy_procedures_eNB_TX(subframe,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
   }
-  if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD )&&(subframe_select(&phy_vars_eNB->lte_frame_parms,subframe_rx)==SF_UL)) ||
+  if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD )&&
+	(subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_rx)==SF_UL)) ||
        (phy_vars_eNB->lte_frame_parms.frame_type == FDD))){
-    phy_procedures_eNB_RX(subframe_rx,phy_vars_eNB,abstraction_flag,r_type);
+    phy_procedures_eNB_RX(subframe,phy_vars_eNB,abstraction_flag,r_type);
   }
-  if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe_tx)==SF_S) {
+  if (subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_tx)==SF_S) {
 #ifdef Rel10 
-    if (phy_procedures_RN_eNB_TX(subframe_rx, subframe_tx, r_type) != 0 )
+    if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 )
 #endif 
-      phy_procedures_eNB_TX(subframe_tx,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
+      phy_procedures_eNB_TX(subframe,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
   }
-  if ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe_rx)==SF_S)){
-    phy_procedures_eNB_S_RX(subframe_rx,phy_vars_eNB,abstraction_flag,r_type);
+  if ((subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_rx)==SF_S)){
+    phy_procedures_eNB_S_RX(subframe,phy_vars_eNB,abstraction_flag,r_type);
   }
 
 
diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c
index 951f7f9b8f8..7b6752c30ae 100644
--- a/openair1/SCHED/pusch_pc.c
+++ b/openair1/SCHED/pusch_pc.c
@@ -71,6 +71,7 @@ uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100};
 
 void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) {
 
+  
   uint8_t harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms,
 				  ((subframe==0)?1:0) + phy_vars_ue->frame,
 				  subframe);
diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
index 447214f227b..1bb37ed9ee6 100644
--- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
@@ -807,6 +807,9 @@ int main(int argc, char **argv) {
   PHY_vars_UE->ulsch_ue[0]   = new_ue_ulsch(8,N_RB_DL,0);
 
 
+  PHY_vars_eNB->proc[subframe].frame_tx    = 0;
+  PHY_vars_eNB->proc[subframe].subframe_tx = subframe;
+
   if (input_fd==NULL) {
     msg("No input file, so starting TX\n");
  }    
@@ -947,7 +950,7 @@ int main(int argc, char **argv) {
         if (n_frames==1) 
 	  printf("generating PHICH\n");
 
-        harq_pid = phich_subframe_to_harq_pid(&PHY_vars_eNB->lte_frame_parms, PHY_vars_eNB->proc[(subframe+9)%10].frame_tx, subframe);
+        harq_pid = phich_subframe_to_harq_pid(&PHY_vars_eNB->lte_frame_parms, PHY_vars_eNB->proc[subframe].frame_tx, subframe);
             
         phich_ACK = taus()&1;
         PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->phich_active = 1;
diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c
index 8db745179bd..1617f313d3b 100644
--- a/openair1/SIMULATION/LTE_PHY/prachsim.c
+++ b/openair1/SIMULATION/LTE_PHY/prachsim.c
@@ -27,7 +27,6 @@ int current_dlsch_cqi; //FIXME!
 PHY_VARS_eNB *PHY_vars_eNB;
 PHY_VARS_UE *PHY_vars_UE;
 
-DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2;
 #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
 
 
diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c
index 14180abf18d..fa54e9d4cc2 100644
--- a/openair1/SIMULATION/LTE_PHY/pucchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c
@@ -28,7 +28,6 @@ int current_dlsch_cqi; //FIXME!
 PHY_VARS_eNB *PHY_vars_eNB;
 PHY_VARS_UE *PHY_vars_UE;
 
-DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2;
 #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
 
 
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 81b8481674d..b8d7a4e87bf 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -728,16 +728,22 @@ int main(int argc, char **argv) {
   PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
   PHY_vars_UE->frame=1;
 
-  for (sf=0;sf<10;sf++) PHY_vars_eNB->proc[sf].frame_tx=1;
-  for (sf=0;sf<10;sf++) PHY_vars_eNB->proc[sf].frame_rx=1;
-  PHY_vars_eNB->proc[0].frame_rx = 0;
-  PHY_vars_eNB->proc[9].frame_tx = 2;
+  for (sf=0;sf<10;sf++) { 
+    PHY_vars_eNB->proc[sf].frame_tx=1; 
+    PHY_vars_eNB->proc[sf].subframe_tx=sf;
+    PHY_vars_eNB->proc[sf].frame_rx=1;
+    PHY_vars_eNB->proc[sf].subframe_rx=sf;
+  }
 
   msg("Init UL hopping UE\n");
   init_ul_hopping(&PHY_vars_UE->lte_frame_parms);
   msg("Init UL hopping eNB\n");
   init_ul_hopping(&PHY_vars_eNB->lte_frame_parms);
 
+  PHY_vars_eNB->proc[subframe].frame_rx = PHY_vars_UE->frame;
+  if (ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe) > subframe) // allocation was in previous frame
+    PHY_vars_eNB->proc[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].frame_tx = (PHY_vars_UE->frame-1)&1023;
+
 
   generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu,
 				    14,
@@ -805,13 +811,9 @@ int main(int argc, char **argv) {
 	
       //randominit(0);
 
-      if (subframe==0)
-	PHY_vars_eNB->proc[9].frame_rx = PHY_vars_UE->frame;
-      else
-	PHY_vars_eNB->proc[subframe-1].frame_rx = PHY_vars_UE->frame;
 
-     harq_pid = subframe2harq_pid(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->frame,subframe);
-      printf("UL frame %d/subframe %d, harq_pid %d\n",PHY_vars_UE->frame,subframe,harq_pid);
+      harq_pid = subframe2harq_pid(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->frame,subframe);
+      //      printf("UL frame %d/subframe %d, harq_pid %d\n",PHY_vars_UE->frame,subframe,harq_pid);
       if (input_fdUL == NULL) {
 	input_buffer_length = PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/8;
 	input_buffer = (unsigned char *)malloc(input_buffer_length+4);
-- 
GitLab