d41c17bb1f37b4815eb2e5b097f0924bae6cac1a
[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 "rg_cl.h"
32 #include "rg_cl_phy.h"
33 /*#include "wls_lib.h"*/
34
35 EXTERN S16 sendToPhy ARGS((U16 msgType, U32 msgLen, void *msg));
36
37 /*******************************************************************
38   *
39   * @brief Fills FAPI message header 
40   *
41   * @details
42   *
43   *    Function : fillMsgHdr 
44   *
45   *    Functionality:
46   *         -Fills FAPI message header
47   *
48   * @params[in] Pointer to header
49   *             Number of messages
50   *             Messae Type
51   *             Length of message
52   * @return void
53   *
54   * ****************************************************************/
55 PUBLIC void fillMsgHdr(MsgHdr *hdr, U8 nMsg, U16 msgType, U32 msgLen)
56 {
57    hdr->nMsg = nMsg;
58    hdr->msgType = msgType;
59    hdr->msgLen = msgLen;
60 }
61
62  /*******************************************************************
63   *
64   * @brief Fills TLV
65   *
66   * @details
67   *
68   *    Function : fillTlv
69   *
70   *    Functionality:
71   *         -Fills TLV
72   *
73   * @params[in] Pointer to TLV
74   *             Tag
75   *             Length
76   *             Value
77   * @return Void
78   *
79   * ****************************************************************/
80 PUBLIC void fillTlv(L1L2Tlv *tlv, U16 tag, U16 len, U16 value)
81 {
82    tlv->tag = tag;
83    tlv->length = len;
84    tlv->value = value;
85 }
86
87
88  /*******************************************************************
89   *
90   * @brief Fills next config TLV
91   *
92   * @details
93   *
94   *    Function : fillConfigTLV
95   *
96   *    Functionality:
97   *         - Finds pointer to next TLV in config req
98   *         - Fills the TLV
99   *         - Calculates Message length
100   *
101   * @params[in] 
102   * @return ROK     - void
103   *
104   * ****************************************************************/
105 PUBLIC void fillConfigTLV(L1L2Tlv *nextTlv, U8 *configTlvs, U16 tag, U16 length, U16 value, U16 *msgLen)
106 {
107    nextTlv = (L1L2Tlv *)(configTlvs + *msgLen);
108    fillTlv(nextTlv, tag, length, value);
109    *msgLen = *msgLen + sizeof(tag) + sizeof(length) + length;
110 }
111
112
113  /*******************************************************************
114   *
115   * @brief Build and send FAPI config req to PHY
116   *
117   * @details
118   *
119   *    Function : rgClBldAndSndFAPICfgReq
120   *
121   *    Functionality:
122   *         -Build and send FAPI config req to PHY
123   *
124   * @params[in] 
125   * @return ROK     - success
126   *         RFAILED - failure
127   *
128   * ****************************************************************/
129
130 PUBLIC S16 rgClBldAndSndFAPICfgReq
131 (
132 ClCellCb   *cellCb
133 )
134 {
135    U16            msgLen;
136    U32            FAPIConfigReqSize;
137    U8             *configTlvs;
138    L1L2ConfigReq  *FAPIConfigReq;
139    L1L2Tlv        *nextTlv;
140    ClCellCfg      cellCfg;
141
142    FAPIConfigReqSize = sizeof(L1L2ConfigReq)
143                        + (cellCb->cellCfg.numTlv * sizeof(L1L2Tlv));
144
145    /* TO DO :Change SGetSBuf to SGetSBufWls() later */
146    if(SGetSBuf(0,0,(Data **)&FAPIConfigReq, FAPIConfigReqSize) != ROK )
147    {
148       printf("\nMemory allocation failed for PHY Config Req");
149       RETVALUE(RFAILED);
150    }
151   
152    nextTlv = NULLP;
153    msgLen = 0;
154    cellCfg = cellCb->cellCfg;
155    configTlvs = (U8 *)((U8 *)FAPIConfigReq + MSG_HDR_SIZE + 2);
156
157    FAPIConfigReq->nTlv = cellCfg.numTlv;
158    FAPIConfigReq->carrierId = cellCb->cellId;
159
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);
163    
164    /* Filling DL carrier configuration */
165    if(cellCfg.dlCarrCfg.pres)
166    {
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);
172    }
173
174    /* Filling UL carrier configuration */
175    if(cellCfg.ulCarrCfg.pres)
176    {
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);
182    }
183
184    fillConfigTLV(nextTlv, configTlvs, CFG_TAG_FREQ_SHIFT_7P5KHZ, sizeof(U16), cellCfg.freqShft, &msgLen);
185
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);
198
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);
212
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);
216
217    /* Filling RSSI measurement configuration */
218    fillConfigTLV(nextTlv, configTlvs, CFG_TAG_RSSI_MEAS, sizeof(U16), cellCfg.rssiUnit, &msgLen);
219   
220    msgLen = msgLen + sizeof(L1L2ConfigReq);
221
222    /* Filling message header */
223    fillMsgHdr(&FAPIConfigReq->hdr, 1, MSG_TYPE_CONFIG_REQ, msgLen);
224
225    /* Sending msg to PHY */
226    sendToPhy(MSG_TYPE_CONFIG_REQ, FAPIConfigReqSize, (void *)FAPIConfigReq);
227
228    RETVALUE(ROK);
229 }
230
231
232 /*******************************************************************
233  *
234  * @brief Handles FAPI config response
235  *
236  * @details
237  *
238  *    Function : rgClHndlCfgReq
239  *
240  *    Functionality:
241  *         -Handles FAPI config request
242  *
243  * @params[in] Message pointer
244  *             
245  * @return void
246  *
247  *****************************************************************/
248
249 S16 rgClHndlCfgReq(void *msg)
250 {
251    ClCellCb   *cellCb = NULLP;
252    L1L2ConfigRsp *configRsp;
253
254    configRsp = (L1L2ConfigRsp *)msg;
255
256    if(configRsp->status != MSG_OK)
257    {
258       printf("\nPHY configuration failed");
259       RETVALUE(RFAILED);
260    }
261    
262    if((cellCb = (ClCellCb *)rgClUtlGetCellCb(configRsp->carrierId)) != NULLP)
263    {
264        printf("\nCell Id[%d] not found", configRsp->carrierId);
265        RETVALUE(RFAILED);
266    }
267   
268    cellCb->phyState = PHY_STATE_CONFIGURED;
269    clGlobalCp.phyState = PHY_STATE_CONFIGURED;
270
271    printf("\nReceived successful PHY configuration response");
272
273    SPutSBuf(0, 0, (Data *)msg, configRsp->hdr.msgLen );
274    
275    RETVALUE(ROK);
276 }
277
278 /**********************************************************************
279          End of file
280 **********************************************************************/