fapi_l1.c 49.2 KB
Newer Older
1 2 3 4 5
/*
 * 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
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 * 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
 */

/*! \file fapi_l1.c
 * \brief functions for FAPI L1 interface
 * \author R. Knopp
 * \date 2017
 * \version 0.1
 * \company Eurecom
 * \email: knopp@eurecom.fr
 * \note
 * \warning
 */

33 34 35 36
#include "PHY/defs_eNB.h"
#include "PHY/LTE_TRANSPORT/transport_proto.h"
#include "SCHED/sched_eNB.h"

37
#include "nfapi_interface.h"
38
#include "nfapi_pnf_interface.h"
39 40
#include "fapi_l1.h"

41 42 43 44 45 46 47 48
int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req);
int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req);
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req);
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req);

extern uint8_t nfapi_mode;


Cedric Roux's avatar
Cedric Roux committed
49
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
50
                             int frame, int subframe,
51
                             L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
52 53
                             nfapi_dl_config_request_pdu_t *dl_config_pdu)
{
54
  int idx                         = subframe&1;
55 56 57
  LTE_eNB_PDCCH *pdcch_vars       = &eNB->pdcch_vars[idx];
  nfapi_dl_config_dci_dl_pdu *pdu = &dl_config_pdu->dci_dl_pdu;

58
  LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populating pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",frame,subframe, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci);
59 60

  // copy dci configuration into eNB structure
61 62 63
  fill_dci_and_dlsch(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],pdu);

  LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->subframe_tx, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci);
64 65
}

66
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
67

Cedric Roux's avatar
Cedric Roux committed
68
void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
69
                             L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
70 71 72
                             nfapi_dl_config_request_pdu_t *dl_config_pdu)
{
  int idx                         = proc->subframe_tx&1;
73 74 75
  LTE_eNB_MPDCCH *mpdcch_vars     = &eNB->mpdcch_vars[idx];
  nfapi_dl_config_mpdcch_pdu *pdu = &dl_config_pdu->mpdcch_pdu;

Raymond Knopp's avatar
Raymond Knopp committed
76
  LOG_I(PHY,"Frame %d, Subframe %d: MDCI processing\n",proc->frame_tx,proc->subframe_tx);
77 78 79 80 81

  // copy dci configuration into eNB structure
  fill_mdci_and_dlsch(eNB,proc,&mpdcch_vars->mdci_alloc[mpdcch_vars->num_dci],pdu);
}

82
#endif
83

84
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
85 86
                                  nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
{
87
  int idx                         = subframe&1;
88
  LTE_eNB_PDCCH *pdcch_vars       = &eNB->pdcch_vars[idx];
89 90 91

  //LOG_D(PHY,"%s() SFN/SF:%04d%d Before num_dci:%d\n", __FUNCTION__,frame,subframe,pdcch_vars->num_dci);

92
  // copy dci configuration in to eNB structure
93
  fill_dci0(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->dci_pdu);
94 95
}

96

97 98

void handle_nfapi_hi_dci0_mpdcch_dci_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
sharma's avatar
sharma committed
99 100 101
					 nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
{
  int idx                         = proc->subframe_tx&1;
102
  LTE_eNB_MPDCCH *pdcch_vars      = &eNB->mpdcch_vars[idx];
sharma's avatar
sharma committed
103
  // copy dci configuration in to eNB structure
104
  fill_mpdcch_dci0(eNB,proc,&pdcch_vars->mdci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->dci_pdu);
sharma's avatar
sharma committed
105 106
}

107

108
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
109 110
                                 nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu)
{
111
  LTE_eNB_PHICH *phich = &eNB->phich_vars[subframe&1];
112 113

  // copy dci configuration in to eNB structure
114
  LOG_D(PHY,"Received HI PDU with value %d (rbstart %d,cshift %d)\n",
Cedric Roux's avatar
Cedric Roux committed
115 116 117
        hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value,
        hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start,
        hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms);
118

119
  // DJP - TODO FIXME - transmission power ignored
120 121 122 123 124 125 126
  phich->config[phich->num_hi].hi       = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value;
  phich->config[phich->num_hi].first_rb = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start;
  phich->config[phich->num_hi].n_DMRS   = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms;
  phich->num_hi++;
  AssertFatal(phich->num_hi<32,"Maximum number of phich reached in subframe\n");
}

127
void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
128 129 130
                          nfapi_dl_config_request_pdu_t *dl_config_pdu,
                          uint8_t *sdu)
{
131
  nfapi_dl_config_bch_pdu_rel8_t *rel8 = &dl_config_pdu->bch_pdu.bch_pdu_rel8;
Cedric Roux's avatar
Cedric Roux committed
132

133 134
  AssertFatal(rel8->length == 3, "BCH PDU has length %d != 3\n",rel8->length);

135
  //LOG_D(PHY,"bch_pdu: %x,%x,%x\n",sdu[0],sdu[1],sdu[2]);
136 137 138 139 140 141 142
  eNB->pbch_pdu[0] = sdu[2];
  eNB->pbch_pdu[1] = sdu[1];
  eNB->pbch_pdu[2] = sdu[0];

  // adjust transmit amplitude here based on NFAPI info
}

143
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
144 145 146 147 148 149 150 151 152 153
extern uint32_t localRIV2alloc_LUT6[32];
extern uint32_t localRIV2alloc_LUT25[512];
extern uint32_t localRIV2alloc_LUT50_0[1600];
extern uint32_t localRIV2alloc_LUT50_1[1600];
extern uint32_t localRIV2alloc_LUT100_0[6000];
extern uint32_t localRIV2alloc_LUT100_1[6000];
extern uint32_t localRIV2alloc_LUT100_2[6000];
extern uint32_t localRIV2alloc_LUT100_3[6000];
#endif

