]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: Move HAL SRNG shadow config and get ring id APIs to wifi7 directory
authorPavankumar Nandeshwar <quic_pnandesh@quicinc.com>
Thu, 9 Oct 2025 11:10:36 +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_srng_update_shadow_config
ath12k_wifi7_hal_srng_get_ring_id

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-10-quic_rdeuri@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
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_wcn7850.c

index 67a7285dc769744ba5d6da2f6e3af3b589899024..d4dd83d9e67f60ad0966a7b2548baa1fac90fc41 100644 (file)
@@ -36,6 +36,21 @@ static void ath12k_hal_set_umac_srng_ptr_addr(struct ath12k_base *ab,
        ab->hal.hal_ops->set_umac_srng_ptr_addr(ab, srng);
 }
 
+static int ath12k_hal_srng_get_ring_id(struct ath12k_hal *hal,
+                                      enum hal_ring_type type,
+                                      int ring_num, int mac_id)
+{
+       return hal->hal_ops->srng_get_ring_id(hal, type, ring_num, mac_id);
+}
+
+int ath12k_hal_srng_update_shadow_config(struct ath12k_base *ab,
+                                        enum hal_ring_type ring_type,
+                                        int ring_num)
+{
+       return ab->hal.hal_ops->srng_update_shadow_config(ab, ring_type,
+                                                         ring_num);
+}
+
 static int ath12k_hal_alloc_cont_rdp(struct ath12k_hal *hal)
 {
        size_t size;
@@ -97,28 +112,6 @@ static void ath12k_hal_srng_hw_init(struct ath12k_base *ab,
                ath12k_hal_srng_dst_hw_init(ab, srng);
 }
 
-static int ath12k_hal_srng_get_ring_id(struct ath12k_base *ab,
-                                      enum hal_ring_type type,
-                                      int ring_num, int mac_id)
-{
-       struct hal_srng_config *srng_config = &ab->hal.srng_config[type];
-       int ring_id;
-
-       if (ring_num >= srng_config->max_rings) {
-               ath12k_warn(ab, "invalid ring number :%d\n", ring_num);
-               return -EINVAL;
-       }
-
-       ring_id = srng_config->start_ring_id + ring_num;
-       if (srng_config->mac_type == ATH12K_HAL_SRNG_PMAC)
-               ring_id += mac_id * HAL_SRNG_RINGS_PER_PMAC;
-
-       if (WARN_ON(ring_id >= HAL_SRNG_RING_ID_MAX))
-               return -EINVAL;
-
-       return ring_id;
-}
-
 int ath12k_hal_srng_get_entrysize(struct ath12k_base *ab, u32 ring_type)
 {
        struct hal_srng_config *srng_config;
@@ -619,7 +612,7 @@ int ath12k_hal_srng_setup(struct ath12k_base *ab, enum hal_ring_type type,
        u32 idx;
        int i;
 
-       ring_id = ath12k_hal_srng_get_ring_id(ab, type, ring_num, mac_id);
+       ring_id = ath12k_hal_srng_get_ring_id(hal, type, ring_num, mac_id);
        if (ring_id < 0)
                return ring_id;
 
@@ -706,68 +699,6 @@ int ath12k_hal_srng_setup(struct ath12k_base *ab, enum hal_ring_type type,
        return ring_id;
 }
 
-static void ath12k_hal_srng_update_hp_tp_addr(struct ath12k_base *ab,
-                                             int shadow_cfg_idx,
-                                             enum hal_ring_type ring_type,
-                                             int ring_num)
-{
-       struct hal_srng *srng;
-       struct ath12k_hal *hal = &ab->hal;
-       int ring_id;
-       struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
-
-       ring_id = ath12k_hal_srng_get_ring_id(ab, ring_type, ring_num, 0);
-       if (ring_id < 0)
-               return;
-
-       srng = &hal->srng_list[ring_id];
-
-       if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
-               srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
-                                                  (unsigned long)ab->mem);
-       else
-               srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
-                                                  (unsigned long)ab->mem);
-}
-
-int ath12k_hal_srng_update_shadow_config(struct ath12k_base *ab,
-                                        enum hal_ring_type ring_type,
-                                        int ring_num)
-{
-       struct ath12k_hal *hal = &ab->hal;
-       struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
-       int shadow_cfg_idx = hal->num_shadow_reg_configured;
-       u32 target_reg;
-
-       if (shadow_cfg_idx >= HAL_SHADOW_NUM_REGS)
-               return -EINVAL;
-
-       hal->num_shadow_reg_configured++;
-
-       target_reg = srng_config->reg_start[HAL_HP_OFFSET_IN_REG_START];
-       target_reg += srng_config->reg_size[HAL_HP_OFFSET_IN_REG_START] *
-               ring_num;
-
-       /* For destination ring, shadow the TP */
-       if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
-               target_reg += HAL_OFFSET_FROM_HP_TO_TP;
-
-       hal->shadow_reg_addr[shadow_cfg_idx] = target_reg;
-
-       /* update hp/tp addr to hal structure*/
-       ath12k_hal_srng_update_hp_tp_addr(ab, shadow_cfg_idx, ring_type,
-                                         ring_num);
-
-       ath12k_dbg(ab, ATH12K_DBG_HAL,
-                  "target_reg %x, shadow reg 0x%x shadow_idx 0x%x, ring_type %d, ring num %d",
-                 target_reg,
-                 HAL_SHADOW_REG(shadow_cfg_idx),
-                 shadow_cfg_idx,
-                 ring_type, ring_num);
-
-       return 0;
-}
-
 void ath12k_hal_srng_shadow_config(struct ath12k_base *ab)
 {
        struct ath12k_hal *hal = &ab->hal;
index 32c6a7d5ea992a15886046e7f1a1351c8dc76dbe..774322f1f67076ed6c2d70369053bc072798e14c 100644 (file)
@@ -1702,6 +1702,11 @@ struct hal_ops {
                                       struct hal_srng *srng);
        void (*srng_src_hw_init)(struct ath12k_base *ab, struct hal_srng *srng);
        void (*srng_dst_hw_init)(struct ath12k_base *ab, struct hal_srng *srng);
+       int (*srng_update_shadow_config)(struct ath12k_base *ab,
+                                        enum hal_ring_type ring_type,
+                                        int ring_num);
+       int (*srng_get_ring_id)(struct ath12k_hal *hal, enum hal_ring_type type,
+                               int ring_num, int mac_id);
 };
 
 u32 ath12k_wifi7_hal_reo_qdesc_size(u32 ba_window_size, u8 tid);
index 2b81d70e60df87f95624d8d2b23877dc39bdd371..565f43a30deb94da224e14e07d893a27975b2400 100644 (file)
@@ -333,3 +333,89 @@ void ath12k_wifi7_hal_set_umac_srng_ptr_addr(struct ath12k_base *ab,
                }
        }
 }
