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"
38 #define MAX_SLOT_VALUE 9
39 #define MAX_SFN_VALUE 1023
41 uint16_t sfnValue = 0;
42 uint16_t slotValue = 0;
43 EXTERN void phyToMac ARGS((uint16_t msgType, uint32_t msgLen,void *msg));
45 EXTERN void fillTlvs ARGS((fapi_uint16_tlv_t *tlv, uint16_t tag, uint16_t
46 length, uint16_t value, uint32_t *msgLen));
47 EXTERN void fillMsgHeader ARGS((fapi_msg_t *hdr, uint16_t msgType, uint16_t msgLen));
49 EXTERN void handlePhyMessages(uint16_t msgType, uint32_t msgSize, void *msg);
51 /*******************************************************************
53 * @brief Builds and sends param response to MAC CL
57 * Function : l1BldAndSndParamRsp
60 * - Builds and sends param response to MAC
62 * @params[in] Config request message pointer
63 * @return ROK - success
66 * ****************************************************************/
67 S16 l1BldAndSndParamRsp(void *msg)
72 fapi_param_resp_t *fapiParamRsp = (fapi_param_resp_t *)msg;
75 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_RELEASE_CAPABILITY_TAG, sizeof(uint16_t), 1, &msgLen);
76 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PHY_STATE_TAG, sizeof(uint16_t), 0, &msgLen);
77 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SKIP_BLANK_DL_CONFIG_TAG, sizeof(uint8_t), 0, &msgLen);
78 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SKIP_BLANK_UL_CONFIG_TAG, sizeof(uint8_t), 0, &msgLen);
79 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_NUM_CONFIG_TLVS_TO_REPORT_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
82 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CYCLIC_PREFIX_TAG, sizeof(uint8_t), 1, &msgLen);
83 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_SUBCARRIER_SPACING_DL_TAG, sizeof(uint8_t), 1, &msgLen);
84 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_BANDWIDTH_DL_TAG, sizeof(uint16_t), 1, &msgLen);
85 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_SUBCARRIER_SPACING_UL_TAG, sizeof(uint8_t), 0, &msgLen);
86 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_BANDWIDTH_UL_TAG, sizeof(uint16_t), 0, &msgLen);
89 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CCE_MAPPING_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
90 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
91 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRECODER_GRANULARITY_CORESET_TAG, sizeof(uint8_t), 0, &msgLen);
92 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDCCH_MU_MIMO_TAG, sizeof(uint8_t), 0, &msgLen);
93 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDCCH_PRECODER_CYCLING_TAG, sizeof(uint8_t), 0, &msgLen);
94 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDCCHS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
97 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUCCH_FORMATS_TAG, sizeof(uint8_t), 0, &msgLen);
98 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PUCCHS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
101 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_MAPPING_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
102 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_ALLOCATION_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
103 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_VRB_TO_PRB_MAPPING_TAG, sizeof(uint8_t), 0, &msgLen);
104 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_CBG_TAG, sizeof(uint8_t), 0, &msgLen);
105 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_CONFIG_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
106 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_MAX_LENGTH_TAG, sizeof(uint8_t), 0, &msgLen);
107 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_ADDITIONAL_POS_TAG, sizeof(uint8_t), 0, &msgLen);
108 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDSCHS_TBS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
109 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, sizeof(uint8_t), 0, &msgLen);
110 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_MAX_MODULATION_ORDER_DL_TAG, sizeof(uint8_t), 0, &msgLen);
111 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_MU_MIMO_USERS_DL_TAG, sizeof(uint8_t), 0, &msgLen);
112 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, sizeof(uint8_t), 0, &msgLen);
113 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PREMPTIONSUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
114 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_NON_SLOT_SUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
117 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_UCI_MUX_ULSCH_IN_PUSCH_TAG, sizeof(uint8_t), 0, &msgLen);
118 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_UCI_ONLY_PUSCH_TAG, sizeof(uint8_t), 0, &msgLen);
119 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_FREQUENCY_HOPPING_TAG, sizeof(uint8_t), 0, &msgLen);
120 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_CONFIG_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
121 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_MAX_LEN_TAG, sizeof(uint8_t), 0, &msgLen);
122 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_ADDITIONAL_POS_TAG, sizeof(uint8_t), 0, &msgLen);
123 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_CBG_TAG, sizeof(uint8_t), 0, &msgLen);
124 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_MAPPING_TYPE_TAG, sizeof(uint8_t), 0, &msgLen);
125 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_ALLOCATION_TYPES_TAG, sizeof(uint8_t), 0, &msgLen);
126 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_VRB_TO_PRB_MAPPING_TAG, sizeof(uint8_t), 0, &msgLen);
127 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_MAX_PTRS_PORTS_TAG, sizeof(uint8_t), 0, &msgLen);
128 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDUSCHS_TBS_PER_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
129 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, sizeof(uint8_t), 0, &msgLen);
130 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_MODULATION_ORDER_UL_TAG, sizeof(uint8_t), 0, &msgLen);
131 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_MU_MIMO_USERS_UL_TAG, sizeof(uint8_t), 0, &msgLen);
132 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_DFTS_OFDM_SUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
133 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_AGGREGATION_FACTOR_TAG, sizeof(uint8_t), 0, &msgLen);
136 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_LONG_FORMATS_TAG, sizeof(uint8_t), 0, &msgLen);
137 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_SHORT_FORMATS_TAG, sizeof(uint8_t), 0, &msgLen);
138 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_RESTRICTED_SETS_TAG, sizeof(uint8_t), 0, &msgLen);
139 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, sizeof(uint8_t), 0, &msgLen);
141 /* MEASUREMENT TAG */
142 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_RSSI_MEASUREMENT_SUPPORT_TAG, sizeof(uint8_t), 0, &msgLen);
144 fapiParamRsp->number_of_tlvs = index;
145 msgLen = msgLen + sizeof(fapi_param_resp_t);
147 fillMsgHeader(&fapiParamRsp->header, FAPI_PARAM_RESPONSE, msgLen);
148 fapiParamRsp->error_code = MSG_OK;
149 DU_LOG("\nPHY_STUB: Sending Param Request to Lower Mac");
150 handlePhyMessages(fapiParamRsp->header.message_type_id, sizeof(fapi_param_resp_t), (void *)fapiParamRsp);
155 /*******************************************************************
157 * @brief Builds and sends config response to lower mac
161 * Function : l1BldAndSndConfigRsp
164 * - Builds and sends config response to MAC
166 * @params[in] Config request message pointer
167 * @return ROK - success
170 * ****************************************************************/
172 S16 l1BldAndSndConfigRsp(void *msg)
176 fapi_config_resp_t *fapiConfigRsp = (fapi_config_resp_t *)msg;
178 if(fapiConfigRsp != NULL)
180 fapiConfigRsp->number_of_invalid_tlvs = NULLP;
181 fapiConfigRsp->number_of_inv_tlvs_idle_only = NULLP;
182 fapiConfigRsp->number_of_missing_tlvs = NULLP;
183 fapiConfigRsp->error_code = MSG_OK;
184 msgLen += sizeof(fapi_config_resp_t);
185 fillMsgHeader(&fapiConfigRsp->header, FAPI_CONFIG_RESPONSE, msgLen);
186 DU_LOG("\nPHY_STUB: Sending Config Response to Lower Mac");
187 handlePhyMessages(fapiConfigRsp->header.message_type_id, sizeof(fapi_config_resp_t), (void *)fapiConfigRsp);
194 /*******************************************************************
196 * @brief Handles param request received from MAC
200 * Function : l1HdlParamReq
203 * -Handles param request received from MAC
205 * @params[in] Message length
206 * Param request message pointer
210 * ****************************************************************/
212 PUBLIC void l1HdlParamReq(uint32_t msgLen, void *msg)
214 DU_LOG("\nPHY_STUB: Received Param Request in PHY");
215 /* Handling PARAM RESPONSE */
216 if(l1BldAndSndParamRsp(msg)!= ROK)
218 DU_LOG("\nPHY_STUB: Failed Sending Param Response");
222 /*******************************************************************
224 * @brief Handles config request received from MAC
228 * Function : l1HdlConfigReq
231 * -Handles config request received from MAC
233 * @params[in] Message length
234 * config request message pointer
238 * ****************************************************************/
240 PUBLIC void l1HdlConfigReq(uint32_t msgLen, void *msg)
242 DU_LOG("\nPHY_STUB: Received Config Request in PHY");
244 /* Handling CONFIG RESPONSE */
245 if(l1BldAndSndConfigRsp(msg)!= ROK)
247 printf("\nPHY_STUB: Failed Sending config Response");
251 /*******************************************************************
253 * @brief Builds and Send the Slot Indication message to MAC
257 * Function : buildAndSendSlotIndication
260 * -Send the Slot indication Message to MAC
262 * @params[in] Message length
263 * config request message pointer
267 * ****************************************************************/
268 PUBLIC S16 buildAndSendSlotIndication()
271 fapi_slot_ind_t *slotIndMsg;
272 if(SGetSBuf(0, 0, (Data **)&slotIndMsg, sizeof(slotIndMsg)) != ROK)
274 DU_LOG("\nPHY_STUB: Memory allocation failed for slot Indication Message");
280 if(sfnValue > MAX_SFN_VALUE && slotValue > MAX_SLOT_VALUE)
285 else if(slotValue > MAX_SLOT_VALUE)
290 slotIndMsg->sfn = sfnValue;
291 slotIndMsg->slot = slotValue;
292 fillMsgHeader(&slotIndMsg->header, FAPI_SLOT_INDICATION, sizeof(fapi_slot_ind_t));
293 DU_LOG("\nPHY_STUB [%d:%d] ",sfnValue,slotValue);
294 handlePhyMessages(slotIndMsg->header.message_type_id, sizeof(fapi_slot_ind_t), (void*)slotIndMsg);
295 SPutSBuf(0, 0, (Data *)slotIndMsg, sizeof(slotIndMsg));
301 /*******************************************************************
303 * @brief Handles start request received from MAC
307 * Function : l1HdlStartReq
310 * -Handles start request received from MAC
312 * @params[in] Message length
313 * config request message pointer
317 * ****************************************************************/
319 PUBLIC S16 l1HdlStartReq(uint32_t msgLen, void *msg)
321 if(clGlobalCp.phyState == PHY_STATE_CONFIGURED)
323 duStartSlotIndicaion();
325 SPutSBuf(0, 0, (Data *)msg, sizeof(fapi_start_req_t));
331 DU_LOG("\n PHY_STUB: Received Start Req in PHY State %d", clGlobalCp.phyState);
336 /*******************************************************************
338 * @brief Handles Dl Tti request received from MAC
342 * Function : l1HdlDlTtiReq
345 * -Handles Dl Tti request received from MAC
347 * @params[in] Message length
348 * Dl Tti request message pointer
352 * ****************************************************************/
354 PUBLIC S16 l1HdlDlTtiReq(uint16_t msgLen, void *msg)
357 fapi_dl_tti_req_t *dlTtiReq;
358 dlTtiReq = (fapi_dl_tti_req_t *)msg;
360 printf("\nPHY_STUB: Received DL TTI Request in PHY");
361 printf("\nPHY_STUB: SFN %d", dlTtiReq->sfn);
362 printf("\nPHY_STUB: SLOT %d", dlTtiReq->slot);
363 printf("\nPHY_STUB: nPdus %d", dlTtiReq->nPdus);
364 printf("\nPHY_STUB: nGroup %d", dlTtiReq->nGroup);
365 /* Printing SSB CONFIGURED VALUES */
366 printf("\nPHY_STUB: physCellId %d", dlTtiReq->pdus->u.ssb_pdu.physCellId);
367 printf("\nPHY_STUB: betaPss %d", dlTtiReq->pdus->u.ssb_pdu.betaPss);
368 printf("\nPHY_STUB: ssbBlockIndex %d", dlTtiReq->pdus->u.ssb_pdu.ssbBlockIndex);
369 printf("\nPHY_STUB: ssbSubCarrierOffset %d", dlTtiReq->pdus->u.ssb_pdu.ssbSubCarrierOffset);
370 printf("\nPHY_STUB: ssbOffsetPointA %d", dlTtiReq->pdus->u.ssb_pdu.ssbOffsetPointA);
371 printf("\nPHY_STUB: bchPayloadFlag %d", dlTtiReq->pdus->u.ssb_pdu.bchPayloadFlag);
372 printf("\nPHY_STUB: bchPayload %x", dlTtiReq->pdus->u.ssb_pdu.bchPayload);
374 uint8_t numPdus = dlTtiReq->nPdus;
377 DU_LOG("\nNo PDU \n");
381 if(dlTtiReq->pdus->pduType == 3) //SSB_PDU_TYPE
382 DU_LOG("\nSSB PDU\n");
383 else if(dlTtiReq->pdus->pduType == 0)
384 DU_LOG("\nSIB1 PDCCH PDU\n");
385 else if(dlTtiReq->pdus->pduType == 1)
386 DU_LOG("\nSIB1 PDSCH PDU\n");
391 SPutSBuf(0, 0, (Data *)dlTtiReq, sizeof(fapi_dl_tti_req_t));
395 /*******************************************************************
397 * @brief Receives message from MAC
401 * Function : processFapiRequest
404 * - Receives message from MAC and calls handler
406 * @params[in] Message type
412 * ****************************************************************/
414 void processFapiRequest(uint8_t msgType, uint32_t msgLen, void *msg)
419 case FAPI_PARAM_REQUEST:
420 l1HdlParamReq(msgLen, msg);
422 case FAPI_CONFIG_REQUEST:
423 l1HdlConfigReq(msgLen, msg);
425 case FAPI_START_REQUEST:
426 l1HdlStartReq(msgLen, msg);
428 case FAPI_DL_TTI_REQUEST:
429 l1HdlDlTtiReq(msgLen, msg);
432 DU_LOG("\nPHY_STUB: Invalid message type[%x] received at PHY", msgType);
437 /**********************************************************************
439 **********************************************************************/