eNB_scheduler.c 20.5 KB
Newer Older
1
/*******************************************************************************
nikaeinn's avatar
nikaeinn committed
2 3
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom
4

nikaeinn's avatar
nikaeinn 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


nikaeinn's avatar
nikaeinn 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

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

  Contact Information
nikaeinn's avatar
nikaeinn committed
22 23
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
24
  OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
nikaeinn's avatar
nikaeinn committed
25

ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27

nikaeinn's avatar
nikaeinn committed
28
*******************************************************************************/
29
/*! \file eNB_scheduler.c
nikaeinn's avatar
nikaeinn committed
30
 * \brief eNB scheduler top level function operates on per subframe basis
31 32
 * \author  Navid Nikaein and Raymond Knopp
 * \date 2010 - 2014
33
 * \email: navid.nikaein@eurecom.fr
34 35
 * \version 0.5
 * @ingroup _mac
36

37
 */
38

39
#include "assertions.h"
40 41 42 43 44 45 46 47
#include "PHY/defs.h"
#include "PHY/extern.h"

#include "SCHED/defs.h"
#include "SCHED/extern.h"

#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
gauthier's avatar
gauthier committed
48

49 50 51 52 53 54
#include "LAYER2/MAC/proto.h"
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
#include "OCG.h"
#include "OCG_extern.h"
gauthier's avatar
gauthier committed
55

56 57
#include "RRC/LITE/extern.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
gauthier's avatar
gauthier committed
58

59 60
//#include "LAYER2/MAC/pre_processor.c"
#include "pdcp.h"
61

62 63
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
64 65
#endif

66 67 68 69
#define ENABLE_MAC_PAYLOAD_DEBUG
#define DEBUG_eNB_SCHEDULER 1
//#define DEBUG_HEADER_PARSING 1
//#define DEBUG_PACKET_TRACE 1
gauthier's avatar
gauthier committed
70

71 72 73 74 75
/*
  #ifndef USER_MODE
  #define msg debug_msg
  #endif
 */
gauthier's avatar
gauthier committed
76 77 78



79

80 81 82



83 84
void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP)  //, int calibration_flag) {
{
85

knopp's avatar
 
knopp committed
86
  int mbsfn_status[MAX_NUM_CCs];
87
  protocol_ctxt_t   ctxt;
88
#ifdef EXMIMO
89
  int ret;
90
#endif
91
#if defined(ENABLE_ITTI)
92
  MessageDef   *msg_p;
93
  const char         *msg_name;
94 95
  instance_t    instance;
  int           result;
96
#endif
knopp's avatar
 
knopp committed
97
  DCI_PDU *DCI_pdu[MAX_NUM_CCs];
knopp's avatar
 
knopp committed
98
  int CC_id,i,next_i;
knopp's avatar
 
knopp committed
99
  UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list;
100
  rnti_t rnti;
101 102
  void         *DLSCH_dci=NULL;
  int size_bits,size_bytes;
103

104
  LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler (UE_list->head %d)\n",module_idP, frameP, subframeP,UE_list->head);
105

106
  start_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
gauthier's avatar
gauthier committed
107
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_IN);
108

109
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
knopp's avatar
 
knopp committed
110
    DCI_pdu[CC_id] = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
111 112
    DCI_pdu[CC_id]->nCCE=0;
    DCI_pdu[CC_id]->num_pdcch_symbols=1;
knopp's avatar
 
knopp committed
113
    mbsfn_status[CC_id]=0;
114 115
    // clear vrb_map
    memset(eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map,0,100);
knopp's avatar
 
knopp committed
116
  }
117

knopp's avatar
 
knopp committed
118
  // refresh UE list based on UEs dropped by PHY in previous subframe
119 120 121
  i = UE_list->head;

  while (i>=0) {
122 123 124 125
    rnti = UE_RNTI(module_idP, i);
    CC_id = UE_PCCID(module_idP, i);
    LOG_D(MAC,"UE %d: rnti %x (%p)\n", i, rnti,
          mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti));
126
    next_i= UE_list->next[i];
127

128 129 130
    // increment this, it is cleared when we receive an sdu
    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;

131 132
    if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
      mac_remove_ue(module_idP, i, frameP, subframeP);
133
    }
