phy_procedures_lte_ue.c 141 KB
Newer Older
1
/*******************************************************************************
ghaddab's avatar
ghaddab committed
2 3
    OpenAirInterface 
    Copyright(c) 1999 - 2014 Eurecom
4

ghaddab's avatar
ghaddab committed
5 6 7 8
    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
9 10


ghaddab's avatar
ghaddab committed
11 12 13 14
    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
15

ghaddab's avatar
ghaddab committed
16 17
    You should have received a copy of the GNU General Public License
    along with OpenAirInterface.The full GNU General Public License is 
18 19
    included in this distribution in the file called "COPYING". If not, 
    see <http://www.gnu.org/licenses/>.
20 21

  Contact Information
ghaddab's avatar
ghaddab committed
22 23 24 25
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr
  
ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27

ghaddab's avatar
ghaddab committed
28
 *******************************************************************************/
29 30 31

/*! \file phy_procedures_lte_ue.c
 * \brief Implementation of UE procedures from 36.213 LTE specifications
32
 * \author R. Knopp, F. Kaltenberger, N. Nikaein
33 34 35
 * \date 2011
 * \version 0.1
 * \company Eurecom
36
 * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr
37 38 39 40
 * \note
 * \warning
 */

41
#include "assertions.h"
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
#include "defs.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/defs.h"
#include "MAC_INTERFACE/extern.h"
#include "SCHED/defs.h"
#include "SCHED/extern.h"

#ifdef EMOS
#include "SCHED/phy_procedures_emos.h"
#endif

#ifdef EXMIMO
#ifdef DRIVER2013
#include "openair0_lib.h"
57
#include "gain_control.h"
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
extern int card;
#endif
#endif

#define DEBUG_PHY_PROC
#define UE_TX_POWER (-10)

//#ifdef OPENAIR2
#ifndef PUCCH
#define PUCCH
#endif
//#endif

//#ifdef OPENAIR2
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/defs.h"
#include "UTIL/LOG/log.h"
//#endif

#ifdef EMOS
fifo_dump_emos_UE emos_dump_UE;
#endif

#include "UTIL/LOG/vcd_signal_dumper.h"

83 84
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
85 86 87
#   if defined(ENABLE_RAL)
#     include "timer.h"
#   endif
88 89
#endif

90 91 92 93 94 95 96 97 98 99 100 101
#ifndef OPENAIR2
//#define DIAG_PHY
#endif

#define DLSCH_RB_ALLOC 0x1fbf  // skip DC RB (total 23/25 RBs)
#define DLSCH_RB_ALLOC_12 0x0aaa  // skip DC RB (total 23/25 RBs)

#define NS_PER_SLOT 500000

extern inline unsigned int taus(void);
extern int oai_exit;

102 103
uint8_t ulsch_input_buffer[2700] __attribute__ ((aligned(16)));
uint8_t access_mode;
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124

#ifdef DLSCH_THREAD
extern int dlsch_instance_cnt[8];
extern int dlsch_subframe[8];
extern pthread_mutex_t dlsch_mutex[8];
/// Condition variable for dlsch thread
extern pthread_cond_t dlsch_cond[8];
extern int rx_pdsch_instance_cnt;
extern int rx_pdsch_slot;
extern pthread_mutex_t rx_pdsch_mutex;
/// Condition variable for rx_pdsch thread
extern pthread_cond_t rx_pdsch_cond;
#endif

DCI_ALLOC_t dci_alloc_rx[8];

#ifdef DIAG_PHY
extern int rx_sig_fifo;
#endif


125
#if defined(EXMIMO) || defined(USRP)
126
extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
127 128 129 130
#endif

#ifdef USER_MODE

131
void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) {
132
  unsigned int coded_bits_per_codeword;
133
  uint8_t nsymb = (phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12;
134 135 136 137

  coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms,
                                  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
                                  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
138 139
                                  get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs),
				  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,    
140
                                  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
Raymond Knopp's avatar
 
Raymond Knopp committed
141
                                  phy_vars_ue->frame_rx,subframe);
142 143 144 145 146 147 148 149 150 151

  write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1);
  write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_ext[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1);
  write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[0],300*nsymb,1,1);
  /*
    write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1);
    write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1);
    write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1);
    write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1);
  */
152
  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_comp0[0],300*12,1,1);
153 154
  write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars[0]->llr[0],coded_bits_per_codeword,1,0);
  
155 156
  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_mag0,300*12,1,1);
  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_magb0,300*12,1,1);
157 158
}

159
void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) {
160
  unsigned int coded_bits_per_codeword;
161
  uint8_t nsymb = ((phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12);
162 163 164 165

  coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms,
                                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
                                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
166 167
                                  get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs),
				  1,
168
                                  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
Raymond Knopp's avatar
 
Raymond Knopp committed
169
                                  phy_vars_ue->frame_rx,subframe);
170 171 172 173 174 175 176 177 178 179
  LOG_D(PHY,"[UE %d] Dumping dlsch_SI : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n",
      phy_vars_ue->Mod_id,
      phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
      phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs,  
      phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,  
      phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
      coded_bits_per_codeword);

  write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1);
  write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1);
180
  write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_estimates_ext[0],phy_vars_ue->lte_frame_parms.N_RB_DL*12*nsymb,1,1);
181 182 183 184 185 186
  /*
    write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1);
    write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1);
    write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1);
    write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1);
  */
187
  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_comp0[0],phy_vars_ue->lte_frame_parms.N_RB_DL*12*nsymb,1,1);
188 189
  write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0);
  
190 191
  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1);
  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1);
192 193 194
  exit(-1);
}

195
#if defined(EXMIMO) || defined(USRP) 
196 197
unsigned int prach_gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};

198
unsigned int get_tx_amp(int power_dBm, int power_max_dBm) {
199

200
  int gain_dB = power_dBm - power_max_dBm;
201 202 203 204 205 206 207 208 209 210 211

  if (gain_dB < -30) {
    return(AMP/32);
  }
  else if (gain_dB>0)
    return(AMP);
  else
    return(100*AMP/prach_gain_table[-gain_dB]);
}
#endif

212
void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) {
213
  unsigned int coded_bits_per_codeword;
214
  uint8_t nsymb = ((phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12);
215 216 217 218 219

  coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms,
                                  phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb,
                                  phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc,
                                  get_Qm(phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs),  
Raymond Knopp's avatar
 
Raymond Knopp committed
220
				  1,
221
                                  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
Raymond Knopp's avatar
 
Raymond Knopp committed
222
                                  phy_vars_ue->frame_rx,subframe);
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
  LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n",
      phy_vars_ue->Mod_id,
      phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb,
      phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs,  
      phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb,  
      phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
      coded_bits_per_codeword);

  write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1);
  write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_ext[0],2*12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1);
  write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1);
  /*
    write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1);
    write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1);
    write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1);
    write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1);
  */
240
  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1);
241 242
  write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0);
  
243 244
  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1);
  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1);
245 246 247
}
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
248
void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) {
249 250 251 252

  // This flushes ALL DLSCH and ULSCH harq buffers of ALL connected eNBs...add the eNB_index later
  // for more flexibility
  
253
  uint8_t i,j,k;
Raymond Knopp's avatar
 
Raymond Knopp committed
254
  PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
  //[NUMBER_OF_CONNECTED_eNB_MAX][2];
  for(i=0;i<NUMBER_OF_CONNECTED_eNB_MAX;i++) {
    for(j=0;j<2;j++) {
      //DL HARQ
      if(phy_vars_ue->dlsch_ue[i][j]) {
	for(k=0;k<NUMBER_OF_HARQ_PID_MAX && phy_vars_ue->dlsch_ue[i][j]->harq_processes[k];k++) {
	  phy_vars_ue->dlsch_ue[i][j]->harq_processes[k]->status = SCH_IDLE;
	}
      }
    }
    //UL HARQ
    if(phy_vars_ue->ulsch_ue[i]) {
      for(k=0;k<NUMBER_OF_HARQ_PID_MAX && phy_vars_ue->ulsch_ue[i]->harq_processes[k];k++) {
	phy_vars_ue->ulsch_ue[i]->harq_processes[k]->status = SCH_IDLE;
	//Set NDIs for all UL HARQs to 0
270
	//	phy_vars_ue->ulsch_ue[i]->harq_processes[k]->Ndi = 0;
271 272 273 274 275 276 277 278 279 280
	
      }
    }
    
    // flush Msg3 buffer
    phy_vars_ue->ulsch_ue_Msg3_active[i] = 0;
    
  }
}

Raymond Knopp's avatar
 
Raymond Knopp committed
281
void ra_failed(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) {
282 283

  // if contention resolution fails, go back to PRACH
Raymond Knopp's avatar
 
Raymond Knopp committed
284
  PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PRACH;
Raymond Knopp's avatar
 
Raymond Knopp committed
285
  LOG_E(PHY,"[UE %d] Frame %d Random-access procedure fails, going back to PRACH, setting SIStatus = 0 and State RRC_IDLE\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx);
286 287 288
  //mac_xface->macphy_exit("");
}

Raymond Knopp's avatar
 
Raymond Knopp committed
289
void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) {
290 291 292

  int i;

Raymond Knopp's avatar
 
Raymond Knopp committed
293
  LOG_I(PHY,"[UE %d][RAPROC] Frame %d Random-access procedure succeeded\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx);
294

Raymond Knopp's avatar
 
Raymond Knopp committed
295 296
  PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue_Msg3_active[eNB_index] = 0;
  PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PUSCH;
297 298

  for (i=0;i<8;i++) { 
Raymond Knopp's avatar
 
Raymond Knopp committed
299 300 301
    if (PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->harq_processes[i]) {
      PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->harq_processes[i]->status=IDLE;
      PHY_vars_UE_g[Mod_id][CC_id]->dlsch_ue[eNB_index][0]->harq_processes[i]->round=0;
302
    }
303 304 305 306 307
  }


}

Raymond Knopp's avatar
 
Raymond Knopp committed
308
UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) {
309

Raymond Knopp's avatar
 
Raymond Knopp committed
310
  return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index]);
311 312

}
313
void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance) {
314 315 316 317 318 319 320 321 322 323 324 325

  /*
  if ((timing_advance>>10) & 1) //it is negative
    timing_advance = timing_advance - (1<<11);
  */

  if (openair_daq_vars.manual_timing_advance == 0) {
    phy_vars_ue->timing_advance = timing_advance*4;    

  }

#ifdef DEBUG_PHY_PROC  
Raymond Knopp's avatar
 
Raymond Knopp committed
326
  LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance,openair_daq_vars.timing_advance);
327 328 329 330
#endif

}

Raymond Knopp's avatar
 
Raymond Knopp committed
331
void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance) {
332

333
  //  uint32_t frame = PHY_vars_UE_g[Mod_id]->frame;
334 335 336 337 338 339 340
 
  if ((timing_advance>>5) & 1) //it is negative
    timing_advance = timing_advance - (1<<6);
  
  if (openair_daq_vars.manual_timing_advance == 0) {
    //if ( (frame % 100) == 0) {
    //if ((timing_advance > 3) || (timing_advance < -3) )
Raymond Knopp's avatar
 
Raymond Knopp committed
341
    PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = cmax(0,(int)PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4);
342 343 344 345
      
    //}
  }

Raymond Knopp's avatar
 
Raymond Knopp committed
346
  LOG_D(PHY,"[UE %d] Got timing advance %d from MAC, new value %d\n",Mod_id, timing_advance, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance);
347 348 349 350
  

}

351
uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) {
352 353
  
  LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for SR TXOp (sr_ConfigIndex %d)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
354
	phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame_tx,subframe,
355 356 357 358 359 360 361 362 363 364 365
      phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex);
  
  if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) {        // 5 ms SR period
    if ((subframe%5) == phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex)
      return(1);
  }
  else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 14) {  // 10 ms SR period
    if (subframe==(phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-5))
      return(1);
  }
  else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 34) { // 20 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
366
    if ((10*(phy_vars_ue->frame_tx&1)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15))
367 368 369
      return(1);
  }
  else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 74) { // 40 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
370
    if ((10*(phy_vars_ue->frame_tx&3)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35))
371 372 373
      return(1);
  }
  else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 154) { // 80 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
374
    if ((10*(phy_vars_ue->frame_tx&7)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75))
375 376 377 378 379 380
      return(1);
  }

  return(0);
}

381 382 383 384 385
uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue,
		 uint8_t eNB_id,
		 uint8_t subframe,
		 uint8_t *b,
		 uint8_t SR) {
386 387

  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
388
  uint8_t nCCE0,nCCE1,harq_ack1,harq_ack0;
389
  ANFBmode_t bundling_flag;
390
  uint16_t n1_pucch0=0,n1_pucch1=0;
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
  int subframe_offset;
  int sf;
  int M;
  // clear this, important for case where n1_pucch selection is not used

  phy_vars_ue->pucch_sel[subframe] = 0;

  if (frame_parms->frame_type == FDD ) { // FDD
    sf = (subframe<4)? subframe+6 : subframe-4;
    printf("n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
    if (SR == 0) 
      return(frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
    else
      return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
  }
  else {

    bundling_flag = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
#ifdef DEBUG_PHY_PROC
    if (bundling_flag==bundling){
Raymond Knopp's avatar
 
Raymond Knopp committed
411
      LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,SR,
412 413 414
	    phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
    }
    else {
Raymond Knopp's avatar
 
Raymond Knopp committed
415
      LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,SR,
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
	    phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
    }
#endif
    switch (frame_parms->tdd_config) {
    case 1:  // DL:S:UL:UL:DL:DL:S:UL:UL:DL

      harq_ack0 = 2; // DTX
      M=1;
      // This is the offset for a particular subframe (2,3,4) => (0,2,4)
      if (subframe == 2) {  // ACK subframes 5 (forget 6)
	subframe_offset = 5;
	M=2;
      }
      else if (subframe == 3) {   // ACK subframe 9
	subframe_offset = 9;	
      }
      else if (subframe == 7) {  // ACK subframes 0 (forget 1)
	subframe_offset = 0;
	M=2;
      }
      else if (subframe == 8) {   // ACK subframes 4
	subframe_offset = 4;
      }
      else {
	LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
441
	    phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,frame_parms->tdd_config);
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
	return(0);
      }


      // i=0
      nCCE0 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[subframe_offset];
      n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 

      // set ACK/NAK to values if not DTX
      if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_offset].send_harq_status>0)  // n-6 // subframe 5 is to be ACK/NAKed
	harq_ack0 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_offset].ack; 
      

      if (harq_ack0!=2) {  // DTX
	if (SR == 0) {  // last paragraph pg 68 from 36.213 (v8.6), m=0
	  b[0]=(M==2) ? 1-harq_ack0 : harq_ack0;
	  b[1]=harq_ack0;   // in case we use pucch format 1b (subframes 2,7)
	  phy_vars_ue->pucch_sel[subframe] = 0;
	  return(n1_pucch0);
	}
	else { // SR and only 0 or 1 ACKs (first 2 entries in Table 7.3-1 of 36.213)
	  b[0]=harq_ack0;
	  return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
	}
      }


      break;
    case 3:  // DL:S:UL:UL:UL:DL:DL:DL:DL:DL
      // in this configuration we have M=2 from pg 68 of 36.213 (v8.6)
      // Note: this doesn't allow using subframe 1 for PDSCH transmission!!! (i.e. SF 1 cannot be acked in SF 2)
      // set ACK/NAKs to DTX
      harq_ack1 = 2; // DTX
      harq_ack0 = 2; // DTX
      // This is the offset for a particular subframe (2,3,4) => (0,2,4)
      subframe_offset = (subframe-2)<<1;
      // i=0
      nCCE0 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[5+subframe_offset];
      n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 
      // i=1
      nCCE1 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[(6+subframe_offset)%10];
      n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 

      // set ACK/NAK to values if not DTX
      if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[(6+subframe_offset)%10].send_harq_status>0)  // n-6 // subframe 6 is to be ACK/NAKed
	harq_ack1 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[(6+subframe_offset)%10].ack;
      if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[5+subframe_offset].send_harq_status>0)  // n-6 // subframe 5 is to be ACK/NAKed
	harq_ack0 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[5+subframe_offset].ack; 
      

      if (harq_ack1!=2) { // n-6 // subframe 6,8,0 and maybe 5,7,9 is to be ACK/NAKed
	  
	if ((bundling_flag==bundling)&&(SR == 0)) {  // This is for bundling without SR, 
	                                             // n1_pucch index takes value of smallest element in set {0,1} 
	                                             // i.e. 0 if harq_ack0 is not DTX, otherwise 1
	  b[0] = harq_ack1;
	  if (harq_ack0!=2)
	    b[0]=b[0]&harq_ack0;
	  phy_vars_ue->pucch_sel[subframe] = 1;
	  return(n1_pucch1);
	  
	}
	else if ((bundling_flag==multiplexing)&&(SR==0)) {  // Table 10.1
	  if (harq_ack0 == 2)
	    harq_ack0 = 0;
	  b[1] = harq_ack0;
	  b[0] = (harq_ack0!=harq_ack1)?0:1;
	  if ((harq_ack0 == 1) && (harq_ack1 == 0)) {
	    phy_vars_ue->pucch_sel[subframe] = 0;
	    return(n1_pucch0);
	  }
	  else {
	    phy_vars_ue->pucch_sel[subframe] = 1;
	    return(n1_pucch1);
	  }
	}
	else if (SR==1) { // SR and 0,1,or 2 ACKS, (first 3 entries in Table 7.3-1 of 36.213)
	  // this should be number of ACKs (including
	  if (harq_ack0 == 2)
	    harq_ack0 = 0;
	  b[0]= harq_ack1 | harq_ack0;
	  b[1]= harq_ack1 ^ harq_ack0;
	  return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
	}
      }
      else if (harq_ack0!=2) {// n-7  // subframe 5,7,9 only is to be ACK/NAKed
	if ((bundling_flag==bundling)&&(SR == 0)) {  // last paragraph pg 68 from 36.213 (v8.6), m=0
	  b[0]=harq_ack0;
	  phy_vars_ue->pucch_sel[subframe] = 0;
	  return(n1_pucch0);
	}
	else if ((bundling_flag==multiplexing)&&(SR==0)) {  // Table 10.1 with i=1 set to DTX
	  b[0] = harq_ack0;
	  b[1] = 1-b[0];
	  phy_vars_ue->pucch_sel[subframe] = 0;
	  return(n1_pucch0);
	}
	else if (SR==1) { // SR and only 0 or 1 ACKs (first 2 entries in Table 7.3-1 of 36.213)
	  b[0]=harq_ack0;
	  b[1]=b[0];
	  return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
	}
      }
      break;

    }  // switch tdd_config     
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
549
  LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",phy_vars_ue->frame_tx);
