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 */
28 #include "rg_cl_phy.h"
33 EXTERN void phyToMac ARGS((U16 msgType, U32 msgLen,void *msg));
34 EXTERN void fillTlvs ARGS((fapi_uint16_tlv_t *tlv, U16 tag, U16 length, U16 value, U16 *msgLen));
35 EXTERN void fillMsgHeader ARGS((fapi_msg_t *hdr, U16 msgType, U16 msgLen));
36 EXTERN S16 sendToLowerMac ARGS((U16 msgType, U32 msgLen,void *msg));
38 /*******************************************************************
40 * @brief Builds and sends param response to MAC CL
44 * Function : lwrMacBldAndSndParamRsp
47 * - Builds and sends param response to MAC
49 * @params[in] Config request message pointer
50 * @return ROK - success
53 * ****************************************************************/
54 S16 lwrMacBldAndSndParamRsp(void *msg)
58 fapi_param_resp_t *fapiParamRsp;
59 fapiParamRsp = (fapi_param_resp_t *)msg;
61 if(SGetSBuf(0, 0, (Data **)&fapiParamRsp, sizeof(fapi_param_resp_t)) != ROK)
63 printf("\nMemory allocation failed for PHY Config Response");
68 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_RELEASE_CAPABILITY_TAG, sizeof(U16), 1, &msgLen);
69 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PHY_STATE_TAG, sizeof(U16), 0, &msgLen);
70 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SKIP_BLANK_DL_CONFIG_TAG, sizeof(U8), 0, &msgLen);
71 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SKIP_BLANK_UL_CONFIG_TAG, sizeof(U8), 0, &msgLen);
72 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_NUM_CONFIG_TLVS_TO_REPORT_TYPE_TAG, sizeof(U8), 0, &msgLen);
75 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CYCLIC_PREFIX_TAG, sizeof(U8), 1, &msgLen);
76 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_SUBCARRIER_SPACING_DL_TAG, sizeof(U8), 1, &msgLen);
77 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_BANDWIDTH_DL_TAG, sizeof(U16), 1, &msgLen);
78 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_SUBCARRIER_SPACING_UL_TAG, sizeof(U8), 0, &msgLen);
79 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_BANDWIDTH_UL_TAG, sizeof(U16), 0, &msgLen);
82 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CCE_MAPPING_TYPE_TAG, sizeof(U8), 0, &msgLen);
83 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, sizeof(U8), 0, &msgLen);
84 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRECODER_GRANULARITY_CORESET_TAG, sizeof(U8), 0, &msgLen);
85 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDCCH_MU_MIMO_TAG, sizeof(U8), 0, &msgLen);
86 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDCCH_PRECODER_CYCLING_TAG, sizeof(U8), 0, &msgLen);
87 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDCCHS_PER_SLOT_TAG, sizeof(U8), 0, &msgLen);
90 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUCCH_FORMATS_TAG, sizeof(U8), 0, &msgLen);
91 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PUCCHS_PER_SLOT_TAG, sizeof(U8), 0, &msgLen);
94 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_MAPPING_TYPE_TAG, sizeof(U8), 0, &msgLen);
95 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_ALLOCATION_TYPES_TAG, sizeof(U8), 0, &msgLen);
96 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_VRB_TO_PRB_MAPPING_TAG, sizeof(U8), 0, &msgLen);
97 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_CBG_TAG, sizeof(U8), 0, &msgLen);
98 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_CONFIG_TYPES_TAG, sizeof(U8), 0, &msgLen);
99 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_MAX_LENGTH_TAG, sizeof(U8), 0, &msgLen);
100 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DMRS_ADDITIONAL_POS_TAG, sizeof(U8), 0, &msgLen);
101 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDSCHS_TBS_PER_SLOT_TAG, sizeof(U8), 0, &msgLen);
102 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, sizeof(U8), 0, &msgLen);
103 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_MAX_MODULATION_ORDER_DL_TAG, sizeof(U8), 0, &msgLen);
104 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_MU_MIMO_USERS_DL_TAG, sizeof(U8), 0, &msgLen);
105 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, sizeof(U8), 0, &msgLen);
106 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PREMPTIONSUPPORT_TAG, sizeof(U8), 0, &msgLen);
107 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PDSCH_NON_SLOT_SUPPORT_TAG, sizeof(U8), 0, &msgLen);
110 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_UCI_MUX_ULSCH_IN_PUSCH_TAG, sizeof(U8), 0, &msgLen);
111 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_UCI_ONLY_PUSCH_TAG, sizeof(U8), 0, &msgLen);
112 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_FREQUENCY_HOPPING_TAG, sizeof(U8), 0, &msgLen);
113 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_CONFIG_TYPES_TAG, sizeof(U8), 0, &msgLen);
114 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_MAX_LEN_TAG, sizeof(U8), 0, &msgLen);
115 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_DMRS_ADDITIONAL_POS_TAG, sizeof(U8), 0, &msgLen);
116 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_CBG_TAG, sizeof(U8), 0, &msgLen);
117 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_MAPPING_TYPE_TAG, sizeof(U8), 0, &msgLen);
118 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_ALLOCATION_TYPES_TAG, sizeof(U8), 0, &msgLen);
119 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_VRB_TO_PRB_MAPPING_TAG, sizeof(U8), 0, &msgLen);
120 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_MAX_PTRS_PORTS_TAG, sizeof(U8), 0, &msgLen);
121 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PDUSCHS_TBS_PER_SLOT_TAG, sizeof(U8), 0, &msgLen);
122 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, sizeof(U8), 0, &msgLen);
123 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_SUPPORTED_MODULATION_ORDER_UL_TAG, sizeof(U8), 0, &msgLen);
124 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_MU_MIMO_USERS_UL_TAG, sizeof(U8), 0, &msgLen);
125 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_DFTS_OFDM_SUPPORT_TAG, sizeof(U8), 0, &msgLen);
126 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PUSCH_AGGREGATION_FACTOR_TAG, sizeof(U8), 0, &msgLen);
129 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_LONG_FORMATS_TAG, sizeof(U8), 0, &msgLen);
130 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_SHORT_FORMATS_TAG, sizeof(U8), 0, &msgLen);
131 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_PRACH_RESTRICTED_SETS_TAG, sizeof(U8), 0, &msgLen);
132 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, sizeof(U8), 0, &msgLen);
134 /* MEASUREMENT TAG */
135 fillTlvs(&fapiParamRsp->tlvs[index++], FAPI_RSSI_MEASUREMENT_SUPPORT_TAG, sizeof(U8), 0, &msgLen);
137 fapiParamRsp->number_of_tlvs = index;
138 msgLen = msgLen + sizeof(fapi_param_resp_t);
140 fillMsgHeader(&fapiParamRsp->header, FAPI_PARAM_RESPONSE, msgLen);
141 fapiParamRsp->error_code = MSG_OK;
142 if(sendToLowerMac(fapiParamRsp->header.message_type_id, sizeof(fapi_param_resp_t), (void *)fapiParamRsp) != ROK)
146 printf("\n Filled the Param Response successfully");
150 /*******************************************************************
152 * @brief Builds and sends config response to MAC CL
156 * Function : l1BldAndSndCfgRsp
159 * - Builds and sends config response to MAC
161 * @params[in] Config request message pointer
162 * @return ROK - success
165 * ****************************************************************/
167 S16 l1BldAndSndCfgRsp(void *msg)
169 L1L2ConfigReq *FAPIConfigReq;
170 L1L2ConfigRsp *FAPIConfigRsp;
173 FAPIConfigReq = (L1L2ConfigReq *)msg;
174 cci = FAPIConfigReq->carrierId;
175 SPutSBuf(0, 0, (Data *)msg, FAPIConfigReq->hdr.msgLen);
177 if(SGetSBuf(0, 0, (Data **)&FAPIConfigRsp, sizeof(L1L2ConfigRsp)) != ROK)
179 printf("\nMemory allocation failed for PHY Config Response");
183 FAPIConfigRsp->hdr.nMsg = 1;
184 FAPIConfigRsp->hdr.msgType = MSG_TYPE_CONFIG_RSP;
185 FAPIConfigRsp->hdr.msgLen = sizeof(L1L2ConfigRsp);
187 FAPIConfigRsp->carrierId = cci;
188 FAPIConfigRsp->status = MSG_OK;
189 FAPIConfigRsp->numUnsuppTlv = 0;
190 FAPIConfigRsp->unsuppTlvLst = NULLP;
191 FAPIConfigRsp->numInvTlvForPhySta = 0;
192 FAPIConfigRsp->phyIdleCfgTlvLst = NULLP;
193 FAPIConfigRsp->phyRunCfgTlvLst = NULLP;
194 FAPIConfigRsp->numMissingTlv = 0;
195 FAPIConfigRsp->missingTlvLst = NULLP;
197 phyToMac(MSG_TYPE_CONFIG_RSP, sizeof(L1L2ConfigRsp), FAPIConfigRsp);
202 /*******************************************************************
204 * @brief Handles config request received from MAC
208 * Function : l1HndlConfigReq
211 * -Handles config request received from MAC
213 * @params[in] Message length
214 * Config request message pointer
218 * ****************************************************************/
220 void l1HndlConfigReq(U16 msgLen, void *msg)
222 printf("\nReceived configuration request");
224 /* TO DO : validate all received TLVs and send back any unsupported/missing TLV */
226 if(l1BldAndSndCfgRsp(msg) != ROK)
228 printf("\nFailed Sending config response");
232 /*******************************************************************
234 * @brief Handles param request received from MAC
238 * Function : lwrMacHdlParamReq
241 * -Handles param request received from MAC
243 * @params[in] Message length
244 * Param request message pointer
248 * ****************************************************************/
250 PUBLIC void lwrMacHdlParamReq(U16 msgLen, void *msg)
252 printf("\n Received Param Request in PHY");
254 /* Handling PARAM RESPONSE */
255 if(lwrMacBldAndSndParamRsp(msg)!= ROK)
257 printf("\n Failed Sending Param Response");
261 /*******************************************************************
263 * @brief Receives message from MAC
267 * Function : macToPhy
270 * - Receives message from MAC and calls handler
272 * @params[in] Message type
278 * ****************************************************************/
280 void macToPhy(U16 msgType, U32 msgLen, void *msg)
284 case MSG_TYPE_CONFIG_REQ:
285 l1HndlConfigReq(msgLen, msg);
288 printf("\nInvalid message type[%x] received at PHY", msgType);
292 /*******************************************************************
294 * @brief Receives message from MAC
298 * Function : processRequest
301 * - Receives message from MAC and calls handler
303 * @params[in] Message type
309 * ****************************************************************/
311 void processRequest(U16 msgType, U32 msgLen, void *msg)
315 case FAPI_PARAM_REQUEST:
316 lwrMacHdlParamReq(msgLen, msg);
319 printf("\n Invalid message type[%x] received at PHY", msgType);
323 /**********************************************************************
325 **********************************************************************/