154
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
155 156 157 158
                            nfapi_dl_config_request_pdu_t *dl_config_pdu,
                            uint8_t codeword_index,
                            uint8_t *sdu)
{
159
  nfapi_dl_config_dlsch_pdu_rel8_t *rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8;
160
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
161 162
  nfapi_dl_config_dlsch_pdu_rel10_t *rel10 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10;
#endif
163
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
164 165 166 167 168 169 170 171
  nfapi_dl_config_dlsch_pdu_rel13_t *rel13 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13;
#endif
  LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
  LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
  int UE_id;
  int harq_pid;

  UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
172 173 174 175 176 177
  if( (UE_id<0) || (UE_id>=NUMBER_OF_UE_MAX) ){
    LOG_E(PHY,"illegal UE_id found!!! rnti %04x UE_id %d\n",rel8->rnti,UE_id);
    return;
  }
  //AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
  //AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
Cedric Roux's avatar
Cedric Roux committed
178

179 180 181
  dlsch0 = eNB->dlsch[UE_id][0];
  dlsch1 = eNB->dlsch[UE_id][1];

182
#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0))
Wang Tsu-Han's avatar
Wang Tsu-Han committed
183
  if ((rel13->pdsch_payload_type < 2) && (rel13->ue_type>0)) dlsch0->harq_ids[frame%2][subframe] = 0;
184 185
#endif

Wang Tsu-Han's avatar
Wang Tsu-Han committed
186
  harq_pid        = dlsch0->harq_ids[frame%2][subframe];
187 188 189 190
  AssertFatal((harq_pid>=0) && (harq_pid<8),"harq_pid %d not in 0...7 frame:%d subframe:%d subframe(TX):%d rnti:%x UE_id:%d dlsch0[harq_ids:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d]\n",
      harq_pid,
      frame,subframe,
      proc->subframe_tx,rel8->rnti,UE_id,
Wang Tsu-Han's avatar
Wang Tsu-Han committed
191 192 193 194 195 196 197 198 199 200
      dlsch0->harq_ids[frame%2][0],
      dlsch0->harq_ids[frame%2][1],
      dlsch0->harq_ids[frame%2][2],
      dlsch0->harq_ids[frame%2][3],
      dlsch0->harq_ids[frame%2][4],
      dlsch0->harq_ids[frame%2][5],
      dlsch0->harq_ids[frame%2][6],
      dlsch0->harq_ids[frame%2][7],
      dlsch0->harq_ids[frame%2][8],
      dlsch0->harq_ids[frame%2][9]
201
      );
202 203 204 205
  dlsch0_harq     = dlsch0->harq_processes[harq_pid];
  dlsch1_harq     = dlsch1->harq_processes[harq_pid];
  AssertFatal(dlsch0_harq!=NULL,"dlsch_harq is null\n");

206 207 208
  // compute DL power control parameters
  eNB->pdsch_config_dedicated[UE_id].p_a = rel8->pa;

209
#ifdef PHY_TX_THREAD 
Wang Tsu-Han's avatar
Wang Tsu-Han committed
210 211
  if (dlsch0->active[proc->subframe_tx]){
# else
212
  if (dlsch0->active){
Wang Tsu-Han's avatar
Wang Tsu-Han committed
213
#endif
214 215
    computeRhoA_eNB(rel8->pa, dlsch0,dlsch0_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
    computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch0,dlsch0_harq->dl_power_off);
216
  }
Wang Tsu-Han's avatar
Wang Tsu-Han committed
217 218 219
#ifdef PHY_TX_THREAD
  if (dlsch1->active[proc->subframe_tx]){
#else
220
  if (dlsch1->active){
Wang Tsu-Han's avatar
Wang Tsu-Han committed
221
#endif
222 223
    computeRhoA_eNB(rel8->pa, dlsch1,dlsch1_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
    computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off);
224 225
  }

226
  dlsch0_harq->pdsch_start = eNB->pdcch_vars[subframe & 1].num_pdcch_symbols;
227 228

  if (dlsch0_harq->round==0) {  //get pointer to SDU if this a new SDU
Wang Tsu-Han's avatar
Wang Tsu-Han committed
229 230 231 232 233 234 235 236 237 238 239
    if(sdu == NULL) {
      LOG_E(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n",
            frame,subframe,
            proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
            dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start);
      return;
    }
    //AssertFatal(sdu!=NULL,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n",
    //            frame,subframe,
    //            proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
    //            dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start);
240 241
    if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n",
                                    frame,subframe,proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid);
242 243 244
    if (codeword_index == 0) dlsch0_harq->pdu                    = sdu;
    else                     dlsch1_harq->pdu                    = sdu;
  }
245
  else {
246 247
    if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round %d, rnti %x, UE_id %d, harq_pid %d\n",
                                    frame,subframe,proc->frame_tx,proc->subframe_tx,dlsch0_harq->round,
Cedric Roux's avatar
Cedric Roux committed
248
                                    rel8->rnti,UE_id,harq_pid);
249
  }
Cedric Roux's avatar
Cedric Roux committed
250

251
#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0))
Wang Tsu-Han's avatar
Wang Tsu-Han committed
252 253 254
#ifdef PHY_TX_THREAD
  dlsch0_harq->sib1_br_flag=0;
#else
255
  dlsch0->sib1_br_flag=0;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
256
#endif
257 258

  if ((rel13->pdsch_payload_type <2) && (rel13->ue_type>0)) { // this is a BR/CE UE and SIB1-BR/SI-BR
259
    UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
260 261 262 263 264 265 266
    AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
    AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
 
    dlsch0 = eNB->dlsch[UE_id][0];
    dlsch0->harq_mask = 1; 
    dlsch0_harq     = dlsch0->harq_processes[0];
    dlsch0_harq->pdu                    = sdu;
Raymond Knopp's avatar
Raymond Knopp committed
267

Raymond Knopp's avatar
Raymond Knopp committed
268
    if (proc->frame_tx < 200) LOG_D(PHY,"NFAPI: frame %d, subframe %d: Programming SI-BR (%d) => %d\n",proc->frame_tx,proc->subframe_tx,rel13->pdsch_payload_type,UE_id);
269
 
270 271
    dlsch0->rnti             = 0xFFFF;
    dlsch0->Kmimo            = 1;
Cedric Roux's avatar
Cedric Roux committed
272
    dlsch0->Mdlharq          = 4;
273 274 275 276
    dlsch0->Nsoft            = 25344;

    dlsch0->i0               = rel13->initial_transmission_sf_io;
    dlsch0_harq->pdsch_start = rel10->pdsch_start;
277
    dlsch0->harq_ids[frame%2][proc->subframe_tx] = 0;
Raymond Knopp's avatar
Raymond Knopp committed
278 279
    dlsch0_harq->frame       = proc->frame_tx;
    dlsch0_harq->subframe    = proc->subframe_tx;
280

281

Wang Tsu-Han's avatar
Wang Tsu-Han committed
282 283 284
#ifdef PHY_TX_THREAD
    if (rel13->pdsch_payload_type == 0) dlsch0_harq->sib1_br_flag=1;
#else
285
    if (rel13->pdsch_payload_type == 0) dlsch0->sib1_br_flag=1;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
286
#endif
287

288
     // configure PDSCH
289 290 291 292 293 294 295 296 297 298
    switch (eNB->frame_parms.N_RB_DL) {
    case 6:
      dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT6[rel8->resource_block_coding];
      break;
    case 15:
      AssertFatal(1==0,"15 PRBs not supported for now\n");
      break;
    case 25:
      dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT25[rel8->resource_block_coding];
      break;
Cedric Roux's avatar
Cedric Roux committed
299
    case 50:
300 301 302 303 304 305 306 307 308 309 310 311 312
      dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT50_0[rel8->resource_block_coding];
      dlsch0_harq->rb_alloc[1]      = localRIV2alloc_LUT50_1[rel8->resource_block_coding];
      break;
    case 75:
      AssertFatal(1==0,"75 PRBs not supported for now\n");
      break;
    case 100:
      dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT100_0[rel8->resource_block_coding];
      dlsch0_harq->rb_alloc[1]      = localRIV2alloc_LUT100_1[rel8->resource_block_coding];
      dlsch0_harq->rb_alloc[2]      = localRIV2alloc_LUT100_2[rel8->resource_block_coding];
      dlsch0_harq->rb_alloc[3]      = localRIV2alloc_LUT100_3[rel8->resource_block_coding];
    }

Wang Tsu-Han's avatar
Wang Tsu-Han committed
313 314 315
#ifdef PHY_TX_THREAD
    dlsch0->active[proc->subframe_tx]= 1;
#else
316
    dlsch0->active                  = 1;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
317
#endif
Cedric Roux's avatar
Cedric Roux committed
318 319

    dlsch0_harq->nb_rb              = 6;
320 321 322 323 324 325 326 327 328 329
    dlsch0_harq->vrb_type           = LOCALIZED;
    dlsch0_harq->rvidx              = rel8->redundancy_version;
    dlsch0_harq->Nl                 = 1;
    dlsch0_harq->mimo_mode          = (eNB->frame_parms.nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
    dlsch0_harq->dl_power_off       = 1;
    dlsch0_harq->round              = 0;
    dlsch0_harq->status             = ACTIVE;
    dlsch0_harq->TBS                = rel8->length<<3;
    dlsch0_harq->Qm                 = rel8->modulation;
    dlsch0_harq->codeword           = 0;
330
    dlsch0_harq->pdsch_start        = rel10->pdsch_start;
331
  }
332 333 334 335 336 337 338 339 340 341
  else
#endif
  { 
    UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
    AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
    AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);

    dlsch0 = eNB->dlsch[UE_id][0];
    dlsch1 = eNB->dlsch[UE_id][1];

342
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
343
    dlsch0->sib1_br_flag=0;
344 345 346
    dlsch0->i0               = 0xFFFF;
#endif

347
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
348
  LOG_D(PHY,"dlsch->i0:%04x dlsch0_harq[pdsch_start:%d nb_rb:%d vrb_type:%d rvidx:%d Nl:%d mimo_mode:%d dl_power_off:%d round:%d status:%d TBS:%d Qm:%d codeword:%d rb_alloc:%d] rel8[length:%d]\n", 
Wang Tsu-Han's avatar
Wang Tsu-Han committed
349 350 351
#ifdef PHY_TX_THREAD
      dlsch0_harq->i0,
#else
352
      dlsch0->i0, 
Wang Tsu-Han's avatar
Wang Tsu-Han committed
353
#endif
354 355 356
      dlsch0_harq->pdsch_start, dlsch0_harq->nb_rb, dlsch0_harq->vrb_type, dlsch0_harq->rvidx, dlsch0_harq->Nl, dlsch0_harq->mimo_mode, dlsch0_harq->dl_power_off, dlsch0_harq->round, dlsch0_harq->status, dlsch0_harq->TBS, dlsch0_harq->Qm, dlsch0_harq->codeword, dlsch0_harq->rb_alloc[0],
      rel8->length
      );
357 358 359 360 361 362
#else
  LOG_D(PHY,"dlsch0_harq[pdsch_start:%d nb_rb:%d vrb_type:%d rvidx:%d Nl:%d mimo_mode:%d dl_power_off:%d round:%d status:%d TBS:%d Qm:%d codeword:%d rb_alloc:%d] rel8[length:%d]\n", 
      dlsch0_harq->pdsch_start, dlsch0_harq->nb_rb, dlsch0_harq->vrb_type, dlsch0_harq->rvidx, dlsch0_harq->Nl, dlsch0_harq->mimo_mode, dlsch0_harq->dl_power_off, dlsch0_harq->round, dlsch0_harq->status, dlsch0_harq->TBS, dlsch0_harq->Qm, dlsch0_harq->codeword, dlsch0_harq->rb_alloc[0],
      rel8->length
      );
#endif
363

364
    dlsch0->active = 1;
365
    harq_pid        = dlsch0->harq_ids[frame%2][proc->subframe_tx];
366 367
    dlsch0->harq_mask |= (1<<harq_pid);

sharma's avatar
sharma committed
368
    AssertFatal((harq_pid>=0) && (harq_pid<8),"subframe %d: harq_pid %d not in 0...7\n",proc->subframe_tx,harq_pid);
369 370 371 372 373
    dlsch0_harq     = dlsch0->harq_processes[harq_pid];
    dlsch1_harq     = dlsch1->harq_processes[harq_pid];
    AssertFatal(dlsch0_harq!=NULL,"dlsch_harq is null\n");

  // compute DL power control parameters
374

375 376

    if (dlsch0->active){
377 378
      computeRhoA_eNB(rel8->pa,dlsch0,dlsch0_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
      computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch0,dlsch0_harq->dl_power_off);
379 380
    }  
    if (dlsch1->active){
381 382
      computeRhoA_eNB(rel8->pa, dlsch1,dlsch1_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
      computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off);
383 384
    }

385
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
386
    dlsch0_harq->pdsch_start = eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols;
387 388 389
#else
    dlsch0_harq->pdsch_start = rel10->pdsch_start;
#endif
390 391 392 393
    if (dlsch0_harq->round==0) {  //get pointer to SDU if this a new SDU
      AssertFatal(sdu!=NULL,"NFAPI: frame %d, subframe %d: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d\n",
                  proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
                  dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index);
sharma's avatar
sharma committed
394
      if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: frame %d, subframe %d: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n",
395 396 397 398 399
                                    proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid);
      if (codeword_index == 0) dlsch0_harq->pdu                    = sdu;
      else                     dlsch1_harq->pdu                    = sdu;
    }
    else {
sharma's avatar
sharma committed
400
      if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: frame %d, subframe %d: programming dlsch for round %d, rnti %x, UE_id %d, harq_pid %d\n",
401 402 403 404 405
                                      proc->frame_tx,proc->subframe_tx,dlsch0_harq->round,
                                    rel8->rnti,UE_id,harq_pid);
    }

  }
