]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: Move HAL Tx, REO and link idle setup related APIs to wifi7 directory
authorPavankumar Nandeshwar <quic_pnandesh@quicinc.com>
Thu, 9 Oct 2025 11:10:39 +0000 (16:40 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Fri, 10 Oct 2025 14:06:18 +0000 (07:06 -0700)
Move the hardware specific HAL APIs to hal.c file
inside wifi7 directory. These APIs will be called
through the hal_ops mechanism, which are registered
separately by qcn and wcn

Handling following APIs:
ath12k_wifi7_hal_tx_set_dscp_tid_map
ath12k_wifi7_hal_tx_configure_bank_register
ath12k_hal_reoq_lut_addr_read_enable
ath12k_hal_reoq_lut_set_max_peerid
ath12k_wifi7_hal_write_reoq_lut_addr
ath12k_wifi7_hal_write_ml_reoq_lut_addr
ath12k_wifi7_hal_setup_link_idle_list

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Pavankumar Nandeshwar <quic_pnandesh@quicinc.com>
Signed-off-by: Ripan Deuri <quic_rdeuri@quicinc.com>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20251009111045.1763001-13-quic_rdeuri@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp.c
drivers/net/wireless/ath/ath12k/hal.c
drivers/net/wireless/ath/ath12k/hal.h
drivers/net/wireless/ath/ath12k/wifi7/hal.c
drivers/net/wireless/ath/ath12k/wifi7/hal.h
drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
drivers/net/wireless/ath/ath12k/wifi7/hal_tx.c
drivers/net/wireless/ath/ath12k/wifi7/hal_tx.h
drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c

index 495e03498187366087a32e59535d23f82a635524..b2c04fc460d9af630f57473ff539bf3c6e4f58ce 100644 (file)
@@ -425,8 +425,8 @@ inc_ref_and_return:
        spin_unlock_bh(&dp->tx_bank_lock);
 
        if (configure_register)
-               ath12k_wifi7_hal_tx_configure_bank_register(ab, bank_config,
-                                                           bank_id);
+               ath12k_hal_tx_configure_bank_register(ab,
+                                                     bank_config, bank_id);
 
        ath12k_dbg(ab, ATH12K_DBG_DP_HTT, "dp_htt tcl bank_id %d input 0x%x match 0x%x num_users %u",
                   bank_id, bank_config, dp->bank_profiles[bank_id].bank_config,
@@ -1149,9 +1149,7 @@ static void ath12k_dp_reoq_lut_cleanup(struct ath12k_base *ab)
                return;
 
        if (dp->reoq_lut.vaddr_unaligned) {
-               ath12k_hif_write32(ab,
-                                  HAL_SEQ_WCSS_UMAC_REO_REG +
-                                  HAL_REO1_QDESC_LUT_BASE0(dp->hal), 0);
+               ath12k_hal_write_reoq_lut_addr(ab, 0);
                dma_free_coherent(ab->dev, dp->reoq_lut.size,
                                  dp->reoq_lut.vaddr_unaligned,
                                  dp->reoq_lut.paddr_unaligned);
@@ -1159,9 +1157,7 @@ static void ath12k_dp_reoq_lut_cleanup(struct ath12k_base *ab)
        }
 
        if (dp->ml_reoq_lut.vaddr_unaligned) {
-               ath12k_hif_write32(ab,
-                                  HAL_SEQ_WCSS_UMAC_REO_REG +
-                                  HAL_REO1_QDESC_LUT_BASE1(dp->hal), 0);
+               ath12k_hal_write_ml_reoq_lut_addr(ab, 0);
                dma_free_coherent(ab->dev, dp->ml_reoq_lut.size,
                                  dp->ml_reoq_lut.vaddr_unaligned,
                                  dp->ml_reoq_lut.paddr_unaligned);
@@ -1539,8 +1535,6 @@ static int ath12k_dp_alloc_reoq_lut(struct ath12k_base *ab,
 static int ath12k_dp_reoq_lut_setup(struct ath12k_base *ab)
 {
        struct ath12k_dp *dp = ath12k_ab_to_dp(ab);
-       struct ath12k_hal *hal = dp->hal;
-       u32 val;
        int ret;
 
        if (!ab->hw_params->reoq_lut_support)
@@ -1568,19 +1562,10 @@ static int ath12k_dp_reoq_lut_setup(struct ath12k_base *ab)
         * register only
         */
 
-       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_QDESC_LUT_BASE0(hal),
-                          dp->reoq_lut.paddr >> 8);
-
-       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_QDESC_LUT_BASE1(hal),
-                          dp->ml_reoq_lut.paddr >> 8);
-
-       val = ath12k_hif_read32(ab, HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_QDESC_ADDR(hal));
-
-       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_QDESC_ADDR(hal),
-                          val | HAL_REO_QDESC_ADDR_READ_LUT_ENABLE);
-
-       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_QDESC_MAX_PEERID(hal),
-                          HAL_REO_QDESC_MAX_PEERID);
+       ath12k_hal_write_reoq_lut_addr(ab, dp->reoq_lut.paddr >> 8);
+       ath12k_hal_write_ml_reoq_lut_addr(ab, dp->ml_reoq_lut.paddr >> 8);
+       ath12k_hal_reoq_lut_addr_read_enable(ab);
+       ath12k_hal_reoq_lut_set_max_peerid(ab);
 
        return 0;
 }
