defs.h 37.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.0  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */
21 22 23 24 25 26 27 28 29 30 31 32 33 34

/*! \file PHY/defs.h
 \brief Top-level defines and structure definitions
 \author R. Knopp, F. Kaltenberger
 \date 2011
 \version 0.1
 \company Eurecom
 \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
 \note
 \warning
*/
#ifndef __PHY_DEFS__H__
#define __PHY_DEFS__H__

35
#define _GNU_SOURCE 
36 37 38 39 40
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
41 42
#include "common_lib.h"

43
//#include <complex.h>
44
#include "assertions.h"
45
#ifdef MEX
46
# define msg mexPrintf
47
#else
48
# ifdef OPENAIR2
Laurent's avatar
Laurent committed
49 50 51 52 53
#   if ENABLE_RAL
#     include "collection/hashtable/hashtable.h"
#     include "COMMON/ral_messages_types.h"
#     include "UTIL/queue.h"
#   endif
54 55 56 57 58
#   include "log.h"
#   define msg(aRGS...) LOG_D(PHY, ##aRGS)
# else
#   define msg printf
# endif
59 60
#endif
//use msg in the real-time thread context
61
#define msg_nrt printf
62
//use msg_nrt in the non real-time context (for initialization, ...)
Cedric Roux's avatar
Cedric Roux committed
63 64 65 66 67 68
#ifndef malloc16
#  ifdef __AVX2__
#    define malloc16(x) memalign(32,x)
#  else
#    define malloc16(x) memalign(16,x)
#  endif
69
#endif
70 71 72 73 74 75
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096

76 77
#define RX_NB_TH_MAX 2
#define RX_NB_TH 2
78

79

80 81 82 83 84 85 86
//#ifdef SHRLIBDEV
//extern int rxrescale;
//#define RX_IQRESCALELEN rxrescale
//#else
//#define RX_IQRESCALELEN 15
//#endif

87 88 89 90
//! \brief Allocate \c size bytes of memory on the heap with alignment 16 and zero it afterwards.
//! If no more memory is available, this function will terminate the program with an assertion error.
static inline void* malloc16_clear( size_t size )
{
91 92 93
#ifdef __AVX2__
  void* ptr = memalign(32, size);
#else
94
  void* ptr = memalign(16, size);
95
#endif
96 97 98 99
  DevAssert(ptr);
  memset( ptr, 0, size );
  return ptr;
}
100

101 102


103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
#define PAGE_MASK 0xfffff000
#define virt_to_phys(x) (x)

#define openair_sched_exit() exit(-1)


#define max(a,b)  ((a)>(b) ? (a) : (b))
#define min(a,b)  ((a)<(b) ? (a) : (b))


#define bzero(s,n) (memset((s),0,(n)))

#define cmax(a,b)  ((a>b) ? (a) : (b))
#define cmin(a,b)  ((a<b) ? (a) : (b))

#define cmax3(a,b,c) ((cmax(a,b)>c) ? (cmax(a,b)) : (c))

120 121 122
/// suppress compiler warning for unused arguments
#define UNUSED(x) (void)x;

123 124 125 126 127 128 129

#include "impl_defs_top.h"
#include "impl_defs_lte.h"

#include "PHY/TOOLS/time_meas.h"
#include "PHY/CODING/defs.h"
#include "PHY/TOOLS/defs.h"
130
#include "platform_types.h"
131

Laurent's avatar
Laurent committed
132 133
#ifdef OPENAIR_LTE

134
#include "PHY/LTE_TRANSPORT/defs.h"
Raymond Knopp's avatar
 
Raymond Knopp committed
135
#include <pthread.h>
136

137 138
#include "targets/ARCH/COMMON/common_lib.h"

139 140 141 142
#define NUM_DCI_MAX 32

#define NUMBER_OF_eNB_SECTORS_MAX 3

143 144
#define NB_BANDS_MAX 8

Laurent's avatar
Laurent committed
145 146 147
#ifdef OCP_FRAMEWORK
#include <enums.h>
#else
148
typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t;
149

150
enum transmission_access_mode {
151 152 153 154 155
  NO_ACCESS=0,
  POSTPONED_ACCESS,
  CANCELED_ACCESS,
  UNKNOWN_ACCESS,
  SCHEDULED_ACCESS,
156 157
  CBA_ACCESS};

158
typedef enum  {
159
  eNodeB_3GPP=0,   // classical eNodeB function
160
  eNodeB_3GPP_BBU, // eNodeB with NGFI IF5
161
  NGFI_RCC_IF4p5,  // NGFI_RCC (NGFI radio cloud center)
Raymond Knopp's avatar
Raymond Knopp committed
162 163
  NGFI_RAU_IF4p5,
  NGFI_RRU_IF5,    // NGFI_RRU (NGFI remote radio-unit,IF5)
164
  NGFI_RRU_IF4p5   // NGFI_RRU (NGFI remote radio-unit,IF4p5)
165
} eNB_func_t;
166

167 168 169 170
typedef enum {
  synch_to_ext_device=0,  // synch to RF or Ethernet device
  synch_to_other          // synch to another source (timer, other CC_id)
} eNB_timing_t;
Laurent's avatar
Laurent committed
171
#endif
172

173 174
typedef struct UE_SCAN_INFO_s {
  /// 10 best amplitudes (linear) for each pss signals
175
  int32_t amp[3][10];
176
  /// 10 frequency offsets (kHz) corresponding to best amplitudes, with respect do minimum DL frequency in the band
177
  int32_t freq_offset_Hz[3][10];
178 179
} UE_SCAN_INFO_t;

180 181 182 183 184 185 186 187 188 189 190 191 192 193
/// Top-level PHY Data Structure for RN
typedef struct {
  /// Module ID indicator for this instance
  uint8_t Mod_id;
  uint32_t frame;
  // phy_vars_eNB
  // phy_vars ue
  // cuurently only used to store and forward the PMCH
  uint8_t mch_avtive[10];
  uint8_t sync_area[10]; // num SF
  LTE_UE_DLSCH_t   *dlsch_rn_MCH[10];

} PHY_VARS_RN;

