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 *******************************************************************************/
22 /* header include files -- defines (.h) */
23 #include "envopt.h" /* environment options */
24 #include "envdep.h" /* environment dependent */
25 #include "envind.h" /* environment independent */
26 #include "gen.h" /* general layer */
27 #include "ssi.h" /* system service interface */
28 #include "cm_hash.h" /* common hash list */
29 #include "cm_mblk.h" /* common memory link list library */
30 #include "cm_llist.h" /* common linked list library */
31 #include "cm_err.h" /* common error */
32 #include "cm_lte.h" /* common LTE */
33 #include "lrg.h" /* Layer manager interface includes*/
34 #include "crg.h" /* CRG interface includes*/
35 #include "rgu.h" /* RGU interface includes*/
36 #include "tfu.h" /* TFU interface includes */
37 #include "rg_sch_inf.h" /* SCH interface includes */
38 #include "rg_prg.h" /* PRG (MAC-MAC) interface includes*/
39 #include "rg_env.h" /* MAC environmental includes*/
40 #include "rg.h" /* MAC includes*/
41 #include "rg_err.h" /* MAC error includes*/
43 #include "lwr_mac_fsm.h"
45 /* header/extern include files (.x) */
46 #include "gen.x" /* general layer typedefs */
47 #include "ssi.x" /* system services typedefs */
48 #include "cm5.x" /* common timers */
49 #include "cm_hash.x" /* common hash list */
50 #include "cm_lib.x" /* common library */
51 #include "cm_llist.x" /* common linked list */
52 #include "cm_mblk.x" /* memory management */
53 #include "cm_tkns.x" /* common tokens */
54 #include "cm_lte.x" /* common tokens */
55 #include "rgu.x" /* RGU types */
56 #include "tfu.x" /* RGU types */
57 #include "lrg.x" /* layer management typedefs for MAC */
58 #include "crg.x" /* CRG interface includes */
59 #include "rg_sch_inf.x" /* SCH interface typedefs */
60 #include "rg_prg.x" /* PRG (MAC-MAC) Interface typedefs */
61 #include "du_app_mac_inf.h"
63 #include "rg.x" /* typedefs for MAC */
65 #define MIB_SFN_BITMASK 0xFC
66 #define SSB_PDU_TYPE 3
67 #define SETLENGTH(x, size) x += size
70 EXTERN void sendToPhy ARGS((uint8_t msgType, uint32_t msgLen, void *msg));
71 SlotIndInfo slotIndInfo; //global variable
73 /*******************************************************************
75 * @brief Handles Invalid Request Event
79 * Function : lwr_mac_handleInvalidEvt
82 * - Displays the PHY state when the invalid event occurs
85 * @return ROK - success
88 * ****************************************************************/
89 S16 lwr_mac_handleInvalidEvt(void *msg)
91 printf("\nLOWER MAC: Error Indication Event[%d] received in state [%d]", clGlobalCp.event, clGlobalCp.phyState);
96 /*******************************************************************
98 * @brief Fills FAPI message header
102 * Function : fillMsgHeader
105 * -Fills FAPI message header
107 * @params[in] Pointer to header
113 * ****************************************************************/
114 PUBLIC void fillMsgHeader(fapi_msg_t *hdr, uint16_t msgType, uint16_t msgLen)
116 hdr->message_type_id = msgType;
117 hdr->length = msgLen;
120 /*******************************************************************
122 * @brief Fills FAPI Config Request message header
126 * Function : fillTlvs
129 * -Fills FAPI Config Request message header
131 * @params[in] Pointer to TLV
138 * ****************************************************************/
139 PUBLIC void fillTlvs(fapi_uint16_tlv_t *tlv, uint16_t tag, uint16_t length,
140 uint16_t value, uint32_t *msgLen)
143 tlv->tl.length = length;
145 *msgLen = *msgLen + sizeof(tag) + sizeof(length) + length;
147 /*******************************************************************
149 * @brief fills the cyclic prefix by comparing the bitmask
153 * Function : fillCyclicPrefix
156 * -checks the value with the bitmask and
157 * fills the cellPtr's cyclic prefix.
159 * @params[in] Pointer to ClCellParam
160 * Value to be compared
163 ********************************************************************/
164 PUBLIC void fillCyclicPrefix(uint8_t value, ClCellParam **cellPtr)
166 if((value & FAPI_NORMAL_CYCLIC_PREFIX_MASK) == FAPI_NORMAL_CYCLIC_PREFIX_MASK)
168 (*cellPtr)->cyclicPrefix = NORMAL_CYCLIC_PREFIX_MASK;
170 else if((value & FAPI_EXTENDED_CYCLIC_PREFIX_MASK) == FAPI_EXTENDED_CYCLIC_PREFIX_MASK)
172 (*cellPtr)->cyclicPrefix = EXTENDED_CYCLIC_PREFIX_MASK;
176 (*cellPtr)->cyclicPrefix = INVALID_VALUE;
180 /*******************************************************************
182 * @brief fills the subcarrier spacing of Downlink by comparing the bitmask
186 * Function : fillSubcarrierSpaceDl
189 * -checks the value with the bitmask and
190 * fills the cellPtr's subcarrier spacing in DL
192 * @params[in] Pointer to ClCellParam
193 * Value to be compared
196 * ****************************************************************/
198 PUBLIC void fillSubcarrierSpaceDl(uint8_t value, ClCellParam **cellPtr)
200 if((value & FAPI_15KHZ_MASK) == FAPI_15KHZ_MASK)
202 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_15_KHZ;
204 else if((value & FAPI_30KHZ_MASK) == FAPI_30KHZ_MASK)
206 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_30_KHZ;
208 else if((value & FAPI_60KHZ_MASK) == FAPI_60KHZ_MASK)
210 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_60_KHZ;
212 else if((value & FAPI_120KHZ_MASK) == FAPI_120KHZ_MASK)
214 (*cellPtr)->supportedSubcarrierSpacingDl = SPACING_120_KHZ;
218 (*cellPtr)->supportedSubcarrierSpacingDl = INVALID_VALUE;
222 /*******************************************************************
224 * @brief fills the downlink bandwidth by comparing the bitmask
228 * Function : fillBandwidthDl
231 * -checks the value with the bitmask and
232 * -fills the cellPtr's DL Bandwidth
234 * @params[in] Pointer to ClCellParam
235 * Value to be compared
238 * ****************************************************************/
240 PUBLIC void fillBandwidthDl(uint16_t value, ClCellParam **cellPtr)
242 if((value & FAPI_5MHZ_BW_MASK) == FAPI_5MHZ_BW_MASK)
244 (*cellPtr)->supportedBandwidthDl = BW_5MHZ;
246 else if((value & FAPI_10MHZ_BW_MASK) == FAPI_10MHZ_BW_MASK)
248 (*cellPtr)->supportedBandwidthDl = BW_10MHZ;
250 else if((value & FAPI_15MHZ_BW_MASK) == FAPI_15MHZ_BW_MASK)
252 (*cellPtr)->supportedBandwidthDl = BW_15MHZ;
254 else if((value & FAPI_20MHZ_BW_MASK) == FAPI_20MHZ_BW_MASK)
256 (*cellPtr)->supportedBandwidthDl = BW_20MHZ;
258 else if((value & FAPI_40MHZ_BW_MASK) == FAPI_40MHZ_BW_MASK)
260 (*cellPtr)->supportedBandwidthDl = BW_40MHZ;
262 else if((value & FAPI_50MHZ_BW_MASK) == FAPI_50MHZ_BW_MASK)
264 (*cellPtr)->supportedBandwidthDl = BW_50MHZ;
266 else if((value & FAPI_60MHZ_BW_MASK) == FAPI_60MHZ_BW_MASK)
268 (*cellPtr)->supportedBandwidthDl = BW_60MHZ;
270 else if((value & FAPI_70MHZ_BW_MASK) == FAPI_70MHZ_BW_MASK)
272 (*cellPtr)->supportedBandwidthDl = BW_70MHZ;
274 else if((value & FAPI_80MHZ_BW_MASK) == FAPI_80MHZ_BW_MASK)
276 (*cellPtr)->supportedBandwidthDl = BW_80MHZ;
278 else if((value & FAPI_90MHZ_BW_MASK) == FAPI_90MHZ_BW_MASK)
280 (*cellPtr)->supportedBandwidthDl = BW_90MHZ;
282 else if((value & FAPI_100MHZ_BW_MASK) == FAPI_100MHZ_BW_MASK)
284 (*cellPtr)->supportedBandwidthDl = BW_100MHZ;
286 else if((value & FAPI_200MHZ_BW_MASK) == FAPI_200MHZ_BW_MASK)
288 (*cellPtr)->supportedBandwidthDl = BW_200MHZ;
290 else if((value & FAPI_400MHZ_BW_MASK) == FAPI_400MHZ_BW_MASK)
292 (*cellPtr)->supportedBandwidthDl = BW_400MHZ;
296 (*cellPtr)->supportedBandwidthDl = INVALID_VALUE;
300 /*******************************************************************
302 * @brief fills the subcarrier spacing of Uplink by comparing the bitmask
306 * Function : fillSubcarrierSpaceUl
309 * -checks the value with the bitmask and
310 * -fills cellPtr's subcarrier spacing in UL
312 * @params[in] Pointer to ClCellParam
313 * Value to be compared
316 * ****************************************************************/
318 PUBLIC void fillSubcarrierSpaceUl(uint8_t value, ClCellParam **cellPtr)
320 if((value & FAPI_15KHZ_MASK) == FAPI_15KHZ_MASK)
322 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_15_KHZ;
324 else if((value & FAPI_30KHZ_MASK) == FAPI_30KHZ_MASK)
326 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_30_KHZ;
328 else if((value & FAPI_60KHZ_MASK) == FAPI_60KHZ_MASK)
330 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_60_KHZ;
332 else if((value & FAPI_120KHZ_MASK) == FAPI_120KHZ_MASK)
334 (*cellPtr)->supportedSubcarrierSpacingsUl = SPACING_120_KHZ;
338 (*cellPtr)->supportedSubcarrierSpacingsUl = INVALID_VALUE;
342 /*******************************************************************
344 * @brief fills the uplink bandwidth by comparing the bitmask
348 * Function : fillBandwidthUl
351 * -checks the value with the bitmask and
352 * fills the cellPtr's UL Bandwidth
356 * @params[in] Pointer to ClCellParam
357 * Value to be compared
361 * ****************************************************************/
363 PUBLIC void fillBandwidthUl(uint16_t value, ClCellParam **cellPtr)
365 if((value & FAPI_5MHZ_BW_MASK) == FAPI_5MHZ_BW_MASK)
367 (*cellPtr)->supportedBandwidthUl = BW_5MHZ;
369 else if((value & FAPI_10MHZ_BW_MASK) == FAPI_10MHZ_BW_MASK)
371 (*cellPtr)->supportedBandwidthUl = BW_10MHZ;
373 else if((value & FAPI_15MHZ_BW_MASK) == FAPI_15MHZ_BW_MASK)
375 (*cellPtr)->supportedBandwidthUl = BW_15MHZ;
377 else if((value & FAPI_20MHZ_BW_MASK) == FAPI_20MHZ_BW_MASK)
379 (*cellPtr)->supportedBandwidthUl = BW_20MHZ;
381 else if((value & FAPI_40MHZ_BW_MASK) == FAPI_40MHZ_BW_MASK)
383 (*cellPtr)->supportedBandwidthUl = BW_40MHZ;
385 else if((value & FAPI_50MHZ_BW_MASK) == FAPI_50MHZ_BW_MASK)
387 (*cellPtr)->supportedBandwidthUl = BW_50MHZ;
389 else if((value & FAPI_60MHZ_BW_MASK) == FAPI_60MHZ_BW_MASK)
391 (*cellPtr)->supportedBandwidthUl = BW_60MHZ;
393 else if((value & FAPI_70MHZ_BW_MASK) == FAPI_70MHZ_BW_MASK)
395 (*cellPtr)->supportedBandwidthUl = BW_70MHZ;
397 else if((value & FAPI_80MHZ_BW_MASK) == FAPI_80MHZ_BW_MASK)
399 (*cellPtr)->supportedBandwidthUl = BW_80MHZ;
401 else if((value & FAPI_90MHZ_BW_MASK) == FAPI_90MHZ_BW_MASK)
403 (*cellPtr)->supportedBandwidthUl = BW_90MHZ;
405 else if((value & FAPI_100MHZ_BW_MASK) == FAPI_100MHZ_BW_MASK)
407 (*cellPtr)->supportedBandwidthUl = BW_100MHZ;
409 else if((value & FAPI_200MHZ_BW_MASK) == FAPI_200MHZ_BW_MASK)
411 (*cellPtr)->supportedBandwidthUl = BW_200MHZ;
413 else if((value & FAPI_400MHZ_BW_MASK) == FAPI_400MHZ_BW_MASK)
415 (*cellPtr)->supportedBandwidthUl = BW_400MHZ;
419 (*cellPtr)->supportedBandwidthUl = INVALID_VALUE;
422 /*******************************************************************
424 * @brief fills the CCE maping by comparing the bitmask
428 * Function : fillCCEmaping
431 * -checks the value with the bitmask and
432 * fills the cellPtr's CCE Mapping Type
435 * @params[in] Pointer to ClCellParam
436 * Value to be compared
439 * ****************************************************************/
441 PUBLIC void fillCCEmaping(uint8_t value, ClCellParam **cellPtr)
443 if ((value & FAPI_CCE_MAPPING_INTERLEAVED_MASK) == FAPI_CCE_MAPPING_INTERLEAVED_MASK)
445 (*cellPtr)->cceMappingType = CCE_MAPPING_INTERLEAVED_MASK;
447 else if((value & FAPI_CCE_MAPPING_INTERLEAVED_MASK) == FAPI_CCE_MAPPING_NONINTERLVD_MASK)
449 (*cellPtr)->cceMappingType = CCE_MAPPING_NONINTERLVD_MASK;
453 (*cellPtr)->cceMappingType = INVALID_VALUE;
457 /*******************************************************************
459 * @brief fills the PUCCH format by comparing the bitmask
463 * Function : fillPucchFormat
466 * -checks the value with the bitmask and
467 * fills the cellPtr's pucch format
470 * @params[in] Pointer to ClCellParam
471 * Value to be compared
474 * ****************************************************************/
476 PUBLIC void fillPucchFormat(uint8_t value, ClCellParam **cellPtr)
478 if((value & FAPI_FORMAT_0_MASK) == FAPI_FORMAT_0_MASK)
480 (*cellPtr)->pucchFormats = FORMAT_0;
482 else if((value & FAPI_FORMAT_1_MASK) == FAPI_FORMAT_1_MASK)
484 (*cellPtr)->pucchFormats = FORMAT_1;
486 else if((value & FAPI_FORMAT_2_MASK) == FAPI_FORMAT_2_MASK)
488 (*cellPtr)->pucchFormats = FORMAT_2;
490 else if((value & FAPI_FORMAT_3_MASK) == FAPI_FORMAT_3_MASK)
492 (*cellPtr)->pucchFormats = FORMAT_3;
494 else if((value & FAPI_FORMAT_4_MASK) == FAPI_FORMAT_4_MASK)
496 (*cellPtr)->pucchFormats = FORMAT_4;
500 (*cellPtr)->pucchFormats = INVALID_VALUE;
504 /*******************************************************************
506 * @brief fills the PDSCH Mapping Type by comparing the bitmask
510 * Function : fillPdschMappingType
513 * -checks the value with the bitmask and
514 * fills the cellPtr's PDSCH MappingType
516 * @params[in] Pointer to ClCellParam
517 * Value to be compared
520 * ****************************************************************/
522 PUBLIC void fillPdschMappingType(uint8_t value, ClCellParam **cellPtr)
524 if((value & FAPI_PDSCH_MAPPING_TYPE_A_MASK) == FAPI_PDSCH_MAPPING_TYPE_A_MASK)
526 (*cellPtr)->pdschMappingType = MAPPING_TYPE_A;
528 else if((value & FAPI_PDSCH_MAPPING_TYPE_B_MASK) == FAPI_PDSCH_MAPPING_TYPE_B_MASK)
530 (*cellPtr)->pdschMappingType = MAPPING_TYPE_B;
534 (*cellPtr)->pdschMappingType = INVALID_VALUE;
538 /*******************************************************************
540 * @brief fills the PDSCH Allocation Type by comparing the bitmask
544 * Function : fillPdschAllocationType
547 * -checks the value with the bitmask and
548 * fills the cellPtr's PDSCH AllocationType
550 * @params[in] Pointer to ClCellParam
551 * Value to be compared
554 * ****************************************************************/
556 PUBLIC void fillPdschAllocationType(uint8_t value, ClCellParam **cellPtr)
558 if((value & FAPI_PDSCH_ALLOC_TYPE_0_MASK) == FAPI_PDSCH_ALLOC_TYPE_0_MASK)
560 (*cellPtr)->pdschAllocationTypes = ALLOCATION_TYPE_0;
562 else if((value & FAPI_PDSCH_ALLOC_TYPE_1_MASK) == FAPI_PDSCH_ALLOC_TYPE_1_MASK)
564 (*cellPtr)->pdschAllocationTypes = ALLOCATION_TYPE_1;
568 (*cellPtr)->pdschAllocationTypes = INVALID_VALUE;
572 /*******************************************************************
574 * @brief fills the PDSCH PRB Mapping Type by comparing the bitmask
578 * Function : fillPrbMappingType
581 * -checks the value with the bitmask and
582 * fills the cellPtr's PRB Mapping Type
584 * @params[in] Pointer to ClCellParam
585 * Value to be compared
588 ******************************************************************/
589 PUBLIC void fillPrbMappingType(uint8_t value, ClCellParam **cellPtr)
591 if((value & FAPI_PDSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK) == FAPI_PDSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK)
593 (*cellPtr)->pdschVrbToPrbMapping = VRB_TO_PRB_MAP_NON_INTLV;
595 else if((value & FAPI_PDSCH_VRB_TO_PRB_MAP_INTLVD_MASK) == FAPI_PDSCH_VRB_TO_PRB_MAP_INTLVD_MASK)
597 (*cellPtr)->pdschVrbToPrbMapping = VRB_TO_PRB_MAP_INTLVD;
601 (*cellPtr)->pdschVrbToPrbMapping = INVALID_VALUE;
605 /*******************************************************************
607 * @brief fills the PDSCH DmrsConfig Type by comparing the bitmask
611 * Function : fillPdschDmrsConfigType
614 * -checks the value with the bitmask and
615 * fills the cellPtr's DmrsConfig Type
617 * @params[in] Pointer to ClCellParam
618 * Value to be compared
621 ******************************************************************/
623 PUBLIC void fillPdschDmrsConfigType(uint8_t value, ClCellParam **cellPtr)
625 if((value & FAPI_PDSCH_DMRS_CONFIG_TYPE_1_MASK) == FAPI_PDSCH_DMRS_CONFIG_TYPE_1_MASK)
627 (*cellPtr)->pdschDmrsConfigTypes = DMRS_CONFIG_TYPE_1;
629 else if((value & FAPI_PDSCH_DMRS_CONFIG_TYPE_2_MASK) == FAPI_PDSCH_DMRS_CONFIG_TYPE_2_MASK)
631 (*cellPtr)->pdschDmrsConfigTypes = DMRS_CONFIG_TYPE_2;
635 (*cellPtr)->pdschDmrsConfigTypes = INVALID_VALUE;
639 /*******************************************************************
641 * @brief fills the PDSCH DmrsLength by comparing the bitmask
645 * Function : fillPdschDmrsLength
648 * -checks the value with the bitmask and
649 * fills the cellPtr's PdschDmrsLength
651 * @params[in] Pointer to ClCellParam
652 * Value to be compared
655 ******************************************************************/
656 PUBLIC void fillPdschDmrsLength(uint8_t value, ClCellParam **cellPtr)
658 if(value == FAPI_PDSCH_DMRS_MAX_LENGTH_1)
660 (*cellPtr)->pdschDmrsMaxLength = DMRS_MAX_LENGTH_1;
662 else if(value == FAPI_PDSCH_DMRS_MAX_LENGTH_2)
664 (*cellPtr)->pdschDmrsMaxLength = DMRS_MAX_LENGTH_2;
668 (*cellPtr)->pdschDmrsMaxLength = INVALID_VALUE;
672 /*******************************************************************
674 * @brief fills the PDSCH Dmrs Additional Pos by comparing the bitmask
678 * Function : fillPdschDmrsAddPos
681 * -checks the value with the bitmask and
682 * fills the cellPtr's Pdsch DmrsAddPos
684 * @params[in] Pointer to ClCellParam
685 * Value to be compared
688 ******************************************************************/
690 PUBLIC void fillPdschDmrsAddPos(uint8_t value, ClCellParam **cellPtr)
692 if((value & FAPI_DMRS_ADDITIONAL_POS_0_MASK) == FAPI_DMRS_ADDITIONAL_POS_0_MASK)
694 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_0;
696 else if((value & FAPI_DMRS_ADDITIONAL_POS_1_MASK) == FAPI_DMRS_ADDITIONAL_POS_1_MASK)
698 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_1;
700 else if((value & FAPI_DMRS_ADDITIONAL_POS_2_MASK) == FAPI_DMRS_ADDITIONAL_POS_2_MASK)
702 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_2;
704 else if((value & FAPI_DMRS_ADDITIONAL_POS_3_MASK) == FAPI_DMRS_ADDITIONAL_POS_3_MASK)
706 (*cellPtr)->pdschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_3;
710 (*cellPtr)->pdschDmrsAdditionalPos = INVALID_VALUE;
714 /*******************************************************************
716 * @brief fills the Modulation Order in DL by comparing the bitmask
720 * Function : fillModulationOrderDl
723 * -checks the value with the bitmask and
724 * fills the cellPtr's ModulationOrder in DL.
726 * @params[in] Pointer to ClCellParam
727 * Value to be compared
730 ******************************************************************/
731 PUBLIC void fillModulationOrderDl(uint8_t value, ClCellParam **cellPtr)
735 (*cellPtr)->supportedMaxModulationOrderDl = MOD_QPSK;
739 (*cellPtr)->supportedMaxModulationOrderDl = MOD_16QAM;
743 (*cellPtr)->supportedMaxModulationOrderDl = MOD_64QAM;
747 (*cellPtr)->supportedMaxModulationOrderDl = MOD_256QAM;
751 (*cellPtr)->supportedMaxModulationOrderDl = INVALID_VALUE;
755 /*******************************************************************
757 * @brief fills the PUSCH DmrsConfig Type by comparing the bitmask
761 * Function : fillPuschDmrsConfigType
764 * -checks the value with the bitmask and
765 * fills the cellPtr's PUSCH DmrsConfigType
767 * @params[in] Pointer to ClCellParam
768 * Value to be compared
771 ******************************************************************/
773 PUBLIC void fillPuschDmrsConfig(uint8_t value, ClCellParam **cellPtr)
775 if((value & FAPI_PUSCH_DMRS_CONFIG_TYPE_1_MASK) == FAPI_PUSCH_DMRS_CONFIG_TYPE_1_MASK)
777 (*cellPtr)->puschDmrsConfigTypes = DMRS_CONFIG_TYPE_1;
779 else if((value & FAPI_PUSCH_DMRS_CONFIG_TYPE_2_MASK) == FAPI_PUSCH_DMRS_CONFIG_TYPE_2_MASK)
781 (*cellPtr)->puschDmrsConfigTypes = DMRS_CONFIG_TYPE_2;
785 (*cellPtr)->puschDmrsConfigTypes = INVALID_VALUE;
789 /*******************************************************************
791 * @brief fills the PUSCH DmrsLength by comparing the bitmask
795 * Function : fillPuschDmrsLength
798 * -checks the value with the bitmask and
799 * fills the cellPtr's PUSCH DmrsLength
801 * @params[in] Pointer to ClCellParam
802 * Value to be compared
805 ******************************************************************/
807 PUBLIC void fillPuschDmrsLength(uint8_t value, ClCellParam **cellPtr)
809 if(value == FAPI_PUSCH_DMRS_MAX_LENGTH_1)
811 (*cellPtr)->puschDmrsMaxLength = DMRS_MAX_LENGTH_1;
813 else if(value == FAPI_PUSCH_DMRS_MAX_LENGTH_2)
815 (*cellPtr)->puschDmrsMaxLength = DMRS_MAX_LENGTH_2;
819 (*cellPtr)->puschDmrsMaxLength = INVALID_VALUE;
823 /*******************************************************************
825 * @brief fills the PUSCH Dmrs Additional position by comparing the bitmask
829 * Function : fillPuschDmrsAddPos
832 * -checks the value with the bitmask and
833 * fills the cellPtr's PUSCH DmrsAddPos
835 * @params[in] Pointer to ClCellParam
836 * Value to be compared
839 ******************************************************************/
841 PUBLIC void fillPuschDmrsAddPos(uint8_t value, ClCellParam **cellPtr)
843 if((value & FAPI_DMRS_ADDITIONAL_POS_0_MASK) == FAPI_DMRS_ADDITIONAL_POS_0_MASK)
845 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_0;
847 else if((value & FAPI_DMRS_ADDITIONAL_POS_1_MASK) == FAPI_DMRS_ADDITIONAL_POS_1_MASK)
849 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_1;
851 else if((value & FAPI_DMRS_ADDITIONAL_POS_2_MASK) == FAPI_DMRS_ADDITIONAL_POS_2_MASK)
853 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_2;
855 else if((value & FAPI_DMRS_ADDITIONAL_POS_3_MASK) == FAPI_DMRS_ADDITIONAL_POS_3_MASK)
857 (*cellPtr)->puschDmrsAdditionalPos = DMRS_ADDITIONAL_POS_3;
861 (*cellPtr)->puschDmrsAdditionalPos = INVALID_VALUE;
865 /*******************************************************************
867 * @brief fills the PUSCH Mapping Type by comparing the bitmask
871 * Function : fillPuschMappingType
874 * -checks the value with the bitmask and
875 * fills the cellPtr's PUSCH MappingType
877 * @params[in] Pointer to ClCellParam
878 * Value to be compared
881 ******************************************************************/
883 PUBLIC void fillPuschMappingType(uint8_t value, ClCellParam **cellPtr)
885 if((value & FAPI_PUSCH_MAPPING_TYPE_A_MASK) == FAPI_PUSCH_MAPPING_TYPE_A_MASK)
887 (*cellPtr)->puschMappingType = MAPPING_TYPE_A;
889 else if((value & FAPI_PUSCH_MAPPING_TYPE_B_MASK) == FAPI_PUSCH_MAPPING_TYPE_B_MASK)
891 (*cellPtr)->puschMappingType = MAPPING_TYPE_B;
895 (*cellPtr)->puschMappingType = INVALID_VALUE;
899 /*******************************************************************
901 * @brief fills the PUSCH Allocation Type by comparing the bitmask
905 * Function : fillPuschAllocationType
908 * -checks the value with the bitmask and
909 * fills the cellPtr's PUSCH AllocationType
911 * @params[in] Pointer to ClCellParam
912 * Value to be compared
915 ******************************************************************/
917 PUBLIC void fillPuschAllocationType(uint8_t value, ClCellParam **cellPtr)
919 if((value & FAPI_PUSCH_ALLOC_TYPE_0_MASK) == FAPI_PUSCH_ALLOC_TYPE_0_MASK)
921 (*cellPtr)->puschAllocationTypes = ALLOCATION_TYPE_0;
923 else if((value & FAPI_PUSCH_ALLOC_TYPE_0_MASK) == FAPI_PUSCH_ALLOC_TYPE_0_MASK)
925 (*cellPtr)->puschAllocationTypes = ALLOCATION_TYPE_1;
929 (*cellPtr)->puschAllocationTypes = INVALID_VALUE;
933 /*******************************************************************
935 * @brief fills the PUSCH PRB Mapping Type by comparing the bitmask
939 * Function : fillPuschPrbMappingType
942 * -checks the value with the bitmask and
943 * fills the cellPtr's PUSCH PRB MApping Type
945 * @params[in] Pointer to ClCellParam
946 * Value to be compared
949 ******************************************************************/
951 PUBLIC void fillPuschPrbMappingType(uint8_t value, ClCellParam **cellPtr)
953 if((value & FAPI_PUSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK) == FAPI_PUSCH_VRB_TO_PRB_MAP_NON_INTLV_MASK)
955 (*cellPtr)->puschVrbToPrbMapping = VRB_TO_PRB_MAP_NON_INTLV;
957 else if((value & FAPI_PUSCH_VRB_TO_PRB_MAP_INTLVD_MASK) == FAPI_PUSCH_VRB_TO_PRB_MAP_INTLVD_MASK)
959 (*cellPtr)->puschVrbToPrbMapping = VRB_TO_PRB_MAP_INTLVD;
963 (*cellPtr)->puschVrbToPrbMapping = INVALID_VALUE;
967 /*******************************************************************
969 * @brief fills the Modulation Order in Ul by comparing the bitmask
973 * Function : fillModulationOrderUl
976 * -checks the value with the bitmask and
977 * fills the cellPtr's Modualtsion Order in UL.
979 * @params[in] Pointer to ClCellParam
980 * Value to be compared
983 ******************************************************************/
985 PUBLIC void fillModulationOrderUl(uint8_t value, ClCellParam **cellPtr)
989 (*cellPtr)->supportedModulationOrderUl = MOD_QPSK;
993 (*cellPtr)->supportedModulationOrderUl = MOD_16QAM;
997 (*cellPtr)->supportedModulationOrderUl = MOD_64QAM;
1001 (*cellPtr)->supportedModulationOrderUl = MOD_256QAM;
1005 (*cellPtr)->supportedModulationOrderUl = INVALID_VALUE;
1009 /*******************************************************************
1011 * @brief fills the PUSCH Aggregation Factor by comparing the bitmask
1015 * Function : fillPuschAggregationFactor
1018 * -checks the value with the bitmask and
1019 * fills the cellPtr's PUSCH Aggregation Factor
1021 * @params[in] Pointer to ClCellParam
1022 * Value to be compared
1025 ******************************************************************/
1027 PUBLIC void fillPuschAggregationFactor(uint8_t value, ClCellParam **cellPtr)
1029 if((value & FAPI_FORMAT_0_MASK) == FAPI_FORMAT_0_MASK)
1031 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_1;
1033 else if((value & FAPI_FORMAT_1_MASK) == FAPI_FORMAT_1_MASK)
1035 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_2;
1037 else if((value & FAPI_FORMAT_2_MASK) == FAPI_FORMAT_2_MASK)
1039 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_4;
1041 else if((value & FAPI_FORMAT_3_MASK) == FAPI_FORMAT_3_MASK)
1043 (*cellPtr)->puschAggregationFactor = AGG_FACTOR_8;
1047 (*cellPtr)->puschAggregationFactor = INVALID_VALUE;
1051 /*******************************************************************
1053 * @brief fills the PRACH Long Format by comparing the bitmask
1057 * Function : fillPrachLongFormat
1060 * -checks the value with the bitmask and
1061 * fills the cellPtr's PRACH Long Format
1063 * @params[in] Pointer to ClCellParam
1064 * Value to be compared
1067 ******************************************************************/
1069 PUBLIC void fillPrachLongFormat(uint8_t value, ClCellParam **cellPtr)
1071 if((value & FAPI_PRACH_LF_FORMAT_0_MASK) == FAPI_PRACH_LF_FORMAT_0_MASK)
1073 (*cellPtr)->prachLongFormats = FORMAT_0;
1075 else if((value & FAPI_PRACH_LF_FORMAT_1_MASK) == FAPI_PRACH_LF_FORMAT_1_MASK)
1077 (*cellPtr)->prachLongFormats = FORMAT_1;
1079 else if((value & FAPI_PRACH_LF_FORMAT_2_MASK) == FAPI_PRACH_LF_FORMAT_2_MASK)
1081 (*cellPtr)->prachLongFormats = FORMAT_2;
1083 else if((value & FAPI_PRACH_LF_FORMAT_3_MASK) == FAPI_PRACH_LF_FORMAT_3_MASK)
1085 (*cellPtr)->prachLongFormats = FORMAT_3;
1089 (*cellPtr)->prachLongFormats = INVALID_VALUE;
1093 /*******************************************************************
1095 * @brief fills the PRACH Short Format by comparing the bitmask
1099 * Function : fillPrachShortFormat
1102 * -checks the value with the bitmask and
1103 * fills the cellPtr's PRACH ShortFormat
1105 * @params[in] Pointer to ClCellParam
1106 * Value to be compared
1109 ******************************************************************/
1111 PUBLIC void fillPrachShortFormat(uint8_t value, ClCellParam **cellPtr)
1113 if((value & FAPI_PRACH_SF_FORMAT_A1_MASK) == FAPI_PRACH_SF_FORMAT_A1_MASK)
1115 (*cellPtr)->prachShortFormats = SF_FORMAT_A1;
1117 else if((value & FAPI_PRACH_SF_FORMAT_A2_MASK) == FAPI_PRACH_SF_FORMAT_A2_MASK)
1119 (*cellPtr)->prachShortFormats = SF_FORMAT_A2;
1121 else if((value & FAPI_PRACH_SF_FORMAT_A3_MASK) == FAPI_PRACH_SF_FORMAT_A3_MASK)
1123 (*cellPtr)->prachShortFormats = SF_FORMAT_A3;
1125 else if((value & FAPI_PRACH_SF_FORMAT_B1_MASK) == FAPI_PRACH_SF_FORMAT_B1_MASK)
1127 (*cellPtr)->prachShortFormats = SF_FORMAT_B1;
1129 else if((value & FAPI_PRACH_SF_FORMAT_B2_MASK) == FAPI_PRACH_SF_FORMAT_B2_MASK)
1131 (*cellPtr)->prachShortFormats = SF_FORMAT_B2;
1133 else if((value & FAPI_PRACH_SF_FORMAT_B3_MASK) == FAPI_PRACH_SF_FORMAT_B3_MASK)
1135 (*cellPtr)->prachShortFormats = SF_FORMAT_B3;
1137 else if((value & FAPI_PRACH_SF_FORMAT_B4_MASK) == FAPI_PRACH_SF_FORMAT_B4_MASK)
1139 (*cellPtr)->prachShortFormats = SF_FORMAT_B4;
1141 else if((value & FAPI_PRACH_SF_FORMAT_C0_MASK) == FAPI_PRACH_SF_FORMAT_C0_MASK)
1143 (*cellPtr)->prachShortFormats = SF_FORMAT_C0;
1145 else if((value & FAPI_PRACH_SF_FORMAT_C2_MASK) == FAPI_PRACH_SF_FORMAT_C2_MASK)
1147 (*cellPtr)->prachShortFormats = SF_FORMAT_C2;
1151 (*cellPtr)->prachShortFormats = INVALID_VALUE;
1155 /*******************************************************************
1157 * @brief fills the Fd Occasions Type by comparing the bitmask
1161 * Function : fillFdOccasions
1164 * -checks the value with the bitmask and
1165 * fills the cellPtr's Fd Occasions
1167 * @params[in] Pointer to ClCellParam
1168 * Value to be compared
1171 ******************************************************************/
1173 PUBLIC void fillFdOccasions(uint8_t value, ClCellParam **cellPtr)
1177 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_1;
1181 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_2;
1185 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_4;
1189 (*cellPtr)->maxPrachFdOccasionsInASlot = PRACH_FD_OCC_IN_A_SLOT_8;
1193 (*cellPtr)->maxPrachFdOccasionsInASlot = INVALID_VALUE;
1197 /*******************************************************************
1199 * @brief fills the RSSI Measurement by comparing the bitmask
1203 * Function : fillRssiMeas
1206 * -checks the value with the bitmask and
1207 * fills the cellPtr's RSSI Measurement report
1209 * @params[in] Pointer to ClCellParam
1210 * Value to be compared
1213 ******************************************************************/
1215 PUBLIC void fillRssiMeas(uint8_t value, ClCellParam **cellPtr)
1217 if((value & FAPI_RSSI_REPORT_IN_DBM_MASK) == FAPI_RSSI_REPORT_IN_DBM_MASK)
1219 (*cellPtr)->rssiMeasurementSupport = RSSI_REPORT_DBM;
1221 else if((value & FAPI_RSSI_REPORT_IN_DBFS_MASK) == FAPI_RSSI_REPORT_IN_DBFS_MASK)
1223 (*cellPtr)->rssiMeasurementSupport = RSSI_REPORT_DBFS;
1227 (*cellPtr)->rssiMeasurementSupport = INVALID_VALUE;
1231 /*******************************************************************
1233 * @brief Returns the TLVs value
1237 * Function : getParamValue
1240 * -return TLVs value
1243 * @return ROK - temp
1246 * ****************************************************************/
1248 uint32_t getParamValue(fapi_uint16_tlv_t *tlv, uint16_t type)
1252 valueLen = tlv->tl.length;
1253 posPtr = &tlv->tl.tag;
1254 posPtr += sizeof(tlv->tl.tag);
1255 posPtr += sizeof(tlv->tl.length);
1256 /*TO DO: malloc to SSI memory */
1257 if(type == FAPI_UINT_8)
1259 //temp = (uint8_t *)malloc(valueLen * sizeof(U8));
1260 //memcpy(temp, posPtr, valueLen);
1261 return(*(uint8_t *)posPtr);
1263 else if(type == FAPI_UINT_16)
1265 return(*(uint16_t *)posPtr);
1267 else if(type == FAPI_UINT_32)
1269 return(*(uint32_t *)posPtr);
1273 DU_LOG("\nLOWER MAC: Value Extraction failed" );
1278 /*******************************************************************
1280 * @brief Sends FAPI Param req to PHY
1284 * Function : lwr_mac_handleParamReqEvt
1287 * -Sends FAPI Param req to PHY
1290 * @return ROK - success
1293 * ****************************************************************/
1295 S16 lwr_mac_handleParamReqEvt(void *msg)
1298 /* startGuardTimer(); */
1299 uint32_t msgLen; //Length of message Body
1301 fapi_param_req_t *paramReq;
1302 MAC_ALLOC(paramReq, sizeof(fapi_param_req_t));
1303 if(paramReq != NULLP)
1305 fillMsgHeader(¶mReq->header, FAPI_PARAM_REQUEST, msgLen);
1306 DU_LOG("\nLOWER MAC: sending param Req to Phy");
1307 sendToPhy(paramReq->header.message_type_id, sizeof(fapi_param_req_t), (void *)paramReq);
1308 MAC_FREE(paramReq, sizeof(fapi_param_req_t));
1313 DU_LOG("\nLOWER MAC: Failed to allocate memory for Param Request");
1321 /*******************************************************************
1323 * @brief Sends FAPI Param Response to MAC via PHY
1327 * Function : lwr_mac_handleParamRspEvt
1330 * -Sends FAPI Param rsp to MAC via PHY
1333 * @return ROK - success
1336 * ****************************************************************/
1338 S16 lwr_mac_handleParamRspEvt(void *msg)
1341 /* stopGuardTimer(); */
1343 uint32_t encodedVal;
1344 fapi_param_resp_t *paramRsp;
1345 ClCellParam *cellParam = NULLP;
1347 paramRsp = (fapi_param_resp_t *)msg;
1348 DU_LOG("\nLOWER MAC: Received EVENT[%d] at STATE[%d]", clGlobalCp.event, clGlobalCp.phyState);
1350 if(paramRsp != NULLP)
1352 MAC_ALLOC(cellParam, sizeof(ClCellParam));
1353 if(cellParam != NULLP)
1355 DU_LOG("\n LOWER MAC: Filling TLVS into MAC API");
1356 if(paramRsp->error_code == MSG_OK)
1358 for(index = 0; index < paramRsp->number_of_tlvs; index++)
1360 switch(paramRsp->tlvs[index].tl.tag)
1362 case FAPI_RELEASE_CAPABILITY_TAG:
1363 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1364 if(encodedVal != RFAILED && (encodedVal & RELEASE_15) == RELEASE_15)
1366 cellParam->releaseCapability = RELEASE_15;
1370 case FAPI_PHY_STATE_TAG:
1371 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1372 if(encodedVal != RFAILED && encodedVal != clGlobalCp.phyState)
1374 printf("\n PhyState mismatch [%d][%d]", clGlobalCp.phyState, clGlobalCp.event);
1379 case FAPI_SKIP_BLANK_DL_CONFIG_TAG:
1380 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1381 if(encodedVal != RFAILED && encodedVal != 0)
1383 cellParam->skipBlankDlConfig = SUPPORTED;
1387 cellParam->skipBlankDlConfig = NOT_SUPPORTED;
1391 case FAPI_SKIP_BLANK_UL_CONFIG_TAG:
1392 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1393 if(encodedVal != RFAILED && encodedVal != 0)
1395 cellParam->skipBlankUlConfig = SUPPORTED;
1399 cellParam->skipBlankUlConfig = NOT_SUPPORTED;
1403 case FAPI_NUM_CONFIG_TLVS_TO_REPORT_TYPE_TAG:
1404 cellParam->numTlvsToReport = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1407 case FAPI_CYCLIC_PREFIX_TAG:
1408 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1409 if(encodedVal != RFAILED)
1411 fillCyclicPrefix(encodedVal, &cellParam);
1415 case FAPI_SUPPORTED_SUBCARRIER_SPACING_DL_TAG:
1416 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1417 if(encodedVal != RFAILED)
1419 fillSubcarrierSpaceDl(encodedVal, &cellParam);
1423 case FAPI_SUPPORTED_BANDWIDTH_DL_TAG:
1424 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1425 if(encodedVal != RFAILED)
1427 fillBandwidthDl(encodedVal, &cellParam);
1431 case FAPI_SUPPORTED_SUBCARRIER_SPACING_UL_TAG:
1432 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1433 if(encodedVal != RFAILED)
1435 fillSubcarrierSpaceUl(encodedVal, &cellParam);
1439 case FAPI_SUPPORTED_BANDWIDTH_UL_TAG:
1440 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_16);
1441 if(encodedVal != RFAILED)
1443 fillBandwidthUl(encodedVal, &cellParam);
1447 case FAPI_CCE_MAPPING_TYPE_TAG:
1448 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1449 if(encodedVal != RFAILED)
1451 fillCCEmaping(encodedVal, &cellParam);
1455 case FAPI_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG:
1456 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1457 if(encodedVal != RFAILED && encodedVal != 0)
1459 cellParam->coresetOutsideFirst3OfdmSymsOfSlot = SUPPORTED;
1463 cellParam->coresetOutsideFirst3OfdmSymsOfSlot = NOT_SUPPORTED;
1467 case FAPI_PRECODER_GRANULARITY_CORESET_TAG:
1468 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1469 if(encodedVal != RFAILED && encodedVal != 0)
1471 cellParam->precoderGranularityCoreset = SUPPORTED;
1475 cellParam->precoderGranularityCoreset = NOT_SUPPORTED;
1479 case FAPI_PDCCH_MU_MIMO_TAG:
1480 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1481 if(encodedVal != RFAILED && encodedVal != 0)
1483 cellParam->pdcchMuMimo = SUPPORTED;
1487 cellParam->pdcchMuMimo = NOT_SUPPORTED;
1491 case FAPI_PDCCH_PRECODER_CYCLING_TAG:
1492 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1493 if(encodedVal != RFAILED && encodedVal != 0)
1495 cellParam->pdcchPrecoderCycling = SUPPORTED;
1499 cellParam->pdcchPrecoderCycling = NOT_SUPPORTED;
1503 case FAPI_MAX_PDCCHS_PER_SLOT_TAG:
1504 cellParam->maxPdcchsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1507 case FAPI_PUCCH_FORMATS_TAG:
1508 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1509 if(encodedVal != RFAILED)
1511 fillPucchFormat(encodedVal, &cellParam);
1515 case FAPI_MAX_PUCCHS_PER_SLOT_TAG:
1516 cellParam->maxPucchsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1519 case FAPI_PDSCH_MAPPING_TYPE_TAG:
1520 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1521 if(encodedVal != RFAILED)
1523 fillPdschMappingType(encodedVal, &cellParam);
1527 case FAPI_PDSCH_ALLOCATION_TYPES_TAG:
1528 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1529 if(encodedVal != RFAILED)
1531 fillPdschAllocationType(encodedVal, &cellParam);
1535 case FAPI_PDSCH_VRB_TO_PRB_MAPPING_TAG:
1536 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1537 if(encodedVal != RFAILED)
1539 fillPrbMappingType(encodedVal, &cellParam);
1543 case FAPI_PDSCH_CBG_TAG:
1544 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1545 if(encodedVal != RFAILED && encodedVal != 0)
1547 cellParam->pdschCbg = SUPPORTED;
1551 cellParam->pdschCbg = NOT_SUPPORTED;
1555 case FAPI_PDSCH_DMRS_CONFIG_TYPES_TAG:
1556 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1557 if(encodedVal != RFAILED)
1559 fillPdschDmrsConfigType(encodedVal, &cellParam);
1563 case FAPI_PDSCH_DMRS_MAX_LENGTH_TAG:
1564 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1565 if(encodedVal != RFAILED)
1567 fillPdschDmrsLength(encodedVal, &cellParam);
1571 case FAPI_PDSCH_DMRS_ADDITIONAL_POS_TAG:
1572 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1573 if(encodedVal != RFAILED)
1575 fillPdschDmrsAddPos(encodedVal, &cellParam);
1579 case FAPI_MAX_PDSCHS_TBS_PER_SLOT_TAG:
1580 cellParam->maxPdschsTBsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1583 case FAPI_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG:
1584 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1585 if(encodedVal != RFAILED && encodedVal < FAPI_MAX_NUMBERMIMO_LAYERS_PDSCH)
1587 cellParam->maxNumberMimoLayersPdsch = encodedVal;
1591 case FAPI_SUPPORTED_MAX_MODULATION_ORDER_DL_TAG:
1592 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1593 if(encodedVal != RFAILED)
1595 fillModulationOrderDl(encodedVal, &cellParam);
1599 case FAPI_MAX_MU_MIMO_USERS_DL_TAG:
1600 cellParam->maxMuMimoUsersDl = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1603 case FAPI_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG:
1604 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1605 if(encodedVal != RFAILED && encodedVal != 0)
1607 cellParam->pdschDataInDmrsSymbols = SUPPORTED;
1611 cellParam->pdschDataInDmrsSymbols = NOT_SUPPORTED;
1615 case FAPI_PREMPTIONSUPPORT_TAG:
1616 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1617 if(encodedVal != RFAILED && encodedVal != 0)
1619 cellParam->premptionSupport = SUPPORTED;
1623 cellParam->premptionSupport = NOT_SUPPORTED;
1627 case FAPI_PDSCH_NON_SLOT_SUPPORT_TAG:
1628 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1629 if(encodedVal != RFAILED && encodedVal != 0)
1631 cellParam->pdschNonSlotSupport = SUPPORTED;
1635 cellParam->pdschNonSlotSupport = NOT_SUPPORTED;
1639 case FAPI_UCI_MUX_ULSCH_IN_PUSCH_TAG:
1640 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1641 if(encodedVal != RFAILED && encodedVal != 0)
1643 cellParam->uciMuxUlschInPusch = SUPPORTED;
1647 cellParam->uciMuxUlschInPusch = NOT_SUPPORTED;
1651 case FAPI_UCI_ONLY_PUSCH_TAG:
1652 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1653 if(encodedVal != RFAILED && encodedVal != 0)
1655 cellParam->uciOnlyPusch = SUPPORTED;
1659 cellParam->uciOnlyPusch = NOT_SUPPORTED;
1663 case FAPI_PUSCH_FREQUENCY_HOPPING_TAG:
1664 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1665 if(encodedVal != RFAILED && encodedVal != 0)
1667 cellParam->puschFrequencyHopping = SUPPORTED;
1671 cellParam->puschFrequencyHopping = NOT_SUPPORTED;
1675 case FAPI_PUSCH_DMRS_CONFIG_TYPES_TAG:
1676 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1677 if(encodedVal != RFAILED)
1679 fillPuschDmrsConfig(encodedVal, &cellParam);
1683 case FAPI_PUSCH_DMRS_MAX_LEN_TAG:
1684 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1685 if(encodedVal != RFAILED)
1687 fillPuschDmrsLength(encodedVal, &cellParam);
1691 case FAPI_PUSCH_DMRS_ADDITIONAL_POS_TAG:
1692 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1693 if(encodedVal != RFAILED)
1695 fillPuschDmrsAddPos(encodedVal, &cellParam);
1699 case FAPI_PUSCH_CBG_TAG:
1700 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1701 if(encodedVal != RFAILED && encodedVal != 0)
1703 cellParam->puschCbg = SUPPORTED;
1707 cellParam->puschCbg = NOT_SUPPORTED;
1711 case FAPI_PUSCH_MAPPING_TYPE_TAG:
1712 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1713 if(encodedVal != RFAILED)
1715 fillPuschMappingType(encodedVal, &cellParam);
1719 case FAPI_PUSCH_ALLOCATION_TYPES_TAG:
1720 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1721 if(encodedVal != RFAILED)
1723 fillPuschAllocationType(encodedVal, &cellParam);
1727 case FAPI_PUSCH_VRB_TO_PRB_MAPPING_TAG:
1728 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1729 if(encodedVal != RFAILED)
1731 fillPuschPrbMappingType(encodedVal, &cellParam);
1735 case FAPI_PUSCH_MAX_PTRS_PORTS_TAG:
1736 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1737 if(encodedVal != RFAILED && encodedVal < FAPI_PUSCH_MAX_PTRS_PORTS_UB)
1739 cellParam->puschMaxPtrsPorts = encodedVal;
1743 case FAPI_MAX_PDUSCHS_TBS_PER_SLOT_TAG:
1744 cellParam->maxPduschsTBsPerSlot = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1747 case FAPI_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG:
1748 cellParam->maxNumberMimoLayersNonCbPusch = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1751 case FAPI_SUPPORTED_MODULATION_ORDER_UL_TAG:
1752 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1753 if(encodedVal != RFAILED)
1755 fillModulationOrderUl(encodedVal, &cellParam);
1759 case FAPI_MAX_MU_MIMO_USERS_UL_TAG:
1760 cellParam->maxMuMimoUsersUl = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1763 case FAPI_DFTS_OFDM_SUPPORT_TAG:
1764 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1765 if(encodedVal != RFAILED && encodedVal != 0)
1767 cellParam->dftsOfdmSupport = SUPPORTED;
1771 cellParam->dftsOfdmSupport = NOT_SUPPORTED;
1775 case FAPI_PUSCH_AGGREGATION_FACTOR_TAG:
1776 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1777 if(encodedVal != RFAILED)
1779 fillPuschAggregationFactor(encodedVal, &cellParam);
1783 case FAPI_PRACH_LONG_FORMATS_TAG:
1784 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1785 if(encodedVal != RFAILED)
1787 fillPrachLongFormat(encodedVal, &cellParam);
1791 case FAPI_PRACH_SHORT_FORMATS_TAG:
1792 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1793 if(encodedVal != RFAILED)
1795 fillPrachShortFormat(encodedVal, &cellParam);
1799 case FAPI_PRACH_RESTRICTED_SETS_TAG:
1800 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1801 if(encodedVal != RFAILED && encodedVal != 0)
1803 cellParam->prachRestrictedSets = SUPPORTED;
1807 cellParam->prachRestrictedSets = NOT_SUPPORTED;
1811 case FAPI_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG:
1812 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1813 if(encodedVal != RFAILED)
1815 fillFdOccasions(encodedVal, &cellParam);
1819 case FAPI_RSSI_MEASUREMENT_SUPPORT_TAG:
1820 encodedVal = getParamValue(¶mRsp->tlvs[index], FAPI_UINT_8);
1821 if(encodedVal != RFAILED)
1823 fillRssiMeas(encodedVal, &cellParam);
1827 //printf("\n Invalid value for TLV[%x] at index[%d]", paramRsp->tlvs[index].tl.tag, index);
1831 MAC_FREE(cellParam, sizeof(ClCellParam));
1832 MAC_FREE(paramRsp, sizeof(fapi_param_resp_t));
1837 DU_LOG("\n LOWER MAC: Invalid error code %d", paramRsp->error_code);
1843 DU_LOG("\nLOWER MAC: Failed to allocate memory for cell param");
1849 DU_LOG("\nLOWER MAC: Param Response received from PHY is NULL");
1857 /*******************************************************************
1859 * @brief Sends FAPI Config req to PHY
1863 * Function : lwr_mac_handleConfigReqEvt
1866 * -Sends FAPI Config Req to PHY
1869 * @return ROK - success
1872 * ****************************************************************/
1874 S16 lwr_mac_handleConfigReqEvt(void *msg)
1878 uint32_t msgLen = 0;
1879 uint32_t configReqSize;
1880 RgCellCb *cellParams;
1881 MacCellCfg macCfgParams;
1884 DU_LOG("\nLOWER MAC: Received EVENT[%d] at STATE[%d]", clGlobalCp.event, clGlobalCp.phyState);
1886 fapi_config_req_t *configReq;
1887 cellParams = rgCb[inst].cell;
1888 macCfgParams = cellParams->macCellCfg;
1889 configReqSize = sizeof(fapi_config_req_t) + (macCfgParams.numTlv * sizeof(fapi_uint16_tlv_t));
1890 MAC_ALLOC(configReq, configReqSize);
1892 if(configReq != NULL)
1894 configReq->number_of_tlvs = macCfgParams.numTlv;
1896 if(macCfgParams.dlCarrCfg.pres)
1898 fillTlvs(&configReq->tlvs[index++], FAPI_DL_BANDWIDTH_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.bw, &msgLen);
1899 fillTlvs(&configReq->tlvs[index++], FAPI_DL_FREQUENCY_TAG, sizeof(uint32_t), macCfgParams.dlCarrCfg.freq, &msgLen);
1900 fillTlvs(&configReq->tlvs[index++], FAPI_DL_K0_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.k0[0], &msgLen);
1901 fillTlvs(&configReq->tlvs[index++], FAPI_DL_GRIDSIZE_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.gridSize[0], &msgLen);
1902 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_TX_ANT_TAG, sizeof(uint16_t), macCfgParams.dlCarrCfg.numAnt, &msgLen);
1904 if(macCfgParams.ulCarrCfg.pres)
1906 fillTlvs(&configReq->tlvs[index++], FAPI_UPLINK_BANDWIDTH_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.bw, &msgLen);
1907 fillTlvs(&configReq->tlvs[index++], FAPI_UPLINK_FREQUENCY_TAG, sizeof(uint32_t), macCfgParams.ulCarrCfg.freq, &msgLen);
1908 fillTlvs(&configReq->tlvs[index++], FAPI_UL_K0_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.k0[0], &msgLen);
1909 fillTlvs(&configReq->tlvs[index++], FAPI_UL_GRID_SIZE_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.gridSize[0], &msgLen);
1910 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_RX_ANT_TAG, sizeof(uint16_t), macCfgParams.ulCarrCfg.numAnt, &msgLen);
1912 fillTlvs(&configReq->tlvs[index++], FAPI_FREQUENCY_SHIFT_7P5_KHZ_TAG, sizeof(uint8_t), macCfgParams.freqShft, &msgLen);
1914 /* fill cell config */
1915 fillTlvs(&configReq->tlvs[index++], FAPI_PHY_CELL_ID_TAG, sizeof(uint8_t), macCfgParams.phyCellId, &msgLen);
1916 fillTlvs(&configReq->tlvs[index++], FAPI_FRAME_DUPLEX_TYPE_TAG, sizeof(uint8_t), macCfgParams.dupType, &msgLen);
1918 /* fill SSB configuration */
1919 fillTlvs(&configReq->tlvs[index++], FAPI_SS_PBCH_POWER_TAG, sizeof(uint32_t), macCfgParams.ssbCfg.ssbPbchPwr, &msgLen);
1920 fillTlvs(&configReq->tlvs[index++], FAPI_BCH_PAYLOAD_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.bchPayloadFlag, &msgLen);
1921 fillTlvs(&configReq->tlvs[index++], FAPI_SCS_COMMON_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.scsCmn, &msgLen);
1923 /* fill PRACH configuration */
1924 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_SEQUENCE_LENGTH_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachSeqLen, &msgLen);
1925 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_SUBC_SPACING_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachSubcSpacing, &msgLen);
1926 fillTlvs(&configReq->tlvs[index++], FAPI_RESTRICTED_SET_CONFIG_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachRstSetCfg, &msgLen);
1927 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_PRACH_FD_OCCASIONS_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachFdm, &msgLen);
1928 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_ROOT_SEQUENCE_INDEX_TAG, sizeof(uint16_t), macCfgParams.prachCfg.fdm[0].rootSeqIdx, &msgLen);
1929 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_ROOT_SEQUENCES_TAG, sizeof(uint8_t), macCfgParams.prachCfg.fdm[0].numRootSeq, &msgLen);
1930 fillTlvs(&configReq->tlvs[index++], FAPI_K1_TAG, sizeof(uint16_t), macCfgParams.prachCfg.fdm[0].k1, &msgLen);
1931 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_ZERO_CORR_CONF_TAG , sizeof(uint8_t), macCfgParams.prachCfg.fdm[0].zeroCorrZoneCfg, &msgLen);
1932 fillTlvs(&configReq->tlvs[index++], FAPI_NUM_UNUSED_ROOT_SEQUENCES_TAG, sizeof(uint8_t), macCfgParams.prachCfg.fdm[0].numUnusedRootSeq, &msgLen);
1933 fillTlvs(&configReq->tlvs[index++], FAPI_UNUSED_ROOT_SEQUENCES_TAG,
1934 sizeof(uint8_t), *(macCfgParams.prachCfg.fdm[0].unsuedRootSeq), &msgLen);
1935 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_PER_RACH_TAG, sizeof(uint8_t), macCfgParams.prachCfg.ssbPerRach, &msgLen);
1936 fillTlvs(&configReq->tlvs[index++], FAPI_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG, sizeof(uint8_t), macCfgParams.prachCfg.prachMultCarrBand, &msgLen);
1938 /* fill SSB table */
1939 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_OFFSET_POINT_A_TAG, sizeof(uint16_t), macCfgParams.ssbCfg.ssbOffsetPointA, &msgLen);
1940 fillTlvs(&configReq->tlvs[index++], FAPI_BETA_PSS_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.betaPss, &msgLen);
1941 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_PERIOD_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.ssbPeriod, &msgLen);
1942 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_SUBCARRIER_OFFSET_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.ssbScOffset, &msgLen);
1943 fillTlvs(&configReq->tlvs[index++], FAPI_MIB_TAG , sizeof(uint32_t), macCfgParams.ssbCfg.mibPdu[0], &msgLen);
1944 fillTlvs(&configReq->tlvs[index++], FAPI_SSB_MASK_TAG, sizeof(uint32_t), macCfgParams.ssbCfg.ssbMask[0], &msgLen);
1945 fillTlvs(&configReq->tlvs[index++], FAPI_BEAM_ID_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.beamId[0], &msgLen);
1946 fillTlvs(&configReq->tlvs[index++], FAPI_SS_PBCH_MULTIPLE_CARRIERS_IN_A_BAND_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.multCarrBand, &msgLen);
1947 fillTlvs(&configReq->tlvs[index++], FAPI_MULTIPLE_CELLS_SS_PBCH_IN_A_CARRIER_TAG, sizeof(uint8_t), macCfgParams.ssbCfg.multCellCarr, &msgLen);
1949 /* fill TDD table */
1950 fillTlvs(&configReq->tlvs[index++], FAPI_TDD_PERIOD_TAG, sizeof(uint8_t), macCfgParams.tddCfg.tddPeriod, &msgLen);
1951 fillTlvs(&configReq->tlvs[index++], FAPI_SLOT_CONFIG_TAG, sizeof(uint8_t), macCfgParams.tddCfg.slotCfg[0][0], &msgLen);
1953 /* fill measurement config */
1954 fillTlvs(&configReq->tlvs[index++], FAPI_RSSI_MESUREMENT_TAG, sizeof(uint8_t), macCfgParams.rssiUnit, &msgLen);
1956 fillMsgHeader(&configReq->header, FAPI_CONFIG_REQUEST, msgLen);
1957 DU_LOG("\nLOWER_MAC: Sending Config Request to Phy");
1958 sendToPhy(configReq->header.message_type_id, msgLen, (void *)configReq);
1959 MAC_FREE(configReq, configReqSize);
1964 DU_LOG("\nLOWER_MAC: Failed to allocate memory for config Request");
1972 S16 lwr_mac_handleConfigRspEvt(void *msg)
1975 fapi_config_resp_t *configRsp;
1976 configRsp = (fapi_config_resp_t *)msg;
1977 DU_LOG("\nLOWER MAC: Received EVENT[%d] at STATE[%d]", clGlobalCp.event, clGlobalCp.phyState);
1979 if(configRsp != NULL)
1981 if(configRsp->error_code == MSG_OK)
1983 DU_LOG("\nLOWER MAC: PHY has moved to Conigured state \n");
1984 clGlobalCp.phyState = PHY_STATE_CONFIGURED;
1985 MAC_FREE(configRsp, sizeof(fapi_config_resp_t));
1991 DU_LOG("\n LOWER MAC: Invalid error code %d", configRsp->error_code);
1997 DU_LOG("\nLOWER_MAC: Config Response received from PHY is NULL");
2005 S16 lwr_mac_handleStartReqEvt(void *msg)
2008 uint32_t msgLen = 0;
2009 fapi_start_req_t *startReq;
2010 MAC_ALLOC(startReq, sizeof(fapi_start_req_t));
2012 if(startReq != NULL)
2014 fillMsgHeader(&startReq->header, FAPI_START_REQUEST, msgLen);
2015 DU_LOG("\nLOWER MAC: Sending Start Request to PHY");
2016 sendToPhy(startReq->header.message_type_id, sizeof(fapi_start_req_t), (void *)startReq);
2017 MAC_FREE(startReq, sizeof(fapi_start_req_t));
2022 DU_LOG("\nLOWER MAC: Failed to allocate memory for Start Request");
2030 S16 lwr_mac_handleStopReqEvt(void *msg)
2033 /* stop TX and RX operation return PHy to configured State
2034 send stop.indication to l2/l3 */
2040 /*******************************************************************
2042 * @brief Modifes the received mibPdu to uint32 bit
2043 * and stores it in MacCellCfg
2047 * Function : setMibPdu
2052 * @params[in] Pointer to mibPdu
2053 * pointer to modified value
2054 ******************************************************************/
2056 PUBLIC void setMibPdu(uint8_t *mibPdu, uint32_t *val)
2058 *mibPdu |= (((uint8_t)(slotIndInfo.sfn >> 2)) & MIB_SFN_BITMASK);
2059 *val = (mibPdu[0] << 24 | mibPdu[1] << 16 | mibPdu[2] << 8);
2060 DU_LOG("\nLOWER MAC: value filled %x", *val);
2064 /*******************************************************************
2066 * @brief fills SSB PDU required for DL TTI info in MAC
2070 * Function : fillSsbPdu
2073 * -Fills the SSB PDU info
2076 * @params[in] Pointer to FAPI DL TTI Req
2077 * Pointer to RgCellCb
2078 * Pointer to msgLen of DL TTI Info
2081 ******************************************************************/
2083 S16 fillSsbPdu(fapi_dl_tti_req_pdu_t *dlTtiReqPdu, MacCellCfg *macCellCfg,
2086 uint32_t mibPayload = 0;
2087 if(dlTtiReqPdu != NULL)
2089 dlTtiReqPdu->pduType = SSB_PDU_TYPE; /* SSB PDU */
2090 dlTtiReqPdu->u.ssb_pdu.physCellId = macCellCfg->phyCellId;
2091 dlTtiReqPdu->u.ssb_pdu.betaPss = macCellCfg->ssbCfg.betaPss;
2092 dlTtiReqPdu->u.ssb_pdu.ssbBlockIndex = macCb.macCell->dlSlot[0].cellBroadcastInfo.ssbIdxSupported;
2093 dlTtiReqPdu->u.ssb_pdu.ssbSubCarrierOffset = macCellCfg->ssbCfg.ssbScOffset;
2094 /* ssbOfPdufstA to be filled in ssbCfg */
2095 dlTtiReqPdu->u.ssb_pdu.ssbOffsetPointA = macCellCfg->ssbCfg.ssbOffsetPointA;
2096 dlTtiReqPdu->u.ssb_pdu.bchPayloadFlag = macCellCfg->ssbCfg.bchPayloadFlag;
2097 /* Bit manipulation for SFN */
2098 setMibPdu(macCellCfg->ssbCfg.mibPdu, &mibPayload);
2099 dlTtiReqPdu->u.ssb_pdu.bchPayload.v.bchPayload = mibPayload;
2100 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.numPrgs = 0;
2101 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.prgSize = 0;
2102 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.digBfInterfaces = 0;
2103 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming.pmi_bfi[0].pmIdx = 0;
2104 dlTtiReqPdu->u.ssb_pdu.preCodingAndBeamforming. \
2105 pmi_bfi[0].beamIdx[0].beamidx = macCellCfg->ssbCfg.beamId[0];
2106 dlTtiReqPdu->pduSize = sizeof(fapi_dl_ssb_pdu_t); /* Size of SSB PDU */
2107 SETLENGTH(*msgLen, sizeof(fapi_dl_ssb_pdu_t));
2116 /*******************************************************************
2118 * @brief Sends DL TTI Request to PHY
2122 * Function : handleDlTtiReq
2125 * -Sends FAPI Param req to PHY
2127 * @params[in] RgDlSf *dlTtiReqSlot
2128 * @return ROK - success
2131 * ****************************************************************/
2132 S16 handleDlTtiReq(CmLteTimingInfo *dlTtiReqtimingInfo)
2136 fapi_dl_tti_req_t *dlTtiReq;
2137 fapi_dl_tti_req_pdu_t *dlTtiReqPdu;
2138 RgCellCb *cellCbParams;
2139 MacCellCfg macCellCfg;
2142 cellCbParams = rgCb[inst].cell;
2143 if(dlTtiReqtimingInfo != NULLP)
2145 MAC_ALLOC(dlTtiReq, sizeof(fapi_dl_tti_req_t));
2146 if(dlTtiReq != NULLP)
2148 /* fill the SFN and slot value from crntTime */
2149 dlTtiReq->sfn = dlTtiReqtimingInfo->sfn;
2150 dlTtiReq->slot = dlTtiReqtimingInfo->slot;
2151 dlTtiReq->nPdus = 0;
2152 dlTtiReq->nGroup = 0;
2153 if(macCb.macCell->dlSlot[0].cellBroadcastInfo.ssbTrans)
2155 macCellCfg = cellCbParams->macCellCfg;
2157 MAC_ALLOC(dlTtiReqPdu, sizeof(fapi_dl_tti_req_pdu_t));
2158 if(dlTtiReqPdu != NULLP)
2160 fillSsbPdu(dlTtiReqPdu, &macCellCfg, &msgLen);
2161 dlTtiReq->pdus = dlTtiReqPdu;
2163 (dlTtiReq->nPdus)++;
2164 msgLen = sizeof(fapi_dl_tti_req_t) - sizeof(fapi_msg_t);
2165 fillMsgHeader(&dlTtiReq->header, FAPI_DL_TTI_REQUEST, msgLen);
2166 sendToPhy(dlTtiReq->header.message_type_id, msgLen, (void *)dlTtiReq);
2167 MAC_FREE(dlTtiReqPdu, sizeof(fapi_dl_tti_req_pdu_t));
2169 MAC_FREE(dlTtiReq, sizeof(fapi_dl_tti_req_t));
2174 DU_LOG("\nLOWER MAC: Failed to allocate memory for DL TTI Request");
2180 DU_LOG("\nLOWER MAC: Current TTI Info is NULL");
2188 lwrMacFsmHdlr fapiEvtHdlr[MAX_STATE][MAX_EVENT] =
2191 /* PHY_STATE_IDLE */
2192 lwr_mac_handleParamReqEvt,
2193 lwr_mac_handleParamRspEvt,
2194 lwr_mac_handleConfigReqEvt,
2195 lwr_mac_handleConfigRspEvt,
2196 lwr_mac_handleInvalidEvt,
2199 /* PHY_STATE_CONFIGURED */
2200 lwr_mac_handleParamReqEvt,
2201 lwr_mac_handleParamRspEvt,
2202 lwr_mac_handleConfigReqEvt,
2203 lwr_mac_handleConfigRspEvt,
2204 lwr_mac_handleStartReqEvt,
2207 /* PHY_STATE_RUNNING */
2208 lwr_mac_handleInvalidEvt,
2209 lwr_mac_handleInvalidEvt,
2210 lwr_mac_handleConfigReqEvt,
2211 lwr_mac_handleConfigRspEvt,
2212 lwr_mac_handleInvalidEvt,
2216 /*******************************************************************
2218 * @brief Sends message to Lower Mac Fsm Event Handler
2222 * Function : sendToLowerMac
2225 * -Sends message to LowerMac
2227 * @params[in] Message Type
2233 ******************************************************************/
2234 void sendToLowerMac(uint16_t msgType, uint32_t msgLen, void *msg)
2236 clGlobalCp.event = msgType;
2237 fapiEvtHdlr[clGlobalCp.phyState][clGlobalCp.event](msg);
2239 /**********************************************************************
2241 **********************************************************************/