550 551 552 553 554 555
  return(-1);
}


#ifdef EMOS
/*
556 557
void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) {
  uint8_t harq_pid;
558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
  

  if (next_slot%2==0) {      
    // get harq_pid from subframe relationship
    harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms,phy_vars_ue->frame,(next_slot>>1));    
    if (harq_pid==255) {
      LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n",
	  0,phy_vars_ue->frame);
      return;
    }

    if (ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
      emos_dump_UE.uci_cnt[next_slot>>1] = 1;
      memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch_ue[eNB_id]->o,MAX_CQI_BITS*sizeof(char));
      emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch_ue[eNB_id]->O;
      memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch_ue[eNB_id]->o_RI,2*sizeof(char));
      emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch_ue[eNB_id]->O_RI;
      memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch_ue[eNB_id]->o_ACK,4*sizeof(char));
      emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK;
    }
    else {
      emos_dump_UE.uci_cnt[next_slot>>1] = 0;
    }
  }
}
*/
#endif

int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
#ifndef OPENAIR2
  PRACH_RESOURCES_t prach_resources_local;
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
591
void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) {
592 593
  
  //  int i_d;
594 595
  uint16_t first_rb, nb_rb;
  uint8_t harq_pid;
596
  unsigned int input_buffer_length;
597
  unsigned int aa;
598 599 600
  uint8_t Msg3_flag=0;
  uint8_t pucch_ack_payload[2];
  uint8_t n1_pucch;
601 602
  ANFBmode_t bundling_flag;
  PUCCH_FMT_t format;
603 604
  uint8_t SR_payload;
  int32_t prach_power;
Raymond Knopp's avatar
 
Raymond Knopp committed
605
  uint8_t nsymb;
606
  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
607 608 609 610
  uint8_t generate_ul_signal = 0;
  uint8_t ack_status=0;
  int8_t Po_PUCCH;
  int32_t ulsch_start=0;
611
#if defined(EXMIMO) || defined(USRP)
612
  int overflow=0;
613 614
  int k,l;
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
615 616 617 618 619
  int slot_tx = phy_vars_ue->slot_tx;
  int subframe_tx = phy_vars_ue->slot_tx>>1;
  int frame_tx = phy_vars_ue->frame_tx;
  int Mod_id = phy_vars_ue->Mod_id;
  int CC_id = phy_vars_ue->CC_id;
620 621 622
#ifndef OPENAIR2
  int i;
#endif
623 624

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
625

626
  start_meas(&phy_vars_ue->phy_proc_tx);
627 628 629 630 631

#ifdef EMOS
  //phy_procedures_emos_UE_TX(next_slot);
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
632
  if ((slot_tx%2)==0) {
633 634
    phy_vars_ue->tx_power_dBm=-127;

635
    if (abstraction_flag==0) {      
636
      for (aa=0;aa<frame_parms->nb_antennas_tx;aa++){
Raymond Knopp's avatar
 
Raymond Knopp committed
637
	memset(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti],
638 639
	       0,
	       frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t));
640 641 642 643 644 645
      }
    }

    if (phy_vars_ue->UE_mode[eNB_id] != PRACH) {
    /*
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
646
      LOG_D(PHY,"[UE  %d] Frame %d, slot %d: Generating SRS\n",Mod_id,phy_vars_ue->frame,slot_tx);
647 648 649
#endif
      if (abstraction_flag == 0) {
#ifdef OFDMA_ULSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
650
	generate_srs_tx(phy_vars_ue,eNB_id,AMP,subframe_tx);
651
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
652
	generate_srs_tx(phy_vars_ue,eNB_id,AMP,subframe_tx);
653 654 655 656 657
#endif
      }
      
#ifdef PHY_ABSTRACTION
      else {
Raymond Knopp's avatar
 
Raymond Knopp committed
658
	generate_srs_tx_emul(phy_vars_ue,subframe_tx);
659 660 661 662 663
      }
#endif
    */
      // get harq_pid from subframe relationship
      harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
664 665
				   frame_tx,
				   subframe_tx);
666 667 668 669
      

#ifdef OPENAIR2
      if ((phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) && 
Raymond Knopp's avatar
 
Raymond Knopp committed
670 671
	  (phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id] == frame_tx) && 
	  (phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3
672 673 674 675 676 677 678
	
	phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
	if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0)
	  generate_ue_ulsch_params_from_rar(phy_vars_ue,
					    eNB_id);

	phy_vars_ue->ulsch_ue[eNB_id]->power_offset = 14;
Raymond Knopp's avatar
 
Raymond Knopp committed
679
	LOG_D(PHY,"[UE  %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
680 681 682
	    Mod_id,
	    frame_tx,
	    subframe_tx,
683 684 685 686 687 688 689
	    harq_pid);
	Msg3_flag = 1;
      }
      else {
	
	if (harq_pid==255) {
	  LOG_E(PHY,"[UE%d] Frame %d ulsch_decoding.c: FATAL ERROR: illegal harq_pid, returning\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
690
	      Mod_id,frame_tx);
691
	  mac_xface->macphy_exit("Error in ulsch_decoding");
692
          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
693
	  stop_meas(&phy_vars_ue->phy_proc_tx);
694 695 696 697 698 699 700 701 702
	  return;
	}
	Msg3_flag=0;
      }
#endif
      
      if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
	
	generate_ul_signal = 1;
703 704
	// FK 20140908: the power control cannot be done here, since we do not have the spectral efficiency yet. this is only done in ulsch_encoding
	/*
705
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
706
	pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag);
707 708 709 710
	phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH;
#else
	phy_vars_ue->tx_power_dBm = UE_TX_POWER;
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
711 712
	phy_vars_ue->tx_total_RE = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb*12;

713
	LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d harq pid %d, Po_PUSCH : %d dBm\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
714
	      Mod_id,harq_pid,frame_tx,subframe_tx,harq_pid, phy_vars_ue->tx_power_dBm);	
715
	*/
716 717 718 719 720 721

	// deactivate service request
	phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
	
	ack_status = get_ack(&phy_vars_ue->lte_frame_parms,
			     phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack,
Raymond Knopp's avatar
 
Raymond Knopp committed
722
			     subframe_tx,
723 724 725 726 727 728 729 730 731 732 733 734 735
			     phy_vars_ue->ulsch_ue[eNB_id]->o_ACK);
	
	first_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb;
	nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb;
	
	
	//frame_parms->pusch_config_c ommon.ul_ReferenceSignalsPUSCH.cyclicShift = 0;
	
	//frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[20] = 0;
	
	
	
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
736
	LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
737
	      Mod_id,harq_pid,frame_tx,subframe_tx,
738 739 740 741 742 743
	      first_rb,nb_rb,
	      phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round,
	      phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->mcs,
	      phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx,
	      (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+
	      phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2+
Raymond Knopp's avatar
 
Raymond Knopp committed
744
	      frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx])%12,
745 746
	      frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
	      phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2,
Raymond Knopp's avatar
 
Raymond Knopp committed
747
	      frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx],
748 749 750
	      phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[0],phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[1],
	      phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK);
	if (ack_status > 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
751
	  LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d Generating ACK (%d,%d) for %d bits on PUSCH\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
752
		Mod_id,
753
		phy_vars_ue->ulsch_ue[eNB_id]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
754
		frame_tx,subframe_tx,
755 756 757 758 759 760 761
		phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[0],phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[1],
		phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK);
	}
#endif
	

	//#ifdef DEBUG_PHY_PROC      
Raymond Knopp's avatar
 
Raymond Knopp committed
762
	//	debug_LOG_D(PHY,"[UE  %d] Frame %d, Subframe %d ulsch harq_pid %d : O %d, O_ACK %d, O_RI %d, TBS %d\n",Mod_id,phy_vars_ue->frame,subframe_tx,harq_pid,phy_vars_ue->ulsch_ue[eNB_id]->O,phy_vars_ue->ulsch_ue[eNB_id]->O_ACK,phy_vars_ue->ulsch_ue[eNB_id]->O_RI,phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS);
763 764
	//#endif
	if (Msg3_flag == 1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
765
	  LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d next slot %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx,subframe_tx, slot_tx, 
766 767
		phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb,
		phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb,
768
		phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round,
769 770 771 772 773 774 775 776 777 778 779
		phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx,
		phy_vars_ue->prach_resources[eNB_id]->Msg3[0],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[1],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[2],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[3],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[4],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[5],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[6],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[7],
		phy_vars_ue->prach_resources[eNB_id]->Msg3[8]);

780
	  start_meas(&phy_vars_ue->ulsch_encoding_stats);	      
781 782 783 784 785 786 787
	  if (abstraction_flag==0) {
	    if (ulsch_encoding(phy_vars_ue->prach_resources[eNB_id]->Msg3,
			       phy_vars_ue,
			       harq_pid,
			       eNB_id,
			       phy_vars_ue->transmission_mode[eNB_id],0,0)!=0) {
	      LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
788
	      mac_xface->macphy_exit("Error in ulsch_coding");
789
              vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
790
	      stop_meas(&phy_vars_ue->phy_proc_tx);
791 792 793 794 795 796 797 798
	      return;
	    }
	  }
#ifdef PHY_ABSTRACTION
	  else {
	    ulsch_encoding_emul(phy_vars_ue->prach_resources[eNB_id]->Msg3,phy_vars_ue,eNB_id,harq_pid,0);
	  }
#endif
799 800
	  stop_meas(&phy_vars_ue->ulsch_encoding_stats);	      

801 802 803

#ifdef OPENAIR2
	  // signal MAC that Msg3 was sent
Raymond Knopp's avatar
 
Raymond Knopp committed
804 805 806
	  mac_xface->Msg3_transmitted(Mod_id,
				      CC_id,
				      frame_tx,
807 808 809 810 811 812 813
				      eNB_id);
#endif
	}      
	else {
	  input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8;
	 
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
814
	  //  LOG_D(PHY,"[UE  %d] ULSCH : Searching for MAC SDUs\n",Mod_id);
815
	  if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) { 
816 817
	    //if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
	    access_mode=SCHEDULED_ACCESS;
Raymond Knopp's avatar
 
Raymond Knopp committed
818 819 820 821
	    mac_xface->ue_get_sdu(Mod_id,
				  CC_id,
				  frame_tx,
				  subframe_tx,
822 823 824 825 826 827 828 829 830 831
				  eNB_id,
				  ulsch_input_buffer,
				  input_buffer_length,
				  &access_mode);
	    
	    //}
	    /*
	    else {
	      // Get calibration information from TDD procedures
	      LOG_D(PHY,"[UE %d] Frame %d, subframe %d : ULSCH: Getting TDD Auto-Calibration information\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
832
		    Mod_id,phy_vars_ue->frame,subframe_tx);
833 834 835 836 837 838
	      for (i=0;i<input_buffer_length;i++)
		ulsch_input_buffer[i]= i;
	      
	    }
	    */
	  }
839 840
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_ULSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
841
	  LOG_D(PHY,"[UE] Frame %d, subframe %d : ULSCH SDU (TX harq_pid %d)  (%d bytes) : \n",frame_tx,subframe_tx,harq_pid, phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3);
842 843 844
	  for (i=0;i<phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3;i++) 
	    LOG_T(PHY,"%x.",ulsch_input_buffer[i]);
	  LOG_T(PHY,"\n");
845 846
#endif
#endif
847 848 849 850 851
#else //OPENAIR2
      // the following lines were necessary for the calibration in CROWN
      /*
      if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
          for (i=0;i<input_buffer_length;i++) 
852
              ulsch_input_buffer[i]= (uint8_t)(taus()&0xff);
853 854 855 856 857 858 859
	  }
	  else {
          // Get calibration information from TDD procedures
      }
      */

	  for (i=0;i<input_buffer_length;i++) 
860
	    ulsch_input_buffer[i]= (uint8_t)(taus()&0xff);
861 862 863
	  
      // the following lines were necessary for the collaborative UL in PUCCO
	  /*
864 865 866
	  memset(phy_vars_ue->ulsch_ue[eNB_id]->o    ,0,MAX_CQI_BYTES*sizeof(uint8_t));
	  memset(phy_vars_ue->ulsch_ue[eNB_id]->o_RI ,0,2*sizeof(uint8_t));
	  memset(phy_vars_ue->ulsch_ue[eNB_id]->o_ACK,0,4*sizeof(uint8_t));
867 868 869 870 871
	  for (i=0;i<input_buffer_length;i++)
	    ulsch_input_buffer[i]= i;
	  */

#endif //OPENAIR2
872
	  start_meas(&phy_vars_ue->ulsch_encoding_stats);	      
873 874 875 876 877 878 879 880 881 882 883 884 885 886
	  if (abstraction_flag==0) {
	    /*
	    if (phy_vars_ue->frame%100==0) {
	      LOG_I(PHY,"Encoding ulsch\n");
	    }
	    */
	    if (ulsch_encoding(ulsch_input_buffer,
			       phy_vars_ue,
			       harq_pid,
			       eNB_id,
			       phy_vars_ue->transmission_mode[eNB_id],0,
			       0)!=0) {  //  Nbundled, to be updated!!!!
	      LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
              vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
887
	      stop_meas(&phy_vars_ue->phy_proc_tx);
888 889 890 891 892 893 894 895
	      return;
	    }
	  }
#ifdef PHY_ABSTRACTION
	  else {
	    ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0);
	  }
#endif
896
	  stop_meas(&phy_vars_ue->ulsch_encoding_stats);	      
897 898 899
	}
	if (abstraction_flag == 0) {
#ifdef OPENAIR2
900
	  pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag);
901 902 903 904
	  phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH;
#else
	  phy_vars_ue->tx_power_dBm = UE_TX_POWER;
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
905 906
	  phy_vars_ue->tx_total_RE = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb*12;

Raymond Knopp's avatar
 
Raymond Knopp committed
907
	  LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm, amp %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
908
		Mod_id,harq_pid,frame_tx,subframe_tx,phy_vars_ue->tx_power_dBm,
909
#if defined(EXMIMO) || defined(USRP)
910 911 912 913
		get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm)
#else
		AMP
#endif
914
		);    
915
	  start_meas(&phy_vars_ue->ulsch_modulation_stats);	      	      	  
916
	  ulsch_modulation(phy_vars_ue->lte_ue_common_vars.txdataF,
917
#if defined(EXMIMO) || defined(USRP)                       
918 919 920 921
                       get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm),
#else
                       AMP,
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
922 923
                       frame_tx,
                       subframe_tx,
924 925 926
                       &phy_vars_ue->lte_frame_parms,
                       phy_vars_ue->ulsch_ue[eNB_id]);

927
#if defined(EXMIMO) || defined(USRP)
928 929
	  for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++)
	    generate_drs_pusch(phy_vars_ue,eNB_id,get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm),subframe_tx,first_rb,nb_rb,aa);
930
#else
931 932
	  for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++)
	    generate_drs_pusch(phy_vars_ue,eNB_id,AMP,subframe_tx,first_rb,nb_rb,aa);
933
#endif
934 935

	  stop_meas(&phy_vars_ue->ulsch_modulation_stats);	      	      	  
936
	}
937

938 939
	if (abstraction_flag==1) {
	  // clear SR
Raymond Knopp's avatar
 
Raymond Knopp committed
940
	  phy_vars_ue->sr[subframe_tx]=0;
941 942
	}
      } // ULSCH is active
943
      
944 945
#ifdef PUCCH
      else if (phy_vars_ue->UE_mode[eNB_id] == PUSCH){  // check if we need to use PUCCH 1a/1b
Raymond Knopp's avatar
 
Raymond Knopp committed
946
	//      debug_LOG_D(PHY,"[UE%d] Frame %d, subframe %d: Checking for PUCCH 1a/1b\n",Mod_id,frame_tx,subframe_tx);
947 948 949 950
	bundling_flag = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
	
	if ((frame_parms->frame_type==FDD) || 
	    (bundling_flag==bundling)    || 
Raymond Knopp's avatar
 
Raymond Knopp committed
951
	    ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((slot_tx!=4)||(slot_tx!=14)))) {
952
	  format = pucch_format1a;
953
	  LOG_D(PHY,"[UE] PUCCH 1a\n");
954 955 956
	}
	else {
	  format = pucch_format1b;
957
	  LOG_D(PHY,"[UE] PUCCH 1b\n");
958 959 960
	}
	
	// Check for SR and do ACK/NACK accordingly
Raymond Knopp's avatar
 
Raymond Knopp committed
961
	if (is_SR_TXOp(phy_vars_ue,eNB_id,subframe_tx)==1) {
962
	  LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
963
	 	Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx);
964
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
965 966 967
	  SR_payload = mac_xface->ue_get_SR(Mod_id,
					    CC_id,
					    frame_tx,
968 969
					    eNB_id,
					    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
970
					    subframe_tx); // subframe used for meas gap
971 972 973 974 975 976
#else
	  SR_payload = 1;
#endif
	 
	  if (SR_payload>0) {
	    generate_ul_signal = 1;
977
	    LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
978
		  Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload);
979 980
	  }
	  else {
Raymond Knopp's avatar
 
Raymond Knopp committed
981
	    phy_vars_ue->sr[subframe_tx]=0;
982 983 984 985 986 987 988
	  }
	}
	else
	  SR_payload=0;
	
	if (get_ack(&phy_vars_ue->lte_frame_parms,
		    phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack,
Raymond Knopp's avatar
 
Raymond Knopp committed
989
		    subframe_tx,pucch_ack_payload) > 0) {
990 991 992 993 994 995
	  // we need to transmit ACK/NAK in this subframe
	  
	  generate_ul_signal = 1;
	  
	  n1_pucch = get_n1_pucch(phy_vars_ue,
				  eNB_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
996
				  subframe_tx,
997 998 999 1000
				  pucch_ack_payload,
				  SR_payload); 

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1001
	    Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format);
