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 /*This file contains stub for PHY to handle messages to/from MAC CL */
31 #include "lwr_mac_phy.h"
35 #include "lphy_stub.h"
40 #define MAX_SLOT_VALUE 9
41 #define MAX_SFN_VALUE 1023
44 uint16_t sfnValue = 0;
45 uint16_t slotValue = 0;
46 bool rachIndSent = false;
48 EXTERN void phyToMac ARGS((uint16_t msgType, uint32_t msgLen,void *msg));
50 EXTERN void fillTlvs ARGS((fapi_uint16_tlv_t *tlv, uint16_t tag, uint16_t
51 length, uint16_t value, uint32_t *msgLen));
52 EXTERN void fillMsgHeader ARGS((fapi_msg_t *hdr, uint16_t msgType, uint16_t msgLen));
54 EXTERN void handlePhyMessages(uint16_t msgType, uint32_t msgSize, void *msg);
56 /*******************************************************************
58 * @brief Builds and sends param response to MAC CL
62 * Function : l1BldAndSndParamRsp
65 * - Builds and sends param response to MAC
67 * @params[in] Config request message pointer
68 * @return ROK - success
71 * ****************************************************************/
72 S16 l1BldAndSndParamRsp(void *msg)
77 fapi_param_resp_t *fapiParamRsp = (fapi_param_resp_t *)msg;
80 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_RELEASE_CAPABILITY_TAG, sizeof(uint16_t), 1, &msgLen);
81 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PHY_STATE_TAG, sizeof(uint16_t), 0, &msgLen);
82 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SKIP_BLANK_DL_CONFIG_TAG, sizeof(uint8_t), 0, &msgLen);
83 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SKIP_BLANK_UL_CONFIG_TAG, sizeof(uint8_t), 0, &msgLen);
84 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_NUM_CONFIG_TLVS_TO_REPORT_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
87 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CYCLIC_PREFIX_TAG, sizeof(uint8_t), 1, &msgLen);
88 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_SUBCARRIER_SPACING_DL_TAG, sizeof(uint8_t), 1, &msgLen);
89 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_BANDWIDTH_DL_TAG, sizeof(uint16_t), 1, &msgLen);
90 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_SUBCARRIER_SPACING_UL_TAG, sizeof(uint8_t), 0, &msgLen);
91 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_BANDWIDTH_UL_TAG, sizeof(uint16_t), 0, &msgLen);
94 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CCE_MAPPING_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
95 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
96 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRECODER_GRANULARITY_CORESET_TAG, sizeof(uint8_t), 0, &msgLen);
97 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDCCH_MU_MIMO_TAG, sizeof(uint8_t), 0, &msgLen);
98 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDCCH_PRECODER_CYCLING_TAG, sizeof(uint8_t), 0, &msgLen);
99 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDCCHS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
102 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUCCH_FORMATS_TAG, sizeof(uint8_t), 0, &msgLen);
103 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PUCCHS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
106 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_MAPPING_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
107 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_ALLOCATION_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
108 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_VRB_TO_PRB_MAPPING_TAG, sizeof(uint8_t), 0, &msgLen);
109 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_CBG_TAG, sizeof(uint8_t), 0, &msgLen);
110 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_CONFIG_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
111 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_MAX_LENGTH_TAG, sizeof(uint8_t), 0, &msgLen);
112 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_ADDITIONAL_POS_TAG, sizeof(uint8_t), 0, &msgLen);
113 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDSCHS_TBS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
114 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, sizeof(uint8_t), 0, &msgLen);
115 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_MAX_MODULATION_ORDER_DL_TAG, sizeof(uint8_t), 0, &msgLen);
116 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_MU_MIMO_USERS_DL_TAG, sizeof(uint8_t), 0, &msgLen);
117 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, sizeof(uint8_t), 0, &msgLen);
118 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PREMPTIONSUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
119 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_NON_SLOT_SUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
122 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_UCI_MUX_ULSCH_IN_PUSCH_TAG, sizeof(uint8_t), 0, &msgLen);
123 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_UCI_ONLY_PUSCH_TAG, sizeof(uint8_t), 0, &msgLen);
124 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_FREQUENCY_HOPPING_TAG, sizeof(uint8_t), 0, &msgLen);
125 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_CONFIG_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
126 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_MAX_LEN_TAG, sizeof(uint8_t), 0, &msgLen);
127 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_ADDITIONAL_POS_TAG, sizeof(uint8_t), 0, &msgLen);
128 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_CBG_TAG, sizeof(uint8_t), 0, &msgLen);
129 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_MAPPING_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
130 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_ALLOCATION_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
131 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_VRB_TO_PRB_MAPPING_TAG, sizeof(uint8_t), 0, &msgLen);
132 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_MAX_PTRS_PORTS_TAG, sizeof(uint8_t), 0, &msgLen);
133 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDUSCHS_TBS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
134 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, sizeof(uint8_t), 0, &msgLen);
135 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_MODULATION_ORDER_UL_TAG, sizeof(uint8_t), 0, &msgLen);
136 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_MU_MIMO_USERS_UL_TAG, sizeof(uint8_t), 0, &msgLen);
137 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_DFTS_OFDM_SUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
138 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_AGGREGATION_FACTOR_TAG, sizeof(uint8_t), 0, &msgLen);
141 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_LONG_FORMATS_TAG, sizeof(uint8_t), 0, &msgLen);
142 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_SHORT_FORMATS_TAG, sizeof(uint8_t), 0, &msgLen);
143 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_RESTRICTED_SETS_TAG, sizeof(uint8_t), 0, &msgLen);
144 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
146 /* MEASUREMENT TAG */
147 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_RSSI_MEASUREMENT_SUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
149 fapiParamRsp->number_of_tlvs = index;
150 msgLen = msgLen + sizeof(fapi_param_resp_t);
152 fillMsgHeader(&fapiParamRsp->header, FAPI_PARAM_RESPONSE, msgLen);
153 fapiParamRsp->error_code = MSG_OK;
154 DU_LOG("\nPHY_STUB: Sending Param Request to Lower Mac");
155 handlePhyMessages(fapiParamRsp->header.message_type_id, sizeof(fapi_param_resp_t), (void *)fapiParamRsp);
160 /*******************************************************************
162 * @brief Builds and sends config response to lower mac
166 * Function : l1BldAndSndConfigRsp
169 * - Builds and sends config response to MAC
171 * @params[in] Config request message pointer
172 * @return ROK - success
175 * ****************************************************************/
177 S16 l1BldAndSndConfigRsp(void *msg)
181 fapi_config_resp_t *fapiConfigRsp = (fapi_config_resp_t *)msg;
183 if(fapiConfigRsp != NULL)
185 fapiConfigRsp->number_of_invalid_tlvs = NULLP;
186 fapiConfigRsp->number_of_inv_tlvs_idle_only = NULLP;
187 fapiConfigRsp->number_of_missing_tlvs = NULLP;
188 fapiConfigRsp->error_code = MSG_OK;
189 msgLen += sizeof(fapi_config_resp_t);
190 fillMsgHeader(&fapiConfigRsp->header, FAPI_CONFIG_RESPONSE, msgLen);
191 DU_LOG("\nPHY_STUB: Sending Config Response to Lower Mac");
192 handlePhyMessages(fapiConfigRsp->header.message_type_id, sizeof(fapi_config_resp_t), (void *)fapiConfigRsp);
198 /*******************************************************************
200 * @brief Handles param request received from MAC
204 * Function : l1HdlParamReq
207 * -Handles param request received from MAC
209 * @params[in] Message length
210 * Param request message pointer
214 * ****************************************************************/
216 PUBLIC void l1HdlParamReq(uint32_t msgLen, void *msg)
218 DU_LOG("\nPHY_STUB: Received Param Request in PHY");
219 /* Handling PARAM RESPONSE */
220 if(l1BldAndSndParamRsp(msg)!= ROK)
222 DU_LOG("\nPHY_STUB: Failed Sending Param Response");
226 /*******************************************************************
228 * @brief Handles config request received from MAC
232 * Function : l1HdlConfigReq
235 * -Handles config request received from MAC
237 * @params[in] Message length
238 * config request message pointer
242 * ****************************************************************/
244 PUBLIC void l1HdlConfigReq(uint32_t msgLen, void *msg)
246 DU_LOG("\nPHY_STUB: Received Config Request in PHY");
248 /* Handling CONFIG RESPONSE */
249 if(l1BldAndSndConfigRsp(msg)!= ROK)
251 printf("\nPHY_STUB: Failed Sending config Response");
256 /*******************************************************************
258 * @brief Builds and Sends RACH indication to MAC
262 * Function : l1BuildAndSendRachInd
265 * Builds and Sends RACH indication to MAC
267 * @params[in] SFN value
269 * @return ROK - success
272 * ****************************************************************/
273 uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn)
276 uint8_t rachPduIdx = 0;
277 uint8_t preamIdx = 0;
278 fapi_rach_pdu_t *rachPdu;
279 fapi_rach_indication_t *rachInd;
281 /* Building RACH indication */
282 if(SGetSBuf(0, 0, (Data **)&rachInd, sizeof(fapi_rach_indication_t)) != ROK)
284 printf("\nPHY_STUB: Memory allocation failed for Rach Indication Message");
289 rachInd->slot = slot;
290 rachInd->numPdus = 1;
292 rachPdu = &rachInd->rachPdu[rachPduIdx];
293 rachPdu->physCellId = NR_PCI;
294 rachPdu->symbolIndex = 0;
295 rachPdu->slotIndex = slot;
296 rachPdu->freqIndex = 0;
297 rachPdu->avgRssi = 0;
299 rachPdu->numPreamble = 1;
301 rachPdu->preambleInfo[preamIdx].preambleIndex = 3;
302 rachPdu->preambleInfo[preamIdx].timingAdvance = 0;
303 rachPdu->preambleInfo[preamIdx].premblePwr = 0;
305 fillMsgHeader(&rachInd->header, FAPI_RACH_INDICATION, \
306 sizeof(fapi_rach_indication_t));
308 /* Sending RACH indication to MAC */
309 DU_LOG("\nPHY STUB: Sending RACH Indication to MAC");
310 handlePhyMessages(rachInd->header.message_type_id, sizeof(fapi_rach_indication_t), (void *)rachInd);
311 SPutSBuf(0, 0, (Data *)rachInd, sizeof(fapi_rach_indication_t));
316 /*******************************************************************
318 * @brief Builds and Send the Slot Indication message to MAC
322 * Function : l1BuildAndSendSlotIndication
325 * -Send the Slot indication Message to MAC
327 * @params[in] Message length
328 * config request message pointer
332 * ****************************************************************/
333 PUBLIC uint16_t l1BuildAndSendSlotIndication()
336 fapi_slot_ind_t *slotIndMsg;
337 if(SGetSBuf(0, 0, (Data **)&slotIndMsg, sizeof(slotIndMsg)) != ROK)
339 DU_LOG("\nPHY_STUB: Memory allocation failed for slot Indication Message");
345 if(sfnValue > MAX_SFN_VALUE && slotValue > MAX_SLOT_VALUE)
350 else if(slotValue > MAX_SLOT_VALUE)
355 slotIndMsg->sfn = sfnValue;
356 slotIndMsg->slot = slotValue;
357 fillMsgHeader(&slotIndMsg->header, FAPI_SLOT_INDICATION, sizeof(fapi_slot_ind_t));
358 DU_LOG("\n\nPHY_STUB: SLOT indication [%d:%d]",sfnValue,slotValue);
359 handlePhyMessages(slotIndMsg->header.message_type_id, sizeof(fapi_slot_ind_t), (void*)slotIndMsg);
360 SPutSBuf(0, 0, (Data *)slotIndMsg, sizeof(slotIndMsg));
366 /*******************************************************************
368 * @brief Handles start request received from MAC
372 * Function : l1HdlStartReq
375 * -Handles start request received from MAC
377 * @params[in] Message length
378 * config request message pointer
382 * ****************************************************************/
384 PUBLIC S16 l1HdlStartReq(uint32_t msgLen, void *msg)
386 if(clGlobalCp.phyState == PHY_STATE_CONFIGURED)
388 duStartSlotIndicaion();
390 SPutSBuf(0, 0, (Data *)msg, sizeof(fapi_start_req_t));
396 DU_LOG("\nPHY_STUB: Received Start Req in PHY State %d", clGlobalCp.phyState);
401 /*******************************************************************
403 * @brief Handles Dl Tti request received from MAC
407 * Function : l1HdlDlTtiReq
410 * -Handles Dl Tti request received from MAC
412 * @params[in] Message length
413 * Dl Tti request message pointer
417 * ****************************************************************/
419 PUBLIC S16 l1HdlDlTtiReq(uint16_t msgLen, void *msg)
422 fapi_dl_tti_req_t *dlTtiReq;
423 dlTtiReq = (fapi_dl_tti_req_t *)msg;
425 printf("\nPHY STUB: Received DL TTI Request");
427 printf("\nPHY_STUB: SFN %d", dlTtiReq->sfn);
428 printf("\nPHY_STUB: SLOT %d", dlTtiReq->slot);
429 printf("\nPHY_STUB: nPdus %d", dlTtiReq->nPdus);
430 printf("\nPHY_STUB: nGroup %d", dlTtiReq->nGroup);
431 /* Printing SSB CONFIGURED VALUES */
432 printf("\nPHY_STUB: physCellId %d", dlTtiReq->pdus->u.ssb_pdu.physCellId);
433 printf("\nPHY_STUB: betaPss %d", dlTtiReq->pdus->u.ssb_pdu.betaPss);
434 printf("\nPHY_STUB: ssbBlockIndex %d", dlTtiReq->pdus->u.ssb_pdu.ssbBlockIndex);
435 printf("\nPHY_STUB: ssbSubCarrierOffset %d", dlTtiReq->pdus->u.ssb_pdu.ssbSubCarrierOffset);
436 printf("\nPHY_STUB: ssbOffsetPointA %d", dlTtiReq->pdus->u.ssb_pdu.ssbOffsetPointA);
437 printf("\nPHY_STUB: bchPayloadFlag %d", dlTtiReq->pdus->u.ssb_pdu.bchPayloadFlag);
438 printf("\nPHY_STUB: bchPayload %x", dlTtiReq->pdus->u.ssb_pdu.bchPayload);
440 uint8_t pduCount = 0;
441 if(dlTtiReq->nPdus == 0)
443 DU_LOG("\nPHY_STUB: No PDU in DL TTI Request");
445 for(pduCount=0; pduCount<dlTtiReq->nPdus; pduCount++)
447 if(dlTtiReq->pdus[pduCount].pduType == 3) //SSB_PDU_TYPE
448 DU_LOG("\nPHY_STUB: SSB PDU");
449 else if(dlTtiReq->pdus[pduCount].pduType == 0)
450 DU_LOG("\nPHY_STUB: PDCCH PDU");
451 else if(dlTtiReq->pdus[pduCount].pduType == 1)
452 DU_LOG("\nPHY_STUB: PDSCH PDU");
458 /*******************************************************************
460 * @brief Handles tx_data request received from MAC
464 * Function : l1HdlTxDataReq
467 * -Handles tx_data request received from MAC
469 * @params[in] Message length
470 * tx_data request message pointer
474 * ****************************************************************/
476 PUBLIC S16 l1HdlTxDataReq(uint16_t msgLen, void *msg)
479 DU_LOG("\nPHY STUB: Received TX DATA Request");
481 fapi_tx_data_req_t *txDataReq;
482 txDataReq = (fapi_dl_tti_req_t *)msg;
486 /*******************************************************************
488 * @brief Handles Ul Tti request received from MAC
492 * Function : l1HdlUlTtiReq
495 * -Handles Ul Tti request received from MAC
497 * @params[in] Message length
498 * Ul Tti request message pointer
502 * ****************************************************************/
504 PUBLIC S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg)
507 fapi_ul_tti_req_t *ulTtiReq;
509 DU_LOG("\nPHY STUB: Received UL TTI Request");
511 ulTtiReq = (fapi_ul_tti_req_t *)msg;
512 uint8_t numPdus = ulTtiReq->nPdus;
516 DU_LOG("\nPHY STUB: No PDU in UL TTI");
520 if(ulTtiReq->pdus->pduType == 0)
521 DU_LOG("\nPHY STUB: PRACH PDU");
524 if(rachIndSent == false && ulTtiReq->slot == 8)
527 l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
534 /*******************************************************************
536 * @brief Receives message from MAC
540 * Function : l1ProcessFapiRequest
543 * - Receives message from MAC and calls handler
545 * @params[in] Message type
551 * ****************************************************************/
553 void l1ProcessFapiRequest(uint8_t msgType, uint32_t msgLen, void *msg)
558 case FAPI_PARAM_REQUEST:
559 l1HdlParamReq(msgLen, msg);
561 case FAPI_CONFIG_REQUEST:
562 l1HdlConfigReq(msgLen, msg);
564 case FAPI_START_REQUEST:
565 l1HdlStartReq(msgLen, msg);
567 case FAPI_DL_TTI_REQUEST:
568 l1HdlDlTtiReq(msgLen, msg);
570 case FAPI_TX_DATA_REQUEST:
571 l1HdlTxDataReq(msgLen, msg);
573 case FAPI_UL_TTI_REQUEST:
574 l1HdlUlTtiReq(msgLen, msg);
577 DU_LOG("\nPHY_STUB: Invalid message type[%x] received at PHY", msgType);
582 /**********************************************************************
584 **********************************************************************/