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 *******************************************************************************/
21 /* header include files -- defines (.h) */
22 #include "envopt.h" /* environment options */
23 #include "envdep.h" /* environment dependent */
24 #include "envind.h" /* environment independent */
25 #include "gen.h" /* general layer */
26 #include "ssi.h" /* system service interface */
27 #include "cm_hash.h" /* common hash list */
28 #include "cm_mblk.h" /* common memory link list library */
29 #include "cm_llist.h" /* common linked list library */
30 #include "cm_err.h" /* common error */
31 #include "cm_lte.h" /* common LTE */
32 #include "lrg.h" /* Layer manager interface includes*/
33 #include "crg.h" /* CRG interface includes*/
34 #include "rgu.h" /* RGU interface includes*/
35 #include "tfu.h" /* TFU interface includes */
36 #include "rg_sch_inf.h" /* SCH interface includes */
37 #include "rg_prg.h" /* PRG (MAC-MAC) interface includes*/
38 #include "rg_env.h" /* MAC environmental includes*/
39 #include "rg.h" /* MAC includes*/
40 #include "rg_err.h" /* MAC error includes*/
42 #include "lwr_mac_fsm.h"
44 /* header/extern include files (.x) */
45 #include "gen.x" /* general layer typedefs */
46 #include "ssi.x" /* system services typedefs */
47 #include "cm5.x" /* common timers */
48 #include "cm_hash.x" /* common hash list */
49 #include "cm_lib.x" /* common library */
50 #include "cm_llist.x" /* common linked list */
51 #include "cm_mblk.x" /* memory management */
52 #include "cm_tkns.x" /* common tokens */
53 #include "cm_lte.x" /* common tokens */
54 #include "rgu.x" /* RGU types */
55 #include "tfu.x" /* RGU types */
56 #include "lrg.x" /* layer management typedefs for MAC */
57 #include "crg.x" /* CRG interface includes */
58 #include "rg_sch_inf.x" /* SCH interface typedefs */
59 #include "rg_prg.x" /* PRG (MAC-MAC) Interface typedefs */
60 #include "du_app_mac_inf.h"
62 #include "rg.x" /* typedefs for MAC */
64 #define MIB_SFN_BITMASK 0xFC
65 #define SSB_PDU_TYPE 3
66 #define SETLENGTH(x, size) x += size
69 EXTERN void sendToPhy ARGS((uint8_t msgType, uint32_t msgLen, void *msg));
70 SlotIndInfo slotIndInfo; //global variable
72 /*******************************************************************
74 * @brief Handles Invalid Request Event
78 * Function : lwr_mac_handleInvalidEvt
81 * - Displays the PHY state when the invalid event occurs
84 * @return ROK - success
87 * ****************************************************************/
88 S16 lwr_mac_handleInvalidEvt(void *msg)
90 printf("\nLOWER MAC: Error Indication Event[%d] received in state [%d]", clGlobalCp.event, clGlobalCp.phyState);
94 /*******************************************************************
96 * @brief Fills FAPI message header
100 * Function : fillMsgHeader
103 * -Fills FAPI message header
105 * @params[in] Pointer to header
111 * ****************************************************************/
112 PUBLIC void fillMsgHeader(fapi_msg_t *hdr, uint16_t msgType, uint16_t msgLen)
114 hdr->message_type_id = msgType;
115 hdr->length = msgLen;
118 /*******************************************************************
120 * @brief Fills FAPI Config Request message header
124 * Function : fillTlvs
127 * -Fills FAPI Config Request message header
129 * @params[in] Pointer to TLV
136 * ****************************************************************/
137 PUBLIC void fillTlvs(fapi_uint16_tlv_t *tlv, uint16_t tag, uint16_t length,
138 uint16_t value, uint32_t *msgLen)
141 tlv->tl.length = length;
143 *msgLen = *msgLen + sizeof(tag) + sizeof(length) + length;
145 /*******************************************************************
147 * @brief fills the cyclic prefix by comparing the bitmask
151 * Function : fillCyclicPrefix
154 * -checks the value with the bitmask and
155 * fills the cellPtr's cyclic prefix.
157 * @params[in] Pointer to ClCellParam
158 * Value to be compared
161 ********************************************************************/
162 PUBLIC void fillCyclicPrefix(uint8_t value, ClCellParam **cellPtr)
164 if((value & FAPI_NORMAL_CYCLIC_PREFIX_MASK) == FAPI_NORMAL_CYCLIC_PREFIX_MASK)
166 (*cellPtr)->cyclicPrefix = NORMAL_CYCLIC_PREFIX_MASK;
168 else if((value & FAPI_EXTENDED_CYCLIC_PREFIX_MASK) == FAPI_EXTENDED_CYCLIC_PREFIX_MASK)
170 (*cellPtr)->cyclicPrefix = EXTENDED_CYCLIC_PREFIX_MASK;
174 (*cellPtr)->cyclicPrefix = INVALID_VALUE;
178 /*******************************************************************
180 * @brief fills the subcarrier spacing of Downlink by comparing the bitmask
184 * Function : fillSubcarrierSpaceDl
187 * -checks the value with the bitmask and
188 * fills the cellPtr's subcarrier spacing in DL
190 * @params[in] Pointer to ClCellParam
191 * Value to be compared
194 * ****************************************************************/
196 PUBLIC void fillSubcarrierSpaceDl(uint8_t value, ClCellParam **cellPtr)
198 if((value & FAPI_15KHZ_MASK) == FAPI_15KHZ_MASK)
200 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_15_KHZ;
202 else if((value & FAPI_30KHZ_MASK) == FAPI_30KHZ_MASK)
204 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_30_KHZ;
206 else if((value & FAPI_60KHZ_MASK) == FAPI_60KHZ_MASK)
208 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_60_KHZ;
210 else if((value & FAPI_120KHZ_MASK) == FAPI_120KHZ_MASK)
212 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_120_KHZ;
216 (*cellPtr)->supportedSubcarrierSpacingDl = INVALID_VALUE;
220 /*******************************************************************
222 * @brief fills the downlink bandwidth by comparing the bitmask
226 * Function : fillBandwidthDl
229 * -checks the value with the bitmask and
230 * -fills the cellPtr's DL Bandwidth
232 * @params[in] Pointer to ClCellParam
233 * Value to be compared
236 * ****************************************************************/
238 PUBLIC void fillBandwidthDl(uint16_t value, ClCellParam **cellPtr)
240 if((value & FAPI_5MHZ_BW_MASK) == FAPI_5MHZ_BW_MASK)
242 (*cellPtr)->supportedBandwidthDl = BW_5MHZ;
244 else if((value & FAPI_10MHZ_BW_MASK) == FAPI_10MHZ_BW_MASK)
246 (*cellPtr)->supportedBandwidthDl = BW_10MHZ;
248 else if((value & FAPI_15MHZ_BW_MASK) == FAPI_15MHZ_BW_MASK)
250 (*cellPtr)->supportedBandwidthDl = BW_15MHZ;
252 else if((value & FAPI_20MHZ_BW_MASK) == FAPI_20MHZ_BW_MASK)
254 (*cellPtr)->supportedBandwidthDl = BW_20MHZ;
256 else if((value & FAPI_40MHZ_BW_MASK) == FAPI_40MHZ_BW_MASK)
258 (*cellPtr)->supportedBandwidthDl = BW_40MHZ;
260 else if((value & FAPI_50MHZ_BW_MASK) == FAPI_50MHZ_BW_MASK)
262 (*cellPtr)->supportedBandwidthDl = BW_50MHZ;
264 else if((value & FAPI_60MHZ_BW_MASK) == FAPI_60MHZ_BW_MASK)
266 (*cellPtr)->supportedBandwidthDl = BW_60MHZ;
268 else if((value & FAPI_70MHZ_BW_MASK) == FAPI_70MHZ_BW_MASK)
270 (*cellPtr)->supportedBandwidthDl = BW_70MHZ;
272 else if((value & FAPI_80MHZ_BW_MASK) == FAPI_80MHZ_BW_MASK)
274 (*cellPtr)->supportedBandwidthDl = BW_80MHZ;
276 else if((value & FAPI_90MHZ_BW_MASK) == FAPI_90MHZ_BW_MASK)
278 (*cellPtr)->supportedBandwidthDl = BW_90MHZ;
280 else if((value & FAPI_100MHZ_BW_MASK) == FAPI_100MHZ_BW_MASK)
282 (*cellPtr)->supportedBandwidthDl = BW_100MHZ;
284 else if((value & FAPI_200MHZ_BW_MASK) == FAPI_200MHZ_BW_MASK)
286 (*cellPtr)->supportedBandwidthDl = BW_200MHZ;
288 else if((value & FAPI_400MHZ_BW_MASK) == FAPI_400MHZ_BW_MASK)
290 (*cellPtr)->supportedBandwidthDl = BW_400MHZ;
294 (*cellPtr)->supportedBandwidthDl = INVALID_VALUE;
298 /*******************************************************************
300 * @brief fills the subcarrier spacing of Uplink by comparing the bitmask
304 * Function : fillSubcarrierSpaceUl
307 * -checks the value with the bitmask and
308 * -fills cellPtr's subcarrier spacing in UL
310 * @params[in] Pointer to ClCellParam
311 * Value to be compared
314 * ****************************************************************/
316 PUBLIC void fillSubcarrierSpaceUl(uint8_t value, ClCellParam **cellPtr)
318 if((value & FAPI_15KHZ_MASK) == FAPI_15KHZ_MASK)
320 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_15_KHZ;
322 else if((value & FAPI_30KHZ_MASK) == FAPI_30KHZ_MASK)
324 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_30_KHZ;
326 else if((value & FAPI_60KHZ_MASK) == FAPI_60KHZ_MASK)
328 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_60_KHZ;
330 else if((value & FAPI_120KHZ_MASK) == FAPI_120KHZ_MASK)
332 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_120_KHZ;
336 (*cellPtr)->supportedSubcarrierSpacingsUl = INVALID_VALUE;
340 /*******************************************************************
342 * @brief fills the uplink bandwidth by comparing the bitmask
346 * Function : fillBandwidthUl
349 * -checks the value with the bitmask and
350 * fills the cellPtr's UL Bandwidth
354 * @params[in] Pointer to ClCellParam
355 * Value to be compared
359 * ****************************************************************/
361 PUBLIC void fillBandwidthUl(uint16_t value, ClCellParam **cellPtr)
363 if((value & FAPI_5MHZ_BW_MASK) == FAPI_5MHZ_BW_MASK)
365 (*cellPtr)->supportedBandwidthUl = BW_5MHZ;
367 else if((value & FAPI_10MHZ_BW_MASK) == FAPI_10MHZ_BW_MASK)
369 (*cellPtr)->supportedBandwidthUl = BW_10MHZ;
371 else if((value & FAPI_15MHZ_BW_MASK) == FAPI_15MHZ_BW_MASK)
373 (*cellPtr)->supportedBandwidthUl = BW_15MHZ;
375 else if((value & FAPI_20MHZ_BW_MASK) == FAPI_20MHZ_BW_MASK)
377 (*cellPtr)->supportedBandwidthUl = BW_20MHZ;
379 else if((value & FAPI_40MHZ_BW_MASK) == FAPI_40MHZ_BW_MASK)
381 (*cellPtr)->supportedBandwidthUl = BW_40MHZ;
383 else if((value & FAPI_50MHZ_BW_MASK) == FAPI_50MHZ_BW_MASK)
385 (*cellPtr)->supportedBandwidthUl = BW_50MHZ;
387 else if((value & FAPI_60MHZ_BW_MASK) == FAPI_60MHZ_BW_MASK)
389 (*cellPtr)->supportedBandwidthUl = BW_60MHZ;
391 else if((value & FAPI_70MHZ_BW_MASK) == FAPI_70MHZ_BW_MASK)
393 (*cellPtr)->supportedBandwidthUl = BW_70MHZ;
395 else if((value & FAPI_80MHZ_BW_MASK) == FAPI_80MHZ_BW_MASK)
397 (*cellPtr)->supportedBandwidthUl = BW_80MHZ;
399 else if((value & FAPI_90MHZ_BW_MASK) == FAPI_90MHZ_BW_MASK)
401 (*cellPtr)->supportedBandwidthUl = BW_90MHZ;
403 else if((value & FAPI_100MHZ_BW_MASK) == FAPI_100MHZ_BW_MASK)
405 (*cellPtr)->supportedBandwidthUl = BW_100MHZ;
407 else if((value & FAPI_200MHZ_BW_MASK) == FAPI_200MHZ_BW_MASK)
409 (*cellPtr)->supportedBandwidthUl = BW_200MHZ;
411 else if((value & FAPI_400MHZ_BW_MASK) == FAPI_400MHZ_BW_MASK)
413 (*cellPtr)->supportedBandwidthUl = BW_400MHZ;
417 (*cellPtr)->supportedBandwidthUl = INVALID_VALUE;
420 /*******************************************************************
422 * @brief fills the CCE maping by comparing the bitmask
426 * Function : fillCCEmaping
429 * -checks the value with the bitmask and
430 * fills the cellPtr's CCE Mapping Type
433 * @params[in] Pointer to ClCellParam
434 * Value to be compared
437 * ****************************************************************/
439 PUBLIC void fillCCEmaping(uint8_t value, ClCellParam **cellPtr)
441 if ((value & FAPI_CCE_MAPPING_INTERLEAVED_MASK) == FAPI_CCE_MAPPING_INTERLEAVED_MASK)
443 (*cellPtr)->cceMappingType = CCE_MAPPING_INTERLEAVED_MASK;
445 else if((value & FAPI_CCE_MAPPING_INTERLEAVED_MASK) == FAPI_CCE_MAPPING_NONINTERLVD_MASK)
447 (*cellPtr)->cceMappingType = CCE_MAPPING_NONINTERLVD_MASK;
451 (*cellPtr)->cceMappingType = INVALID_VALUE;
455 /*******************************************************************
457 * @brief fills the PUCCH format by comparing the bitmask
461 * Function : fillPucchFormat
464 * -checks the value with the bitmask and
465 * fills the cellPtr's pucch format
468 * @params[in] Pointer to ClCellParam
469 * Value to be compared
472 * ****************************************************************/
474 PUBLIC void fillPucchFormat(uint8_t value, ClCellParam **cellPtr)
476 if((value & FAPI_FORMAT_0_MASK) == FAPI_FORMAT_0_MASK)
478 (*cellPtr)->pucchFormats = FORMAT_0;
480 else if((value & FAPI_FORMAT_1_MASK) == FAPI_FORMAT_1_MASK)
482 (*cellPtr)->pucchFormats = FORMAT_1;
484 else if((value & FAPI_FORMAT_2_MASK) == FAPI_FORMAT_2_MASK)
486 (*cellPtr)->pucchFormats = FORMAT_2;
488 else if((value & FAPI_FORMAT_3_MASK) == FAPI_FORMAT_3_MASK)
490 (*cellPtr)->pucchFormats = FORMAT_3;
492 else if((value & FAPI_FORMAT_4_MASK) == FAPI_FORMAT_4_MASK)
494 (*cellPtr)->pucchFormats = FORMAT_4;
498 (*cellPtr)->pucchFormats = INVALID_VALUE;
502 /*******************************************************************
504 * @brief fills the PDSCH Mapping Type by comparing the bitmask
508 * Function : fillPdschMappingType
511 * -checks the value with the bitmask and
512 * fills the cellPtr's PDSCH MappingType
514 * @params[in] Pointer to ClCellParam
515 * Value to be compared
518 * ****************************************************************/
520 PUBLIC void fillPdschMappingType(uint8_t value, ClCellParam **cellPtr)
522 if((value & FAPI_PDSCH_MAPPING_TYPE_A_MASK) == FAPI_PDSCH_MAPPING_TYPE_A_MASK)
524 (*cellPtr)->pdschMappingType = MAPPING_TYPE_A;
526 else if((value & FAPI_PDSCH_MAPPING_TYPE_B_MASK) == FAPI_PDSCH_MAPPING_TYPE_B_MASK)
528 (*cellPtr)->pdschMappingType = MAPPING_TYPE_B;
532 (*cellPtr)->pdschMappingType = INVALID_VALUE;
536 /*******************************************************************
538 * @brief fills the PDSCH Allocation Type by comparing the bitmask
542 * Function : fillPdschAllocationType
545 * -checks the value with the bitmask and
546 * fills the cellPtr's PDSCH AllocationType
548 * @params[in] Pointer to ClCellParam
549 * Value to be compared
552 * ****************************************************************/
554 PUBLIC void fillPdschAllocationType(uint8_t value, ClCellParam **cellPtr)
556 if((value & FAPI_PDSCH_ALLOC_TYPE_0_MASK) == FAPI_PDSCH_ALLOC_TYPE_0_MASK)
558 (*cellPtr)->pdschAllocationTypes = ALLOCATION_TYPE_0;
560 else if((value & FAPI_PDSCH_ALLOC_TYPE_1_MASK) == FAPI_PDSCH_ALLOC_TYPE_1_MASK)
562 (*cellPtr)->pdschAllocationTypes = ALLOCATION_TYPE_1;
566 (*cellPtr)->pdschAllocationTypes = INVALID_VALUE;
570 /*******************************************************************
572 * @brief fills the PDSCH PRB Mapping Type by comparing the bitmask
576 * Function : fillPrbMappingType
579 * -checks the value with the bitmask and
580 * fills the cellPtr's PRB Mapping Type
582 * @params[in] Pointer to ClCellParam
583 * Value to be compared
586 ******************************************************************/
587 PUBLIC void fillPrbMappingType(uint8_t value, ClCellParam **cellPtr)
589 if((value & FAPI_PDSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK) == FAPI_PDSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK)
591 (*cellPtr)->pdschVrbToPrbMapping = VRB_TO_PRB_MAP_NON_INTLV;
593 else if((value & FAPI_PDSCH_VRB_TO_PRB_MAP_INTLVD_MASK) == FAPI_PDSCH_VRB_TO_PRB_MAP_INTLVD_MASK)
595 (*cellPtr)->pdschVrbToPrbMapping = VRB_TO_PRB_MAP_INTLVD;
599 (*cellPtr)->pdschVrbToPrbMapping = INVALID_VALUE;
603 /*******************************************************************
605 * @brief fills the PDSCH DmrsConfig Type by comparing the bitmask
609 * Function : fillPdschDmrsConfigType
612 * -checks the value with the bitmask and
613 * fills the cellPtr's DmrsConfig Type
615 * @params[in] Pointer to ClCellParam
616 * Value to be compared
619 ******************************************************************/
621 PUBLIC void fillPdschDmrsConfigType(uint8_t value, ClCellParam **cellPtr)
623 if((value & FAPI_PDSCH_DMRS_CONFIG_TYPE_1_MASK) == FAPI_PDSCH_DMRS_CONFIG_TYPE_1_MASK)
625 (*cellPtr)->pdschDmrsConfigTypes = DMRS_CONFIG_TYPE_1;
627 else if((value & FAPI_PDSCH_DMRS_CONFIG_TYPE_2_MASK) == FAPI_PDSCH_DMRS_CONFIG_TYPE_2_MASK)
629 (*cellPtr)->pdschDmrsConfigTypes = DMRS_CONFIG_TYPE_2;
633 (*cellPtr)->pdschDmrsConfigTypes = INVALID_VALUE;
637 /*******************************************************************
639 * @brief fills the PDSCH DmrsLength by comparing the bitmask
643 * Function : fillPdschDmrsLength
646 * -checks the value with the bitmask and
647 * fills the cellPtr's PdschDmrsLength
649 * @params[in] Pointer to ClCellParam
650 * Value to be compared
653 ******************************************************************/
654 PUBLIC void fillPdschDmrsLength(uint8_t value, ClCellParam **cellPtr)
656 if(value == FAPI_PDSCH_DMRS_MAX_LENGTH_1)
658 (*cellPtr)->pdschDmrsMaxLength = DMRS_MAX_LENGTH_1;
660 else if(value == FAPI_PDSCH_DMRS_MAX_LENGTH_2)
662 (*cellPtr)->pdschDmrsMaxLength = DMRS_MAX_LENGTH_2;
666 (*cellPtr)->pdschDmrsMaxLength = INVALID_VALUE;
670 /*******************************************************************
672 * @brief fills the PDSCH Dmrs Additional Pos by comparing the bitmask
676 * Function : fillPdschDmrsAddPos
679 * -checks the value with the bitmask and
680 * fills the cellPtr's Pdsch DmrsAddPos
682 * @params[in] Pointer to ClCellParam
683 * Value to be compared
686 ******************************************************************/
688 PUBLIC void fillPdschDmrsAddPos(uint8_t value, ClCellParam **cellPtr)
690 if((value & FAPI_DMRS_ADDITIONAL_POS_0_MASK) == FAPI_DMRS_ADDITIONAL_POS_0_MASK)
692 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_0;
694 else if((value & FAPI_DMRS_ADDITIONAL_POS_1_MASK) == FAPI_DMRS_ADDITIONAL_POS_1_MASK)
696 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_1;
698 else if((value & FAPI_DMRS_ADDITIONAL_POS_2_MASK) == FAPI_DMRS_ADDITIONAL_POS_2_MASK)
700 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_2;
702 else if((value & FAPI_DMRS_ADDITIONAL_POS_3_MASK) == FAPI_DMRS_ADDITIONAL_POS_3_MASK)
704 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_3;
708 (*cellPtr)->pdschDmrsAdditionalPos = INVALID_VALUE;
712 /*******************************************************************
714 * @brief fills the Modulation Order in DL by comparing the bitmask
718 * Function : fillModulationOrderDl
721 * -checks the value with the bitmask and
722 * fills the cellPtr's ModulationOrder in DL.
724 * @params[in] Pointer to ClCellParam
725 * Value to be compared
728 ******************************************************************/
729 PUBLIC void fillModulationOrderDl(uint8_t value, ClCellParam **cellPtr)
733 (*cellPtr)->supportedMaxModulationOrderDl = MOD_QPSK;
737 (*cellPtr)->supportedMaxModulationOrderDl = MOD_16QAM;
741 (*cellPtr)->supportedMaxModulationOrderDl = MOD_64QAM;
745 (*cellPtr)->supportedMaxModulationOrderDl = MOD_256QAM;
749 (*cellPtr)->supportedMaxModulationOrderDl = INVALID_VALUE;
753 /*******************************************************************
755 * @brief fills the PUSCH DmrsConfig Type by comparing the bitmask
759 * Function : fillPuschDmrsConfigType
762 * -checks the value with the bitmask and
763 * fills the cellPtr's PUSCH DmrsConfigType
765 * @params[in] Pointer to ClCellParam
766 * Value to be compared
769 ******************************************************************/
771 PUBLIC void fillPuschDmrsConfig(uint8_t value, ClCellParam **cellPtr)
773 if((value & FAPI_PUSCH_DMRS_CONFIG_TYPE_1_MASK) == FAPI_PUSCH_DMRS_CONFIG_TYPE_1_MASK)
775 (*cellPtr)->puschDmrsConfigTypes = DMRS_CONFIG_TYPE_1;
777 else if((value & FAPI_PUSCH_DMRS_CONFIG_TYPE_2_MASK) == FAPI_PUSCH_DMRS_CONFIG_TYPE_2_MASK)
779 (*cellPtr)->puschDmrsConfigTypes = DMRS_CONFIG_TYPE_2;
783 (*cellPtr)->puschDmrsConfigTypes = INVALID_VALUE;
787 /*******************************************************************
789 * @brief fills the PUSCH DmrsLength by comparing the bitmask
793 * Function : fillPuschDmrsLength
796 * -checks the value with the bitmask and
797 * fills the cellPtr's PUSCH DmrsLength
799 * @params[in] Pointer to ClCellParam
800 * Value to be compared
803 ******************************************************************/
805 PUBLIC void fillPuschDmrsLength(uint8_t value, ClCellParam **cellPtr)
807 if(value == FAPI_PUSCH_DMRS_MAX_LENGTH_1)
809 (*cellPtr)->puschDmrsMaxLength = DMRS_MAX_LENGTH_1;
811 else if(value == FAPI_PUSCH_DMRS_MAX_LENGTH_2)
813 (*cellPtr)->puschDmrsMaxLength = DMRS_MAX_LENGTH_2;
817 (*cellPtr)->puschDmrsMaxLength = INVALID_VALUE;
821 /*******************************************************************
823 * @brief fills the PUSCH Dmrs Additional position by comparing the bitmask
827 * Function : fillPuschDmrsAddPos
830 * -checks the value with the bitmask and
831 * fills the cellPtr's PUSCH DmrsAddPos
833 * @params[in] Pointer to ClCellParam
834 * Value to be compared
837 ******************************************************************/
839 PUBLIC void fillPuschDmrsAddPos(uint8_t value, ClCellParam **cellPtr)
841 if((value & FAPI_DMRS_ADDITIONAL_POS_0_MASK) == FAPI_DMRS_ADDITIONAL_POS_0_MASK)
843 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_0;
845 else if((value & FAPI_DMRS_ADDITIONAL_POS_1_MASK) == FAPI_DMRS_ADDITIONAL_POS_1_MASK)
847 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_1;
849 else if((value & FAPI_DMRS_ADDITIONAL_POS_2_MASK) == FAPI_DMRS_ADDITIONAL_POS_2_MASK)
851 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_2;
853 else if((value & FAPI_DMRS_ADDITIONAL_POS_3_MASK) == FAPI_DMRS_ADDITIONAL_POS_3_MASK)
855 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_3;
859 (*cellPtr)->puschDmrsAdditionalPos = INVALID_VALUE;
863 /*******************************************************************
865 * @brief fills the PUSCH Mapping Type by comparing the bitmask
869 * Function : fillPuschMappingType
872 * -checks the value with the bitmask and
873 * fills the cellPtr's PUSCH MappingType
875 * @params[in] Pointer to ClCellParam
876 * Value to be compared
879 ******************************************************************/
881 PUBLIC void fillPuschMappingType(uint8_t value, ClCellParam **cellPtr)
883 if((value & FAPI_PUSCH_MAPPING_TYPE_A_MASK) == FAPI_PUSCH_MAPPING_TYPE_A_MASK)
885 (*cellPtr)->puschMappingType = MAPPING_TYPE_A;
887 else if((value & FAPI_PUSCH_MAPPING_TYPE_B_MASK) == FAPI_PUSCH_MAPPING_TYPE_B_MASK)
889 (*cellPtr)->puschMappingType = MAPPING_TYPE_B;
893 (*cellPtr)->puschMappingType = INVALID_VALUE;
897 /*******************************************************************
899 * @brief fills the PUSCH Allocation Type by comparing the bitmask
903 * Function : fillPuschAllocationType
906 * -checks the value with the bitmask and
907 * fills the cellPtr's PUSCH AllocationType
909 * @params[in] Pointer to ClCellParam
910 * Value to be compared
913 ******************************************************************/
915 PUBLIC void fillPuschAllocationType(uint8_t value, ClCellParam **cellPtr)
917 if((value & FAPI_PUSCH_ALLOC_TYPE_0_MASK) == FAPI_PUSCH_ALLOC_TYPE_0_MASK)
919 (*cellPtr)->puschAllocationTypes = ALLOCATION_TYPE_0;
921 else if((value & FAPI_PUSCH_ALLOC_TYPE_0_MASK) == FAPI_PUSCH_ALLOC_TYPE_0_MASK)
923 (*cellPtr)->puschAllocationTypes = ALLOCATION_TYPE_1;
927 (*cellPtr)->puschAllocationTypes = INVALID_VALUE;
931 /*******************************************************************
933 * @brief fills the PUSCH PRB Mapping Type by comparing the bitmask
937 * Function : fillPuschPrbMappingType
940 * -checks the value with the bitmask and
941 * fills the cellPtr's PUSCH PRB MApping Type
943 * @params[in] Pointer to ClCellParam
944 * Value to be compared
947 ******************************************************************/
949 PUBLIC void fillPuschPrbMappingType(uint8_t value, ClCellParam **cellPtr)
951 if((value & FAPI_PUSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK) == FAPI_PUSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK)
953 (*cellPtr)->puschVrbToPrbMapping = VRB_TO_PRB_MAP_NON_INTLV;
955 else if((value & FAPI_PUSCH_VRB_TO_PRB_MAP_INTLVD_MASK) == FAPI_PUSCH_VRB_TO_PRB_MAP_INTLVD_MASK)
957 (*cellPtr)->puschVrbToPrbMapping = VRB_TO_PRB_MAP_INTLVD;
961 (*cellPtr)->puschVrbToPrbMapping = INVALID_VALUE;
965 /*******************************************************************
967 * @brief fills the Modulation Order in Ul by comparing the bitmask
971 * Function : fillModulationOrderUl
974 * -checks the value with the bitmask and
975 * fills the cellPtr's Modualtsion Order in UL.
977 * @params[in] Pointer to ClCellParam
978 * Value to be compared
981 ******************************************************************/
983 PUBLIC void fillModulationOrderUl(uint8_t value, ClCellParam **cellPtr)
987 (*cellPtr)->supportedModulationOrderUl = MOD_QPSK;
991 (*cellPtr)->supportedModulationOrderUl = MOD_16QAM;
995 (*cellPtr)->supportedModulationOrderUl = MOD_64QAM;
999 (*cellPtr)->supportedModulationOrderUl = MOD_256QAM;
1003 (*cellPtr)->supportedModulationOrderUl = INVALID_VALUE;
1007 /*******************************************************************
1009 * @brief fills the PUSCH Aggregation Factor by comparing the bitmask
1013 * Function : fillPuschAggregationFactor
1016 * -checks the value with the bitmask and
1017 * fills the cellPtr's PUSCH Aggregation Factor
1019 * @params[in] Pointer to ClCellParam
1020 * Value to be compared
1023 ******************************************************************/
1025 PUBLIC void fillPuschAggregationFactor(uint8_t value, ClCellParam **cellPtr)
1027 if((value & FAPI_FORMAT_0_MASK) == FAPI_FORMAT_0_MASK)
1029 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_1;
1031 else if((value & FAPI_FORMAT_1_MASK) == FAPI_FORMAT_1_MASK)
1033 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_2;
1035 else if((value & FAPI_FORMAT_2_MASK) == FAPI_FORMAT_2_MASK)
1037 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_4;
1039 else if((value & FAPI_FORMAT_3_MASK) == FAPI_FORMAT_3_MASK)
1041 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_8;
1045 (*cellPtr)->puschAggregationFactor = INVALID_VALUE;
1049 /*******************************************************************
1051 * @brief fills the PRACH Long Format by comparing the bitmask
1055 * Function : fillPrachLongFormat
1058 * -checks the value with the bitmask and
1059 * fills the cellPtr's PRACH Long Format
1061 * @params[in] Pointer to ClCellParam
1062 * Value to be compared
1065 ******************************************************************/
1067 PUBLIC void fillPrachLongFormat(uint8_t value, ClCellParam **cellPtr)
1069 if((value & FAPI_PRACH_LF_FORMAT_0_MASK) == FAPI_PRACH_LF_FORMAT_0_MASK)
1071 (*cellPtr)->prachLongFormats = FORMAT_0;
1073 else if((value & FAPI_PRACH_LF_FORMAT_1_MASK) == FAPI_PRACH_LF_FORMAT_1_MASK)
1075 (*cellPtr)->prachLongFormats = FORMAT_1;
1077 else if((value & FAPI_PRACH_LF_FORMAT_2_MASK) == FAPI_PRACH_LF_FORMAT_2_MASK)
1079 (*cellPtr)->prachLongFormats = FORMAT_2;
1081 else if((value & FAPI_PRACH_LF_FORMAT_3_MASK) == FAPI_PRACH_LF_FORMAT_3_MASK)
1083 (*cellPtr)->prachLongFormats = FORMAT_3;
1087 (*cellPtr)->prachLongFormats = INVALID_VALUE;
1091 /*******************************************************************
1093 * @brief fills the PRACH Short Format by comparing the bitmask
1097 * Function : fillPrachShortFormat
1100 * -checks the value with the bitmask and
1101 * fills the cellPtr's PRACH ShortFormat
1103 * @params[in] Pointer to ClCellParam
1104 * Value to be compared
1107 ******************************************************************/
1109 PUBLIC void fillPrachShortFormat(uint8_t value, ClCellParam **cellPtr)
1111 if((value & FAPI_PRACH_SF_FORMAT_A1_MASK) == FAPI_PRACH_SF_FORMAT_A1_MASK)
1113 (*cellPtr)->prachShortFormats = SF_FORMAT_A1;
1115 else if((value & FAPI_PRACH_SF_FORMAT_A2_MASK) == FAPI_PRACH_SF_FORMAT_A2_MASK)
1117 (*cellPtr)->prachShortFormats = SF_FORMAT_A2;
1119 else if((value & FAPI_PRACH_SF_FORMAT_A3_MASK) == FAPI_PRACH_SF_FORMAT_A3_MASK)
1121 (*cellPtr)->prachShortFormats = SF_FORMAT_A3;
1123 else if((value & FAPI_PRACH_SF_FORMAT_B1_MASK) == FAPI_PRACH_SF_FORMAT_B1_MASK)
1125 (*cellPtr)->prachShortFormats = SF_FORMAT_B1;
1127 else if((value & FAPI_PRACH_SF_FORMAT_B2_MASK) == FAPI_PRACH_SF_FORMAT_B2_MASK)
1129 (*cellPtr)->prachShortFormats = SF_FORMAT_B2;
1131 else if((value & FAPI_PRACH_SF_FORMAT_B3_MASK) == FAPI_PRACH_SF_FORMAT_B3_MASK)
1133 (*cellPtr)->prachShortFormats = SF_FORMAT_B3;
1135 else if((value & FAPI_PRACH_SF_FORMAT_B4_MASK) == FAPI_PRACH_SF_FORMAT_B4_MASK)
1137 (*cellPtr)->prachShortFormats = SF_FORMAT_B4;
1139 else if((value & FAPI_PRACH_SF_FORMAT_C0_MASK) == FAPI_PRACH_SF_FORMAT_C0_MASK)
1141 (*cellPtr)->prachShortFormats = SF_FORMAT_C0;
1143 else if((value & FAPI_PRACH_SF_FORMAT_C2_MASK) == FAPI_PRACH_SF_FORMAT_C2_MASK)
1145 (*cellPtr)->prachShortFormats = SF_FORMAT_C2;
1149 (*cellPtr)->prachShortFormats = INVALID_VALUE;
1153 /*******************************************************************
1155 * @brief fills the Fd Occasions Type by comparing the bitmask
1159 * Function : fillFdOccasions
1162 * -checks the value with the bitmask and
1163 * fills the cellPtr's Fd Occasions
1165 * @params[in] Pointer to ClCellParam
1166 * Value to be compared
1169 ******************************************************************/
1171 PUBLIC void fillFdOccasions(uint8_t value, ClCellParam **cellPtr)
1175 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_1;
1179 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_2;
1183 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_4;
1187 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_8;
1191 (*cellPtr)->maxPrachFdOccasionsInASlot = INVALID_VALUE;
1195 /*******************************************************************
1197 * @brief fills the RSSI Measurement by comparing the bitmask
1201 * Function : fillRssiMeas
1204 * -checks the value with the bitmask and
1205 * fills the cellPtr's RSSI Measurement report
1207 * @params[in] Pointer to ClCellParam
1208 * Value to be compared
1211 ******************************************************************/
1213 PUBLIC void fillRssiMeas(uint8_t value, ClCellParam **cellPtr)
1215 if((value & FAPI_RSSI_REPORT_IN_DBM_MASK) == FAPI_RSSI_REPORT_IN_DBM_MASK)
1217 (*cellPtr)->rssiMeasurementSupport = RSSI_REPORT_DBM;
1219 else if((value & FAPI_RSSI_REPORT_IN_DBFS_MASK) == FAPI_RSSI_REPORT_IN_DBFS_MASK)
1221 (*cellPtr)->rssiMeasurementSupport = RSSI_REPORT_DBFS;
1225 (*cellPtr)->rssiMeasurementSupport = INVALID_VALUE;
1229 /*******************************************************************
1231 * @brief Returns the TLVs value
1235 * Function : getParamValue
1238 * -return TLVs value
1241 * @return ROK - temp
1244 * ****************************************************************/
1246 uint32_t getParamValue(fapi_uint16_tlv_t *tlv, uint16_t type)
1250 valueLen = tlv->tl.length;
1251 posPtr = &tlv->tl.tag;
1252 posPtr += sizeof(tlv->tl.tag);
1253 posPtr += sizeof(tlv->tl.length);
1254 /*TO DO: malloc to SSI memory */
1255 if(type == FAPI_UINT_8)
1257 //temp = (uint8_t *)malloc(valueLen * sizeof(U8));
1258 //memcpy(temp, posPtr, valueLen);
1259 return(*(uint8_t *)posPtr);
1261 else if(type == FAPI_UINT_16)
1263 return(*(uint16_t *)posPtr);
1265 else if(type == FAPI_UINT_32)
1267 return(*(uint32_t *)posPtr);
1271 DU_LOG("\nLOWER MAC: Value Extraction failed" );
1275 /*******************************************************************
1277 * @brief Sends FAPI Param req to PHY
1281 * Function : lwr_mac_handleParamReqEvt
1284 * -Sends FAPI Param req to PHY
1287 * @return ROK - success
1290 * ****************************************************************/
1292 S16 lwr_mac_handleParamReqEvt(void *msg)
1294 /* startGuardTimer(); */
1295 uint32_t msgLen; //Length of message Body
1297 fapi_param_req_t *paramReq;
1298 MAC_ALLOC(paramReq, sizeof(fapi_param_req_t));
1299 if(paramReq != NULLP)
1301 fillMsgHeader(¶mReq->header, FAPI_PARAM_REQUEST, msgLen);
1302 DU_LOG("\nLOWER MAC: sending param Req to Phy");
1303 sendToPhy(paramReq->header.message_type_id, sizeof(fapi_param_req_t), (void *)paramReq);
1304 MAC_FREE(paramReq, sizeof(fapi_param_req_t));
1309 DU_LOG("\nLOWER MAC: Failed to allocate memory for Param Request");
1314 /*******************************************************************
1316 * @brief Sends FAPI Param Response to MAC via PHY
1320 * Function : lwr_mac_handleParamRspEvt
1323 * -Sends FAPI Param rsp to MAC via PHY
1326 * @return ROK - success
1329 * ****************************************************************/
1331 S16 lwr_mac_handleParamRspEvt(void *msg)
1333 /* stopGuardTimer(); */
1335 uint32_t encodedVal;
1336 fapi_param_resp_t *paramRsp;
1337 ClCellParam *cellParam = NULLP;
1339 paramRsp = (fapi_param_resp_t *)msg;
1340 DU_LOG("\nLOWER MAC: Received EVENT[%d] at STATE[%d]", clGlobalCp.event, clGlobalCp.phyState);
1342 if(paramRsp != NULLP)
1344 MAC_ALLOC(cellParam, sizeof(ClCellParam));
1345 if(cellParam != NULLP)
1347 DU_LOG("\n LOWER MAC: Filling TLVS into MAC API");
1348 if(paramRsp->error_code == MSG_OK)
1350 for(index = 0; index < paramRsp->number_of_tlvs; index++)
1352 switch(paramRsp->tlvs[index].tl.tag)
1354 case FAPI_RELEASE_CAPABILITY_TAG:
1355 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1356 if(encodedVal != RFAILED && (encodedVal & RELEASE_15) == RELEASE_15)
1358 cellParam->releaseCapability = RELEASE_15;
1362 case FAPI_PHY_STATE_TAG:
1363 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1364 if(encodedVal != RFAILED && encodedVal != clGlobalCp.phyState)
1366 printf("\n PhyState mismatch [%d][%d]", clGlobalCp.phyState, clGlobalCp.event);
1371 case FAPI_SKIP_BLANK_DL_CONFIG_TAG:
1372 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1373 if(encodedVal != RFAILED && encodedVal != 0)
1375 cellParam->skipBlankDlConfig = SUPPORTED;
1379 cellParam->skipBlankDlConfig = NOT_SUPPORTED;
1383 case FAPI_SKIP_BLANK_UL_CONFIG_TAG:
1384 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1385 if(encodedVal != RFAILED && encodedVal != 0)
1387 cellParam->skipBlankUlConfig = SUPPORTED;
1391 cellParam->skipBlankUlConfig = NOT_SUPPORTED;
1395 case FAPI_NUM_CONFIG_TLVS_TO_REPORT_TYPE_TAG:
1396 cellParam->numTlvsToReport = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1399 case FAPI_CYCLIC_PREFIX_TAG:
1400 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1401 if(encodedVal != RFAILED)
1403 fillCyclicPrefix(encodedVal, &cellParam);
1407 case FAPI_SUPPORTED_SUBCARRIER_SPACING_DL_TAG:
1408 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1409 if(encodedVal != RFAILED)
1411 fillSubcarrierSpaceDl(encodedVal, &cellParam);
1415 case FAPI_SUPPORTED_BANDWIDTH_DL_TAG:
1416 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1417 if(encodedVal != RFAILED)
1419 fillBandwidthDl(encodedVal, &cellParam);
1423 case FAPI_SUPPORTED_SUBCARRIER_SPACING_UL_TAG:
1424 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1425 if(encodedVal != RFAILED)
1427 fillSubcarrierSpaceUl(encodedVal, &cellParam);
1431 case FAPI_SUPPORTED_BANDWIDTH_UL_TAG:
1432 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1433 if(encodedVal != RFAILED)
1435 fillBandwidthUl(encodedVal, &cellParam);
1439 case FAPI_CCE_MAPPING_TYPE_TAG:
1440 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1441 if(encodedVal != RFAILED)
1443 fillCCEmaping(encodedVal, &cellParam);
1447 case FAPI_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG:
1448 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1449 if(encodedVal != RFAILED && encodedVal != 0)
1451 cellParam->coresetOutsideFirst3OfdmSymsOfSlot = SUPPORTED;
1455 cellParam->coresetOutsideFirst3OfdmSymsOfSlot = NOT_SUPPORTED;
1459 case FAPI_PRECODER_GRANULARITY_CORESET_TAG:
1460 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1461 if(encodedVal != RFAILED && encodedVal != 0)
1463 cellParam->precoderGranularityCoreset = SUPPORTED;
1467 cellParam->precoderGranularityCoreset = NOT_SUPPORTED;
1471 case FAPI_PDCCH_MU_MIMO_TAG:
1472 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1473 if(encodedVal != RFAILED && encodedVal != 0)
1475 cellParam->pdcchMuMimo = SUPPORTED;
1479 cellParam->pdcchMuMimo = NOT_SUPPORTED;
1483 case FAPI_PDCCH_PRECODER_CYCLING_TAG:
1484 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1485 if(encodedVal != RFAILED && encodedVal != 0)
1487 cellParam->pdcchPrecoderCycling = SUPPORTED;
1491 cellParam->pdcchPrecoderCycling = NOT_SUPPORTED;
1495 case FAPI_MAX_PDCCHS_PER_SLOT_TAG:
1496 cellParam->maxPdcchsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1499 case FAPI_PUCCH_FORMATS_TAG:
1500 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1501 if(encodedVal != RFAILED)
1503 fillPucchFormat(encodedVal, &cellParam);
1507 case FAPI_MAX_PUCCHS_PER_SLOT_TAG:
1508 cellParam->maxPucchsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1511 case FAPI_PDSCH_MAPPING_TYPE_TAG:
1512 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1513 if(encodedVal != RFAILED)
1515 fillPdschMappingType(encodedVal, &cellParam);
1519 case FAPI_PDSCH_ALLOCATION_TYPES_TAG:
1520 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1521 if(encodedVal != RFAILED)
1523 fillPdschAllocationType(encodedVal, &cellParam);
1527 case FAPI_PDSCH_VRB_TO_PRB_MAPPING_TAG:
1528 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1529 if(encodedVal != RFAILED)
1531 fillPrbMappingType(encodedVal, &cellParam);
1535 case FAPI_PDSCH_CBG_TAG:
1536 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1537 if(encodedVal != RFAILED && encodedVal != 0)
1539 cellParam->pdschCbg = SUPPORTED;
1543 cellParam->pdschCbg = NOT_SUPPORTED;
1547 case FAPI_PDSCH_DMRS_CONFIG_TYPES_TAG:
1548 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1549 if(encodedVal != RFAILED)
1551 fillPdschDmrsConfigType(encodedVal, &cellParam);
1555 case FAPI_PDSCH_DMRS_MAX_LENGTH_TAG:
1556 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1557 if(encodedVal != RFAILED)
1559 fillPdschDmrsLength(encodedVal, &cellParam);
1563 case FAPI_PDSCH_DMRS_ADDITIONAL_POS_TAG:
1564 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1565 if(encodedVal != RFAILED)
1567 fillPdschDmrsAddPos(encodedVal, &cellParam);
1571 case FAPI_MAX_PDSCHS_TBS_PER_SLOT_TAG:
1572 cellParam->maxPdschsTBsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1575 case FAPI_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG:
1576 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1577 if(encodedVal != RFAILED && encodedVal < FAPI_MAX_NUMBERMIMO_LAYERS_PDSCH)
1579 cellParam->maxNumberMimoLayersPdsch = encodedVal;
1583 case FAPI_SUPPORTED_MAX_MODULATION_ORDER_DL_TAG:
1584 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1585 if(encodedVal != RFAILED)
1587 fillModulationOrderDl(encodedVal, &cellParam);
1591 case FAPI_MAX_MU_MIMO_USERS_DL_TAG:
1592 cellParam->maxMuMimoUsersDl = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1595 case FAPI_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG:
1596 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1597 if(encodedVal != RFAILED && encodedVal != 0)
1599 cellParam->pdschDataInDmrsSymbols = SUPPORTED;
1603 cellParam->pdschDataInDmrsSymbols = NOT_SUPPORTED;
1607 case FAPI_PREMPTIONSUPPORT_TAG:
1608 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1609 if(encodedVal != RFAILED && encodedVal != 0)
1611 cellParam->premptionSupport = SUPPORTED;
1615 cellParam->premptionSupport = NOT_SUPPORTED;
1619 case FAPI_PDSCH_NON_SLOT_SUPPORT_TAG:
1620 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1621 if(encodedVal != RFAILED && encodedVal != 0)
1623 cellParam->pdschNonSlotSupport = SUPPORTED;
1627 cellParam->pdschNonSlotSupport = NOT_SUPPORTED;
1631 case FAPI_UCI_MUX_ULSCH_IN_PUSCH_TAG:
1632 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1633 if(encodedVal != RFAILED && encodedVal != 0)
1635 cellParam->uciMuxUlschInPusch = SUPPORTED;
1639 cellParam->uciMuxUlschInPusch = NOT_SUPPORTED;
1643 case FAPI_UCI_ONLY_PUSCH_TAG:
1644 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1645 if(encodedVal != RFAILED && encodedVal != 0)
1647 cellParam->uciOnlyPusch = SUPPORTED;
1651 cellParam->uciOnlyPusch = NOT_SUPPORTED;
1655 case FAPI_PUSCH_FREQUENCY_HOPPING_TAG:
1656 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1657 if(encodedVal != RFAILED && encodedVal != 0)
1659 cellParam->puschFrequencyHopping = SUPPORTED;
1663 cellParam->puschFrequencyHopping = NOT_SUPPORTED;
1667 case FAPI_PUSCH_DMRS_CONFIG_TYPES_TAG:
1668 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1669 if(encodedVal != RFAILED)
1671 fillPuschDmrsConfig(encodedVal, &cellParam);
1675 case FAPI_PUSCH_DMRS_MAX_LEN_TAG:
1676 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1677 if(encodedVal != RFAILED)
1679 fillPuschDmrsLength(encodedVal, &cellParam);
1683 case FAPI_PUSCH_DMRS_ADDITIONAL_POS_TAG:
1684 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1685 if(encodedVal != RFAILED)
1687 fillPuschDmrsAddPos(encodedVal, &cellParam);
1691 case FAPI_PUSCH_CBG_TAG:
1692 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1693 if(encodedVal != RFAILED && encodedVal != 0)
1695 cellParam->puschCbg = SUPPORTED;
1699 cellParam->puschCbg = NOT_SUPPORTED;
1703 case FAPI_PUSCH_MAPPING_TYPE_TAG:
1704 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1705 if(encodedVal != RFAILED)
1707 fillPuschMappingType(encodedVal, &cellParam);
1711 case FAPI_PUSCH_ALLOCATION_TYPES_TAG:
1712 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1713 if(encodedVal != RFAILED)
1715 fillPuschAllocationType(encodedVal, &cellParam);
1719 case FAPI_PUSCH_VRB_TO_PRB_MAPPING_TAG:
1720 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1721 if(encodedVal != RFAILED)
1723 fillPuschPrbMappingType(encodedVal, &cellParam);
1727 case FAPI_PUSCH_MAX_PTRS_PORTS_TAG:
1728 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1729 if(encodedVal != RFAILED && encodedVal < FAPI_PUSCH_MAX_PTRS_PORTS_UB)
1731 cellParam->puschMaxPtrsPorts = encodedVal;
1735 case FAPI_MAX_PDUSCHS_TBS_PER_SLOT_TAG:
1736 cellParam->maxPduschsTBsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1739 case FAPI_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG:
1740 cellParam->maxNumberMimoLayersNonCbPusch = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1743 case FAPI_SUPPORTED_MODULATION_ORDER_UL_TAG:
1744 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1745 if(encodedVal != RFAILED)
1747 fillModulationOrderUl(encodedVal, &cellParam);
1751 case FAPI_MAX_MU_MIMO_USERS_UL_TAG:
1752 cellParam->maxMuMimoUsersUl = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1755 case FAPI_DFTS_OFDM_SUPPORT_TAG:
1756 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1757 if(encodedVal != RFAILED && encodedVal != 0)
1759 cellParam->dftsOfdmSupport = SUPPORTED;
1763 cellParam->dftsOfdmSupport = NOT_SUPPORTED;
1767 case FAPI_PUSCH_AGGREGATION_FACTOR_TAG:
1768 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1769 if(encodedVal != RFAILED)
1771 fillPuschAggregationFactor(encodedVal, &cellParam);
1775 case FAPI_PRACH_LONG_FORMATS_TAG:
1776 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1777 if(encodedVal != RFAILED)
1779 fillPrachLongFormat(encodedVal, &cellParam);
1783 case FAPI_PRACH_SHORT_FORMATS_TAG:
1784 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1785 if(encodedVal != RFAILED)
1787 fillPrachShortFormat(encodedVal, &cellParam);
1791 case FAPI_PRACH_RESTRICTED_SETS_TAG:
1792 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1793 if(encodedVal != RFAILED && encodedVal != 0)
1795 cellParam->prachRestrictedSets = SUPPORTED;
1799 cellParam->prachRestrictedSets = NOT_SUPPORTED;
1803 case FAPI_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG:
1804 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1805 if(encodedVal != RFAILED)
1807 fillFdOccasions(encodedVal, &cellParam);
1811 case FAPI_RSSI_MEASUREMENT_SUPPORT_TAG:
1812 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1813 if(encodedVal != RFAILED)
1815 fillRssiMeas(encodedVal, &cellParam);
1819 //printf("\n Invalid value for TLV[%x] at index[%d]", paramRsp->tlvs[index].tl.tag, index);
1823 MAC_FREE(cellParam, sizeof(ClCellParam));
1824 MAC_FREE(paramRsp, sizeof(fapi_param_resp_t));
1829 DU_LOG("\n LOWER MAC: Invalid error code %d", paramRsp->error_code);
1835 DU_LOG("\nLOWER MAC: Failed to allocate memory for cell param");
1841 DU_LOG("\nLOWER MAC: Param Response received from PHY is NULL");
1846 /*******************************************************************
1848 * @brief Sends FAPI Config req to PHY
1852 * Function : lwr_mac_handleConfigReqEvt
1855 * -Sends FAPI Config Req to PHY
1858 * @return ROK - success
1861 * ****************************************************************/
1863 S16 lwr_mac_handleConfigReqEvt(void *msg)
1866 uint32_t msgLen = 0;
1867 uint32_t configReqSize;
1868 RgCellCb *cellParams;
1869 MacCellCfg macCfgParams;
1872 DU_LOG("\nLOWER MAC: Received EVENT[%d] at STATE[%d]", clGlobalCp.event, clGlobalCp.phyState);
1874 fapi_config_req_t *configReq;
1875 cellParams = rgCb[inst].cell;
1876 macCfgParams = cellParams->macCellCfg;
1877 configReqSize = sizeof(fapi_config_req_t) + (macCfgParams.numTlv * sizeof(fapi_uint16_tlv_t));
1878 MAC_ALLOC(configReq, configReqSize);
1880 if(configReq != NULL)
1882 configReq->number_of_tlvs = macCfgParams.numTlv;
1884 if(macCfgParams.dlCarrCfg.pres)
1886 fillTlvs(&configReq->tlvs[index++], FAPI_DL_BANDWIDTH_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.bw, &msgLen);
1887 fillTlvs(&configReq->tlvs[index++], FAPI_DL_FREQUENCY_TAG, sizeof(uint32_t), macCfgParams.dlCarrCfg.freq, &msgLen);
1888 fillTlvs(&configReq->tlvs[index++], FAPI_DL_K0_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.k0[0], &msgLen);
1889 fillTlvs(&configReq->tlvs[index++], FAPI_DL_GRIDSIZE_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.gridSize[0], &msgLen);
1890 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_TX_ANT_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.numAnt, &msgLen);
1892 if(macCfgParams.ulCarrCfg.pres)
1894 fillTlvs(&configReq->tlvs[index++], FAPI_UPLINK_BANDWIDTH_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.bw, &msgLen);
1895 fillTlvs(&configReq->tlvs[index++], FAPI_UPLINK_FREQUENCY_TAG, sizeof(uint32_t), macCfgParams.ulCarrCfg.freq, &msgLen);
1896 fillTlvs(&configReq->tlvs[index++], FAPI_UL_K0_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.k0[0], &msgLen);
1897 fillTlvs(&configReq->tlvs[index++], FAPI_UL_GRID_SIZE_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.gridSize[0], &msgLen);
1898 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_RX_ANT_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.numAnt, &msgLen);
1900 fillTlvs(&configReq->tlvs[index++], FAPI_FREQUENCY_SHIFT_7P5_KHZ_TAG, sizeof(uint8_t), macCfgParams.freqShft, &msgLen);
1902 /* fill cell config */
1903 fillTlvs(&configReq->tlvs[index++], FAPI_PHY_CELL_ID_TAG, sizeof(uint8_t), macCfgParams.phyCellId, &msgLen);
1904 fillTlvs(&configReq->tlvs[index++], FAPI_FRAME_DUPLEX_TYPE_TAG, sizeof(uint8_t), macCfgParams.dupType, &msgLen);
1906 /* fill SSB configuration */
1907 fillTlvs(&configReq->tlvs[index++], FAPI_SS_PBCH_POWER_TAG, sizeof(uint32_t), macCfgParams.ssbCfg.ssbPbchPwr, &msgLen);
1908 fillTlvs(&configReq->tlvs[index++], FAPI_BCH_PAYLOAD_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.bchPayloadFlag, &msgLen);
1909 fillTlvs(&configReq->tlvs[index++], FAPI_SCS_COMMON_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.scsCmn, &msgLen);
1911 /* fill PRACH configuration */
1912 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_SEQUENCE_LENGTH_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachSeqLen, &msgLen);
1913 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_SUBC_SPACING_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachSubcSpacing, &msgLen);
1914 fillTlvs(&configReq->tlvs[index++], FAPI_RESTRICTED_SET_CONFIG_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachRstSetCfg, &msgLen);
1915 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_PRACH_FD_OCCASIONS_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachFdm, &msgLen);
1916 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_ROOT_SEQUENCE_INDEX_TAG, sizeof(uint16_t), macCfgParams.prachCfg.fdm[0].rootSeqIdx, &msgLen);
1917 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_ROOT_SEQUENCES_TAG, sizeof(uint8_t), macCfgParams.prachCfg.fdm[0].numRootSeq, &msgLen);
1918 fillTlvs(&configReq->tlvs[index++], FAPI_K1_TAG, sizeof(uint16_t), macCfgParams.prachCfg.fdm[0].k1, &msgLen);
1919 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_ZERO_CORR_CONF_TAG , sizeof(uint8_t), macCfgParams.prachCfg.fdm[0].zeroCorrZoneCfg, &msgLen);
1920 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_UNUSED_ROOT_SEQUENCES_TAG, sizeof(uint8_t), macCfgParams.prachCfg.fdm[0].numUnusedRootSeq, &msgLen);
1921 fillTlvs(&configReq->tlvs[index++], FAPI_UNUSED_ROOT_SEQUENCES_TAG,
1922 sizeof(uint8_t), *(macCfgParams.prachCfg.fdm[0].unsuedRootSeq), &msgLen);
1923 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_PER_RACH_TAG, sizeof(uint8_t), macCfgParams.prachCfg.ssbPerRach, &msgLen);
1924 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachMultCarrBand, &msgLen);
1926 /* fill SSB table */
1927 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_OFFSET_POINT_A_TAG, sizeof(uint16_t), macCfgParams.ssbCfg.ssbOffsetPointA, &msgLen);
1928 fillTlvs(&configReq->tlvs[index++], FAPI_BETA_PSS_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.betaPss, &msgLen);
1929 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_PERIOD_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.ssbPeriod, &msgLen);
1930 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_SUBCARRIER_OFFSET_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.ssbScOffset, &msgLen);
1931 fillTlvs(&configReq->tlvs[index++], FAPI_MIB_TAG , sizeof(uint32_t), macCfgParams.ssbCfg.mibPdu[0], &msgLen);
1932 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_MASK_TAG, sizeof(uint32_t), macCfgParams.ssbCfg.ssbMask[0], &msgLen);
1933 fillTlvs(&configReq->tlvs[index++], FAPI_BEAM_ID_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.beamId[0], &msgLen);
1934 fillTlvs(&configReq->tlvs[index++], FAPI_SS_PBCH_MULTIPLE_CARRIERS_IN_A_BAND_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.multCarrBand, &msgLen);
1935 fillTlvs(&configReq->tlvs[index++], FAPI_MULTIPLE_CELLS_SS_PBCH_IN_A_CARRIER_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.multCellCarr, &msgLen);
1937 /* fill TDD table */
1938 fillTlvs(&configReq->tlvs[index++], FAPI_TDD_PERIOD_TAG, sizeof(uint8_t), macCfgParams.tddCfg.tddPeriod, &msgLen);
1939 fillTlvs(&configReq->tlvs[index++], FAPI_SLOT_CONFIG_TAG, sizeof(uint8_t), macCfgParams.tddCfg.slotCfg[0][0], &msgLen);
1941 /* fill measurement config */
1942 fillTlvs(&configReq->tlvs[index++], FAPI_RSSI_MESUREMENT_TAG, sizeof(uint8_t), macCfgParams.rssiUnit, &msgLen);
1944 fillMsgHeader(&configReq->header, FAPI_CONFIG_REQUEST, msgLen);
1945 DU_LOG("\nLOWER_MAC: Sending Config Request to Phy");
1946 sendToPhy(configReq->header.message_type_id, msgLen, (void *)configReq);
1947 MAC_FREE(configReq, configReqSize);
1952 DU_LOG("\nLOWER_MAC: Failed to allocate memory for config Request");
1957 S16 lwr_mac_handleConfigRspEvt(void *msg)
1959 fapi_config_resp_t *configRsp;
1960 configRsp = (fapi_config_resp_t *)msg;
1961 DU_LOG("\nLOWER MAC: Received EVENT[%d] at STATE[%d]", clGlobalCp.event, clGlobalCp.phyState);
1963 if(configRsp != NULL)
1965 if(configRsp->error_code == MSG_OK)
1967 DU_LOG("\nLOWER MAC: PHY has moved to Conigured state \n");
1968 clGlobalCp.phyState = PHY_STATE_CONFIGURED;
1969 MAC_FREE(configRsp, sizeof(fapi_config_resp_t));
1975 DU_LOG("\n LOWER MAC: Invalid error code %d", configRsp->error_code);
1981 DU_LOG("\nLOWER_MAC: Config Response received from PHY is NULL");
1986 S16 lwr_mac_handleStartReqEvt(void *msg)
1988 uint32_t msgLen = 0;
1989 fapi_start_req_t *startReq;
1990 MAC_ALLOC(startReq, sizeof(fapi_start_req_t));
1992 if(startReq != NULL)
1994 fillMsgHeader(&startReq->header, FAPI_START_REQUEST, msgLen);
1995 DU_LOG("\nLOWER MAC: Sending Start Request to PHY");
1996 sendToPhy(startReq->header.message_type_id, sizeof(fapi_start_req_t), (void *)startReq);
1997 MAC_FREE(startReq, sizeof(fapi_start_req_t));
2002 DU_LOG("\nLOWER MAC: Failed to allocate memory for Start Request");
2007 S16 lwr_mac_handleStopReqEvt(void *msg)
2009 /* stop TX and RX operation return PHy to configured State
2010 send stop.indication to l2/l3 */
2014 /*******************************************************************
2016 * @brief Modifes the received mibPdu to uint32 bit
2017 * and stores it in MacCellCfg
2021 * Function : setMibPdu
2026 * @params[in] Pointer to mibPdu
2027 * pointer to modified value
2028 ******************************************************************/
2030 PUBLIC void setMibPdu(uint8_t *mibPdu, uint32_t *val)
2032 *mibPdu |= (((uint8_t)(slotIndInfo.sfn >> 2)) & MIB_SFN_BITMASK);
2033 *val = (mibPdu[0] << 24 | mibPdu[1] << 16 | mibPdu[2] << 8);
2034 DU_LOG("\nLOWER MAC: value filled %x", *val);
2037 /*******************************************************************
2039 * @brief fills SSB PDU required for DL TTI info in MAC
2043 * Function : fillSsbPdu
2046 * -Fills the SSB PDU info
2049 * @params[in] Pointer to FAPI DL TTI Req
2050 * Pointer to RgCellCb
2051 * Pointer to msgLen of DL TTI Info
2054 ******************************************************************/
2056 S16 fillSsbPdu(fapi_dl_tti_req_pdu_t *dlTtiReqPdu, MacCellCfg *macCellCfg,
2059 uint32_t mibPayload = 0;
2060 if(dlTtiReqPdu != NULL)
2062 dlTtiReqPdu->pduType = SSB_PDU_TYPE; /* SSB PDU */
2063 dlTtiReqPdu->u.ssb_pdu.physCellId = macCellCfg->phyCellId;
2064 dlTtiReqPdu->u.ssb_pdu.betaPss = macCellCfg->ssbCfg.betaPss;
2065 dlTtiReqPdu->u.ssb_pdu.ssbBlockIndex = macCb.macCell->dlSlot[0].cellBroadcastInfo.ssbIdxSupported;
2066 dlTtiReqPdu->u.ssb_pdu.ssbSubCarrierOffset = macCellCfg->ssbCfg.ssbScOffset;
2067 /* ssbOfPdufstA to be filled in ssbCfg */
2068 dlTtiReqPdu->u.ssb_pdu.ssbOffsetPointA = macCellCfg->ssbCfg.ssbOffsetPointA;
2069 dlTtiReqPdu->u.ssb_pdu.bchPayloadFlag = macCellCfg->ssbCfg.bchPayloadFlag;
2070 /* Bit manipulation for SFN */
2071 setMibPdu(macCellCfg->ssbCfg.mibPdu, &mibPayload);
2072 dlTtiReqPdu->u.ssb_pdu.bchPayload.v.bchPayload = mibPayload;
2073 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.numPrgs = 0;
2074 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.prgSize = 0;
2075 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.digBfInterfaces = 0;
2076 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.pmi_bfi[0].pmIdx = 0;
2077 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming. \
2078 pmi_bfi[0].beamIdx[0].beamidx = macCellCfg->ssbCfg.beamId[0];
2079 dlTtiReqPdu->pduSize = sizeof(fapi_dl_ssb_pdu_t); /* Size of SSB PDU */
2080 SETLENGTH(*msgLen, sizeof(fapi_dl_ssb_pdu_t));
2089 /*******************************************************************
2091 * @brief Sends DL TTI Request to PHY
2095 * Function : handleDlTtiReq
2098 * -Sends FAPI Param req to PHY
2100 * @params[in] RgDlSf *dlTtiReqSlot
2101 * @return ROK - success
2104 * ****************************************************************/
2105 S16 handleDlTtiReq(CmLteTimingInfo *dlTtiReqtimingInfo)
2108 fapi_dl_tti_req_t *dlTtiReq;
2109 fapi_dl_tti_req_pdu_t *dlTtiReqPdu;
2110 RgCellCb *cellCbParams;
2111 MacCellCfg macCellCfg;
2114 cellCbParams = rgCb[inst].cell;
2115 if(dlTtiReqtimingInfo != NULLP)
2117 MAC_ALLOC(dlTtiReq, sizeof(fapi_dl_tti_req_t));
2118 if(dlTtiReq != NULLP)
2120 /* fill the SFN and slot value from crntTime */
2121 dlTtiReq->sfn = dlTtiReqtimingInfo->sfn;
2122 dlTtiReq->slot = dlTtiReqtimingInfo->slot;
2123 dlTtiReq->nPdus = 0;
2124 dlTtiReq->nGroup = 0;
2125 if(macCb.macCell->dlSlot[0].cellBroadcastInfo.ssbTrans)
2127 macCellCfg = cellCbParams->macCellCfg;
2129 MAC_ALLOC(dlTtiReqPdu, sizeof(fapi_dl_tti_req_pdu_t));
2130 if(dlTtiReqPdu != NULLP)
2132 fillSsbPdu(dlTtiReqPdu, &macCellCfg, &msgLen);
2133 dlTtiReq->pdus = dlTtiReqPdu;
2135 (dlTtiReq->nPdus)++;
2136 msgLen = sizeof(fapi_dl_tti_req_t) - sizeof(fapi_msg_t);
2137 fillMsgHeader(&dlTtiReq->header, FAPI_DL_TTI_REQUEST, msgLen);
2138 sendToPhy(dlTtiReq->header.message_type_id, msgLen, (void *)dlTtiReq);
2139 MAC_FREE(dlTtiReqPdu, sizeof(fapi_dl_tti_req_pdu_t));
2141 MAC_FREE(dlTtiReq, sizeof(fapi_dl_tti_req_t));
2146 DU_LOG("\nLOWER MAC: Failed to allocate memory for DL TTI Request");
2152 DU_LOG("\nLOWER MAC: Current TTI Info is NULL");
2157 lwrMacFsmHdlr fapiEvtHdlr[MAX_STATE][MAX_EVENT] =
2160 /* PHY_STATE_IDLE */
2161 lwr_mac_handleParamReqEvt,
2162 lwr_mac_handleParamRspEvt,
2163 lwr_mac_handleConfigReqEvt,
2164 lwr_mac_handleConfigRspEvt,
2165 lwr_mac_handleInvalidEvt,
2168 /* PHY_STATE_CONFIGURED */
2169 lwr_mac_handleParamReqEvt,
2170 lwr_mac_handleParamRspEvt,
2171 lwr_mac_handleConfigReqEvt,
2172 lwr_mac_handleConfigRspEvt,
2173 lwr_mac_handleStartReqEvt,
2176 /* PHY_STATE_RUNNING */
2177 lwr_mac_handleInvalidEvt,
2178 lwr_mac_handleInvalidEvt,
2179 lwr_mac_handleConfigReqEvt,
2180 lwr_mac_handleConfigRspEvt,
2181 lwr_mac_handleInvalidEvt,
2185 /*******************************************************************
2187 * @brief Sends message to Lower Mac Fsm Event Handler
2191 * Function : sendToLowerMac
2194 * -Sends message to LowerMac
2196 * @params[in] Message Type
2202 ******************************************************************/
2203 void sendToLowerMac(uint16_t msgType, uint32_t msgLen, void *msg)
2205 clGlobalCp.event = msgType;
2206 fapiEvtHdlr[clGlobalCp.phyState][clGlobalCp.event](msg);
2209 /**********************************************************************
2211 **********************************************************************/