eNB_scheduler.c 20.9 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
    PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63;
    if (i==UE_list->head)
      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]); 
131 132
    // increment this, it is cleared when we receive an sdu
    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;
133 134

    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].cqi_req_timer++;
135
    
136
    if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
137
      //      mac_remove_ue(module_idP, i, frameP, subframeP);
138
    }
139 140
    else {
      // check uplink failure
Florian Kaltenberger's avatar
Florian Kaltenberger committed
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 172 173 174 175 176
      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;
177
	    }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
	  }
	  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;
198
		break;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
199 200 201 202 203 204
	    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;
205 206
	    }
	  }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
207 208 209 210 211 212 213 214 215
	  
	  add_ue_spec_dci(DCI_pdu[CC_id],
			  DLSCH_dci,
			  rnti,
			    size_bytes,
			  process_ue_cqi (module_idP,i),//aggregation,
			  size_bits,
			  format1A,
			  0);
216
	}
Florian Kaltenberger's avatar
Florian Kaltenberger committed
217
	else { // ra_pdcch_sent==1
218
	  LOG_D(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);	    	    
Florian Kaltenberger's avatar
Florian Kaltenberger committed
219 220
	  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	      
221
	}
222 223 224 225 226 227 228 229 230 231
      
	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;
	}
Florian Kaltenberger's avatar
Florian Kaltenberger committed
232 233 234
      }
    } // ul_failure_timer>0
    
235
    i = next_i;
knopp's avatar
 
knopp committed
236
  }
237

238
#if defined(ENABLE_ITTI)
239

240
  do {
241 242
    // Checks if a message has been sent to MAC sub-task
    itti_poll_msg (TASK_MAC_ENB, &msg_p);
243

244 245 246
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
247

248 249 250 251
      switch (ITTI_MSG_ID(msg_p)) {
      case MESSAGE_TEST:
        LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p));
        break;
252

253 254 255 256
      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);
257

258 259
        // TODO process BCCH data req.
        break;
260

261 262 263 264
      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);
265

266 267
        // TODO process CCCH data req.
        break;
268 269 270

#ifdef Rel10

271 272 273 274
      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);
275

276 277 278
        // TODO process MCCH data req.
        break;
#endif
279

280 281 282
      default:
        LOG_E(MAC, "Received unexpected message %s\n", msg_name);
        break;
gauthier's avatar
gauthier committed
283
      }
284 285 286 287

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

290 291
#endif

gauthier's avatar
gauthier committed
292
  // clear DCI and BCCH contents before scheduling
293
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
knopp's avatar
 
knopp committed
294 295
    DCI_pdu[CC_id]->Num_common_dci  = 0;
    DCI_pdu[CC_id]->Num_ue_spec_dci = 0;
296

297

298
#ifdef Rel10
299
    eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0;
300
#endif
301

knopp's avatar
 
knopp committed
302 303
    eNB_mac_inst[module_idP].frame    = frameP;
    eNB_mac_inst[module_idP].subframe = subframeP;
304 305


knopp's avatar
 
knopp committed
306
  }
307

gauthier's avatar
gauthier committed
308
  //if (subframeP%5 == 0)
knopp's avatar
 
knopp committed
309
  //#ifdef EXMIMO
310
  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,module_idP);
311
  pdcp_run(&ctxt);
knopp's avatar
 
knopp committed
312
  //#endif
313

314
  // check HO
315 316
  rrc_rx_tx(&ctxt,
            0, // eNB index, unused in eNB
317
            CC_id);
318 319

#ifdef Rel10
320 321

  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
322 323 324 325
    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
326
    }
327
  }
328

329
#endif
knopp's avatar
 
knopp committed
330
  // refresh UE list based on UEs dropped by PHY in previous subframe
331
  /*
knopp's avatar
 
knopp committed
332 333 334
  i=UE_list->head;
  while (i>=0) {
    next_i = UE_list->next[i];
335
    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
336
    if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) {
knopp's avatar
 
knopp committed
337
      mac_remove_ue(module_idP,i,frameP);
knopp's avatar
 
knopp committed
338 339 340
    }
    i=next_i;
  }
341
  */
342

gauthier's avatar
gauthier committed
343
  switch (subframeP) {
344
  case 0:
345

346
    // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution)
gauthier's avatar
gauthier committed
347
    // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6)
348
    // Schedule Normal DLSCH
gauthier's avatar
gauthier committed
349

knopp's avatar
knopp committed
350

351 352
    schedule_RA(module_idP,frameP,subframeP,2);

353 354

    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
355
      schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag);
