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 */
30 #include "rg_cl_phy.h"
35 #include "lphy_stub.h"
37 #define MAX_SLOT_VALUE 9
38 #define MAX_SFN_VALUE 1023
40 uint16_t sfnValue = 0;
41 uint16_t slotValue = 0;
42 EXTERN void phyToMac ARGS((uint16_t msgType, uint32_t msgLen,void *msg));
44 EXTERN void fillTlvs ARGS((fapi_uint16_tlv_t *tlv, uint16_t tag, uint16_t
45 length, uint16_t value, uint32_t *msgLen));
46 EXTERN void fillMsgHeader ARGS((fapi_msg_t *hdr, uint16_t msgType, uint16_t msgLen));
48 EXTERN void sendToLowerMac ARGS((uint16_t msgType, uint32_t msgLen,void *msg));
49 EXTERN void handlePhyMessages ARGS((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 printf("\nPHY_STUB: Sending Param Request to Lower Mac");
150 sendToLowerMac(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)
177 fapi_config_resp_t *fapiConfigRsp = (fapi_config_resp_t *)msg;
179 if(fapiConfigRsp != NULL)
181 fapiConfigRsp->number_of_invalid_tlvs = NULLP;
182 fapiConfigRsp->number_of_inv_tlvs_idle_only = NULLP;
183 fapiConfigRsp->number_of_missing_tlvs = NULLP;
184 fapiConfigRsp->error_code = MSG_OK;
185 msgLen += sizeof(fapi_config_resp_t);
186 fillMsgHeader(&fapiConfigRsp->header, FAPI_CONFIG_RESPONSE, msgLen);
187 printf("\nPHY_STUB: Sending Config Response to Lower Mac");
188 sendToLowerMac(fapiConfigRsp->header.message_type_id, sizeof(fapi_config_resp_t), (void *)fapiConfigRsp);
195 /*******************************************************************
197 * @brief Handles param request received from MAC
201 * Function : l1HdlParamReq
204 * -Handles param request received from MAC
206 * @params[in] Message length
207 * Param request message pointer
211 * ****************************************************************/
213 PUBLIC void l1HdlParamReq(uint32_t msgLen, void *msg)
215 printf("\nPHY_STUB: Received Param Request in PHY");
216 /* Handling PARAM RESPONSE */
217 if(l1BldAndSndParamRsp(msg)!= ROK)
219 printf("\nPHY_STUB: Failed Sending Param Response");
223 /*******************************************************************
225 * @brief Handles config request received from MAC
229 * Function : l1HdlConfigReq
232 * -Handles config request received from MAC
234 * @params[in] Message length
235 * config request message pointer
239 * ****************************************************************/
241 PUBLIC void l1HdlConfigReq(uint32_t msgLen, void *msg)
243 printf("\nPHY_STUB: Received Config Request in PHY");
245 /* Handling CONFIG RESPONSE */
246 if(l1BldAndSndConfigRsp(msg)!= ROK)
248 printf("\nPHY_STUB: Failed Sending config Response");
252 /*******************************************************************
254 * @brief Builds and Send the Slot Indication message to MAC
258 * Function : buildAndSendSlotIndication
261 * -Send the Slot indication Message to MAC
263 * @params[in] Message length
264 * config request message pointer
268 * ****************************************************************/
269 PUBLIC S16 buildAndSendSlotIndication()
272 fapi_slot_ind_t *slotIndMsg;
273 if(SGetSBuf(0, 0, (Data **)&slotIndMsg, sizeof(slotIndMsg)) != ROK)
275 printf("\nPHY_STUB: Memory allocation failed for slot Indication Message");
281 if(sfnValue > MAX_SFN_VALUE && slotValue > MAX_SLOT_VALUE)
286 else if(slotValue > MAX_SLOT_VALUE)
291 slotIndMsg->sfn = sfnValue;
292 slotIndMsg->slot = slotValue;
293 fillMsgHeader(&slotIndMsg->header, FAPI_SLOT_INDICATION, sizeof(fapi_slot_ind_t));
294 printf("\nPHY_STUB [%d:%d] ",sfnValue,slotValue);
295 handlePhyMessages((void*)slotIndMsg);
296 SPutSBuf(0, 0, (Data *)slotIndMsg, sizeof(slotIndMsg));
302 /*******************************************************************
304 * @brief Handles start request received from MAC
308 * Function : l1HdlStartReq
311 * -Handles start request received from MAC
313 * @params[in] Message length
314 * config request message pointer
318 * ****************************************************************/
320 PUBLIC S16 l1HdlStartReq(uint32_t msgLen, void *msg)
322 if(clGlobalCp.phyState == PHY_STATE_CONFIGURED)
324 duStartSlotIndicaion();
326 SPutSBuf(0, 0, (Data *)msg, sizeof(fapi_start_req_t));
332 printf("\n PHY_STUB: Received Start Req in PHY State", clGlobalCp.phyState);
337 /*******************************************************************
339 * @brief Handles Dl Tti request received from MAC
343 * Function : l1HdlDlTtiReq
346 * -Handles Dl Tti request received from MAC
348 * @params[in] Message length
349 * Dl Tti request message pointer
353 * ****************************************************************/
355 PUBLIC S16 l1HdlDlTtiReq(uint16_t msgLen, void *msg)
358 fapi_dl_tti_req_t *dlTtiReq;
359 dlTtiReq = (fapi_dl_tti_req_t *)msg;
361 printf("\nPHY_STUB: Received DL TTI Request in PHY");
362 printf("\nPHY_STUB: SFN %d", dlTtiReq->sfn);
363 printf("\nPHY_STUB: SLOT %d", dlTtiReq->slot);
364 printf("\nPHY_STUB: nPdus %d", dlTtiReq->nPdus);
365 printf("\nPHY_STUB: nGroup %d", dlTtiReq->nGroup);
366 /* Printing SSB CONFIGURED VALUES */
367 printf("\nPHY_STUB: physCellId %d", dlTtiReq->pdus->u.ssb_pdu.physCellId);
368 printf("\nPHY_STUB: betaPss %d", dlTtiReq->pdus->u.ssb_pdu.betaPss);
369 printf("\nPHY_STUB: ssbBlockIndex %d", dlTtiReq->pdus->u.ssb_pdu.ssbBlockIndex);
370 printf("\nPHY_STUB: ssbSubCarrierOffset %d", dlTtiReq->pdus->u.ssb_pdu.ssbSubCarrierOffset);
371 printf("\nPHY_STUB: ssbOffsetPointA %d", dlTtiReq->pdus->u.ssb_pdu.ssbOffsetPointA);
372 printf("\nPHY_STUB: bchPayloadFlag %d", dlTtiReq->pdus->u.ssb_pdu.bchPayloadFlag);
373 printf("\nPHY_STUB: bchPayload %x", dlTtiReq->pdus->u.ssb_pdu.bchPayload);
375 uint8_t numPdus = dlTtiReq->nPdus;
382 if(dlTtiReq->pdus->pduType == 3) //SSB_PDU_TYPE
384 else if(dlTtiReq->pdus->pduType == 0)
385 printf("SIB1 PDCCH PDU\n");
386 else if(dlTtiReq->pdus->pduType == 1)
387 printf("SIB1 PDSCH PDU\n");
392 SPutSBuf(0, 0, (Data *)dlTtiReq, sizeof(fapi_dl_tti_req_t));
396 /*******************************************************************
398 * @brief Receives message from MAC
402 * Function : processFapiRequest
405 * - Receives message from MAC and calls handler
407 * @params[in] Message type
413 * ****************************************************************/
415 void processFapiRequest(uint8_t msgType, uint32_t msgLen, void *msg)
420 case FAPI_PARAM_REQUEST:
421 l1HdlParamReq(msgLen, msg);
423 case FAPI_CONFIG_REQUEST:
424 l1HdlConfigReq(msgLen, msg);
426 case FAPI_START_REQUEST:
427 l1HdlStartReq(msgLen, msg);
429 case FAPI_DL_TTI_REQUEST:
430 l1HdlDlTtiReq(msgLen, msg);
433 printf("\nPHY_STUB: Invalid message type[%x] received at PHY", msgType);
438 /**********************************************************************
440 **********************************************************************/