406 407
}

408
int16_t to_beta_offset_harqack[16]={16,20,25,32,40,50,64,80,101,127,160,248,400,640,1008,8};
409

410 411 412 413 414 415 416
void handle_ulsch_harq_pdu(
        PHY_VARS_eNB                           *eNB,
        int                                     UE_id,
        nfapi_ul_config_request_pdu_t          *ul_config_pdu,
        nfapi_ul_config_ulsch_harq_information *harq_information,
        uint16_t                                frame,
        uint8_t                                 subframe)
Cedric Roux's avatar
Cedric Roux committed
417
{
418 419 420 421 422 423 424 425 426 427 428
  nfapi_ul_config_ulsch_pdu_rel8_t *rel8 = &ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8;

  LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
  LTE_UL_eNB_HARQ_t *ulsch_harq;

  int harq_pid = rel8->harq_process_number;
  ulsch_harq = ulsch->harq_processes[harq_pid];
  ulsch_harq->frame                      = frame;
  ulsch_harq->subframe                   = subframe;
  ulsch_harq->O_ACK                      = harq_information->harq_information_rel10.harq_size;
  ulsch->beta_offset_harqack_times8      = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq];
Wang Tsu-Han's avatar
Wang Tsu-Han committed
429 430 431 432
  if (eNB->frame_parms.frame_type == TDD) {
    if (harq_information->harq_information_rel10.ack_nack_mode==0) //bundling
        ulsch->bundling = 1;
   }