@@ -1678,7 +1663,7 @@ static int ath12k_dp_setup(struct ath12k_base *ab)
        }
 
        for (i = 0; i < HAL_DSCP_TID_MAP_TBL_NUM_ENTRIES_MAX; i++)
-               ath12k_wifi7_hal_tx_set_dscp_tid_map(ab, i);
+               ath12k_hal_tx_set_dscp_tid_map(ab, i);
 
        ret = ath12k_dp_rx_alloc(ab);
        if (ret)
index 5c13eaf9c19e72dfc28cc6bc492a49b2ac1d6c08..b3010eea9afca98be5a45ecadc3e68e56e0bfdf1 100644 (file)
@@ -56,6 +56,46 @@ u32 ath12k_hal_ce_get_desc_size(struct ath12k_hal *hal, enum hal_ce_desc type)
        return hal->hal_ops->ce_get_desc_size(type);
 }
 
+void ath12k_hal_tx_set_dscp_tid_map(struct ath12k_base *ab, int id)
+{
+       ab->hal.hal_ops->tx_set_dscp_tid_map(ab, id);
+}
+
+void ath12k_hal_tx_configure_bank_register(struct ath12k_base *ab,
+                                          u32 bank_config, u8 bank_id)
+{
+       ab->hal.hal_ops->tx_configure_bank_register(ab, bank_config, bank_id);
+}
+
+void ath12k_hal_reoq_lut_addr_read_enable(struct ath12k_base *ab)
+{
+       ab->hal.hal_ops->reoq_lut_addr_read_enable(ab);
+}
+
+void ath12k_hal_reoq_lut_set_max_peerid(struct ath12k_base *ab)
+{
+       ab->hal.hal_ops->reoq_lut_set_max_peerid(ab);
+}
+
+void ath12k_hal_write_ml_reoq_lut_addr(struct ath12k_base *ab, dma_addr_t paddr)
+{
+       ab->hal.hal_ops->write_ml_reoq_lut_addr(ab, paddr);
+}
+
+void ath12k_hal_write_reoq_lut_addr(struct ath12k_base *ab, dma_addr_t paddr)
+{
+       ab->hal.hal_ops->write_reoq_lut_addr(ab, paddr);
+}
+
+void ath12k_hal_setup_link_idle_list(struct ath12k_base *ab,
+                                    struct hal_wbm_idle_scatter_list *sbuf,
+                                    u32 nsbufs, u32 tot_link_desc,
+                                    u32 end_offset)
+{
+       ab->hal.hal_ops->setup_link_idle_list(ab, sbuf, nsbufs, tot_link_desc,
+                                             end_offset);
+}
+
 static int ath12k_hal_alloc_cont_rdp(struct ath12k_hal *hal)
 {
        size_t size;
@@ -467,114 +507,6 @@ void ath12k_hal_srng_access_end(struct ath12k_base *ab, struct hal_srng *srng)
        srng->timestamp = jiffies;
 }
 
