1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* header include files (.h) */
20 #include "common_def.h"
23 #include "nr5g_fapi_internal.h"
24 #include "fapi_vendor_extension.h"
27 /* header/extern include files (.x) */
29 #include "du_app_mac_inf.h"
30 #include "mac_sch_interface.h"
32 #include "lwr_mac_fsm.h"
33 #include "lwr_mac_phy.h"
34 #include "lwr_mac_upr_inf.h"
36 #include "mac_utils.h"
37 #include "lwr_mac_utils.h"
40 /* Function pointer for slot indication from lower mac to mac */
41 SlotIndFunc sendSlotIndOpts[] =
43 packSlotInd, /* packing for loosely coupled */
44 fapiMacSlotInd, /* packing for tightly coupled */
45 packSlotInd /* packing for light weight loosly coupled */
48 /* Function pointer for rach indication from lower mac to mac */
49 RachIndFunc sendRachIndOpts[] =
56 /* Function pointer for crc indication from lower mac to mac */
57 CrcIndFunc sendCrcIndOpts[] =
64 /* Function pointer for Rx Data indication from lower mac to mac */
65 RxDataIndFunc sendRxDataIndOpts[] =
72 /* Function pointer for stop indication from lower mac to mac */
73 StopIndFunc sendStopIndOpts[] =
80 /* Function pointer for Uci indication from lower mac to mac */
81 UciIndFunc sendUciIndOpts[] =
88 /*******************************************************************
90 * @brief Processes Slot Indication from PHY and sends to MAC
94 * Function : procSlotInd
97 * Processes Slot Indication from PHY and sends to MAC
99 * @params[in] fapi_slot_ind_t pointer
100 * @return ROK - success
103 * ****************************************************************/
104 uint8_t procSlotInd(fapi_slot_ind_t *fapiSlotInd)
106 /* fill Pst structure to send to lwr_mac to MAC */
109 SlotTimingInfo *slotInd = {0};
111 MAC_ALLOC_SHRABL_BUF(slotInd, sizeof(SlotTimingInfo));
114 slotInd->cellId = lwrMacCb.cellCb[0].cellId;
115 slotInd->sfn = fapiSlotInd->sfn;
116 slotInd->slot = fapiSlotInd->slot;
117 FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_SLOT_IND_TO_MAC);
118 pst.selector = ODU_SELECTOR_LWLC;
119 ret = (*sendSlotIndOpts[pst.selector])(&pst, slotInd);
123 DU_LOG("\nERROR --> LWR_MAC: Memory allocation failed in procSlotInd");
129 /*******************************************************************
131 * @brief Handles stop indication recived from PHY
135 * Function : procStopInd
138 * Handles Stop Indication received from PHY
140 * @return ROK - success
143 * ****************************************************************/
144 uint8_t procStopInd()
147 uint16_t *cellId = NULLP;
149 MAC_ALLOC_SHRABL_BUF(cellId, sizeof(uint16_t));
152 DU_LOG("\nERROR --> LWR_MAC: Memory Allocation failed in procStopInd");
156 *cellId = lwrMacCb.cellCb[0].cellId;
157 lwrMacCb.phyState = PHY_STATE_CONFIGURED;
158 lwrMacCb.cellCb[0].state = PHY_STATE_CONFIGURED;
159 DU_LOG("\nINFO --> LWR_MAC: PHY has moved to configured state");
161 FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_STOP_IND_TO_MAC);
162 pst.selector = ODU_SELECTOR_LWLC;
163 return (*sendStopIndOpts[pst.selector])(&pst, cellId);
166 /*******************************************************************
168 * @brief Processes Rach Indication from PHY and sends to MAC
172 * Function : procRachInd
175 * Processes Rach Indication from PHY and sends to MAC
177 * @params[in] fapi_rach_indication_t pointer
178 * @return ROK - success
181 * ****************************************************************/
182 uint8_t procRachInd(fapi_rach_indication_t *fapiRachInd)
187 RachPduInfo *rachPdu = NULLP;
188 RachInd *rachInd = NULLP;
190 if(!fapiRachInd->numPdus)
192 DU_LOG("\nDEBUG --> LWR_MAC : No PDU in RACH.indication at [%d, %d]", fapiRachInd->sfn, fapiRachInd->slot);
196 MAC_ALLOC_SHRABL_BUF(rachInd, sizeof(RachInd));
199 DU_LOG("\nERROR --> LWR_MAC : Memory Allocation failed in procRachInd");
202 rachInd->cellId = lwrMacCb.cellCb[0].cellId;
203 rachInd->timingInfo.sfn = fapiRachInd->sfn;
204 rachInd->timingInfo.slot = fapiRachInd->slot;
205 rachInd->numPdu = fapiRachInd->numPdus;
206 for(pduIdx=0; pduIdx < rachInd->numPdu; pduIdx++)
208 rachPdu = &rachInd->rachPdu[pduIdx];
209 rachPdu->pci = fapiRachInd->rachPdu[pduIdx].phyCellId;
210 rachPdu->symbolIdx = fapiRachInd->rachPdu[pduIdx].symbolIndex;
211 rachPdu->slotIdx = fapiRachInd->rachPdu[pduIdx].slotIndex;
212 rachPdu->freqIdx = fapiRachInd->rachPdu[pduIdx].freqIndex;
213 rachPdu->numPream = fapiRachInd->rachPdu[pduIdx].numPreamble;
214 for(prmbleIdx=0; prmbleIdx<rachPdu->numPream; prmbleIdx++)
216 rachPdu->preamInfo[prmbleIdx].preamIdx = \
217 fapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].preambleIndex;
218 rachPdu->preamInfo[prmbleIdx].timingAdv = \
219 fapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].timingAdvance;
223 /* Fill post and sent to MAC */
224 FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_RACH_IND_TO_MAC);
225 return (*sendRachIndOpts[pst.selector])(&pst, rachInd);
228 /*******************************************************************
230 * @brief Handles CRC indication from PHY and sends to MAC
234 * Function : procCrcInd
237 * Handles CRC indication from PHY and sends to MAC
239 * @params[in] fapi_crc_ind_t message pointer
240 * @return ROK - success
243 * ****************************************************************/
245 uint8_t procCrcInd(fapi_crc_ind_t *fapiCrcInd)
249 uint8_t crcStatusIdx;
250 CrcInfo *crcIndInfo = NULLP;
251 CrcInd *crcInd = NULLP;
253 MAC_ALLOC_SHRABL_BUF(crcInd, sizeof(CrcInd));
256 DU_LOG("\nERROR --> LWR_MAC : Memory Allocation failed in procCrcInd");
259 if(!fapiCrcInd->numCrcs)
261 DU_LOG("\nDEBUG --> LWR_MAC : No CRC PDUs in CRC.indication at [%d, %d]", fapiCrcInd->sfn, fapiCrcInd->slot);
265 crcInd->cellId = lwrMacCb.cellCb[0].cellId;
266 crcInd->timingInfo.sfn = fapiCrcInd->sfn;
267 crcInd->timingInfo.slot = fapiCrcInd->slot;
268 crcInd->numCrc = fapiCrcInd->numCrcs;
270 for(crcInfoIdx = 0; crcInfoIdx < crcInd->numCrc; crcInfoIdx++)
272 crcIndInfo = &crcInd->crcInfo[crcInfoIdx];
273 crcIndInfo->handle = fapiCrcInd->crc[crcInfoIdx].handle;
274 crcIndInfo->rnti = fapiCrcInd->crc[crcInfoIdx].rnti;
275 crcIndInfo->harqId = fapiCrcInd->crc[crcInfoIdx].harqId;
276 crcIndInfo->tbCrcStatus = fapiCrcInd->crc[crcInfoIdx].tbCrcStatus;
277 crcIndInfo->numCb = fapiCrcInd->crc[crcInfoIdx].numCb;
278 for(crcStatusIdx = 0; crcStatusIdx < crcIndInfo->numCb; crcStatusIdx++)
280 crcIndInfo->cbCrcStatus[crcStatusIdx] = \
281 fapiCrcInd->crc[crcInfoIdx].cbCrcStatus[crcStatusIdx];
283 crcIndInfo->ul_cqi = fapiCrcInd->crc[crcInfoIdx].ul_cqi;
284 crcIndInfo->timingAdvance = fapiCrcInd->crc[crcInfoIdx].timingAdvance;
285 crcIndInfo->rssi = fapiCrcInd->crc[crcInfoIdx].rssi;
288 /* Fill post and sent to MAC */
289 FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_CRC_IND_TO_MAC);
290 return (*sendCrcIndOpts[pst.selector])(&pst, crcInd);
293 /*******************************************************************
295 * @brief Handles Rx Data indication from PHY and sends to MAC
299 * Function : procRxDataInd
302 * Handles Rx Data indication from PHY and sends to MAC
304 * @params[in] fapi_rx_data_indication_t message pointer
305 * @return ROK - success
308 * ****************************************************************/
310 uint8_t procRxDataInd(fapi_rx_data_indication_t *fapiRxDataInd)
314 RxDataInd *rxDataInd = NULLP;
315 RxDataIndPdu *pdu = NULLP;
317 MAC_ALLOC_SHRABL_BUF(rxDataInd, sizeof(RxDataInd));
320 DU_LOG("\nERROR --> LWR_MAC : Memory Allocation failed in procRxDataInd");
323 if(!fapiRxDataInd->numPdus)
325 DU_LOG("\nDEBUG --> LWR_MAC : No PDU in RX_Data.indication at [%d, %d]", fapiRxDataInd->sfn, fapiRxDataInd->slot);
329 rxDataInd->cellId = lwrMacCb.cellCb[0].cellId;
330 rxDataInd->timingInfo.sfn = fapiRxDataInd->sfn;
331 rxDataInd->timingInfo.slot = fapiRxDataInd->slot;
332 rxDataInd->numPdus = fapiRxDataInd->numPdus;
334 for(pduIdx = 0; pduIdx < rxDataInd->numPdus; pduIdx++)
336 pdu = &rxDataInd->pdus[pduIdx];
337 pdu->handle = fapiRxDataInd->pdus[pduIdx].handle;
338 pdu->rnti = fapiRxDataInd->pdus[pduIdx].rnti;
339 pdu->harqId = fapiRxDataInd->pdus[pduIdx].harqId;
340 pdu->pduLength = fapiRxDataInd->pdus[pduIdx].pdu_length;
341 pdu->ul_cqi = fapiRxDataInd->pdus[pduIdx].ul_cqi;
342 pdu->timingAdvance = fapiRxDataInd->pdus[pduIdx].timingAdvance;
343 pdu->rssi = fapiRxDataInd->pdus[pduIdx].rssi;
345 MAC_ALLOC_SHRABL_BUF(pdu->pduData, pdu->pduLength);
346 memcpy(pdu->pduData, fapiRxDataInd->pdus[pduIdx].pduData, pdu->pduLength);
348 /* Free WLS memory allocated for Rx PDU */
349 WLS_MEM_FREE(fapiRxDataInd->pdus[pduIdx].pduData, LWR_MAC_WLS_BUF_SIZE);
353 /* Fill post and sent to MAC */
354 FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_RX_DATA_IND_TO_MAC);
355 return (*sendRxDataIndOpts[pst.selector])(&pst, rxDataInd);
358 /*******************************************************************
360 * @brief Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1
364 * Function : fillUciIndPucchF0F1
367 * Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1
369 *@params[in] UciPucchF0F1 *
370 * fapi_uci_o_pucch_f0f1_t *
371 * @return ROK - success
374 * ****************************************************************/
375 uint8_t fillUciIndPucchF0F1(UciPucchF0F1 *pduInfo, fapi_uci_o_pucch_f0f1_t *fapiPduInfo)
381 pduInfo->handle = fapiPduInfo->handle;
382 pduInfo->pduBitmap = fapiPduInfo->pduBitmap;
383 pduInfo->pucchFormat = fapiPduInfo->pucchFormat;
384 pduInfo->ul_cqi = fapiPduInfo->ul_cqi;
385 pduInfo->crnti = fapiPduInfo->rnti;
386 pduInfo->timingAdvance = fapiPduInfo->timingAdvance;
387 pduInfo->rssi = fapiPduInfo->rssi;
388 if(fapiPduInfo->srInfo.srIndication)
390 pduInfo->srInfo.srIndPres = fapiPduInfo->srInfo.srIndication;
391 pduInfo->srInfo.srConfdcLevel = fapiPduInfo->srInfo.srConfidenceLevel;
393 if(fapiPduInfo->harqInfo.numHarq)
395 pduInfo->harqInfo.numHarq = fapiPduInfo->harqInfo.numHarq;
396 pduInfo->harqInfo.harqConfdcLevel = fapiPduInfo->harqInfo.harqConfidenceLevel;
397 for(harqIdx = 0; harqIdx < pduInfo->harqInfo.numHarq; harqIdx++)
399 pduInfo->harqInfo.harqValue[harqIdx] = fapiPduInfo->harqInfo.harqValue[harqIdx];
405 /*******************************************************************
407 * @brief Handles Uci indication from PHY and sends to MAC
411 * Function : procUciInd
414 * Handles Uci indication from PHY and sends to MAC
416 * @params[in] fapi_uci_indication_t message pointer
417 * @return ROK - success
420 * ****************************************************************/
422 uint8_t procUciInd(fapi_uci_indication_t *fapiUciInd)
427 UciInd *macUciInd = NULLP;
429 MAC_ALLOC_SHRABL_BUF(macUciInd, sizeof(UciInd));
432 DU_LOG("\nERROR --> LWR_MAC: Memory Allocation failed in procUciInd");
436 DU_LOG("\nDEBUG --> LWR_MAC: Processing UCI Indication");
437 memset(macUciInd, 0, sizeof(UciInd));
438 macUciInd->cellId = lwrMacCb.cellCb[0].cellId;
439 macUciInd->slotInd.sfn = fapiUciInd->sfn;
440 macUciInd->slotInd.slot = fapiUciInd->slot;
441 macUciInd->numUcis = fapiUciInd->numUcis;
443 for(pduIdx = 0; pduIdx < macUciInd->numUcis; pduIdx++)
445 macUciInd->pdus[pduIdx].pduType = fapiUciInd->uciPdu[pduIdx].pduType;
446 switch(macUciInd->pdus[pduIdx].pduType)
450 case UCI_IND_PUCCH_F0F1:
452 UciPucchF0F1 *pduInfo = NULLP;
453 macUciInd->pdus[pduIdx].pduSize = fapiUciInd->uciPdu[pduIdx].pduSize;
454 pduInfo = &macUciInd->pdus[pduIdx].uci.uciPucchF0F1;
455 ret = fillUciIndPucchF0F1(pduInfo, &fapiUciInd->uciPdu[pduIdx].uci.uciPucchF0F1);
458 case UCI_IND_PUCCH_F2F3F4:
461 DU_LOG("\nERROR --> LWR_MAC: Invalid Pdu Type %d at procmacUciInd()", macUciInd->pdus[pduIdx].pduType);
468 FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_UCI_IND_TO_MAC);
469 ret = (*sendUciIndOpts[pst.selector])(&pst, macUciInd);
473 DU_LOG("\nERROR --> LWR_MAC: Failed sending UCI Ind to MAC");
479 /*******************************************************************
480 * @brief Function prints src, dest, msg infor about all the msgs that
485 * Function :callFlowFromPhyToLwrMac
487 * Function call Flow From Phy To LwrMac
489 * @param[in] Pst *pst, Post structure of the primitive.
492 * ****************************************************************/
493 void callFlowFromPhyToLwrMac(uint16_t msgId)
498 #ifdef INTEL_TIMER_MODE
499 case FAPI_VENDOR_EXT_UL_IQ_SAMPLES:
500 strcpy(message,"FAPI_VENDOR_EXT_UL_IQ_SAMPLES");
503 case FAPI_PARAM_RESPONSE:
504 strcpy(message,"FAPI_PARAM_RESPONSE");
506 case FAPI_CONFIG_RESPONSE:
507 strcpy(message,"FAPI_CONFIG_RESPONSE");
509 case FAPI_SLOT_INDICATION:
510 strcpy(message,"FAPI_SLOT_INDICATION");
512 case FAPI_ERROR_INDICATION:
513 strcpy(message,"FAPI_ERROR_INDICATION");
515 case FAPI_RX_DATA_INDICATION:
516 strcpy(message,"FAPI_RX_DATA_INDICATION");
518 case FAPI_CRC_INDICATION:
519 strcpy(message,"FAPI_CRC_INDICATION");
521 case FAPI_UCI_INDICATION:
522 strcpy(message,"FAPI_UCI_INDICATION");
524 case FAPI_SRS_INDICATION:
525 strcpy(message,"FAPI_SRS_INDICATION");
527 case FAPI_RACH_INDICATION:
528 strcpy(message,"FAPI_RACH_INDICATION");
530 case FAPI_STOP_INDICATION:
531 strcpy(message,"FAPI_STOP_INDICATION");
534 DU_LOG("\nCall Flow: PHY -> ENTLWRMAC : %s\n",message);
537 /*******************************************************************
539 * @brief Processes message from PHY
543 * Function : procPhyMessages
545 * Functionality: Processes message from PHY
548 * @return ROK - success
551 * ****************************************************************/
552 void procPhyMessages(uint16_t msgType, uint32_t msgSize, void *msg)
555 /* extract the header */
556 fapi_msg_t *header = NULLP;
557 header = (fapi_msg_t *)msg;
559 #ifdef CALL_FLOW_DEBUG_LOG
560 callFlowFromPhyToLwrMac(header->msg_id);
563 switch(header->msg_id)
565 #ifdef INTEL_TIMER_MODE
566 case FAPI_VENDOR_EXT_UL_IQ_SAMPLES:
568 DU_LOG("\nDEBUG --> LWR_MAC: Received FAPI_VENDOR_EXT_UL_IQ_SAMPLES");
571 sendToLowerMac(CONFIG_REQUEST, 0, (void *)&cellId);
575 case FAPI_PARAM_RESPONSE:
577 sendToLowerMac(PARAM_RESPONSE, msgSize, msg);
580 case FAPI_CONFIG_RESPONSE:
582 sendToLowerMac(CONFIG_RESPONSE, msgSize, msg);
585 case FAPI_SLOT_INDICATION:
587 if(lwrMacCb.phyState == PHY_STATE_CONFIGURED)
589 DU_LOG("\nINFO --> LWR_MAC: PHY has moved to running state");
590 lwrMacCb.phyState = PHY_STATE_RUNNING;
591 lwrMacCb.cellCb[0].state = PHY_STATE_RUNNING;
594 fapi_slot_ind_t *slotInd = NULLP;
595 slotInd = (fapi_slot_ind_t *)msg;
596 procSlotInd(slotInd);
599 case FAPI_ERROR_INDICATION:
603 case FAPI_RX_DATA_INDICATION:
605 fapi_rx_data_indication_t *rxDataInd;
606 rxDataInd = (fapi_rx_data_indication_t *)msg;
607 procRxDataInd(rxDataInd);
610 case FAPI_CRC_INDICATION:
612 fapi_crc_ind_t *crcInd;
613 crcInd = (fapi_crc_ind_t *)msg;
617 case FAPI_UCI_INDICATION:
619 fapi_uci_indication_t *phyUciInd = NULLP;
620 phyUciInd = (fapi_uci_indication_t*)msg;
621 procUciInd(phyUciInd);
624 case FAPI_SRS_INDICATION:
628 case FAPI_RACH_INDICATION:
630 fapi_rach_indication_t *rachInd;
631 rachInd = (fapi_rach_indication_t *)msg;
632 procRachInd(rachInd);
635 case FAPI_STOP_INDICATION:
637 DU_LOG("\nINFO --> LWR_MAC: Handling Stop Indication");
645 /**********************************************************************
647 **********************************************************************/