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 handler for FAPI messages to be sent or received from PHY */
32 #include "rg_cl_phy.h"
34 /*#include "wls_lib.h"*/
36 EXTERN S16 sendToPhy ARGS((U16 msgType, U32 msgLen, void *msg));
38 /*******************************************************************
40 * @brief Fills FAPI message header
44 * Function : fillMsgHdr
47 * -Fills FAPI message header
49 * @params[in] Pointer to header
55 * ****************************************************************/
56 PUBLIC void fillMsgHdr(MsgHdr *hdr, U8 nMsg, U16 msgType, U32 msgLen)
59 hdr->msgType = msgType;
63 /*******************************************************************
74 * @params[in] Pointer to TLV
80 * ****************************************************************/
81 PUBLIC void fillTlv(L1L2Tlv *tlv, U16 tag, U16 len, U16 value)
89 /*******************************************************************
91 * @brief Fills next config TLV
95 * Function : fillConfigTLV
98 * - Finds pointer to next TLV in config req
100 * - Calculates Message length
105 * ****************************************************************/
106 PUBLIC void fillConfigTLV(L1L2Tlv *nextTlv, U8 *configTlvs, U16 tag, U16 length, U16 value, U16 *msgLen)
108 nextTlv = (L1L2Tlv *)(configTlvs + *msgLen);
109 fillTlv(nextTlv, tag, length, value);
110 *msgLen = *msgLen + sizeof(tag) + sizeof(length) + length;
114 /*******************************************************************
116 * @brief Build and send FAPI config req to PHY
120 * Function : rgClBldAndSndFAPICfgReq
123 * -Build and send FAPI config req to PHY
126 * @return ROK - success
129 * ****************************************************************/
131 PUBLIC S16 rgClBldAndSndFAPICfgReq
137 U32 FAPIConfigReqSize;
139 L1L2ConfigReq *FAPIConfigReq;
143 FAPIConfigReqSize = sizeof(L1L2ConfigReq)
144 + (cellCb->cellCfg.numTlv * sizeof(L1L2Tlv));
146 /* TO DO :Change SGetSBuf to SGetSBufWls() later */
147 if(SGetSBuf(0,0,(Data **)&FAPIConfigReq, FAPIConfigReqSize) != ROK )
149 printf("\nMemory allocation failed for PHY Config Req");
155 cellCfg = cellCb->cellCfg;
156 configTlvs = (U8 *)((U8 *)FAPIConfigReq + MSG_HDR_SIZE + 2);
158 FAPIConfigReq->nTlv = cellCfg.numTlv;
159 FAPIConfigReq->carrierId = cellCb->cellId;
161 /* Filling cell configuration */
162 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PHY_CELL_ID, sizeof(U16), cellCfg.phyCellId, &msgLen);
163 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_FRAME_DUP_TYPE, sizeof(U16), cellCfg.dupType, &msgLen);
165 /* Filling DL carrier configuration */
166 if(cellCfg.dlCarrCfg.pres)
168 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DL_BW, sizeof(U16), cellCfg.dlCarrCfg.bw, &msgLen);
169 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DL_FREQ, sizeof(U16), cellCfg.dlCarrCfg.freq, &msgLen);
170 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DLK0, sizeof(U16),cellCfg.dlCarrCfg.k0[0], &msgLen);
171 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DL_GRID_SIZE, sizeof(U16),cellCfg.dlCarrCfg.gridSize[0], &msgLen);
172 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_TX_ANT, sizeof(U16), cellCfg.dlCarrCfg.numAnt, &msgLen);
175 /* Filling UL carrier configuration */
176 if(cellCfg.ulCarrCfg.pres)
178 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UL_BW, sizeof(U16), cellCfg.ulCarrCfg.bw, &msgLen);
179 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UL_FREQ, sizeof(U16), cellCfg.ulCarrCfg.freq, &msgLen);
180 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_ULK0, sizeof(U16), cellCfg.ulCarrCfg.k0[0], &msgLen);
181 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UL_GRID_SIZE, sizeof(U16), cellCfg.ulCarrCfg.gridSize[0], &msgLen);
182 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_RX_ANT, sizeof(U16), cellCfg.ulCarrCfg.numAnt, &msgLen);
185 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_FREQ_SHIFT_7P5KHZ, sizeof(U16), cellCfg.freqShft, &msgLen);
187 /* Filling SSB configuration */
188 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SS_PBCH_PWR, sizeof(U16), cellCfg.ssbCfg.ssbPbchPwr, &msgLen);
189 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_BCH_PAYLOAD, sizeof(U16), cellCfg.ssbCfg.bchPayload, &msgLen);
190 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SCS_COMM, sizeof(U16), cellCfg.ssbCfg.scsCmn, &msgLen);
191 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_OFFS_POINT_A, sizeof(U16), cellCfg.ssbCfg.ssbPrbOffset, &msgLen);
192 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_BETA_PSS, sizeof(U16), cellCfg.ssbCfg.betaPss, &msgLen);
193 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_PERIOD, sizeof(U16), cellCfg.ssbCfg.ssbPeriod, &msgLen);
194 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_SUBC_OFFS, sizeof(U16), cellCfg.ssbCfg.ssbSubcOffset, &msgLen);
195 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_MIB, sizeof(U16), cellCfg.ssbCfg.mibPdu, &msgLen);
196 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_MASK, sizeof(U16), cellCfg.ssbCfg.nSSBMask[0], &msgLen);
197 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SS_PBCH_MULT_CARR_BAND, sizeof(U16), cellCfg.ssbCfg.multCarrBand, &msgLen);
198 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_MULT_CELL_SS_PBCH_CARR, sizeof(U16), cellCfg.ssbCfg.multCellCarr, &msgLen);
200 /* Filling PRACH configuration */
201 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_SEQ_LEN, sizeof(U16), cellCfg.prachCfg.prachSeqLen, &msgLen);
202 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_SUBC_SPAC, sizeof(U16), cellCfg.prachCfg.prachSubcSpacing, &msgLen);
203 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_RES_SET_CFG, sizeof(U16), cellCfg.prachCfg.prachRstSetCfg, &msgLen);
204 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_PRACH_FD_OCC, sizeof(U16), cellCfg.prachCfg.prachFdm, &msgLen);
205 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_ROOT_SEQ_ID, sizeof(U16), cellCfg.prachCfg.fdm[0].rootSeqIdx, &msgLen);
206 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_ROOT_SEQ, sizeof(U16), cellCfg.prachCfg.fdm[0].numRootSeq, &msgLen);
207 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_K1, sizeof(U16), cellCfg.prachCfg.fdm[0].k1, &msgLen);
208 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_ZERO_CORR_CFG, sizeof(U16), cellCfg.prachCfg.fdm[0].zeroCorrZoneCfg, &msgLen);
209 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_UNUSED_ROOT_SEQ, sizeof(U16), cellCfg.prachCfg.fdm[0].numUnusedRootSeq, &msgLen);
210 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UNUSED_ROOT_SEQ, sizeof(U16), *(cellCfg.prachCfg.fdm[0].unsuedRootSeq), &msgLen);
211 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_PER_RACH, sizeof(U16), cellCfg.prachCfg.ssbPerRach, &msgLen);
212 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_MULT_CARR_BAND, sizeof(U16), cellCfg.prachCfg.prachMultCarrBand, &msgLen);
214 /* Filling TDD configuration */
215 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_TDD_PERIOD, sizeof(U16), cellCfg.tddCfg.tddPeriod, &msgLen);
216 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SLOT_CFG, sizeof(U16), cellCfg.tddCfg.slotCfg[0][0], &msgLen);
218 /* Filling RSSI measurement configuration */
219 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_RSSI_MEAS, sizeof(U16), cellCfg.rssiUnit, &msgLen);
221 msgLen = msgLen + sizeof(L1L2ConfigReq);
223 /* Filling message header */
224 fillMsgHdr(&FAPIConfigReq->hdr, 1, MSG_TYPE_CONFIG_REQ, msgLen);
226 /* Sending msg to PHY */
227 sendToPhy(MSG_TYPE_CONFIG_REQ, FAPIConfigReqSize, (void *)FAPIConfigReq);
233 /*******************************************************************
235 * @brief Handles FAPI config response
239 * Function : rgClHndlCfgReq
242 * -Handles FAPI config request
244 * @params[in] Message pointer
248 *****************************************************************/
250 S16 rgClHndlCfgReq(void *msg)
252 ClCellCb *cellCb = NULLP;
253 L1L2ConfigRsp *configRsp;
255 configRsp = (L1L2ConfigRsp *)msg;
257 if(configRsp->status != MSG_OK)
259 printf("\nPHY configuration failed");
263 if((cellCb = (ClCellCb *)rgClUtlGetCellCb(configRsp->carrierId)) != NULLP)
265 printf("\nCell Id[%d] not found", configRsp->carrierId);
269 cellCb->phyState = PHY_STATE_CONFIGURED;
270 clGlobalCp.phyState = PHY_STATE_CONFIGURED;
272 printf("\nReceived successful PHY configuration response");
274 SPutSBuf(0, 0, (Data *)msg, configRsp->hdr.msgLen );
279 /*******************************************************************
281 * @brief Handles FAPI param response
285 * Function : lwrMacHndlParamReq
288 * -Handles FAPI param request
290 * @params[in] Message pointer
294 *****************************************************************/
295 S16 lwrMacHndlParamReq(void *msg)
297 ClCellCb *cellCb = NULLP;
298 fapi_param_resp_t *paramRsp;
300 paramRsp = (fapi_param_resp_t *)msg;
302 if(paramRsp->error_code != MSG_OK)
304 printf("\nPHY configuration failed");
308 if(paramRsp->tlvs[0].value == 0)
310 cellCb->phyState = PHY_STATE_IDLE;
311 clGlobalCp.phyState = PHY_STATE_IDLE;
314 printf("\nReceived successful PHY configuration response");
316 SPutSBuf(0, 0, (Data *)msg, paramRsp->header.length);
323 /**********************************************************************
325 **********************************************************************/