-void ath12k_hal_setup_link_idle_list(struct ath12k_base *ab,
-                                    struct hal_wbm_idle_scatter_list *sbuf,
-                                    u32 nsbufs, u32 tot_link_desc,
-                                    u32 end_offset)
-{
-       struct ath12k_hal *hal = &ab->hal;
-       struct ath12k_buffer_addr *link_addr;
-       int i;
-       u32 reg_scatter_buf_sz = HAL_WBM_IDLE_SCATTER_BUF_SIZE / 64;
-       u32 val;
-
-       link_addr = (void *)sbuf[0].vaddr + HAL_WBM_IDLE_SCATTER_BUF_SIZE;
-
-       for (i = 1; i < nsbufs; i++) {
-               link_addr->info0 = cpu_to_le32(sbuf[i].paddr & HAL_ADDR_LSB_REG_MASK);
-
-               link_addr->info1 =
-                       le32_encode_bits((u64)sbuf[i].paddr >> HAL_ADDR_MSB_REG_SHIFT,
-                                        HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
-                       le32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
-                                        HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG);
-
-               link_addr = (void *)sbuf[i].vaddr +
-                            HAL_WBM_IDLE_SCATTER_BUF_SIZE;
-       }
-
-       val = u32_encode_bits(reg_scatter_buf_sz, HAL_WBM_SCATTER_BUFFER_SIZE) |
-             u32_encode_bits(0x1, HAL_WBM_LINK_DESC_IDLE_LIST_MODE);
-
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_R0_IDLE_LIST_CONTROL_ADDR(hal),
-                          val);
-
-       val = u32_encode_bits(reg_scatter_buf_sz * nsbufs,
-                             HAL_WBM_SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_R0_IDLE_LIST_SIZE_ADDR(hal),
-                          val);
-
-       val = u32_encode_bits(sbuf[0].paddr & HAL_ADDR_LSB_REG_MASK,
-                             BUFFER_ADDR_INFO0_ADDR);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_RING_BASE_LSB(hal),
-                          val);
-
-       val = u32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
-                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG) |
-             u32_encode_bits((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT,
-                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_RING_BASE_MSB(hal),
-                          val);
-
-       /* Setup head and tail pointers for the idle list */
-       val = u32_encode_bits(sbuf[nsbufs - 1].paddr, BUFFER_ADDR_INFO0_ADDR);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(hal),
-                          val);
-
-       val = u32_encode_bits(((u64)sbuf[nsbufs - 1].paddr >> HAL_ADDR_MSB_REG_SHIFT),
-                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
-              u32_encode_bits((end_offset >> 2),
-                              HAL_WBM_SCATTERED_DESC_HEAD_P_OFFSET_IX1);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX1(hal),
-                          val);
-
-       val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(hal),
-                          val);
-
-       val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX0(hal),
-                          val);
-
-       val = u32_encode_bits(((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT),
-                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
-             u32_encode_bits(0, HAL_WBM_SCATTERED_DESC_TAIL_P_OFFSET_IX1);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX1(hal),
-                          val);
-
-       val = 2 * tot_link_desc;
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_SCATTERED_DESC_PTR_HP_ADDR(hal),
-                          val);
-
-       /* Enable the SRNG */
-       val = u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE) |
-             u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_RIND_ID_DISABLE);
-       ath12k_hif_write32(ab,
-                          HAL_SEQ_WCSS_UMAC_WBM_REG +
-                          HAL_WBM_IDLE_LINK_RING_MISC_ADDR(hal),
-                          val);
-}
-
 int ath12k_hal_srng_setup(struct ath12k_base *ab, enum hal_ring_type type,
                          int ring_num, int mac_id,
                          struct hal_srng_params *params)