134 135
    else {
      // check uplink failure
Florian Kaltenberger's avatar
Florian Kaltenberger committed
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
      if ((UE_list->UE_sched_ctrl[i].ul_failure_timer>0)&&
	  (UE_list->UE_sched_ctrl[i].ul_out_of_sync==0)) {
	LOG_D(MAC,"UE %d rnti %x: UL Failure timer %d \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
	if (UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent==0) {
	  UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=1;
	  
	  // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
	  LOG_I(MAC,"UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);	    
	  DLSCH_dci = (void *)UE_list->UE_template[CC_id][i].DLSCH_DCI[0];
	  *(uint32_t*)DLSCH_dci = 0;
	  if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
	    switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
	    case 6:
	      ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 31;
	      size_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
	      break;
	    case 25:
	      ((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 511;
	      size_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_5MHz_TDD_1_6_t;
	      break;
	    case 50:
	      ((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 2047;
	      size_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_10MHz_TDD_1_6_t;
	      break;
	    case 100:
	      ((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 8191;
	      size_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_20MHz_TDD_1_6_t;
	      break;
172
	    }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
	  }
	  else { // FDD
	    switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
	    case 6:
	      ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31;
	      size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_1_5MHz_FDD_t;
	      break;
	    case 25:
	      ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->rballoc = 511;
	      size_bytes = sizeof(DCI1A_5MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_5MHz_FDD_t;
	      break;
	    case 50:
	      ((DCI1A_10MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_10MHz_FDD_t*)DLSCH_dci)->rballoc = 2047;
	      size_bytes = sizeof(DCI1A_10MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_10MHz_FDD_t;
193
		break;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
194 195 196 197 198 199
	    case 100:
	      ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->rballoc = 8191;
	      size_bytes = sizeof(DCI1A_20MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_20MHz_FDD_t;
	      break;
200 201
	    }
	  }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
202 203 204 205 206 207 208 209 210
	  
	  add_ue_spec_dci(DCI_pdu[CC_id],
			  DLSCH_dci,
			  rnti,
			    size_bytes,
			  process_ue_cqi (module_idP,i),//aggregation,
			  size_bits,
			  format1A,
			  0);
211
	}
Florian Kaltenberger's avatar
Florian Kaltenberger committed
212 213 214 215
	else { // ra_pdcch_sent==1
	  LOG_I(MAC,"UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);	    	    
	  if ((UE_list->UE_sched_ctrl[i].ul_failure_timer % 40) == 0)
	    UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=0; // resend every 4 frames	      
216
	}
Florian Kaltenberger's avatar
Florian Kaltenberger committed
217 218 219 220 221 222 223 224 225 226 227 228
      }
      UE_list->UE_sched_ctrl[i].ul_failure_timer++;
      // check threshold
      if (UE_list->UE_sched_ctrl[i].ul_failure_timer > 200) {
	// inform RRC of failure and clear timer
	LOG_I(MAC,"UE %d rnti %x: UL Failure Triggering RRC \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
	mac_eNB_rrc_ul_failure(module_idP,CC_id,frameP,subframeP,rnti);
	UE_list->UE_sched_ctrl[i].ul_failure_timer=0;
	UE_list->UE_sched_ctrl[i].ul_out_of_sync=1;
      }
    } // ul_failure_timer>0
    
229
    i = next_i;
knopp's avatar
 
knopp committed
230
  }
231

232
#if defined(ENABLE_ITTI)
233

234
  do {
235 236
    // Checks if a message has been sent to MAC sub-task
    itti_poll_msg (TASK_MAC_ENB, &msg_p);
237

238 239 240
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
241

242 243 244 245
      switch (ITTI_MSG_ID(msg_p)) {
      case MESSAGE_TEST:
        LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p));
        break;
246

247 248 249 250
      case RRC_MAC_BCCH_DATA_REQ:
        LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n",
              msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance,
              RRC_MAC_BCCH_DATA_REQ (msg_p).frame, RRC_MAC_BCCH_DATA_REQ (msg_p).enb_index);
251

252 253
        // TODO process BCCH data req.
        break;
254

255 256 257 258
      case RRC_MAC_CCCH_DATA_REQ:
        LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n",
              msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance,
              RRC_MAC_CCCH_DATA_REQ (msg_p).frame, RRC_MAC_CCCH_DATA_REQ (msg_p).enb_index);
259

260 261
        // TODO process CCCH data req.
        break;
262 263 264

#ifdef Rel10

265 266 267 268
      case RRC_MAC_MCCH_DATA_REQ:
        LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d, mbsfn_sync_area %d\n",
              msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance,
              RRC_MAC_MCCH_DATA_REQ (msg_p).frame, RRC_MAC_MCCH_DATA_REQ (msg_p).enb_index, RRC_MAC_MCCH_DATA_REQ (msg_p).mbsfn_sync_area);
269

270 271 272
        // TODO process MCCH data req.
        break;
#endif
273

274 275 276
      default:
        LOG_E(MAC, "Received unexpected message %s\n", msg_name);
        break;
gauthier's avatar
gauthier committed
277
      }
278 279 280 281

      result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
      AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
    }
282
  } while(msg_p != NULL);
283

284 285
#endif

gauthier's avatar
gauthier committed
286
  // clear DCI and BCCH contents before scheduling
287
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
knopp's avatar
 
knopp committed
288 289
    DCI_pdu[CC_id]->Num_common_dci  = 0;
    DCI_pdu[CC_id]->Num_ue_spec_dci = 0;
290

291

292
#ifdef Rel10
293
    eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0;
294
#endif
295

knopp's avatar
 
knopp committed
296 297
    eNB_mac_inst[module_idP].frame    = frameP;
    eNB_mac_inst[module_idP].subframe = subframeP;
298 299


knopp's avatar
 
knopp committed
300
  }
301

gauthier's avatar
gauthier committed
302
  //if (subframeP%5 == 0)
knopp's avatar
 
knopp committed
303
  //#ifdef EXMIMO
304
  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,module_idP);
305
  pdcp_run(&ctxt);
knopp's avatar
 
knopp committed
306
  //#endif
307

308
  // check HO
309 310
  rrc_rx_tx(&ctxt,
            0, // eNB index, unused in eNB
311
            CC_id);
312 313

#ifdef Rel10
314 315

  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
316 317 318 319
    if (eNB_mac_inst[module_idP].common_channels[CC_id].MBMS_flag >0) {
      start_meas(&eNB_mac_inst[module_idP].schedule_mch);
      mbsfn_status[CC_id] = schedule_MBMS(module_idP,CC_id,frameP,subframeP);
      stop_meas(&eNB_mac_inst[module_idP].schedule_mch);
knopp's avatar
 
knopp committed
320
    }
321
  }