194 195 196 197 198 199
/// Context data structure for RX/TX portion of subframe processing
typedef struct {
  /// Component Carrier index
  uint8_t              CC_id;
  /// timestamp transmitted to HW
  openair0_timestamp timestamp_tx;
Hongzhi Wang's avatar
Hongzhi Wang committed
200
//#ifdef UE_NR_PHY_DEMO
gabriel's avatar
gabriel committed
201 202 203 204
  /// NR TTI index within subframe_tx [0 .. ttis_per_subframe - 1] to act upon for transmission
  int nr_tti_tx;
  /// NR TTI index within subframe_rx [0 .. ttis_per_subframe - 1] to act upon for reception
  int nr_tti_rx;
Hongzhi Wang's avatar
Hongzhi Wang committed
205
//#endif
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
  /// subframe to act upon for transmission
  int subframe_tx;
  /// subframe to act upon for reception
  int subframe_rx;
  /// frame to act upon for transmission
  int frame_tx;
  /// frame to act upon for reception
  int frame_rx;
  /// \brief Instance count for RXn-TXnp4 processing thread.
  /// \internal This variable is protected by \ref mutex_rxtx.
  int instance_cnt_rxtx;
  /// pthread structure for RXn-TXnp4 processing thread
  pthread_t pthread_rxtx;
  /// pthread attributes for RXn-TXnp4 processing thread
  pthread_attr_t attr_rxtx;
  /// condition variable for tx processing thread
  pthread_cond_t cond_rxtx;
  /// mutex for RXn-TXnp4 processing thread
  pthread_mutex_t mutex_rxtx;
  /// scheduling parameters for RXn-TXnp4 thread
  struct sched_param sched_param_rxtx;
} eNB_rxtx_proc_t;
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

typedef struct {
  struct PHY_VARS_eNB_s *eNB;
  int UE_id;
  int harq_pid;
  int llr8_flag;
  int ret;
} td_params;

typedef struct {
  struct PHY_VARS_eNB_s *eNB;
  LTE_eNB_DLSCH_t *dlsch;
  int G;
} te_params;

Raymond Knopp's avatar
 
Raymond Knopp committed
243
/// Context data structure for eNB subframe processing
244
typedef struct eNB_proc_t_s {
245
  /// Component Carrier index
246
  uint8_t              CC_id;
247 248 249 250
  /// thread index
  int thread_index;
  /// timestamp received from HW
  openair0_timestamp timestamp_rx;
251 252
  /// timestamp to send to "slave rru"
  openair0_timestamp timestamp_tx;
253
  /// subframe to act upon for reception
Raymond Knopp's avatar
 
Raymond Knopp committed
254
  int subframe_rx;
255 256
  /// symbol mask for IF4p5 reception per subframe
  uint32_t symbol_mask[10];
257 258
  /// subframe to act upon for PRACH
  int subframe_prach;
259
  /// frame to act upon for reception
Raymond Knopp's avatar
 
Raymond Knopp committed
260
  int frame_rx;
261 262
  /// frame to act upon for transmission
  int frame_tx;
263 264
  /// frame offset for secondary eNBs (to correct for frame asynchronism at startup)
  int frame_offset;
265 266
  /// frame to act upon for PRACH
  int frame_prach;
267 268
  /// \internal This variable is protected by \ref mutex_fep.
  int instance_cnt_fep;
269 270 271 272
  /// \internal This variable is protected by \ref mutex_td.
  int instance_cnt_td;
  /// \internal This variable is protected by \ref mutex_te.
  int instance_cnt_te;
273 274 275
  /// \brief Instance count for FH processing thread.
  /// \internal This variable is protected by \ref mutex_FH.
  int instance_cnt_FH;
276
  /// \brief Instance count for rx processing thread.
277 278
  /// \internal This variable is protected by \ref mutex_prach.
  int instance_cnt_prach;
279 280
  // instance count for over-the-air eNB synchronization
  int instance_cnt_synch;
281 282
  /// \internal This variable is protected by \ref mutex_asynch_rxtx.
  int instance_cnt_asynch_rxtx;
283 284
  /// pthread structure for FH processing thread
  pthread_t pthread_FH;
Raymond Knopp's avatar
Raymond Knopp committed
285 286
  /// pthread structure for eNB single processing thread
  pthread_t pthread_single;
287 288
  /// pthread structure for asychronous RX/TX processing thread
  pthread_t pthread_asynch_rxtx;
289 290
  /// flag to indicate first RX acquisition
  int first_rx;
Raymond Knopp's avatar
Raymond Knopp committed
291 292
  /// flag to indicate first TX transmission
  int first_tx;
293 294
  /// pthread attributes for parallel fep thread
  pthread_attr_t attr_fep;
295 296 297 298
  /// pthread attributes for parallel turbo-decoder thread
  pthread_attr_t attr_td;
  /// pthread attributes for parallel turbo-encoder thread
  pthread_attr_t attr_te;
299 300
  /// pthread attributes for FH processing thread
  pthread_attr_t attr_FH;
Raymond Knopp's avatar
Raymond Knopp committed
301 302
  /// pthread attributes for single eNB processing thread
  pthread_attr_t attr_single;
303 304
  /// pthread attributes for prach processing thread
  pthread_attr_t attr_prach;
305 306
  /// pthread attributes for over-the-air synch thread
  pthread_attr_t attr_synch;
307
  /// pthread attributes for asynchronous RX thread
308
  pthread_attr_t attr_asynch_rxtx;
309 310
  /// scheduling parameters for parallel fep thread
  struct sched_param sched_param_fep;
311 312 313 314
  /// scheduling parameters for parallel turbo-decoder thread
  struct sched_param sched_param_td;
  /// scheduling parameters for parallel turbo-encoder thread
  struct sched_param sched_param_te;
315 316
  /// scheduling parameters for FH thread
  struct sched_param sched_param_FH;
Raymond Knopp's avatar
Raymond Knopp committed
317 318
  /// scheduling parameters for single eNB thread
  struct sched_param sched_param_single;
319 320
  /// scheduling parameters for prach thread
  struct sched_param sched_param_prach;
321 322
  /// scheduling parameters for over-the-air synchronization thread
  struct sched_param sched_param_synch;
323 324
  /// scheduling parameters for asynch_rxtx thread
  struct sched_param sched_param_asynch_rxtx;
325 326
  /// pthread structure for parallel fep thread
  pthread_t pthread_fep;
327 328 329 330
  /// pthread structure for parallel turbo-decoder thread
  pthread_t pthread_td;
  /// pthread structure for parallel turbo-encoder thread
  pthread_t pthread_te;
331
  /// pthread structure for PRACH thread
332
  pthread_t pthread_prach;
333 334
  /// pthread structure for eNB synch thread
  pthread_t pthread_synch;
335 336
  /// condition variable for parallel fep thread
  pthread_cond_t cond_fep;
337 338 339 340
  /// condition variable for parallel turbo-decoder thread
  pthread_cond_t cond_td;
  /// condition variable for parallel turbo-encoder thread
  pthread_cond_t cond_te;
341 342 343
  /// condition variable for FH thread
  pthread_cond_t cond_FH;
  /// condition variable for PRACH processing thread;
344
  pthread_cond_t cond_prach;
345 346
  // condition variable for over-the-air eNB synchronization
  pthread_cond_t cond_synch;
347 348
  /// condition variable for asynch RX/TX thread
  pthread_cond_t cond_asynch_rxtx;
349 350
  /// mutex for parallel fep thread
  pthread_mutex_t mutex_fep;
351 352 353 354
  /// mutex for parallel turbo-decoder thread
  pthread_mutex_t mutex_td;
  /// mutex for parallel turbo-encoder thread
  pthread_mutex_t mutex_te;
355 356 357
  /// mutex for FH
  pthread_mutex_t mutex_FH;
  /// mutex for PRACH thread
358
  pthread_mutex_t mutex_prach;
359 360
  // mutex for over-the-air eNB synchronization
  pthread_mutex_t mutex_synch;
361 362
  /// mutex for asynch RX/TX thread
  pthread_mutex_t mutex_asynch_rxtx;
363 364 365 366
  /// parameters for turbo-decoding worker thread
  td_params tdp;
  /// parameters for turbo-encoding worker thread
  te_params tep;
367 368
  /// set of scheduling variables RXn-TXnp4 threads
  eNB_rxtx_proc_t proc_rxtx[2];
369 370 371 372
  /// number of slave threads
  int                  num_slaves;
  /// array of pointers to slaves
  struct eNB_proc_t_s           **slave_proc;
Raymond Knopp's avatar
 
Raymond Knopp committed
373 374
} eNB_proc_t;