index b739ebba588bb8cc26e2e82dcf6c976e451d8c13..0c8262675120b40ea6a743e44b3f14205a0411a2 100644 (file)
@@ -1717,6 +1717,18 @@ struct hal_ops {
        void (*set_link_desc_addr)(struct hal_wbm_link_desc *desc, u32 cookie,
                                   dma_addr_t paddr,
                                   enum hal_rx_buf_return_buf_manager rbm);
+       void (*tx_set_dscp_tid_map)(struct ath12k_base *ab, int id);
+       void (*tx_configure_bank_register)(struct ath12k_base *ab,
+                                          u32 bank_config, u8 bank_id);
+       void (*reoq_lut_addr_read_enable)(struct ath12k_base *ab);
+       void (*reoq_lut_set_max_peerid)(struct ath12k_base *ab);
+       void (*write_ml_reoq_lut_addr)(struct ath12k_base *ab,
+                                      dma_addr_t paddr);
+       void (*write_reoq_lut_addr)(struct ath12k_base *ab, dma_addr_t paddr);
+       void (*setup_link_idle_list)(struct ath12k_base *ab,
+                                    struct hal_wbm_idle_scatter_list *sbuf,
+                                    u32 nsbufs, u32 tot_link_desc,
+                                    u32 end_offset);
 };
 
 u32 ath12k_wifi7_hal_reo_qdesc_size(u32 ba_window_size, u8 tid);