322

323
#endif
knopp's avatar
 
knopp committed
324
  // refresh UE list based on UEs dropped by PHY in previous subframe
325
  /*
knopp's avatar
 
knopp committed
326 327 328
  i=UE_list->head;
  while (i>=0) {
    next_i = UE_list->next[i];
329
    LOG_T(MAC,"UE %d : rnti %x, stats %p\n",i,UE_RNTI(module_idP,i),mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i)));
knopp's avatar
 
knopp committed
330
    if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) {
knopp's avatar
 
knopp committed
331
      mac_remove_ue(module_idP,i,frameP);
knopp's avatar
 
knopp committed
332 333 334
    }
    i=next_i;
  }
335
  */
336

gauthier's avatar
gauthier committed
337
  switch (subframeP) {
338
  case 0:
339

340
    // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution)
gauthier's avatar
gauthier committed
341
    // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6)
342
    // Schedule Normal DLSCH
gauthier's avatar
gauthier committed
343

knopp's avatar
knopp committed
344

345 346
    schedule_RA(module_idP,frameP,subframeP,2);

347 348

    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
349
      schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag);
350 351 352
    } else if  ((mac_xface->lte_frame_parms->tdd_config == TDD) || //TDD
                (mac_xface->lte_frame_parms->tdd_config == 3) ||
                (mac_xface->lte_frame_parms->tdd_config == 6)) {
353
      //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
354
    }
355

356 357
    schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
    fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
358

359 360 361
    break;

  case 1:
362

gauthier's avatar
gauthier committed
363
    // TDD, schedule UL for subframeP 7 (TDD config 0,1) / subframeP 8 (TDD Config 6)
364 365
    // FDD, schedule normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
366 367 368
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
      case 1:
369
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
370
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
371 372 373
        break;

      case 6:
374
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
375
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
376 377 378 379 380 381
        break;

      default:
        break;
      }
    } else { //FDD
382
      schedule_ulsch(module_idP,frameP,cooperation_flag,1,5);
383
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
384
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
385
    }
386

387
    break;
388 389

  case 2:
390

gauthier's avatar
gauthier committed
391
    // TDD, nothing
392 393
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
394
      schedule_ulsch(module_idP,frameP,cooperation_flag,2,6);
395
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
396
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
397
    }
398

399 400 401
    break;

  case 3:
402

gauthier's avatar
gauthier committed
403
    // TDD Config 2, ULSCH for subframeP 7
404 405 406
    // TDD Config 2/5 normal DLSCH
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
407 408
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
409
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
410 411 412

        // no break here!
      case 5:
413 414
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
415 416 417 418 419 420
        break;

      default:
        break;
      }
    } else { //FDD
421

422
      schedule_ulsch(module_idP,frameP,cooperation_flag,3,7);
423
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
424
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
425
    }
