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"
33 /*#include "wls_lib.h"*/
35 EXTERN S16 sendToPhy ARGS((U16 msgType, U32 msgLen, void *msg));
37 /*******************************************************************
39 * @brief Fills FAPI message header
43 * Function : fillMsgHdr
46 * -Fills FAPI message header
48 * @params[in] Pointer to header
54 * ****************************************************************/
55 PUBLIC void fillMsgHdr(MsgHdr *hdr, U8 nMsg, U16 msgType, U32 msgLen)
58 hdr->msgType = msgType;
62 /*******************************************************************
73 * @params[in] Pointer to TLV
79 * ****************************************************************/
80 PUBLIC void fillTlv(L1L2Tlv *tlv, U16 tag, U16 len, U16 value)
88 /*******************************************************************
90 * @brief Fills next config TLV
94 * Function : fillConfigTLV
97 * - Finds pointer to next TLV in config req
99 * - Calculates Message length
104 * ****************************************************************/
105 PUBLIC void fillConfigTLV(L1L2Tlv *nextTlv, U8 *configTlvs, U16 tag, U16 length, U16 value, U16 *msgLen)
107 nextTlv = (L1L2Tlv *)(configTlvs + *msgLen);
108 fillTlv(nextTlv, tag, length, value);
109 *msgLen = *msgLen + sizeof(tag) + sizeof(length) + length;
113 /*******************************************************************
115 * @brief Build and send FAPI config req to PHY
119 * Function : rgClBldAndSndFAPICfgReq
122 * -Build and send FAPI config req to PHY
125 * @return ROK - success
128 * ****************************************************************/
130 PUBLIC S16 rgClBldAndSndFAPICfgReq
136 U32 FAPIConfigReqSize;
138 L1L2ConfigReq *FAPIConfigReq;
142 FAPIConfigReqSize = sizeof(L1L2ConfigReq)
143 + (cellCb->cellCfg.numTlv * sizeof(L1L2Tlv));
145 /* TO DO :Change SGetSBuf to SGetSBufWls() later */
146 if(SGetSBuf(0,0,(Data **)&FAPIConfigReq, FAPIConfigReqSize) != ROK )
148 printf("\nMemory allocation failed for PHY Config Req");
154 cellCfg = cellCb->cellCfg;
155 configTlvs = (U8 *)((U8 *)FAPIConfigReq + MSG_HDR_SIZE + 2);
157 FAPIConfigReq->nTlv = cellCfg.numTlv;
158 FAPIConfigReq->carrierId = cellCb->cellId;
160 /* Filling cell configuration */
161 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PHY_CELL_ID, sizeof(U16), cellCfg.phyCellId, &msgLen);
162 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_FRAME_DUP_TYPE, sizeof(U16), cellCfg.dupType, &msgLen);
164 /* Filling DL carrier configuration */
165 if(cellCfg.dlCarrCfg.pres)
167 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DL_BW, sizeof(U16), cellCfg.dlCarrCfg.bw, &msgLen);
168 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DL_FREQ, sizeof(U16), cellCfg.dlCarrCfg.freq, &msgLen);
169 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DLK0, sizeof(U16),cellCfg.dlCarrCfg.k0[0], &msgLen);
170 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_DL_GRID_SIZE, sizeof(U16),cellCfg.dlCarrCfg.gridSize[0], &msgLen);
171 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_TX_ANT, sizeof(U16), cellCfg.dlCarrCfg.numAnt, &msgLen);
174 /* Filling UL carrier configuration */
175 if(cellCfg.ulCarrCfg.pres)
177 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UL_BW, sizeof(U16), cellCfg.ulCarrCfg.bw, &msgLen);
178 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UL_FREQ, sizeof(U16), cellCfg.ulCarrCfg.freq, &msgLen);
179 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_ULK0, sizeof(U16), cellCfg.ulCarrCfg.k0[0], &msgLen);
180 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UL_GRID_SIZE, sizeof(U16), cellCfg.ulCarrCfg.gridSize[0], &msgLen);
181 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_RX_ANT, sizeof(U16), cellCfg.ulCarrCfg.numAnt, &msgLen);
184 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_FREQ_SHIFT_7P5KHZ, sizeof(U16), cellCfg.freqShft, &msgLen);
186 /* Filling SSB configuration */
187 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SS_PBCH_PWR, sizeof(U16), cellCfg.ssbCfg.ssbPbchPwr, &msgLen);
188 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_BCH_PAYLOAD, sizeof(U16), cellCfg.ssbCfg.bchPayload, &msgLen);
189 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SCS_COMM, sizeof(U16), cellCfg.ssbCfg.scsCmn, &msgLen);
190 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_OFFS_POINT_A, sizeof(U16), cellCfg.ssbCfg.ssbPrbOffset, &msgLen);
191 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_BETA_PSS, sizeof(U16), cellCfg.ssbCfg.betaPss, &msgLen);
192 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_PERIOD, sizeof(U16), cellCfg.ssbCfg.ssbPeriod, &msgLen);
193 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_SUBC_OFFS, sizeof(U16), cellCfg.ssbCfg.ssbSubcOffset, &msgLen);
194 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_MIB, sizeof(U16), cellCfg.ssbCfg.mibPdu, &msgLen);
195 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_MASK, sizeof(U16), cellCfg.ssbCfg.nSSBMask[0], &msgLen);
196 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SS_PBCH_MULT_CARR_BAND, sizeof(U16), cellCfg.ssbCfg.multCarrBand, &msgLen);
197 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_MULT_CELL_SS_PBCH_CARR, sizeof(U16), cellCfg.ssbCfg.multCellCarr, &msgLen);
199 /* Filling PRACH configuration */
200 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_SEQ_LEN, sizeof(U16), cellCfg.prachCfg.prachSeqLen, &msgLen);
201 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_SUBC_SPAC, sizeof(U16), cellCfg.prachCfg.prachSubcSpacing, &msgLen);
202 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_RES_SET_CFG, sizeof(U16), cellCfg.prachCfg.prachRstSetCfg, &msgLen);
203 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_PRACH_FD_OCC, sizeof(U16), cellCfg.prachCfg.prachFdm, &msgLen);
204 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_ROOT_SEQ_ID, sizeof(U16), cellCfg.prachCfg.fdm[0].rootSeqIdx, &msgLen);
205 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_ROOT_SEQ, sizeof(U16), cellCfg.prachCfg.fdm[0].numRootSeq, &msgLen);
206 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_K1, sizeof(U16), cellCfg.prachCfg.fdm[0].k1, &msgLen);
207 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_ZERO_CORR_CFG, sizeof(U16), cellCfg.prachCfg.fdm[0].zeroCorrZoneCfg, &msgLen);
208 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_NUM_UNUSED_ROOT_SEQ, sizeof(U16), cellCfg.prachCfg.fdm[0].numUnusedRootSeq, &msgLen);
209 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_UNUSED_ROOT_SEQ, sizeof(U16), *(cellCfg.prachCfg.fdm[0].unsuedRootSeq), &msgLen);
210 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SSB_PER_RACH, sizeof(U16), cellCfg.prachCfg.ssbPerRach, &msgLen);
211 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_PRACH_MULT_CARR_BAND, sizeof(U16), cellCfg.prachCfg.prachMultCarrBand, &msgLen);
213 /* Filling TDD configuration */
214 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_TDD_PERIOD, sizeof(U16), cellCfg.tddCfg.tddPeriod, &msgLen);
215 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_SLOT_CFG, sizeof(U16), cellCfg.tddCfg.slotCfg[0][0], &msgLen);
217 /* Filling RSSI measurement configuration */
218 fillConfigTLV(nextTlv, configTlvs, CFG_TAG_RSSI_MEAS, sizeof(U16), cellCfg.rssiUnit, &msgLen);
220 msgLen = msgLen + sizeof(L1L2ConfigReq);
222 /* Filling message header */
223 fillMsgHdr(&FAPIConfigReq->hdr, 1, MSG_TYPE_CONFIG_REQ, msgLen);
225 /* Sending msg to PHY */
226 sendToPhy(MSG_TYPE_CONFIG_REQ, FAPIConfigReqSize, (void *)FAPIConfigReq);
232 /*******************************************************************
234 * @brief Handles FAPI config response
238 * Function : rgClHndlCfgReq
241 * -Handles FAPI config request
243 * @params[in] Message pointer
247 *****************************************************************/
249 S16 rgClHndlCfgReq(void *msg)
251 ClCellCb *cellCb = NULLP;
252 L1L2ConfigRsp *configRsp;
254 configRsp = (L1L2ConfigRsp *)msg;
256 if(configRsp->status != MSG_OK)
258 printf("\nPHY configuration failed");
262 if((cellCb = (ClCellCb *)rgClUtlGetCellCb(configRsp->carrierId)) != NULLP)
264 printf("\nCell Id[%d] not found", configRsp->carrierId);
268 cellCb->phyState = PHY_STATE_CONFIGURED;
269 clGlobalCp.phyState = PHY_STATE_CONFIGURED;
271 printf("\nReceived successful PHY configuration response");
273 SPutSBuf(0, 0, (Data *)msg, configRsp->hdr.msgLen );
278 /**********************************************************************
280 **********************************************************************/