+
+int ath12k_wifi7_hal_srng_get_ring_id(struct ath12k_hal *hal,
+                                     enum hal_ring_type type,
+                                     int ring_num, int mac_id)
+{
+       struct hal_srng_config *srng_config = &hal->srng_config[type];
+       int ring_id;
+
+       if (ring_num >= srng_config->max_rings) {
+               ath12k_warn(hal, "invalid ring number :%d\n", ring_num);
+               return -EINVAL;
+       }
+
+       ring_id = srng_config->start_ring_id + ring_num;
+       if (srng_config->mac_type == ATH12K_HAL_SRNG_PMAC)
+               ring_id += mac_id * HAL_SRNG_RINGS_PER_PMAC;
+
+       if (WARN_ON(ring_id >= HAL_SRNG_RING_ID_MAX))
+               return -EINVAL;
+
+       return ring_id;
+}
+
+static
+void ath12k_wifi7_hal_srng_update_hp_tp_addr(struct ath12k_base *ab,
+                                            int shadow_cfg_idx,
+                                            enum hal_ring_type ring_type,
+                                            int ring_num)
+{
+       struct hal_srng *srng;
+       struct ath12k_hal *hal = &ab->hal;
+       int ring_id;
+       struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
+
+       ring_id = ath12k_wifi7_hal_srng_get_ring_id(hal, ring_type, ring_num,
+                                                   0);
+       if (ring_id < 0)
+               return;
+
+       srng = &hal->srng_list[ring_id];
+
+       if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
+               srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
+                                                  (unsigned long)ab->mem);
+       else
+               srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
+                                                  (unsigned long)ab->mem);
+}
+
+int ath12k_wifi7_hal_srng_update_shadow_config(struct ath12k_base *ab,
+                                              enum hal_ring_type ring_type,
+                                              int ring_num)
+{
+       struct ath12k_hal *hal = &ab->hal;
+       struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
+       int shadow_cfg_idx = hal->num_shadow_reg_configured;
+       u32 target_reg;
+
+       if (shadow_cfg_idx >= HAL_SHADOW_NUM_REGS)
+               return -EINVAL;
+
+       hal->num_shadow_reg_configured++;
+
+       target_reg = srng_config->reg_start[HAL_HP_OFFSET_IN_REG_START];
+       target_reg += srng_config->reg_size[HAL_HP_OFFSET_IN_REG_START] *
+               ring_num;
+
+       /* For destination ring, shadow the TP */
+       if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
+               target_reg += HAL_OFFSET_FROM_HP_TO_TP;
+
+       hal->shadow_reg_addr[shadow_cfg_idx] = target_reg;
+
+       /* update hp/tp addr to hal structure*/
+       ath12k_wifi7_hal_srng_update_hp_tp_addr(ab, shadow_cfg_idx, ring_type,
+                                               ring_num);
+
+       ath12k_dbg(ab, ATH12K_DBG_HAL,
+                  "target_reg %x, shadow reg 0x%x shadow_idx 0x%x, ring_type %d, ring num %d",
+                 target_reg,
+                 HAL_SHADOW_REG(shadow_cfg_idx),
+                 shadow_cfg_idx,
+                 ring_type, ring_num);
+
+       return 0;
+}
index 044ed1dce323fbdc0ede1fdbdb914780c30a830a..1ea7b025ed7134abb6b22a1ed9ad0bb2b09713c2 100644 (file)
@@ -16,4 +16,10 @@ void ath12k_wifi7_hal_srng_src_hw_init(struct ath12k_base *ab,
                                       struct hal_srng *srng);
 void ath12k_wifi7_hal_set_umac_srng_ptr_addr(struct ath12k_base *ab,
                                             struct hal_srng *srng);
