[PATCH ath12k-ng 09/18] wifi: ath12k: Move HAL SRNG shadow config and get ring id APIs to wifi7 directory
Ripan Deuri
quic_rdeuri at quicinc.com
Thu Oct 9 04:10:36 PDT 2025
From: Pavankumar Nandeshwar <quic_pnandesh at quicinc.com>
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 at quicinc.com>
Signed-off-by: Ripan Deuri <quic_rdeuri at quicinc.com>
---
drivers/net/wireless/ath/ath12k/hal.c | 101 +++---------------
drivers/net/wireless/ath/ath12k/hal.h | 5 +
drivers/net/wireless/ath/ath12k/wifi7/hal.c | 86 +++++++++++++++
drivers/net/wireless/ath/ath12k/wifi7/hal.h | 6 ++
.../wireless/ath/ath12k/wifi7/hal_qcn9274.c | 2 +
.../wireless/ath/ath12k/wifi7/hal_wcn7850.c | 2 +
6 files changed, 117 insertions(+), 85 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/hal.c b/drivers/net/wireless/ath/ath12k/hal.c
index 67a7285dc769..d4dd83d9e67f 100644
--- a/drivers/net/wireless/ath/ath12k/hal.c
+++ b/drivers/net/wireless/ath/ath12k/hal.c
@@ -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;
diff --git a/drivers/net/wireless/ath/ath12k/hal.h b/drivers/net/wireless/ath/ath12k/hal.h
index 32c6a7d5ea99..774322f1f670 100644
--- a/drivers/net/wireless/ath/ath12k/hal.h
+++ b/drivers/net/wireless/ath/ath12k/hal.h
@@ -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);
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal.c b/drivers/net/wireless/ath/ath12k/wifi7/hal.c
index 2b81d70e60df..565f43a30deb 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal.c
@@ -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;
+}
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal.h b/drivers/net/wireless/ath/ath12k/wifi7/hal.h
index 044ed1dce323..1ea7b025ed71 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal.h
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal.h
@@ -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
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
index 070e28a38a70..92769a525c6d 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
@@ -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);
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c
index 9d1f94db60bd..a941bb4783ae 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c
@@ -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);
--
2.34.1
More information about the ath12k
mailing list