375 376 377

/// Context data structure for RX/TX portion of subframe processing
typedef struct {
378 379
  /// index of the current UE RX/TX proc
  int                  proc_id;
380 381 382 383
  /// Component Carrier index
  uint8_t              CC_id;
  /// timestamp transmitted to HW
  openair0_timestamp timestamp_tx;
Hongzhi Wang's avatar
Hongzhi Wang committed
384
//#ifdef UE_NR_PHY_DEMO
385 386 387 388
  /// NR TTI index within subframe_tx [0 .. ttis_per_subframe - 1] to act upon for transmission
  int nr_tti_tx;
  /// NR TTI index within subframe_rx [0 .. ttis_per_subframe - 1] to act upon for reception
  int nr_tti_rx;
Hongzhi Wang's avatar
Hongzhi Wang committed
389
//#endif
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
  /// subframe to act upon for transmission
  int subframe_tx;
  /// subframe to act upon for reception
  int subframe_rx;
  /// frame to act upon for transmission
  int frame_tx;
  /// frame to act upon for reception
  int frame_rx;
  /// \brief Instance count for RXn-TXnp4 processing thread.
  /// \internal This variable is protected by \ref mutex_rxtx.
  int instance_cnt_rxtx;
  /// pthread structure for RXn-TXnp4 processing thread
  pthread_t pthread_rxtx;
  /// pthread attributes for RXn-TXnp4 processing thread
  pthread_attr_t attr_rxtx;
  /// condition variable for tx processing thread
  pthread_cond_t cond_rxtx;
  /// mutex for RXn-TXnp4 processing thread
  pthread_mutex_t mutex_rxtx;
  /// scheduling parameters for RXn-TXnp4 thread
  struct sched_param sched_param_rxtx;
411 412

  /// internal This variable is protected by ref mutex_fep_slot1.
413 414
  //int instance_cnt_slot0_dl_processing;
  int instance_cnt_slot1_dl_processing;
415
  /// pthread descriptor fep_slot1 thread
416 417
  //pthread_t pthread_slot0_dl_processing;
  pthread_t pthread_slot1_dl_processing;
418
  /// pthread attributes for fep_slot1 processing thread
419 420
 // pthread_attr_t attr_slot0_dl_processing;
  pthread_attr_t attr_slot1_dl_processing;
421
  /// condition variable for UE fep_slot1 thread;
422 423
  //pthread_cond_t cond_slot0_dl_processing;
  pthread_cond_t cond_slot1_dl_processing;
424
  /// mutex for UE synch thread
425 426
  //pthread_mutex_t mutex_slot0_dl_processing;
  pthread_mutex_t mutex_slot1_dl_processing;
hbilel's avatar
hbilel committed
427 428 429 430 431 432 433 434 435 436 437 438 439 440
  //int instance_cnt_slot0_dl_processing;
  int instance_cnt_dlsch_td;
  /// pthread descriptor fep_slot1 thread
  //pthread_t pthread_slot0_dl_processing;
  pthread_t pthread_dlsch_td;
  /// pthread attributes for fep_slot1 processing thread
 // pthread_attr_t attr_slot0_dl_processing;
  pthread_attr_t attr_dlsch_td;
  /// condition variable for UE fep_slot1 thread;
  //pthread_cond_t cond_slot0_dl_processing;
  pthread_cond_t cond_dlsch_td;
  /// mutex for UE synch thread
  //pthread_mutex_t mutex_slot0_dl_processing;
  pthread_mutex_t mutex_dlsch_td;
441 442
  //
  uint8_t chan_est_pilot0_slot1_available;
443
  uint8_t chan_est_slot1_available;
444 445 446
  uint8_t llr_slot1_available;
  uint8_t dci_slot0_available;
  uint8_t first_symbol_available;
tct-labo4's avatar
tct-labo4 committed
447
  //uint8_t channel_level;
hbilel's avatar
hbilel committed
448 449 450
  int eNB_id;
  int harq_pid;
  int llr8_flag;
451 452 453
  /// scheduling parameters for fep_slot1 thread
  struct sched_param sched_param_fep_slot1;

laurent's avatar
laurent committed
454 455 456
  int sub_frame_start;
  int sub_frame_step;
  unsigned long long gotIQs;
457 458 459 460 461 462 463 464
} UE_rxtx_proc_t;