1002 1003 1004 1005
	    phy_vars_ue->tx_power_dBm = Po_PUCCH;
#else
	    phy_vars_ue->tx_power_dBm = UE_TX_POWER;
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1006
	    phy_vars_ue->tx_total_RE = 12;
1007 1008

	    if (SR_payload>0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1009
	      LOG_D(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1010
		    Mod_id, 
1011
		    phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
1012
		    frame_tx, subframe_tx,
1013 1014
		    phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
		    Po_PUCCH,
1015
#if defined(EXMIMO) || defined(USRP)
1016 1017 1018 1019 1020 1021 1022
		    get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm)
#else
			AMP
#endif
);
	    }
	    else {
Raymond Knopp's avatar
 
Raymond Knopp committed
1023
	      LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1024
		    Mod_id, 
1025
		    phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
1026
		    frame_tx, subframe_tx,
1027 1028
		    n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload,
		    Po_PUCCH,
1029
#if defined(EXMIMO) || defined(USRP)
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047
		    get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm)
#else
			AMP
#endif
			);
	    }

	  if (abstraction_flag == 0) {

	    generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF,
			   &phy_vars_ue->lte_frame_parms,
			   phy_vars_ue->ncs_cell,
			   format,
			   &phy_vars_ue->pucch_config_dedicated[eNB_id],
			   n1_pucch,
			   0,  // n2_pucch
			   1,  // shortened format
			   pucch_ack_payload,
1048
#if defined(EXMIMO) || defined(USRP)
1049 1050 1051 1052
			   get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm),
#else
			   AMP,
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1053
			   subframe_tx);
1054 1055 1056 1057 1058 1059 1060 1061 1062 1063

	  }
	  else {
#ifdef PHY_ABSTRACTION
	    LOG_D(PHY,"Calling generate_pucch_emul ... (ACK %d %d, SR %d)\n",pucch_ack_payload[0],pucch_ack_payload[1],SR_payload);
	    generate_pucch_emul(phy_vars_ue,
				format,
				phy_vars_ue->lte_frame_parms.pucch_config_common.nCS_AN,
				pucch_ack_payload,
				SR_payload,
Raymond Knopp's avatar
 
Raymond Knopp committed
1064
				subframe_tx);
1065 1066 1067 1068 1069 1070
#endif
	  }
	}
	else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1071
	  Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1);
1072 1073 1074 1075
	  phy_vars_ue->tx_power_dBm = Po_PUCCH;
#else
	  phy_vars_ue->tx_power_dBm = UE_TX_POWER;
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1076
	  phy_vars_ue->tx_total_RE = 12;
1077

Raymond Knopp's avatar
 
Raymond Knopp committed
1078
	  LOG_D(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1079
		Mod_id, 
1080
		phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
1081
		frame_tx, subframe_tx,
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
		phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
		Po_PUCCH);
	  
	  if (abstraction_flag == 0) {

	    generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF,
			   &phy_vars_ue->lte_frame_parms,
			   phy_vars_ue->ncs_cell,
			   pucch_format1,
			   &phy_vars_ue->pucch_config_dedicated[eNB_id],
			   phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
			   0,  // n2_pucch
			   1,  // shortened format
			   pucch_ack_payload,  // this is ignored anyway, we just need a pointer
1096
#if defined(EXMIMO) || defined(USRP)
1097 1098 1099 1100
			   get_tx_amp(Po_PUCCH,phy_vars_ue->tx_power_max_dBm),
#else
			   AMP,
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1101
			   subframe_tx);	 
1102 1103 1104 1105 1106 1107 1108 1109
	  }
	  else {
	    LOG_D(PHY,"Calling generate_pucch_emul ...\n");
	    generate_pucch_emul(phy_vars_ue,
				pucch_format1,
				phy_vars_ue->lte_frame_parms.pucch_config_common.nCS_AN,
				pucch_ack_payload,
				SR_payload,
Raymond Knopp's avatar
 
Raymond Knopp committed
1110
				subframe_tx);
1111 1112 1113 1114 1115
	  }
	}
      }
#endif  // PUCCH

1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
#ifdef CBA
      if ((phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) && 
	  (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) {
	phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1
	//	phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status= IDLE; 
	first_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb;
	nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb;
	//cba_mcs=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->mcs;
	input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8;
	access_mode=CBA_ACCESS;
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1127
	LOG_D(PHY,"[UE %d] Frame %d, subframe %d: CBA num dci %d\n", 
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167
	      Mod_id,frame_tx,subframe_tx,
	      phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[subframe_tx]);
	
	mac_xface->ue_get_sdu(Mod_id,
			      CC_id,
			      frame_tx,
			      subframe_tx,
			      eNB_id,
			      ulsch_input_buffer,
			      input_buffer_length,
			      &access_mode);
	
	phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[subframe_tx]=0;
	
	if (access_mode > UNKNOWN_ACCESS){

	  if (abstraction_flag==0) {
	    if (ulsch_encoding(ulsch_input_buffer,
			       phy_vars_ue,
			       harq_pid,
			       eNB_id,
			       phy_vars_ue->transmission_mode[eNB_id],0,
			       0)!=0) {  //  Nbundled, to be updated!!!!
	      LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
	      return;
	    }
	  }
#ifdef PHY_ABSTRACTION
	  else {
	    ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0);
	  }
#endif
	} else {
	  phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status= IDLE; 
	  //reset_cba_uci(phy_vars_ue->ulsch_ue[eNB_id]->o);
	  LOG_N(PHY,"[UE %d] Frame %d, subframe %d: CBA transmission cancelled or postponed\n",
		Mod_id, frame_tx,subframe_tx);
	}
      }
#endif // end CBA
1168 1169

      if (abstraction_flag == 0) {
1170 1171
	nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
	
1172
#if defined(EXMIMO) || defined(USRP) //this is the EXPRESS MIMO case
Raymond Knopp's avatar
 
Raymond Knopp committed
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
	ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
		       openair_daq_vars.timing_advance-
		       phy_vars_ue->timing_advance-
		       phy_vars_ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
	LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, TA %d, TA_offset %d\n",
	      phy_vars_ue->rx_offset,
	      openair_daq_vars.timing_advance,
	      phy_vars_ue->timing_advance,
	      phy_vars_ue->N_TA_offset);

1183
#else //this is the normal case
1184
	ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-phy_vars_ue->N_TA_offset;
1185
#endif //else EXMIMO
1186 1187
	if (generate_ul_signal == 1 ) {
	  
1188

1189 1190 1191
	  
	  start_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
1192
	    if (frame_parms->Ncp == 1) 
Raymond Knopp's avatar
 
Raymond Knopp committed
1193
	      PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
1194
#if defined(EXMIMO) || defined(USRP)
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205
			   dummy_tx_buffer, 
#else
			   &phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
#endif
			   frame_parms->log2_symbol_size,
			   nsymb,
			   frame_parms->nb_prefix_samples,
			   frame_parms->twiddle_ifft,
			   frame_parms->rev,
			   CYCLIC_PREFIX);
	    else
Raymond Knopp's avatar
 
Raymond Knopp committed
1206
	      normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
1207
#if defined(EXMIMO) || defined(USRP)
1208 1209 1210 1211 1212 1213
				dummy_tx_buffer, 
#else
				&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
#endif
				nsymb,
				&phy_vars_ue->lte_frame_parms);
1214
	    
1215
	    /*
1216
	      if (subframe_tx == 8) {
1217
	      printf("Symbol 0 %p (offset %d) base %p\n", 
1218 1219 1220
	      &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe],
	      nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe,
	      phy_vars_ue->lte_ue_common_vars.txdataF[0]);
1221
	      write_output("txsigF8.m","txsF8", &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe],
1222
	      phy_vars_ue->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);	      
1223
	      write_output("txsig8.m","txs8", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe],
1224 1225
	      phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);	      
	      }
1226 1227
	    */
#ifndef OFDMA_ULSCH
1228
#if defined(EXMIMO) || defined(USRP)
1229 1230 1231 1232 1233 1234 1235
	    apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0);
	    apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1);
#else
	    apply_7_5_kHz(phy_vars_ue,&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],0);
	    apply_7_5_kHz(phy_vars_ue,&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],1);
#endif
	    /*
1236
	      if (subframe_tx == 8) {
1237
	      write_output("txsig8_mod.m","txs8_mod", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe],
1238 1239
	      phy_vars_ue->lte_frame_parms.samples_per_tti,1,1);	      
	      }
1240 1241
	    */
#endif
1242
	    
1243
#if defined(EXMIMO) || defined(USRP)
1244
	    overflow = ulsch_start - 9*frame_parms->samples_per_tti;
Raymond Knopp's avatar
 
Raymond Knopp committed
1245
	    //if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow);
1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
	    for (k=ulsch_start,l=0; k<cmin(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++)
	      {
		((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
		((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
	      }
	    for (k=0;k<overflow;k++,l++)
	      {
		((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
		((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
	      }
#endif
1257
	    
1258
	  } //nb_antennas_tx
1259
	  stop_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
1260
	} // generate_ul_signal == 1
1261 1262 1263 1264 1265
	else {  // no uplink so clear signal buffer instead
	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
	    memset(&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2);
	  }
	}
1266 1267
      } 
    } // mode != PRACH
Raymond Knopp's avatar
 
Raymond Knopp committed
1268 1269
    //  }// slot_tx is even
    //  else {  // slot_tx is odd, do the PRACH here
1270 1271
 
#ifdef OPENAIR2 
1272

1273
    if ((phy_vars_ue->UE_mode[eNB_id] == PRACH) && (phy_vars_ue->lte_frame_parms.prach_config_common.prach_Config_enabled==1)) {
1274

1275 1276 1277 1278
#else
    if (1) {
#endif
      // check if we have PRACH opportunity
Raymond Knopp's avatar
 
Raymond Knopp committed
1279
      if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) {
1280 1281 1282 1283
	phy_vars_ue->generate_prach=0;
#ifdef OPENAIR2
	// ask L2 for RACH transport
	if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ){
Raymond Knopp's avatar
 
Raymond Knopp committed
1284 1285 1286
	  phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
									CC_id,
									frame_tx,
1287
									eNB_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1288
									subframe_tx);
1289
	  //	  LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon);
1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
	}
#endif
	if (phy_vars_ue->prach_resources[eNB_id]!=NULL) {
	  
	  phy_vars_ue->generate_prach=1;
	  phy_vars_ue->prach_cnt=0;
#ifdef SMBV
      phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;
#endif
#ifdef OAI_EMU
	  phy_vars_ue->prach_PreambleIndex=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; 
#endif
	  if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1303
	    LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1304 1305 1306
		  Mod_id,
		  frame_tx,
		  subframe_tx,
1307 1308 1309 1310 1311 1312
		  phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex,
		  phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER,
		  phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index,
		  phy_vars_ue->prach_resources[eNB_id]->ra_RNTI);

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1313
	    phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id);
1314 1315 1316 1317
#else
	    phy_vars_ue->tx_power_dBm = UE_TX_POWER;
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1318 1319
	    phy_vars_ue->tx_total_RE = 96;

1320
#if defined(EXMIMO) || defined(USRP)
1321 1322 1323 1324
	    phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm);
#else
	    phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP;
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1325
	    LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_tx>>1,phy_vars_ue->tx_power_dBm,phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp);
1326

1327 1328
	    //	    start_meas(&phy_vars_ue->tx_prach);
	    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
Raymond Knopp's avatar
 
Raymond Knopp committed
1329
	    prach_power = generate_prach(phy_vars_ue,eNB_id,subframe_tx,frame_tx);
1330 1331
	    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
	    //	    stop_meas(&phy_vars_ue->tx_prach);
1332
	    LOG_D(PHY,"[UE  %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1333 1334
		  Mod_id,
		  get_PL(Mod_id,CC_id,eNB_id),
1335 1336 1337 1338 1339
		  phy_vars_ue->tx_power_dBm,
		  dB_fixed(prach_power),
		  phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp);
	  }
	  else {
Raymond Knopp's avatar
 
Raymond Knopp committed
1340 1341
	    UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1;
	    UE_transport_info[Mod_id][CC_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex;
1342
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1343 1344 1345
	    mac_xface->Msg1_transmitted(Mod_id,
					CC_id,
					frame_tx,
Raymond Knopp's avatar
 
Raymond Knopp committed
1346
					eNB_id);
1347
#endif
1348 1349
	  }
	  LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1350
		Mod_id,frame_tx,subframe_tx,eNB_id,
1351
		phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex,
Raymond Knopp's avatar
 
Raymond Knopp committed
1352 1353
		phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id),
		get_PL(Mod_id,CC_id,eNB_id));
1354 1355 1356

	}
      }
1357
      LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1358
	    Mod_id,frame_tx,subframe_tx,phy_vars_ue->generate_prach,phy_vars_ue->prach_cnt);
1359 1360 1361 1362 1363 1364 1365 1366

      phy_vars_ue->prach_cnt++;
      if (phy_vars_ue->prach_cnt==3)
	phy_vars_ue->generate_prach=0;
    } // mode is PRACH
    else {
      phy_vars_ue->generate_prach=0; 
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1367
  } // slot_tx is even
1368
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
1369
  stop_meas(&phy_vars_ue->phy_proc_tx);
1370 1371
}

Raymond Knopp's avatar
 
Raymond Knopp committed
1372
void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type) {
1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384
  int aa;//i,aa;
  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;

  if (abstraction_flag==0) {
    /*
    if (phy_vars_ue->frame%100==1) {
      LOG_I(PHY,"frame %d, next_slot %d, setting switch to rx\n",phy_vars_ue->frame, next_slot);
    }
    */
    
    
    for (aa=0;aa<frame_parms->nb_antennas_tx;aa++){
1385
#if defined(EXMIMO) //this is the EXPRESS MIMO case
1386 1387 1388 1389 1390 1391
      int i;
      // set the whole tx buffer to RX
      for (i=0;i<LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti;i++)
	phy_vars_ue->lte_ue_common_vars.txdata[aa][i] = 0x00010001;
#else //this is the normal case
      memset(&phy_vars_ue->lte_ue_common_vars.txdata[aa][0],0,
1392
	     (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t));
1393 1394 1395 1396 1397 1398
#endif //else EXMIMO

    }
  }
}

Raymond Knopp's avatar
 
Raymond Knopp committed
1399
void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) {
1400 1401 1402 1403
  
  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms;
  //  int aa;
#if defined(EXMIMO) && defined(DRIVER2013)
1404 1405
  //  exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr;
  //  int aa;
1406
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1407 1408 1409
  int Mod_id=phy_vars_ue->Mod_id;
  int slot_rx = phy_vars_ue->slot_rx;
  int subframe_rx = slot_rx>>1;
1410 1411 1412 1413 1414

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN);

#ifdef EMOS
  /*
1415
  uint8_t aa;
1416 1417

  // first slot in frame is special
Raymond Knopp's avatar
 
Raymond Knopp committed
1418
  if (((slot_rx==0) || (slot_rx==1) || (slot_rx==12) || (slot_rx==13)) && 
1419 1420 1421 1422 1423 1424
      ((l==0) || (l==4-frame_parms->Ncp))) {
    for (eNB_id=0; eNB_id<3; eNB_id++) 
      for (aa=0;aa<frame_parms->nb_antennas_tx_eNB;aa++)
	lte_dl_channel_estimation_emos(emos_dump_UE.channel[eNB_id],
				       phy_vars_ue->lte_ue_common_vars->rxdataF,
				       &phy_vars_ue->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
1425
				       slot_rx,
1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
				       aa,
				       l,
				       eNB_id);
  }
  */
#endif

  if (l==0) {
    // UE measurements 
    if (abstraction_flag==0) {
1436
      LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,phy_vars_ue->lte_ue_common_vars.rxdata);
1437 1438

      lte_ue_measurements(phy_vars_ue,
Raymond Knopp's avatar
 
Raymond Knopp committed
1439 1440
			  (subframe_rx*frame_parms->samples_per_tti+phy_vars_ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME),
			  (slot_rx == 2) ? 1 : 0,
1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
			  0);
    }
    else {
      lte_ue_measurements(phy_vars_ue,
			  0,
			  0,
			  1);
    }

#ifdef DEBUG_PHY_PROC    
1451
    if (slot_rx == 2) { // && (phy_vars_ue->frame%100==0)) {
1452
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1453
      LOG_D(PHY,"[UE  %d] frame %d, slot %d, freq_offset_filt = %d \n",Mod_id,phy_vars_ue->frame_tx, slot_rx, phy_vars_ue->lte_ue_common_vars.freq_offset);
1454 1455
      /*	
      LOG_I(PHY,"[UE  %d] frame %d, slot %d, RX RSSI (%d,%d,%d) dBm, digital (%d,%d)(%d,%d)(%d,%d) dB, linear (%d,%d), avg rx power %d dB (%d lin), N0 %d dB (%d lin), RX gain %d dB\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1456
	    Mod_id,phy_vars_ue->frame, slot_rx,
1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474
	    phy_vars_ue->PHY_measurements.rx_rssi_dBm[0],
	    phy_vars_ue->PHY_measurements.rx_rssi_dBm[1],
	    phy_vars_ue->PHY_measurements.rx_rssi_dBm[2],
	    phy_vars_ue->PHY_measurements.rx_power_dB[0][0],
	    phy_vars_ue->PHY_measurements.rx_power_dB[0][1],
	    phy_vars_ue->PHY_measurements.rx_power_dB[1][0],
	    phy_vars_ue->PHY_measurements.rx_power_dB[1][1],
	    phy_vars_ue->PHY_measurements.rx_power_dB[2][0],
	    phy_vars_ue->PHY_measurements.rx_power_dB[2][1],
	    phy_vars_ue->PHY_measurements.rx_power[0][0],
	    phy_vars_ue->PHY_measurements.rx_power[0][1],		  
	    phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],
	    phy_vars_ue->PHY_measurements.rx_power_avg[0],
	    phy_vars_ue->PHY_measurements.n0_power_avg_dB,
	    phy_vars_ue->PHY_measurements.n0_power_avg,
	    phy_vars_ue->rx_total_gain_dB);
      
      LOG_I(PHY,"[UE  %d] frame %d, slot %d, N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1475
		Mod_id,phy_vars_ue->frame, slot_rx,
1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488
		phy_vars_ue->PHY_measurements.n0_power_tot_dBm,
		phy_vars_ue->PHY_measurements.n0_power_dB[0],
		phy_vars_ue->PHY_measurements.n0_power_dB[1],
		phy_vars_ue->PHY_measurements.n0_power[0],
		phy_vars_ue->PHY_measurements.n0_power[1],
		phy_vars_ue->PHY_measurements.n0_power_avg_dB,
		phy_vars_ue->PHY_measurements.n0_power_avg); */
    }
