* INTC Contribution to the O-RAN F Release for O-DU Low
[o-du/phy.git] / fapi_5g / source / api / fapi2phy / p7 / nr5g_fapi_proc_ul_tti_req.c
index 0f7795b..dd88d6a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
 *
-*   Copyright (c) 2019 Intel.
+*   Copyright (c) 2021 Intel.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
@@ -23,7 +23,6 @@
  **/
 
 #include "nr5g_fapi_framework.h"
-#include "gnb_l1_l2_api.h"
 #include "nr5g_fapi_fapi2mac_api.h"
 #include "nr5g_fapi_fapi2phy_api.h"
 #include "nr5g_fapi_fapi2phy_p7_proc.h"
@@ -31,6 +30,8 @@
 #include "nr5g_fapi_memory.h"
 #include <math.h>
 
+#define NUM_UL_PTRS_PORT_INDEX (12)
+
  /** @ingroup group_source_api_p7_fapi2phy_proc
  *
  *  @param[in]  p_phy_instance Pointer to PHY instance.
@@ -43,6 +44,7 @@
  *
 **/
 uint8_t nr5g_fapi_ul_tti_request(
+    bool is_urllc,
     p_nr5g_fapi_phy_instance_t p_phy_instance,
     fapi_ul_tti_req_t * p_fapi_req,
     fapi_vendor_msg_t * p_fapi_vendor_msg)