@@ -1726,12 +1738,6 @@ void ath12k_wifi7_hal_reo_qdesc_setup(struct hal_rx_reo_queue *qdesc,
 void ath12k_wifi7_hal_reo_init_cmd_ring(struct ath12k_base *ab,
                                        struct hal_srng *srng);
 void ath12k_wifi7_hal_reo_hw_setup(struct ath12k_base *ab, u32 ring_hash_map);
-
-void ath12k_hal_setup_link_idle_list(struct ath12k_base *ab,
-                                    struct hal_wbm_idle_scatter_list *sbuf,
-                                    u32 nsbufs, u32 tot_link_desc,
-                                    u32 end_offset);
-
 dma_addr_t ath12k_hal_srng_get_tp_addr(struct ath12k_base *ab,
                                       struct hal_srng *srng);
 dma_addr_t ath12k_hal_srng_get_hp_addr(struct ath12k_base *ab,
@@ -1785,7 +1791,19 @@ void ath12k_hal_reo_shared_qaddr_cache_clear(struct ath12k_base *ab);
 void ath12k_hal_set_link_desc_addr(struct ath12k_hal *hal,
                                   struct hal_wbm_link_desc *desc, u32 cookie,
                                   dma_addr_t paddr, int rbm);
+void ath12k_hal_setup_link_idle_list(struct ath12k_base *ab,
+                                    struct hal_wbm_idle_scatter_list *sbuf,
+                                    u32 nsbufs, u32 tot_link_desc,
+                                    u32 end_offset);
 u32
 ath12k_hal_ce_dst_status_get_length(struct ath12k_hal *hal,
                                    struct hal_ce_srng_dst_status_desc *desc);
+void ath12k_hal_tx_set_dscp_tid_map(struct ath12k_base *ab, int id);
+void ath12k_hal_tx_configure_bank_register(struct ath12k_base *ab,
+                                          u32 bank_config, u8 bank_id);
+void ath12k_hal_reoq_lut_addr_read_enable(struct ath12k_base *ab);
+void ath12k_hal_reoq_lut_set_max_peerid(struct ath12k_base *ab);
+void ath12k_hal_write_reoq_lut_addr(struct ath12k_base *ab, dma_addr_t paddr);
+void
+ath12k_hal_write_ml_reoq_lut_addr(struct ath12k_base *ab, dma_addr_t paddr);
 #endif
index c9e853a32378c698b20e7c8668f8115145a63e4e..73d86dedadb1dac7e15aa0ec68419355462868b7 100644 (file)
@@ -7,6 +7,7 @@
 #include "hal_desc.h"
 #include "../hal.h"
 #include "hal.h"
+#include "hal_tx.h"
 #include "../debug.h"
 #include "../hif.h"
 #include "hal_qcn9274.h"
@@ -480,3 +481,152 @@ u32 ath12k_wifi7_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc
 
        return len;
 }
+
+void
+ath12k_wifi7_hal_setup_link_idle_list(struct ath12k_base *ab,
+                                     struct hal_wbm_idle_scatter_list *sbuf,
+                                     u32 nsbufs, u32 tot_link_desc,
+                                     u32 end_offset)
+{
+       struct ath12k_hal *hal = &ab->hal;
+       struct ath12k_buffer_addr *link_addr;
+       int i;
+       u32 reg_scatter_buf_sz = HAL_WBM_IDLE_SCATTER_BUF_SIZE / 64;
+       u32 val;
+
+       link_addr = (void *)sbuf[0].vaddr + HAL_WBM_IDLE_SCATTER_BUF_SIZE;
+
+       for (i = 1; i < nsbufs; i++) {
+               link_addr->info0 = cpu_to_le32(sbuf[i].paddr & HAL_ADDR_LSB_REG_MASK);
+
+               link_addr->info1 =
+                       le32_encode_bits((u64)sbuf[i].paddr >> HAL_ADDR_MSB_REG_SHIFT,
+                                        HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
+                       le32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
+                                        HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG);
+
+               link_addr = (void *)sbuf[i].vaddr +
+                            HAL_WBM_IDLE_SCATTER_BUF_SIZE;
+       }
+
+       val = u32_encode_bits(reg_scatter_buf_sz, HAL_WBM_SCATTER_BUFFER_SIZE) |
+             u32_encode_bits(0x1, HAL_WBM_LINK_DESC_IDLE_LIST_MODE);
+
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_R0_IDLE_LIST_CONTROL_ADDR(hal),
+                          val);
+
+       val = u32_encode_bits(reg_scatter_buf_sz * nsbufs,
+                             HAL_WBM_SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_R0_IDLE_LIST_SIZE_ADDR(hal),
+                          val);
+
+       val = u32_encode_bits(sbuf[0].paddr & HAL_ADDR_LSB_REG_MASK,
+                             BUFFER_ADDR_INFO0_ADDR);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_RING_BASE_LSB(hal),
+                          val);
+
+       val = u32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
+                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG) |
+             u32_encode_bits((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT,
+                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_RING_BASE_MSB(hal),
+                          val);
+
+       /* Setup head and tail pointers for the idle list */
+       val = u32_encode_bits(sbuf[nsbufs - 1].paddr, BUFFER_ADDR_INFO0_ADDR);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(hal),
+                          val);
+
+       val = u32_encode_bits(((u64)sbuf[nsbufs - 1].paddr >> HAL_ADDR_MSB_REG_SHIFT),
+                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
+              u32_encode_bits((end_offset >> 2),
+                              HAL_WBM_SCATTERED_DESC_HEAD_P_OFFSET_IX1);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX1(hal),
+                          val);
+
+       val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(hal),
+                          val);
+
+       val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX0(hal),
+                          val);
+
+       val = u32_encode_bits(((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT),
+                             HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
+             u32_encode_bits(0, HAL_WBM_SCATTERED_DESC_TAIL_P_OFFSET_IX1);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX1(hal),
+                          val);
+
+       val = 2 * tot_link_desc;
+       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_SCATTERED_DESC_PTR_HP_ADDR(hal),
+                          val);
+
+       /* Enable the SRNG */
+       val = u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE) |
+             u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_RIND_ID_DISABLE);
+       ath12k_hif_write32(ab,
+                          HAL_SEQ_WCSS_UMAC_WBM_REG +
+                          HAL_WBM_IDLE_LINK_RING_MISC_ADDR(hal),
+                          val);
+}
+
+void ath12k_wifi7_hal_tx_configure_bank_register(struct ath12k_base *ab,
+                                                u32 bank_config,
+                                                u8 bank_id)
+{
+       ath12k_hif_write32(ab, HAL_TCL_SW_CONFIG_BANK_ADDR + 4 * bank_id,
+                          bank_config);
+}
+
+void ath12k_wifi7_hal_reoq_lut_addr_read_enable(struct ath12k_base *ab)
+{
+       struct ath12k_hal *hal = &ab->hal;
+
+       u32 val = ath12k_hif_read32(ab, HAL_SEQ_WCSS_UMAC_REO_REG +
+                                   HAL_REO1_QDESC_ADDR(hal));
+
+       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_QDESC_ADDR(hal),
+                          val | HAL_REO_QDESC_ADDR_READ_LUT_ENABLE);
+}
+
+void ath12k_wifi7_hal_reoq_lut_set_max_peerid(struct ath12k_base *ab)
+{
+       struct ath12k_hal *hal = &ab->hal;
+
+       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_QDESC_MAX_PEERID(hal),
+                          HAL_REO_QDESC_MAX_PEERID);
+}
+
+void ath12k_wifi7_hal_write_reoq_lut_addr(struct ath12k_base *ab,
+                                         dma_addr_t paddr)
+{
+       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG +
+                          HAL_REO1_QDESC_LUT_BASE0(&ab->hal), paddr);
+}
+
+void ath12k_wifi7_hal_write_ml_reoq_lut_addr(struct ath12k_base *ab,
+                                            dma_addr_t paddr)
+{
+       ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG +
+                          HAL_REO1_QDESC_LUT_BASE1(&ab->hal), paddr);
+}
index 308f80427676867b4dc17227934b8735f23a4cd5..6e67f06ffa4387a86b775c29ee835624d794c7c4 100644 (file)
@@ -34,4 +34,15 @@ ath12k_wifi7_hal_set_link_desc_addr(struct hal_wbm_link_desc *desc,
                                    enum hal_rx_buf_return_buf_manager rbm);
 u32
 ath12k_wifi7_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc *desc);