#endif
  }

  if (l==(4-frame_parms->Ncp)) {

Raymond Knopp's avatar
 
Raymond Knopp committed
1489
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_IN);
1490
    ue_rrc_measurements(phy_vars_ue,
Raymond Knopp's avatar
 
Raymond Knopp committed
1491
			slot_rx,
1492
			abstraction_flag);
Raymond Knopp's avatar
 
Raymond Knopp committed
1493
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_OUT);
1494

Raymond Knopp's avatar
 
Raymond Knopp committed
1495 1496
    if (abstraction_flag==1)
      phy_vars_ue->sinr_eff =  sinr_eff_cqi_calc(phy_vars_ue, 0);
1497

1498 1499
  }  

Raymond Knopp's avatar
 
Raymond Knopp committed
1500
  if ((slot_rx==1) && (l==(4-frame_parms->Ncp))) {
1501 1502
    
    // AGC
Raymond Knopp's avatar
 
Raymond Knopp committed
1503 1504 1505

    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_IN);
#if defined EXMIMO  
Raymond Knopp's avatar
 
Raymond Knopp committed
1506

1507 1508
    if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
	(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
jiangx's avatar
jiangx committed
1509
      if  (phy_vars_ue->frame_rx%100==0)
1510
      gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id],0);
Raymond Knopp's avatar
 
Raymond Knopp committed
1511 1512

#else
1513
#ifndef USRP
Raymond Knopp's avatar
 
Raymond Knopp committed
1514
    phy_adjust_gain (phy_vars_ue,0);
Raymond Knopp's avatar
 
Raymond Knopp committed
1515
#endif
1516
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1517 1518
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
1519 1520 1521 1522 1523 1524 1525 1526
    eNB_id = 0;
    
    if (abstraction_flag == 0) 
        lte_adjust_synch(&phy_vars_ue->lte_frame_parms,
                         phy_vars_ue,
                         eNB_id,
                         0,
                         16384);
Raymond Knopp's avatar
 
Raymond Knopp committed
1527
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
1528
    
1529
    /* if (openair_daq_vars.auto_freq_correction == 1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1530
      if (frame_rx % 100 == 0) {
1531 1532 1533 1534
	if ((phy_vars_ue->lte_ue_common_vars.freq_offset>100) && (openair_daq_vars.freq_offset < 1000)) {
	  openair_daq_vars.freq_offset+=100;
#if defined(EXMIMO) && defined(DRIVER2013)
	  for (aa = 0; aa<4; aa++) { 
1535 1536
	    p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
	    p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
1537 1538 1539 1540 1541 1542 1543
	  }
#endif
 	}
	else if ((phy_vars_ue->lte_ue_common_vars.freq_offset<-100) && (openair_daq_vars.freq_offset > -1000)) {
	  openair_daq_vars.freq_offset-=100;
#if defined(EXMIMO) && defined(DRIVER2013)
	  for (aa = 0; aa<4; aa++) { 
1544 1545
	    p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
	    p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
1546 1547 1548 1549
	  }
#endif
	}
      }
1550
  }*/
1551 1552 1553 1554 1555 1556

  }
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT);
}

#ifdef EMOS
1557
void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t eNB_id) {
1558

1559 1560 1561
  uint8_t i,j;
  //uint16_t last_slot_emos;
  uint32_t bytes;
Raymond Knopp's avatar
 
Raymond Knopp committed
1562
  int Mod_id = phy_vars_ue->Mod_id;
1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592

  /*
  if (last_slot<2)
    last_slot_emos = last_slot;
  else if (last_slot>9)
    last_slot_emos = last_slot - 8;
  else {
    LOG_E(PHY,"emos rx last_slot_emos %d, last_slot %d\n", last_slot_emos,last_slot);
    mac_xface->macphy_exit("should never happen");
  }
  */

#ifdef EMOS_CHANNEL
  if ((last_slot==10) || (last_slot==11)) {
    for (i=0; i<phy_vars_ue->lte_frame_parms.nb_antennas_rx; i++)
      for (j=0; j<phy_vars_ue->lte_frame_parms.nb_antennas_tx; j++) { 
	// first OFDM symbol with pilots
	memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*phy_vars_ue->lte_frame_parms.ofdm_symbol_size],
	       &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0],
	       phy_vars_ue->lte_frame_parms.ofdm_symbol_size*sizeof(int));
	// second OFDM symbol with pilots
	memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*phy_vars_ue->lte_frame_parms.ofdm_symbol_size],
	       &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(phy_vars_ue->lte_frame_parms.Ncp == 0 ? 4 : 3)*phy_vars_ue->lte_frame_parms.ofdm_symbol_size],
	       phy_vars_ue->lte_frame_parms.ofdm_symbol_size*sizeof(int));
      }
  }
#endif
  
  if (last_slot==0) {
    emos_dump_UE.timestamp = rt_get_time_ns();
jiangx's avatar
jiangx committed
1593
    emos_dump_UE.frame_rx = phy_vars_ue->frame_rx;
1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620
    emos_dump_UE.UE_mode = phy_vars_ue->UE_mode[eNB_id];
    emos_dump_UE.mimo_mode = phy_vars_ue->transmission_mode[eNB_id];
    emos_dump_UE.freq_offset = phy_vars_ue->lte_ue_common_vars.freq_offset;
    emos_dump_UE.timing_advance = phy_vars_ue->timing_advance;
    emos_dump_UE.timing_offset  = phy_vars_ue->rx_offset;
    emos_dump_UE.rx_total_gain_dB = phy_vars_ue->rx_total_gain_dB;
    emos_dump_UE.eNb_id = eNB_id;
    memcpy(&emos_dump_UE.PHY_measurements,&phy_vars_ue->PHY_measurements,sizeof(PHY_MEASUREMENTS));
  }
  if (last_slot==1) {
    emos_dump_UE.pbch_errors = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors;
    emos_dump_UE.pbch_errors_last = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last;
    emos_dump_UE.pbch_errors_conseq = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq;
    emos_dump_UE.pbch_fer = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_fer;
  }
  if (last_slot==19) {
    emos_dump_UE.dlsch_errors = phy_vars_ue->dlsch_errors[eNB_id];
    emos_dump_UE.dlsch_errors_last = phy_vars_ue->dlsch_errors_last[eNB_id];
    emos_dump_UE.dlsch_received = phy_vars_ue->dlsch_received[eNB_id];
    emos_dump_UE.dlsch_received_last = phy_vars_ue->dlsch_received_last[eNB_id];
    emos_dump_UE.dlsch_fer = phy_vars_ue->dlsch_fer[eNB_id];
    emos_dump_UE.dlsch_cntl_errors = phy_vars_ue->dlsch_SI_errors[eNB_id];
    emos_dump_UE.dlsch_ra_errors = phy_vars_ue->dlsch_ra_errors[eNB_id];
    emos_dump_UE.total_TBS = phy_vars_ue->total_TBS[eNB_id];
    emos_dump_UE.total_TBS_last = phy_vars_ue->total_TBS_last[eNB_id];
    emos_dump_UE.bitrate = phy_vars_ue->bitrate[eNB_id];
    emos_dump_UE.total_received_bits = phy_vars_ue->total_received_bits[eNB_id];
1621 1622
    emos_dump_UE.pmi_saved = phy_vars_ue->dlsch_ue[eNB_id][0]->pmi_alloc;
    emos_dump_UE.mcs = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs;
1623 1624 1625 1626
    emos_dump_UE.use_ia_receiver = openair_daq_vars.use_ia_receiver;

    bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE));
    if (bytes!=sizeof(fifo_dump_emos_UE)) {
jiangx's avatar
jiangx committed
1627
      LOG_W(PHY,"[UE  %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot);
1628 1629
    }
    else {
jiangx's avatar
jiangx committed
1630 1631
      if (phy_vars_ue->frame_rx%100==0) {
	LOG_I(PHY,"[UE  %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot, bytes);
1632 1633 1634 1635 1636 1637 1638 1639
      }
    }
  }
  
}
#endif


1640
void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag) {
1641

1642 1643
  //  uint8_t last_slot;
  uint8_t i;
1644 1645
  LOG_I(PHY,"[UE  %d] frame %d, slot %d, restarting PHY!\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_rx);
  mac_xface->macphy_exit("restart_phy called");
1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656
  //   first_run = 1;
  
  if (abstraction_flag ==0 ) {
    openair_daq_vars.mode = openair_NOT_SYNCHED;
    phy_vars_ue->UE_mode[eNB_id] = NOT_SYNCHED;
    openair_daq_vars.sync_state=0;
  }
  else {
    phy_vars_ue->UE_mode[eNB_id] = PRACH;
    phy_vars_ue->prach_resources[eNB_id]=NULL;
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1657 1658
  phy_vars_ue->frame_rx = -1;
  phy_vars_ue->frame_tx = -1;
1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678
  openair_daq_vars.synch_wait_cnt=0;
  openair_daq_vars.sched_cnt=-1;
  
  phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq=0;
  phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors=0;
  
  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors = 0;
  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed = 0;
  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false  = 0;    
  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received = 0;    
  
  phy_vars_ue->dlsch_errors[eNB_id] = 0;
  phy_vars_ue->dlsch_errors_last[eNB_id] = 0;
  phy_vars_ue->dlsch_received[eNB_id] = 0;
  phy_vars_ue->dlsch_received_last[eNB_id] = 0;
  phy_vars_ue->dlsch_fer[eNB_id] = 0;
  phy_vars_ue->dlsch_SI_received[eNB_id] = 0;
  phy_vars_ue->dlsch_ra_received[eNB_id] = 0;
  phy_vars_ue->dlsch_SI_errors[eNB_id] = 0;
  phy_vars_ue->dlsch_ra_errors[eNB_id] = 0;
1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689

  phy_vars_ue->dlsch_mch_received[eNB_id] = 0;  
  for (i=0; i < MAX_MBSFN_AREA ; i ++){
    phy_vars_ue->dlsch_mch_received_sf[i][eNB_id] = 0;
    phy_vars_ue->dlsch_mcch_received[i][eNB_id] = 0;
    phy_vars_ue->dlsch_mtch_received[i][eNB_id] = 0;
    phy_vars_ue->dlsch_mcch_errors[i][eNB_id] = 0;
    phy_vars_ue->dlsch_mtch_errors[i][eNB_id] = 0;
    phy_vars_ue->dlsch_mcch_trials[i][eNB_id] = 0;
    phy_vars_ue->dlsch_mtch_trials[i][eNB_id] = 0;
}  
1690 1691 1692 1693 1694 1695 1696
  //phy_vars_ue->total_TBS[eNB_id] = 0;
  //phy_vars_ue->total_TBS_last[eNB_id] = 0;
  //phy_vars_ue->bitrate[eNB_id] = 0;
  //phy_vars_ue->total_received_bits[eNB_id] = 0;
}


Raymond Knopp's avatar
 
Raymond Knopp committed
1697
void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abstraction_flag) {
1698 1699 1700

  //  int i;
  int pbch_tx_ant=0;
1701 1702 1703 1704
  uint8_t pbch_phase;
  uint16_t frame_tx;
  static uint8_t first_run = 1;
  uint8_t pbch_trials = 0;
1705 1706

  DevAssert(phy_vars_ue);
Raymond Knopp's avatar
 
Raymond Knopp committed
1707 1708
  int slot_rx = phy_vars_ue->slot_rx;
  int frame_rx = phy_vars_ue->frame_rx;
1709 1710 1711

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN);

Raymond Knopp's avatar
 
Raymond Knopp committed
1712
  pbch_phase=(frame_rx%4);
1713 1714 1715 1716
  if (pbch_phase>=4)
    pbch_phase=0;
  for (pbch_trials=0;pbch_trials<4;pbch_trials++) {
  //for (pbch_phase=0;pbch_phase<4;pbch_phase++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1717
    //LOG_I(PHY,"[UE  %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",phy_vars_ue->Mod_id,frame_rx,pbch_phase,phy_vars_ue->lte_frame_parms.Nid_cell,eNB_id);
1718 1719 1720 1721 1722 1723
    if (abstraction_flag == 0) {
      pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars,
			    phy_vars_ue->lte_ue_pbch_vars[eNB_id],
			    &phy_vars_ue->lte_frame_parms,
			    eNB_id,
			    phy_vars_ue->lte_frame_parms.mode1_flag==1?SISO:ALAMOUTI,
1724
			    phy_vars_ue->high_speed_flag,
1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762
			    pbch_phase);



    }
#ifdef PHY_ABSTRACTION
    else {
      pbch_tx_ant = rx_pbch_emul(phy_vars_ue,
				 eNB_id,
				 pbch_phase);
    }
#endif

    if ((pbch_tx_ant>0) && (pbch_tx_ant<=4)) {
      break;
    }
    pbch_phase++;
    if (pbch_phase>=4)
      pbch_phase=0;
  }



  if ((pbch_tx_ant>0) && (pbch_tx_ant<=4)) {

    if (pbch_tx_ant>2){
      LOG_W(PHY,"[openair][SCHED][SYNCH] PBCH decoding: pbch_tx_ant>2 not supported\n");
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT);
      return;
    }


    phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq = 0;
    frame_tx = (((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); 
    frame_tx += ((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]&0xfc));
    frame_tx += pbch_phase;

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1763
    mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id,
1764 1765 1766 1767 1768 1769 1770 1771 1772 1773
				   phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0);
#endif

#ifdef EMOS
    //emos_dump_UE.frame_tx = frame_tx;
    //emos_dump_UE.mimo_mode = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1];
#endif

    if (first_run) {
      first_run = 0;
1774
      LOG_I(PHY,"[UE %d] frame %d, slot %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d).\n",
1775
	    phy_vars_ue->Mod_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
1776 1777
	    frame_rx,
	    slot_rx,
1778 1779 1780
	    pbch_tx_ant,
	    frame_tx,
	    pbch_phase);
Raymond Knopp's avatar
 
Raymond Knopp committed
1781 1782 1783
      phy_vars_ue->frame_rx = (phy_vars_ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF);
      phy_vars_ue->frame_tx = phy_vars_ue->frame_rx;
      frame_rx = phy_vars_ue->frame_rx;
1784 1785
    }
    else 
Raymond Knopp's avatar
 
Raymond Knopp committed
1786
      if (((frame_tx & 0x03FF) != (phy_vars_ue->frame_rx & 0x03FF))) { 
1787
	  //(pbch_tx_ant != phy_vars_ue->lte_frame_parms.nb_antennas_tx)) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1788
	LOG_D(PHY,"[UE %d] frame %d, slot %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n",
1789
	      phy_vars_ue->Mod_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
1790 1791
	      phy_vars_ue->frame_rx,
	      slot_rx,
1792 1793
	      pbch_tx_ant,
	      frame_tx,
Raymond Knopp's avatar
 
Raymond Knopp committed
1794
	      frame_rx & 0x03FF,
1795
	      pbch_phase);
1796

Raymond Knopp's avatar
 
Raymond Knopp committed
1797 1798 1799
	phy_vars_ue->frame_rx = (phy_vars_ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF);
	phy_vars_ue->frame_tx = phy_vars_ue->frame_rx;
	frame_rx = phy_vars_ue->frame_rx;
1800 1801 1802 1803
	/*
	LOG_D(PHY,"[UE  %d] frame %d, slot %d: PBCH PDU does not match, ignoring it (PBCH ant_tx=%d, frame_tx=%d).\n",
	    phy_vars_ue->Mod_id, 
	    phy_vars_ue->frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
1804
	    slot_rx,
1805 1806 1807 1808 1809 1810 1811 1812
	    pbch_tx_ant,
	    frame_tx);
	*/
	//phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq = 21; // this will make it go out of sync
	//phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq += 1; // this will make it go out of sync
      }
        
#ifdef DEBUG_PHY_PROC
1813
    LOG_D(PHY,"[UE %d] frame %d, slot %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n",
1814
	      phy_vars_ue->Mod_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
1815 1816
	      frame_rx,
	      slot_rx,
1817 1818 1819 1820 1821 1822
	      phy_vars_ue->lte_frame_parms.mode1_flag,
	      pbch_tx_ant,
	      frame_tx,
	      phy_vars_ue->lte_frame_parms.N_RB_DL,
	      phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration,
	      phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource);
1823
    if (frame_rx%100 == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1824
      LOG_I(PHY,"[UE %d] frame %d, slot %d, PBCH: mode1_flag %d, tx_ant %d, frame_tx %d, phase %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6,Frequency offset %d Hz (%d)\n",
1825
	      phy_vars_ue->Mod_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
1826 1827
	      frame_rx,
	      slot_rx,
1828 1829 1830 1831 1832 1833
	      phy_vars_ue->lte_frame_parms.mode1_flag,
	      pbch_tx_ant,
	      frame_tx,
	      pbch_phase,
	      phy_vars_ue->lte_frame_parms.N_RB_DL,
	      phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration,
Raymond Knopp's avatar
 
Raymond Knopp committed
1834 1835
              phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource,
              phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset);
1836 1837 1838 1839 1840 1841
      //dump_frame_parms(&phy_vars_ue->lte_frame_parms);
      }
#endif
        
  }  
  else {
1842
    LOG_E(PHY,"[UE %d] frame %d, slot %d, Error decoding PBCH!\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1843
	phy_vars_ue->Mod_id,frame_rx, slot_rx);
1844 1845 1846
    phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++;
    phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++;
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1847
    mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id);
1848 1849 1850
#else
    if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) {
      LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n");
1851
      mac_xface->macphy_exit("More that 100 consecutive PBCH errors!");
1852
    }
1853 1854 1855
#endif
  }

Raymond Knopp's avatar
 
Raymond Knopp committed
1856
  if (frame_rx % 100 == 0) {
1857 1858 1859 1860 1861
    phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_fer = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last;
    phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors;
  }
  