/// Context data structure for eNB subframe processing
typedef struct {
  /// Component Carrier index
  uint8_t              CC_id;
  /// Last RX timestamp
  openair0_timestamp timestamp_rx;
Raymond Knopp's avatar
Raymond Knopp committed
465 466 467 468 469 470
  /// pthread attributes for main UE thread
  pthread_attr_t attr_ue;
  /// scheduling parameters for main UE thread
  struct sched_param sched_param_ue;
  /// pthread descriptor main UE thread
  pthread_t pthread_ue;
471 472 473
  /// \brief Instance count for synch thread.
  /// \internal This variable is protected by \ref mutex_synch.
  int instance_cnt_synch;
Raymond Knopp's avatar
Raymond Knopp committed
474
  /// pthread attributes for synch processing thread
475 476 477 478 479 480 481 482 483 484
  pthread_attr_t attr_synch;
  /// scheduling parameters for synch thread
  struct sched_param sched_param_synch;
  /// pthread descriptor synch thread
  pthread_t pthread_synch;
  /// condition variable for UE synch thread;
  pthread_cond_t cond_synch;
  /// mutex for UE synch thread
  pthread_mutex_t mutex_synch;
  /// set of scheduling variables RXn-TXnp4 threads
485
  UE_rxtx_proc_t proc_rxtx[RX_NB_TH];
486
} UE_proc_t;
487 488

/// Top-level PHY Data Structure for eNB
489
typedef struct PHY_VARS_eNB_s {
490
  /// Module ID indicator for this instance
Raymond Knopp's avatar
 
Raymond Knopp committed
491 492
  module_id_t          Mod_id;
  uint8_t              CC_id;
493
  eNB_proc_t           proc;
494
  eNB_func_t           node_function;
495
  eNB_timing_t         node_timing;
496
  eth_params_t         *eth_params;
Raymond Knopp's avatar
Raymond Knopp committed
497
  int                  single_thread_flag;
498
  openair0_rf_map      rf_map;
499
  int                  abstraction_flag;
Raymond Knopp's avatar
Raymond Knopp committed
500
  openair0_timestamp   ts_offset;
501 502 503 504
  // indicator for synchronization state of eNB
  int                  in_synch;
  // indicator for master/slave (RRU)
  int                  is_slave;
505 506
  // indicator for precoding function (eNB,3GPP_eNB_BBU)
  int                  do_precoding;
507
  void                 (*do_prach)(struct PHY_VARS_eNB_s *eNB,int frame,int subframe);
508
  void                 (*fep)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc);
509 510
  int                  (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag);
  int                  (*te)(struct PHY_VARS_eNB_s *,uint8_t *,uint8_t,LTE_eNB_DLSCH_t *,int,uint8_t,time_stats_t *,time_stats_t *,time_stats_t *);
511 512 513
  void                 (*proc_uespec_rx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type);
  void                 (*proc_tx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *rn);
  void                 (*tx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc);
Raymond Knopp's avatar
Raymond Knopp committed
514
  void                 (*rx_fh)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe);
515 516
  int                  (*start_rf)(struct PHY_VARS_eNB_s *eNB);
  int                  (*start_if)(struct PHY_VARS_eNB_s *eNB);
Raymond Knopp's avatar
Raymond Knopp committed
517
  void                 (*fh_asynch)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
518
  uint8_t              local_flag;
519 520 521 522 523 524 525 526 527 528 529 530 531 532
  uint32_t             rx_total_gain_dB;
  LTE_DL_FRAME_PARMS   frame_parms;
  PHY_MEASUREMENTS_eNB measurements[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables
  LTE_eNB_COMMON       common_vars;
  LTE_eNB_SRS          srs_vars[NUMBER_OF_UE_MAX];
  LTE_eNB_PBCH         pbch;
  LTE_eNB_PUSCH       *pusch_vars[NUMBER_OF_UE_MAX];
  LTE_eNB_PRACH        prach_vars;
  LTE_eNB_DLSCH_t     *dlsch[NUMBER_OF_UE_MAX][2];   // Nusers times two spatial streams
  LTE_eNB_ULSCH_t     *ulsch[NUMBER_OF_UE_MAX+1];      // Nusers + number of RA
  LTE_eNB_DLSCH_t     *dlsch_SI,*dlsch_ra;
  LTE_eNB_DLSCH_t     *dlsch_MCH;
  LTE_eNB_UE_stats     UE_stats[NUMBER_OF_UE_MAX];
  LTE_eNB_UE_stats    *UE_stats_ptr[NUMBER_OF_UE_MAX];
533 534

  /// cell-specific reference symbols
Raymond Knopp's avatar
 
Raymond Knopp committed
535 536
  uint32_t         lte_gold_table[20][2][14];

537
  /// UE-specific reference symbols (p=5), TM 7
538
  uint32_t         lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][38];
539

Raymond Knopp's avatar
 
Raymond Knopp committed
540 541
  /// UE-specific reference symbols (p=7...14), TM 8/9/10
  uint32_t         lte_gold_uespec_table[2][20][2][21];
542

543
  /// mbsfn reference symbols
Raymond Knopp's avatar
 
Raymond Knopp committed
544
  uint32_t         lte_gold_mbsfn_table[10][3][42];
545

546
  uint32_t X_u[64][839];
547

548
  uint8_t pbch_pdu[4]; //PBCH_PDU_SIZE