433 434 435 436 437
}

uint16_t to_beta_offset_ri[16]={9,13,16,20,25,32,40,50,64,80,101,127,160,0,0,0};
uint16_t to_beta_offset_cqi[16]={0,0,9,10,11,13,14,16,18,20,23,25,28,32,40,50};

Cedric Roux's avatar
Cedric Roux committed
438 439
void handle_ulsch_cqi_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe)
{
440 441 442 443 444 445 446
  nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9;

  LTE_eNB_ULSCH_t *ulsch        = eNB->ulsch[UE_id];
  int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number;
  LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];

  ulsch_harq->frame                       = frame;
Cedric Roux's avatar
Cedric Roux committed
447
  ulsch_harq->subframe                    = subframe;
448
  ulsch_harq->O_RI                        = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size;
449 450
  ulsch_harq->Or1                         = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0];
  if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1];
451 452
  ulsch->beta_offset_ri_times8            = to_beta_offset_ri[rel9->delta_offset_ri];
  ulsch->beta_offset_cqi_times8           = to_beta_offset_cqi[rel9->delta_offset_cqi];
453
  LOG_D(PHY,"Filling ulsch_cqi_ri information for frame %d, subframe %d : O_RI %d, Or1 %d, beta_offset_cqi_times8 %d (%d)\n",
Cedric Roux's avatar
Cedric Roux committed
454 455
        frame,subframe,ulsch_harq->O_RI,ulsch_harq->Or1,ulsch->beta_offset_cqi_times8,
        rel9->delta_offset_cqi);
456 457
}

Cedric Roux's avatar
Cedric Roux committed
458 459
void handle_ulsch_cqi_harq_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe)
{
460 461 462 463 464 465 466 467
  nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information.cqi_ri_information_rel9;

  LTE_eNB_ULSCH_t *ulsch        = eNB->ulsch[UE_id];
  int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number;
  LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
  nfapi_ul_config_ulsch_harq_information *harq_information = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information;

  ulsch_harq->frame                       = frame;
Cedric Roux's avatar
Cedric Roux committed
468
  ulsch_harq->subframe                    = subframe;
469
  ulsch_harq->O_RI                        = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size;
470
  ulsch_harq->Or1                         = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0];
471 472
  ulsch_harq->O_ACK                       = harq_information->harq_information_rel10.harq_size;

473
  if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1];
474 475 476 477 478 479

  ulsch->beta_offset_harqack_times8       = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq];
  ulsch->beta_offset_ri_times8            = to_beta_offset_ri[rel9->delta_offset_ri];
  ulsch->beta_offset_cqi_times8           = to_beta_offset_cqi[rel9->delta_offset_cqi];
}

Cedric Roux's avatar
Cedric Roux committed
480 481
void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_config_harq_information *harq_information)
{
482
  if (eNB->frame_parms.frame_type == FDD) {
Cedric Roux's avatar
Cedric Roux committed
483
    uci->num_pucch_resources = harq_information->harq_information_rel9_fdd.number_of_pucch_resources;
484

485
    LOG_D(PHY,"Programming UCI HARQ mode %d : size %d in (%d,%d)\n",
Cedric Roux's avatar
Cedric Roux committed
486 487 488
          harq_information->harq_information_rel9_fdd.ack_nack_mode,
          harq_information->harq_information_rel9_fdd.harq_size,
          uci->frame,uci->subframe);
489 490

    if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) &&
Cedric Roux's avatar
Cedric Roux committed
491
        (harq_information->harq_information_rel9_fdd.harq_size == 1)) {
492 493 494 495 496
      uci->pucch_fmt =  pucch_format1a;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
    }
    else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) &&
Cedric Roux's avatar
Cedric Roux committed
497
             (harq_information->harq_information_rel9_fdd.harq_size == 2)) {
498 499 500 501 502
      uci->pucch_fmt =  pucch_format1b;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
    }
    else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
Cedric Roux's avatar
Cedric Roux committed
503
             (harq_information->harq_information_rel9_fdd.harq_size == 2)) {
504 505 506 507 508 509 510
      uci->pucch_fmt =  pucch_format1b_csA2;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
    }
    else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