#ifdef DEBUG_PHY_PROC  
1862
  LOG_D(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1863
	    phy_vars_ue->Mod_id,frame_rx, slot_rx, 
1864 1865 1866 1867 1868 1869
	    phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors, 
	    phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq);
#endif 
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT);
}

Raymond Knopp's avatar
 
Raymond Knopp committed
1870
int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abstraction_flag) {	
1871 1872 1873

  unsigned int dci_cnt=0, i;
  //DCI_PDU *DCI_pdu;
1874
  //uint16_t ra_RNTI;
1875 1876


Raymond Knopp's avatar
 
Raymond Knopp committed
1877 1878 1879 1880
  int frame_rx = phy_vars_ue->frame_rx;
  int slot_rx = phy_vars_ue->slot_rx;
  int subframe_rx = slot_rx>>1;

1881

1882 1883 1884 1885 1886 1887
#ifdef PHY_ABSTRACTION
  int CC_id;
  int UE_id;
  uint8_t harq_pid;
#endif

1888 1889 1890 1891
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_IN);

  /*
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1892
  debug_LOG_D(PHY,"[UE  %d] Frame %d, slot %d (%d): DCI decoding crnti %x (mi %d)\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,get_mi(&phy_vars_ue->lte_frame_parms,subframe_rx));
1893 1894 1895 1896 1897 1898 1899 1900
#endif
  */
  if (abstraction_flag == 0)  {

    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN);
    rx_pdcch(&phy_vars_ue->lte_ue_common_vars,
	     phy_vars_ue->lte_ue_pdcch_vars,
	     &phy_vars_ue->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
1901
	     subframe_rx,
1902 1903
	     eNB_id,
	     (phy_vars_ue->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
1904
	     phy_vars_ue->high_speed_flag,
1905 1906 1907 1908 1909 1910 1911
	     phy_vars_ue->is_secondary_ue);
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT);
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN);
    dci_cnt = dci_decoding_procedure(phy_vars_ue,
				     dci_alloc_rx,
				     (phy_vars_ue->UE_mode[eNB_id] < PUSCH)? 1 : 0,  // if we're in PUSCH don't listen to common search space, 
				                                                    // later when we need paging or RA during connection, update this ...
Raymond Knopp's avatar
 
Raymond Knopp committed
1912
				     eNB_id,subframe_rx);
1913
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT);
Raymond Knopp's avatar
 
Raymond Knopp committed
1914
    //LOG_D(PHY,"[UE  %d][PUSCH] Frame %d subframe %d PHICH RX\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx);
Raymond Knopp's avatar
 
Raymond Knopp committed
1915

Raymond Knopp's avatar
 
Raymond Knopp committed
1916
    if (is_phich_subframe(&phy_vars_ue->lte_frame_parms,subframe_rx)) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1917
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN);
1918
      rx_phich(phy_vars_ue,
Raymond Knopp's avatar
 
Raymond Knopp committed
1919
	       subframe_rx,eNB_id);
Raymond Knopp's avatar
 
Raymond Knopp committed
1920
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT);
1921 1922 1923 1924
    }
  }
#ifdef PHY_ABSTRACTION
  else {
1925 1926 1927 1928 1929
    for (i=0;i<NB_eNB_INST;i++) {
      for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
	if (PHY_vars_eNB_g[i][CC_id]->lte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell)
	  break;
      if (CC_id < MAX_NUM_CCs)
1930 1931 1932 1933
	break;
    }
    if (i==NB_eNB_INST) {
      LOG_E(PHY,"[UE  %d] phy_procedures_lte_ue.c: FATAL : Could not find attached eNB for DCI emulation (Nid_cell %d)!!!!\n",phy_vars_ue->Mod_id,phy_vars_ue->lte_frame_parms.Nid_cell);
1934
      mac_xface->macphy_exit("Could not find attached eNB for DCI emulation");
1935 1936 1937 1938 1939
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
      return(-1);
    }
    LOG_D(PHY,"Calling dci_decoding_proc_emul ...\n");
    dci_cnt = dci_decoding_procedure_emul(phy_vars_ue->lte_ue_pdcch_vars,
Raymond Knopp's avatar
 
Raymond Knopp committed
1940 1941 1942
					  PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[subframe_rx&1],
					  PHY_vars_eNB_g[i][CC_id]->num_common_dci[subframe_rx&1],
					  PHY_vars_eNB_g[i][CC_id]->dci_alloc[subframe_rx&1],
1943 1944 1945
					  dci_alloc_rx,
					  eNB_id);
    //    printf("DCI: dci_cnt %d\n",dci_cnt);
Raymond Knopp's avatar
 
Raymond Knopp committed
1946
    UE_id = (uint32_t)find_ue((int16_t)phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,PHY_vars_eNB_g[i][CC_id]);
1947 1948
    if (UE_id>=0) {
      //      msg("Checking PHICH for UE  %d (eNB %d)\n",UE_id,i);
Raymond Knopp's avatar
 
Raymond Knopp committed
1949 1950
      if (is_phich_subframe(&phy_vars_ue->lte_frame_parms,subframe_rx)) {
	harq_pid = phich_subframe_to_harq_pid(&phy_vars_ue->lte_frame_parms,frame_rx,subframe_rx);	
1951 1952 1953 1954 1955
	if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) {
	  // phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->phich_ACK=1;
	  phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0;
	  phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status = IDLE;
	  phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0;
1956
	  phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round = 0;
1957 1958
	  LOG_D(PHY,"Msg3 inactive\n");
	  /* Phich is not abstracted for the moment
Raymond Knopp's avatar
 
Raymond Knopp committed
1959
	  if (PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->phich_ACK==0) { // NAK
1960 1961 1962 1963
	    if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) {
#ifdef DEBUG_PHY_PROC
	      LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received NAK\n",
		  phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1964 1965
		  frame_rx,
		  subframe_rx);
1966 1967
#endif	  
	      get_Msg3_alloc_ret(&phy_vars_ue->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
1968 1969
				 subframe_rx,
				 frame_rx,
1970 1971 1972
    				 &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id],
				 &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]);
	    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1973 1974 1975
	    //	    PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
	    //	    PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0;
	    //	    PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++;	  
1976 1977 1978 1979 1980 1981
	  }
	  else {
#ifdef DEBUG_PHY_PROC
	    if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) 
	      LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received ACK\n",
		  phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1982 1983
		  frame_rx,
		  subframe_rx);
1984
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1985 1986
	    	    PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0;
	    	    PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status = IDLE;
1987 1988 1989 1990 1991 1992 1993 1994 1995 1996
	    // inform MAC?
	    phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0;	  
	  } //phich_ACK	*/
	} // harq_pid is ACTIVE
      } // This is a PHICH subframe
    } // UE_id exists
  }
#endif

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1997
  LOG_D(PHY,"[UE  %d] Frame %d, slot %d, Mode %s: DCI found %i\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,mode_string[phy_vars_ue->UE_mode[eNB_id]],dci_cnt);
1998 1999 2000 2001 2002
#endif

  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received += dci_cnt;
  /*
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2003
  if (slot_rx==18)
2004
    debug_LOG_D(PHY,"[UE  %d] Frame %d, slot %d: PDCCH: DCI errors %d, DCI received %d, DCI missed %d, DCI False Detection %d \n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2005
	      phy_vars_ue->Mod_id,frame_rx,slot_rx,
2006 2007 2008 2009 2010 2011 2012
	      phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors,
	      phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received,
	      phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed,
	      phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false);
#endif
  */  
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
2013
  //emos_dump_UE.dci_cnt[subframe_rx] = dci_cnt;
2014 2015 2016 2017 2018 2019
#endif

  /*
    #ifdef DIAG_PHY
    //if (phy_vars_ue->UE_mode[eNB_id] == PUSCH)
    if (dci_cnt > 1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2020
    LOG_D(PHY,"[UE  %d][DIAG] frame %d, subframe %d: received %d>1 DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_cnt);
2021 2022 2023
    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++;
    } 
    else if (dci_cnt==0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2024
    LOG_D(PHY,"[UE  %d][DIAG] frame %d, subframe %d: received %d DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_cnt);
2025 2026 2027 2028 2029 2030 2031 2032 2033 2034
    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed++;
    }
    #endif
  */

  // dci_cnt = 0;
  //  ra_RNTI = (phy_vars_ue->prach_resources[eNB_id]) ? phy_vars_ue->prach_resources[eNB_id]->ra_RNTI : 0;
  for (i=0;i<dci_cnt;i++){

#ifdef DEBUG_PHY_PROC    
Raymond Knopp's avatar
 
Raymond Knopp committed
2035 2036
    if (subframe_rx == 9) { //( frame_rx % 100 == 0)   {
      LOG_D(PHY,"frame %d, subframe %d, rnti %x: dci %d/%d\n",frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,i,dci_cnt);
2037 2038 2039 2040 2041 2042 2043 2044 2045
      //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
    }
#endif
    
    //if ((phy_vars_ue->UE_mode[eNB_id] != PRACH) && 
    //    (dci_alloc_rx[i].rnti != 0x1234) &&
    if((dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) &&
       (dci_alloc_rx[i].format != format0)) {
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2046
      LOG_D(PHY,"[UE  %d][DCI][PDSCH %x] frame %d, subframe %d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n",
2047
	    phy_vars_ue->Mod_id,dci_alloc_rx[i].rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
2048
	    frame_rx,subframe_rx,
2049 2050
	    dci_alloc_rx[i].format,
            phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
Raymond Knopp's avatar
 
Raymond Knopp committed
2051
            phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[subframe_rx],
2052 2053 2054
	    get_nCCE(3,&phy_vars_ue->lte_frame_parms,get_mi(&phy_vars_ue->lte_frame_parms,0)));

      /*
Raymond Knopp's avatar
 
Raymond Knopp committed
2055
      if (((frame_rx%100) == 0) || (frame_rx < 20))
2056 2057 2058 2059 2060
	dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
      */

#endif      
#ifdef DIAG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
2061 2062 2063
      if (!(((subframe_rx == 7) && (dci_alloc_rx[i].format == format1E_2A_M10PRB)) ||
	    ((subframe_rx == 7) && (dci_alloc_rx[i].format == format1)))) {
	LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format);
2064 2065 2066 2067 2068 2069
	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);
	return(-1);
      }
#endif
2070 2071
       
      //      dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
Raymond Knopp's avatar
 
Raymond Knopp committed
2072
      if (generate_ue_dlsch_params_from_dci(subframe_rx,
2073 2074 2075 2076 2077 2078 2079 2080 2081 2082
					    (void *)&dci_alloc_rx[i].dci_pdu,
					    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
					    dci_alloc_rx[i].format,
					    phy_vars_ue->dlsch_ue[eNB_id],
					    &phy_vars_ue->lte_frame_parms,
					    phy_vars_ue->pdsch_config_dedicated,
					    SI_RNTI,
					    0,
					    P_RNTI)==0) {

2083
#ifdef DIAG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
2084 2085
	if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs != (((frame_rx%1024)%28))){
	    LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: wrong mcs!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs);
2086 2087 2088 2089
	    dump_dci(&phy_vars_ue->lte_frame_parms,(void *)&dci_alloc_rx[i]);
	  }
#endif

2090 2091 2092 2093 2094

	phy_vars_ue->dlsch_received[eNB_id]++;
	
#ifdef DEBUG_PHY_PROC
	LOG_D(PHY,"[UE  %d] Generated UE DLSCH C_RNTI format %d\n",phy_vars_ue->Mod_id,dci_alloc_rx[i].format);
2095
	dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
Raymond Knopp's avatar
 
Raymond Knopp committed
2096
	LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->active); 
2097 2098 2099 2100 2101
#endif    
	
	// we received a CRNTI, so we're in PUSCH
	if (phy_vars_ue->UE_mode[eNB_id] != PUSCH) {
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2102
	  LOG_D(PHY,"[UE  %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti);
2103 2104 2105 2106 2107 2108 2109
#endif
	  //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
	  phy_vars_ue->UE_mode[eNB_id] = PUSCH;
	  //mac_xface->macphy_exit("Connected. Exiting\n");
	}
      }
      else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2110
	LOG_E(PHY,"[UE  %d] Frame %d, subframe %d: Problem in DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx);
2111 2112 2113 2114 2115 2116 2117 2118
	dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
      }
    }

    else if ((dci_alloc_rx[i].rnti == SI_RNTI) && 
	     (dci_alloc_rx[i].format == format1A)) {
      
#ifdef DEBUG_PHY_PROC
2119
      LOG_D(PHY,"[UE  %d] subframe %d: Found rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i);
2120
      /*
Raymond Knopp's avatar
 
Raymond Knopp committed
2121
      if (((frame_rx%100) == 0) || (frame_rx < 20))
2122 2123 2124 2125
	dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
      */
#endif      
#ifdef DIAG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
2126 2127
      if ((subframe_rx != 5)) {
	LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received SI_RNTI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx);
2128 2129 2130 2131 2132 2133 2134
	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);
	return(-1);
      }
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
2135
      if (generate_ue_dlsch_params_from_dci(subframe_rx,
2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157
					    (void *)&dci_alloc_rx[i].dci_pdu,
					    SI_RNTI,
					    format1A,
					    &phy_vars_ue->dlsch_ue_SI[eNB_id], 
					    &phy_vars_ue->lte_frame_parms,
					    phy_vars_ue->pdsch_config_dedicated,
					    SI_RNTI,
					    0,
					    P_RNTI)==0) {

	phy_vars_ue->dlsch_SI_received[eNB_id]++;

#ifdef DEBUG_PHY_PROC
	LOG_D(PHY,"[UE  %d] Generate UE DLSCH SI_RNTI format 1A\n",phy_vars_ue->Mod_id);
#endif
      }
    }
  
    else if ((phy_vars_ue->prach_resources[eNB_id]) && 
	     (dci_alloc_rx[i].rnti == phy_vars_ue->prach_resources[eNB_id]->ra_RNTI) && 
	     (dci_alloc_rx[i].format == format1A)) {
#ifdef DEBUG_PHY_PROC
2158
	LOG_D(PHY,"[UE  %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i);
2159
	
Raymond Knopp's avatar
 
Raymond Knopp committed
2160
	//if (((frame_rx%100) == 0) || (frame_rx < 20))
2161 2162 2163 2164
	//dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
	//mac_xface->macphy_exit("so far so good...\n");
#endif      
#ifdef DIAG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
2165 2166
	if (subframe_rx != 9) {
	  LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received RA_RNTI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx);
2167 2168 2169 2170 2171 2172 2173
	  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);
	  return(-1);
	}
#endif
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2174
	if (generate_ue_dlsch_params_from_dci(subframe_rx,
2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187
					      (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu,
					      phy_vars_ue->prach_resources[eNB_id]->ra_RNTI,
					      format1A,
					      &phy_vars_ue->dlsch_ue_ra[eNB_id], 
					      &phy_vars_ue->lte_frame_parms,
					      phy_vars_ue->pdsch_config_dedicated,
					      SI_RNTI,
					      phy_vars_ue->prach_resources[eNB_id]->ra_RNTI,
					      P_RNTI)==0) {
	  
	  phy_vars_ue->dlsch_ra_received[eNB_id]++;
	  
#ifdef DEBUG_PHY_PROC
2188
	  LOG_D(PHY,"[UE  %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ue_ra[eNB_id] %p\n",
2189 2190 2191 2192 2193 2194 2195
	      phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc[0],phy_vars_ue->dlsch_ue_ra[eNB_id]);
#endif
	}
    }
      else if( (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && 
	       (dci_alloc_rx[i].format == format0)) {
#ifdef DEBUG_PHY_PROC
2196
	LOG_D(PHY,"[UE  %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2197
	      phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i);
2198
	/*
Raymond Knopp's avatar
 
Raymond Knopp committed
2199
	  if (((frame_rx%100) == 0) || (frame_rx < 20))
2200 2201 2202 2203
	  dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
	*/
#endif      
#ifdef DIAG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
2204 2205
	if (subframe_rx != 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,frame_rx,subframe_rx);
2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217
	  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);
	  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]);

	if (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu,
					      phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
2218
					      subframe_rx,
2219 2220 2221 2222 2223 2224 2225 2226 2227 2228
					      format0,
					      phy_vars_ue,
					      SI_RNTI,
					      0,
					      P_RNTI,
					      CBA_RNTI,
					      eNB_id,
					      0)==0) {
	  
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2229
	  LOG_D(PHY,"[UE  %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx);
2230 2231 2232 2233 2234 2235 2236 2237 2238
#endif

	}
      } 
      else if( (dci_alloc_rx[i].rnti == phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0]) && 
	       (dci_alloc_rx[i].format == format0)) {
	// UE could belong to more than one CBA group 
       // phy_vars_ue->Mod_id%phy_vars_ue->ulsch_ue[eNB_id]->num_active_cba_groups]
#ifdef DEBUG_PHY_PROC
2239
	LOG_D(PHY,"[UE  %d][PUSCH] Frame %d subframe %d: Found cba rnti %x, format 0, dci_cnt %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2240
	      phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i);
2241
	/*
Raymond Knopp's avatar
 
Raymond Knopp committed
2242
	  if (((frame_rx%100) == 0) || (frame_rx < 20))
2243 2244 2245
	  dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
	*/
#endif      
2246
	/*
2247
#ifdef DIAG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
2248
	if (subframe_rx != 8) {
2249
	  LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received CBA RNTI Format 0!\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2250
		phy_vars_ue->Mod_id,frame_rx,subframe_rx);
2251 2252 2253 2254 2255 2256
	  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);
	  return(-1);
	}
#endif
2257
	*/
2258 2259 2260 2261 2262 2263
	
	phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0;
	//dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]);

	if (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu,
					      phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0],
Raymond Knopp's avatar
 
Raymond Knopp committed
2264
					      subframe_rx,
2265 2266 2267 2268 2269 2270 2271 2272 2273 2274
					      format0,
					      phy_vars_ue,
					      SI_RNTI,
					      0,
					      P_RNTI,
					      CBA_RNTI,
					      eNB_id,
					      0)==0) {
	  
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2275
	  LOG_D(PHY,"[UE  %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx);
2276
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2277
	  phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++;
2278 2279 2280 2281 2282
	}
      }
  
    else {
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2283
      LOG_D(PHY,"[UE  %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti,
2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302
	    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
	    phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0],
	    dci_alloc_rx[i].format);
      //      dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