426

427
    break;
428 429

  case 4:
430

gauthier's avatar
gauthier committed
431
    // TDD Config 1, ULSCH for subframeP 8
432 433 434
    // TDD Config 1/2/4/5 DLSCH
    // FDD UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD
435 436
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
437
        //        schedule_RA(module_idP,frameP,subframeP);
438
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
439 440 441 442 443 444 445 446 447

        // no break here!
      case 2:

        // no break here!
      case 4:

        // no break here!
      case 5:
knopp's avatar
knopp committed
448

449 450
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
451 452 453 454 455 456 457 458
        break;

      default:
        break;
      }
    } else {
      if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD

459
	schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8);
460
	schedule_ue_spec(module_idP, frameP, subframeP,  mbsfn_status);
461
        fill_DLSCH_dci(module_idP, frameP, subframeP,   mbsfn_status);
462
      }
463
    }
464

465 466 467 468 469 470 471
    break;

  case 5:
    // TDD/FDD Schedule SI
    // TDD Config 0,6 ULSCH for subframes 9,3 resp.
    // TDD normal DLSCH
    // FDD normal UL/DLSCH
472
    schedule_SI(module_idP,frameP,subframeP);
473

474
    //schedule_RA(module_idP,frameP,subframeP,5);
475
    if (mac_xface->lte_frame_parms->frame_type == FDD) {
476 477 478 479
      schedule_RA(module_idP,frameP,subframeP,1);
      schedule_ulsch(module_idP,frameP,cooperation_flag,5,9);
      schedule_ue_spec(module_idP, frameP, subframeP,  mbsfn_status);
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
480 481
    } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
               (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
482
      //schedule_ulsch(module_idP,cooperation_flag,subframeP);
483
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
484
    } else {
485 486
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
487
    }
488

489 490 491
    break;

  case 6:
492

493 494 495 496
    // TDD Config 0,1,6 ULSCH for subframes 2,3
    // TDD Config 3,4,5 Normal DLSCH
    // FDD normal ULSCH/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
497 498 499 500 501
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
        break;

      case 1:
502
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
503 504
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
505 506 507
        break;

      case 6:
508
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
509 510
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
511 512 513
        break;

      case 5:
514 515 516
        schedule_RA(module_idP,frameP,subframeP,2);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
517 518 519 520
        break;

      case 3:
      case 4:
521 522
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
523 524 525 526 527 528
        break;

      default:
        break;
      }
    } else { //FDD
529
      schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
530
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
531
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
532
    }
533

534
    break;
gauthier's avatar
gauthier committed
535

536
  case 7:
537

538 539 540
    // TDD Config 3,4,5 Normal DLSCH
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
541 542 543
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 3:
      case 4:
544 545 546
        schedule_RA(module_idP,frameP,subframeP,3);  // 3 = Msg3 subframeP, not
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
547 548 549
        break;

      case 5:
550 551
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
552 553 554 555 556 557
        break;

      default:
        break;
      }
    } else { //FDD
558
      schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
559
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
560
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
561
    }
562

563 564 565
    break;

  case 8:
566

gauthier's avatar
gauthier committed
567
    // TDD Config 2,3,4,5 ULSCH for subframeP 2
568 569 570
    //
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
571 572 573 574 575 576
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
      case 3:
      case 4:
      case 5:

577
        //  schedule_RA(module_idP,subframeP);
578
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
579 580
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
581 582 583 584 585 586
        break;

      default:
        break;
      }
    } else { //FDD
587
      schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
588
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
589
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
590
    }
591

592 593 594
    break;

  case 9:
595

596 597
    // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
598 599
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
600
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
601 602 603
        schedule_RA(module_idP,frameP,subframeP,7);  // 7 = Msg3 subframeP, not
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
604 605 606 607
        break;

      case 3:
      case 4:
608
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
609 610
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
611 612 613
        break;

      case 6:
614
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);
615 616 617
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
618 619 620 621
        break;

      case 2:
      case 5:
622 623 624
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
625 626 627 628 629 630
        break;

      default:
        break;
      }
    } else { //FDD
631
      schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
632
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
633
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
634
    }
635

636
    break;
gauthier's avatar
gauthier committed
637

638
  }
639

640
  LOG_D(MAC,"FrameP %d, subframeP %d : Scheduling CCEs\n",frameP,subframeP);
641

642
  // Allocate CCEs for good after scheduling is done
643 644
  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
    allocate_CCEs(module_idP,CC_id,subframeP,0);
645

646
  LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
647

648
  stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
gauthier's avatar
gauthier committed
649
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
650

651
}
652 653 654