Cedric Roux's avatar
Cedric Roux committed
511
             (harq_information->harq_information_rel9_fdd.harq_size == 3)) {
512 513 514 515 516 517 518 519 520
      uci->pucch_fmt =  pucch_format1b_csA3;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
      uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2;
      uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
    }
    else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
Cedric Roux's avatar
Cedric Roux committed
521
             (harq_information->harq_information_rel9_fdd.harq_size == 4)) {
522 523 524 525 526 527 528 529 530 531 532 533 534
      uci->pucch_fmt =  pucch_format1b_csA4;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
      uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2;
      uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
    }
    else if (harq_information->harq_information_rel9_fdd.ack_nack_mode == 2) {
      uci->pucch_fmt =  pucch_format3;
      uci->n_pucch_3[0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0;
    }
sharma's avatar
sharma committed
535
    else AssertFatal(1==0,"unsupported FDD HARQ mode %d size %d\n",harq_information->harq_information_rel9_fdd.ack_nack_mode,harq_information->harq_information_rel9_fdd.harq_size);
536 537
  }
  else { // TDD
Cedric Roux's avatar
Cedric Roux committed
538
    uci->num_pucch_resources = harq_information->harq_information_rel10_tdd.number_of_pucch_resources;
539 540 541 542 543 544 545 546

    if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 0) {//bundling

      uci->pucch_fmt =  harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b;
      uci->tdd_bundling = 1;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
    }
Cedric Roux's avatar
Cedric Roux committed
547 548
    else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing
             (uci->num_pucch_resources == 1)) {
549 550 551 552 553 554
      uci->pucch_fmt = harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b;
      uci->tdd_bundling = 0;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
    }
    else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing M>1
Cedric Roux's avatar
Cedric Roux committed
555
             (uci->num_pucch_resources > 1)) {
556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
      uci->pucch_fmt = pucch_format1b;
      uci->tdd_bundling = 0;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
      uci->n_pucch_1[2][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_2;
      uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
      uci->n_pucch_1[3][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_3;
      uci->n_pucch_1[3][1] = harq_information->harq_information_rel11.n_pucch_2_3;
    }
    else if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 2) {
      uci->pucch_fmt =  pucch_format3;
      uci->n_pucch_3[0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0;
    }
    else AssertFatal(1==0,"unsupported HARQ mode %d\n",harq_information->harq_information_rel10_tdd.ack_nack_mode);
  }
}

Cedric Roux's avatar
Cedric Roux committed
576 577
void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active)
{
578 579 580 581 582 583 584 585 586 587 588 589
  LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];

  uci->frame               = frame;
  uci->subframe            = subframe;
  uci->rnti                = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti;
  uci->type                = SR;
  uci->pucch_fmt           = pucch_format1;
  uci->num_antenna_ports   = 1;
  uci->num_pucch_resources = 1;
  uci->n_pucch_1_0_sr[0]   = ul_config_pdu->uci_sr_pdu.sr_information.sr_information_rel8.pucch_index;
  uci->srs_active          = srs_active;
  uci->active              = 1;
590
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
sharma's avatar
sharma committed
591 592 593 594
  uci->ue_type                     = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel13.ue_type;
  uci->empty_symbols               = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel13.empty_symbols;
  uci->total_repetitions = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel13.total_number_of_repetitions;
#endif
595
  LOG_D(PHY,"Programming UCI SR rnti %x, pucch1_0 %d for (%d,%d)\n",
Cedric Roux's avatar
Cedric Roux committed
596
        uci->rnti,uci->n_pucch_1_0_sr[0],frame,subframe);
597 598
}

Cedric Roux's avatar
Cedric Roux committed
599 600
void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active)
{
601 602 603 604 605 606 607 608
  LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];

  uci->frame               = frame;
  uci->subframe            = subframe;
  uci->rnti                = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti;
  uci->type                = HARQ_SR;
  uci->num_antenna_ports   = 1;
  uci->num_pucch_resources = 1;
609
  uci->n_pucch_1_0_sr[0]   = ul_config_pdu->uci_sr_harq_pdu.sr_information.sr_information_rel8.pucch_index;
610 611
  uci->srs_active          = srs_active;
  uci->active              = 1;
612
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
sharma's avatar
sharma committed
613 614 615 616
  uci->ue_type                     = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel13.ue_type;
  uci->empty_symbols               = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel13.empty_symbols;
  uci->total_repetitions = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel13.total_number_of_repetitions;
#endif
617 618 619
  handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_sr_harq_pdu.harq_information);
}

Cedric Roux's avatar
Cedric Roux committed
620 621
void handle_uci_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active)
{
622 623
  LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];

624
  LOG_D(PHY,"Frame %d, Subframe %d: Programming UCI_HARQ process (type %d)\n",frame,subframe,HARQ);
625 626 627 628 629 630
  uci->frame             = frame;
  uci->subframe          = subframe;
  uci->rnti              = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti;
  uci->type              = HARQ;
  uci->srs_active        = srs_active;
  uci->num_antenna_ports = ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel11.num_ant_ports;
631
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
sharma's avatar
sharma committed
632 633 634 635
  uci->ue_type                     = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.ue_type;
  uci->empty_symbols               = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.empty_symbols;
  uci->total_repetitions           = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.total_number_of_repetitions;
#endif
636 637 638 639 640
  handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_harq_pdu.harq_information);

  uci->active=1;
}

Cedric Roux's avatar
Cedric Roux committed
641 642
void handle_srs_pdu(PHY_VARS_eNB *eNB,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe)
{
643 644 645
  int i;

  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
Cedric Roux's avatar
Cedric Roux committed
646

647
    if (eNB->soundingrs_ul_config_dedicated[i].active==1) continue;
Cedric Roux's avatar
Cedric Roux committed
648

649 650 651 652 653 654 655 656 657 658
    eNB->soundingrs_ul_config_dedicated[i].active               = 1;
    eNB->soundingrs_ul_config_dedicated[i].frame                = frame;
    eNB->soundingrs_ul_config_dedicated[i].subframe             = subframe;
    eNB->soundingrs_ul_config_dedicated[i].rnti                 = ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti;
    eNB->soundingrs_ul_config_dedicated[i].srs_Bandwidth        = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth;
    eNB->soundingrs_ul_config_dedicated[i].srs_HoppingBandwidth = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth;
    eNB->soundingrs_ul_config_dedicated[i].freqDomainPosition   = ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position;
    eNB->soundingrs_ul_config_dedicated[i].transmissionComb     = ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb;
    eNB->soundingrs_ul_config_dedicated[i].srs_ConfigIndex      = ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs;
    eNB->soundingrs_ul_config_dedicated[i].cyclicShift          = ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift;
Cedric Roux's avatar
Cedric Roux committed
659
    break;
660 661 662 663
  }
  AssertFatal(i<NUMBER_OF_UE_MAX,"No room for SRS processing\n");
}