#endif
#ifdef DIAG_PHY
      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);
      return(-1);
#endif
    }
    
  }
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
  return(0);
}

 
Raymond Knopp's avatar
 
Raymond Knopp committed
2303
 int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,
2304
			  relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
2305

2306
  uint16_t l,m,n_symb;
2307 2308
  //  int eNB_id = 0, 
  int ret=0;
2309
  uint8_t harq_pid = -1;
2310
  int timing_advance;
2311
  uint8_t pilot1,pilot2,pilot3;
2312
#ifndef DLSCH_THREAD
2313
  uint8_t i_mod = 0;
2314 2315 2316
  int eNB_id_i = 1;
  uint8_t dual_stream_UE = 0;
#endif
2317 2318
  int i;
#ifndef OPENAIR2
2319
  uint8_t *rar;
2320 2321
#endif
  int pmch_flag=0;
2322
  uint8_t sync_area=255;
2323
  int pmch_mcs=-1;
2324
  uint8_t mcch_active=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
2325 2326 2327 2328
  int frame_rx = phy_vars_ue->frame_rx;
  int slot_rx = phy_vars_ue->slot_rx;
  int subframe_rx = slot_rx>>1;
  int subframe_prev = (subframe_rx+9)%10;
2329
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
2330
  int CC_id = phy_vars_ue->CC_id;
2331
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2332

2333
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
2334

Raymond Knopp's avatar
 
Raymond Knopp committed
2335

2336
  start_meas(&phy_vars_ue->phy_proc_rx);
2337 2338 2339
#ifdef DEBUG_PHY_PROC
  LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX(%d)\n", 
	(r_type == multicast_relay) ? "RN/UE" : "UE",
Raymond Knopp's avatar
 
Raymond Knopp committed
2340
	phy_vars_ue->Mod_id,frame_rx, subframe_rx, slot_rx);
2341
#endif
2342
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
2343 2344
  if ((slot_rx == 0)) {
    if (frame_rx%1024 == 0)
2345 2346 2347
      openair_daq_vars.use_ia_receiver = 0;
    else
      openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3;
2348
    LOG_I(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2349
	  frame_rx,
2350 2351 2352
	  openair_daq_vars.use_ia_receiver, 
	  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->bitrate[eNB_id]);
2353 2354
  } 
#endif
2355

2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367
  if (phy_vars_ue->lte_frame_parms.Ncp == 0) {  // normal prefix
    pilot1 = 4;
    pilot2 = 7;
    pilot3 = 11;
  }
  else {  // extended prefix
    pilot1 = 3;
    pilot2 = 6;
    pilot3 = 9;
  }

  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Raymond Knopp's avatar
 
Raymond Knopp committed
2368 2369
  if (subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx) == SF_S) {
    if ((slot_rx%2)==0)
2370 2371 2372 2373 2374
      n_symb = 5;//3;
    else
      n_symb = 0;   	
  }
  else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2375
    /*
Raymond Knopp's avatar
 
Raymond Knopp committed
2376 2377
    if (is_pmch_subframe(frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) {
      if ((slot_rx%2)==0) {
2378 2379 2380 2381 2382 2383
	n_symb=2;
	pmch_flag=1;
      }
      else
	n_symb=0;
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
2384
    else*/
2385 2386 2387
      n_symb = phy_vars_ue->lte_frame_parms.symbols_per_tti/2;
  }
  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Raymond Knopp's avatar
 
Raymond Knopp committed
2388

Raymond Knopp's avatar
 
Raymond Knopp committed
2389
  LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->active); 
2390 2391
  
  // This is normal processing (i.e. not MBSFN)
Raymond Knopp's avatar
 
Raymond Knopp committed
2392
  // RX processing of symbols in slot_rx
2393 2394
  for (l=0;l<n_symb;l++) {
    if (abstraction_flag == 0) {
2395
      start_meas(&phy_vars_ue->ofdm_demod_stats);
Raymond Knopp's avatar
 
Raymond Knopp committed
2396
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
2397 2398
      slot_fep(phy_vars_ue,
	       l,
Raymond Knopp's avatar
 
Raymond Knopp committed
2399
	       slot_rx,
2400 2401
	       phy_vars_ue->rx_offset,
	       0);
Raymond Knopp's avatar
 
Raymond Knopp committed
2402
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
2403
      stop_meas(&phy_vars_ue->ofdm_demod_stats);
2404 2405
    }
  
Raymond Knopp's avatar
 
Raymond Knopp committed
2406 2407
    //if (subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx) == SF_DL)
    lte_ue_measurement_procedures(l,phy_vars_ue,eNB_id,abstraction_flag,mode);
2408 2409


Raymond Knopp's avatar
 
Raymond Knopp committed
2410
    if ((slot_rx==1) && (l==4-phy_vars_ue->lte_frame_parms.Ncp)) {
2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423

      /*
	phy_vars_ue->ulsch_no_allocation_counter[eNB_id]++;

	if (phy_vars_ue->ulsch_no_allocation_counter[eNB_id] == 10) {
	#ifdef DEBUG_PHY_PROC
	msg("[UE  %d] no_allocation : setting mode to PRACH\n",phy_vars_ue->Mod_id);
	#endif
	phy_vars_ue->UE_mode[eNB_id] = PRACH;
	phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti = 0x1234;
	}
      */

Raymond Knopp's avatar
 
Raymond Knopp committed
2424
      lte_ue_pbch_procedures(eNB_id,phy_vars_ue,abstraction_flag);
2425 2426 2427 2428

      /*
      if (phy_vars_ue->UE_mode[eNB_id] == RA_RESPONSE) {
      	phy_vars_ue->Msg3_timer[eNB_id]--;
Raymond Knopp's avatar
 
Raymond Knopp committed
2429
      	msg("[UE RAR] frame %d: Msg3_timer %d\n",frame_rx,phy_vars_ue->Msg3_timer);
2430 2431
      
      	if (phy_vars_ue->Msg3_timer[eNB_id] == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2432
      	  LOG_D(PHY,"[UE  %d] Frame %d: Msg3_timer = 0 : setting mode to PRACH\n",phy_vars_ue->Mod_id,frame_rx);
2433 2434 2435 2436 2437 2438 2439 2440 2441 2442
	  // I guess here we also need to tell the RRC
      	  phy_vars_ue->UE_mode[eNB_id] = PRACH;
	  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti = 0x1234;
	}
      }
      */
    }

#ifdef DLSCH_THREAD
    if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1)  {
Raymond Knopp's avatar
 
Raymond Knopp committed
2443
      // activate thread since Chest is now done for slot before slot_rx
2444
      if (l==0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2445
          LOG_D(PHY,"frame %d, slot_rx %d: Calling rx_pdsch_thread for harq_pid %d\n",frame_rx,slot_rx, phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid);
2446 2447 2448 2449 2450
          if (pthread_mutex_lock (&rx_pdsch_mutex) != 0) {               // Signal MAC_PHY Scheduler
              LOG_E(PHY,"[UE  %d] ERROR pthread_mutex_lock\n",phy_vars_ue->Mod_id);     // lock before accessing shared resource
              vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
          } else {
              rx_pdsch_instance_cnt++;
Raymond Knopp's avatar
 
Raymond Knopp committed
2451
              (slot_rx == 0) ? (rx_pdsch_slot = 19) : (rx_pdsch_slot = (slot_rx-1));
2452 2453 2454 2455 2456 2457 2458 2459 2460
              pthread_mutex_unlock (&rx_pdsch_mutex);
              
              if (rx_pdsch_instance_cnt == 0) {
                  if (pthread_cond_signal(&rx_pdsch_cond) != 0) {
                      LOG_E(PHY,"[UE  %d] ERROR pthread_cond_signal for rx_pdsch_cond\n",phy_vars_ue->Mod_id);
                      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
                  }
              }
              else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2461
                  LOG_W(PHY,"[UE  %d] Frame=%d, Slot=%d, RX_PDSCH thread for rx_pdsch_thread busy!!!\n",phy_vars_ue->Mod_id,frame_rx,slot_rx);
2462 2463 2464 2465
                  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
              }
          }
          // trigger DLSCH decoding thread
Raymond Knopp's avatar
 
Raymond Knopp committed
2466
          if ((slot_rx%2)==1) // odd slots
2467 2468 2469 2470 2471 2472
              phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0;
      }
    }
#endif
  
    // process last DLSCH symbols + invoke decoding
Raymond Knopp's avatar
 
Raymond Knopp committed
2473
    if (((slot_rx%2)==0) && (l==0)) {
2474
      // Regular PDSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
2475
      LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",phy_vars_ue->Mod_id,subframe_prev,phy_vars_ue->dlsch_ue[eNB_id][0]->active); 
2476 2477 2478
      if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) {
#ifndef DLSCH_THREAD //USER_MODE
	harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
Raymond Knopp's avatar
 
Raymond Knopp committed
2479
	LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",phy_vars_ue->Mod_id,subframe_prev,harq_pid); 
2480 2481 2482 2483 2484 2485
	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);
Raymond Knopp's avatar
 
Raymond Knopp committed
2486
	  if (frame_rx%100==0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2487
	    LOG_I(PHY,"using IA receiver\n");
2488 2489 2490 2491 2492 2493 2494 2495 2496 2497
      }
	}
	else {
	  dual_stream_UE = 0;
	  eNB_id_i = eNB_id+1;
	  i_mod = 0;
	}

	// process symbols 10,11,12 and trigger DLSCH decoding
	if (abstraction_flag == 0) {
2498 2499
	  
	  start_meas(&phy_vars_ue->dlsch_llr_stats);
2500 2501 2502 2503 2504 2505
	  for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) {

	    rx_pdsch(phy_vars_ue,
		     PDSCH,
		     eNB_id,
		     eNB_id_i,
Raymond Knopp's avatar
 
Raymond Knopp committed
2506
		     subframe_prev,  // subframe
2507 2508 2509 2510 2511 2512
		     m,                    // symbol
		     0,                    // first_symbol_flag
		     dual_stream_UE,
		     i_mod,
		     phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid);
	  }
2513
	  stop_meas(&phy_vars_ue->dlsch_llr_stats);
2514 2515 2516 2517 2518 2519 2520 2521 2522
	}
	
	phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0;

#ifdef DEBUG_PHY_PROC
	LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n",
	      phy_vars_ue->Mod_id,
	      phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
	      harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
2523
	      frame_rx,subframe_prev);      
2524 2525 2526 2527 2528 2529 2530 2531
#endif	
       
	if (phy_vars_ue->dlsch_ue[eNB_id][0]) {
        if (abstraction_flag == 0) {
            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&phy_vars_ue->lte_frame_parms,
                                                                                  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
                                                                                  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
                                                                                  get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs),
Raymond Knopp's avatar
 
Raymond Knopp committed
2532
										  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
2533
                                                                                  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
Raymond Knopp's avatar
 
Raymond Knopp committed
2534
                                                                                  frame_rx,subframe_prev);
2535 2536 2537 2538 2539 2540 2541
	    start_meas(&phy_vars_ue->dlsch_unscrambling_stats);
	    dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,
			       0,
			       phy_vars_ue->dlsch_ue[0][0],
			       phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G,
			       phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],
			       0,
Raymond Knopp's avatar
 
Raymond Knopp committed
2542
			       subframe_prev<<1);
2543 2544 2545
	    stop_meas(&phy_vars_ue->dlsch_unscrambling_stats);

	    start_meas(&phy_vars_ue->dlsch_decoding_stats);
2546 2547 2548 2549 2550
	    ret = dlsch_decoding(phy_vars_ue,
				 phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],
				 &phy_vars_ue->lte_frame_parms,
				 phy_vars_ue->dlsch_ue[eNB_id][0],
				 phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid],
Raymond Knopp's avatar
 
Raymond Knopp committed
2551
				 subframe_prev,
2552 2553
				 harq_pid,
				 1,0);
2554 2555
	    stop_meas(&phy_vars_ue->dlsch_decoding_stats);
	}
2556 2557 2558 2559 2560

	  else {
	    LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
#ifdef PHY_ABSTRACTION
	    ret = dlsch_decoding_emul(phy_vars_ue,
Raymond Knopp's avatar
 
Raymond Knopp committed
2561
				      subframe_prev,
2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572
				      2,
				      eNB_id);
#endif
	  }

	  if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) {
	    phy_vars_ue->dlsch_errors[eNB_id]++;
	  
#ifdef DEBUG_PHY_PROC
	    LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)\n",
		phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
2573
		  harq_pid,frame_rx,subframe_prev,
2574 2575 2576 2577
		phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
		phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
	    
	    //	    if (abstraction_flag ==0 )
2578 2579
	    //dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
	    //mac_xface->macphy_exit("");
2580 2581 2582
#endif
	  }
	  else {
2583
	    LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
2584
		  phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
2585
		  harq_pid,frame_rx,subframe_prev,slot_rx,
2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599
		  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
		  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
		  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
#ifdef DEBUG_PHY_PROC	 
#ifdef DEBUG_DLSCH
	    int j;
	    LOG_D(PHY,"dlsch harq_pid %d (rx): \n",phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid);
	    for (j=0;j<phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3;j++)
	      LOG_T(PHY,"%x.",phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b[j]);
	    LOG_T(PHY,"\n");
#endif 
#endif	    
#ifdef OPENAIR2
	    mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2600 2601
				   CC_id,
				   frame_rx,
2602 2603 2604 2605 2606
				   phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
				   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
	    phy_vars_ue->total_TBS[eNB_id] =  phy_vars_ue->total_TBS[eNB_id] +
2607
	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
2608
	    phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
2609
	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
2610 2611 2612 2613 2614
	  }
	}
            

#ifdef DEBUG_PHY_PROC
2615
	LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
2616 2617
	    phy_vars_ue->Mod_id,
	    phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
2618
	      frame_rx,subframe_prev,ret,
2619 2620 2621
	    phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
	    phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
	    phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
Raymond Knopp's avatar
 
Raymond Knopp committed
2622
	if (frame_rx%100==0) {
2623
	  LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n",
2624
		phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
2625
		frame_rx,subframe_prev,
2626 2627 2628 2629 2630 2631 2632 2633 2634
		phy_vars_ue->dlsch_errors[eNB_id],
		phy_vars_ue->dlsch_received[eNB_id],
		phy_vars_ue->dlsch_fer[eNB_id],
		phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id]);
	}
#endif 
#endif //DLSCH_THREAD
      }
      else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2635 2636
	//	printf("PDSCH inactive in subframe %d\n",subframe_rx-1); 
	phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0;
2637 2638 2639 2640 2641
      }
    
      // SI_DLSCH
      if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) {
#ifdef DEBUG_PHY_PROC
2642
	LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev);
2643 2644 2645 2646
#endif
	
	// process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding
	if (abstraction_flag==0) {
2647
	  start_meas(&phy_vars_ue->dlsch_llr_stats);
2648 2649
	  for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) {
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2650 2651 2652 2653
	    
	      LOG_D(PHY,"[UE  %d] Frame %d, slot %d: DLSCH (SI) demod between pilot 3 and 4 (2nd slot), m %d\n",
	      phy_vars_ue->Mod_id,frame_rx,slot_rx,m);
	    
2654 2655 2656 2657 2658
#endif
	    rx_pdsch(phy_vars_ue,
		     SI_PDSCH,
		     eNB_id,
		     eNB_id+1,
Raymond Knopp's avatar
 
Raymond Knopp committed
2659
		     subframe_prev,  // subframe,
2660 2661 2662
		     m,
		     0,
		     0,
Raymond Knopp's avatar
 
Raymond Knopp committed
2663 2664
		     phy_vars_ue->is_secondary_ue,
		     phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid);
2665
	  }
2666
	  stop_meas(&phy_vars_ue->dlsch_llr_stats);
2667 2668 2669 2670 2671
	}
	//	write_output("dlsch_ra_llr.m","llr",lte_ue_pdsch_vars_ra[eNB_id]->llr[0],40,1,0);

	phy_vars_ue->dlsch_ue_SI[eNB_id]->active = 0;
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2672
	if (frame_rx < phy_vars_ue->dlsch_SI_errors[eNB_id])
2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683
	  phy_vars_ue->dlsch_SI_errors[eNB_id]=0;

	if (phy_vars_ue->dlsch_ue_SI[eNB_id]) {

	  if (abstraction_flag==0) {

	    //          dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
	    phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G =  
	      get_G(&phy_vars_ue->lte_frame_parms,
		    phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
		    phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
2684
		    get_Qm(phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs),1,
2685
		    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
Raymond Knopp's avatar
 
Raymond Knopp committed
2686
		    frame_rx,subframe_prev);
2687 2688
	    
#ifdef DEBUG_PHY_PROC
2689
	    LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0],
2690 2691
		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G,
2692 2693
		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS,
		  phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols);
2694 2695 2696 2697
#endif


	    dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
2698 2699 2700 2701 2702 2703
			       0,
			       phy_vars_ue->dlsch_ue_SI[eNB_id],
			       phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G,
			       phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0],
			       0,
			       subframe_prev<<1);
2704 2705 2706 2707 2708 2709
	    
	    ret = dlsch_decoding(phy_vars_ue,
				 phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0],
				 &phy_vars_ue->lte_frame_parms,
				 phy_vars_ue->dlsch_ue_SI[eNB_id],
				 phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0],
Raymond Knopp's avatar
 
Raymond Knopp committed
2710 2711
				 subframe_prev,
				 phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid,
2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723
				 0,0);

#ifdef DEBUG_PHY_PROC
	    for (i=0;i<11;i++)
              LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->c[0][i]);
#endif

	  }
#ifdef PHY_ABSTRACTION
	  else {
	    LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
	    ret = dlsch_decoding_emul(phy_vars_ue,
Raymond Knopp's avatar
 
Raymond Knopp committed
2724
				      subframe_prev,
2725 2726 2727 2728 2729 2730 2731 2732
				      0,
				      eNB_id);
	  }
#endif

	  if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) {
	    phy_vars_ue->dlsch_SI_errors[eNB_id]++;
#ifdef DEBUG_PHY_PROC
2733
	    LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev);
