Initial commit for Bronze release
[o-du/l2.git] / src / 5gnrmac / rg_cl_li.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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 *******************************************************************************/
18
19 /* This file contains handler for FAPI messages to be sent or received from PHY */
20
21 #include "envdep.h"
22 #include "gen.h"
23 #include "ssi.h"
24 #include "cm_hash.h"
25
26 #include "gen.x"
27 #include "ssi.x"
28 #include "cm_hash.x"
29
30 #include "lcl.h"
31 #include "lwr_mac.h"
32 #include "rg_cl_phy.h"
33 #include "fapi.h"
34 /*#include "wls_lib.h"*/
35
36 EXTERN S16 sendToPhy ARGS((U16 msgType, U32 msgLen, void *msg));
37
38 /*******************************************************************
39   *
40   * @brief Fills FAPI message header 
41   *
42   * @details
43   *
44   *    Function : fillMsgHdr 
45   *
46   *    Functionality:
47   *         -Fills FAPI message header
48   *
49   * @params[in] Pointer to header
50   *             Number of messages
51   *             Messae Type
52   *             Length of message
53   * @return void
54   *
55   * ****************************************************************/
56 PUBLIC void fillMsgHdr(MsgHdr *hdr, U8 nMsg, U16 msgType, U32 msgLen)
57 {
58    hdr->nMsg = nMsg;
59    hdr->msgType = msgType;
60    hdr->msgLen = msgLen;
61 }
62
63  /*******************************************************************
64   *
65   * @brief Fills TLV
66   *
67   * @details
68   *
69   *    Function : fillTlv
70   *
71   *    Functionality:
72   *         -Fills TLV
73   *
74   * @params[in] Pointer to TLV
75   *             Tag
76   *             Length
77   *             Value
78   * @return Void
79   *
80   * ****************************************************************/
81 PUBLIC void fillTlv(L1L2Tlv *tlv, U16 tag, U16 len, U16 value)
82 {
83    tlv->tag = tag;
84    tlv->length = len;
85    tlv->value = value;
86 }
87
88
89  /*******************************************************************
90   *
91   * @brief Fills next config TLV
92   *
93   * @details
94   *
95   *    Function : fillConfigTLV
96   *
97   *    Functionality:
98   *         - Finds pointer to next TLV in config req
99   *         - Fills the TLV
100   *         - Calculates Message length
101   *
102   * @params[in] 
103   * @return ROK     - void
104   *
105   * ****************************************************************/
106 PUBLIC void fillConfigTLV(L1L2Tlv *nextTlv, U8 *configTlvs, U16 tag, U16 length, U16 value, U16 *msgLen)
107 {
108    nextTlv = (L1L2Tlv *)(configTlvs + *msgLen);
109    fillTlv(nextTlv, tag, length, value);
110    *msgLen = *msgLen + sizeof(tag) + sizeof(length) + length;
111 }
112
113
114  /*******************************************************************
115   *
116   * @brief Build and send FAPI config req to PHY
117   *
118   * @details
119   *
120   *    Function : rgClBldAndSndFAPICfgReq
121   *
122   *    Functionality:
123   *         -Build and send FAPI config req to PHY
124   *
125   * @params[in] 
126   * @return ROK     - success
127   *         RFAILED - failure
128   *
129   * ****************************************************************/
130
131 PUBLIC S16 rgClBldAndSndFAPICfgReq
132 (
133 ClCellCb   *cellCb
134 )
135 {
136    U16            msgLen;
137    U32            FAPIConfigReqSize;
138    U8             *configTlvs;
139    L1L2ConfigReq  *FAPIConfigReq;
140    L1L2Tlv        *nextTlv;
141    ClCellCfg      cellCfg;
142
143    FAPIConfigReqSize = sizeof(L1L2ConfigReq)
144                        + (cellCb->cellCfg.numTlv * sizeof(L1L2Tlv));
145
146    /* TO DO :Change SGetSBuf to SGetSBufWls() later */
147    if(SGetSBuf(0,0,(Data **)&FAPIConfigReq, FAPIConfigReqSize) != ROK )
148    {
149       printf("\nMemory allocation failed for PHY Config Req");
150       RETVALUE(RFAILED);
151    }
152   
153    nextTlv = NULLP;
154    msgLen = 0;
155    cellCfg = cellCb->cellCfg;
156    configTlvs = (U8 *)((U8 *)FAPIConfigReq + MSG_HDR_SIZE + 2);
157
158    FAPIConfigReq->nTlv = cellCfg.numTlv;
159    FAPIConfigReq->carrierId = cellCb->cellId;
160
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);
164    
165    /* Filling DL carrier configuration */
166    if(cellCfg.dlCarrCfg.pres)
167    {
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);
173    }
174
175    /* Filling UL carrier configuration */
176    if(cellCfg.ulCarrCfg.pres)
177    {
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);
183    }
184
185    fillConfigTLV(nextTlv, configTlvs, CFG_TAG_FREQ_SHIFT_7P5KHZ, sizeof(U16), cellCfg.freqShft, &msgLen);
186
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);
199
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);
213
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);
217
218    /* Filling RSSI measurement configuration */
219    fillConfigTLV(nextTlv, configTlvs, CFG_TAG_RSSI_MEAS, sizeof(U16), cellCfg.rssiUnit, &msgLen);
220   
221    msgLen = msgLen + sizeof(L1L2ConfigReq);
222
223    /* Filling message header */
224    fillMsgHdr(&FAPIConfigReq->hdr, 1, MSG_TYPE_CONFIG_REQ, msgLen);
225
226    /* Sending msg to PHY */
227    sendToPhy(MSG_TYPE_CONFIG_REQ, FAPIConfigReqSize, (void *)FAPIConfigReq);
228
229    RETVALUE(ROK);
230 }
231
232
233 /*******************************************************************
234  *
235  * @brief Handles FAPI config response
236  *
237  * @details
238  *
239  *    Function : rgClHndlCfgReq
240  *
241  *    Functionality:
242  *         -Handles FAPI config request
243  *
244  * @params[in] Message pointer
245  *             
246  * @return void
247  *
248  *****************************************************************/
249
250 S16 rgClHndlCfgReq(void *msg)
251 {
252    ClCellCb   *cellCb = NULLP;
253    L1L2ConfigRsp *configRsp;
254
255    configRsp = (L1L2ConfigRsp *)msg;
256
257    if(configRsp->status != MSG_OK)
258    {
259       printf("\nPHY configuration failed");
260       RETVALUE(RFAILED);
261    }
262    
263    if((cellCb = (ClCellCb *)rgClUtlGetCellCb(configRsp->carrierId)) != NULLP)
264    {
265        printf("\nCell Id[%d] not found", configRsp->carrierId);
266        RETVALUE(RFAILED);
267    }
268   
269    cellCb->phyState = PHY_STATE_CONFIGURED;
270    clGlobalCp.phyState = PHY_STATE_CONFIGURED;
271
272    printf("\nReceived successful PHY configuration response");
273
274    SPutSBuf(0, 0, (Data *)msg, configRsp->hdr.msgLen );
275    
276    RETVALUE(ROK);
277 }
278
279 /*******************************************************************
280  *
281  * @brief Handles FAPI param response
282  *
283  * @details
284  *
285  *    Function : lwrMacHndlParamReq
286  *
287  *    Functionality:
288  *         -Handles FAPI param request
289  *
290  * @params[in] Message pointer
291  *             
292  * @return void
293  *
294  *****************************************************************/
295 S16 lwrMacHndlParamReq(void *msg)
296 {
297    ClCellCb   *cellCb = NULLP;
298    fapi_param_resp_t *paramRsp;
299
300    paramRsp = (fapi_param_resp_t *)msg;
301
302    if(paramRsp->error_code != MSG_OK)
303    {
304       printf("\nPHY configuration failed");
305       RETVALUE(RFAILED);
306    }
307    
308    if(paramRsp->tlvs[0].value == 0)
309    {
310       cellCb->phyState    = PHY_STATE_IDLE;
311       clGlobalCp.phyState = PHY_STATE_IDLE;           
312    }
313   
314    printf("\nReceived successful PHY configuration response");
315
316    SPutSBuf(0, 0, (Data *)msg, paramRsp->header.length);
317
318
319    RETVALUE(ROK);
320
321 }
322
323 /**********************************************************************
324          End of file
325 **********************************************************************/