Synchronize the ath11k backports with the current ath-next tree.
All of the changes are various bugfixes, there is no new major feature.
Notable bugfixes are:
* WCN6855 board name fixes
* One MSI vector booting is working again
This is rather important for most of the older platforms.
* DFS CAC state in virtual interfaces was fixed
* TX power during CAC reporting
Signed-off-by: Robert Marko <robimarko@gmail.com>
--- /dev/null
+From 1133af5aea588a58043244a4ecb5ce511b310356 Mon Sep 17 00:00:00 2001
+From: Wen Gong <quic_wgong@quicinc.com>
+Date: Wed, 30 Aug 2023 02:02:26 -0400
+Subject: [PATCH] wifi: ath11k: add chip id board name while searching
+ board-2.bin for WCN6855
+
+Sometimes board-2.bin does not have the board data which matched the
+parameters such as bus type, vendor, device, subsystem-vendor,
+subsystem-device, qmi-chip-id and qmi-board-id, then wlan will load fail.
+
+Hence add another type which only matches the bus type and qmi-chip-id,
+then the ratio of missing board data reduced.
+
+Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
+
+Signed-off-by: Wen Gong <quic_wgong@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230830060226.18664-1-quic_wgong@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/core.c | 108 ++++++++++++++++++++-----
+ 1 file changed, 87 insertions(+), 21 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/core.c
++++ b/drivers/net/wireless/ath/ath11k/core.c
+@@ -985,9 +985,15 @@ int ath11k_core_check_dt(struct ath11k_b
+ return 0;
+ }
+
++enum ath11k_bdf_name_type {
++ ATH11K_BDF_NAME_FULL,
++ ATH11K_BDF_NAME_BUS_NAME,
++ ATH11K_BDF_NAME_CHIP_ID,
++};
++
+ static int __ath11k_core_create_board_name(struct ath11k_base *ab, char *name,
+ size_t name_len, bool with_variant,
+- bool bus_type_mode)
++ enum ath11k_bdf_name_type name_type)
+ {
+ /* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */
+ char variant[9 + ATH11K_QMI_BDF_EXT_STR_LENGTH] = { 0 };
+@@ -998,11 +1004,8 @@ static int __ath11k_core_create_board_na
+
+ switch (ab->id.bdf_search) {
+ case ATH11K_BDF_SEARCH_BUS_AND_BOARD:
+- if (bus_type_mode)
+- scnprintf(name, name_len,
+- "bus=%s",
+- ath11k_bus_str(ab->hif.bus));
+- else
++ switch (name_type) {
++ case ATH11K_BDF_NAME_FULL:
+ scnprintf(name, name_len,
+ "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s",
+ ath11k_bus_str(ab->hif.bus),
+@@ -1012,6 +1015,19 @@ static int __ath11k_core_create_board_na
+ ab->qmi.target.chip_id,
+ ab->qmi.target.board_id,
+ variant);
++ break;
++ case ATH11K_BDF_NAME_BUS_NAME:
++ scnprintf(name, name_len,
++ "bus=%s",
++ ath11k_bus_str(ab->hif.bus));
++ break;
++ case ATH11K_BDF_NAME_CHIP_ID:
++ scnprintf(name, name_len,
++ "bus=%s,qmi-chip-id=%d",
++ ath11k_bus_str(ab->hif.bus),
++ ab->qmi.target.chip_id);
++ break;
++ }
+ break;
+ default:
+ scnprintf(name, name_len,
+@@ -1030,19 +1046,29 @@ static int __ath11k_core_create_board_na
+ static int ath11k_core_create_board_name(struct ath11k_base *ab, char *name,
+ size_t name_len)
+ {
+- return __ath11k_core_create_board_name(ab, name, name_len, true, false);
++ return __ath11k_core_create_board_name(ab, name, name_len, true,
++ ATH11K_BDF_NAME_FULL);
+ }
+
+ static int ath11k_core_create_fallback_board_name(struct ath11k_base *ab, char *name,
+ size_t name_len)
+ {
+- return __ath11k_core_create_board_name(ab, name, name_len, false, false);
++ return __ath11k_core_create_board_name(ab, name, name_len, false,
++ ATH11K_BDF_NAME_FULL);
+ }
+
+ static int ath11k_core_create_bus_type_board_name(struct ath11k_base *ab, char *name,
+ size_t name_len)
+ {
+- return __ath11k_core_create_board_name(ab, name, name_len, false, true);
++ return __ath11k_core_create_board_name(ab, name, name_len, false,
++ ATH11K_BDF_NAME_BUS_NAME);
++}
++
++static int ath11k_core_create_chip_id_board_name(struct ath11k_base *ab, char *name,
++ size_t name_len)
++{
++ return __ath11k_core_create_board_name(ab, name, name_len, false,
++ ATH11K_BDF_NAME_CHIP_ID);
+ }
+
+ const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab,
+@@ -1289,16 +1315,21 @@ int ath11k_core_fetch_board_data_api_1(s
+ #define BOARD_NAME_SIZE 200
+ int ath11k_core_fetch_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd)
+ {
+- char boardname[BOARD_NAME_SIZE], fallback_boardname[BOARD_NAME_SIZE];
++ char *boardname = NULL, *fallback_boardname = NULL, *chip_id_boardname = NULL;
+ char *filename, filepath[100];
+- int ret;
++ int ret = 0;
+
+ filename = ATH11K_BOARD_API2_FILE;
++ boardname = kzalloc(BOARD_NAME_SIZE, GFP_KERNEL);
++ if (!boardname) {
++ ret = -ENOMEM;
++ goto exit;
++ }
+
+- ret = ath11k_core_create_board_name(ab, boardname, sizeof(boardname));
++ ret = ath11k_core_create_board_name(ab, boardname, BOARD_NAME_SIZE);
+ if (ret) {
+ ath11k_err(ab, "failed to create board name: %d", ret);
+- return ret;
++ goto exit;
+ }
+
+ ab->bd_api = 2;
+@@ -1307,13 +1338,19 @@ int ath11k_core_fetch_bdf(struct ath11k_
+ ATH11K_BD_IE_BOARD_NAME,
+ ATH11K_BD_IE_BOARD_DATA);
+ if (!ret)
+- goto success;
++ goto exit;
++
++ fallback_boardname = kzalloc(BOARD_NAME_SIZE, GFP_KERNEL);
++ if (!fallback_boardname) {
++ ret = -ENOMEM;
++ goto exit;
++ }
+
+ ret = ath11k_core_create_fallback_board_name(ab, fallback_boardname,
+- sizeof(fallback_boardname));
++ BOARD_NAME_SIZE);
+ if (ret) {
+ ath11k_err(ab, "failed to create fallback board name: %d", ret);
+- return ret;
++ goto exit;
+ }
+
+ ret = ath11k_core_fetch_board_data_api_n(ab, bd, fallback_boardname,
+@@ -1321,7 +1358,28 @@ int ath11k_core_fetch_bdf(struct ath11k_
+ ATH11K_BD_IE_BOARD_NAME,
+ ATH11K_BD_IE_BOARD_DATA);
+ if (!ret)
+- goto success;
++ goto exit;
++
++ chip_id_boardname = kzalloc(BOARD_NAME_SIZE, GFP_KERNEL);
++ if (!chip_id_boardname) {
++ ret = -ENOMEM;
++ goto exit;
++ }
++
++ ret = ath11k_core_create_chip_id_board_name(ab, chip_id_boardname,
++ BOARD_NAME_SIZE);
++ if (ret) {
++ ath11k_err(ab, "failed to create chip id board name: %d", ret);
++ goto exit;
++ }
++
++ ret = ath11k_core_fetch_board_data_api_n(ab, bd, chip_id_boardname,
++ ATH11K_BD_IE_BOARD,
++ ATH11K_BD_IE_BOARD_NAME,
++ ATH11K_BD_IE_BOARD_DATA);
++
++ if (!ret)
++ goto exit;
+
+ ab->bd_api = 1;
+ ret = ath11k_core_fetch_board_data_api_1(ab, bd, ATH11K_DEFAULT_BOARD_FILE);
+@@ -1334,14 +1392,22 @@ int ath11k_core_fetch_bdf(struct ath11k_
+ ath11k_err(ab, "failed to fetch board data for %s from %s\n",
+ fallback_boardname, filepath);
+
++ ath11k_err(ab, "failed to fetch board data for %s from %s\n",
++ chip_id_boardname, filepath);
++
+ ath11k_err(ab, "failed to fetch board.bin from %s\n",
+ ab->hw_params.fw.dir);
+- return ret;
+ }
+
+-success:
+- ath11k_dbg(ab, ATH11K_DBG_BOOT, "using board api %d\n", ab->bd_api);
+- return 0;
++exit:
++ kfree(boardname);
++ kfree(fallback_boardname);
++ kfree(chip_id_boardname);
++
++ if (!ret)
++ ath11k_dbg(ab, ATH11K_DBG_BOOT, "using board api %d\n", ab->bd_api);
++
++ return ret;
+ }
+
+ int ath11k_core_fetch_regdb(struct ath11k_base *ab, struct ath11k_board_data *bd)
--- /dev/null
+From 39564b475ac5a589e6c22c43a08cbd283c295d2c Mon Sep 17 00:00:00 2001
+From: Baochen Qiang <quic_bqiang@quicinc.com>
+Date: Thu, 7 Sep 2023 09:56:06 +0800
+Subject: [PATCH] wifi: ath11k: fix boot failure with one MSI vector
+
+Commit 5b32b6dd96633 ("ath11k: Remove core PCI references from
+PCI common code") breaks with one MSI vector because it moves
+affinity setting after IRQ request, see below log:
+
+[ 1417.278835] ath11k_pci 0000:02:00.0: failed to receive control response completion, polling..
+[ 1418.302829] ath11k_pci 0000:02:00.0: Service connect timeout
+[ 1418.302833] ath11k_pci 0000:02:00.0: failed to connect to HTT: -110
+[ 1418.303669] ath11k_pci 0000:02:00.0: failed to start core: -110
+
+The detail is, if do affinity request after IRQ activated,
+which is done in request_irq(), kernel caches that request and
+returns success directly. Later when a subsequent MHI interrupt is
+fired, kernel will do the real affinity setting work, as a result,
+changs the MSI vector. However at that time host has configured
+old vector to hardware, so host never receives CE or DP interrupts.
+
+Fix it by setting affinity before registering MHI controller
+where host is, for the first time, doing IRQ request.
+
+Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
+Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
+Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-01160-QCAMSLSWPLZ-1
+
+Fixes: 5b32b6dd9663 ("ath11k: Remove core PCI references from PCI common code")
+Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230907015606.16297-1-quic_bqiang@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/pci.c | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/pci.c
++++ b/drivers/net/wireless/ath/ath11k/pci.c
+@@ -852,10 +852,16 @@ unsupported_wcn6855_soc:
+ if (ret)
+ goto err_pci_disable_msi;
+
++ ret = ath11k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
++ if (ret) {
++ ath11k_err(ab, "failed to set irq affinity %d\n", ret);
++ goto err_pci_disable_msi;
++ }
++
+ ret = ath11k_mhi_register(ab_pci);
+ if (ret) {
+ ath11k_err(ab, "failed to register mhi: %d\n", ret);
+- goto err_pci_disable_msi;
++ goto err_irq_affinity_cleanup;
+ }
+
+ ret = ath11k_hal_srng_init(ab);
+@@ -876,12 +882,6 @@ unsupported_wcn6855_soc:
+ goto err_ce_free;
+ }
+
+- ret = ath11k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
+- if (ret) {
+- ath11k_err(ab, "failed to set irq affinity %d\n", ret);
+- goto err_free_irq;
+- }
+-
+ /* kernel may allocate a dummy vector before request_irq and
+ * then allocate a real vector when request_irq is called.
+ * So get msi_data here again to avoid spurious interrupt
+@@ -890,20 +890,17 @@ unsupported_wcn6855_soc:
+ ret = ath11k_pci_config_msi_data(ab_pci);
+ if (ret) {
+ ath11k_err(ab, "failed to config msi_data: %d\n", ret);
+- goto err_irq_affinity_cleanup;
++ goto err_free_irq;
+ }
+
+ ret = ath11k_core_init(ab);
+ if (ret) {
+ ath11k_err(ab, "failed to init core: %d\n", ret);
+- goto err_irq_affinity_cleanup;
++ goto err_free_irq;
+ }
+ ath11k_qmi_fwreset_from_cold_boot(ab);
+ return 0;
+
+-err_irq_affinity_cleanup:
+- ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
+-
+ err_free_irq:
+ ath11k_pcic_free_irq(ab);
+
+@@ -916,6 +913,9 @@ err_hal_srng_deinit:
+ err_mhi_unregister:
+ ath11k_mhi_unregister(ab_pci);
+
++err_irq_affinity_cleanup:
++ ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
++
+ err_pci_disable_msi:
+ ath11k_pci_free_msi(ab_pci);
+
--- /dev/null
+From ac13a7842ab46a87aa315514d6d7e19b03cb2adc Mon Sep 17 00:00:00 2001
+From: Dmitry Antipov <dmantipov@yandex.ru>
+Date: Wed, 6 Sep 2023 12:36:55 +0300
+Subject: [PATCH] wifi: ath11k: drop NULL pointer check in
+ ath11k_update_per_peer_tx_stats()
+
+Since 'user_stats' is a fixed-size array of 'struct htt_ppdu_user_stats'
+in 'struct htt_ppdu_stats', any of its member can't be NULL and so
+relevant check may be dropped.
+
+Found by Linux Verification Center (linuxtesting.org) with SVACE.
+
+Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230906093704.14001-1-dmantipov@yandex.ru
+---
+ drivers/net/wireless/ath/ath11k/dp_rx.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
+@@ -1388,9 +1388,6 @@ ath11k_update_per_peer_tx_stats(struct a
+ u8 tid = HTT_PPDU_STATS_NON_QOS_TID;
+ bool is_ampdu = false;
+
+- if (!usr_stats)
+- return;
+-
+ if (!(usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_RATE)))
+ return;
+
--- /dev/null
+From 82ae3f4635382ff23e2ece55b5d5e713223951ec Mon Sep 17 00:00:00 2001
+From: Dmitry Antipov <dmantipov@yandex.ru>
+Date: Thu, 24 Aug 2023 10:50:44 +0300
+Subject: [PATCH] wifi: ath11k: drop redundant check in
+ ath11k_dp_rx_mon_dest_process()
+
+In 'ath11k_dp_rx_mon_dest_process()', 'mon_dst_srng' points to
+a member of 'srng_list', which is a fixed-size array inside
+'struct ath11k_hal'. This way, if 'ring_id' is valid (i. e.
+between 0 and HAL_SRNG_RING_ID_MAX - 1 inclusive), 'mon_dst_srng'
+can't be NULL and so relevant check may be dropped.
+
+Found by Linux Verification Center (linuxtesting.org) with SVACE.
+
+Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230824075121.121144-1-dmantipov@yandex.ru
+---
+ drivers/net/wireless/ath/ath11k/dp_rx.c | 7 -------
+ 1 file changed, 7 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
+@@ -5094,13 +5094,6 @@ static void ath11k_dp_rx_mon_dest_proces
+
+ mon_dst_srng = &ar->ab->hal.srng_list[ring_id];
+
+- if (!mon_dst_srng) {
+- ath11k_warn(ar->ab,
+- "HAL Monitor Destination Ring Init Failed -- %p",
+- mon_dst_srng);
+- return;
+- }
+-
+ spin_lock_bh(&pmon->mon_lock);
+
+ ath11k_hal_srng_access_begin(ar->ab, mon_dst_srng);
--- /dev/null
+From 9066794113c4813b6ce4a66ed6ce14ecdf35625d Mon Sep 17 00:00:00 2001
+From: Dmitry Antipov <dmantipov@yandex.ru>
+Date: Thu, 24 Aug 2023 10:50:45 +0300
+Subject: [PATCH] wifi: ath11k: remove unused members of 'struct ath11k_base'
+
+Remove set but otherwise unused 'wlan_init_status' and
+'wmi_ready' members of 'struct ath11k_base', adjust
+'ath11k_wmi_tlv_rdy_parse()' accordingly.
+
+Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230824075121.121144-2-dmantipov@yandex.ru
+---
+ drivers/net/wireless/ath/ath11k/core.h | 2 --
+ drivers/net/wireless/ath/ath11k/wmi.c | 2 --
+ 2 files changed, 4 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/core.h
++++ b/drivers/net/wireless/ath/ath11k/core.h
+@@ -901,8 +901,6 @@ struct ath11k_base {
+ struct list_head peers;
+ wait_queue_head_t peer_mapping_wq;
+ u8 mac_addr[ETH_ALEN];
+- bool wmi_ready;
+- u32 wlan_init_status;
+ int irq_num[ATH11K_IRQ_NUM_MAX];
+ struct ath11k_ext_irq_grp ext_irq_grp[ATH11K_EXT_IRQ_GRP_NUM_MAX];
+ struct ath11k_targ_cap target_caps;
+--- a/drivers/net/wireless/ath/ath11k/wmi.c
++++ b/drivers/net/wireless/ath/ath11k/wmi.c
+@@ -7222,14 +7222,12 @@ static int ath11k_wmi_tlv_rdy_parse(stru
+ memset(&fixed_param, 0, sizeof(fixed_param));
+ memcpy(&fixed_param, (struct wmi_ready_event *)ptr,
+ min_t(u16, sizeof(fixed_param), len));
+- ab->wlan_init_status = fixed_param.ready_event_min.status;
+ rdy_parse->num_extra_mac_addr =
+ fixed_param.ready_event_min.num_extra_mac_addr;
+
+ ether_addr_copy(ab->mac_addr,
+ fixed_param.ready_event_min.mac_addr.addr);
+ ab->pktlog_defs_checksum = fixed_param.pktlog_defs_checksum;
+- ab->wmi_ready = true;
+ break;
+ case WMI_TAG_ARRAY_FIXED_STRUCT:
+ addr_list = (struct wmi_mac_addr *)ptr;
--- /dev/null
+From 458f66c30df2b8495790cf6fca76ebad44046921 Mon Sep 17 00:00:00 2001
+From: Dmitry Antipov <dmantipov@yandex.ru>
+Date: Thu, 21 Sep 2023 11:16:57 +0300
+Subject: [PATCH] wifi: ath11k: use kstrtoul_from_user() where appropriate
+
+Use 'kstrtoul_from_user()' in 'ath11k_write_file_spectral_count()'
+and 'ath11k_write_file_spectral_bins()'
+
+Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230824075121.121144-4-dmantipov@yandex.ru
+---
+ drivers/net/wireless/ath/ath11k/spectral.c | 26 +++++++---------------
+ 1 file changed, 8 insertions(+), 18 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/spectral.c
++++ b/drivers/net/wireless/ath/ath11k/spectral.c
+@@ -386,16 +386,11 @@ static ssize_t ath11k_write_file_spectra
+ {
+ struct ath11k *ar = file->private_data;
+ unsigned long val;
+- char buf[32];
+- ssize_t len;
+-
+- len = min(count, sizeof(buf) - 1);
+- if (copy_from_user(buf, user_buf, len))
+- return -EFAULT;
++ ssize_t ret;
+
+- buf[len] = '\0';
+- if (kstrtoul(buf, 0, &val))
+- return -EINVAL;
++ ret = kstrtoul_from_user(user_buf, count, 0, &val);
++ if (ret)
++ return ret;
+
+ if (val > ATH11K_SPECTRAL_SCAN_COUNT_MAX)
+ return -EINVAL;
+@@ -441,16 +436,11 @@ static ssize_t ath11k_write_file_spectra
+ {
+ struct ath11k *ar = file->private_data;
+ unsigned long val;
+- char buf[32];
+- ssize_t len;
+-
+- len = min(count, sizeof(buf) - 1);
+- if (copy_from_user(buf, user_buf, len))
+- return -EFAULT;
++ ssize_t ret;
+
+- buf[len] = '\0';
+- if (kstrtoul(buf, 0, &val))
+- return -EINVAL;
++ ret = kstrtoul_from_user(user_buf, count, 0, &val);
++ if (ret)
++ return ret;
+
+ if (val < ATH11K_SPECTRAL_MIN_BINS ||
+ val > ar->ab->hw_params.spectral.max_fft_bins)
--- /dev/null
+From 87fd0602610d6965c45afc61780ac98842e8f902 Mon Sep 17 00:00:00 2001
+From: Wu Yunchuan <yunchuan@nfschina.com>
+Date: Thu, 21 Sep 2023 11:50:05 +0300
+Subject: [PATCH] wifi: ath11k: remove unnecessary (void*) conversions
+
+No need cast (void *) to (struct ath11k_base *),
+struct hal_rx_msdu_link *), (struct ath11k_buffer_addr *) or
+other types.
+
+Signed-off-by: Wu Yunchuan <yunchuan@nfschina.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230919045150.524304-1-yunchuan@nfschina.com
+---
+ drivers/net/wireless/ath/ath11k/dp.c | 2 +-
+ drivers/net/wireless/ath/ath11k/dp_rx.c | 13 +++++--------
+ drivers/net/wireless/ath/ath11k/hal.c | 8 +++-----
+ drivers/net/wireless/ath/ath11k/hal_rx.c | 17 +++++++----------
+ drivers/net/wireless/ath/ath11k/hal_tx.c | 2 +-
+ drivers/net/wireless/ath/ath11k/mac.c | 4 ++--
+ drivers/net/wireless/ath/ath11k/spectral.c | 2 +-
+ drivers/net/wireless/ath/ath11k/wmi.c | 6 +++---
+ 8 files changed, 23 insertions(+), 31 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/dp.c
++++ b/drivers/net/wireless/ath/ath11k/dp.c
+@@ -1009,7 +1009,7 @@ void ath11k_dp_vdev_tx_attach(struct ath
+
+ static int ath11k_dp_tx_pending_cleanup(int buf_id, void *skb, void *ctx)
+ {
+- struct ath11k_base *ab = (struct ath11k_base *)ctx;
++ struct ath11k_base *ab = ctx;
+ struct sk_buff *msdu = skb;
+
+ dma_unmap_single(ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
+--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
+@@ -1256,7 +1256,7 @@ static int ath11k_htt_tlv_ppdu_stats_par
+ int cur_user;
+ u16 peer_id;
+
+- ppdu_info = (struct htt_ppdu_stats_info *)data;
++ ppdu_info = data;
+
+ switch (tag) {
+ case HTT_PPDU_STATS_TAG_COMMON:
+@@ -4486,8 +4486,7 @@ int ath11k_dp_rx_monitor_link_desc_retur
+ src_srng_desc = ath11k_hal_srng_src_get_next_entry(ar->ab, hal_srng);
+
+ if (src_srng_desc) {
+- struct ath11k_buffer_addr *src_desc =
+- (struct ath11k_buffer_addr *)src_srng_desc;
++ struct ath11k_buffer_addr *src_desc = src_srng_desc;
+
+ *src_desc = *((struct ath11k_buffer_addr *)p_last_buf_addr_info);
+ } else {
+@@ -4506,8 +4505,7 @@ void ath11k_dp_rx_mon_next_link_desc_get
+ u8 *rbm,
+ void **pp_buf_addr_info)
+ {
+- struct hal_rx_msdu_link *msdu_link =
+- (struct hal_rx_msdu_link *)rx_msdu_link_desc;
++ struct hal_rx_msdu_link *msdu_link = rx_msdu_link_desc;
+ struct ath11k_buffer_addr *buf_addr_info;
+
+ buf_addr_info = (struct ath11k_buffer_addr *)&msdu_link->buf_addr_info;
+@@ -4548,7 +4546,7 @@ static void ath11k_hal_rx_msdu_list_get(
+ u32 first = FIELD_PREP(RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU, 1);
+ u8 tmp = 0;
+
+- msdu_link = (struct hal_rx_msdu_link *)msdu_link_desc;
++ msdu_link = msdu_link_desc;
+ msdu_details = &msdu_link->msdu_link[0];
+
+ for (i = 0; i < HAL_RX_NUM_MSDU_DESC; i++) {
+@@ -4645,8 +4643,7 @@ ath11k_dp_rx_mon_mpdu_pop(struct ath11k
+ bool is_frag, is_first_msdu;
+ bool drop_mpdu = false;
+ struct ath11k_skb_rxcb *rxcb;
+- struct hal_reo_entrance_ring *ent_desc =
+- (struct hal_reo_entrance_ring *)ring_entry;
++ struct hal_reo_entrance_ring *ent_desc = ring_entry;
+ int buf_id;
+ u32 rx_link_buf_info[2];
+ u8 rbm;
+--- a/drivers/net/wireless/ath/ath11k/hal.c
++++ b/drivers/net/wireless/ath/ath11k/hal.c
+@@ -571,7 +571,7 @@ u32 ath11k_hal_ce_get_desc_size(enum hal
+ void ath11k_hal_ce_src_set_desc(void *buf, dma_addr_t paddr, u32 len, u32 id,
+ u8 byte_swap_data)
+ {
+- struct hal_ce_srng_src_desc *desc = (struct hal_ce_srng_src_desc *)buf;
++ struct hal_ce_srng_src_desc *desc = buf;
+
+ desc->buffer_addr_low = paddr & HAL_ADDR_LSB_REG_MASK;
+ desc->buffer_addr_info =
+@@ -586,8 +586,7 @@ void ath11k_hal_ce_src_set_desc(void *bu
+
+ void ath11k_hal_ce_dst_set_desc(void *buf, dma_addr_t paddr)
+ {
+- struct hal_ce_srng_dest_desc *desc =
+- (struct hal_ce_srng_dest_desc *)buf;
++ struct hal_ce_srng_dest_desc *desc = buf;
+
+ desc->buffer_addr_low = paddr & HAL_ADDR_LSB_REG_MASK;
+ desc->buffer_addr_info =
+@@ -597,8 +596,7 @@ void ath11k_hal_ce_dst_set_desc(void *bu
+
+ u32 ath11k_hal_ce_dst_status_get_length(void *buf)
+ {
+- struct hal_ce_srng_dst_status_desc *desc =
+- (struct hal_ce_srng_dst_status_desc *)buf;
++ struct hal_ce_srng_dst_status_desc *desc = buf;
+ u32 len;
+
+ len = FIELD_GET(HAL_CE_DST_STATUS_DESC_FLAGS_LEN, desc->flags);
+--- a/drivers/net/wireless/ath/ath11k/hal_rx.c
++++ b/drivers/net/wireless/ath/ath11k/hal_rx.c
+@@ -265,7 +265,7 @@ out:
+ void ath11k_hal_rx_buf_addr_info_set(void *desc, dma_addr_t paddr,
+ u32 cookie, u8 manager)
+ {
+- struct ath11k_buffer_addr *binfo = (struct ath11k_buffer_addr *)desc;
++ struct ath11k_buffer_addr *binfo = desc;
+ u32 paddr_lo, paddr_hi;
+
+ paddr_lo = lower_32_bits(paddr);
+@@ -279,7 +279,7 @@ void ath11k_hal_rx_buf_addr_info_set(voi
+ void ath11k_hal_rx_buf_addr_info_get(void *desc, dma_addr_t *paddr,
+ u32 *cookie, u8 *rbm)
+ {
+- struct ath11k_buffer_addr *binfo = (struct ath11k_buffer_addr *)desc;
++ struct ath11k_buffer_addr *binfo = desc;
+
+ *paddr =
+ (((u64)FIELD_GET(BUFFER_ADDR_INFO1_ADDR, binfo->info1)) << 32) |
+@@ -292,7 +292,7 @@ void ath11k_hal_rx_msdu_link_info_get(vo
+ u32 *msdu_cookies,
+ enum hal_rx_buf_return_buf_manager *rbm)
+ {
+- struct hal_rx_msdu_link *link = (struct hal_rx_msdu_link *)link_desc;
++ struct hal_rx_msdu_link *link = link_desc;
+ struct hal_rx_msdu_details *msdu;
+ int i;
+
+@@ -699,7 +699,7 @@ u32 ath11k_hal_reo_qdesc_size(u32 ba_win
+ void ath11k_hal_reo_qdesc_setup(void *vaddr, int tid, u32 ba_window_size,
+ u32 start_seq, enum hal_pn_type type)
+ {
+- struct hal_rx_reo_queue *qdesc = (struct hal_rx_reo_queue *)vaddr;
++ struct hal_rx_reo_queue *qdesc = vaddr;
+ struct hal_rx_reo_queue_ext *ext_desc;
+
+ memset(qdesc, 0, sizeof(*qdesc));
+@@ -809,8 +809,7 @@ static inline void
+ ath11k_hal_rx_handle_ofdma_info(void *rx_tlv,
+ struct hal_rx_user_status *rx_user_status)
+ {
+- struct hal_rx_ppdu_end_user_stats *ppdu_end_user =
+- (struct hal_rx_ppdu_end_user_stats *)rx_tlv;
++ struct hal_rx_ppdu_end_user_stats *ppdu_end_user = rx_tlv;
+
+ rx_user_status->ul_ofdma_user_v0_word0 = __le32_to_cpu(ppdu_end_user->info6);
+
+@@ -821,8 +820,7 @@ static inline void
+ ath11k_hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
+ struct hal_rx_user_status *rx_user_status)
+ {
+- struct hal_rx_ppdu_end_user_stats *ppdu_end_user =
+- (struct hal_rx_ppdu_end_user_stats *)rx_tlv;
++ struct hal_rx_ppdu_end_user_stats *ppdu_end_user = rx_tlv;
+
+ rx_user_status->mpdu_ok_byte_count =
+ FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO8_MPDU_OK_BYTE_COUNT,
+@@ -1540,8 +1538,7 @@ void ath11k_hal_rx_reo_ent_buf_paddr_get
+ u32 *sw_cookie, void **pp_buf_addr,
+ u8 *rbm, u32 *msdu_cnt)
+ {
+- struct hal_reo_entrance_ring *reo_ent_ring =
+- (struct hal_reo_entrance_ring *)rx_desc;
++ struct hal_reo_entrance_ring *reo_ent_ring = rx_desc;
+ struct ath11k_buffer_addr *buf_addr_info;
+ struct rx_mpdu_desc *rx_mpdu_desc_info_details;
+
+--- a/drivers/net/wireless/ath/ath11k/hal_tx.c
++++ b/drivers/net/wireless/ath/ath11k/hal_tx.c
+@@ -37,7 +37,7 @@ static const u8 dscp_tid_map[DSCP_TID_MA
+ void ath11k_hal_tx_cmd_desc_setup(struct ath11k_base *ab, void *cmd,
+ struct hal_tx_info *ti)
+ {
+- struct hal_tcl_data_cmd *tcl_cmd = (struct hal_tcl_data_cmd *)cmd;
++ struct hal_tcl_data_cmd *tcl_cmd = cmd;
+
+ tcl_cmd->buf_addr_info.info0 =
+ FIELD_PREP(BUFFER_ADDR_INFO0_ADDR, ti->paddr);
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -6970,8 +6970,8 @@ err:
+
+ static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
+ {
+- struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
+- struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
++ struct ieee80211_vif *vif = ctx;
++ struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
+
+ if (skb_cb->vif == vif)
+ skb_cb->vif = NULL;
+--- a/drivers/net/wireless/ath/ath11k/spectral.c
++++ b/drivers/net/wireless/ath/ath11k/spectral.c
+@@ -592,7 +592,7 @@ int ath11k_spectral_process_fft(struct a
+ return -EINVAL;
+ }
+
+- tlv = (struct spectral_tlv *)data;
++ tlv = data;
+ tlv_len = FIELD_GET(SPECTRAL_TLV_HDR_LEN, __le32_to_cpu(tlv->header));
+ /* convert Dword into bytes */
+ tlv_len *= ATH11K_SPECTRAL_DWORD_SIZE;
+--- a/drivers/net/wireless/ath/ath11k/wmi.c
++++ b/drivers/net/wireless/ath/ath11k/wmi.c
+@@ -2281,7 +2281,7 @@ int ath11k_wmi_send_scan_start_cmd(struc
+ tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_UINT32) |
+ FIELD_PREP(WMI_TLV_LEN, len);
+ ptr += TLV_HDR_SIZE;
+- tmp_ptr = (u32 *)ptr;
++ tmp_ptr = ptr;
+
+ for (i = 0; i < params->num_chan; ++i)
+ tmp_ptr[i] = params->chan_list[i];
+@@ -4148,7 +4148,7 @@ static int ath11k_init_cmd_send(struct a
+ ptr += TLV_HDR_SIZE + len;
+
+ if (param->hw_mode_id != WMI_HOST_HW_MODE_MAX) {
+- hw_mode = (struct wmi_pdev_set_hw_mode_cmd_param *)ptr;
++ hw_mode = ptr;
+ hw_mode->tlv_header = FIELD_PREP(WMI_TLV_TAG,
+ WMI_TAG_PDEV_SET_HW_MODE_CMD) |
+ FIELD_PREP(WMI_TLV_LEN,
+@@ -4168,7 +4168,7 @@ static int ath11k_init_cmd_send(struct a
+ len = sizeof(*band_to_mac);
+
+ for (idx = 0; idx < param->num_band_to_mac; idx++) {
+- band_to_mac = (void *)ptr;
++ band_to_mac = ptr;
+
+ band_to_mac->tlv_header = FIELD_PREP(WMI_TLV_TAG,
+ WMI_TAG_PDEV_BAND_TO_MAC) |
--- /dev/null
+From 4fd15bb705d3faa7e6adab2daba2e3af80d9b6bd Mon Sep 17 00:00:00 2001
+From: Dmitry Antipov <dmantipov@yandex.ru>
+Date: Tue, 26 Sep 2023 07:29:04 +0300
+Subject: [PATCH] wifi: ath11k: fix ath11k_mac_op_remain_on_channel() stack
+ usage
+
+When compiling with clang 16.0.6, I've noticed the following:
+
+drivers/net/wireless/ath/ath11k/mac.c:8903:12: warning: stack frame
+size (1032) exceeds limit (1024) in 'ath11k_mac_op_remain_on_channel'
+[-Wframe-larger-than]
+static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
+ ^
+68/1032 (6.59%) spills, 964/1032 (93.41%) variables
+
+So switch to kzalloc()'ed instance of 'struct scan_req_params' like
+it's done in 'ath11k_mac_op_hw_scan()'. Compile tested only.
+
+Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230926042906.13725-1-dmantipov@yandex.ru
+---
+ drivers/net/wireless/ath/ath11k/mac.c | 44 +++++++++++++++------------
+ 1 file changed, 25 insertions(+), 19 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -8908,7 +8908,7 @@ static int ath11k_mac_op_remain_on_chann
+ {
+ struct ath11k *ar = hw->priv;
+ struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
+- struct scan_req_params arg;
++ struct scan_req_params *arg;
+ int ret;
+ u32 scan_time_msec;
+
+@@ -8940,27 +8940,31 @@ static int ath11k_mac_op_remain_on_chann
+
+ scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
+
+- memset(&arg, 0, sizeof(arg));
+- ath11k_wmi_start_scan_init(ar, &arg);
+- arg.num_chan = 1;
+- arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
+- GFP_KERNEL);
+- if (!arg.chan_list) {
++ arg = kzalloc(sizeof(*arg), GFP_KERNEL);
++ if (!arg) {
+ ret = -ENOMEM;
+ goto exit;
+ }
++ ath11k_wmi_start_scan_init(ar, arg);
++ arg->num_chan = 1;
++ arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
++ GFP_KERNEL);
++ if (!arg->chan_list) {
++ ret = -ENOMEM;
++ goto free_arg;
++ }
+
+- arg.vdev_id = arvif->vdev_id;
+- arg.scan_id = ATH11K_SCAN_ID;
+- arg.chan_list[0] = chan->center_freq;
+- arg.dwell_time_active = scan_time_msec;
+- arg.dwell_time_passive = scan_time_msec;
+- arg.max_scan_time = scan_time_msec;
+- arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
+- arg.scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
+- arg.burst_duration = duration;
++ arg->vdev_id = arvif->vdev_id;
++ arg->scan_id = ATH11K_SCAN_ID;
++ arg->chan_list[0] = chan->center_freq;
++ arg->dwell_time_active = scan_time_msec;
++ arg->dwell_time_passive = scan_time_msec;
++ arg->max_scan_time = scan_time_msec;
++ arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE;
++ arg->scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
++ arg->burst_duration = duration;
+
+- ret = ath11k_start_scan(ar, &arg);
++ ret = ath11k_start_scan(ar, arg);
+ if (ret) {
+ ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
+
+@@ -8986,7 +8990,9 @@ static int ath11k_mac_op_remain_on_chann
+ ret = 0;
+
+ free_chan_list:
+- kfree(arg.chan_list);
++ kfree(arg->chan_list);
++free_arg:
++ kfree(arg);
+ exit:
+ mutex_unlock(&ar->conf_mutex);
+ return ret;
--- /dev/null
+From 9e61589ac3c2d23c528d3ffd44604d98553ea1cb Mon Sep 17 00:00:00 2001
+From: Kalle Valo <quic_kvalo@quicinc.com>
+Date: Wed, 27 Sep 2023 17:27:08 +0300
+Subject: [PATCH] wifi: ath11k: mac: fix struct ieee80211_sband_iftype_data
+ handling
+
+Commit e8c1841278a7 ("wifi: cfg80211: annotate iftype_data pointer with
+sparse") added sparse checks for struct ieee80211_sband_iftype_data handling
+which immediately found an issue in ath11k:
+
+drivers/net/wireless/ath/ath11k/mac.c:7952:22: warning: incorrect type in argument 1 (different address spaces)
+drivers/net/wireless/ath/ath11k/mac.c:7952:22: expected struct ieee80211_sta_he_cap const *he_cap
+drivers/net/wireless/ath/ath11k/mac.c:7952:22: got struct ieee80211_sta_he_cap const [noderef] __iftype_data *
+
+The problem here is that we are accessing sband->iftype_data directly even
+though we should use for_each_sband_iftype_data() or similar. Fortunately
+there's ieee80211_get_he_iftype_cap_vif() which is just what we need here so
+use it to get HE capabilities.
+
+Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
+
+Reported-by: Johannes Berg <johannes@sipsolutions.net>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230927142708.2897504-2-kvalo@kernel.org
+---
+ drivers/net/wireless/ath/ath11k/mac.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -7913,12 +7913,14 @@ ath11k_mac_get_tx_mcs_map(const struct i
+
+ static bool
+ ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
++ struct ath11k_vif *arvif,
+ enum nl80211_band band,
+ const struct cfg80211_bitrate_mask *mask,
+ int *nss)
+ {
+ struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
+ u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
++ const struct ieee80211_sta_he_cap *he_cap;
+ u16 he_mcs_map = 0;
+ u8 ht_nss_mask = 0;
+ u8 vht_nss_mask = 0;
+@@ -7949,7 +7951,11 @@ ath11k_mac_bitrate_mask_get_single_nss(s
+ return false;
+ }
+
+- he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap));
++ he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif);
++ if (!he_cap)
++ return false;
++
++ he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(he_cap));
+
+ for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
+ if (mask->control[band].he_mcs[i] == 0)
+@@ -8365,7 +8371,7 @@ ath11k_mac_op_set_bitrate_mask(struct ie
+ ieee80211_iterate_stations_atomic(ar->hw,
+ ath11k_mac_disable_peer_fixed_rate,
+ arvif);
+- } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
++ } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
+ &single_nss)) {
+ rate = WMI_FIXED_RATE_NONE;
+ nss = single_nss;
--- /dev/null
+From 69fcb525905600a151997cd16367bb92c34a2b14 Mon Sep 17 00:00:00 2001
+From: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Date: Tue, 3 Oct 2023 17:26:54 +0300
+Subject: [PATCH] wifi: ath11k: fix CAC running state during virtual interface
+ start
+
+Currently channel definition's primary channel's DFS CAC time
+as well as primary channel's state i.e usable are used to set
+the CAC_RUNNING flag for the ath11k radio structure. However,
+this is wrong since certain channel definition are possbile
+where primary channel may not be a DFS channel but, secondary
+channel is a DFS channel. For example - channel 36 with 160 MHz
+bandwidth.
+In such cases, the flag will not be set which is wrong.
+
+Fix this issue by using cfg80211_chandef_dfs_usable() function
+from cfg80211 which return trues if at least one channel is in
+usable state.
+
+While at it, modify the CAC running debug log message to print
+the CAC time as well in milli-seconds.
+
+Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230912051857.2284-3-quic_adisi@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/mac.c | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -5,6 +5,7 @@
+ */
+
+ #include <net/mac80211.h>
++#include <net/cfg80211.h>
+ #include <linux/etherdevice.h>
+ #include <linux/bitfield.h>
+ #include <linux/inetdevice.h>
+@@ -7196,6 +7197,7 @@ ath11k_mac_vdev_start_restart(struct ath
+ struct wmi_vdev_start_req_arg arg = {};
+ const struct cfg80211_chan_def *chandef = &ctx->def;
+ int ret = 0;
++ unsigned int dfs_cac_time;
+
+ lockdep_assert_held(&ar->conf_mutex);
+
+@@ -7275,20 +7277,21 @@ ath11k_mac_vdev_start_restart(struct ath
+ ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
+ arvif->vif->addr, arvif->vdev_id);
+
+- /* Enable CAC Flag in the driver by checking the channel DFS cac time,
+- * i.e dfs_cac_ms value which will be valid only for radar channels
+- * and state as NL80211_DFS_USABLE which indicates CAC needs to be
++ /* Enable CAC Flag in the driver by checking the all sub-channel's DFS
++ * state as NL80211_DFS_USABLE which indicates CAC needs to be
+ * done before channel usage. This flags is used to drop rx packets.
+ * during CAC.
+ */
+ /* TODO Set the flag for other interface types as required */
+- if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
+- chandef->chan->dfs_cac_ms &&
+- chandef->chan->dfs_state == NL80211_DFS_USABLE) {
++ if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
++ cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) {
+ set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
++ dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy,
++ chandef);
+ ath11k_dbg(ab, ATH11K_DBG_MAC,
+- "CAC Started in chan_freq %d for vdev %d\n",
+- arg.channel.freq, arg.vdev_id);
++ "cac started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
++ dfs_cac_time, arg.channel.freq, chandef->center_freq1,
++ arg.vdev_id);
+ }
+
+ ret = ath11k_mac_set_txbf_conf(arvif);
--- /dev/null
+From 77f1ee6fd8b6e470f721d05a2e269039d5cafcb7 Mon Sep 17 00:00:00 2001
+From: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Date: Tue, 3 Oct 2023 17:26:54 +0300
+Subject: [PATCH] wifi: ath11k: fix Tx power value during active CAC
+
+Tx power is fetched from firmware's pdev stats. However, during active
+CAC, firmware does not fill the current Tx power and sends the max
+initialised value filled during firmware init. If host sends this power
+to user space, this is wrong since in certain situations, the Tx power
+could be greater than the max allowed by the regulatory. Hence, host
+should not be fetching the Tx power during an active CAC.
+
+Fix this issue by returning -EAGAIN error so that user space knows that there's
+no valid value available.
+
+Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
+
+Fixes: 9a2aa68afe3d ("wifi: ath11k: add get_txpower mac ops")
+Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230912051857.2284-4-quic_adisi@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/mac.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -9060,6 +9060,14 @@ static int ath11k_mac_op_get_txpower(str
+ if (ar->state != ATH11K_STATE_ON)
+ goto err_fallback;
+
++ /* Firmware doesn't provide Tx power during CAC hence no need to fetch
++ * the stats.
++ */
++ if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
++ mutex_unlock(&ar->conf_mutex);
++ return -EAGAIN;
++ }
++
+ req_param.pdev_id = ar->pdev->pdev_id;
+ req_param.stats_id = WMI_REQUEST_PDEV_STAT;
+
--- /dev/null
+From e149353e6562f3e3246f75dfc4cca6a0cc5b4efc Mon Sep 17 00:00:00 2001
+From: Aloka Dixit <quic_alokad@quicinc.com>
+Date: Mon, 9 Oct 2023 10:13:54 +0300
+Subject: [PATCH] wifi: ath11k: call ath11k_mac_fils_discovery() without
+ condition
+
+Mac80211 does not set flags BSS_CHANGED_FILS_DISCOVERY and
+BSS_CHANGED_UNSOL_BCAST_PROBE_RESP if there are no updates to
+FILS discovery and unsolicited broadcast probe response transmission
+configurations respectively. This results in the transmissions getting
+stopped during BSS change operations which do not include these
+attributes. Remove the checks for the flags and always send the existing
+configuration to firmware.
+
+Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20231004044915.6817-1-quic_alokad@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/mac.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -3732,9 +3732,7 @@ static void ath11k_mac_op_bss_info_chang
+ arvif->vdev_id, ret);
+ }
+
+- if (changed & BSS_CHANGED_FILS_DISCOVERY ||
+- changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
+- ath11k_mac_fils_discovery(arvif, info);
++ ath11k_mac_fils_discovery(arvif, info);
+
+ if (changed & BSS_CHANGED_ARP_FILTER) {
+ ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
--- /dev/null
+From a47111663491ff2829df0626493ce81b48dd880a Mon Sep 17 00:00:00 2001
+From: Kalle Valo <quic_kvalo@quicinc.com>
+Date: Tue, 10 Oct 2023 09:22:50 +0300
+Subject: [PATCH] wifi: ath11k: ath11k_debugfs_register(): fix
+ format-truncation warning
+
+In v6.6-rc4 with GCC 13.2 I see a new warning:
+
+drivers/net/wireless/ath/ath11k/debugfs.c: In function 'ath11k_debugfs_register':
+drivers/net/wireless/ath/ath11k/debugfs.c:1597:51: error: '%d' directive output may be truncated writing between 1 and 3 bytes into a region of size 2 [-Werror=format-truncation=]
+drivers/net/wireless/ath/ath11k/debugfs.c:1597:48: note: directive argument in the range [0, 255]
+drivers/net/wireless/ath/ath11k/debugfs.c:1597:9: note: 'snprintf' output between 5 and 7 bytes into a destination of size 5
+
+Increase the size of pdev_name to 10 bytes to make sure there's enough room for
+the string. Also change the format to '%u' as ar->pdev_idx is u8.
+
+Compile tested only.
+
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20231010062250.2580951-1-kvalo@kernel.org
+---
+ drivers/net/wireless/ath/ath11k/debugfs.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/debugfs.c
++++ b/drivers/net/wireless/ath/ath11k/debugfs.c
+@@ -1591,10 +1591,10 @@ static const struct file_operations fops
+ int ath11k_debugfs_register(struct ath11k *ar)
+ {
+ struct ath11k_base *ab = ar->ab;
+- char pdev_name[5];
++ char pdev_name[10];
+ char buf[100] = {0};
+
+- snprintf(pdev_name, sizeof(pdev_name), "%s%d", "mac", ar->pdev_idx);
++ snprintf(pdev_name, sizeof(pdev_name), "%s%u", "mac", ar->pdev_idx);
+
+ ar->debug.debugfs_pdev = debugfs_create_dir(pdev_name, ab->debugfs_soc);
+ if (IS_ERR(ar->debug.debugfs_pdev))
--- /dev/null
+From 534c2dd8099a9cc4bad8ea8b3c7fa1f730e10d5d Mon Sep 17 00:00:00 2001
+From: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Date: Tue, 10 Oct 2023 10:27:19 +0300
+Subject: [PATCH] wifi: ath11k: add parsing of phy bitmap for reg rules
+
+Certain regulatory domains could put restrictions on phy mode operation.
+For example, in a few countries HE Operation is not allowed. For such
+countries, firmware indicates this via phy bitmap in each reg rule.
+
+Currently, there is no logic to parse this info and then pass it on to the
+cfg80211/regulatory.
+
+Add parsing of this phy bitmap from the regulatory channel change event and
+then accordingly map it to cfg80211/regulatory flags and pass it on to it.
+
+While at it, correct typo in debug print s/dsf/dfs.
+
+Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20231004092655.25020-1-quic_adisi@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/reg.c | 11 +++++++++++
+ drivers/net/wireless/ath/ath11k/reg.h | 3 +++
+ drivers/net/wireless/ath/ath11k/wmi.c | 5 +++--
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/reg.c
++++ b/drivers/net/wireless/ath/ath11k/reg.c
+@@ -352,6 +352,16 @@ static u32 ath11k_map_fw_reg_flags(u16 r
+ return flags;
+ }
+
++static u32 ath11k_map_fw_phy_flags(u32 phy_flags)
++{
++ u32 flags = 0;
++
++ if (phy_flags & ATH11K_REG_PHY_BITMAP_NO11AX)
++ flags |= NL80211_RRF_NO_HE;
++
++ return flags;
++}
++
+ static bool
+ ath11k_reg_can_intersect(struct ieee80211_reg_rule *rule1,
+ struct ieee80211_reg_rule *rule2)
+@@ -685,6 +695,7 @@ ath11k_reg_build_regd(struct ath11k_base
+ }
+
+ flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
++ flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);
+
+ ath11k_reg_update_rule(tmp_regd->reg_rules + i,
+ reg_rule->start_freq,
+--- a/drivers/net/wireless/ath/ath11k/reg.h
++++ b/drivers/net/wireless/ath/ath11k/reg.h
+@@ -24,6 +24,9 @@ enum ath11k_dfs_region {
+ ATH11K_DFS_REG_UNDEF,
+ };
+
++/* Phy bitmaps */
++#define ATH11K_REG_PHY_BITMAP_NO11AX BIT(5)
++
+ /* ATH11K Regulatory API's */
+ void ath11k_reg_init(struct ath11k *ar);
+ void ath11k_reg_free(struct ath11k_base *ab);
+--- a/drivers/net/wireless/ath/ath11k/wmi.c
++++ b/drivers/net/wireless/ath/ath11k/wmi.c
+@@ -5440,10 +5440,11 @@ static int ath11k_pull_reg_chan_list_ext
+ }
+
+ ath11k_dbg(ab, ATH11K_DBG_WMI,
+- "cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d",
++ "cc_ext %s dfs %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d phy_bitmap 0x%x",
+ reg_info->alpha2, reg_info->dfs_region,
+ reg_info->min_bw_2ghz, reg_info->max_bw_2ghz,
+- reg_info->min_bw_5ghz, reg_info->max_bw_5ghz);
++ reg_info->min_bw_5ghz, reg_info->max_bw_5ghz,
++ reg_info->phybitmap);
+
+ ath11k_dbg(ab, ATH11K_DBG_WMI,
+ "num_2ghz_reg_rules %d num_5ghz_reg_rules %d",
--- /dev/null
+From 480d230bef0ecd06e72ae3a84117142e38e77503 Mon Sep 17 00:00:00 2001
+From: Jeff Johnson <quic_jjohnson@quicinc.com>
+Date: Mon, 9 Oct 2023 09:36:54 -0700
+Subject: [PATCH] wifi: ath11k: Remove unused struct ath11k_htc_frame
+
+struct ath11k_htc_frame is unused, and since it illogically contains
+two consecutive flexible arrays, it could never be used, so remove it.
+
+No functional changes, compile tested only.
+
+Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20231009-ath11k_htc_frame-v1-1-81d405b7a195@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/htc.h | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/htc.h
++++ b/drivers/net/wireless/ath/ath11k/htc.h
+@@ -156,18 +156,6 @@ struct ath11k_htc_record {
+ };
+ } __packed __aligned(4);
+
+-/* note: the trailer offset is dynamic depending
+- * on payload length. this is only a struct layout draft
+- */
+-struct ath11k_htc_frame {
+- struct ath11k_htc_hdr hdr;
+- union {
+- struct ath11k_htc_msg msg;
+- u8 payload[0];
+- };
+- struct ath11k_htc_record trailer[0];
+-} __packed __aligned(4);
+-
+ enum ath11k_htc_svc_gid {
+ ATH11K_HTC_SVC_GRP_RSVD = 0,
+ ATH11K_HTC_SVC_GRP_WMI = 1,
--- /dev/null
+From 10c65f97b424fcee439463f933140df2a0022f98 Mon Sep 17 00:00:00 2001
+From: Jeff Johnson <quic_jjohnson@quicinc.com>
+Date: Mon, 9 Oct 2023 09:39:42 -0700
+Subject: [PATCH] wifi: ath11k: Introduce and use ath11k_sta_to_arsta()
+
+Currently, the logic to return an ath11k_sta pointer, given a
+ieee80211_sta pointer, uses typecasting throughout the driver. In
+general, conversion functions are preferable to typecasting since
+using a conversion function allows the compiler to validate the types
+of both the input and output parameters.
+
+ath11k already defines a conversion function ath11k_vif_to_arvif() for
+a similar conversion. So introduce ath11k_sta_to_arsta() for this use
+case, and convert all of the existing typecasting to use this
+function.
+
+No functional changes, compile tested only.
+
+Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20231009-ath11k_sta_to_arsta-v1-1-1563e3a307e8@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/core.h | 5 ++++
+ drivers/net/wireless/ath/ath11k/debugfs.c | 4 +--
+ drivers/net/wireless/ath/ath11k/debugfs_sta.c | 30 +++++++++----------
+ drivers/net/wireless/ath/ath11k/dp_rx.c | 8 ++---
+ drivers/net/wireless/ath/ath11k/dp_tx.c | 4 +--
+ drivers/net/wireless/ath/ath11k/mac.c | 18 +++++------
+ drivers/net/wireless/ath/ath11k/peer.c | 2 +-
+ drivers/net/wireless/ath/ath11k/wmi.c | 6 ++--
+ 8 files changed, 41 insertions(+), 36 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/core.h
++++ b/drivers/net/wireless/ath/ath11k/core.h
+@@ -1223,6 +1223,11 @@ static inline struct ath11k_vif *ath11k_
+ return (struct ath11k_vif *)vif->drv_priv;
+ }
+
++static inline struct ath11k_sta *ath11k_sta_to_arsta(struct ieee80211_sta *sta)
++{
++ return (struct ath11k_sta *)sta->drv_priv;
++}
++
+ static inline struct ath11k *ath11k_ab_to_ar(struct ath11k_base *ab,
+ int mac_id)
+ {
+--- a/drivers/net/wireless/ath/ath11k/debugfs.c
++++ b/drivers/net/wireless/ath/ath11k/debugfs.c
+@@ -1459,7 +1459,7 @@ static void ath11k_reset_peer_ps_duratio
+ struct ieee80211_sta *sta)
+ {
+ struct ath11k *ar = data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+
+ spin_lock_bh(&ar->data_lock);
+ arsta->ps_total_duration = 0;
+@@ -1510,7 +1510,7 @@ static void ath11k_peer_ps_state_disable
+ struct ieee80211_sta *sta)
+ {
+ struct ath11k *ar = data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+
+ spin_lock_bh(&ar->data_lock);
+ arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
+--- a/drivers/net/wireless/ath/ath11k/debugfs_sta.c
++++ b/drivers/net/wireless/ath/ath11k/debugfs_sta.c
+@@ -136,7 +136,7 @@ static ssize_t ath11k_dbg_sta_dump_tx_st
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ struct ath11k_htt_data_stats *stats;
+ static const char *str_name[ATH11K_STATS_TYPE_MAX] = {"succ", "fail",
+@@ -243,7 +243,7 @@ static ssize_t ath11k_dbg_sta_dump_rx_st
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ struct ath11k_rx_peer_stats *rx_stats = arsta->rx_stats;
+ int len = 0, i, retval = 0;
+@@ -340,7 +340,7 @@ static int
+ ath11k_dbg_sta_open_htt_peer_stats(struct inode *inode, struct file *file)
+ {
+ struct ieee80211_sta *sta = inode->i_private;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ struct debug_htt_stats_req *stats_req;
+ int type = ar->debug.htt_stats.type;
+@@ -376,7 +376,7 @@ static int
+ ath11k_dbg_sta_release_htt_peer_stats(struct inode *inode, struct file *file)
+ {
+ struct ieee80211_sta *sta = inode->i_private;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+
+ mutex_lock(&ar->conf_mutex);
+@@ -413,7 +413,7 @@ static ssize_t ath11k_dbg_sta_write_peer
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ int ret, enable;
+
+@@ -453,7 +453,7 @@ static ssize_t ath11k_dbg_sta_read_peer_
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ char buf[32] = {0};
+ int len;
+@@ -480,7 +480,7 @@ static ssize_t ath11k_dbg_sta_write_delb
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ u32 tid, initiator, reason;
+ int ret;
+@@ -531,7 +531,7 @@ static ssize_t ath11k_dbg_sta_write_addb
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ u32 tid, status;
+ int ret;
+@@ -581,7 +581,7 @@ static ssize_t ath11k_dbg_sta_write_addb
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ u32 tid, buf_size;
+ int ret;
+@@ -632,7 +632,7 @@ static ssize_t ath11k_dbg_sta_read_aggr_
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ char buf[64];
+ int len = 0;
+@@ -652,7 +652,7 @@ static ssize_t ath11k_dbg_sta_write_aggr
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ u32 aggr_mode;
+ int ret;
+@@ -697,7 +697,7 @@ ath11k_write_htt_peer_stats_reset(struct
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ struct htt_ext_stats_cfg_params cfg_params = { 0 };
+ int ret;
+@@ -756,7 +756,7 @@ static ssize_t ath11k_dbg_sta_read_peer_
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ char buf[20];
+ int len;
+@@ -783,7 +783,7 @@ static ssize_t ath11k_dbg_sta_read_curre
+ loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ u64 time_since_station_in_power_save;
+ char buf[20];
+@@ -817,7 +817,7 @@ static ssize_t ath11k_dbg_sta_read_total
+ size_t count, loff_t *ppos)
+ {
+ struct ieee80211_sta *sta = file->private_data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ char buf[20];
+ u64 power_save_duration;
+--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
+@@ -1099,7 +1099,7 @@ int ath11k_dp_rx_ampdu_start(struct ath1
+ struct ieee80211_ampdu_params *params)
+ {
+ struct ath11k_base *ab = ar->ab;
+- struct ath11k_sta *arsta = (void *)params->sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta);
+ int vdev_id = arsta->arvif->vdev_id;
+ int ret;
+
+@@ -1117,7 +1117,7 @@ int ath11k_dp_rx_ampdu_stop(struct ath11
+ {
+ struct ath11k_base *ab = ar->ab;
+ struct ath11k_peer *peer;
+- struct ath11k_sta *arsta = (void *)params->sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta);
+ int vdev_id = arsta->arvif->vdev_id;
+ dma_addr_t paddr;
+ bool active;
+@@ -1456,7 +1456,7 @@ ath11k_update_per_peer_tx_stats(struct a
+ }
+
+ sta = peer->sta;
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+
+ memset(&arsta->txrate, 0, sizeof(arsta->txrate));
+
+@@ -5242,7 +5242,7 @@ int ath11k_dp_rx_process_mon_status(stru
+ goto next_skb;
+ }
+
+- arsta = (struct ath11k_sta *)peer->sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(peer->sta);
+ ath11k_dp_rx_update_peer_stats(arsta, ppdu_info);
+
+ if (ath11k_debugfs_is_pktlog_peer_valid(ar, peer->addr))
+--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
++++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
+@@ -467,7 +467,7 @@ void ath11k_dp_tx_update_txcompl(struct
+ }
+
+ sta = peer->sta;
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+
+ memset(&arsta->txrate, 0, sizeof(arsta->txrate));
+ pkt_type = FIELD_GET(HAL_TX_RATE_STATS_INFO0_PKT_TYPE,
+@@ -627,7 +627,7 @@ static void ath11k_dp_tx_complete_msdu(s
+ ieee80211_free_txskb(ar->hw, msdu);
+ return;
+ }
+- arsta = (struct ath11k_sta *)peer->sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(peer->sta);
+ status.sta = peer->sta;
+ status.skb = msdu;
+ status.info = info;
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -2832,7 +2832,7 @@ static void ath11k_peer_assoc_prepare(st
+
+ lockdep_assert_held(&ar->conf_mutex);
+
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+
+ memset(arg, 0, sizeof(*arg));
+
+@@ -4313,7 +4313,7 @@ static int ath11k_mac_op_set_key(struct
+ ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
+
+ if (sta) {
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+
+ switch (key->cipher) {
+ case WLAN_CIPHER_SUITE_TKIP:
+@@ -4904,7 +4904,7 @@ static int ath11k_mac_station_add(struct
+ {
+ struct ath11k_base *ab = ar->ab;
+ struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct peer_create_params peer_param;
+ int ret;
+
+@@ -5028,7 +5028,7 @@ static int ath11k_mac_op_sta_state(struc
+ {
+ struct ath11k *ar = hw->priv;
+ struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k_peer *peer;
+ int ret = 0;
+
+@@ -5194,7 +5194,7 @@ static void ath11k_mac_op_sta_set_4addr(
+ struct ieee80211_sta *sta, bool enabled)
+ {
+ struct ath11k *ar = hw->priv;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+
+ if (enabled && !arsta->use_4addr_set) {
+ ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
+@@ -5208,7 +5208,7 @@ static void ath11k_mac_op_sta_rc_update(
+ u32 changed)
+ {
+ struct ath11k *ar = hw->priv;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
+ struct ath11k_peer *peer;
+ u32 bw, smps;
+@@ -6201,7 +6201,7 @@ static void ath11k_mac_op_tx(struct ieee
+ }
+
+ if (control->sta)
+- arsta = (struct ath11k_sta *)control->sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(control->sta);
+
+ ret = ath11k_dp_tx(ar, arvif, arsta, skb);
+ if (unlikely(ret)) {
+@@ -8233,7 +8233,7 @@ static void ath11k_mac_set_bitrate_mask_
+ struct ieee80211_sta *sta)
+ {
+ struct ath11k_vif *arvif = data;
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arvif->ar;
+
+ spin_lock_bh(&ar->data_lock);
+@@ -8637,7 +8637,7 @@ static void ath11k_mac_op_sta_statistics
+ struct ieee80211_sta *sta,
+ struct station_info *sinfo)
+ {
+- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
++ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
+ struct ath11k *ar = arsta->arvif->ar;
+ s8 signal;
+ bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
+--- a/drivers/net/wireless/ath/ath11k/peer.c
++++ b/drivers/net/wireless/ath/ath11k/peer.c
+@@ -446,7 +446,7 @@ int ath11k_peer_create(struct ath11k *ar
+ peer->sec_type_grp = HAL_ENCRYPT_TYPE_OPEN;
+
+ if (sta) {
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+ arsta->tcl_metadata |= FIELD_PREP(HTT_TCL_META_DATA_TYPE, 0) |
+ FIELD_PREP(HTT_TCL_META_DATA_PEER_ID,
+ peer->peer_id);
+--- a/drivers/net/wireless/ath/ath11k/wmi.c
++++ b/drivers/net/wireless/ath/ath11k/wmi.c
+@@ -6453,7 +6453,7 @@ static int ath11k_wmi_tlv_rssi_chain_par
+ goto exit;
+ }
+
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+
+ BUILD_BUG_ON(ARRAY_SIZE(arsta->chain_signal) >
+ ARRAY_SIZE(stats_rssi->rssi_avg_beacon));
+@@ -6541,7 +6541,7 @@ static int ath11k_wmi_tlv_fw_stats_data_
+ arvif->bssid,
+ NULL);
+ if (sta) {
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+ arsta->rssi_beacon = src->beacon_snr;
+ ath11k_dbg(ab, ATH11K_DBG_WMI,
+ "stats vdev id %d snr %d\n",
+@@ -7468,7 +7468,7 @@ static void ath11k_wmi_event_peer_sta_ps
+ goto exit;
+ }
+
+- arsta = (struct ath11k_sta *)sta->drv_priv;
++ arsta = ath11k_sta_to_arsta(sta);
+
+ spin_lock_bh(&ar->data_lock);
+
{
.hw_rev = ATH11K_HW_IPQ8074,
.name = "ipq8074 hw2.0",
-@@ -1974,7 +1974,8 @@ static void ath11k_core_reset(struct wor
+@@ -2040,7 +2040,8 @@ static void ath11k_core_reset(struct wor
static int ath11k_init_hw_params(struct ath11k_base *ab)
{
const struct ath11k_hw_params *hw_params = NULL;
for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
hw_params = &ath11k_hw_params[i];
-@@ -1990,7 +1991,31 @@ static int ath11k_init_hw_params(struct
+@@ -2056,7 +2057,31 @@ static int ath11k_init_hw_params(struct
ab->hw_params = *hw_params;
--- a/drivers/net/wireless/ath/ath11k/reg.c
+++ b/drivers/net/wireless/ath/ath11k/reg.c
-@@ -352,129 +352,6 @@ static u32 ath11k_map_fw_reg_flags(u16 r
+@@ -362,129 +362,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
return flags;
}
static const char *
ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region)
{
-@@ -609,9 +486,9 @@ ath11k_reg_update_weather_radar_band(str
+@@ -619,9 +496,9 @@ ath11k_reg_update_weather_radar_band(str
struct ieee80211_regdomain *
ath11k_reg_build_regd(struct ath11k_base *ab,
struct cur_reg_rule *reg_rule;
u8 i = 0, j = 0, k = 0;
u8 num_rules;
-@@ -628,26 +505,26 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -638,26 +515,26 @@ ath11k_reg_build_regd(struct ath11k_base
num_rules += reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP];
if (!num_rules)
reg_info->dfs_region, num_rules);
/* Update reg_rules[] below. Firmware is expected to
* send these rules in order(2 GHz rules first and then 5 GHz)
-@@ -686,7 +563,7 @@ ath11k_reg_build_regd(struct ath11k_base
-
+@@ -697,7 +574,7 @@ ath11k_reg_build_regd(struct ath11k_base
flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
+ flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);
- ath11k_reg_update_rule(tmp_regd->reg_rules + i,
+ ath11k_reg_update_rule(new_regd->reg_rules + i,
reg_rule->start_freq,
reg_rule->end_freq, max_bw,
reg_rule->ant_gain, reg_rule->reg_power,
-@@ -701,7 +578,7 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -712,7 +589,7 @@ ath11k_reg_build_regd(struct ath11k_base
reg_info->dfs_region == ATH11K_DFS_REG_ETSI &&
(reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_LOW &&
reg_rule->start_freq < ETSI_WEATHER_RADAR_BAND_HIGH)){
reg_rule, &i,
flags, max_bw);
continue;
-@@ -712,37 +589,20 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -723,37 +600,20 @@ ath11k_reg_build_regd(struct ath11k_base
"\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) (%d, %d)\n",
i + 1, reg_rule->start_freq, reg_rule->end_freq,
max_bw, reg_rule->ant_gain, reg_rule->reg_power,
--- a/drivers/net/wireless/ath/ath11k/reg.h
+++ b/drivers/net/wireless/ath/ath11k/reg.h
-@@ -30,7 +30,7 @@ void ath11k_reg_free(struct ath11k_base
+@@ -33,7 +33,7 @@ void ath11k_reg_free(struct ath11k_base
void ath11k_regd_update_work(struct work_struct *work);
struct ieee80211_regdomain *
ath11k_reg_build_regd(struct ath11k_base *ab,
#endif
--- a/drivers/net/wireless/ath/ath11k/wmi.c
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
-@@ -7059,24 +7059,12 @@ static void ath11k_wmi_htc_tx_complete(s
+@@ -7060,24 +7060,12 @@ static void ath11k_wmi_htc_tx_complete(s
wake_up(&wmi->tx_ce_desc_wq);
}
int ret = 0, pdev_idx, i, j;
struct ath11k *ar;
-@@ -7140,17 +7128,7 @@ static int ath11k_reg_chan_list_event(st
+@@ -7141,17 +7129,7 @@ static int ath11k_reg_chan_list_event(st
(char *)reg_info->alpha2, 2))
goto mem_free;