[PATCH ath-next 07/15] wifi: ath12k: add Wi-Fi 8 HAL register table and hal init hook for QCN9575
From: Madhavan Ganesan
Date: Thu Nov 12 2026 - 03:49:38 EST
QCN9575 uses a different HAL register layout from Wi-Fi 7 and requires a
dedicated register table and HAL init path. Add QCN9575-specific HAL
register definitions in wifi8/hal_qcn9575.c (qcn9575_regs) and its
header. Add wifi8/hal.c with an ath12k_hw_version_map entry that points
ATH12K_HW_QCN9575_HW20 to qcn9575_regs, and introduce
ath12k_wifi8_hal_init(). Invoke ath12k_wifi8_hal_init() from
ath12k_wifi8_hw_init() so HAL setup is hooked into the Wi-Fi 8 hardware
init path. Keep HAL ops and params fields as NULL placeholders;
follow-up patches fill operation tables and remaining HAL parameters.
Update wifi8/Makefile to build hal.c and hal_qcn9575.c.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.6-01243-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c7-00108-QCAHMTSWPL_V1.0_V2.0_SILICONZ_UPSTREAM-3
Signed-off-by: Madhavan Ganesan <madhavan.ganesan@xxxxxxxxxxxxxxxx>
---
drivers/net/wireless/ath/ath12k/wifi8/Makefile | 2 ++
drivers/net/wireless/ath/ath12k/wifi8/hal.c | 23 ++++++++++++
drivers/net/wireless/ath/ath12k/wifi8/hal.h | 13 +++++++
.../net/wireless/ath/ath12k/wifi8/hal_qcn9575.c | 42 ++++++++++++++++++++++
.../net/wireless/ath/ath12k/wifi8/hal_qcn9575.h | 13 +++++++
drivers/net/wireless/ath/ath12k/wifi8/hw.c | 3 ++
6 files changed, 96 insertions(+)
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/Makefile b/drivers/net/wireless/ath/ath12k/wifi8/Makefile
index 277b5f13754d..b1b90c109c76 100644
--- a/drivers/net/wireless/ath/ath12k/wifi8/Makefile
+++ b/drivers/net/wireless/ath/ath12k/wifi8/Makefile
@@ -1,5 +1,7 @@
# SPDX-License-Identifier: BSD-3-Clause-Clear
obj-$(CONFIG_ATH12K) += ath12k_wifi8.o
ath12k_wifi8-y += core.o \
+ hal.o \
+ hal_qcn9575.o \
hw.o \
pci.o
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hal.c b/drivers/net/wireless/ath/ath12k/wifi8/hal.c
new file mode 100644
index 000000000000..1afc6fc21d0f
--- /dev/null
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hal.c
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: BSD-3-Clause-Clear
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+#include "../hal.h"
+#include "../hif.h"
+#include "hal.h"
+#include "hal_qcn9575.h"
+
+static const struct ath12k_hw_version_map ath12k_wifi8_hw_ver_map[] = {
+ [ATH12K_HW_QCN9575_HW20] = {
+ .hw_regs = &qcn9575_regs,
+ },
+};
+
+void ath12k_wifi8_hal_init(struct ath12k_base *ab)
+{
+ struct ath12k_hal *hal = &ab->hal;
+
+ memset(hal, 0, sizeof(*hal));
+
+ hal->regs = ath12k_wifi8_hw_ver_map[ab->hw_rev].hw_regs;
+}
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hal.h b/drivers/net/wireless/ath/ath12k/wifi8/hal.h
new file mode 100644
index 000000000000..311fc5b8015c
--- /dev/null
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hal.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: BSD-3-Clause-Clear */
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef ATH12K_WIFI8_HAL_H
+#define ATH12K_WIFI8_HAL_H
+
+#include "../core.h"
+
+void ath12k_wifi8_hal_init(struct ath12k_base *ab);
+
+#endif /* ATH12K_WIFI8_HAL_H */
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hal_qcn9575.c b/drivers/net/wireless/ath/ath12k/wifi8/hal_qcn9575.c
new file mode 100644
index 000000000000..56d45785ecd4
--- /dev/null
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hal_qcn9575.c
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: BSD-3-Clause-Clear
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+#include "hal_qcn9575.h"
+
+const struct ath12k_hw_regs qcn9575_regs = {
+ /* SW2TCL(x) R0 ring configuration address */
+ .tcl1_ring_id = 0x00001604,
+ .tcl1_ring_misc = 0x0000160c,
+ .tcl1_ring_tp_addr_lsb = 0x00001618,
+ .tcl1_ring_tp_addr_msb = 0x0000161c,
+ .tcl1_ring_consumer_int_setup_ix0 = 0x0000162c,
+ .tcl1_ring_consumer_int_setup_ix1 = 0x00001630,
+ .tcl1_ring_msi1_base_lsb = 0x00001644,
+ .tcl1_ring_msi1_base_msb = 0x00001648,
+ .tcl1_ring_msi1_data = 0x0000164c,
+ .tcl1_ring_base_lsb = 0x000015fc,
+ .tcl1_ring_base_msb = 0x00001600,
+
+ /* REO DEST ring address */
+ .reo1_ring_base_lsb = 0x00000848,
+ .reo1_ring_base_msb = 0x0000084c,
+ .reo1_ring_id = 0x00000850,
+ .reo1_ring_misc = 0x00000858,
+ .reo1_ring_hp_addr_lsb = 0x0000085c,
+ .reo1_ring_hp_addr_msb = 0x00000860,
+ .reo1_ring_producer_int_setup = 0x0000086c,
+ .reo1_ring_msi1_base_lsb = 0x00000890,
+ .reo1_ring_msi1_base_msb = 0x00000894,
+ .reo1_ring_msi1_data = 0x00000898,
+
+ /* CE base address */
+ .umac_ce0_src_reg_base = 0x01b80000,
+ .umac_ce0_dest_reg_base = 0x01b81000,
+ .umac_ce1_src_reg_base = 0x01b82000,
+ .umac_ce1_dest_reg_base = 0x01b83000,
+
+ .gcc_gcc_pcie_hot_rst = 0x1e38438,
+
+ .qrtr_node_id = 0x01e03300,
+};
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hal_qcn9575.h b/drivers/net/wireless/ath/ath12k/wifi8/hal_qcn9575.h
new file mode 100644
index 000000000000..e2dd68ebd82f
--- /dev/null
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hal_qcn9575.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: BSD-3-Clause-Clear */
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef ATH12K_WIFI8_HAL_QCN9575_H
+#define ATH12K_WIFI8_HAL_QCN9575_H
+
+#include "../hal.h"
+
+extern const struct ath12k_hw_regs qcn9575_regs;
+
+#endif /* ATH12K_WIFI8_HAL_QCN9575_H */
diff --git a/drivers/net/wireless/ath/ath12k/wifi8/hw.c b/drivers/net/wireless/ath/ath12k/wifi8/hw.c
index 6e89a42111b6..91d8f762e642 100644
--- a/drivers/net/wireless/ath/ath12k/wifi8/hw.c
+++ b/drivers/net/wireless/ath/ath12k/wifi8/hw.c
@@ -11,6 +11,7 @@
#include "../debug.h"
#include "../hw.h"
#include "../mhi.h"
+#include "hal.h"
#include "hw.h"
static const struct ath12k_hw_params ath12k_wifi8_hw_params[] = {
@@ -129,6 +130,8 @@ int ath12k_wifi8_hw_init(struct ath12k_base *ab)
ab->hw_params = hw_params;
+ ath12k_wifi8_hal_init(ab);
+
ath12k_info(ab, "Wi-Fi 8 Hardware name: %s\n", ab->hw_params->name);
return 0;
--
2.34.1