549 550 551
  char eNB_generate_rar;

  /// Indicator set to 0 after first SR
552
  uint8_t first_sr[NUMBER_OF_UE_MAX];
553

554
  uint32_t max_peak_val;
555 556
  int max_eNB_id, max_sync_pos;

557
  int              N_TA_offset; ///timing offset used in TDD
558

559 560
  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
  /// first index: ? [0..N_RB_DL*12[
561 562
  double *sinr_dB;

563
  /// N0 (used for abstraction)
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
  double N0;

  unsigned char first_run_timing_advance[NUMBER_OF_UE_MAX];
  unsigned char first_run_I0_measurements;

  unsigned char cooperation_flag; // for cooperative communication

  unsigned char    is_secondary_eNB; // primary by default
  unsigned char    is_init_sync;     /// Flag to tell if initial synchronization is performed. This affects how often the secondary eNB will listen to the PSS from the primary system.
  unsigned char    has_valid_precoder; /// Flag to tell if secondary eNB has channel estimates to create NULL-beams from, and this B/F vector is created.
  unsigned char    PeNB_id;          /// id of Primary eNB
  int              rx_offset;        /// Timing offset (used if is_secondary_eNB)

  /// hold the precoder for NULL beam to the primary user
  int              **dl_precoder_SeNB[3];
  char             log2_maxp; /// holds the maximum channel/precoder coefficient

581
  /// if ==0 enables phy only test mode
582 583
  int mac_enabled;

584
  /// For emulation only (used by UE abstraction to retrieve DCI)
585 586
  uint8_t num_common_dci[2];                         // num_dci in even/odd subframes
  uint8_t num_ue_spec_dci[2];                         // num_dci in even/odd subframes
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610
  DCI_ALLOC_t dci_alloc[2][NUM_DCI_MAX]; // dci_alloc from even/odd subframes


  // PDSCH Varaibles
  PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_UE_MAX];

  // PUSCH Varaibles
  PUSCH_CONFIG_DEDICATED pusch_config_dedicated[NUMBER_OF_UE_MAX];

  // PUCCH variables
  PUCCH_CONFIG_DEDICATED pucch_config_dedicated[NUMBER_OF_UE_MAX];

  // UL-POWER-Control
  UL_POWER_CONTROL_DEDICATED ul_power_control_dedicated[NUMBER_OF_UE_MAX];

  // TPC
  TPC_PDCCH_CONFIG tpc_pdcch_config_pucch[NUMBER_OF_UE_MAX];
  TPC_PDCCH_CONFIG tpc_pdcch_config_pusch[NUMBER_OF_UE_MAX];

  // CQI reporting
  CQI_REPORT_CONFIG cqi_report_config[NUMBER_OF_UE_MAX];

  // SRS Variables
  SOUNDINGRS_UL_CONFIG_DEDICATED soundingrs_ul_config_dedicated[NUMBER_OF_UE_MAX];
611
  uint8_t ncs_cell[20][7];
612 613 614 615 616

  // Scheduling Request Config
  SCHEDULING_REQUEST_CONFIG scheduling_request_config[NUMBER_OF_UE_MAX];

  // Transmission mode per UE
617
  uint8_t transmission_mode[NUMBER_OF_UE_MAX];
618 619 620

  /// cba_last successful reception for each group, used for collision detection
  uint8_t cba_last_reception[4];
621

622 623 624
  // Pointers for active physicalConfigDedicated to be applied in current subframe
  struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];

625

626 627
  uint32_t rb_mask_ul[4];

628 629 630 631
  /// Information regarding TM5
  MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];


632 633 634 635 636 637 638 639 640
  /// target_ue_dl_mcs : only for debug purposes
  uint32_t target_ue_dl_mcs;
  /// target_ue_ul_mcs : only for debug purposes
  uint32_t target_ue_ul_mcs;
  /// target_ue_dl_rballoc : only for debug purposes
  uint32_t ue_dl_rb_alloc;
  /// target ul PRBs : only for debug
  uint32_t ue_ul_nb_rb;

641
  ///check for Total Transmissions
Raymond Knopp's avatar
 
Raymond Knopp committed
642
  uint32_t check_for_total_transmissions;
643 644

  ///check for MU-MIMO Transmissions
Raymond Knopp's avatar
 
Raymond Knopp committed
645
  uint32_t check_for_MUMIMO_transmissions;
646 647

  ///check for SU-MIMO Transmissions
Raymond Knopp's avatar
 
Raymond Knopp committed
648
  uint32_t check_for_SUMIMO_transmissions;
649 650

  ///check for FULL MU-MIMO Transmissions
Raymond Knopp's avatar
 
Raymond Knopp committed
651
  uint32_t  FULL_MUMIMO_transmissions;
652 653

  /// Counter for total bitrate, bits and throughput in downlink
Raymond Knopp's avatar
 
Raymond Knopp committed
654 655 656
  uint32_t total_dlsch_bitrate;
  uint32_t total_transmitted_bits;
  uint32_t total_system_throughput;
657

658
  int hw_timing_advance;
659

660 661 662 663
  time_stats_t phy_proc;
  time_stats_t phy_proc_tx;
  time_stats_t phy_proc_rx;
  time_stats_t rx_prach;
664

665 666 667
  time_stats_t ofdm_mod_stats;
  time_stats_t dlsch_encoding_stats;
  time_stats_t dlsch_modulation_stats;
668
  time_stats_t dlsch_scrambling_stats;
669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
  time_stats_t dlsch_rate_matching_stats;
  time_stats_t dlsch_turbo_encoding_stats;
  time_stats_t dlsch_interleaving_stats;

  time_stats_t ofdm_demod_stats;
  time_stats_t rx_dft_stats;
  time_stats_t ulsch_channel_estimation_stats;
  time_stats_t ulsch_freq_offset_estimation_stats;
  time_stats_t ulsch_decoding_stats;
  time_stats_t ulsch_demodulation_stats;
  time_stats_t ulsch_rate_unmatching_stats;
  time_stats_t ulsch_turbo_decoding_stats;
  time_stats_t ulsch_deinterleaving_stats;
  time_stats_t ulsch_demultiplexing_stats;
  time_stats_t ulsch_llr_stats;
  time_stats_t ulsch_tc_init_stats;
  time_stats_t ulsch_tc_alpha_stats;
  time_stats_t ulsch_tc_beta_stats;
  time_stats_t ulsch_tc_gamma_stats;
  time_stats_t ulsch_tc_ext_stats;
  time_stats_t ulsch_tc_intl1_stats;
  time_stats_t ulsch_tc_intl2_stats;