+void
+ath12k_wifi7_hal_setup_link_idle_list(struct ath12k_base *ab,
+                                     struct hal_wbm_idle_scatter_list *sbuf,
+                                     u32 nsbufs, u32 tot_link_desc,
+                                     u32 end_offset);
+void ath12k_wifi7_hal_reoq_lut_addr_read_enable(struct ath12k_base *ab);
+void ath12k_wifi7_hal_reoq_lut_set_max_peerid(struct ath12k_base *ab);
+void ath12k_wifi7_hal_write_reoq_lut_addr(struct ath12k_base *ab,
+                                         dma_addr_t paddr);
+void ath12k_wifi7_hal_write_ml_reoq_lut_addr(struct ath12k_base *ab,
+                                            dma_addr_t paddr);
 #endif
index b764d5cd8aeb6cf1ace3c17686efa1886e690dcb..9cbae6d11dd8413e9ccfa7af82238fecd72ec867 100644 (file)
@@ -7,6 +7,7 @@
 #include "hal_qcn9274.h"
 #include "hw.h"
 #include "hal.h"
+#include "hal_tx.h"
 
 static const struct hal_srng_config hw_srng_config_template[] = {
        /* TODO: max_rings can populated by querying HW capabilities */
@@ -1011,5 +1012,13 @@ const struct hal_ops hal_qcn9274_ops = {
        .ce_dst_set_desc = ath12k_wifi7_hal_ce_dst_set_desc,
        .ce_dst_status_get_length = ath12k_wifi7_hal_ce_dst_status_get_length,
        .set_link_desc_addr = ath12k_wifi7_hal_set_link_desc_addr,
+       .tx_set_dscp_tid_map = ath12k_wifi7_hal_tx_set_dscp_tid_map,
+       .tx_configure_bank_register =
+                               ath12k_wifi7_hal_tx_configure_bank_register,
+       .reoq_lut_addr_read_enable = ath12k_wifi7_hal_reoq_lut_addr_read_enable,
+       .reoq_lut_set_max_peerid = ath12k_wifi7_hal_reoq_lut_set_max_peerid,
+       .write_reoq_lut_addr = ath12k_wifi7_hal_write_reoq_lut_addr,
+       .write_ml_reoq_lut_addr = ath12k_wifi7_hal_write_ml_reoq_lut_addr,
+       .setup_link_idle_list = ath12k_wifi7_hal_setup_link_idle_list,
 };
 EXPORT_SYMBOL(hal_qcn9274_ops);
index 027e02141ec2c7e421b509d59fef6f5205459749..24f905c5b0624f383124ad3d6a093eb8019315a5 100644 (file)
@@ -136,11 +136,3 @@ void ath12k_wifi7_hal_tx_set_dscp_tid_map(struct ath12k_base *ab, int id)
                           HAL_TCL1_RING_CMN_CTRL_REG,
                           ctrl_reg_val);
 }