2734 2735
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
2736
	    //dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev);
2737
            vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
2738
	    stop_meas(&phy_vars_ue->phy_proc_rx);
2739 2740 2741 2742 2743 2744
	    return(-1);
	  }
	  else {


#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2745
	    //if ((frame_rx % 100) == 0)
2746 2747 2748
	    LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d\n",
		  phy_vars_ue->Mod_id,frame_rx,subframe_prev,phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS,
		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs);
2749 2750 2751
#endif

#ifdef OPENAIR2
2752 2753
/*
                printf("\n\n"); 
2754
		for (i=0;i<phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++)
2755
		  printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]);
2756
		printf("\n");
2757
  */      
2758
		mac_xface->ue_decode_si(phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2759 2760
					CC_id,
					frame_rx,
2761 2762 2763 2764
					eNB_id,
					phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b,
					phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3);
		/*
Raymond Knopp's avatar
 
Raymond Knopp committed
2765 2766
	    if ((frame_rx % 160) < 10)
	      printf("sending SI to L2 in frame %d\n",frame_rx);
2767 2768 2769 2770 2771 2772 2773
	    */
#endif
	  }
	}   
	/*
#ifdef DEBUG_PHY_PROC
	debug_LOG_D(PHY,"[UE  %d] Frame %d, slot %d: dlsch_decoding (SI) ret %d (%d errors)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2774
		  phy_vars_ue->Mod_id,frame_rx,slot_rx,ret,phy_vars_ue->dlsch_SI_errors[eNB_id]);
2775 2776 2777 2778 2779 2780 2781
#endif
	*/
      }
    

      if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) {
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2782
	LOG_D(PHY,"[UE  %d] Frame %d, slot %d: DLSCH (RA) demod symbols 10,11,12\n",phy_vars_ue->Mod_id,frame_rx,slot_rx);
2783 2784 2785 2786
#endif
      
	// process symbols 10,11,12 and trigger DLSCH decoding
	if (abstraction_flag==0) {
2787
	  start_meas(&phy_vars_ue->dlsch_llr_stats);
2788 2789 2790 2791 2792
	  for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++)
	    rx_pdsch(phy_vars_ue,
		     RA_PDSCH,
		     eNB_id,
		     eNB_id+1,
Raymond Knopp's avatar
 
Raymond Knopp committed
2793
		     subframe_prev,  // subframe,
2794 2795 2796 2797 2798 2799
		     m, // symbol
		     0, // first_symbol_flag
		     0,
             phy_vars_ue->is_secondary_ue,
             phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid);
	}
2800
	stop_meas(&phy_vars_ue->dlsch_llr_stats);
2801 2802 2803

	phy_vars_ue->dlsch_ue_ra[eNB_id]->active = 0;
	
Raymond Knopp's avatar
 
Raymond Knopp committed
2804
	if (frame_rx < phy_vars_ue->dlsch_ra_errors[eNB_id])
2805 2806 2807 2808 2809
	  phy_vars_ue->dlsch_ra_errors[eNB_id]=0;

	if (phy_vars_ue->prach_resources[eNB_id]!=NULL)
	  phy_vars_ue->dlsch_ue_ra[eNB_id]->rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI;
	else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2810
	  LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev);
2811
	  mac_xface->macphy_exit("prach_resources is NULL");
2812 2813
	  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
	  stop_meas(&phy_vars_ue->phy_proc_rx);
2814 2815 2816 2817 2818 2819 2820
	  return 0;
	}

	if (abstraction_flag==0) {
        phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms,
                                                                       phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb,
                                                                       phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
2821
                                                                       get_Qm(phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs),1,
2822
                                                                       phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
Raymond Knopp's avatar
 
Raymond Knopp committed
2823 2824
                                                                       frame_rx,
                                                                       subframe_prev);
2825 2826

#ifdef DEBUG_PHY_PROC
2827
        LOG_D(PHY,"[UE] decoding RA (subframe %d): G %d,rnti %x\n" ,subframe_prev,
2828 2829 2830 2831 2832 2833 2834 2835 2836 2837
              phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G,
              phy_vars_ue->dlsch_ue_ra[eNB_id]->rnti);
#endif

        dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,
                           0,
                           phy_vars_ue->dlsch_ue_ra[eNB_id],
                           phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G,
                           phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]->llr[0],
                           0,
Raymond Knopp's avatar
 
Raymond Knopp committed
2838
                           subframe_prev<<1);
2839 2840 2841 2842 2843 2844
        
        ret = dlsch_decoding(phy_vars_ue,
                             phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]->llr[0],
                             &phy_vars_ue->lte_frame_parms,
                             phy_vars_ue->dlsch_ue_ra[eNB_id],
                             phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0],
Raymond Knopp's avatar
 
Raymond Knopp committed
2845
                             subframe_prev,  // subframe
2846 2847 2848 2849 2850 2851 2852 2853
                             harq_pid,
                             0,0);
	}

#ifdef PHY_ABSTRACTION
	else {
	  LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
	  ret = dlsch_decoding_emul(phy_vars_ue,
Raymond Knopp's avatar
 
Raymond Knopp committed
2854
				    subframe_prev,
2855 2856 2857 2858 2859 2860 2861
				    1,
				    eNB_id);
	}
#endif

	if (ret == (1+phy_vars_ue->dlsch_ue_ra[eNB_id]->max_turbo_iterations)) {
	  phy_vars_ue->dlsch_ra_errors[eNB_id]++;
Raymond Knopp's avatar
 
Raymond Knopp committed
2862
	  LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received RA in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev);
2863
#ifdef USER_MODE
Raymond Knopp's avatar
 
Raymond Knopp committed
2864
	  //dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev);
2865 2866 2867
#endif
	  //	  oai_exit=1;
          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
2868
	  stop_meas(&phy_vars_ue->phy_proc_rx);
2869 2870 2871 2872 2873
	  return(-1);

	}
	else {
#ifdef DEBUG_PHY_PROC
2874
	  LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Received RAR  mode %d\n",
2875
		phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2876 2877
		frame_rx,
		subframe_prev, phy_vars_ue->UE_mode[eNB_id]);
2878 2879 2880 2881
#endif	  

#ifdef OPENAIR2
	  if ((phy_vars_ue->UE_mode[eNB_id] != PUSCH) && (phy_vars_ue->prach_resources[eNB_id]->Msg3!=NULL)) {
2882
	    LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2883 2884
		  phy_vars_ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0),
		  subframe_prev,
2885 2886 2887
		  phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex);			

	    timing_advance = mac_xface->ue_process_rar(phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2888 2889
						       CC_id,
						       frame_rx-((subframe_prev==0) ? 1 : 0),
2890 2891 2892 2893 2894 2895 2896
						       phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b,
						       &phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
						       phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex);


	    if (timing_advance!=0xffff) {

2897
	      LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n",
2898
		    phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2899 2900
		    frame_rx-((subframe_prev==9) ? 1 : 0),
		    subframe_prev,
2901 2902 2903 2904 2905 2906 2907 2908
		    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
		    timing_advance);		
	      
	      //timing_advance = 0;
	      process_timing_advance_rar(phy_vars_ue,timing_advance);
	      if (mode!=debug_prach) {
		phy_vars_ue->ulsch_ue_Msg3_active[eNB_id]=1;
		get_Msg3_alloc(&phy_vars_ue->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
2909 2910
			       subframe_prev,
			       frame_rx-((subframe_prev==9) ? 1 : 0),
2911 2912 2913
			       &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id],
			       &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]);
		
2914
		LOG_D(PHY,"[UE  %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n",
2915
		      phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2916 2917
		      frame_rx-((subframe_prev==9) ? 1 : 0),
		      subframe_prev,
2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947
		      phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id],
		      phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]);
		harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms,
					     phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id],
					     phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]);
		phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round = 0;

		phy_vars_ue->UE_mode[eNB_id] = RA_RESPONSE;
		//	    phy_vars_ue->Msg3_timer[eNB_id] = 10;
		phy_vars_ue->ulsch_ue[eNB_id]->power_offset = 6;
		phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0;
	      }
	    }
	    else {  // PRACH preamble doesn't match RAR
	      LOG_W(PHY,"[UE  %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n",
		  phy_vars_ue->Mod_id,
		  phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex);
	    }
	  } // mode != PUSCH
#else //OPENAIR2

	  rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1;
	  timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
	  //timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0];
	  process_timing_advance_rar(phy_vars_ue,timing_advance);
#endif
	} //ret <= MAX_ITERATIONS
	/*      
#ifdef DEBUG_PHY_PROC	
	debug_LOG_D(PHY,"[UE  %d] Frame %d, slot %d: dlsch_decoding (RA) ret %d (%d errors)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2948
		  phy_vars_ue->Mod_id,frame_rx,slot_rx,ret,phy_vars_ue->dlsch_ra_errors[eNB_id]);
2949 2950 2951 2952 2953 2954 2955
#endif	
	*/
      } // dlsch_ue_ra[eNB_id]->active == 1
      
    }


Raymond Knopp's avatar
 
Raymond Knopp committed
2956
    if ((((slot_rx%2)==0) && ((l==pilot1))) ||
2957 2958 2959
	((pmch_flag==1)&&(l==1)))  {
      
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2960
      LOG_D(PHY,"[UE  %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,eNB_id);
2961
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2962 2963
      //      rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns());
      if (lte_ue_pdcch_procedures(eNB_id,phy_vars_ue,abstraction_flag) == -1) {
2964
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2965
	LOG_E(PHY,"[UE  %d] Frame %d, slot %d: Error in pdcch procedures\n",phy_vars_ue->Mod_id,frame_rx,slot_rx);
2966 2967 2968
#endif
	return(-1);
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
2969
      //      rt_printk("[PDCCH] Frame %d, slot %d, stop  %llu\n",frame_rx,slot_rx,rt_get_time_ns());
2970 2971 2972 2973 2974 2975 2976
#ifdef DEBUG_PHY_PROC
      LOG_D(PHY,"num_pdcch_symbols %d\n",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols);
#endif
    }
    
    if (abstraction_flag==0) {

Raymond Knopp's avatar
 
Raymond Knopp committed
2977
      if (((slot_rx%2)==1) && (l==0)) {
2978
	start_meas(&phy_vars_ue->dlsch_llr_stats);
2979 2980 2981 2982 2983 2984 2985
	for (m=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols;
	     m<pilot2;
	     m++) {      
	  
#ifndef DLSCH_THREAD
        if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1)  {
            harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
Raymond Knopp's avatar
 
Raymond Knopp committed
2986
	    LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,harq_pid); 
2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004
            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);
            }
            else {
                dual_stream_UE = 0;
                eNB_id_i = eNB_id+1;
                i_mod = 0;
            }
	    // process DLSCH received in first slot
	  
	    rx_pdsch(phy_vars_ue,
		     PDSCH,
		     eNB_id,
		     eNB_id_i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3005
		     subframe_rx,  // subframe,
3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019
		     m,
		     (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
		     dual_stream_UE,
             i_mod,
             phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid);
	  } // CRNTI active
#endif	  

	  if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1)  {
	    // process SI DLSCH in first slot
	    rx_pdsch(phy_vars_ue,
		     SI_PDSCH,
		     eNB_id,
		     eNB_id+1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3020
		     subframe_rx,  // subframe,
3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032
		     m,
		     (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
		     0,
             phy_vars_ue->is_secondary_ue,
             phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid);
	  } // SI active
	  
	  if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1)  {
	    rx_pdsch(phy_vars_ue,
		     RA_PDSCH,
		     eNB_id,
		     eNB_id+1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3033
		     subframe_rx,  // subframe,
3034 3035 3036 3037 3038 3039 3040
		     m,
		     (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,
		     0,
             phy_vars_ue->is_secondary_ue,
             phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid);
	  } // RA active
	} // loop from first dlsch symbol to end of slot
3041
 	stop_meas(&phy_vars_ue->dlsch_llr_stats);
3042 3043
      } // 2nd quarter
    
Raymond Knopp's avatar
 
Raymond Knopp committed
3044
      if (((slot_rx%2)==1) && (l==pilot1)) {
3045
	start_meas(&phy_vars_ue->dlsch_llr_stats);
3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067
	for (m=pilot2;m<pilot3;m++) {
	  
#ifndef DLSCH_THREAD
        if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) {
            harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
            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);
            }
            else {
                dual_stream_UE = 0;
                eNB_id_i = eNB_id+1;
                i_mod = 0;
            }

	    rx_pdsch(phy_vars_ue,
		     PDSCH,
		     eNB_id,
		     eNB_id_i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3068
		     subframe_rx,  // subframe,
3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080
		     m,
		     0,
		     dual_stream_UE,
             i_mod,
             phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid);
	  } // CRNTI active
#endif	  
	  if(phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) {
	    rx_pdsch(phy_vars_ue,
		     SI_PDSCH,
		     eNB_id,
		     eNB_id+1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3081
		     subframe_rx,  // subframe,
3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093
		     m,
		     0,   // first_symbol_flag
		     0,
             phy_vars_ue->is_secondary_ue,
             phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid);
	  } // SI active
	  
	  if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) {
	    rx_pdsch(phy_vars_ue,
		     RA_PDSCH,
		     eNB_id,
		     eNB_id+1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3094
		     subframe_rx,  // subframe,
3095 3096 3097 3098 3099 3100 3101 3102
		     m,
		     0,   // first_symbol_flag
		     0,
             phy_vars_ue->is_secondary_ue,
             phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid);
	  } // RA active
	  
	} // loop over 3rd quarter
3103
	 stop_meas(&phy_vars_ue->dlsch_llr_stats);
3104 3105 3106 3107
      } // 3rd quarter of subframe
    } // abstraction_flag==0   
  }// l loop

3108
  // calculate some statistics
Raymond Knopp's avatar
 
Raymond Knopp committed
3109 3110
  if (slot_rx==19) {
    if (frame_rx % 10 == 0) {
3111 3112 3113 3114 3115 3116 3117 3118 3119 3120
      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",
Raymond Knopp's avatar
 
Raymond Knopp committed
3121
	  phy_vars_ue->Mod_id,frame_rx,phy_vars_ue->total_TBS[eNB_id],
3122 3123
	  phy_vars_ue->total_TBS_last[eNB_id],(float) phy_vars_ue->bitrate[eNB_id]/1000.0);
  
Raymond Knopp's avatar
 
Raymond Knopp committed
3124
    if ((frame_rx % 100 == 0)) {
3125 3126 3127
      LOG_I(PHY,"Throughput %5.1f kbps\n",(float) phy_vars_ue->bitrate[eNB_id]/1000.0);
    }
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3128
  if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) {
3129
  LOG_I(PHY,"ue calling pmch subframe ..\n ");
3130
 
Raymond Knopp's avatar
 
Raymond Knopp committed
3131
    if ((slot_rx%2)==1) {
3132
      LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3133
	    phy_vars_ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot_rx);
3134
#ifdef Rel10
3135
      pmch_mcs = mac_xface->ue_query_mch(phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3136 3137 3138
					 CC_id,
					 (subframe_rx==9?-1:0)+frame_rx,
					 subframe_rx,
3139 3140 3141
					 eNB_id,
					 &sync_area,
					 &mcch_active);
3142
      if (phy_vars_rn)
Raymond Knopp's avatar
 
Raymond Knopp committed
3143
	phy_vars_rn->mch_avtive[subframe_rx]=0;
3144 3145 3146 3147 3148
#else
      pmch_mcs=-1;
#endif
      
      if (pmch_mcs>=0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3149
	LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",phy_vars_ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs);
3150
	fill_UE_dlsch_MCH(phy_vars_ue,pmch_mcs,1,0,0);
3151 3152 3153 3154 3155
	if (abstraction_flag == 0 ) { 
	  for (l=2;l<12;l++) {
	    
	    slot_fep_mbsfn(phy_vars_ue,
			   l,
Raymond Knopp's avatar
 
Raymond Knopp committed
3156
			   subframe_rx,
3157 3158
			   0,0);//phy_vars_ue->rx_offset,0);
	  }
3159
	  
3160 3161 3162
	  for (l=2;l<12;l++) {
	    rx_pmch(phy_vars_ue,
		    0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3163
		    subframe_rx,
3164 3165 3166 3167 3168
		    l);
	    
	    
	  }
	  /*	printf("PMCH decoding, Frame %d, subframe %d, G %d\n", 
Raymond Knopp's avatar
 
Raymond Knopp committed
3169 3170
	       (subframe_rx==9?-1:0)+frame_rx,
	       subframe_rx,
3171 3172
	       phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G);
	*/
3173
	  phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms,
3174
								   phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb,
3175 3176
								     phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc,
								     get_Qm(phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs),
Raymond Knopp's avatar
 
Raymond Knopp committed
3177
								     1,
3178
								     2,
Raymond Knopp's avatar
 
Raymond Knopp committed
3179
								     (subframe_rx==9?-1:0)+frame_rx,subframe_rx);
3180 3181 3182
	  
	  dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,1,phy_vars_ue->dlsch_ue_MCH[0],
			     phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G,
Raymond Knopp's avatar
 
Raymond Knopp committed
3183
			     phy_vars_ue->lte_ue_pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1);
3184 3185 3186 3187 3188 3189
	  
	  ret = dlsch_decoding(phy_vars_ue,
			       phy_vars_ue->lte_ue_pdsch_vars_MCH[0]->llr[0],		 
			       &phy_vars_ue->lte_frame_parms,
			       phy_vars_ue->dlsch_ue_MCH[0],
			       phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0],
Raymond Knopp's avatar
 
Raymond Knopp committed
3190
			       subframe_prev,
3191 3192 3193 3194
			       0,
			       0,0);
	}
	else { // abstraction
3195
#ifdef PHY_ABSTRACTION
3196
	  ret = dlsch_decoding_emul(phy_vars_ue,
Raymond Knopp's avatar
 
Raymond Knopp committed
3197
				    subframe_rx,
3198 3199
				    5, // PMCH
				    eNB_id);
3200
#endif
3201
	}
3202 3203 3204 3205
	if (mcch_active == 1)
	  phy_vars_ue->dlsch_mcch_trials[sync_area][0]++;
	else 
	  phy_vars_ue->dlsch_mtch_trials[sync_area][0]++;
