+/**
+ * @brief Get K2 value for MSG3
+ *
+ * @details
+ *
+ * Function : schGetMsg3K2
+ *
+ * This function gets K2 for MSG3
+ *
+ * @param[in] SchCellCb *cell, Cell cb struc pointer
+ * @param[in] SchUlHqProcCb* msg3HqProc, msg3 harq proc pointer
+ * @param[in] uint16_t dlTime, DL time of scheduling
+ * @param[in] SlotTimingInfo *msg3Time, MSG3 timing info
+ * @param[in] bool isRetx, indicates MSG3 retransmission
+ * @return
+ * -# true
+ * -# false
+ **/
+bool schGetMsg3K2(SchCellCb *cell, SchUlHqProcCb* msg3HqProc, uint16_t dlTime, SlotTimingInfo *msg3Time, bool isRetx)
+{
+ bool k2Found = false;
+ uint8_t k2TblIdx = 0;
+ uint8_t k2Index = 0;
+ uint8_t k2 = 0;
+ uint8_t numK2 = 0;
+ uint8_t puschMu = 0;
+ uint8_t msg3Delta = 0, msg3MinSchTime = 0;
+#ifdef NR_TDD
+ uint8_t totalCfgSlot = 0;
+#endif
+ SchK2TimingInfoTbl *msg3K2InfoTbl=NULLP;
+ SlotTimingInfo currTime, msg3TempTime;
+ currTime = cell->slotInfo;
+ puschMu = cell->numerology;
+
+ if (isRetx)
+ {
+ if(!msg3HqProc)
+ return false;
+
+ numK2 = cell->k2InfoTbl.k2TimingInfo[dlTime].numK2;
+ msg3K2InfoTbl = &cell->msg3K2InfoTbl;
+ msg3MinSchTime = 0;
+ msg3Delta = 0;
+ }
+ else
+ {
+ numK2 = cell->msg3K2InfoTbl.k2TimingInfo[dlTime].numK2;
+ msg3K2InfoTbl = &cell->k2InfoTbl;
+ msg3MinSchTime = minMsg3SchTime[cell->numerology];
+ msg3Delta = puschDeltaTable[puschMu];
+ }
+
+ for(k2TblIdx = 0; k2TblIdx < numK2; k2TblIdx++)
+ {
+ k2Index = msg3K2InfoTbl->k2TimingInfo[dlTime].k2Indexes[k2TblIdx];
+
+ k2 = cell->cellCfg.ulCfgCommon.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].k2;
+ if (isRetx)
+ {
+ if ((msg3HqProc->strtSymbl != cell->cellCfg.ulCfgCommon.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].startSymbol) ||
+ (msg3HqProc->numSymbl != cell->cellCfg.ulCfgCommon.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].symbolLength))
+ {
+ continue;
+ }
+ }
+ /* Delta is added to the slot allocation for msg3 based on 38.214 section 6.1.2.1 */
+ k2 = k2 + msg3Delta;
+ if(k2 >= msg3MinSchTime)
+ {
+ ADD_DELTA_TO_TIME(currTime, msg3TempTime, k2, cell->numSlots);
+#ifdef NR_TDD
+ if(schGetSlotSymbFrmt(msg3TempTime.slot % totalCfgSlot, cell->slotFrmtBitMap) == DL_SLOT)
+ continue;
+#endif
+ /* If PUSCH is already scheduled on this slot, another PUSCH
+ * pdu cannot be scheduled here */
+ if(cell->schUlSlotInfo[msg3TempTime.slot]->puschUe != 0)
+ continue;
+ k2Found = true;
+ break;
+ }
+ }
+ if (k2Found == true)
+ {
+ msg3Time->slot = msg3TempTime.slot;
+ msg3Time->sfn = msg3TempTime.sfn;
+ msg3Time->slot = msg3TempTime.slot;
+ }
+ return k2Found;
+}
+