664
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
665 666 667
                         nfapi_ul_config_request_pdu_t *ul_config_pdu,
                         uint16_t frame,uint8_t subframe,uint8_t srs_present)
{
668
  nfapi_ul_config_ulsch_pdu_rel8_t *rel8 = &ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
669
  int16_t UE_id;
670 671 672 673

  // check if we have received a dci for this ue and ulsch descriptor is configured

  if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) {
Raymond Knopp's avatar
Raymond Knopp committed
674
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
Cedric Roux's avatar
Cedric Roux committed
675
                "No existing UE ULSCH for rnti %x\n",rel8->rnti);
676
    LOG_D(PHY,"Applying UL config for UE %d, rnti %x for frame %d, subframe %d, modulation %d, rvidx %d\n", UE_id,rel8->rnti,frame,subframe,rel8->modulation_type,rel8->redundancy_version);
677

Wang Tsu-Han's avatar
Wang Tsu-Han committed
678
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_pdu,frame,subframe);
679 680 681 682

  }
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) {
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
Cedric Roux's avatar
Cedric Roux committed
683
                "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
684

Wang Tsu-Han's avatar
Wang Tsu-Han committed
685
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_harq_pdu.ulsch_pdu,frame,subframe);
686 687
    handle_ulsch_harq_pdu(eNB, UE_id, ul_config_pdu,
        &ul_config_pdu->ulsch_harq_pdu.harq_information, frame, subframe);
688

Cedric Roux's avatar
Cedric Roux committed
689
  }
690 691
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) {
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
692 693
                                    eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
694
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu,frame,subframe);
695 696
    handle_ulsch_cqi_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);

Cedric Roux's avatar
Cedric Roux committed
697
  }
698 699
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE) {
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
700 701
                                    eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
702
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu,frame,subframe);
703
    handle_ulsch_cqi_harq_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);
704 705
    handle_ulsch_harq_pdu(eNB, UE_id, ul_config_pdu,
        &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information, frame, subframe);
Cedric Roux's avatar
Cedric Roux committed
706
  }
707 708
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) {
    AssertFatal((UE_id = find_uci(ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
709 710
                                  proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE UCI for rnti %x\n",ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti);
711
    LOG_D(PHY,"Applying UL UCI_HARQ config for UE %d, rnti %x for frame %d, subframe %d\n",
sharma's avatar
sharma committed
712 713
          UE_id,ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti,frame,subframe);

714 715 716 717 718 719 720 721 722 723 724 725 726
    handle_uci_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
  }
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) {
    AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE not handled yet\n");
  }
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) {
    AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE not handled yet\n");
  }
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE) {
    AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE not handled yet\n");
  }
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE) {
    AssertFatal((UE_id = find_uci(ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
727 728
                                  proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti);
729
    handle_uci_sr_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
Cedric Roux's avatar
Cedric Roux committed
730

731 732 733
  }
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) {
    AssertFatal((UE_id = find_uci(rel8->rnti,proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
Cedric Roux's avatar
Cedric Roux committed
734
                "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti);
735 736 737 738 739 740 741
    handle_uci_sr_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
  }
  else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_SRS_PDU_TYPE) {
    handle_srs_pdu(eNB,ul_config_pdu,frame,subframe);
  }
}

Cedric Roux's avatar
Cedric Roux committed
742 743
void schedule_response(Sched_Rsp_t *Sched_INFO)
{
744
  PHY_VARS_eNB *eNB;
745
  L1_rxtx_proc_t *proc;
746 747 748 749 750 751 752 753 754 755
  // copy data from L2 interface into L1 structures
  module_id_t               Mod_id       = Sched_INFO->module_id;
  uint8_t                   CC_id        = Sched_INFO->CC_id;
  nfapi_dl_config_request_t *DL_req      = Sched_INFO->DL_req;
  nfapi_hi_dci0_request_t   *HI_DCI0_req = Sched_INFO->HI_DCI0_req;
  nfapi_ul_config_request_t *UL_req      = Sched_INFO->UL_req;
  nfapi_tx_request_t        *TX_req      = Sched_INFO->TX_req;
  frame_t                   frame        = Sched_INFO->frame;
  sub_frame_t               subframe     = Sched_INFO->subframe;
  LTE_DL_FRAME_PARMS        *fp;
756
  uint8_t                   ul_subframe;
757 758 759 760 761 762 763 764
  int                       ul_frame;
  int                       harq_pid;
  LTE_UL_eNB_HARQ_t         *ulsch_harq;

  AssertFatal(RC.eNB!=NULL,"RC.eNB is null\n");
  AssertFatal(RC.eNB[Mod_id]!=NULL,"RC.eNB[%d] is null\n",Mod_id);
  AssertFatal(RC.eNB[Mod_id][CC_id]!=NULL,"RC.eNB[%d][%d] is null\n",Mod_id,CC_id);

765

766 767
  eNB         = RC.eNB[Mod_id][CC_id];
  fp          = &eNB->frame_parms;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
768
  proc        = &eNB->proc.L1_proc;
769

770 771
  /* TODO: check that following line is correct - in the meantime it is disabled */
  //if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)==SF_UL)) return;
772

773 774 775
  ul_subframe = pdcch_alloc2ul_subframe(fp,subframe);
  ul_frame    = pdcch_alloc2ul_frame(fp,frame,subframe);

776 777 778 779 780
  // DJP - subframe assert will fail - not sure why yet
  // DJP - AssertFatal(proc->subframe_tx == subframe, "Current subframe %d != NFAPI subframe %d\n",proc->subframe_tx,subframe);
  // DJP - AssertFatal(proc->subframe_tx == subframe, "Current frame %d != NFAPI frame %d\n",proc->frame_tx,frame);

  uint8_t number_pdcch_ofdm_symbols = DL_req->dl_config_request_body.number_pdcch_ofdm_symbols;
781 782 783

  uint8_t number_dl_pdu             = DL_req->dl_config_request_body.number_pdu;
  uint8_t number_hi_dci0_pdu        = HI_DCI0_req->hi_dci0_request_body.number_of_dci+HI_DCI0_req->hi_dci0_request_body.number_of_hi;
784
  uint8_t number_ul_pdu             = UL_req!=NULL ? UL_req->ul_config_request_body.number_of_pdus : 0;
785 786 787 788 789 790 791

  nfapi_dl_config_request_pdu_t *dl_config_pdu;
  nfapi_hi_dci0_request_pdu_t   *hi_dci0_req_pdu;
  nfapi_ul_config_request_pdu_t *ul_config_pdu;

  int i;

792
  eNB->pdcch_vars[subframe&1].num_pdcch_symbols = number_pdcch_ofdm_symbols;
793 794
  eNB->pdcch_vars[subframe&1].num_dci           = 0;
  eNB->phich_vars[subframe&1].num_hi            = 0;
795
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
796 797
  eNB->mpdcch_vars[subframe&1].num_dci           = 0;
#endif
798

Wang Tsu-Han's avatar
Wang Tsu-Han committed
799 800 801 802 803 804 805 806 807 808 809 810 811
  LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SF:%04d%d DL_req:SFN/SF:%04d%d:dl_pdu:%d tx_req:SFN/SF:%04d%d:pdus:%d\n",
       frame,subframe,
       NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),number_dl_pdu,
       NFAPI_SFNSF2SFN(TX_req->sfn_sf),NFAPI_SFNSF2SF(TX_req->sfn_sf),TX_req->tx_request_body.number_of_pdus
       );
  LOG_D(PHY,"NFAPI: hi_dci0:SFN/SF:%04d%d:pdus:%d\n",
        NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),number_hi_dci0_pdu
       );
  if(UL_req!=NULL)
    LOG_D(PHY,"NFAPI: ul_cfg:SFN/SF:%04d%d:pdus:%d num_pdcch_symbols:%d\n",
          NFAPI_SFNSF2SFN(UL_req->sfn_sf),NFAPI_SFNSF2SF(UL_req->sfn_sf),number_ul_pdu,
          eNB->pdcch_vars[subframe&1].num_pdcch_symbols);