691

692 693 694
#ifdef LOCALIZATION
  /// time state for localization
  time_stats_t localization_stats;
695
#endif
696

697 698
  int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
  int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024];
699
  int32_t pucch1_stats_thres[NUMBER_OF_UE_MAX][10*1024];
700
  int32_t pucch1ab_stats_cnt[NUMBER_OF_UE_MAX][10];
701
  int32_t pucch1ab_stats[NUMBER_OF_UE_MAX][2*10*1024];
702 703 704 705 706
  int32_t pusch_stats_rb[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_round[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240];
  int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240];
707

708
  /// RF and Interface devices per CC
709
  openair0_device rfdevice;
710
  openair0_device ifdevice;
711 712
  /// Pointer for ifdevice buffer struct
  if_buffer_t ifbuffer;
Lionel Gauthier's avatar
Lionel Gauthier committed
713

714 715 716
} PHY_VARS_eNB;

#define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg
717

718 719
/// Top-level PHY Data Structure for UE
typedef struct {
Raymond Knopp's avatar
 
Raymond Knopp committed
720
  /// \brief Module ID indicator for this instance
721
  uint8_t Mod_id;
Raymond Knopp's avatar
 
Raymond Knopp committed
722
  /// \brief Component carrier ID for this PHY instance
Raymond Knopp's avatar
 
Raymond Knopp committed
723
  uint8_t CC_id;
724 725
  /// \brief Mapping of CC_id antennas to cards
  openair0_rf_map      rf_map;
Raymond Knopp's avatar
 
Raymond Knopp committed
726 727 728 729 730
  //uint8_t local_flag;
  /// \brief Indicator of current run mode of UE (normal_txrx, rx_calib_ue, no_L2_connect, debug_prach)
  runmode_t mode;
  /// \brief Indicator that UE should perform band scanning
  int UE_scan;
731 732
  /// \brief Indicator that UE should perform coarse scanning around carrier
  int UE_scan_carrier;
Raymond Knopp's avatar
 
Raymond Knopp committed
733
  /// \brief Indicator that UE is synchronized to an eNB
734
  int is_synchronized;
735 736
  /// Data structure for UE process scheduling
  UE_proc_t proc;
737 738
  /// Flag to indicate the UE shouldn't do timing correction at all
  int no_timing_correction;
Raymond Knopp's avatar
 
Raymond Knopp committed
739
  /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna)
Raymond Knopp's avatar
 
Raymond Knopp committed
740
  uint32_t tx_total_gain_dB;
Raymond Knopp's avatar
 
Raymond Knopp committed
741
  /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card.
742
  uint32_t rx_total_gain_dB;
Raymond Knopp's avatar
 
Raymond Knopp committed
743
  /// \brief Total gains with maximum RF gain stage (ExpressMIMO2/Lime)
Raymond Knopp's avatar
 
Raymond Knopp committed
744
  uint32_t rx_gain_max[4];
Raymond Knopp's avatar
 
Raymond Knopp committed
745
  /// \brief Total gains with medium RF gain stage (ExpressMIMO2/Lime)
Raymond Knopp's avatar
 
Raymond Knopp committed
746
  uint32_t rx_gain_med[4];
Raymond Knopp's avatar
 
Raymond Knopp committed
747
  /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime)
Raymond Knopp's avatar
 
Raymond Knopp committed
748
  uint32_t rx_gain_byp[4];
Raymond Knopp's avatar
 
Raymond Knopp committed
749
  /// \brief Current transmit power
750
  int16_t tx_power_dBm[10];
Raymond Knopp's avatar
 
Raymond Knopp committed
751
  /// \brief Total number of REs in current transmission
752
  int tx_total_RE[10];
Raymond Knopp's avatar
 
Raymond Knopp committed
753
  /// \brief Maximum transmit power
754
  int8_t tx_power_max_dBm;
Raymond Knopp's avatar
 
Raymond Knopp committed
755
  /// \brief Number of eNB seen by UE
756
  uint8_t n_connected_eNB;
Raymond Knopp's avatar
 
Raymond Knopp committed
757
  /// \brief indicator that Handover procedure has been initiated
758
  uint8_t ho_initiated;
Raymond Knopp's avatar
 
Raymond Knopp committed
759
  /// \brief indicator that Handover procedure has been triggered
760
  uint8_t ho_triggered;
761
  /// \brief Measurement variables.
762 763
  PHY_MEASUREMENTS measurements;
  LTE_DL_FRAME_PARMS  frame_parms;
764
  /// \brief Frame parame before ho used to recover if ho fails.
765 766 767
  LTE_DL_FRAME_PARMS  frame_parms_before_ho;
  LTE_UE_COMMON    common_vars;

768 769 770
  // point to the current rxTx thread index
  uint8_t current_thread_id[10];

771
  LTE_UE_PDSCH     *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
772 773 774
  LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH     *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
  LTE_UE_PDSCH     *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
775
  LTE_UE_PDSCH     *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
776 777
  LTE_UE_PDSCH     *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_PBCH      *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
778
  LTE_UE_PDCCH     *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX];
779
  LTE_UE_PRACH     *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
780
  LTE_UE_DLSCH_t   *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX][2]; // two RxTx Threads
781
  LTE_UE_ULSCH_t   *ulsch[NUMBER_OF_CONNECTED_eNB_MAX];
782 783 784
  LTE_UE_DLSCH_t   *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_DLSCH_t   *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX];
  LTE_UE_DLSCH_t   *dlsch_p[NUMBER_OF_CONNECTED_eNB_MAX];
785
  LTE_UE_DLSCH_t   *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
