[PATCH ath-next] wifi: ath12k: fix GCC_GCC_PCIE_HOT_RST definition for WCN7850
Parth Panchoil
parth105105 at gmail.com
Fri May 23 06:48:26 PDT 2025
Thanks Baochen for the patch.
This patch fixes a bug in older kernels, so it should be backported.
Minor correction needed on the reported tag.
Tested on TI AM69 SK board with SX-PCEBE (WCN7850) Wi-Fi module and did
not observe the reported crash anymore.
Cc: stable at vger.kernel.org
Reported-by: Parth Pancholi <parth.pancholi at toradex.com>
Tested-by: Parth Pancholi <parth.pancholi at toradex.com>
Regards,
Parth P
> GCC_GCC_PCIE_HOT_RST is wrongly defined for WCN7850, causing kernel
> crash
> on some specific platforms.
>
> Since this register is divergent for WCN7850 and QCN9274, move it to
> register table to allow different definitions. Then correct the
> register
> address for WCN7850 to fix this issue.
>
> Note IPQ5332 is not affected as it is not PCIe based device.
>
> Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-
> QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
>
> Reported-by: Parth Panchoil <parth105105 at gmail.com>
> Closes:
> https://lore.kernel.org/all/86899b2235a59c9134603beebe08f2bb0b244ea0.camel@gmail.com
> Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7
> devices")
> Signed-off-by: Baochen Qiang <quic_bqiang at quicinc.com>
> ---
> ---
> drivers/net/wireless/ath/ath12k/hw.c | 6 ++++++
> drivers/net/wireless/ath/ath12k/hw.h | 2 ++
> drivers/net/wireless/ath/ath12k/pci.c | 6 +++---
> drivers/net/wireless/ath/ath12k/pci.h | 4 +++-
> 4 files changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath12k/hw.c
> b/drivers/net/wireless/ath/ath12k/hw.c
> index
> 7e2cf0fb2085ab014fc14a5c81074802674b154e..8254dc10b53bbfb54a44c7ff2f7
> 05c72461d1031 100644
> --- a/drivers/net/wireless/ath/ath12k/hw.c
> +++ b/drivers/net/wireless/ath/ath12k/hw.c
> @@ -951,6 +951,8 @@ static const struct ath12k_hw_regs
> qcn9274_v1_regs = {
> .hal_umac_ce0_dest_reg_base = 0x01b81000,
> .hal_umac_ce1_src_reg_base = 0x01b82000,
> .hal_umac_ce1_dest_reg_base = 0x01b83000,
> +
> + .gcc_gcc_pcie_hot_rst = 0x1e38338,
> };
>
> static const struct ath12k_hw_regs qcn9274_v2_regs = {
> @@ -1042,6 +1044,8 @@ static const struct ath12k_hw_regs
> qcn9274_v2_regs = {
> .hal_umac_ce0_dest_reg_base = 0x01b81000,
> .hal_umac_ce1_src_reg_base = 0x01b82000,
> .hal_umac_ce1_dest_reg_base = 0x01b83000,
> +
> + .gcc_gcc_pcie_hot_rst = 0x1e38338,
> };
>
> static const struct ath12k_hw_regs ipq5332_regs = {
> @@ -1215,6 +1219,8 @@ static const struct ath12k_hw_regs wcn7850_regs
> = {
> .hal_umac_ce0_dest_reg_base = 0x01b81000,
> .hal_umac_ce1_src_reg_base = 0x01b82000,
> .hal_umac_ce1_dest_reg_base = 0x01b83000,
> +
> + .gcc_gcc_pcie_hot_rst = 0x1e40304,
> };
>
> static const struct ath12k_hw_hal_params
> ath12k_hw_hal_params_qcn9274 = {
> diff --git a/drivers/net/wireless/ath/ath12k/hw.h
> b/drivers/net/wireless/ath/ath12k/hw.h
> index
> 0fbc17649df463334aa0ebb3da407115985335ca..0a75bc5abfa2410ab3c7b6ce038
> f4d5f6445ecf9 100644
> --- a/drivers/net/wireless/ath/ath12k/hw.h
> +++ b/drivers/net/wireless/ath/ath12k/hw.h
> @@ -375,6 +375,8 @@ struct ath12k_hw_regs {
> u32 hal_reo_cmd_ring_base;
>
> u32 hal_reo_status_ring_base;
> +
> + u32 gcc_gcc_pcie_hot_rst;
> };
>
> static inline const char *ath12k_bd_ie_type_str(enum
> ath12k_bd_ie_type type)
> diff --git a/drivers/net/wireless/ath/ath12k/pci.c
> b/drivers/net/wireless/ath/ath12k/pci.c
> index
> 489d546390fcdab8f615cc9184006a958d9f140a..1f3cfd9b89fdcfd84731ec90c9c
> 678b0c477a2af 100644
> --- a/drivers/net/wireless/ath/ath12k/pci.c
> +++ b/drivers/net/wireless/ath/ath12k/pci.c
> @@ -292,10 +292,10 @@ static void ath12k_pci_enable_ltssm(struct
> ath12k_base *ab)
>
> ath12k_dbg(ab, ATH12K_DBG_PCI, "pci ltssm 0x%x\n", val);
>
> - val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST);
> + val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST(ab));
> val |= GCC_GCC_PCIE_HOT_RST_VAL;
> - ath12k_pci_write32(ab, GCC_GCC_PCIE_HOT_RST, val);
> - val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST);
> + ath12k_pci_write32(ab, GCC_GCC_PCIE_HOT_RST(ab), val);
> + val = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST(ab));
>
> ath12k_dbg(ab, ATH12K_DBG_PCI, "pci pcie_hot_rst 0x%x\n",
> val);
>
> diff --git a/drivers/net/wireless/ath/ath12k/pci.h
> b/drivers/net/wireless/ath/ath12k/pci.h
> index
> 0b4c459d6d8eabb0773162e6bb3ca666c0a8f15a..d1ec8aad7f6c3b6f5cbdf8ce57a
> 4106733686521 100644
> --- a/drivers/net/wireless/ath/ath12k/pci.h
> +++ b/drivers/net/wireless/ath/ath12k/pci.h
> @@ -28,7 +28,9 @@
> #define PCIE_PCIE_PARF_LTSSM 0x1e081b0
> #define PARM_LTSSM_VALUE 0x111
>
> -#define GCC_GCC_PCIE_HOT_RST 0x1e38338
> +#define GCC_GCC_PCIE_HOT_RST(ab) \
> + ((ab)->hw_params->regs->gcc_gcc_pcie_hot_rst)
> +
> #define GCC_GCC_PCIE_HOT_RST_VAL 0x10
>
> #define PCIE_PCIE_INT_ALL_CLEAR 0x1e08228
>
> ---
> base-commit: 3d933084a072fd5fb5da54c06a017abc0412c86f
> change-id: 20250506-ath12k-wrong-global-reset-addr-b75ddc6e7850
>
> Best regards,
More information about the ath12k
mailing list