Cedric Roux's avatar
Cedric Roux committed
812

813 814
  int do_oai =0;
  int dont_send =0;
815 816 817
  /* TODO: check the following test - in the meantime it is put back as it was before */
  //if ((ul_subframe<10)&&
  //    (subframe_select(fp,ul_subframe)==SF_UL)) { // This means that there is an ul_subframe that can be configured here
818
  if (ul_subframe<10) { // This means that there is an ul_subframe that can be configured here
819
    LOG_D(PHY,"NFAPI: Clearing dci allocations for potential UL subframe %d\n",ul_subframe);
820
  
821 822 823 824
    harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe);


    // clear DCI allocation maps for new subframe
Cedric Roux's avatar
Cedric Roux committed
825

826 827
    for (i=0; i<NUMBER_OF_UE_MAX; i++) {
      if (eNB->ulsch[i]) {
Cedric Roux's avatar
Cedric Roux committed
828
        ulsch_harq = eNB->ulsch[i]->harq_processes[harq_pid];
829 830 831 832 833 834 835
        ulsch_harq->dci_alloc=0;
        ulsch_harq->rar_alloc=0;
      }
    }
  }
  for (i=0;i<number_dl_pdu;i++) {
    dl_config_pdu = &DL_req->dl_config_request_body.dl_config_pdu_list[i];
Wang Tsu-Han's avatar
Wang Tsu-Han committed
836
    //LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_config_pdu->pdu_type);
837 838
    switch (dl_config_pdu->pdu_type) {
    case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
839 840 841 842
      handle_nfapi_dci_dl_pdu(eNB,NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),proc,dl_config_pdu);
      eNB->pdcch_vars[NFAPI_SFNSF2SF(DL_req->sfn_sf)&1].num_dci++;
      //LOG_E(PHY,"Incremented num_dci:%d but already set??? dl_config:num_dci:%d\n", eNB->pdcch_vars[subframe&1].num_dci, number_dci);
      do_oai=1;
843 844 845
      break;
    case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
      AssertFatal(dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index<TX_req->tx_request_body.number_of_pdus,
Cedric Roux's avatar
Cedric Roux committed
846 847 848
                  "bch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
                  dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index,
                  TX_req->tx_request_body.number_of_pdus);
849
      eNB->pbch_configured=1;
850 851 852 853 854
      do_oai=1;
      //LOG_D(PHY,"%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE TX:%d/%d RX:%d/%d TXREQ:%d/%d\n", 
          //__FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx, NFAPI_SFNSF2SFN(TX_req->sfn_sf), NFAPI_SFNSF2SF(TX_req->sfn_sf));


855
      handle_nfapi_bch_pdu(eNB,proc,dl_config_pdu,
Cedric Roux's avatar
Cedric Roux committed
856
                           TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index].segments[0].segment_data);
857 858 859 860 861
      break;
    case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
      //      handle_nfapi_mch_dl_pdu(eNB,dl_config_pdu);
      break;
    case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
862 863 864 865 866 867 868 869 870 871 872 873 874 875
      {
        nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8;
        uint16_t pdu_index = dlsch_pdu_rel8->pdu_index;
        uint16_t tx_pdus = TX_req->tx_request_body.number_of_pdus;
        uint16_t invalid_pdu = pdu_index == -1;
        uint8_t *sdu = invalid_pdu ? NULL : pdu_index >= tx_pdus ? NULL : TX_req->tx_request_body.tx_pdu_list[pdu_index].segments[0].segment_data;

        LOG_D(PHY,"%s() [PDU:%d] NFAPI_DL_CONFIG_DLSCH_PDU_TYPE SFN/SF:%04d%d TX:%d/%d RX:%d/%d transport_blocks:%d pdu_index:%d sdu:%p\n", 
            __FUNCTION__, i, 
            NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),
            proc->frame_tx, proc->subframe_tx, 
            proc->frame_rx, proc->subframe_rx, 
            dlsch_pdu_rel8->transport_blocks, pdu_index, sdu);

876
      /*
877
      AssertFatal(dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index<TX_req->tx_request_body.number_of_pdus,
Cedric Roux's avatar
Cedric Roux committed
878 879 880
                  "dlsch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
                  dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,
                  TX_req->tx_request_body.number_of_pdus);
881
      */