Raymond Knopp's avatar
Raymond Knopp committed
786 787 788
  // This is for SIC in the UE, to store the reencoded data
  LTE_eNB_DLSCH_t  *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX];

789 790 791 792 793
  //Paging parameters
  uint32_t              IMSImod1024;
  uint32_t              PF;
  uint32_t              PO;

794
  // For abstraction-purposes only
795 796 797
  uint8_t               sr[10];
  uint8_t               pucch_sel[10];
  uint8_t               pucch_payload[22];
798 799 800

  UE_MODE_t        UE_mode[NUMBER_OF_CONNECTED_eNB_MAX];
  /// cell-specific reference symbols
Raymond Knopp's avatar
 
Raymond Knopp committed
801 802
  uint32_t lte_gold_table[7][20][2][14];

803
  /// UE-specific reference symbols (p=5), TM 7
804
  uint32_t lte_gold_uespec_port5_table[20][38];
805

Raymond Knopp's avatar
 
Raymond Knopp committed
806
  /// ue-specific reference symbols
807
  uint32_t lte_gold_uespec_table[2][20][2][21];
808

Raymond Knopp's avatar
 
Raymond Knopp committed
809 810
  /// mbsfn reference symbols
  uint32_t lte_gold_mbsfn_table[10][3][42];
811

812
  uint32_t X_u[64][839];
813

814
  uint32_t high_speed_flag;
Raymond Knopp's avatar
 
Raymond Knopp committed
815
  uint32_t perfect_ce;
816
  int16_t ch_est_alpha;
817 818
  int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX];

819
  UE_SCAN_INFO_t scan_info[NB_BANDS_MAX];
820

821 822
  char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX];

823 824


825 826 827
  unsigned char ulsch_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX];
  uint32_t  ulsch_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX];
  unsigned char ulsch_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX];
828 829
  PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX];
  int turbo_iterations, turbo_cntl_iterations;
830 831
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
Raymond Knopp's avatar
 
Raymond Knopp committed
832
  uint32_t total_TBS[NUMBER_OF_CONNECTED_eNB_MAX];
833 834
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
Raymond Knopp's avatar
 
Raymond Knopp committed
835
  uint32_t total_TBS_last[NUMBER_OF_CONNECTED_eNB_MAX];
836 837
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
Raymond Knopp's avatar
 
Raymond Knopp committed
838
  uint32_t bitrate[NUMBER_OF_CONNECTED_eNB_MAX];
839 840
  /// \brief ?.
  /// - first index: eNB [0..NUMBER_OF_CONNECTED_eNB_MAX[ (hard coded)
Raymond Knopp's avatar
 
Raymond Knopp committed
841
  uint32_t total_received_bits[NUMBER_OF_CONNECTED_eNB_MAX];
