Merge "VES PNF Registration Request changes."
[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 "fapi.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    SlotIndInfo *slotInd = {0};
110
111    MAC_ALLOC_SHRABL_BUF(slotInd, sizeof(SlotIndInfo));
112    if(slotInd)
113    {
114       slotInd->cellId = lwrMacCb.cellCb[0].cellId; 
115       slotInd->sfn = fapiSlotInd->sfn;
116       slotInd->slot = fapiSlotInd->slot;
117
118       FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_SLOT_IND_TO_MAC);
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    return (*sendStopIndOpts[pst.selector])(&pst, cellId);
163 }
164
165 /*******************************************************************
166  *
167  * @brief Processes Rach Indication from PHY and sends to MAC
168  *
169  * @details
170  *
171  *    Function : procRachInd
172  *
173  *    Functionality:
174  *         Processes Rach Indication from PHY and sends to MAC
175  *
176  * @params[in] fapi_rach_indication_t pointer
177  * @return ROK     - success
178  *         RFAILED - failure
179  *
180  * ****************************************************************/
181 uint8_t procRachInd(fapi_rach_indication_t  *fapiRachInd)
182 {
183 /* TODO : Remove the following #ifndef TEMP_INTG_FLAG, when testing 
184  * RACH.indication in radio mode integration */
185 #ifndef TEMP_INTG_FLAG
186    Pst          pst;
187    uint8_t      pduIdx;
188    uint8_t      prmbleIdx;
189    RachPduInfo  *rachPdu = NULLP;
190    RachInd      *rachInd = NULLP;
191
192    MAC_ALLOC_SHRABL_BUF(rachInd, sizeof(RachInd));
193    if(!rachInd)
194    {
195       DU_LOG("\nERROR  -->  LWR_MAC: Memory Allocation failed in procRachInd");
196       return RFAILED;
197    }
198
199    rachInd->cellId = lwrMacCb.cellCb[0].cellId;
200    rachInd->timingInfo.sfn = fapiRachInd->sfn;
201    rachInd->timingInfo.slot = fapiRachInd->slot;
202    rachInd->numPdu = fapiRachInd->numPdus;
203    for(pduIdx=0; pduIdx < rachInd->numPdu; pduIdx++)
204    {
205       rachPdu = &rachInd->rachPdu[pduIdx];
206       rachPdu->pci = fapiRachInd->rachPdu[pduIdx].phyCellId;
207       rachPdu->symbolIdx = fapiRachInd->rachPdu[pduIdx].symbolIndex;
208       rachPdu->slotIdx = fapiRachInd->rachPdu[pduIdx].slotIndex;
209       rachPdu->freqIdx = fapiRachInd->rachPdu[pduIdx].freqIndex;
210       rachPdu->numPream = fapiRachInd->rachPdu[pduIdx].numPreamble; 
211       for(prmbleIdx=0; prmbleIdx<rachPdu->numPream; prmbleIdx++)
212       {
213          rachPdu->preamInfo[prmbleIdx].preamIdx = \
214             fapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].preambleIndex;
215          rachPdu->preamInfo[prmbleIdx].timingAdv = \
216             fapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].timingAdvance;
217       }
218    }
219
220    /* Fill post and sent to MAC */
221    FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_RACH_IND_TO_MAC);
222    return (*sendRachIndOpts[pst.selector])(&pst, rachInd);
223 #else
224    return ROK;
225 #endif
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
260    crcInd->cellId = lwrMacCb.cellCb[0].cellId;
261    crcInd->timingInfo.sfn = fapiCrcInd->sfn;
262    crcInd->timingInfo.slot = fapiCrcInd->slot;
263    crcInd->numCrc = fapiCrcInd->numCrcs;
264
265    for(crcInfoIdx = 0; crcInfoIdx < crcInd->numCrc; crcInfoIdx++)
266    {
267       crcIndInfo = &crcInd->crcInfo[crcInfoIdx];
268       crcIndInfo->handle      = fapiCrcInd->crc[crcInfoIdx].handle;
269       crcIndInfo->rnti        = fapiCrcInd->crc[crcInfoIdx].rnti;
270       crcIndInfo->harqId      = fapiCrcInd->crc[crcInfoIdx].harqId;
271       crcIndInfo->tbCrcStatus = fapiCrcInd->crc[crcInfoIdx].tbCrcStatus;
272       crcIndInfo->numCb       = fapiCrcInd->crc[crcInfoIdx].numCb;
273       for(crcStatusIdx = 0; crcStatusIdx < crcIndInfo->numCb; crcStatusIdx++)
274       {
275          crcIndInfo->cbCrcStatus[crcStatusIdx] = \
276             fapiCrcInd->crc[crcInfoIdx].cbCrcStatus[crcStatusIdx];
277       }
278       crcIndInfo->ul_cqi  = fapiCrcInd->crc[crcInfoIdx].ul_cqi;
279       crcIndInfo->timingAdvance = fapiCrcInd->crc[crcInfoIdx].timingAdvance;
280       crcIndInfo->rssi = fapiCrcInd->crc[crcInfoIdx].rssi;
281    }
282
283    /* Fill post and sent to MAC */
284    FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_CRC_IND_TO_MAC);
285    return (*sendCrcIndOpts[pst.selector])(&pst, crcInd);
286 } /* handleCrcInd */
287
288 /*******************************************************************
289  *
290  * @brief Handles Rx Data indication from PHY and sends to MAC
291  *
292  * @details
293  *
294  *    Function : procRxDataInd
295  *
296  *    Functionality:
297  *      Handles Rx Data indication from PHY and sends to MAC
298  *
299  * @params[in] fapi_rx_data_indication_t message pointer
300  * @return ROK     - success
301  *         RFAILED - failure
302  *
303  * ****************************************************************/
304
305 uint8_t procRxDataInd(fapi_rx_data_indication_t  *fapiRxDataInd)
306 {
307    Pst           pst;
308    uint8_t       pduIdx =0;
309    RxDataInd     *rxDataInd = NULLP;
310    RxDataIndPdu  *pdu = NULLP;   
311
312    MAC_ALLOC_SHRABL_BUF(rxDataInd, sizeof(RxDataInd));
313    if(!rxDataInd)
314    {
315       DU_LOG("\nERROR  -->  LWR_MAC: Memory Allocation failed in procRxDataInd");
316       return RFAILED;
317    }
318
319    rxDataInd->cellId = lwrMacCb.cellCb[0].cellId;
320    rxDataInd->timingInfo.sfn = fapiRxDataInd->sfn; 
321    rxDataInd->timingInfo.slot = fapiRxDataInd->slot;
322    rxDataInd->numPdus = fapiRxDataInd->numPdus;
323
324    for(pduIdx = 0; pduIdx < rxDataInd->numPdus; pduIdx++)
325    {
326       pdu = &rxDataInd->pdus[pduIdx];
327       pdu->handle = fapiRxDataInd->pdus[pduIdx].handle;
328       pdu->rnti = fapiRxDataInd->pdus[pduIdx].rnti;
329       pdu->harqId = fapiRxDataInd->pdus[pduIdx].harqId;
330       pdu->pduLength = fapiRxDataInd->pdus[pduIdx].pdu_length;
331       pdu->ul_cqi = fapiRxDataInd->pdus[pduIdx].ul_cqi;
332       pdu->timingAdvance = fapiRxDataInd->pdus[pduIdx].timingAdvance;
333       pdu->rssi = fapiRxDataInd->pdus[pduIdx].rssi;
334
335       MAC_ALLOC_SHRABL_BUF(pdu->pduData, pdu->pduLength);
336       memcpy(pdu->pduData, fapiRxDataInd->pdus[pduIdx].pduData, pdu->pduLength);
337 #ifdef INTEL_WLS_MEM      
338       /* Free WLS memory allocated for Rx PDU */
339       WLS_MEM_FREE(fapiRxDataInd->pdus[pduIdx].pduData, LWR_MAC_WLS_BUF_SIZE);
340 #endif
341    }
342
343    /* Fill post and sent to MAC */
344    FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_RX_DATA_IND_TO_MAC);
345    return (*sendRxDataIndOpts[pst.selector])(&pst, rxDataInd);
346 }
347
348 /*******************************************************************
349  *
350  * @brief Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1
351  *
352  * @details
353  *
354  *    Function : fillUciIndPucchF0F1
355  *
356  *    Functionality:
357  *       Fills Uci Ind Pdu Info carried on Pucch Format 0/Format 1
358  *
359  *@params[in] UciPucchF0F1 *
360  *            fapi_uci_o_pucch_f0f1_t *
361  * @return ROK     - success
362  *         RFAILED - failure
363  *
364  * ****************************************************************/
365 uint8_t fillUciIndPucchF0F1(UciPucchF0F1 *pduInfo, fapi_uci_o_pucch_f0f1_t *fapiPduInfo)
366 {
367
368    uint8_t harqIdx;
369    uint8_t ret = ROK;
370    
371    pduInfo->handle        = fapiPduInfo->handle;
372    pduInfo->pduBitmap     = fapiPduInfo->pduBitmap;
373    pduInfo->pucchFormat   = fapiPduInfo->pucchFormat;
374    pduInfo->ul_cqi        = fapiPduInfo->ul_cqi;
375    pduInfo->crnti         = fapiPduInfo->rnti;
376    pduInfo->timingAdvance = fapiPduInfo->timingAdvance;
377    pduInfo->rssi          = fapiPduInfo->rssi;   
378    if(fapiPduInfo->srInfo.srIndication)
379    {
380       pduInfo->srInfo.srIndPres = fapiPduInfo->srInfo.srIndication;
381       pduInfo->srInfo.srConfdcLevel = fapiPduInfo->srInfo.srConfidenceLevel;
382    }
383    if(fapiPduInfo->harqInfo.numHarq)
384    {
385       pduInfo->harqInfo.numHarq = fapiPduInfo->harqInfo.numHarq;
386       pduInfo->harqInfo.harqConfdcLevel = fapiPduInfo->harqInfo.harqConfidenceLevel;
387       for(harqIdx = 0; harqIdx < pduInfo->harqInfo.numHarq; harqIdx++)
388       {
389          pduInfo->harqInfo.harqValue[harqIdx] = fapiPduInfo->harqInfo.harqValue[harqIdx];
390       }
391    }
392    return ret;
393 }
394
395 /*******************************************************************
396  *
397  * @brief Handles Uci indication from PHY and sends to MAC
398  *
399  * @details
400  *
401  *    Function : procUciInd
402  *
403  *    Functionality:
404  *      Handles Uci indication from PHY and sends to MAC
405  *
406  * @params[in] fapi_uci_indication_t message pointer
407  * @return ROK     - success
408  *         RFAILED - failure
409  *
410  * ****************************************************************/
411
412 uint8_t procUciInd(fapi_uci_indication_t  *fapiUciInd)
413 {
414    uint8_t pduIdx;
415    uint8_t ret = ROK;
416    Pst     pst;
417    UciInd  *macUciInd = NULLP;
418
419    MAC_ALLOC_SHRABL_BUF(macUciInd, sizeof(UciInd));
420    if(!macUciInd)
421    {
422       DU_LOG("\nERROR  -->  LWR_MAC: Memory Allocation failed in procUciInd");
423       return RFAILED;
424    }
425
426    DU_LOG("\nDEBUG  -->  LWR_MAC: Processing UCI Indication");
427    memset(macUciInd, 0, sizeof(UciInd));
428    macUciInd->cellId = lwrMacCb.cellCb[0].cellId;
429    macUciInd->slotInd.sfn = fapiUciInd->sfn; 
430    macUciInd->slotInd.slot = fapiUciInd->slot;
431    macUciInd->numUcis = fapiUciInd->numUcis;
432
433    for(pduIdx = 0; pduIdx < macUciInd->numUcis; pduIdx++)
434    {
435       macUciInd->pdus[pduIdx].pduType = fapiUciInd->uciPdu[pduIdx].pduType;
436       switch(macUciInd->pdus[pduIdx].pduType)
437       {
438          case UCI_IND_PUSCH:
439          break;
440          case UCI_IND_PUCCH_F0F1:
441          {
442             UciPucchF0F1 *pduInfo = NULLP;
443             macUciInd->pdus[pduIdx].pduSize = fapiUciInd->uciPdu[pduIdx].pduSize;
444             pduInfo = &macUciInd->pdus[pduIdx].uci.uciPucchF0F1;
445             ret = fillUciIndPucchF0F1(pduInfo, &fapiUciInd->uciPdu[pduIdx].uci.uciPucchF0F1);
446          }
447          break;
448          case UCI_IND_PUCCH_F2F3F4:
449             break;
450          default:
451             DU_LOG("\nERROR  -->  LWR_MAC: Invalid Pdu Type %d at procmacUciInd()", macUciInd->pdus[pduIdx].pduType);
452             ret = RFAILED;
453             break;
454       }
455    }
456    if(!ret)
457    {
458       FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_UCI_IND_TO_MAC);
459       ret = (*sendUciIndOpts[pst.selector])(&pst, macUciInd);
460    }
461    else
462    {
463       DU_LOG("\nERROR  -->  LWR_MAC: Failed sending UCI Ind to MAC");
464    }
465    return ret;
466 }
467 #endif /* FAPI */
468
469 /*******************************************************************
470  *
471  * @brief Processes message from PHY
472  *
473  * @details
474  *
475  *    Function : procPhyMessages
476  *
477  *    Functionality: Processes message from PHY
478  *
479  * @params[in] 
480  * @return ROK     - success
481  *         RFAILED - failure
482  *
483  * ****************************************************************/
484 void procPhyMessages(uint16_t msgType, uint32_t msgSize, void *msg)
485 {
486 #ifdef INTEL_FAPI
487    /* extract the header */
488    fapi_msg_t *header = NULLP;
489    header = (fapi_msg_t *)msg;
490
491    switch(header->msg_id)
492    {
493 #ifdef INTEL_TIMER_MODE
494       case FAPI_VENDOR_EXT_UL_IQ_SAMPLES:
495          {
496             DU_LOG("\nDEBUG  -->  LWR_MAC: Received FAPI_VENDOR_EXT_UL_IQ_SAMPLES");
497             //send config req
498             uint16_t cellId = 1;
499             sendToLowerMac(CONFIG_REQUEST, 0, (void *)&cellId);
500             break;
501          } 
502 #endif
503       case FAPI_PARAM_RESPONSE:
504          {
505             sendToLowerMac(PARAM_RESPONSE, msgSize, msg);
506             break;
507          }
508       case FAPI_CONFIG_RESPONSE:
509          {
510             sendToLowerMac(CONFIG_RESPONSE, msgSize, msg);
511             break;
512          }
513       case FAPI_SLOT_INDICATION:
514          {
515             if(lwrMacCb.phyState == PHY_STATE_CONFIGURED)
516             {
517                DU_LOG("\nINFO  -->  LWR_MAC: PHY has moved to running state");
518                lwrMacCb.phyState = PHY_STATE_RUNNING;
519                lwrMacCb.cellCb[0].state = PHY_STATE_RUNNING;
520             }
521
522             fapi_slot_ind_t *slotInd = NULLP;
523             slotInd  = (fapi_slot_ind_t *)msg;
524             procSlotInd(slotInd);
525             break;
526          }
527       case FAPI_ERROR_INDICATION:
528          {
529             break;
530          }
531       case FAPI_RX_DATA_INDICATION:
532          {
533             fapi_rx_data_indication_t *rxDataInd;
534             rxDataInd = (fapi_rx_data_indication_t *)msg;
535             procRxDataInd(rxDataInd);
536             break;
537          }  
538       case FAPI_CRC_INDICATION:
539          {
540             fapi_crc_ind_t  *crcInd;
541             crcInd = (fapi_crc_ind_t *)msg;
542             procCrcInd(crcInd);
543             break;
544          }  
545       case FAPI_UCI_INDICATION:
546          {
547             fapi_uci_indication_t *phyUciInd = NULLP;
548             phyUciInd = (fapi_uci_indication_t*)msg;
549             procUciInd(phyUciInd);
550             break;
551          }
552       case FAPI_SRS_INDICATION:
553          {
554             break;
555          }  
556       case FAPI_RACH_INDICATION:
557          {
558             fapi_rach_indication_t  *rachInd;
559             rachInd = (fapi_rach_indication_t *)msg;
560             procRachInd(rachInd);
561             break;
562          }
563       case FAPI_STOP_INDICATION:
564          {
565             DU_LOG("\nINFO  -->  LWR_MAC: Handling Stop Indication");
566             procStopInd();
567             break;
568          }  
569    }
570 #endif
571 }
572
573 /**********************************************************************
574   End of file
575  **********************************************************************/