+int ath12k_wifi7_hal_srng_update_shadow_config(struct ath12k_base *ab,
+                                              enum hal_ring_type ring_type,
+                                              int ring_num);
+int ath12k_wifi7_hal_srng_get_ring_id(struct ath12k_hal *hal,
+                                     enum hal_ring_type type,
+                                     int ring_num, int mac_id);
 #endif
index 070e28a38a70e70237b6c21a3b4a073fdcd5c8a3..92769a525c6d251590793e8c0f2166754b2e2741 100644 (file)
@@ -1004,5 +1004,7 @@ const struct hal_ops hal_qcn9274_ops = {
        .srng_src_hw_init = ath12k_wifi7_hal_srng_src_hw_init,
        .srng_dst_hw_init = ath12k_wifi7_hal_srng_dst_hw_init,
        .set_umac_srng_ptr_addr = ath12k_wifi7_hal_set_umac_srng_ptr_addr,
+       .srng_update_shadow_config = ath12k_wifi7_hal_srng_update_shadow_config,
+       .srng_get_ring_id = ath12k_wifi7_hal_srng_get_ring_id,
 };
 EXPORT_SYMBOL(hal_qcn9274_ops);
index 9d1f94db60bd4fc0ac86f744808e844d7a319c60..a941bb4783ae4386630ecf1b2ff3a33c07138fd4 100644 (file)
@@ -819,5 +819,7 @@ const struct hal_ops hal_wcn7850_ops = {
        .srng_src_hw_init = ath12k_wifi7_hal_srng_src_hw_init,
        .srng_dst_hw_init = ath12k_wifi7_hal_srng_dst_hw_init,
        .set_umac_srng_ptr_addr = ath12k_wifi7_hal_set_umac_srng_ptr_addr,
+       .srng_update_shadow_config = ath12k_wifi7_hal_srng_update_shadow_config,
+       .srng_get_ring_id = ath12k_wifi7_hal_srng_get_ring_id,
 };
 EXPORT_SYMBOL(hal_wcn7850_ops);