@@ -50,7 +52,6 @@ uint8_t nr5g_fapi_ul_tti_request(
     PULConfigRequestStruct p_ia_ul_config_req;
     PMAC2PHY_QUEUE_EL p_list_elem;
     nr5g_fapi_stats_t *p_stats;
-    UNUSED(p_fapi_vendor_msg);
 
     if (NULL == p_phy_instance) {
         NR5G_FAPI_LOG(ERROR_LOG, ("[NR5G_FAPI][UL_TTI.request] Invalid "
@@ -83,8 +84,8 @@ uint8_t nr5g_fapi_ul_tti_request(
     p_ia_ul_config_req->sMsgHdr.nMessageLen =
         (uint16_t) sizeof(ULConfigRequestStruct);
 
-    if (FAILURE == nr5g_fapi_ul_tti_req_to_phy_translation(p_phy_instance,
-            p_fapi_req, p_ia_ul_config_req)) {
+    if (FAILURE == nr5g_fapi_ul_tti_req_to_phy_translation(is_urllc, p_phy_instance,
+            p_fapi_req, p_fapi_vendor_msg, p_ia_ul_config_req)) {
         nr5g_fapi_fapi2phy_destroy_api_list_elem(p_list_elem);
         NR5G_FAPI_LOG(DEBUG_LOG, ("[UL_TTI.request][%d][%d,%d] Not Sent",
                 p_phy_instance->phy_id, p_ia_ul_config_req->sSFN_Slot.nSFN,
@@ -92,120 +93,44 @@ uint8_t nr5g_fapi_ul_tti_request(
         return FAILURE;
     }
 
-    nr5g_fapi_fapi2phy_add_to_api_list(p_list_elem);
+    nr5g_fapi_fapi2phy_add_to_api_list(is_urllc, p_list_elem);
 
     p_stats->iapi_stats.iapi_ul_config_req++;
-    NR5G_FAPI_LOG(DEBUG_LOG, ("[UL_TTI.request][%d][%d,%d]",
+    NR5G_FAPI_LOG(DEBUG_LOG, ("[UL_TTI.request][%u][%u,%u,%u] is_urllc %u",
             p_phy_instance->phy_id,
-            p_ia_ul_config_req->sSFN_Slot.nSFN,
-            p_ia_ul_config_req->sSFN_Slot.nSlot));
+        p_ia_ul_config_req->sSFN_Slot.nSFN, p_ia_ul_config_req->sSFN_Slot.nSlot,
+        p_ia_ul_config_req->sSFN_Slot.nSym, is_urllc));
 
     return SUCCESS;
 }
 
- /** @ingroup group_source_api_p7_fapi2phy_proc
- *
- *  @param[in]  bwp_size  Variable holding the Bandwidth part size.
- *  
- *  @return     Returns ::RBG Size.
- *
- *  @description
- *  This functions calculates and return RBG Size from Bandwidth part size provided. 
- *
-**/
-uint8_t nr5g_fapi_calc_n_rbg_size(
-    uint16_t bwp_size)
-{
-    uint8_t n_rbg_size = 0;
-    if (bwp_size >= 1 && bwp_size <= 36) {
-        n_rbg_size = 2;
-    } else if (bwp_size >= 37 && bwp_size <= 72) {
-        n_rbg_size = 4;
-    } else if (bwp_size >= 73 && bwp_size <= 144) {
-        n_rbg_size = 8;
-    } else if (bwp_size >= 145 && bwp_size <= 275) {
-        n_rbg_size = 16;
-    } else {
-        n_rbg_size = 0;
-    }
-    return n_rbg_size;
+static uint32_t get_rbg_index_mask_from_LSB(uint32_t nth_bit) {
+    #define ULSCH_RBG_INDEX_LSB 0x1u
+    return ULSCH_RBG_INDEX_LSB << nth_bit;
 }
 
  /** @ingroup group_source_api_p7_fapi2phy_proc
  *
- *  @param[in]  n_rbg_size  Variable holding the RBG Size
- *  @param[in]  p_push_pdu Pointer to FAPI PUSCH Pdu
+ *  @param[in]  rb_bitmap Pointer to FAPI DL resource block bitmap.
+ *  @param[in]  rbg_size  Size of resource block group.
  *  
- *  @return     Returns ::RBG Bitmap entry
+ *  @return     Returns IAPI nRBGIndex
  *
  *  @description
- *  This functions derives the RBG Bitmap entry for PUSCH Type-0 allocation. 
+ *  Maps rbBitmap into nRBGIndex bits for pusch.
  *
 **/
-uint32_t nr5g_fapi_calc_n_rbg_index_entry(
-    uint8_t n_rbg_size,
-    fapi_ul_pusch_pdu_t * p_pusch_pdu)
+uint32_t nr5g_fapi_calc_pusch_rbg_index(
+    const uint8_t rb_bitmap[FAPI_RB_BITMAP_SIZE],
+    uint16_t bwp_start,
+    uint16_t bwp_size
+    )
 {
-    uint8_t i, temp, num_bits = 0;
-    uint32_t n_rbg_bitmap = 0;
-    uint8_t rb_bitmap_entries, rb_bitmap;
-
-    rb_bitmap_entries = ceil(n_rbg_size / 8);
-    for (i = 0; i < rb_bitmap_entries; i++) {
-        num_bits = 0;
-        temp = 0;
-        rb_bitmap = p_pusch_pdu->rbBitmap[i];
-        while (num_bits < 8) {
-            if (rb_bitmap & (1 << num_bits)) {
-                temp |= (1 << (7 - num_bits));
-            }
-            num_bits++;
-        }
-        n_rbg_bitmap |= ((n_rbg_bitmap | temp) << (32 - (8 * (i + 1))));
-    }
-    return n_rbg_bitmap;
+    return nr5g_fapi_calc_rbg_index(
+        rb_bitmap, bwp_start, bwp_size, get_rbg_index_mask_from_LSB);
 }
 
  /** @ingroup group_source_api_p7_fapi2phy_proc
- *
- *  @param[in]  fapi_alpha_scaling  Variable holding the FAPI Alpha Scaling Value.
- *  
- *  @return     Returns ::PHY equivalent Alpha Scaling Value.
- *
- *  @description
- *  This functions derives the PHY equivalent Alpha Scaling value from FAPI Alpha Scaling Value. 
- *
-**/
-uint8_t nr5g_fapi_calc_alpha_scaling(
-    uint8_t fapi_alpha_scaling)
-{
-    uint8_t alpha_scaling;
-
-    switch (fapi_alpha_scaling) {
-        case 0:
-            alpha_scaling = 127;
-            break;
-
-        case 1:
-            alpha_scaling = 166;
-            break;
-
-        case 2:
-            alpha_scaling = 205;
-            break;
-
-        case 3:
-            alpha_scaling = 255;
-            break;
-
-        default:
-            alpha_scaling = 0;
-            break;
-    }
-    return alpha_scaling;
-}
-
-/** @ingroup group_source_api_p7_fapi2phy_proc
  *
  *  @param[in]  p_pusch_data Pointer to FAPI Optional PUSCH Data structure.
  *  @param[in]  p_ul_data_chan Pointer to IAPI ULSCH PDU structure.
@@ -247,12 +172,12 @@ void nr5g_fapi_pusch_uci_to_phy_ulsch_translation(
     ULSCHPDUStruct * p_ul_data_chan)
 {
     p_ul_data_chan->nAck = p_pusch_uci->harqAckBitLength;
-    //csiPart1BitLength and csiPart2BitLength are ignored as per design
-    p_ul_data_chan->nAlphaScaling =
-        nr5g_fapi_calc_alpha_scaling(p_pusch_uci->alphaScaling);
-    //p_ul_data_chan->nAlphaScaling = 0;
+    p_ul_data_chan->nAlphaScaling = p_pusch_uci->alphaScaling;
     p_ul_data_chan->nBetaOffsetACKIndex = p_pusch_uci->betaOffsetHarqAck;
-    //betaOffsetCsi1 and betaOffsetCsi2 are ignored as per design
+    p_ul_data_chan->nBetaOffsetCSIP1Index = p_pusch_uci->betaOffsetCsi1;
+    p_ul_data_chan->nBetaOffsetCSIP2Index = p_pusch_uci->betaOffsetCsi2;
+    p_ul_data_chan->nCSIPart1 = p_pusch_uci->csiPart1BitLength;
+    p_ul_data_chan->nCSIPart2 = p_pusch_uci->csiPart2BitLength;
 }
 
 /** @ingroup group_source_api_p7_fapi2phy_proc
@@ -286,10 +211,13 @@ void nr5g_fapi_pusch_ptrs_to_phy_ulsch_translation(
     if (p_pusch_ptrs->numPtrsPorts > 0) {
         num_ptrs_ports = p_ul_data_chan->nNrOfPTRSPorts = 1;
     }
-    for (i = 0; (i < num_ptrs_ports && port_index < FAPI_MAX_PTRS_PORTS); i++) {
+    for (i = 0; i < num_ptrs_ports && i < FAPI_MAX_PTRS_PORTS; i++) {
         p_ptrs_info = &p_pusch_ptrs->ptrsInfo[i];
-        if ((p_ptrs_info->ptrsPortIndex >> i) & 0x01) {
-            p_ul_data_chan->nPTRSPortIndex[port_index++] = i;
+        for (port_index = 0; port_index < NUM_UL_PTRS_PORT_INDEX; port_index++)
+        {
+            if ((p_ptrs_info->ptrsPortIndex >> port_index) & 0x01) {
+                p_ul_data_chan->nPTRSPortIndex[i] = port_index;
+            }
         }
         //PTRSDmrsPort is ignored as per Design
         p_ul_data_chan->nPTRSReOffset = p_ptrs_info->ptrsReOffset;
@@ -377,19 +305,24 @@ void nr5g_fapi_pusch_to_phy_ulsch_translation(
     }
     p_ul_data_chan->nTPPuschID = p_pusch_pdu->nTpPuschId;
     p_ul_data_chan->nTpPi2BPSK = p_pusch_pdu->tpPi2Bpsk;
+
+    // Resource Allocation Information
+    p_ul_data_chan->nResourceAllocType = p_pusch_pdu->resourceAlloc;
+    if(FAPI_UL_RESOURCE_ALLOC_TYPE_0 == p_pusch_pdu->resourceAlloc) {
+        // TODO HS check correctness of supporting only config1
     //Config-1 alone is supported
-    n_rbg_size = p_ul_data_chan->nRBGSize = nr5g_fapi_calc_n_rbg_size(bwp_size);
+        n_rbg_size = p_ul_data_chan->nRBGSize =
+            nr5g_fapi_calc_n_rbg_size(bwp_size);
     if (n_rbg_size > 0) {
         p_ul_data_chan->nNrOfRBGs =
             ceil((bwp_size + (bwp_start % n_rbg_size)) / n_rbg_size);
     }
-    //First entry would be sufficient as maximum no of RBG's is at max 18.
-    p_ul_data_chan->nRBGIndex[0] =
-        nr5g_fapi_calc_n_rbg_index_entry(n_rbg_size, p_pusch_pdu);
+        p_ul_data_chan->nRBGIndex = nr5g_fapi_calc_pusch_rbg_index(
+            p_pusch_pdu->rbBitmap, bwp_start, bwp_size);
+    }
     p_ul_data_chan->nRBStart = p_pusch_pdu->rbStart;
     p_ul_data_chan->nRBSize = p_pusch_pdu->rbSize;
     p_ul_data_chan->nVRBtoPRB = p_pusch_pdu->vrbToPrbMapping;
-    p_ul_data_chan->nResourceAllocType = p_pusch_pdu->resourceAlloc;
     p_ul_data_chan->nStartSymbolIndex = p_pusch_pdu->startSymbIndex;
     p_ul_data_chan->nNrOfSymbols = p_pusch_pdu->nrOfSymbols;
 
@@ -411,57 +344,15 @@ void nr5g_fapi_pusch_to_phy_ulsch_translation(
         p_ul_data_chan->nPTRSPresent = 1;
     }
     p_ul_data_chan->nULType = 0;
-    p_ul_data_chan->nNrOfAntennaPorts =
-        p_phy_instance->phy_config.n_nr_of_rx_ant;
     p_ul_data_chan->nRBBundleSize = 0;
     p_ul_data_chan->nPMI = 0;
     p_ul_data_chan->nTransmissionScheme = 0;
     p_ul_data_chan->rsv1 = 0;
-    p_ul_data_chan->nNrofRxRU = p_phy_instance->phy_config.n_nr_of_rx_ant;
-    p_stats->iapi_stats.iapi_ul_tti_pusch_pdus++;
-}
 
- /** @ingroup group_source_api_p7_fapi2phy_proc
- *
- *  @param[in]  num_groups Variable holding the groups for which PUCCH resources 
-                are unique
- *  @param[in]  initial_cyclic_shift Variable holding the parameter initial_cyclic 
-                shift to be verified against the already receieved pucch resources.
- *  @param[in]  nr_of_layers Variable holding the parameter nr_of_symbols
-                to be verified against the already received pucch resources.
- *  @param[in]  start_symbol_index  Variable holding the parameter start_symbol_index
-                to be verified against the already received pucch resources.
- *  @param[in]  time_domain_occ_idx Variable holding the parameter time_domain_occ_idx
-                to be verified against the already received pucch resources.
- *  @param[in]  p_pucch_resources Pointer pointing to the received pucch resources.
-*  @return     group_id, if pucch_resources match with parameters passed.
- *             0xFF, if pucch_resources not match with parameters passed.
- *  @description
- *  This function returns the group_id if parameters  passed already available in
- *  pucch_resources received earlier.
- *
-**/
-uint8_t nr5g_get_pucch_resources_group_id(
-    uint8_t num_groups,
-    uint16_t initial_cyclic_shift,
-    uint8_t nr_of_symbols,
-    uint8_t start_symbol_index,
-    uint8_t time_domain_occ_idx,
-    nr5g_fapi_pucch_resources_t * p_pucch_resources)
-{
-    uint8_t i, group_id = 0xFF;
-    for (i = 0; i < num_groups; i++) {
-        if ((initial_cyclic_shift == p_pucch_resources[i].initial_cyclic_shift)
-            && (nr_of_symbols == p_pucch_resources[i].nr_of_symbols)
-            && (start_symbol_index == p_pucch_resources[i].start_symbol_index)
-            && (time_domain_occ_idx ==
-                p_pucch_resources[i].time_domain_occ_idx)) {
-            group_id = p_pucch_resources[i].group_id;
-            break;
-        }
-    }
-    return group_id;
+    p_ul_data_chan->nNrOfAntennaPorts = 1;
+    p_ul_data_chan->nNrofRxRU = 1;
+
+    p_stats->iapi_stats.iapi_ul_tti_pusch_pdus++;
 }
 
  /** @ingroup group_source_api_p7_fapi2phy_proc
@@ -481,16 +372,9 @@ void nr5g_fapi_pucch_to_phy_ulcch_uci_translation(
     p_nr5g_fapi_phy_instance_t p_phy_instance,
     nr5g_fapi_pucch_info_t * p_pucch_info,
     fapi_ul_pucch_pdu_t * p_pucch_pdu,
-    uint8_t * num_group_ids,
-    nr5g_fapi_pucch_resources_t * p_pucch_resources,
     ULCCHUCIPDUStruct * p_ul_ctrl_chan)
 {
-    uint8_t group_id;
     nr5g_fapi_stats_t *p_stats;
-    uint8_t initial_cyclic_shift, nr_of_symbols;
-    uint8_t start_symbol_index, time_domain_occ_idx;
-    uint8_t num_groups = *num_group_ids;
-
     p_stats = &p_phy_instance->stats;
     p_stats->fapi_stats.fapi_ul_tti_pucch_pdus++;
     NR5G_FAPI_MEMSET(p_ul_ctrl_chan, sizeof(ULCCHUCIPDUStruct), 0,
@@ -515,42 +399,23 @@ void nr5g_fapi_pucch_to_phy_ulcch_uci_translation(
     }
     p_ul_ctrl_chan->nStartPRB = p_pucch_pdu->prbStart;
     p_ul_ctrl_chan->nPRBs = p_pucch_pdu->prbSize;
-    start_symbol_index = p_ul_ctrl_chan->nStartSymbolx =
-        p_pucch_pdu->startSymbolIndex;
-    nr_of_symbols = p_ul_ctrl_chan->nSymbols = p_pucch_pdu->nrOfSymbols;
+    p_ul_ctrl_chan->nStartSymbolx = p_pucch_pdu->startSymbolIndex;
+    p_ul_ctrl_chan->nSymbols = p_pucch_pdu->nrOfSymbols;
     p_ul_ctrl_chan->nFreqHopFlag = p_pucch_pdu->freqHopFlag;
 
     p_ul_ctrl_chan->n2ndHopPRB = p_pucch_pdu->secondHopPrb;
-    initial_cyclic_shift = p_ul_ctrl_chan->nM0 =
-        p_pucch_pdu->initialCyclicShift;
+    p_ul_ctrl_chan->nM0 = p_pucch_pdu->initialCyclicShift;
     p_ul_ctrl_chan->nID = p_pucch_pdu->dataScramblingId;
-    time_domain_occ_idx = p_ul_ctrl_chan->nFmt1OrthCCodeIdx =
-        p_pucch_pdu->timeDomainOccIdx;
+    p_ul_ctrl_chan->nFmt1OrthCCodeIdx = p_pucch_pdu->timeDomainOccIdx;
     p_ul_ctrl_chan->nFmt4OrthCCodeIdx = p_pucch_pdu->preDftOccIdx;
     p_ul_ctrl_chan->nFmt4OrthCCodeLength = p_pucch_pdu->preDftOccLen;
     p_ul_ctrl_chan->nAddDmrsFlag = p_pucch_pdu->addDmrsFlag;
     p_ul_ctrl_chan->nScramID = p_pucch_pdu->dmrsScramblingId;
     p_ul_ctrl_chan->nSRPriodAriv = p_pucch_pdu->srFlag;
     p_ul_ctrl_chan->nBitLenUci = p_pucch_pdu->bitLenHarq;
-    p_ul_ctrl_chan->nNrofRxRU = p_phy_instance->phy_config.n_nr_of_rx_ant;
-
-    group_id =
-        nr5g_get_pucch_resources_group_id(num_groups, initial_cyclic_shift,
-        nr_of_symbols, start_symbol_index, time_domain_occ_idx,
-        p_pucch_resources);
-    if (group_id == 0xFF) {
-        p_pucch_resources[num_groups].group_id = num_groups;
-        p_pucch_resources[num_groups].initial_cyclic_shift =
-            initial_cyclic_shift;
-        p_pucch_resources[num_groups].nr_of_symbols = nr_of_symbols;
-        p_pucch_resources[num_groups].start_symbol_index = start_symbol_index;
-        p_pucch_resources[num_groups].time_domain_occ_idx = time_domain_occ_idx;
-        p_ul_ctrl_chan->nGroupId = num_groups;
-        num_groups++;
-    } else {
-        p_ul_ctrl_chan->nGroupId = group_id;
-    }
-    *num_group_ids = num_groups;
+
+    p_ul_ctrl_chan->nNrofRxRU = 1;
+
     p_stats->iapi_stats.iapi_ul_tti_pucch_pdus++;
 }
 
@@ -613,7 +478,8 @@ void nr5g_fapi_srs_to_phy_srs_translation(
     p_ul_srs_chan->nTsrs = p_srs_pdu->tSrs;
     p_ul_srs_chan->nToffset = p_srs_pdu->tOffset;
     p_ul_srs_chan->nToffset = p_srs_pdu->tOffset;
-    p_ul_srs_chan->nNrofRxRU = p_phy_instance->phy_config.n_nr_of_rx_ant;
+
+    p_ul_srs_chan->nNrofRxRU = 1;
 
     p_stats->iapi_stats.iapi_ul_tti_srs_pdus++;
 }
@@ -631,14 +497,16 @@ void nr5g_fapi_srs_to_phy_srs_translation(
  *
 **/
 uint8_t nr5g_fapi_ul_tti_req_to_phy_translation(
+    bool is_urllc,
     p_nr5g_fapi_phy_instance_t p_phy_instance,
     fapi_ul_tti_req_t * p_fapi_req,
+    fapi_vendor_msg_t * p_fapi_vendor_msg,
     PULConfigRequestStruct p_ia_ul_config_req)
 {
-    uint8_t i, j, num_group_id = 0;
-    uint8_t num_fapi_pdus, num_groups, num_ue = 0;
+    uint8_t i, j;
+    uint8_t num_fapi_pdus, num_groups, num_ue = 0u;
     uint16_t frame_no;
-    uint8_t slot_no;
+    uint8_t slot_no, symbol_no;
 
     fapi_ul_tti_req_pdu_t *p_fapi_ul_tti_req_pdu;
     fapi_ue_info_t *p_fapi_ue_grp_info;
@@ -649,7 +517,6 @@ uint8_t nr5g_fapi_ul_tti_req_to_phy_translation(
     PDUStruct *p_pdu_head;
     nr5g_fapi_ul_slot_info_t *p_ul_slot_info;
     nr5g_fapi_stats_t *p_stats;
-    nr5g_fapi_pucch_resources_t pucch_resources[FAPI_MAX_NUM_PUCCH_PDU];
 
     p_stats = &p_phy_instance->stats;
 
@@ -657,9 +524,18 @@ uint8_t nr5g_fapi_ul_tti_req_to_phy_translation(
     slot_no = p_ia_ul_config_req->sSFN_Slot.nSlot = p_fapi_req->slot;
     p_ia_ul_config_req->sSFN_Slot.nCarrierIdx = p_phy_instance->phy_id;
 
+    if (FAILURE == nr5g_fapi_ul_tti_req_to_phy_translation_vendor_ext_symbol_no(is_urllc,
+                                        p_fapi_vendor_msg, p_ia_ul_config_req, &symbol_no))
+    {
+        return FAILURE;
+    }
+
     p_ul_slot_info =
-        &p_phy_instance->ul_slot_info[(slot_no % MAX_UL_SLOT_INFO_COUNT)];
-    nr5g_fapi_set_ul_slot_info(frame_no, slot_no, p_ul_slot_info);
+       &p_phy_instance->ul_slot_info[is_urllc]
+            [(slot_no % MAX_UL_SLOT_INFO_COUNT)]
+            [symbol_no % MAX_UL_SYMBOL_INFO_COUNT];// TODO:  will be split in 2 in a separate MR, as non-urllc does not need symbol info
+
+    nr5g_fapi_set_ul_slot_info(frame_no, slot_no, symbol_no, p_ul_slot_info);
 
     num_fapi_pdus = p_ia_ul_config_req->nPDU = p_fapi_req->nPdus;
     num_groups = p_ia_ul_config_req->nGroup = p_fapi_req->nGroup;
@@ -672,11 +548,11 @@ uint8_t nr5g_fapi_ul_tti_req_to_phy_translation(
             p_phy_instance->phy_config.phy_cell_id;
     }
     p_ia_ul_config_req->nUlsrs = 0;
-    for (i = 0; i < num_groups; i++) {
+    for (i = 0u; i < num_groups; i++) {
         p_pusch_grp_info = &p_ia_ul_config_req->sPUSCHGroupInfoStruct[i];
         p_fapi_ue_grp_info = &p_fapi_req->ueGrpInfo[i];
         num_ue = p_pusch_grp_info->nUE = p_fapi_ue_grp_info->nUe;
-        for (j = 0; j < num_ue; j++) {
+        for (j = 0u; j < num_ue; j++) {
             p_pusch_grp_info->nPduIdx[j] = p_fapi_ue_grp_info->pduIdx[j];
         }
     }
@@ -702,7 +578,8 @@ uint8_t nr5g_fapi_ul_tti_req_to_phy_translation(
                     p_ul_data_chan = (ULSCHPDUStruct *) p_pdu_head;
                     nr5g_fapi_pusch_to_phy_ulsch_translation(p_phy_instance,
                         &p_ul_slot_info->pusch_info[p_ul_slot_info->num_ulsch],
-                        &p_fapi_ul_tti_req_pdu->pdu.pusch_pdu, p_ul_data_chan);
+                        &p_fapi_ul_tti_req_pdu->pdu.pusch_pdu,
+                        p_ul_data_chan);
                     p_ul_slot_info->num_ulsch++;
                 }
                 break;
@@ -712,8 +589,8 @@ uint8_t nr5g_fapi_ul_tti_req_to_phy_translation(
                     p_ul_ctrl_chan = (ULCCHUCIPDUStruct *) p_pdu_head;
                     nr5g_fapi_pucch_to_phy_ulcch_uci_translation(p_phy_instance,
                         &p_ul_slot_info->pucch_info[p_ul_slot_info->num_ulcch],
-                        &p_fapi_ul_tti_req_pdu->pdu.pucch_pdu, &num_group_id,
-                        pucch_resources, p_ul_ctrl_chan);
+                        &p_fapi_ul_tti_req_pdu->pdu.pucch_pdu,
+                        p_ul_ctrl_chan);
                     p_ul_slot_info->num_ulcch++;
                 }
                 break;
@@ -742,5 +619,134 @@ uint8_t nr5g_fapi_ul_tti_req_to_phy_translation(
             (PDUStruct *) ((uint8_t *) p_pdu_head + p_pdu_head->nPDUSize);
         p_stats->iapi_stats.iapi_ul_tti_pdus++;
     }
+
+    if (NULL != p_fapi_vendor_msg) {
+        nr5g_fapi_ul_tti_req_to_phy_translation_vendor_ext(p_fapi_vendor_msg,
+                                                           p_ia_ul_config_req);
+    }
+
     return SUCCESS;
 }
+
+ /** @ingroup group_source_api_p7_fapi2phy_proc
+ *
+ *  @param[in]  p_fapi_vendor_msg  Pointer to FAPI UL_TTI.request vendor message.
+ *  @param[in]  p_ia_ul_config_req Pointer to IAPI UL_TTI.request structure.
+ *  
+ *  @return     no return.
+ *
+ *  @description
+ *  This function fills fields for UL_TTI.request structure that come from
+ *  a vendor extension.
+ *
+**/
+void nr5g_fapi_ul_tti_req_to_phy_translation_vendor_ext(
+    fapi_vendor_msg_t * p_fapi_vendor_msg,
+    PULConfigRequestStruct p_ia_ul_config_req)
+{
+    uint8_t i = 0u;
+
+    fapi_vendor_ul_tti_req_t *p_vendor_ul_tti_req = NULL;
+    fapi_vendor_ul_tti_req_pdu_t *p_fapi_vendor_ul_tti_req_pdu = NULL;
+    fapi_vendor_ul_pusch_pdu_t *p_vendor_pusch_pdu = NULL;
+    fapi_vendor_ul_pucch_pdu_t *p_vendor_pucch_pdu = NULL;
+    fapi_vendor_ul_srs_pdu_t *p_vendor_srs_pdu = NULL;
+
+    ULSCHPDUStruct *p_ul_data_chan;
+    ULCCHUCIPDUStruct *p_ul_ctrl_chan;
+    SRSPDUStruct *p_ul_srs_chan;
+    PDUStruct *p_pdu_head;
+
+    p_vendor_ul_tti_req = &p_fapi_vendor_msg->p7_req_vendor.ul_tti_req;
+
+    p_pdu_head = p_ia_ul_config_req->sULPDU;
+
+    for (i = 0u; i < p_ia_ul_config_req->nPDU; i++) {
+        p_fapi_vendor_ul_tti_req_pdu = &p_vendor_ul_tti_req->ul_pdus[i];
+
+        switch (p_pdu_head->nPDUType) {
+            case UL_PDU_TYPE_PRACH:
+                // Not used
+                break;
+
+            case UL_PDU_TYPE_ULSCH:
+                {
+                    p_ul_data_chan = (ULSCHPDUStruct *) p_pdu_head;
+                    p_vendor_pusch_pdu = &p_fapi_vendor_ul_tti_req_pdu->pdu.pusch_pdu;
+
+                    p_ul_data_chan->nNrOfAntennaPorts = p_vendor_pusch_pdu->nr_of_antenna_ports;
+                    p_ul_data_chan->nNrofRxRU = p_vendor_pusch_pdu->nr_of_rx_ru;
+                    NR5G_FAPI_MEMCPY(p_ul_data_chan->nRxRUIdx, sizeof(p_ul_data_chan->nRxRUIdx),
+                                    p_vendor_pusch_pdu->rx_ru_idx, sizeof(p_vendor_pusch_pdu->rx_ru_idx));
+                }
+                break;
+
+            case UL_PDU_TYPE_ULCCH_UCI:
+                {
+                    p_ul_ctrl_chan = (ULCCHUCIPDUStruct *) p_pdu_head;
+                    p_vendor_pucch_pdu = &p_fapi_vendor_ul_tti_req_pdu->pdu.pucch_pdu;
+
+                    p_ul_ctrl_chan->nNrofRxRU = p_vendor_pucch_pdu->nr_of_rx_ru;
+                    p_ul_ctrl_chan->nGroupId = p_vendor_pucch_pdu->group_id;
+                    NR5G_FAPI_MEMCPY(p_ul_ctrl_chan->nRxRUIdx, sizeof(p_ul_ctrl_chan->nRxRUIdx),
+                                        p_vendor_pucch_pdu->rx_ru_idx, sizeof(p_vendor_pucch_pdu->rx_ru_idx));
+                }
+                break;
+
+            case UL_PDU_TYPE_SRS:
+                {
+                    p_ul_srs_chan = (SRSPDUStruct *) p_pdu_head;
+                    p_vendor_srs_pdu = &p_fapi_vendor_ul_tti_req_pdu->pdu.srs_pdu;
+
+                    p_ul_srs_chan->nNrofRxRU = p_vendor_srs_pdu->nr_of_rx_ru;
+                    NR5G_FAPI_MEMCPY(p_ul_srs_chan->nRxRUIdx, sizeof(p_ul_srs_chan->nRxRUIdx),
+                                    p_vendor_srs_pdu->rx_ru_idx, sizeof(p_vendor_srs_pdu->rx_ru_idx));
+                }
+                break;
+
+            default:
+                {
+                    NR5G_FAPI_LOG(ERROR_LOG,
+                        ("[NR5G_FAPI] [UL_TTI.request] Unknown PDU Type :%d",
+                            p_ia_ul_config_req->sMsgHdr.nMessageType));
+                    return;
+                }
+        }
+        p_pdu_head =
+            (PDUStruct *) ((uint8_t *) p_pdu_head + p_pdu_head->nPDUSize);
+    }
+}
+
+
+ /** @ingroup group_source_api_p7_fapi2phy_proc
+ *
+ *  @param[in]  p_fapi_vendor_msg  Pointer to FAPI UL_TTI.request vendor message.
+ *  @param[in]  p_ia_ul_config_req Pointer to IAPI UL_TTI.request structure.
+ *  
+ *  @return     Returns ::SUCCESS and ::FAILURE.
+ * 
+ *  @description
+ *  This function fills symbol_no field for UL_TTI.request structure and fails if 
+ *  the mode is urllc and there is no associated vendor_msg.
+ *
+**/
+uint8_t nr5g_fapi_ul_tti_req_to_phy_translation_vendor_ext_symbol_no(
+    bool is_urllc,
+    fapi_vendor_msg_t * p_fapi_vendor_msg,
+    PULConfigRequestStruct p_ia_ul_config_req,
+    uint8_t* symbol_no)
+{
+    // for non-urllc mode symbol_no is a don't care
+    *symbol_no = 0u;
+    if (is_urllc)
+    {
+        if (NULL == p_fapi_vendor_msg)
+        {
+            NR5G_FAPI_LOG(ERROR_LOG, ("[NR5G_FAPI][UL_TTI.request] No vendor ext for URLLC! "
+                    "_vendor_ul_tti_req"));
+            return FAILURE;
+        }
+        *symbol_no = p_ia_ul_config_req->sSFN_Slot.nSym = p_fapi_vendor_msg->p7_req_vendor.ul_tti_req.sym;
+    }
+    return SUCCESS;
+}
\ No newline at end of file