842 843 844 845 846 847 848 849 850
  int dlsch_errors[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_errors_last[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_received[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_received_last[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_fer[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_SI_received[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_SI_errors[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_ra_received[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_ra_errors[NUMBER_OF_CONNECTED_eNB_MAX];
851 852
  int dlsch_p_received[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_p_errors[NUMBER_OF_CONNECTED_eNB_MAX];
853 854 855 856 857 858 859 860
  int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_mch_received[NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_mtch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_mcch_errors[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_mtch_errors[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_mcch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
  int dlsch_mtch_trials[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
861 862
  int current_dlsch_cqi[NUMBER_OF_CONNECTED_eNB_MAX];
  unsigned char first_run_timing_advance[NUMBER_OF_CONNECTED_eNB_MAX];
863 864 865 866
  uint8_t               generate_prach;
  uint8_t               prach_cnt;
  uint8_t               prach_PreambleIndex;
  //  uint8_t               prach_timer;
867 868
  uint8_t               decode_SIB;
  uint8_t               decode_MIB;
869
  int              rx_offset; /// Timing offset
870
  int              rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
871
  int              time_sync_cell;
872
  int              timing_advance; ///timing advance signalled from eNB
873
  int              hw_timing_advance;
874
  int              N_TA_offset; ///timing offset used in TDD
875
  /// Flag to tell if UE is secondary user (cognitive mode)
876
  unsigned char    is_secondary_ue;
877
  /// Flag to tell if secondary eNB has channel estimates to create NULL-beams from.
878
  unsigned char    has_valid_precoder;
879 880 881
  /// hold the precoder for NULL beam to the primary eNB
  int              **ul_precoder_S_UE;
  /// holds the maximum channel/precoder coefficient
882
  char             log2_maxp;
883

884 885 886
  /// if ==0 enables phy only test mode
  int mac_enabled;

887
  /// Flag to initialize averaging of PHY measurements
888
  int init_averaging;
889

890 891
  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
  /// - first index: ? [0..12*N_RB_DL[
892
  double *sinr_dB;
893

894 895
  /// \brief sinr for all subcarriers of first symbol for the CQI Calculation.
  /// - first index: ? [0..12*N_RB_DL[
896 897
  double *sinr_CQI_dB;

898 899 900
  /// sinr_effective used for CQI calulcation
  double sinr_eff;

901 902
  /// N0 (used for abstraction)
  double N0;
903

904 905 906 907 908
  /// PDSCH Varaibles
  PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX];

  /// PUSCH Varaibles
  PUSCH_CONFIG_DEDICATED pusch_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX];
909

910 911 912 913 914 915 916
  /// PUSCH contention-based access vars
  PUSCH_CA_CONFIG_DEDICATED  pusch_ca_config_dedicated[NUMBER_OF_eNB_MAX]; // lola

  /// PUCCH variables

  PUCCH_CONFIG_DEDICATED pucch_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX];

917
  uint8_t ncs_cell[20][7];
918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935

  /// UL-POWER-Control
  UL_POWER_CONTROL_DEDICATED ul_power_control_dedicated[NUMBER_OF_CONNECTED_eNB_MAX];

  /// TPC
  TPC_PDCCH_CONFIG tpc_pdcch_config_pucch[NUMBER_OF_CONNECTED_eNB_MAX];
  TPC_PDCCH_CONFIG tpc_pdcch_config_pusch[NUMBER_OF_CONNECTED_eNB_MAX];

  /// CQI reporting
  CQI_REPORT_CONFIG cqi_report_config[NUMBER_OF_CONNECTED_eNB_MAX];

  /// SRS Variables
  SOUNDINGRS_UL_CONFIG_DEDICATED soundingrs_ul_config_dedicated[NUMBER_OF_CONNECTED_eNB_MAX];

  /// Scheduling Request Config
  SCHEDULING_REQUEST_CONFIG scheduling_request_config[NUMBER_OF_CONNECTED_eNB_MAX];

  /// Transmission mode per eNB
936
  uint8_t transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX];
937

938
  time_stats_t phy_proc[RX_NB_TH];
939
  time_stats_t phy_proc_tx;
940
  time_stats_t phy_proc_rx[RX_NB_TH];
941

942 943
  uint32_t use_ia_receiver;

944 945 946 947 948 949 950 951 952
  time_stats_t ofdm_mod_stats;
  time_stats_t ulsch_encoding_stats;
  time_stats_t ulsch_modulation_stats;
  time_stats_t ulsch_segmentation_stats;
  time_stats_t ulsch_rate_matching_stats;
  time_stats_t ulsch_turbo_encoding_stats;
  time_stats_t ulsch_interleaving_stats;
  time_stats_t ulsch_multiplexing_stats;

hbilel's avatar
hbilel committed
953
  time_stats_t generic_stat;
954
  time_stats_t generic_stat_bis[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
955 956 957 958 959 960
  time_stats_t ue_front_end_stat[RX_NB_TH];
  time_stats_t ue_front_end_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
  time_stats_t pdcch_procedures_stat[RX_NB_TH];
  time_stats_t pdsch_procedures_stat[RX_NB_TH];
  time_stats_t pdsch_procedures_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
  time_stats_t dlsch_procedures_stat[RX_NB_TH];
hbilel's avatar
hbilel committed
961

962
  time_stats_t ofdm_demod_stats;
963
  time_stats_t dlsch_rx_pdcch_stats;
964 965 966
  time_stats_t rx_dft_stats;
  time_stats_t dlsch_channel_estimation_stats;
  time_stats_t dlsch_freq_offset_estimation_stats;
967
  time_stats_t dlsch_decoding_stats[2];
968 969 970 971
  time_stats_t dlsch_demodulation_stats;
  time_stats_t dlsch_rate_unmatching_stats;
  time_stats_t dlsch_turbo_decoding_stats;
  time_stats_t dlsch_deinterleaving_stats;
tct-labo4's avatar
tct-labo4 committed
972 973
  time_stats_t dlsch_llr_stats;
  time_stats_t dlsch_llr_stats_parallelization[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME];
974
  time_stats_t dlsch_unscrambling_stats;
Raymond Knopp's avatar
Raymond Knopp committed
975 976 977
  time_stats_t dlsch_rate_matching_stats;
  time_stats_t dlsch_turbo_encoding_stats;
  time_stats_t dlsch_interleaving_stats;
978 979 980 981 982 983 984
  time_stats_t dlsch_tc_init_stats;
  time_stats_t dlsch_tc_alpha_stats;
  time_stats_t dlsch_tc_beta_stats;
  time_stats_t dlsch_tc_gamma_stats;
  time_stats_t dlsch_tc_ext_stats;
  time_stats_t dlsch_tc_intl1_stats;
  time_stats_t dlsch_tc_intl2_stats;
985
  time_stats_t tx_prach;
986

Raymond Knopp's avatar
Raymond Knopp committed
987
  /// RF and Interface devices per CC
988
  openair0_device rfdevice;
989 990 991 992 993 994
  time_stats_t dlsch_encoding_SIC_stats;
  time_stats_t dlsch_scrambling_SIC_stats;
  time_stats_t dlsch_modulation_SIC_stats;
  time_stats_t dlsch_llr_stripping_unit_SIC_stats;
  time_stats_t dlsch_unscrambling_SIC_stats;

995
#if ENABLE_RAL
996 997 998 999
  hash_table_t    *ral_thresholds_timed;
  SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
  SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
#endif
Raymond Knopp's avatar
Raymond Knopp committed
1000

1001 1002
} PHY_VARS_UE;

1003 1004 1005 1006 1007 1008 1009 1010
/* this structure is used to pass both UE phy vars and
 * proc to the function UE_thread_rxn_txnp4
 */
struct rx_tx_thread_data {
  PHY_VARS_UE    *UE;
  UE_rxtx_proc_t *proc;
};

1011 1012
void exit_fun(const char* s);

1013
static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) {
1014 1015 1016 1017 1018 1019

  if (pthread_mutex_lock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
1020

1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034
  while (*instance_cnt < 0) {
    // most of the time the thread is waiting here
    // proc->instance_cnt_rxtx is -1
    pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again
  }

  if (pthread_mutex_unlock(mutex) != 0) {
    LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
  return(0);
}

1035
static inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) {
1036 1037 1038 1039 1040 1041

  if (pthread_mutex_lock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
1042

1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056
  while (*instance_cnt == 0) {
    // most of the time the thread will skip this
    // waits only if proc->instance_cnt_rxtx is 0
    pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again
  }

  if (pthread_mutex_unlock(mutex) != 0) {
    LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
  return(0);
}

1057
static inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) {
1058 1059 1060 1061 1062 1063

  if (pthread_mutex_lock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
1064

1065
  *instance_cnt=*instance_cnt-1;
1066

1067 1068 1069 1070 1071 1072 1073
  if (pthread_mutex_unlock(mutex) != 0) {
    LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for %s\n",name);
    exit_fun("nothing to add");
    return(-1);
  }
  return(0);
}
1074

1075 1076 1077 1078 1079 1080 1081 1082

#include "PHY/INIT/defs.h"
#include "PHY/LTE_REFSIG/defs.h"
#include "PHY/MODULATION/defs.h"
#include "PHY/LTE_TRANSPORT/proto.h"
#include "PHY/LTE_ESTIMATION/defs.h"

#include "SIMULATION/ETH_TRANSPORT/defs.h"
Laurent's avatar
Laurent committed
1083
#endif
1084
#endif //  __PHY_DEFS__H__