882 883 884 885
      AssertFatal((dlsch_pdu_rel8->transport_blocks<3) &&
                  (dlsch_pdu_rel8->transport_blocks>0),
                  "dlsch_pdu_rel8->transport_blocks = %d not in [1,2]\n",
                  dlsch_pdu_rel8->transport_blocks);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
886
      if (1)//sdu != NULL)
887 888 889 890 891 892 893 894 895 896 897 898 899 900
      {
        handle_nfapi_dlsch_pdu(eNB,NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),proc,dl_config_pdu, dlsch_pdu_rel8->transport_blocks-1, sdu);
      }
      else
      {
        dont_send=1;

        LOG_E(MAC,"%s() NFAPI_DL_CONFIG_DLSCH_PDU_TYPE sdu is NULL DL_CFG:SFN/SF:%d:pdu_index:%d TX_REQ:SFN/SF:%d:pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(DL_req->sfn_sf), pdu_index, NFAPI_SFNSF2DEC(TX_req->sfn_sf), tx_pdus);
      }

      // Send the data first so that the DL_CONFIG can just pluck it out of the buffer
      // DJP - OAI was here - moved to bottom
      do_oai=1;

Raymond Knopp's avatar
Raymond Knopp committed
901
      /*
902
      if (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti == eNB->preamble_list[0].preamble_rel8.rnti) {// is RAR pdu
903

Cedric Roux's avatar
Cedric Roux committed
904 905 906 907 908 909 910
        LOG_D(PHY,"Frame %d, Subframe %d: Received LTE RAR pdu, programming based on UL Grant\n",frame,subframe);
        generate_eNB_ulsch_params_from_rar(eNB,
                                           TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data,
                                           frame,
                                           subframe);

                                           }        */
911
      }
912 913 914 915 916 917 918 919 920 921 922 923 924
      break;
    case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
      //      handle_nfapi_pch_pdu(eNB,dl_config_pdu);
      break;
    case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
      //      handle_nfapi_prs_pdu(eNB,dl_config_pdu);
      break;
    case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
      //      handle_nfapi_csi_rs_pdu(eNB,dl_config_pdu);
      break;
    case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
      //      handle_nfapi_epdcch_pdu(eNB,dl_config_pdu);
      break;
925
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
926 927
    case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
      handle_nfapi_mpdcch_pdu(eNB,proc,dl_config_pdu);
Cedric Roux's avatar
Cedric Roux committed
928
      eNB->mpdcch_vars[subframe&1].num_dci++;
929
      break;
930
#endif    
931 932
    }
  }
933 934 935 936 937 938 939 940 941 942 943 944
  
  if (nfapi_mode && do_oai && !dont_send) {
    oai_nfapi_tx_req(Sched_INFO->TX_req);

    oai_nfapi_dl_config_req(Sched_INFO->DL_req); // DJP - .dl_config_request_body.dl_config_pdu_list[0]); // DJP - FIXME TODO - yuk - only copes with 1 pdu
  }

  if (nfapi_mode && number_hi_dci0_pdu!=0) {
    oai_nfapi_hi_dci0_req(HI_DCI0_req);
    eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_dci=0;
    eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_pdcch_symbols=0;
  }
Cedric Roux's avatar
Cedric Roux committed
945

946 947 948 949
  for (i=0;i<number_hi_dci0_pdu;i++) {

    hi_dci0_req_pdu = &HI_DCI0_req->hi_dci0_request_body.hi_dci0_pdu_list[i];

Raymond Knopp's avatar
Raymond Knopp committed
950
    LOG_D(PHY,"NFAPI: hi_dci0_pdu %d : type %d\n",i,hi_dci0_req_pdu->pdu_type);
951 952 953

    switch (hi_dci0_req_pdu->pdu_type) {

954 955 956 957 958 959
    case NFAPI_HI_DCI0_DCI_PDU_TYPE:
      
      handle_nfapi_hi_dci0_dci_pdu(eNB,NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),proc,hi_dci0_req_pdu);
      eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_dci++;
      break;
      
sharma's avatar
sharma committed
960 961 962 963 964
    case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
      handle_nfapi_hi_dci0_mpdcch_dci_pdu(eNB,proc,hi_dci0_req_pdu);
      eNB->mpdcch_vars[subframe&1].num_dci++;
      break;

965
    case NFAPI_HI_DCI0_HI_PDU_TYPE:
966
      handle_nfapi_hi_dci0_hi_pdu(eNB,NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),proc,hi_dci0_req_pdu);
967 968
      break;
    }
Cedric Roux's avatar
Cedric Roux committed
969
  }
970

971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994
  if (nfapi_mode) {
    if (number_ul_pdu>0)
    {
      //LOG_D(PHY, "UL_CONFIG to send to PNF\n");
      oai_nfapi_ul_config_req(UL_req);
      UL_req->ul_config_request_body.number_of_pdus=0;
      number_ul_pdu=0;
    }
  }
  else {
    for (i=0;i<number_ul_pdu;i++) {
      ul_config_pdu = &UL_req->ul_config_request_body.ul_config_pdu_list[i];
      LOG_D(PHY,"NFAPI: ul_pdu %d : type %d\n",i,ul_config_pdu->pdu_type);
      AssertFatal(ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE ||
          ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE ||
          ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE ||
          ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE ||
          ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE ||
          ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE ||
          ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE
          ,
          "Optional UL_PDU type %d not supported\n",ul_config_pdu->pdu_type);
      handle_nfapi_ul_pdu(eNB,proc,ul_config_pdu,UL_req->sfn_sf>>4,UL_req->sfn_sf&0xf,UL_req->ul_config_request_body.srs_present);
    }
995 996
  }
}
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018

/*Dummy functions*/

int memcpy_dl_config_req (nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request_t* req)
{
	return 0;
}

int memcpy_ul_config_req (nfapi_pnf_p7_config_t* pnf_p7, nfapi_ul_config_request_t* req)
{
	return 0;
}

int memcpy_hi_dci0_req (nfapi_pnf_p7_config_t* pnf_p7, nfapi_hi_dci0_request_t* req)
{
	return 0;
}

int memcpy_tx_req (nfapi_pnf_p7_config_t* pnf_p7, nfapi_tx_request_t* req)
{
	return 0;
}