3206 3207
	
	if (ret == (1+phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations)) {
3208 3209 3210 3211 3212 3213
	  if (mcch_active == 1)
	    phy_vars_ue->dlsch_mcch_errors[sync_area][0]++;
	  else 
	    phy_vars_ue->dlsch_mtch_errors[sync_area][0]++;
	  LOG_D(PHY,"[%s %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n",
		(r_type == no_relay)? "UE": "RN/UE", phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3214
		(subframe_rx==9?-1:0)+frame_rx,subframe_rx,
3215 3216 3217 3218 3219
		phy_vars_ue->dlsch_mcch_errors[sync_area][0],
		phy_vars_ue->dlsch_mtch_errors[sync_area][0],
		phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3,
		phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations,
		phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G);
Raymond Knopp's avatar
 
Raymond Knopp committed
3220
	  dump_mch(phy_vars_ue,0,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G,subframe_rx);
3221 3222
#ifdef DEBUG_DLSCH	  
	  for (i=0;i<phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3;i++){
3223
	    LOG_T(PHY,"%02x.",phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->c[0][i]);
3224 3225 3226
	  }
	  LOG_T(PHY,"\n");
#endif 
3227 3228
	  if (subframe_rx==9) 
	    mac_xface->macphy_exit("Why are we exiting here?");
3229 3230 3231
	}
	else {
#ifdef Rel10
3232 3233
	  if ((r_type == no_relay) || (mcch_active == 1)) {
	    mac_xface->ue_send_mch_sdu(phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3234 3235
				       CC_id,
				       frame_rx,
3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250
				       phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b,
				       phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3,
				       eNB_id,// not relevant in eMBMS context
				       sync_area);
	    /*   for (i=0;i<phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3;i++)
	      msg("%2x.",phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b[i]); 
	    msg("\n");
	    */
	    
	    if (mcch_active == 1)
	      phy_vars_ue->dlsch_mcch_received[sync_area][0]++;
	    else 
	      phy_vars_ue->dlsch_mtch_received[sync_area][0]++;

	   
Raymond Knopp's avatar
 
Raymond Knopp committed
3251 3252
	    if (phy_vars_ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ){
	      phy_vars_ue->dlsch_mch_received_sf[subframe_rx%5][0]=0;
3253 3254
	    } else {
	      phy_vars_ue->dlsch_mch_received[0]+=1;  
Raymond Knopp's avatar
 
Raymond Knopp committed
3255
	      phy_vars_ue->dlsch_mch_received_sf[subframe_rx][0]=1;
3256 3257 3258 3259 3260
	    }

	  } else if (r_type == multicast_relay) { // mcch is not active here 
	    // only 1 harq process exists
	    // Fix me: this could be a pointer copy
Raymond Knopp's avatar
 
Raymond Knopp committed
3261
	    memcpy (phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b,
3262 3263 3264
		    phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b,
		    phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3);
	    // keep the tbs
Raymond Knopp's avatar
 
Raymond Knopp committed
3265 3266 3267 3268
	    phy_vars_rn->mch_avtive[subframe_rx] = 1;
	    phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct
	    phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS;
	    phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs;
3269
	    LOG_I(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3270 3271 3272
		  phy_vars_ue->Mod_id, frame_rx,subframe_rx,sync_area,
		  phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs,
		  phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3);
3273
#ifdef DEBUG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
3274
	    for (i=0;i<phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3;i++)
3275
	      msg("%02x ",phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b[i]); 
3276 3277 3278
	    msg("\n");
#endif 	 
	  } else 
Raymond Knopp's avatar
 
Raymond Knopp committed
3279
	    LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",phy_vars_ue->Mod_id, frame_rx);
3280 3281 3282 3283 3284
#endif
	}
      }
    }
  }
jiangx's avatar
jiangx committed
3285 3286 3287 3288 3289

#ifdef EMOS
    phy_procedures_emos_UE_RX(phy_vars_ue,slot_rx,eNB_id);
#endif

3290
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
3291
  stop_meas(&phy_vars_ue->phy_proc_rx);
3292
  return (0);
3293
 }
3294 3295

#ifdef Rel10
Raymond Knopp's avatar
 
Raymond Knopp committed
3296
int phy_procedures_RN_UE_RX(uint8_t slot_rx, uint8_t next_slot, relaying_type_t r_type) {
3297 3298 3299 3300 3301 3302 3303

  int do_proc =0; // do nothing by default 
  switch(r_type){
  case no_relay:
    do_proc=no_relay; // perform the normal UE operation 
    break;
  case multicast_relay:
Raymond Knopp's avatar
 
Raymond Knopp committed
3304
    if (slot_rx > 12)
3305 3306
      do_proc = 0; // do nothing
    else // SF#1, SF#2, SF3, SF#3, SF#4, SF#5, SF#6(do rx slot 12)
3307
      do_proc = multicast_relay ; // do PHY procedures UE RX 
3308 3309 3310 3311 3312 3313 3314 3315
    break;
  default: // should'not be here
    LOG_W(PHY,"Not supported relay type %d, do nothing \n", r_type);
    do_proc= 0;
    break;
  }
  return do_proc;
}
3316 3317 3318 3319 3320
#endif


#if defined(ENABLE_ITTI)
#   if defined(ENABLE_RAL)
Lionel Gauthier's avatar
Lionel Gauthier committed
3321
extern PHY_MEASUREMENTS PHY_measurements;
3322 3323 3324 3325

void phy_UE_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) {
    MessageDef *message_p = NULL;
    if (
Lionel Gauthier's avatar
Lionel Gauthier committed
3326
           (
3327 3328
               (((short) threshold_phy_pP->threshold.threshold_val <  (short) valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) ||
               (((short)threshold_phy_pP->threshold.threshold_val >  (short)valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD))
Lionel Gauthier's avatar
Lionel Gauthier committed
3329 3330 3331
           )  ||
           (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD)
       ){
3332 3333 3334 3335 3336 3337 3338
        message_p = itti_alloc_new_message(TASK_PHY_UE , PHY_MEAS_REPORT_IND);
        memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p)));

        memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold,
                &threshold_phy_pP->threshold,
                sizeof(PHY_MEAS_REPORT_IND (message_p).threshold));

Lionel Gauthier's avatar
Lionel Gauthier committed
3339 3340
        memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param,
                &threshold_phy_pP->link_param,
3341
                sizeof(PHY_MEAS_REPORT_IND (message_p).link_param));
Lionel Gauthier's avatar
Lionel Gauthier committed
3342 3343 3344 3345 3346 3347 3348 3349 3350 3351

        switch (threshold_phy_pP->link_param.choice) {
            case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL:
                PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP;
                break;
            case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL:
                //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val.
                AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n");
                break;
        }
3352
	//LOG_I(PHY,"[XXX] Sending link parameters report msg message to RRC\n");
3353 3354 3355 3356 3357
        itti_send_msg_to_task(TASK_RRC_UE, instanceP, message_p);
    }
}

void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) {
Lionel Gauthier's avatar
Lionel Gauthier committed
3358
    unsigned int  mod_id;
3359 3360
    int CC_id  = 0; // this should become the function argument, requested by the upper layers.
 
Lionel Gauthier's avatar
Lionel Gauthier committed
3361 3362
    mod_id = instanceP - NB_eNB_INST;
    switch (threshold_phy_pP->link_param.link_param_type.choice) {
3363 3364

        case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
Lionel Gauthier's avatar
Lionel Gauthier committed
3365
            switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376
                case RAL_LINK_PARAM_GEN_DATA_RATE:
                    phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
                    break;
                case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH:
                    phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
                    break;
                case RAL_LINK_PARAM_GEN_SINR:
                    phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
                    break;
                case RAL_LINK_PARAM_GEN_THROUGHPUT:
                    break;
3377 3378
		default:;
	    }
3379 3380 3381
            break;

        case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
Lionel Gauthier's avatar
Lionel Gauthier committed
3382
            switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
3383
                case RAL_LINK_PARAM_LTE_UE_RSRP:
3384
//                     phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id]->PHY_measurements.rx_rssi_dBm[0]);
3385
                    phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.rsrp[0]);
3386 3387
                    break;
                case RAL_LINK_PARAM_LTE_UE_RSRQ:
3388
                    phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.rsrq[0]);
3389 3390
                    break;
                case RAL_LINK_PARAM_LTE_UE_CQI:
3391
                    phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.wideband_cqi_avg[0]);
3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410
                    break;
                case RAL_LINK_PARAM_LTE_AVAILABLE_BW:
                    break;
                case RAL_LINK_PARAM_LTE_PACKET_DELAY:
                    break;
                case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE:
                    break;
                case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS:
                    break;
                case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES:
                    break;
                case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY:
                    break;
                case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY:
                    break;
                case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS:
                    break;
                case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW:
                    break;
3411 3412
                default:
		    LOG_W(PHY,"unknown message %d\n", threshold_phy_pP->link_param.link_param_type._union.link_param_gen);
3413 3414 3415
            }
            break;

3416 3417 3418
        default:
	 LOG_W(PHY,"unknown message %d\n", threshold_phy_pP->link_param.link_param_type.choice);
   }
3419 3420 3421 3422
}
#   endif
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
3423
 void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, 
3424
			    relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) {
3425
#if defined(ENABLE_ITTI)
3426 3427 3428 3429 3430
  MessageDef   *msg_p;
  const char   *msg_name;
  instance_t    instance;
  unsigned int  Mod_id;
  int           result;
3431
#endif
3432
#   if defined(ENABLE_RAL)
Raymond Knopp's avatar
 
Raymond Knopp committed
3433
  int           CC_id =0;
3434
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3435
  int           frame_rx = phy_vars_ue->frame_rx;
3436
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
3437
  int           frame_tx = phy_vars_ue->frame_tx;
3438
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3439 3440 3441 3442
  int           slot_rx  = phy_vars_ue->slot_rx;
  int           slot_tx  = phy_vars_ue->slot_tx;
  int           subframe_tx = slot_tx>>1;
  int           subframe_rx = slot_rx>>1;
3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456
#undef DEBUG_PHY_PROC

#ifdef OPENAIR2
  UE_L2_STATE_t ret;
#endif
#ifndef OPENAIR2
  phy_vars_ue->UE_mode[eNB_id]=PUSCH;
  phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local;
  prach_resources_local.ra_RNTI = 0xbeef;
  prach_resources_local.ra_PreambleIndex = 0;
#endif


  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1);
3457
#if defined(EXMIMO)
3458
#ifndef USRP
3459
  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[0].rxcnt_ptr[0]));
linhuang's avatar
linhuang committed
3460
#endif
3461
#endif
3462
  start_meas(&phy_vars_ue->phy_proc);	
3463 3464 3465
#if defined(ENABLE_ITTI)
  do {
    // Checks if a message has been sent to PHY sub-task
3466
    itti_poll_msg (TASK_PHY_UE, &msg_p);
3467 3468 3469 3470 3471 3472 3473 3474

    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
      Mod_id = instance - NB_eNB_INST;

      switch (ITTI_MSG_ID(msg_p)) {
        case PHY_FIND_CELL_REQ:
3475
          LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name);
3476 3477

          /* TODO process the message */
3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501
#   if defined(ENABLE_RAL)
          {
              MessageDef *message_p;

              message_p = itti_alloc_new_message(TASK_PHY_UE , PHY_FIND_CELL_IND);
              memset(&PHY_FIND_CELL_IND(message_p), 0, sizeof(PHY_FIND_CELL_IND(message_p)));
              PHY_FIND_CELL_IND (message_p).transaction_id   = PHY_FIND_CELL_REQ(msg_p).transaction_id;
              PHY_FIND_CELL_IND (message_p).cell_nb          = 1;
              PHY_FIND_CELL_IND (message_p).cells[0].earfcn  = 1;
              PHY_FIND_CELL_IND (message_p).cells[0].cell_id = 06;
              PHY_FIND_CELL_IND (message_p).cells[0].rsrp    = 39;
              PHY_FIND_CELL_IND (message_p).cells[0].rsrq    = 39;

              itti_send_msg_to_task(TASK_RRC_UE, instance, message_p);

          }
#   endif
          break;

#   if defined(ENABLE_RAL)
        case TIMER_HAS_EXPIRED:
            // check if it is a measurement timer
        {
            hashtable_rc_t       hashtable_rc;
3502
            hashtable_rc = hashtable_is_key_exists(PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id));
3503
	    LOG_I(PHY, "[UE %d] Received TIMER HAS EXPIRED: (hash_rc %d, HASH_TABLE_OK %d)\n", Mod_id, hashtable_rc, HASH_TABLE_OK);	
3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529
            if (hashtable_rc == HASH_TABLE_OK) {
                phy_UE_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg);
            }
        }
            break;


        case PHY_MEAS_THRESHOLD_REQ:
#warning "TO DO LIST OF THRESHOLDS"
          LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name);
          {
              ral_threshold_phy_t* threshold_phy_p  = NULL;
              int                  index, res;
              long                 timer_id;
              hashtable_rc_t       hashtable_rc;

              switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) {

                  case RAL_TH_ACTION_CANCEL_THRESHOLD:
                      break;

                  case RAL_TH_ACTION_SET_NORMAL_THRESHOLD:
                  case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD:
                      for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) {
                          threshold_phy_p                  = calloc(1, sizeof(ral_threshold_phy_t));
                          threshold_phy_p->th_action       = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action;
Lionel Gauthier's avatar
Lionel Gauthier committed
3530
                          memcpy(&threshold_phy_p->link_param.link_param_type,
3531
                                  &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type,
Lionel Gauthier's avatar
Lionel Gauthier committed
3532
                                  sizeof(ral_link_param_type_t));
3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543

                          memcpy(&threshold_phy_p->threshold,
                                  &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index],
                                  sizeof(ral_threshold_t));

                          switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) {

                              case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL:
                                  switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) {
                                      case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
                                          SLIST_INSERT_HEAD(
3544
                                              &PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen],
3545 3546 3547 3548 3549 3550
                                              threshold_phy_p,
                                              ral_thresholds);
                                          break;

                                      case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
                                          SLIST_INSERT_HEAD(
3551
                                              &PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte],
3552 3553
                                              threshold_phy_p,
                                              ral_thresholds);
3554
//LOG_E(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER NULL - type LTE in %s\n", Mod_id, msg_name);
3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573
                                          break;

                                      default:
                                          LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n",
                                                  Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name);
                                  }
                                  break;

                              case RAL_LINK_CFG_PARAM_CHOICE_TIMER:
                                  res = timer_setup(
                                      (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t      interval_sec,
                                      (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t      interval_us,
                                      TASK_PHY_UE,
                                      instance,
                                      TIMER_PERIODIC,
                                      threshold_phy_p,
                                      &timer_id);

                                  if (res == 0) {
3574
                                      hashtable_rc = hashtable_insert(PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p);
3575 3576
                                      if (hashtable_rc == HASH_TABLE_OK) {
                                          threshold_phy_p->timer_id = timer_id;
3577
					LOG_I(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER CHOICE - OK - in Hash %s\n", Mod_id, msg_name);
3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601
                                      } else {
                                          LOG_E(PHY, "[UE %d]  %s: Error in hashtable. Could not configure threshold index %d \n",
                                                  Mod_id, msg_name, index);
                                      }

                                  } else {
                                      LOG_E(PHY, "[UE %d]  %s: Could not configure threshold index %d because of timer initialization failure\n",
                                              Mod_id, msg_name, index);
                                  }
                                  break;

                              default: // already checked in RRC, should not happen here
                                  LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.union_choice %d in %s\n",
                                           Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name);
                          }
                      }
                      break;

                  default:
                      LOG_E(PHY, "[UE %d] BAD PARAMETER th_action value %d in %s\n",
                              Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name);
              }

          }
3602
          break;
3603
#   endif
3604 3605 3606 3607 3608 3609

        default:
          LOG_E(PHY, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name);
          break;
      }

3610 3611
      result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
      AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
3612 3613 3614 3615
    }
  } while(msg_p != NULL);
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
3616
  if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_UL)||
3617
      (phy_vars_ue->lte_frame_parms.frame_type == FDD)){
Raymond Knopp's avatar
 
Raymond Knopp committed
3618
    phy_procedures_UE_TX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type);
3619
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3620
  if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx)==SF_DL) ||
3621
      (phy_vars_ue->lte_frame_parms.frame_type == FDD)){
3622
#ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3623
    if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 )
3624
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3625
      phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
3626
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3627 3628 3629
  if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_S) &&
      ((slot_tx&1)==1)) {
    phy_procedures_UE_S_TX(phy_vars_ue,eNB_id,abstraction_flag,r_type);
3630
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3631 3632
  if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx)==SF_S) &&
      ((slot_rx&1)==0)) {
3633
 #ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3634
    if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 )
3635
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3636
      phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
3637 3638 3639
  }

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
3640
  if (slot_rx%2==0) {
3641 3642

    ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
3643 3644 3645
				  frame_tx,
				  subframe_rx, 
				  subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx),
3646 3647
				  eNB_id,
				  0/*FIXME CC_id*/);
3648 3649
    if (ret == CONNECTION_LOST) {
      LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3650
	    frame_rx,subframe_tx);
3651
      phy_vars_ue->UE_mode[eNB_id] = PRACH;
Raymond Knopp's avatar
 
Raymond Knopp committed
3652
      //      mac_xface->macphy_exit("Connection lost");
3653 3654 3655 3656
    }
    else if (ret == PHY_RESYNCH) {
      LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n",
	    phy_vars_ue->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3657
	    frame_rx,subframe_tx);
3658
      phy_vars_ue->UE_mode[eNB_id] = RESYNCH;
Raymond Knopp's avatar
 
Raymond Knopp committed
3659
      //     mac_xface->macphy_exit("Connection lost");
3660 3661
    } else if (ret == PHY_HO_PRACH) {
      LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3662
	    phy_vars_ue->Mod_id,frame_rx,subframe_tx);
3663
      phy_vars_ue->UE_mode[eNB_id] = PRACH;
3664 3665 3666 3667
    }
  }
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
3668 3669
  //  if (last_slot == 19)
  //    phy_vars_ue->frame++;
3670 3671

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
3672
  stop_meas(&phy_vars_ue->phy_proc);
3673
}