eNB_scheduler.c 20.7 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

gauthier's avatar
gauthier committed
128
    PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63; 
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

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

236
#if defined(ENABLE_ITTI)
237

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

242 243 244
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
245

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

251 252 253 254
      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);
255

256 257
        // TODO process BCCH data req.
        break;
258

259 260 261 262
      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);
263

264 265
        // TODO process CCCH data req.
        break;
266 267 268

#ifdef Rel10

269 270 271 272
      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);
273

274 275 276
        // TODO process MCCH data req.
        break;
#endif
277

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

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

288 289
#endif

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

295

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

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


knopp's avatar
 
knopp committed
304
  }
305

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

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

#ifdef Rel10
318 319

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

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

gauthier's avatar
gauthier committed
341
  switch (subframeP) {
342
  case 0:
343

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

knopp's avatar
knopp committed
348

349 350
    schedule_RA(module_idP,frameP,subframeP,2);

351 352

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

360 361
    schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
    fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
362

363 364 365
    break;

  case 1:
366

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

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

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

391
    break;
392 393

  case 2:
394

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

403 404 405
    break;

  case 3:
406

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

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

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

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

431
    break;
432 433

  case 4:
434

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

        // no break here!
      case 2:

        // no break here!
      case 4:

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

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

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

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

469 470 471 472 473 474 475
    break;

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

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

493 494 495
    break;

  case 6:
496

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

      case 1:
506
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
507 508
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
509 510 511
        break;

      case 6:
512
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
513 514
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
515 516 517
        break;

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

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

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

538
    break;
gauthier's avatar
gauthier committed
539

540
  case 7:
541

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

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

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

567 568 569
    break;

  case 8:
570

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

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

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

596 597 598
    break;

  case 9:
599

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

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

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

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

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

640
    break;
gauthier's avatar
gauthier committed
641

642
  }
643

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

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

650
  LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
651

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

655
}
656 657 658