356 357 358
    } 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)) {
359
      //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
360
    }
361

362 363
    schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
    fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
364

365 366 367
    break;

  case 1:
368

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

      case 6:
380
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
381
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
382 383 384 385 386 387
        break;

      default:
        break;
      }
    } else { //FDD
388
      schedule_ulsch(module_idP,frameP,cooperation_flag,1,5);
389
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
390
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
391
    }
392

393
    break;
394 395

  case 2:
396

gauthier's avatar
gauthier committed
397
    // TDD, nothing
398 399
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
400
      schedule_ulsch(module_idP,frameP,cooperation_flag,2,6);
401
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
402
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
403
    }
404

405 406 407
    break;

  case 3:
408

gauthier's avatar
gauthier committed
409
    // TDD Config 2, ULSCH for subframeP 7
410 411 412
    // TDD Config 2/5 normal DLSCH
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
413 414
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
415
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
416 417 418

        // no break here!
      case 5:
419 420
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
421 422 423 424 425 426
        break;

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

428
      schedule_ulsch(module_idP,frameP,cooperation_flag,3,7);
429
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
430
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
431
    }
432

433
    break;
434 435

  case 4:
436

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

        // no break here!
      case 2:

        // no break here!
      case 4:

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

455 456
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
457 458 459 460 461 462 463 464
        break;

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

465
	schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8);
466
	schedule_ue_spec(module_idP, frameP, subframeP,  mbsfn_status);
467
        fill_DLSCH_dci(module_idP, frameP, subframeP,   mbsfn_status);
468
      }
469
    }
470

471 472 473 474 475 476 477
    break;

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

480
    //schedule_RA(module_idP,frameP,subframeP,5);
481
    if (mac_xface->lte_frame_parms->frame_type == FDD) {
482 483 484 485
      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);
486 487
    } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
               (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
488
      //schedule_ulsch(module_idP,cooperation_flag,subframeP);
489
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
490
    } else {
491 492
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
493
    }
494

495 496 497
    break;

  case 6:
498

499 500 501 502
    // 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
503 504 505 506 507
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
        break;

      case 1:
508
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
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 6:
514
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
515 516
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
517 518 519
        break;

      case 5:
520 521 522
        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);
523 524 525 526
        break;

      case 3:
      case 4:
527 528
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
529 530 531 532 533 534
        break;

      default:
        break;
      }
    } else { //FDD
535
      schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
536
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
537
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
538
    }
539

540
    break;
gauthier's avatar
gauthier committed
541

542
  case 7:
543

544 545 546
    // TDD Config 3,4,5 Normal DLSCH
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
547 548 549
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 3:
      case 4:
550 551 552
        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);
553 554 555
        break;

      case 5:
556 557
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
558 559 560 561 562 563
        break;

      default:
        break;
      }
    } else { //FDD
564
      schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
565
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
566
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
567
    }
568

569 570 571
    break;

  case 8:
572

gauthier's avatar
gauthier committed
573
    // TDD Config 2,3,4,5 ULSCH for subframeP 2
574 575 576
    //
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
577 578 579 580 581 582
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
      case 3:
      case 4:
      case 5:

583
        //  schedule_RA(module_idP,subframeP);
584
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
585 586
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
587 588 589 590 591 592
        break;

      default:
        break;
      }
    } else { //FDD
593
      schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
594
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
595
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
596
    }
597

598 599 600
    break;

  case 9:
601

602 603
    // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
604 605
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
606
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
607 608 609
        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);
610 611 612 613
        break;

      case 3:
      case 4:
614
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
615 616
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
617 618 619
        break;

      case 6:
620
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);
621 622 623
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
624 625 626 627
        break;

      case 2:
      case 5:
628 629 630
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
631 632 633 634 635 636
        break;

      default:
        break;
      }
    } else { //FDD
637
      schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
638
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
639
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
640
    }
641

642
    break;
gauthier's avatar
gauthier committed
643

644
  }
645

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

648
  // Allocate CCEs for good after scheduling is done
649 650
  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
    allocate_CCEs(module_idP,CC_id,subframeP,0);
651

652
  LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
653

654
  stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
gauthier's avatar
gauthier committed
655
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
656

657
}
658 659 660