[Epic-ID: ODUHIGH-475][Task-ID: ODUHIGH-476]Integration fixes upto PRACH scheduling...
[o-du/l2.git] / src / 5gnrmac / lwr_mac_handle_phy.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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 *******************************************************************************/
18
19 /* header include files (.h) */
20 #include "common_def.h"
21 #include "lrg.h"
22 #ifdef INTEL_FAPI
23 #include "nr5g_fapi_internal.h"
24 #include "fapi_vendor_extension.h"
25 #endif
26
27 /* header/extern include files (.x) */
28 #include "lrg.x"
29 #include "du_app_mac_inf.h"
30 #include "mac_sch_interface.h"
31 #include "lwr_mac.h"
32 #include "lwr_mac_fsm.h"
33 #include "lwr_mac_phy.h"
34 #include "lwr_mac_upr_inf.h"
35 #include "mac.h"
36 #include "mac_utils.h"
37 #include "lwr_mac_utils.h"
38
39 #ifdef INTEL_FAPI
40 /* Function pointer for slot indication from lower mac to mac */
41 SlotIndFunc sendSlotIndOpts[] =
42 {
43    packSlotInd,  /* packing for loosely coupled */
44    fapiMacSlotInd, /* packing for tightly coupled */
45    packSlotInd /* packing for light weight loosly coupled */
46 };
47
48 /* Function pointer for rach indication from lower mac to mac */ 
49 RachIndFunc sendRachIndOpts[] =
50 {
51    packRachInd,
52    fapiMacRachInd,
53    packRachInd
54 };
55
56 /* Function pointer for crc indication from lower mac to mac */
57 CrcIndFunc sendCrcIndOpts[] =
58 {
59    packCrcInd,
60    fapiMacCrcInd,
61    packCrcInd
62 };
63
64 /* Function pointer for Rx Data indication from lower mac to mac */
65 RxDataIndFunc sendRxDataIndOpts[] =
66 {
67    packRxDataInd,
68    fapiMacRxDataInd,
69    packRxDataInd
70 };
71
72 /* Function pointer for stop indication from lower mac to mac */ 
73 StopIndFunc sendStopIndOpts[] =
74 {
75    packStopInd,
76    fapiMacStopInd,
77    packStopInd
78 };
79
80 /* Function pointer for Uci indication from lower mac to mac */
81 UciIndFunc sendUciIndOpts[] =
82 {
83    packUciInd,
84    FapiMacUciInd,
85    packUciInd
86 };
87
88 /*******************************************************************
89  *
90  * @brief Processes Slot Indication from PHY and sends to MAC
91  *
92  * @details
93  *
94  *    Function : procSlotInd
95  *
96  *    Functionality:
97  *     Processes Slot Indication from PHY and sends to MAC
98  *
99  * @params[in] fapi_slot_ind_t pointer
100  * @return ROK     - success
101  *         RFAILED - failure
102  *
103  * ****************************************************************/
104 uint8_t procSlotInd(fapi_slot_ind_t *fapiSlotInd)
105 {
106    /* fill Pst structure to send to lwr_mac to MAC */
107    Pst pst;
108    uint16_t ret = 0;
109    SlotTimingInfo *slotInd = {0};
110
111    MAC_ALLOC_SHRABL_BUF(slotInd, sizeof(SlotTimingInfo));
112    if(slotInd)
113    {
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);
120    }
121    else
122    {
123       DU_LOG("\nERROR  -->  LWR_MAC: Memory allocation failed in procSlotInd");
124       ret = RFAILED;
125    }
126    return ret;
127 }
128
129 /*******************************************************************
130  *
131  * @brief Handles stop indication recived from PHY
132  *
133  * @details
134  *
135  *    Function : procStopInd
136  *
137  *    Functionality:
138  *         Handles Stop Indication received from PHY
139  *
140  * @return ROK     - success
141  *         RFAILED - failure
142  *
143  * ****************************************************************/
144 uint8_t procStopInd()
145 {
146    Pst pst;
147    uint16_t *cellId = NULLP;
148
149    MAC_ALLOC_SHRABL_BUF(cellId, sizeof(uint16_t));
150    if(!cellId)
151    {
152       DU_LOG("\nERROR  -->  LWR_MAC: Memory Allocation failed in procStopInd");
153       return RFAILED;
154    }
155
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");
160
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);
164 }
165
166 /*******************************************************************
167  *
168  * @brief Processes Rach Indication from PHY and sends to MAC
169  *
170  * @details
171  *
172  *    Function : procRachInd
173  *
174  *    Functionality:
175  *         Processes Rach Indication from PHY and sends to MAC
176  *
177  * @params[in] fapi_rach_indication_t pointer
178  * @return ROK     - success
179  *         RFAILED - failure
180  *
181  * ****************************************************************/
182 uint8_t procRachInd(fapi_rach_indication_t  *fapiRachInd)
183 {
184    Pst          pst;
185    uint8_t      pduIdx;
186    uint8_t      prmbleIdx;
187    RachPduInfo  *rachPdu = NULLP;
188    RachInd      *rachInd = NULLP;
189
190    if(!fapiRachInd->numPdus)
191    {
192       DU_LOG("\nDEBUG  -->  LWR_MAC : No PDU in RACH.indication at [%d, %d]", fapiRachInd->sfn, fapiRachInd->slot);
193       return ROK;
194    }
195
196    MAC_ALLOC_SHRABL_BUF(rachInd, sizeof(RachInd));
197    if(!rachInd)
198    {
199       DU_LOG("\nERROR  -->  LWR_MAC : Memory Allocation failed in procRachInd");
200       return RFAILED;
201    }
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++)
207    {
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++)
215       {
216          rachPdu->preamInfo[prmbleIdx].preamIdx = \
217             fapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].preambleIndex;
218          rachPdu->preamInfo[prmbleIdx].timingAdv = \
219             fapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].timingAdvance;
220       }
221    }
222
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);
226 }/* handleRachInd */
227
228 /*******************************************************************
229  *
230  * @brief Handles CRC indication from PHY and sends to MAC
231  *
232  * @details
233  *
234  *    Function : procCrcInd
235  *
236  *    Functionality:
237  *      Handles CRC indication from PHY and sends to MAC
238  *
239  * @params[in] fapi_crc_ind_t message pointer
240  * @return ROK     - success
241  *         RFAILED - failure
242  *
243  * ****************************************************************/
244
245 uint8_t procCrcInd(fapi_crc_ind_t  *fapiCrcInd)
246 {
247    Pst          pst;
248    uint8_t      crcInfoIdx;
249    uint8_t      crcStatusIdx;
250    CrcInfo      *crcIndInfo = NULLP;
251    CrcInd       *crcInd = NULLP;
252
253    MAC_ALLOC_SHRABL_BUF(crcInd, sizeof(CrcInd));
254    if(!crcInd)
255    {
256       DU_LOG("\nERROR  -->  LWR_MAC : Memory Allocation failed in procCrcInd");
257       return RFAILED;
258    }
259    if(!fapiCrcInd->numCrcs)
260    {
261       DU_LOG("\nDEBUG  --> LWR_MAC : No CRC PDUs in CRC.indication at [%d, %d]", fapiCrcInd->sfn, fapiCrcInd->slot);
262       return ROK;
263    }
264
265    crcInd->cellId = lwrMacCb.cellCb[0].cellId;
266    crcInd->timingInfo.sfn = fapiCrcInd->sfn;
267    crcInd->timingInfo.slot = fapiCrcInd->slot;
268    crcInd->numCrc = fapiCrcInd->numCrcs;
269
270    for(crcInfoIdx = 0; crcInfoIdx < crcInd->numCrc; crcInfoIdx++)
271    {
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++)
279       {
280          crcIndInfo->cbCrcStatus[crcStatusIdx] = \
281             fapiCrcInd->crc[crcInfoIdx].cbCrcStatus[crcStatusIdx];
282       }
283       crcIndInfo->ul_cqi  = fapiCrcInd->crc[crcInfoIdx].ul_cqi;
284       crcIndInfo->timingAdvance = fapiCrcInd->crc[crcInfoIdx].timingAdvance;
285       crcIndInfo->rssi = fapiCrcInd->crc[crcInfoIdx].rssi;
286    }
287
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);
291 } /* handleCrcInd */
292
293 /*******************************************************************
294  *
295  * @brief Handles Rx Data indication from PHY and sends to MAC
296  *
297  * @details
298  *
299  *    Function : procRxDataInd
300  *
301  *    Functionality:
302  *      Handles Rx Data indication from PHY and sends to MAC
303  *
304  * @params[in] fapi_rx_data_indication_t message pointer
305  * @return ROK     - success
306  *         RFAILED - failure
307  *
308  * ****************************************************************/
309
310 uint8_t procRxDataInd(fapi_rx_data_indication_t  *fapiRxDataInd)
311 {
312    Pst           pst;
313    uint8_t       pduIdx =0;
314    RxDataInd     *rxDataInd = NULLP;
315    RxDataIndPdu  *pdu = NULLP;   
316
317    MAC_ALLOC_SHRABL_BUF(rxDataInd, sizeof(RxDataInd));
318    if(!rxDataInd)
319    {
320       DU_LOG("\nERROR  -->  LWR_MAC : Memory Allocation failed in procRxDataInd");
321       return RFAILED;
322    }
323    if(!fapiRxDataInd->numPdus)
324    {
325       DU_LOG("\nDEBUG  -->  LWR_MAC : No PDU in RX_Data.indication at [%d, %d]", fapiRxDataInd->sfn, fapiRxDataInd->slot);
326       return ROK;
327    }
328
329    rxDataInd->cellId = lwrMacCb.cellCb[0].cellId;
330    rxDataInd->timingInfo.sfn = fapiRxDataInd->sfn; 
331    rxDataInd->timingInfo.slot = fapiRxDataInd->slot;
332    rxDataInd->numPdus = fapiRxDataInd->numPdus;
333
334    for(pduIdx = 0; pduIdx < rxDataInd->numPdus; pduIdx++)
335    {
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;
344
345       MAC_ALLOC_SHRABL_BUF(pdu->pduData, pdu->pduLength);
346       memcpy(pdu->pduData, fapiRxDataInd->pdus[pduIdx].pduData, pdu->pduLength);
347 #ifdef INTEL_WLS_MEM      
348       /* Free WLS memory allocated for Rx PDU */
349       WLS_MEM_FREE(fapiRxDataInd->pdus[pduIdx].pduData, LWR_MAC_WLS_BUF_SIZE);
350 #endif
351    }
352
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);
356 }
357
358 /*******************************************************************
359  *
360  * @brief Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1
361  *
362  * @details
363  *
364  *    Function : fillUciIndPucchF0F1
365  *
366  *    Functionality:
367  *       Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1
368  *
369  *@params[in] UciPucchF0F1 *
370  *            fapi_uci_o_pucch_f0f1_t *
371  * @return ROK     - success
372  *         RFAILED - failure
373  *
374  * ****************************************************************/
375 uint8_t fillUciIndPucchF0F1(UciPucchF0F1 *pduInfo, fapi_uci_o_pucch_f0f1_t *fapiPduInfo)
376 {
377
378    uint8_t harqIdx;
379    uint8_t ret = ROK;
380    
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)
389    {
390       pduInfo->srInfo.srIndPres = fapiPduInfo->srInfo.srIndication;
391       pduInfo->srInfo.srConfdcLevel = fapiPduInfo->srInfo.srConfidenceLevel;
392    }
393    if(fapiPduInfo->harqInfo.numHarq)
394    {
395       pduInfo->harqInfo.numHarq = fapiPduInfo->harqInfo.numHarq;
396       pduInfo->harqInfo.harqConfdcLevel = fapiPduInfo->harqInfo.harqConfidenceLevel;
397       for(harqIdx = 0; harqIdx < pduInfo->harqInfo.numHarq; harqIdx++)
398       {
399          pduInfo->harqInfo.harqValue[harqIdx] = fapiPduInfo->harqInfo.harqValue[harqIdx];
400       }
401    }
402    return ret;
403 }
404
405 /*******************************************************************
406  *
407  * @brief Handles Uci indication from PHY and sends to MAC
408  *
409  * @details
410  *
411  *    Function : procUciInd
412  *
413  *    Functionality:
414  *      Handles Uci indication from PHY and sends to MAC
415  *
416  * @params[in] fapi_uci_indication_t message pointer
417  * @return ROK     - success
418  *         RFAILED - failure
419  *
420  * ****************************************************************/
421
422 uint8_t procUciInd(fapi_uci_indication_t  *fapiUciInd)
423 {
424    uint8_t pduIdx;
425    uint8_t ret = ROK;
426    Pst     pst;
427    UciInd  *macUciInd = NULLP;
428
429    MAC_ALLOC_SHRABL_BUF(macUciInd, sizeof(UciInd));
430    if(!macUciInd)
431    {
432       DU_LOG("\nERROR  -->  LWR_MAC: Memory Allocation failed in procUciInd");
433       return RFAILED;
434    }
435
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;
442
443    for(pduIdx = 0; pduIdx < macUciInd->numUcis; pduIdx++)
444    {
445       macUciInd->pdus[pduIdx].pduType = fapiUciInd->uciPdu[pduIdx].pduType;
446       switch(macUciInd->pdus[pduIdx].pduType)
447       {
448          case UCI_IND_PUSCH:
449          break;
450          case UCI_IND_PUCCH_F0F1:
451          {
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);
456          }
457          break;
458          case UCI_IND_PUCCH_F2F3F4:
459             break;
460          default:
461             DU_LOG("\nERROR  -->  LWR_MAC: Invalid Pdu Type %d at procmacUciInd()", macUciInd->pdus[pduIdx].pduType);
462             ret = RFAILED;
463             break;
464       }
465    }
466    if(!ret)
467    {
468       FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_UCI_IND_TO_MAC);
469       ret = (*sendUciIndOpts[pst.selector])(&pst, macUciInd);
470    }
471    else
472    {
473       DU_LOG("\nERROR  -->  LWR_MAC: Failed sending UCI Ind to MAC");
474    }
475    return ret;
476 }
477 #endif /* FAPI */
478
479 /*******************************************************************
480  * @brief Function prints src, dest, msg infor about all the msgs that
481  received.
482  *
483  * @details
484  *
485  *     Function :callFlowFromPhyToLwrMac 
486  *
487  *     Function call Flow From Phy To LwrMac
488  *
489  *  @param[in]  Pst     *pst, Post structure of the primitive.
490  *
491  *  @return  void
492  * ****************************************************************/
493 void callFlowFromPhyToLwrMac(uint16_t msgId)
494 {
495    char message[100];
496    switch(msgId)
497    {
498 #ifdef INTEL_TIMER_MODE
499       case FAPI_VENDOR_EXT_UL_IQ_SAMPLES:
500          strcpy(message,"FAPI_VENDOR_EXT_UL_IQ_SAMPLES");
501          break;
502 #endif
503       case FAPI_PARAM_RESPONSE:
504          strcpy(message,"FAPI_PARAM_RESPONSE");
505          break;
506       case FAPI_CONFIG_RESPONSE:
507          strcpy(message,"FAPI_CONFIG_RESPONSE");
508          break;
509       case FAPI_SLOT_INDICATION:
510          strcpy(message,"FAPI_SLOT_INDICATION");
511          break;
512       case FAPI_ERROR_INDICATION:
513          strcpy(message,"FAPI_ERROR_INDICATION");
514          break;
515       case FAPI_RX_DATA_INDICATION:
516          strcpy(message,"FAPI_RX_DATA_INDICATION");
517          break;
518       case FAPI_CRC_INDICATION:
519          strcpy(message,"FAPI_CRC_INDICATION");
520          break;
521       case FAPI_UCI_INDICATION:
522          strcpy(message,"FAPI_UCI_INDICATION");
523          break;
524       case FAPI_SRS_INDICATION:
525          strcpy(message,"FAPI_SRS_INDICATION");
526          break;
527       case FAPI_RACH_INDICATION:
528          strcpy(message,"FAPI_RACH_INDICATION");
529          break;
530       case FAPI_STOP_INDICATION:
531          strcpy(message,"FAPI_STOP_INDICATION");
532          break;
533    }
534    DU_LOG("\nCall Flow: PHY -> ENTLWRMAC : %s\n",message);
535 }
536
537 /*******************************************************************
538  *
539  * @brief Processes message from PHY
540  *
541  * @details
542  *
543  *    Function : procPhyMessages
544  *
545  *    Functionality: Processes message from PHY
546  *
547  * @params[in] 
548  * @return ROK     - success
549  *         RFAILED - failure
550  *
551  * ****************************************************************/
552 void procPhyMessages(uint16_t msgType, uint32_t msgSize, void *msg)
553 {
554 #ifdef INTEL_FAPI
555    /* extract the header */
556    fapi_msg_t *header = NULLP;
557    header = (fapi_msg_t *)msg;
558
559 #ifdef CALL_FLOW_DEBUG_LOG 
560    callFlowFromPhyToLwrMac(header->msg_id);
561 #endif
562
563    switch(header->msg_id)
564    {
565 #ifdef INTEL_TIMER_MODE
566       case FAPI_VENDOR_EXT_UL_IQ_SAMPLES:
567          {
568             DU_LOG("\nDEBUG  -->  LWR_MAC: Received FAPI_VENDOR_EXT_UL_IQ_SAMPLES");
569             //send config req
570             uint16_t cellId = 1;
571             sendToLowerMac(CONFIG_REQUEST, 0, (void *)&cellId);
572             break;
573          } 
574 #endif
575       case FAPI_PARAM_RESPONSE:
576          {
577             sendToLowerMac(PARAM_RESPONSE, msgSize, msg);
578             break;
579          }
580       case FAPI_CONFIG_RESPONSE:
581          {
582             sendToLowerMac(CONFIG_RESPONSE, msgSize, msg);
583             break;
584          }
585       case FAPI_SLOT_INDICATION:
586          {
587             if(lwrMacCb.phyState == PHY_STATE_CONFIGURED)
588             {
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;
592             }
593
594             fapi_slot_ind_t *slotInd = NULLP;
595             slotInd  = (fapi_slot_ind_t *)msg;
596             procSlotInd(slotInd);
597             break;
598          }
599       case FAPI_ERROR_INDICATION:
600          {
601             break;
602          }
603       case FAPI_RX_DATA_INDICATION:
604          {
605             fapi_rx_data_indication_t *rxDataInd;
606             rxDataInd = (fapi_rx_data_indication_t *)msg;
607             procRxDataInd(rxDataInd);
608             break;
609          }  
610       case FAPI_CRC_INDICATION:
611          {
612             fapi_crc_ind_t  *crcInd;
613             crcInd = (fapi_crc_ind_t *)msg;
614             procCrcInd(crcInd);
615             break;
616          }  
617       case FAPI_UCI_INDICATION:
618          {
619             fapi_uci_indication_t *phyUciInd = NULLP;
620             phyUciInd = (fapi_uci_indication_t*)msg;
621             procUciInd(phyUciInd);
622             break;
623          }
624       case FAPI_SRS_INDICATION:
625          {
626             break;
627          }  
628       case FAPI_RACH_INDICATION:
629          {
630             fapi_rach_indication_t  *rachInd;
631             rachInd = (fapi_rach_indication_t *)msg;
632             procRachInd(rachInd);
633             break;
634          }
635       case FAPI_STOP_INDICATION:
636          {
637             DU_LOG("\nINFO  -->  LWR_MAC: Handling Stop Indication");
638             procStopInd();
639             break;
640          }  
641    }
642 #endif
643 }
644
645 /**********************************************************************
646   End of file
647  **********************************************************************/