-
-void ath12k_wifi7_hal_tx_configure_bank_register(struct ath12k_base *ab,
-                                                u32 bank_config,
-                                                u8 bank_id)
-{
-       ath12k_hif_write32(ab, HAL_TCL_SW_CONFIG_BANK_ADDR + 4 * bank_id,
-                          bank_config);
-}
index d0f6a174f347ce73450c31493dd437e36922dcb3..07392b31d0ab91b49fef6063496faa2ce8807ba6 100644 (file)
@@ -181,13 +181,14 @@ struct hal_tx_fes_status_end {
 /* STA mode will have MCAST_PKT_CTRL instead of DSCP_TID_MAP bitfield */
 #define HAL_TX_BANK_CONFIG_DSCP_TIP_MAP_ID     GENMASK(22, 17)
 
+void ath12k_wifi7_hal_tx_set_dscp_tid_map(struct ath12k_base *ab, int id);
 void ath12k_wifi7_hal_tx_cmd_desc_setup(struct ath12k_base *ab,
                                        struct hal_tcl_data_cmd *tcl_cmd,
                                        struct hal_tx_info *ti);
-void ath12k_wifi7_hal_tx_set_dscp_tid_map(struct ath12k_base *ab, int id);
 int ath12k_wifi7_hal_reo_cmd_send(struct ath12k_base *ab, struct hal_srng *srng,
                                  enum hal_reo_cmd_type type,
                                  struct ath12k_hal_reo_cmd *cmd);
 void ath12k_wifi7_hal_tx_configure_bank_register(struct ath12k_base *ab,
-                                                u32 bank_config, u8 bank_id);
+                                                u32 bank_config,
+                                                u8 bank_id);
 #endif
index 0985f929a4b58bff14360f22248f68d1a029da57..2e645f8f4a144ee6e5439e205ee22ef08a524d38 100644 (file)
@@ -8,6 +8,7 @@
 #include "hal_wcn7850.h"
 #include "hw.h"
 #include "hal.h"
+#include "hal_tx.h"
 
 static const struct hal_srng_config hw_srng_config_template[] = {
        /* TODO: max_rings can populated by querying HW capabilities */
@@ -826,5 +827,13 @@ const struct hal_ops hal_wcn7850_ops = {
        .ce_dst_set_desc = ath12k_wifi7_hal_ce_dst_set_desc,
        .ce_dst_status_get_length = ath12k_wifi7_hal_ce_dst_status_get_length,
        .set_link_desc_addr = ath12k_wifi7_hal_set_link_desc_addr,
+       .tx_set_dscp_tid_map = ath12k_wifi7_hal_tx_set_dscp_tid_map,
+       .tx_configure_bank_register =
+               ath12k_wifi7_hal_tx_configure_bank_register,
+       .reoq_lut_addr_read_enable = ath12k_wifi7_hal_reoq_lut_addr_read_enable,
+       .reoq_lut_set_max_peerid = ath12k_wifi7_hal_reoq_lut_set_max_peerid,
+       .write_reoq_lut_addr = ath12k_wifi7_hal_write_reoq_lut_addr,
+       .write_ml_reoq_lut_addr = ath12k_wifi7_hal_write_ml_reoq_lut_addr,
+       .setup_link_idle_list = ath12k_wifi7_hal_setup_link_idle_list,
 };
 EXPORT_SYMBOL(hal_wcn7850_ops);