Merge tag 'ath-next-20231215' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath
authorKalle Valo <kvalo@kernel.org>
Sun, 17 Dec 2023 11:20:18 +0000 (13:20 +0200)
committerKalle Valo <kvalo@kernel.org>
Sun, 17 Dec 2023 11:20:18 +0000 (13:20 +0200)
ath.git patches for v6.8.

We have new features only for ath12k but lots of small cleanup for
ath10k, ath11k and ath12k. And of course smaller fixes to several
drivers.

Major changes:

ath12k

* support one MSI vector

* WCN7850: support AP mode

128 files changed:
drivers/net/wireless/ath/ath10k/bmi.c
drivers/net/wireless/ath/ath10k/ce.c
drivers/net/wireless/ath/ath10k/core.c
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/coredump.c
drivers/net/wireless/ath/ath10k/coredump.h
drivers/net/wireless/ath/ath10k/debug.c
drivers/net/wireless/ath/ath10k/debugfs_sta.c
drivers/net/wireless/ath/ath10k/htc.c
drivers/net/wireless/ath/ath10k/htc.h
drivers/net/wireless/ath/ath10k/htt.h
drivers/net/wireless/ath/ath10k/htt_rx.c
drivers/net/wireless/ath/ath10k/htt_tx.c
drivers/net/wireless/ath/ath10k/hw.c
drivers/net/wireless/ath/ath10k/hw.h
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/pci.c
drivers/net/wireless/ath/ath10k/pci.h
drivers/net/wireless/ath/ath10k/qmi.c
drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c
drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h
drivers/net/wireless/ath/ath10k/rx_desc.h
drivers/net/wireless/ath/ath10k/sdio.c
drivers/net/wireless/ath/ath10k/thermal.c
drivers/net/wireless/ath/ath10k/usb.h
drivers/net/wireless/ath/ath10k/wmi-tlv.h
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h
drivers/net/wireless/ath/ath10k/wow.c
drivers/net/wireless/ath/ath11k/Kconfig
drivers/net/wireless/ath/ath11k/ahb.c
drivers/net/wireless/ath/ath11k/ce.c
drivers/net/wireless/ath/ath11k/ce.h
drivers/net/wireless/ath/ath11k/core.h
drivers/net/wireless/ath/ath11k/dbring.c
drivers/net/wireless/ath/ath11k/dbring.h
drivers/net/wireless/ath/ath11k/debug.c
drivers/net/wireless/ath/ath11k/debug.h
drivers/net/wireless/ath/ath11k/debugfs.c
drivers/net/wireless/ath/ath11k/debugfs.h
drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c
drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h
drivers/net/wireless/ath/ath11k/debugfs_sta.c
drivers/net/wireless/ath/ath11k/debugfs_sta.h
drivers/net/wireless/ath/ath11k/dp.c
drivers/net/wireless/ath/ath11k/dp.h
drivers/net/wireless/ath/ath11k/dp_rx.c
drivers/net/wireless/ath/ath11k/dp_tx.c
drivers/net/wireless/ath/ath11k/dp_tx.h
drivers/net/wireless/ath/ath11k/fw.c
drivers/net/wireless/ath/ath11k/hal.c
drivers/net/wireless/ath/ath11k/hal.h
drivers/net/wireless/ath/ath11k/hal_desc.h
drivers/net/wireless/ath/ath11k/hal_rx.c
drivers/net/wireless/ath/ath11k/hal_rx.h
drivers/net/wireless/ath/ath11k/hif.h
drivers/net/wireless/ath/ath11k/htc.c
drivers/net/wireless/ath/ath11k/htc.h
drivers/net/wireless/ath/ath11k/hw.c
drivers/net/wireless/ath/ath11k/hw.h
drivers/net/wireless/ath/ath11k/mac.c
drivers/net/wireless/ath/ath11k/mac.h
drivers/net/wireless/ath/ath11k/mhi.c
drivers/net/wireless/ath/ath11k/mhi.h
drivers/net/wireless/ath/ath11k/pcic.c
drivers/net/wireless/ath/ath11k/peer.c
drivers/net/wireless/ath/ath11k/peer.h
drivers/net/wireless/ath/ath11k/qmi.c
drivers/net/wireless/ath/ath11k/qmi.h
drivers/net/wireless/ath/ath11k/reg.c
drivers/net/wireless/ath/ath11k/reg.h
drivers/net/wireless/ath/ath11k/rx_desc.h
drivers/net/wireless/ath/ath11k/spectral.c
drivers/net/wireless/ath/ath11k/spectral.h
drivers/net/wireless/ath/ath11k/thermal.c
drivers/net/wireless/ath/ath11k/thermal.h
drivers/net/wireless/ath/ath11k/trace.h
drivers/net/wireless/ath/ath11k/wmi.c
drivers/net/wireless/ath/ath11k/wmi.h
drivers/net/wireless/ath/ath11k/wow.h
drivers/net/wireless/ath/ath12k/Kconfig
drivers/net/wireless/ath/ath12k/core.c
drivers/net/wireless/ath/ath12k/core.h
drivers/net/wireless/ath/ath12k/dbring.c
drivers/net/wireless/ath/ath12k/debug.c
drivers/net/wireless/ath/ath12k/dp.c
drivers/net/wireless/ath/ath12k/dp.h
drivers/net/wireless/ath/ath12k/dp_mon.c
drivers/net/wireless/ath/ath12k/dp_mon.h
drivers/net/wireless/ath/ath12k/dp_rx.c
drivers/net/wireless/ath/ath12k/dp_rx.h
drivers/net/wireless/ath/ath12k/dp_tx.c
drivers/net/wireless/ath/ath12k/hal.c
drivers/net/wireless/ath/ath12k/hal.h
drivers/net/wireless/ath/ath12k/hal_rx.c
drivers/net/wireless/ath/ath12k/hal_rx.h
drivers/net/wireless/ath/ath12k/hif.h
drivers/net/wireless/ath/ath12k/hw.c
drivers/net/wireless/ath/ath12k/hw.h
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/mac.h
drivers/net/wireless/ath/ath12k/mhi.c
drivers/net/wireless/ath/ath12k/pci.c
drivers/net/wireless/ath/ath12k/pci.h
drivers/net/wireless/ath/ath12k/peer.h
drivers/net/wireless/ath/ath12k/qmi.c
drivers/net/wireless/ath/ath12k/qmi.h
drivers/net/wireless/ath/ath12k/reg.c
drivers/net/wireless/ath/ath12k/reg.h
drivers/net/wireless/ath/ath12k/rx_desc.h
drivers/net/wireless/ath/ath12k/wmi.c
drivers/net/wireless/ath/ath12k/wmi.h
drivers/net/wireless/ath/ath5k/ahb.c
drivers/net/wireless/ath/ath5k/eeprom.h
drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
drivers/net/wireless/ath/ath9k/common-init.c
drivers/net/wireless/ath/ath9k/common-spectral.c
drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/hif_usb.c
drivers/net/wireless/ath/ath9k/htc_drv_debug.c
drivers/net/wireless/ath/ath9k/htc_drv_init.c
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
drivers/net/wireless/ath/ath9k/htc_hst.c
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/ath9k/link.c
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/pci.c
drivers/net/wireless/ath/wcn36xx/main.c

index af6546572df26b5e43fe819987d46dc5ffc032a7..9a4f8e815412cba207f3a788013d362a36a02ac3 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2014,2016-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "bmi.h"
index c27b8204718a6d1d312b3cdc50bb75f04d02176e..afae4a8027f8338ad9fed64880fa16fed09f32e4 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "hif.h"
index 6cdb225b7eaccc17ae6a7044ffd229d1a7ab527c..0032f8aa892ffa2724ec40f45ca24e0435d2b254 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -100,6 +101,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA988X_HW_2_0_VERSION,
@@ -140,6 +142,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA9887_HW_1_0_VERSION,
@@ -181,6 +184,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA6174_HW_3_2_VERSION,
@@ -217,6 +221,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA6174_HW_2_1_VERSION,
@@ -257,6 +262,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA6174_HW_2_1_VERSION,
@@ -297,6 +303,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA6174_HW_3_0_VERSION,
@@ -337,6 +344,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA6174_HW_3_2_VERSION,
@@ -381,6 +389,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = true,
        },
        {
                .id = QCA99X0_HW_2_0_DEV_VERSION,
@@ -427,6 +436,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA9984_HW_1_0_DEV_VERSION,
@@ -480,6 +490,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA9888_HW_2_0_DEV_VERSION,
@@ -530,6 +541,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA9377_HW_1_0_DEV_VERSION,
@@ -570,6 +582,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA9377_HW_1_1_DEV_VERSION,
@@ -612,6 +625,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA9377_HW_1_1_DEV_VERSION,
@@ -645,6 +659,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = QCA4019_HW_1_0_DEV_VERSION,
@@ -692,6 +707,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = false,
                .use_fw_tx_credits = true,
                .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
        },
        {
                .id = WCN3990_HW_1_0_DEV_VERSION,
@@ -725,6 +741,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
                .hw_restart_disconnect = true,
                .use_fw_tx_credits = false,
                .delay_unmap_buffer = true,
+               .mcast_frame_registration = false,
        },
 };
 
index 4b5239de401840b628bb776ef2f585edb31f310e..c110d15528bd05d53f371882d1bd9ae91a191e3f 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _CORE_H_
@@ -607,7 +608,7 @@ struct ath10k_vif {
                        u8 tim_bitmap[64];
                        u8 tim_len;
                        u32 ssid_len;
-                       u8 ssid[IEEE80211_MAX_SSID_LEN];
+                       u8 ssid[IEEE80211_MAX_SSID_LEN] __nonstring;
                        bool hidden_ssid;
                        /* P2P_IE with NoA attribute for P2P_GO case */
                        u32 noa_len;
index 2d1634a890dde3e8d7487ba3db025d744f43ebc8..bb3a276b7ed584f4d4e7418b2e4cf7d913114869 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "coredump.h"
index 437b9759f05d3d8da26b6bb6e01e80fda9754bc7..e5ef0352e319c7416818b295fe6f64f3d5122bfe 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: ISC */
 /*
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _COREDUMP_H_
index ad9cf953a2fcf2448ae6722bfdb68b073be0876c..b93a64bf8190187e417c66e8eebf2258868cd3af 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
index 87a3365330ff80c880663f384abfded6f2fc3171..394bf3c32abff6be8a8ff8e4ac71cca3315a163b 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2014-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index 5bfeecb95fca2381cf0b153773759aeb0380033e..a6e21ce90bad64d91afee2b4f46bfbf136547cba 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index 0d180faf3b77f7b26258deefc1856058db4a1510..7ff665020015d4c495a5e2f5f13dc41a90d4b6db 100644 (file)
@@ -246,26 +246,12 @@ struct ath10k_htc_lookahead_bundle {
 struct ath10k_htc_record {
        struct ath10k_ath10k_htc_record_hdr hdr;
        union {
-               struct ath10k_htc_credit_report credit_report[0];
-               struct ath10k_htc_lookahead_report lookahead_report[0];
-               struct ath10k_htc_lookahead_bundle lookahead_bundle[0];
-               u8 pauload[0];
+               DECLARE_FLEX_ARRAY(struct ath10k_htc_credit_report, credit_report);
+               DECLARE_FLEX_ARRAY(struct ath10k_htc_lookahead_report, lookahead_report);
+               DECLARE_FLEX_ARRAY(struct ath10k_htc_lookahead_bundle, lookahead_bundle);
        };
 } __packed __aligned(4);
 
-/*
- * note: the trailer offset is dynamic depending
- * on payload length. this is only a struct layout draft
- */
-struct ath10k_htc_frame {
-       struct ath10k_htc_hdr hdr;
-       union {
-               struct ath10k_htc_msg msg;
-               u8 payload[0];
-       };
-       struct ath10k_htc_record trailer[0];
-} __packed __aligned(4);
-
 /*******************/
 /* Host-side stuff */
 /*******************/
index c80470e8886a03131cdf25cf26dfc9c0933c0aa0..4a9270e2a4c882dfd5078ea2868d721ddbb52033 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _HTT_H_
index b261d6371c0f3a3faf041e09c8fd16a77c8fc8d4..fa0f598ed6bfef66d39ae720f8707d28b361e40f 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index be4d4536aaa8761bc0c87218c1f0788672a1d154..9725feecefd6fb0f073761fbacf26d6bdbaeff15 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/etherdevice.h>
@@ -40,7 +41,6 @@ static void __ath10k_htt_tx_txq_recalc(struct ieee80211_hw *hw,
        struct ath10k *ar = hw->priv;
        struct ath10k_sta *arsta;
        struct ath10k_vif *arvif = (void *)txq->vif->drv_priv;
-       unsigned long frame_cnt;
        unsigned long byte_cnt;
        int idx;
        u32 bit;
@@ -67,7 +67,7 @@ static void __ath10k_htt_tx_txq_recalc(struct ieee80211_hw *hw,
        bit = BIT(peer_id % 32);
        idx = peer_id / 32;
 
-       ieee80211_txq_get_depth(txq, &frame_cnt, &byte_cnt);
+       ieee80211_txq_get_depth(txq, NULL, &byte_cnt);
        count = ath10k_htt_tx_txq_calc_size(byte_cnt);
 
        if (unlikely(peer_id >= ar->htt.tx_q_state.num_peers) ||
index 6d32b43a4da65e620df4cacddd41c8e5bcdb4805..8fafe096adff53494ca963c91099da8c5fcb6a48 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: ISC
 /*
  * Copyright (c) 2014-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/types.h>
index 9643031a4427ada6a69b7455a89f3bc57229a2e7..93c0730919966dd0e12373a004ceaae35ee161a9 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _HW_H_
@@ -639,6 +640,9 @@ struct ath10k_hw_params {
        bool use_fw_tx_credits;
 
        bool delay_unmap_buffer;
+
+       /* The hardware support multicast frame registrations */
+       bool mcast_frame_registration;
 };
 
 struct htt_resp;
index 2cf693f3fea96e10fca84996d35d7b1a1bad2245..090bcf148d0c75a4ce9abcecd1d8ee419acbd691 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "mac.h"
@@ -1242,7 +1243,7 @@ static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
        return ar->monitor ||
               (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
                          ar->running_fw->fw_file.fw_features) &&
-               (ar->filter_flags & FIF_OTHER_BSS)) ||
+               (ar->filter_flags & (FIF_OTHER_BSS | FIF_MCAST_ACTION))) ||
               test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
 }
 
@@ -6025,10 +6026,15 @@ static void ath10k_configure_filter(struct ieee80211_hw *hw,
 {
        struct ath10k *ar = hw->priv;
        int ret;
+       unsigned int supported = SUPPORTED_FILTERS;
 
        mutex_lock(&ar->conf_mutex);
 
-       *total_flags &= SUPPORTED_FILTERS;
+       if (ar->hw_params.mcast_frame_registration)
+               supported |= FIF_MCAST_ACTION;
+
+       *total_flags &= supported;
+
        ar->filter_flags = *total_flags;
 
        ret = ath10k_monitor_recalc(ar);
@@ -6121,9 +6127,8 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
 
                if (ieee80211_vif_is_mesh(vif)) {
                        /* mesh doesn't use SSID but firmware needs it */
-                       strncpy(arvif->u.ap.ssid, "mesh",
-                               sizeof(arvif->u.ap.ssid));
                        arvif->u.ap.ssid_len = 4;
+                       memcpy(arvif->u.ap.ssid, "mesh", arvif->u.ap.ssid_len);
                }
        }
 
@@ -10118,6 +10123,10 @@ int ath10k_mac_register(struct ath10k *ar)
                              NL80211_EXT_FEATURE_SET_SCAN_DWELL);
        wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL);
 
+       if (ar->hw_params.mcast_frame_registration)
+               wiphy_ext_feature_set(ar->hw->wiphy,
+                                     NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
+
        if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
            test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
                wiphy_ext_feature_set(ar->hw->wiphy,
index 2f8c785277af5e8e086cc1a353f9f8e2492034cd..3de2de6d44bc9cf4e46105ab0714a4fd25aa9483 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/pci.h>
index 480cd97ab739de0c0405ae01e1c62209dd5509ef..27bb4cf2dfea937ed8f77101b6ff8c82fbe168cf 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _PCI_H_
index 52c1a3de8da60a006fdddfc6289c5a73e4bb6422..38e939f572a9ed5aeafee612838ba04f25e7c006 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: ISC
 /*
  * Copyright (c) 2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/completion.h>
index 1c81e454f943fdeccf6f2a8817128cfb3436abdd..0e85c75d2278360a19e43fb69f690bb2dfeb6d86 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: ISC
 /*
  * Copyright (c) 2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/soc/qcom/qmi.h>
index f0db991408dc26a13fcb89bc62f317c5d92b6fc5..9f311f3bc9e7f9eb20bfc83fa0f38a91a2c3a220 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: ISC */
 /*
  * Copyright (c) 2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef WCN3990_QMI_SVC_V01_H
index 777e53aa69dc86bdf4b1b9e61956bb0b21fbeb0d..564293df1e9acfd0aa09fcc5ec09da99830206ef 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _RX_DESC_H_
index 56fbcfb80bf88660698628dd9e2a1df97d3c9257..0ab5433f6cf6f261cde6347edf38a219e979843d 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2004-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2012,2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
index cefd97323dfe5071a325a8d17830e1559d462564..31c8d7fbb0955b3b85fb53ba119c67d3d6994a06 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: ISC
 /*
  * Copyright (c) 2014-2015 Qualcomm Atheros, Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/device.h>
index 48e066ba816249a746a1170d993049ea5bb705ec..7e4cfbb673c9a8d535af9e847e91bc912a127cab 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2004-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2012 Qualcomm Atheros, Inc.
  * Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _USB_H_
index dbb48d70f2e93e95fa6a51ceea65c156b82a9493..83a8f07a687f735f0edd46625074e92d473c3fea 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #ifndef _WMI_TLV_H
 #define _WMI_TLV_H
index 05fa7d4c0e1aba1cbad8ee28433d528f0d3cd679..88befe92f95dcc3490ebc607366bc62ef4d9898b 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/skbuff.h>
index b112e88260931ce57c3b3852c063e5369c6b8385..9146df98fceeee9d8a6426e9724c35ebadc3bb46 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2005-2011 Atheros Communications Inc.
  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _WMI_H_
index 20b9aa8ddf7d52e2574daf8d50a197ce6bc1f8b6..aa7b2e703f3d4bd742d8f5abf39ea2607cb1bcb1 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2015-2017 Qualcomm Atheros, Inc.
  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "mac.h"
index ad5cc6cac05bc93f7b9e25c7d00655c50adf7146..27f0523bf9675410cb07439701bb9fb65a81ae32 100644 (file)
@@ -2,7 +2,7 @@
 config ATH11K
        tristate "Qualcomm Technologies 802.11ax chipset support"
        depends on MAC80211 && HAS_DMA
-       depends on CRYPTO_MICHAEL_MIC
+       select CRYPTO_MICHAEL_MIC
        select ATH_COMMON
        select QCOM_QMI_HELPERS
        help
index 235336ef2a7a594514f7f765f39259f8876bb6d1..7c0a235179497d45932e1e111230f388345c4315 100644 (file)
@@ -803,8 +803,8 @@ static int ath11k_core_get_rproc(struct ath11k_base *ab)
 
        prproc = rproc_get_by_phandle(rproc_phandle);
        if (!prproc) {
-               ath11k_err(ab, "failed to get rproc\n");
-               return -EINVAL;
+               ath11k_dbg(ab, ATH11K_DBG_AHB, "failed to get rproc, deferring\n");
+               return -EPROBE_DEFER;
        }
        ab_ahb->tgt_rproc = prproc;
 
@@ -1251,7 +1251,7 @@ static void ath11k_ahb_free_resources(struct ath11k_base *ab)
        platform_set_drvdata(pdev, NULL);
 }
 
-static int ath11k_ahb_remove(struct platform_device *pdev)
+static void ath11k_ahb_remove(struct platform_device *pdev)
 {
        struct ath11k_base *ab = platform_get_drvdata(pdev);
 
@@ -1267,8 +1267,6 @@ static int ath11k_ahb_remove(struct platform_device *pdev)
 
 qmi_fail:
        ath11k_ahb_free_resources(ab);
-
-       return 0;
 }
 
 static void ath11k_ahb_shutdown(struct platform_device *pdev)
@@ -1296,7 +1294,7 @@ static struct platform_driver ath11k_ahb_driver = {
                .of_match_table = ath11k_ahb_of_match,
        },
        .probe  = ath11k_ahb_probe,
-       .remove = ath11k_ahb_remove,
+       .remove_new = ath11k_ahb_remove,
        .shutdown = ath11k_ahb_shutdown,
 };
 
index 289d47ae92afc54de6a54ee755f71525ffdea152..e66e86bdec20ff5b5228108bcdd30efada63cea4 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "dp_rx.h"
index c0f6a0ba86df09ff1dc4f8da9842e7a0faa9e1e7..69946fc700777be654e5b2f17bd9f74caa8b0b5c 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_CE_H
index f12b606e2d2e566340fa60db1e6e7e8e70174f23..7e3b6779f4e969369a9e6713b9235241efa9ac44 100644 (file)
@@ -599,7 +599,6 @@ struct ath11k {
        struct ath11k_base *ab;
        struct ath11k_pdev *pdev;
        struct ieee80211_hw *hw;
-       struct ieee80211_ops *ops;
        struct ath11k_pdev_wmi *wmi;
        struct ath11k_pdev_dp dp;
        u8 mac_addr[ETH_ALEN];
index 5536e86423312440f86e668cb49b612b4ad6743a..fbb6e8d8a47692139c193348bdd5e58ae395e416 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index ef906c687b8cdb2f109c9958f4645f837a119f53..2f93b78a50df0edbdfe1fb435b713b751d184c79 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_DBRING_H
index f5c8a34c8802f0c177997f2aa053d4a69db8c2c9..2b8544355fc1a6bf43d2c917d8354c3d8749bd1a 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/vmalloc.h>
index 9c52804ef8ac3096eed2928d6c6209241a4212e6..cc8934d156977cfad43afe00927e5b8ea10068cf 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _ATH11K_DEBUG_H_
index be76e7d1c4366e99cbd345a4b8386a9c05ca7857..a847bc0d50c0f0b955e93947e49b771d41756ea1 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/vmalloc.h>
index 3af0169f6cf218b0732a8c77bc665c2088550543..44d15845f39a6735f3ef15224ea12ace13079ef4 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _ATH11K_DEBUGFS_H_
index 0207fc4910f3429a6b3867171173150ad3a0e813..870e86a31bf8962eea455986c9aa9d4922b14b40 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/vmalloc.h>
index 96219301f05bd426b29c11ec92cb025338407f56..476689bbd4dad7ff4adb0cc6313456fff719177b 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef DEBUG_HTT_STATS_H
index 8c177fba6f145a01bc29411cf8c46ad2d627360e..f56a24b6c8da21ef522dc0ece75fdbbb0a29fe8e 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/vmalloc.h>
index e6c11b3a40aa9313aadafed1dbfd4ddd647adaf1..ace877e19275eb8c8350c4f11bf5ea41e9d1016a 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _ATH11K_DEBUGFS_STA_H_
index a7252b52555cce66071ae4efbbbbf61d764d7257..8975dc57ad77687218c53b602adf7a9f8be677f2 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <crypto/hash.h>
index 15815af453b2a6e35907338bde6ff699deab41df..2f6dd69d3be27628f888da5d2345a4da283aaf2f 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_DP_H
index 7eac93ce7a1dd08f249358d2c035fe1923c327a9..afd481f5858f031b6cba2d417dfa6c38775ce2e9 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/ieee80211.h>
index a5fa08bc623b8580ec1d2fd296966173764cb4e5..c1072e66e3e8fd07f921466b014c271e08f5d3ba 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index 68a21ea9b934635e656e5f54dc0ac361745e8173..61be2265e09f086cb49820614a8229fe937fba0d 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_DP_TX_H
index 8f84fba29886eb5aa638140e85d486435b957963..4e36292a79db89233d541646c8eb3726a38d2119 100644 (file)
@@ -133,7 +133,7 @@ static int ath11k_fw_request_firmware_api_n(struct ath11k_base *ab,
 
                len -= ie_len;
                data += ie_len;
-       };
+       }
 
        return 0;
 
index 23f3af8e372df895ed58572a970430d96cd5d246..c060c4b5c0cc3639745056b58c43a64f16cadf5c 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/dma-mapping.h>
 #include "hal_tx.h"
index 1942d41d6de541a4e5e6404fa93addd2f9120c77..80447f488954a8fa0d78f28d6acde83250daa82d 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_HAL_H
index d895ea878d9f03af56f9092ea887869dc7ddbd77..b2fd180bd28e6bff950cf176097a063b785a35b8 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include "core.h"
 
index 41946795d6203bc0fd06687434789cd44fd71ec8..e758ee8e17c90459e48c750ea09c46eabc7ee630 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "debug.h"
index 472a52cf5889f2a6926153440770274484a91151..0fa9aef9d533b8dc6a15eab76c929a735d3e15a5 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_HAL_RX_H
index d68ed4214dec10f2a766d0d9c0a7b43ed8724943..877a4073fed69c2b0c8916a05eb504ffa61f46f4 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _HIF_H_
index 2c2e425c86659556984a6c81e0a742c46f836ced..23054ab29a5eed574be7d4b8a3e56b81d1573ba2 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/skbuff.h>
 #include <linux/ctype.h>
index d31e501c807cef778a99007f9d082f644dae6228..86f77eacaea7a3bdeb12fe3ef13aa8d7f79c89c4 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_HTC_H
@@ -150,10 +151,7 @@ struct ath11k_htc_credit_report {
 
 struct ath11k_htc_record {
        struct ath11k_htc_record_hdr hdr;
-       union {
-               struct ath11k_htc_credit_report credit_report[0];
-               u8 pauload[0];
-       };
+       struct ath11k_htc_credit_report credit_report[];
 } __packed __aligned(4);
 
 enum ath11k_htc_svc_gid {
index d7b5ec6e6904906cf08c87247324e207714b773a..77d8f9237680b28868d411d3fd1f39703e3ba164 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/types.h>
index d51a99669dd6eef4cc2bd74fc5dff75ff3fc8507..1b070747a5dbfe082ff27ad283672d8dd506582b 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_HW_H
index 7f7b39817773777a1b89b5e9b3dc8dc8cb935137..db241589424d519607429b34ffd9946b32c525a9 100644 (file)
@@ -4654,6 +4654,14 @@ static int ath11k_station_disassoc(struct ath11k *ar,
        return 0;
 }
 
+static u32 ath11k_mac_max_nss(const u8 *ht_mcs_mask, const u16 *vht_mcs_mask,
+                             const u16 *he_mcs_mask)
+{
+       return max3(ath11k_mac_max_ht_nss(ht_mcs_mask),
+                   ath11k_mac_max_vht_nss(vht_mcs_mask),
+                   ath11k_mac_max_he_nss(he_mcs_mask));
+}
+
 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
 {
        struct ath11k *ar;
@@ -4699,9 +4707,7 @@ static void ath11k_sta_rc_update_wk(struct work_struct *wk)
        mutex_lock(&ar->conf_mutex);
 
        nss = max_t(u32, 1, nss);
-       nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
-                              ath11k_mac_max_vht_nss(vht_mcs_mask)),
-                          ath11k_mac_max_he_nss(he_mcs_mask)));
+       nss = min(nss, ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
 
        if (changed & IEEE80211_RC_BW_CHANGED) {
                /* Get the peer phymode */
@@ -8391,9 +8397,7 @@ ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
                        ath11k_warn(ar->ab,
                                    "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
                nss = min_t(u32, ar->num_tx_chains,
-                           max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
-                                   ath11k_mac_max_vht_nss(vht_mcs_mask)),
-                               ath11k_mac_max_he_nss(he_mcs_mask)));
+                           ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
 
                /* If multiple rates across different preambles are given
                 * we can reconfigure this info with all peers using PEER_ASSOC
index 0231783ad754be95d8767393b8dd3c872a2c33a5..0dfdeed5177b88f74480ebf0e47d3055ba17e10c 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_MAC_H
index afeabd6ecc675df935bdeee15d48ee1f2e4ea6e3..6835c14b82cc9570399698c4c4efd65a0a72b7bd 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/msi.h>
index 8d9f852da69527e08c39f85951e70c81def2434e..f81fba2644a4c7a13b370a3cafc45f4ad317e7dc 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #ifndef _ATH11K_MHI_H
 #define _ATH11K_MHI_H
index 16d1e332193f08aaf56a5ffba225c1e435e6cdd1..15e2ceb22a44d752145f824952b8855d293caa21 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
@@ -460,8 +460,6 @@ void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab)
 {
        int i;
 
-       set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
-
        for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
                struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
 
@@ -471,6 +469,8 @@ void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab)
                }
                ath11k_pcic_ext_grp_enable(irq_grp);
        }
+
+       set_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
 }
 EXPORT_SYMBOL(ath11k_pcic_ext_irq_enable);
 
index 1c79a932d17f3bf8537361a42fe16667e880cf4e..6d0126c3930185a625e33592e7b4ea72642fa395 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index 9bd385d0a38c97d05f0412ae6f3e13491dc59e30..3ad2f3355b14fd9c69c84e611080f272025c952e 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_PEER_H
index c270dc46d5065677719993ad9ce9e8768b2fa467..2c7cab62b9bb57d2c374b3efd42366ea9d3244d2 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/elf.h>
index d477e2be814b10eff25bc5209effabeaf1403cee..7e06d100af57594970afa171923bba531ccd58f3 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_QMI_H
index 3c7debae800a640905cb1eac2b6251de15b38e6b..b4fd4d2107c71fc64f3512f224514437d58325a9 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/rtnetlink.h>
 
index 84daa6543b6a32f0661ee1f66b44605389e6b6c8..f28902f85e4196709a5d976303e36d1a008546af 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_REG_H
index 786d5f36f5e54783518a76bd0721a075a6049328..2da6da7272789274bab98c8560ef20851717bae5 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #ifndef ATH11K_RX_DESC_H
 #define ATH11K_RX_DESC_H
index 0b7b7122cc056c3fa2d741604554a5db5742c7c2..79e091134515b432284768e66eca23314af95a9d 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/relay.h>
index 96bfa16e18e96d6160cb2aa393c2da98d7bb9812..789cff7c64a72d8cfc303bdf90af52a0a7d1b9dc 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_SPECTRAL_H
index c9b012f97ba54c68cfc30ac473b95bd098e82a95..c29b11ab5bfa45bd688f9efb453ef5da617d7042 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/device.h>
index 83cb6768673374144757eb0270b8cc256408f67f..cdaf4e01d92eabab11b8a22f5d38417f989dc8dc 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _ATH11K_THERMAL_
index 9535745fe026c259c328ec28182ff155dc23ccd8..235ab8ea715fed7119e215fa31a7ef780eefb01c 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #if !defined(_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
index 2845b4313d3abc57449ffafd96d4f6d8ed180745..8a65fa04b48d98c6307632cd8c764e954ac0f60e 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 20212023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/skbuff.h>
 #include <linux/ctype.h>
index 100bb816b59230b9bb5ace8d06469d905aeb10a0..ff0a9a92beeb037e775db0d5dcdbfc3b1d56aba0 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH11K_WMI_H
@@ -1096,25 +1096,27 @@ enum wmi_tlv_vdev_param {
 };
 
 enum wmi_tlv_peer_flags {
-       WMI_TLV_PEER_AUTH = 0x00000001,
-       WMI_TLV_PEER_QOS = 0x00000002,
-       WMI_TLV_PEER_NEED_PTK_4_WAY = 0x00000004,
-       WMI_TLV_PEER_NEED_GTK_2_WAY = 0x00000010,
-       WMI_TLV_PEER_APSD = 0x00000800,
-       WMI_TLV_PEER_HT = 0x00001000,
-       WMI_TLV_PEER_40MHZ = 0x00002000,
-       WMI_TLV_PEER_STBC = 0x00008000,
-       WMI_TLV_PEER_LDPC = 0x00010000,
-       WMI_TLV_PEER_DYN_MIMOPS = 0x00020000,
-       WMI_TLV_PEER_STATIC_MIMOPS = 0x00040000,
-       WMI_TLV_PEER_SPATIAL_MUX = 0x00200000,
-       WMI_TLV_PEER_VHT = 0x02000000,
-       WMI_TLV_PEER_80MHZ = 0x04000000,
-       WMI_TLV_PEER_PMF = 0x08000000,
+       WMI_PEER_AUTH           = 0x00000001,
+       WMI_PEER_QOS            = 0x00000002,
+       WMI_PEER_NEED_PTK_4_WAY = 0x00000004,
+       WMI_PEER_NEED_GTK_2_WAY = 0x00000010,
+       WMI_PEER_HE             = 0x00000400,
+       WMI_PEER_APSD           = 0x00000800,
+       WMI_PEER_HT             = 0x00001000,
+       WMI_PEER_40MHZ          = 0x00002000,
+       WMI_PEER_STBC           = 0x00008000,
+       WMI_PEER_LDPC           = 0x00010000,
+       WMI_PEER_DYN_MIMOPS     = 0x00020000,
+       WMI_PEER_STATIC_MIMOPS  = 0x00040000,
+       WMI_PEER_SPATIAL_MUX    = 0x00200000,
+       WMI_PEER_TWT_REQ        = 0x00400000,
+       WMI_PEER_TWT_RESP       = 0x00800000,
+       WMI_PEER_VHT            = 0x02000000,
+       WMI_PEER_80MHZ          = 0x04000000,
+       WMI_PEER_PMF            = 0x08000000,
        WMI_PEER_IS_P2P_CAPABLE = 0x20000000,
        WMI_PEER_160MHZ         = 0x40000000,
        WMI_PEER_SAFEMODE_EN    = 0x80000000,
-
 };
 
 /** Enum list of TLV Tags for each parameter structure type. */
@@ -2580,7 +2582,6 @@ struct wmi_service_available_event {
 struct ath11k_pdev_wmi {
        struct ath11k_wmi_base *wmi_ab;
        enum ath11k_htc_ep_id eid;
-       const struct wmi_peer_flags_map *peer_flags;
        u32 rx_decap_mode;
        wait_queue_head_t tx_ce_desc_wq;
 };
@@ -4062,31 +4063,6 @@ struct wmi_unit_test_cmd {
 
 #define MAX_SUPPORTED_RATES 128
 
-#define WMI_PEER_AUTH          0x00000001
-#define WMI_PEER_QOS           0x00000002
-#define WMI_PEER_NEED_PTK_4_WAY        0x00000004
-#define WMI_PEER_NEED_GTK_2_WAY        0x00000010
-#define WMI_PEER_HE            0x00000400
-#define WMI_PEER_APSD          0x00000800
-#define WMI_PEER_HT            0x00001000
-#define WMI_PEER_40MHZ         0x00002000
-#define WMI_PEER_STBC          0x00008000
-#define WMI_PEER_LDPC          0x00010000
-#define WMI_PEER_DYN_MIMOPS    0x00020000
-#define WMI_PEER_STATIC_MIMOPS 0x00040000
-#define WMI_PEER_SPATIAL_MUX   0x00200000
-#define WMI_PEER_TWT_REQ       0x00400000
-#define WMI_PEER_TWT_RESP      0x00800000
-#define WMI_PEER_VHT           0x02000000
-#define WMI_PEER_80MHZ         0x04000000
-#define WMI_PEER_PMF           0x08000000
-/* TODO: Place holder for WLAN_PEER_F_PS_PRESEND_REQUIRED = 0x10000000.
- * Need to be cleaned up
- */
-#define WMI_PEER_IS_P2P_CAPABLE        0x20000000
-#define WMI_PEER_160MHZ                0x40000000
-#define WMI_PEER_SAFEMODE_EN   0x80000000
-
 struct beacon_tmpl_params {
        u8 vdev_id;
        u32 tim_ie_offset;
@@ -5754,7 +5730,6 @@ struct ath11k_wmi_base {
        struct completion unified_ready;
        DECLARE_BITMAP(svc_map, WMI_MAX_EXT2_SERVICE);
        wait_queue_head_t tx_credits_wq;
-       const struct wmi_peer_flags_map *peer_flags;
        u32 num_mem_chunks;
        u32 rx_decap_mode;
        struct wmi_host_mem_chunk mem_chunks[WMI_MAX_MEM_REQS];
index 553ba850d910b557fe464862f71123a6bf9c1409..c85811e3f42b2d4664b8bda40398e5808bddb985 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _WOW_H_
index 4f9c514c13e7f04c31949c2ca35ca295b84ff7ad..e135d2b1b61d6675bb6d855e14c8952aa8a28770 100644 (file)
@@ -2,7 +2,7 @@
 config ATH12K
        tristate "Qualcomm Technologies Wi-Fi 7 support (ath12k)"
        depends on MAC80211 && HAS_DMA && PCI
-       depends on CRYPTO_MICHAEL_MIC
+       select CRYPTO_MICHAEL_MIC
        select QCOM_QMI_HELPERS
        select MHI_BUS
        select QRTR
index b936760b51408d4fca0956c23993a05eb692ef30..6c01b282fcd330a73c8b3c9635b135e65cd4abc0 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -698,13 +698,15 @@ int ath12k_core_qmi_firmware_ready(struct ath12k_base *ab)
        ret = ath12k_core_rfkill_config(ab);
        if (ret && ret != -EOPNOTSUPP) {
                ath12k_err(ab, "failed to config rfkill: %d\n", ret);
-               goto err_core_stop;
+               goto err_core_pdev_destroy;
        }
 
        mutex_unlock(&ab->core_lock);
 
        return 0;
 
+err_core_pdev_destroy:
+       ath12k_core_pdev_destroy(ab);
 err_core_stop:
        ath12k_core_stop(ab);
        ath12k_mac_destroy(ab);
index 68c42ca44fcb5f9c682044237c45950898225680..8458dc292821a3bdbfcfcd92365dab0f3ef734b9 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_CORE_H
@@ -199,6 +199,8 @@ enum ath12k_dev_flags {
        ATH12K_FLAG_REGISTERED,
        ATH12K_FLAG_QMI_FAIL,
        ATH12K_FLAG_HTC_SUSPEND_COMPLETE,
+       ATH12K_FLAG_CE_IRQ_ENABLED,
+       ATH12K_FLAG_EXT_IRQ_ENABLED,
 };
 
 enum ath12k_monitor_flags {
@@ -467,7 +469,6 @@ struct ath12k {
        struct ath12k_base *ab;
        struct ath12k_pdev *pdev;
        struct ieee80211_hw *hw;
-       struct ieee80211_ops *ops;
        struct ath12k_wmi_pdev *wmi;
        struct ath12k_pdev_dp dp;
        u8 mac_addr[ETH_ALEN];
index 8fbf868e6f7ec060e0abaea5fc2ffc7a23d00511..788160c84c6868a9ac5134d45079b17ad220ca9b 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index 45d33279e665deffe018dbaa889f6e1ed2ee1cf0..fe5a732ba9ec94fc0350e3c471d1315b8216abf3 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/vmalloc.h>
index 6893466f61f04756932b1f3b67f6cb073a9fc2d9..a6f81f2f97ef45a6e739fea29d27d3cef0263a18 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <crypto/hash.h>
@@ -961,9 +961,7 @@ int ath12k_dp_service_srng(struct ath12k_base *ab,
                struct ath12k_dp *dp = &ab->dp;
                struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
 
-               ath12k_dp_rx_bufs_replenish(ab, 0, rx_ring, 0,
-                                           ab->hw_params->hal_params->rx_buf_rbm,
-                                           true);
+               ath12k_dp_rx_bufs_replenish(ab, rx_ring, 0);
        }
 
        /* TODO: Implement handler for other interrupts */
index 61f765432516bb2f0a8864754437b1f60e500695..1df3cdd461400aec42207118b5a113f5f83a876a 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_DP_H
@@ -31,7 +31,7 @@ struct dp_srng {
        u32 ring_id;
 };
 
-struct dp_rxdma_ring {
+struct dp_rxdma_mon_ring {
        struct dp_srng refill_buf_ring;
        struct idr bufs_idr;
        /* Protects bufs_idr */
@@ -39,6 +39,11 @@ struct dp_rxdma_ring {
        int bufs_max;
 };
 
+struct dp_rxdma_ring {
+       struct dp_srng refill_buf_ring;
+       int bufs_max;
+};
+
 #define ATH12K_TX_COMPL_NEXT(x)        (((x) + 1) % DP_TX_COMP_RING_SIZE)
 
 struct dp_tx_ring {
@@ -353,8 +358,8 @@ struct ath12k_dp {
        struct dp_rxdma_ring rx_refill_buf_ring;
        struct dp_srng rx_mac_buf_ring[MAX_RXDMA_PER_PDEV];
        struct dp_srng rxdma_err_dst_ring[MAX_RXDMA_PER_PDEV];
-       struct dp_rxdma_ring rxdma_mon_buf_ring;
-       struct dp_rxdma_ring tx_mon_buf_ring;
+       struct dp_rxdma_mon_ring rxdma_mon_buf_ring;
+       struct dp_rxdma_mon_ring tx_mon_buf_ring;
        struct ath12k_reo_q_addr_lut reoq_lut;
 };
 
index f44bc5494ce7358e9b7f456ccfd22f7cfa3f0864..be4b39f5fa800100b483dd24760457339583b8ee 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "dp_mon.h"
@@ -797,7 +797,7 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab,
                /* TODO: add msdu start parsing logic */
                break;
        case HAL_MON_BUF_ADDR: {
-               struct dp_rxdma_ring *buf_ring = &ab->dp.rxdma_mon_buf_ring;
+               struct dp_rxdma_mon_ring *buf_ring = &ab->dp.rxdma_mon_buf_ring;
                struct dp_mon_packet_info *packet_info =
                        (struct dp_mon_packet_info *)tlv_data;
                int buf_id = u32_get_bits(packet_info->cookie,
@@ -1091,7 +1091,7 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct
        spin_unlock_bh(&ar->ab->base_lock);
 
        ath12k_dbg(ar->ab, ATH12K_DBG_DATA,
-                  "rx skb %pK len %u peer %pM %u %s %s%s%s%s%s%s%s %srate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i amsdu-more %i\n",
+                  "rx skb %pK len %u peer %pM %u %s %s%s%s%s%s%s%s%s %srate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i amsdu-more %i\n",
                   msdu,
                   msdu->len,
                   peer ? peer->addr : NULL,
@@ -1104,6 +1104,7 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct
                   (status->bw == RATE_INFO_BW_40) ? "40" : "",
                   (status->bw == RATE_INFO_BW_80) ? "80" : "",
                   (status->bw == RATE_INFO_BW_160) ? "160" : "",
+                  (status->bw == RATE_INFO_BW_320) ? "320" : "",
                   status->enc_flags & RX_ENC_FLAG_SHORT_GI ? "sgi " : "",
                   status->rate_idx,
                   status->nss,
@@ -1259,7 +1260,7 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar,
 }
 
 int ath12k_dp_mon_buf_replenish(struct ath12k_base *ab,
-                               struct dp_rxdma_ring *buf_ring,
+                               struct dp_rxdma_mon_ring *buf_ring,
                                int req_entries)
 {
        struct hal_mon_buf_ring *mon_buf;
@@ -1902,7 +1903,7 @@ ath12k_dp_mon_tx_parse_status_tlv(struct ath12k_base *ab,
        }
 
        case HAL_MON_BUF_ADDR: {
-               struct dp_rxdma_ring *buf_ring = &ab->dp.tx_mon_buf_ring;
+               struct dp_rxdma_mon_ring *buf_ring = &ab->dp.tx_mon_buf_ring;
                struct dp_mon_packet_info *packet_info =
                        (struct dp_mon_packet_info *)tlv_data;
                int buf_id = u32_get_bits(packet_info->cookie,
@@ -2067,7 +2068,7 @@ int ath12k_dp_mon_srng_process(struct ath12k *ar, int mac_id, int *budget,
        struct ath12k_skb_rxcb *rxcb;
        struct dp_srng *mon_dst_ring;
        struct hal_srng *srng;
-       struct dp_rxdma_ring *buf_ring;
+       struct dp_rxdma_mon_ring *buf_ring;
        u64 cookie;
        u32 ppdu_id;
        int num_buffs_reaped = 0, srng_id, buf_id;
@@ -2480,7 +2481,7 @@ int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
        struct ath12k_skb_rxcb *rxcb;
        struct dp_srng *mon_dst_ring;
        struct hal_srng *srng;
-       struct dp_rxdma_ring *buf_ring;
+       struct dp_rxdma_mon_ring *buf_ring;
        struct ath12k_sta *arsta = NULL;
        struct ath12k_peer *peer;
        u64 cookie;
index c18c385798a110d7710d9021b1017992a29e2215..fb9e9c176ce57b402bc729fc64f8ca3edd6861be 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_DP_MON_H
@@ -80,7 +80,7 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar,
                                  int mac_id, struct sk_buff *skb,
                                  struct napi_struct *napi);
 int ath12k_dp_mon_buf_replenish(struct ath12k_base *ab,
-                               struct dp_rxdma_ring *buf_ring,
+                               struct dp_rxdma_mon_ring *buf_ring,
                                int req_entries);
 int ath12k_dp_mon_srng_process(struct ath12k *ar, int mac_id,
                               int *budget, enum dp_monitor_mode monitor_mode,
index 3543fadac4a576b562dbae1bf0031f5f084dcc1d..1ee83f7659293e80f5a2df523f2a6d3db999c4ea 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/ieee80211.h>
@@ -256,22 +256,20 @@ static int ath12k_dp_purge_mon_ring(struct ath12k_base *ab)
 }
 
 /* Returns number of Rx buffers replenished */
-int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab, int mac_id,
+int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab,
                                struct dp_rxdma_ring *rx_ring,
-                               int req_entries,
-                               enum hal_rx_buf_return_buf_manager mgr,
-                               bool hw_cc)
+                               int req_entries)
 {
        struct ath12k_buffer_addr *desc;
        struct hal_srng *srng;
        struct sk_buff *skb;
        int num_free;
        int num_remain;
-       int buf_id;
        u32 cookie;
        dma_addr_t paddr;
        struct ath12k_dp *dp = &ab->dp;
        struct ath12k_rx_desc_info *rx_desc;
+       enum hal_rx_buf_return_buf_manager mgr = ab->hw_params->hal_params->rx_buf_rbm;
 
        req_entries = min(req_entries, rx_ring->bufs_max);
 
@@ -307,42 +305,29 @@ int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab, int mac_id,
                if (dma_mapping_error(ab->dev, paddr))
                        goto fail_free_skb;
 
-               if (hw_cc) {
-                       spin_lock_bh(&dp->rx_desc_lock);
-
-                       /* Get desc from free list and store in used list
-                        * for cleanup purposes
-                        *
-                        * TODO: pass the removed descs rather than
-                        * add/read to optimize
-                        */
-                       rx_desc = list_first_entry_or_null(&dp->rx_desc_free_list,
-                                                          struct ath12k_rx_desc_info,
-                                                          list);
-                       if (!rx_desc) {
-                               spin_unlock_bh(&dp->rx_desc_lock);
-                               goto fail_dma_unmap;
-                       }
-
-                       rx_desc->skb = skb;
-                       cookie = rx_desc->cookie;
-                       list_del(&rx_desc->list);
-                       list_add_tail(&rx_desc->list, &dp->rx_desc_used_list);
+               spin_lock_bh(&dp->rx_desc_lock);
 
+               /* Get desc from free list and store in used list
+                * for cleanup purposes
+                *
+                * TODO: pass the removed descs rather than
+                * add/read to optimize
+                */
+               rx_desc = list_first_entry_or_null(&dp->rx_desc_free_list,
+                                                  struct ath12k_rx_desc_info,
+                                                  list);
+               if (!rx_desc) {
                        spin_unlock_bh(&dp->rx_desc_lock);
-               } else {
-                       spin_lock_bh(&rx_ring->idr_lock);
-                       buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0,
-                                          rx_ring->bufs_max * 3, GFP_ATOMIC);
-                       spin_unlock_bh(&rx_ring->idr_lock);
-                       if (buf_id < 0)
-                               goto fail_dma_unmap;
-                       cookie = u32_encode_bits(mac_id,
-                                                DP_RXDMA_BUF_COOKIE_PDEV_ID) |
-                                u32_encode_bits(buf_id,
-                                                DP_RXDMA_BUF_COOKIE_BUF_ID);
+                       goto fail_dma_unmap;
                }
 
+               rx_desc->skb = skb;
+               cookie = rx_desc->cookie;
+               list_del(&rx_desc->list);
+               list_add_tail(&rx_desc->list, &dp->rx_desc_used_list);
+
+               spin_unlock_bh(&dp->rx_desc_lock);
+
                desc = ath12k_hal_srng_src_get_next_entry(ab, srng);
                if (!desc)
                        goto fail_buf_unassign;
@@ -361,17 +346,11 @@ int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab, int mac_id,
        return req_entries - num_remain;
 
 fail_buf_unassign:
-       if (hw_cc) {
-               spin_lock_bh(&dp->rx_desc_lock);
-               list_del(&rx_desc->list);
-               list_add_tail(&rx_desc->list, &dp->rx_desc_free_list);
-               rx_desc->skb = NULL;
-               spin_unlock_bh(&dp->rx_desc_lock);
-       } else {
-               spin_lock_bh(&rx_ring->idr_lock);
-               idr_remove(&rx_ring->bufs_idr, buf_id);
-               spin_unlock_bh(&rx_ring->idr_lock);
-       }
+       spin_lock_bh(&dp->rx_desc_lock);
+       list_del(&rx_desc->list);
+       list_add_tail(&rx_desc->list, &dp->rx_desc_free_list);
+       rx_desc->skb = NULL;
+       spin_unlock_bh(&dp->rx_desc_lock);
 fail_dma_unmap:
        dma_unmap_single(ab->dev, paddr, skb->len + skb_tailroom(skb),
                         DMA_FROM_DEVICE);
@@ -385,8 +364,8 @@ fail_free_skb:
        return req_entries - num_remain;
 }
 
-static int ath12k_dp_rxdma_buf_ring_free(struct ath12k_base *ab,
-                                        struct dp_rxdma_ring *rx_ring)
+static int ath12k_dp_rxdma_mon_buf_ring_free(struct ath12k_base *ab,
+                                            struct dp_rxdma_mon_ring *rx_ring)
 {
        struct sk_buff *skb;
        int buf_id;
@@ -411,46 +390,49 @@ static int ath12k_dp_rxdma_buf_ring_free(struct ath12k_base *ab,
 static int ath12k_dp_rxdma_buf_free(struct ath12k_base *ab)
 {
        struct ath12k_dp *dp = &ab->dp;
-       struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
 
-       ath12k_dp_rxdma_buf_ring_free(ab, rx_ring);
+       ath12k_dp_rxdma_mon_buf_ring_free(ab, &dp->rxdma_mon_buf_ring);
+
+       ath12k_dp_rxdma_mon_buf_ring_free(ab, &dp->tx_mon_buf_ring);
+
+       return 0;
+}
 
-       rx_ring = &dp->rxdma_mon_buf_ring;
-       ath12k_dp_rxdma_buf_ring_free(ab, rx_ring);
+static int ath12k_dp_rxdma_mon_ring_buf_setup(struct ath12k_base *ab,
+                                             struct dp_rxdma_mon_ring *rx_ring,
+                                             u32 ringtype)
+{
+       int num_entries;
 
-       rx_ring = &dp->tx_mon_buf_ring;
-       ath12k_dp_rxdma_buf_ring_free(ab, rx_ring);
+       num_entries = rx_ring->refill_buf_ring.size /
+               ath12k_hal_srng_get_entrysize(ab, ringtype);
+
+       rx_ring->bufs_max = num_entries;
+       ath12k_dp_mon_buf_replenish(ab, rx_ring, num_entries);
 
        return 0;
 }
 
 static int ath12k_dp_rxdma_ring_buf_setup(struct ath12k_base *ab,
-                                         struct dp_rxdma_ring *rx_ring,
-                                         u32 ringtype)
+                                         struct dp_rxdma_ring *rx_ring)
 {
        int num_entries;
 
        num_entries = rx_ring->refill_buf_ring.size /
-               ath12k_hal_srng_get_entrysize(ab, ringtype);
+               ath12k_hal_srng_get_entrysize(ab, HAL_RXDMA_BUF);
 
        rx_ring->bufs_max = num_entries;
-       if ((ringtype == HAL_RXDMA_MONITOR_BUF) || (ringtype == HAL_TX_MONITOR_BUF))
-               ath12k_dp_mon_buf_replenish(ab, rx_ring, num_entries);
-       else
-               ath12k_dp_rx_bufs_replenish(ab, 0, rx_ring, num_entries,
-                                           ab->hw_params->hal_params->rx_buf_rbm,
-                                           ringtype == HAL_RXDMA_BUF);
+       ath12k_dp_rx_bufs_replenish(ab, rx_ring, num_entries);
+
        return 0;
 }
 
 static int ath12k_dp_rxdma_buf_setup(struct ath12k_base *ab)
 {
        struct ath12k_dp *dp = &ab->dp;
-       struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
        int ret;
 
-       ret = ath12k_dp_rxdma_ring_buf_setup(ab, rx_ring,
-                                            HAL_RXDMA_BUF);
+       ret = ath12k_dp_rxdma_ring_buf_setup(ab, &dp->rx_refill_buf_ring);
        if (ret) {
                ath12k_warn(ab,
                            "failed to setup HAL_RXDMA_BUF\n");
@@ -458,18 +440,18 @@ static int ath12k_dp_rxdma_buf_setup(struct ath12k_base *ab)
        }
 
        if (ab->hw_params->rxdma1_enable) {
-               rx_ring = &dp->rxdma_mon_buf_ring;
-               ret = ath12k_dp_rxdma_ring_buf_setup(ab, rx_ring,
-                                                    HAL_RXDMA_MONITOR_BUF);
+               ret = ath12k_dp_rxdma_mon_ring_buf_setup(ab,
+                                                        &dp->rxdma_mon_buf_ring,
+                                                        HAL_RXDMA_MONITOR_BUF);
                if (ret) {
                        ath12k_warn(ab,
                                    "failed to setup HAL_RXDMA_MONITOR_BUF\n");
                        return ret;
                }
 
-               rx_ring = &dp->tx_mon_buf_ring;
-               ret = ath12k_dp_rxdma_ring_buf_setup(ab, rx_ring,
-                                                    HAL_TX_MONITOR_BUF);
+               ret = ath12k_dp_rxdma_mon_ring_buf_setup(ab,
+                                                        &dp->tx_mon_buf_ring,
+                                                        HAL_TX_MONITOR_BUF);
                if (ret) {
                        ath12k_warn(ab,
                                    "failed to setup HAL_TX_MONITOR_BUF\n");
@@ -1339,9 +1321,6 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
        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;
 
@@ -2438,7 +2417,7 @@ static void ath12k_dp_rx_deliver_msdu(struct ath12k *ar, struct napi_struct *nap
        spin_unlock_bh(&ab->base_lock);
 
        ath12k_dbg(ab, ATH12K_DBG_DATA,
-                  "rx skb %pK len %u peer %pM %d %s sn %u %s%s%s%s%s%s%s%s rate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i amsdu-more %i\n",
+                  "rx skb %pK len %u peer %pM %d %s sn %u %s%s%s%s%s%s%s%s%s rate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i amsdu-more %i\n",
                   msdu,
                   msdu->len,
                   peer ? peer->addr : NULL,
@@ -2452,6 +2431,7 @@ static void ath12k_dp_rx_deliver_msdu(struct ath12k *ar, struct napi_struct *nap
                   (status->bw == RATE_INFO_BW_40) ? "40" : "",
                   (status->bw == RATE_INFO_BW_80) ? "80" : "",
                   (status->bw == RATE_INFO_BW_160) ? "160" : "",
+                  (status->bw == RATE_INFO_BW_320) ? "320" : "",
                   status->enc_flags & RX_ENC_FLAG_SHORT_GI ? "sgi " : "",
                   status->rate_idx,
                   status->nss,
@@ -2714,9 +2694,7 @@ try_again:
        if (!total_msdu_reaped)
                goto exit;
 
-       /* TODO: Move to implicit BM? */
-       ath12k_dp_rx_bufs_replenish(ab, 0, rx_ring, num_buffs_reaped,
-                                   ab->hw_params->hal_params->rx_buf_rbm, true);
+       ath12k_dp_rx_bufs_replenish(ab, rx_ring, num_buffs_reaped);
 
        ath12k_dp_rx_process_received_packets(ab, napi, &msdu_list,
                                              ring_id);
@@ -3494,8 +3472,7 @@ exit:
 
        rx_ring = &dp->rx_refill_buf_ring;
 
-       ath12k_dp_rx_bufs_replenish(ab, 0, rx_ring, tot_n_bufs_reaped,
-                                   ab->hw_params->hal_params->rx_buf_rbm, true);
+       ath12k_dp_rx_bufs_replenish(ab, rx_ring, tot_n_bufs_reaped);
 
        return tot_n_bufs_reaped;
 }
@@ -3808,8 +3785,7 @@ int ath12k_dp_rx_process_wbm_err(struct ath12k_base *ab,
        if (!num_buffs_reaped)
                goto done;
 
-       ath12k_dp_rx_bufs_replenish(ab, 0, rx_ring, num_buffs_reaped,
-                                   ab->hw_params->hal_params->rx_buf_rbm, true);
+       ath12k_dp_rx_bufs_replenish(ab, rx_ring, num_buffs_reaped);
 
        rcu_read_lock();
        for (i = 0; i <  ab->num_radios; i++) {
@@ -4090,9 +4066,6 @@ int ath12k_dp_rx_alloc(struct ath12k_base *ab)
        struct ath12k_dp *dp = &ab->dp;
        int i, ret;
 
-       idr_init(&dp->rx_refill_buf_ring.bufs_idr);
-       spin_lock_init(&dp->rx_refill_buf_ring.idr_lock);
-
        idr_init(&dp->rxdma_mon_buf_ring.bufs_idr);
        spin_lock_init(&dp->rxdma_mon_buf_ring.idr_lock);
 
index c955b5c859d14796e8f29bb375ab292ba8aa5ee1..05b3d5581dbe2bd9814a3e84fe2f407a4fd4217b 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #ifndef ATH12K_DP_RX_H
 #define ATH12K_DP_RX_H
@@ -116,11 +116,9 @@ int ath12k_dp_rx_process_err(struct ath12k_base *ab, struct napi_struct *napi,
 int ath12k_dp_rx_process(struct ath12k_base *ab, int mac_id,
                         struct napi_struct *napi,
                         int budget);
-int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab, int mac_id,
+int ath12k_dp_rx_bufs_replenish(struct ath12k_base *ab,
                                struct dp_rxdma_ring *rx_ring,
-                               int req_entries,
-                               enum hal_rx_buf_return_buf_manager mgr,
-                               bool hw_cc);
+                               int req_entries);
 int ath12k_dp_rx_pdev_mon_attach(struct ath12k *ar);
 int ath12k_dp_rx_peer_frag_setup(struct ath12k *ar, const u8 *peer_mac, int vdev_id);
 
index 492ca6ce67140aa1b9d79bbd03147e54264d6a53..62f9cdbb811c0264bad69f220ce5741c85a34d54 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
index eca86fc25a60843dfdbc76a72f4f1d10c493f3e4..a489369d806870dedb4b392dcbc46044284a8832 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/dma-mapping.h>
 #include "hal_tx.h"
@@ -889,8 +889,8 @@ static u8 *ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
 
 static bool ath12k_hw_wcn7850_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
 {
-       return __le16_to_cpu(desc->u.wcn7850.msdu_end.info5) &
-              RX_MSDU_END_INFO5_DA_IS_MCBC;
+       return __le32_to_cpu(desc->u.wcn7850.msdu_end.info13) &
+              RX_MSDU_END_INFO13_MCAST_BCAST;
 }
 
 static void ath12k_hw_wcn7850_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
index 66035a787c728dee66e5c062026913d230469431..fc47e7e6b498a10345a8eaae301430913cbd64d9 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_HAL_H
index f6afbd8196bf535a93f2bf63a2e91290d791e1f3..4f25eb9f774538581d0bb9016294643d332d656b 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "debug.h"
index fcfb6c819047366063cbf4b7f746b755144eb477..095216eabc01dc1531d43cfb73967e17a6cbd770 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_HAL_RX_H
@@ -61,6 +61,7 @@ enum hal_rx_bw {
        HAL_RX_BW_40MHZ,
        HAL_RX_BW_80MHZ,
        HAL_RX_BW_160MHZ,
+       HAL_RX_BW_320MHZ,
        HAL_RX_BW_MAX,
 };
 
index 4095fd82b1b3ff11a1e689eeb8b8c976354fbdd2..c653ca1f59b22d9a1955df70236572c60707185b 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_HIF_H
index 2245fb510ba2caa0ea845d5d77e8146f8e0d9bed..de60d988d8608f0ec2525d8bfb467886a7b099e8 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/types.h>
@@ -949,7 +949,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
                .rx_mac_buf_ring = true,
                .vdev_start_delay = true,
 
-               .interface_modes = BIT(NL80211_IFTYPE_STATION),
+               .interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                  BIT(NL80211_IFTYPE_AP),
                .supports_monitor = false,
 
                .idle_ps = true,
index 2d6427cf41a4d149bba96961145c7851130c8c2c..d2622bfef94226447f7d0d4485238681c5307442 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_HW_H
index fc0d14ea328e611a856d1ca8cd2b7f736919ade0..88cec54c6c2e64e02bd0af9d27ee6c92faa6a971 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <net/mac80211.h>
@@ -343,6 +343,9 @@ ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
        case ATH12K_BW_160:
                ret = RATE_INFO_BW_160;
                break;
+       case ATH12K_BW_320:
+               ret = RATE_INFO_BW_320;
+               break;
        }
 
        return ret;
@@ -359,6 +362,8 @@ enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw b
                return ATH12K_BW_80;
        case RATE_INFO_BW_160:
                return ATH12K_BW_160;
+       case RATE_INFO_BW_320:
+               return ATH12K_BW_320;
        default:
                return ATH12K_BW_20;
        }
@@ -3726,6 +3731,9 @@ static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
        case IEEE80211_STA_RX_BW_160:
                bw = WMI_PEER_CHWIDTH_160MHZ;
                break;
+       case IEEE80211_STA_RX_BW_320:
+               bw = WMI_PEER_CHWIDTH_320MHZ;
+               break;
        default:
                ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
                            sta->deflink.bandwidth, sta->addr);
@@ -4987,7 +4995,7 @@ static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
                if (ret) {
                        ath12k_warn(ar->ab, "failed to queue management frame %d\n",
                                    ret);
-                       ieee80211_free_txskb(ar->hw, skb);
+                       ieee80211_free_txskb(hw, skb);
                }
                return;
        }
@@ -4995,7 +5003,7 @@ static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
        ret = ath12k_dp_tx(ar, arvif, skb);
        if (ret) {
                ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
-               ieee80211_free_txskb(ar->hw, skb);
+               ieee80211_free_txskb(hw, skb);
        }
 }
 
@@ -5596,7 +5604,7 @@ static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
                goto err_peer_del;
 
        param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
-       param_value = ar->hw->wiphy->rts_threshold;
+       param_value = hw->wiphy->rts_threshold;
        ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
                                            param_id, param_value);
        if (ret) {
@@ -6258,10 +6266,11 @@ ath12k_mac_update_active_vif_chan(struct ath12k *ar,
                                  struct ieee80211_chanctx_conf *ctx)
 {
        struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx };
+       struct ieee80211_hw *hw = ar->hw;
 
        lockdep_assert_held(&ar->conf_mutex);
 
-       ieee80211_iterate_active_interfaces_atomic(ar->hw,
+       ieee80211_iterate_active_interfaces_atomic(hw,
                                                   IEEE80211_IFACE_ITER_NORMAL,
                                                   ath12k_mac_change_chanctx_cnt_iter,
                                                   &arg);
@@ -6272,7 +6281,7 @@ ath12k_mac_update_active_vif_chan(struct ath12k *ar,
        if (!arg.vifs)
                return;
 
-       ieee80211_iterate_active_interfaces_atomic(ar->hw,
+       ieee80211_iterate_active_interfaces_atomic(hw,
                                                   IEEE80211_IFACE_ITER_NORMAL,
                                                   ath12k_mac_change_chanctx_fill_iter,
                                                   &arg);
@@ -6380,8 +6389,8 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
        }
 
        if (ab->hw_params->vdev_start_delay &&
-           (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
-           arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)) {
+           arvif->vdev_type != WMI_VDEV_TYPE_AP &&
+           arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
                param.vdev_id = arvif->vdev_id;
                param.peer_type = WMI_PEER_TYPE_DEFAULT;
                param.peer_addr = ar->mac_addr;
@@ -6836,7 +6845,7 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
                                    arvif->vdev_id, ret);
                        return ret;
                }
-               ieee80211_iterate_stations_atomic(ar->hw,
+               ieee80211_iterate_stations_atomic(hw,
                                                  ath12k_mac_disable_peer_fixed_rate,
                                                  arvif);
        } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, band, mask,
@@ -6882,14 +6891,14 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
                        return -EINVAL;
                }
 
-               ieee80211_iterate_stations_atomic(ar->hw,
+               ieee80211_iterate_stations_atomic(hw,
                                                  ath12k_mac_disable_peer_fixed_rate,
                                                  arvif);
 
                mutex_lock(&ar->conf_mutex);
 
                arvif->bitrate_mask = *mask;
-               ieee80211_iterate_stations_atomic(ar->hw,
+               ieee80211_iterate_stations_atomic(hw,
                                                  ath12k_mac_set_bitrate_mask_iter,
                                                  arvif);
 
@@ -6927,7 +6936,7 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
                ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
                            ar->pdev->pdev_id);
                ar->state = ATH12K_STATE_ON;
-               ieee80211_wake_queues(ar->hw);
+               ieee80211_wake_queues(hw);
 
                if (ab->is_reset) {
                        recovery_count = atomic_inc_return(&ab->recovery_count);
@@ -7151,6 +7160,7 @@ static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
                                           u32 supported_bands)
 {
+       struct ieee80211_hw *hw = ar->hw;
        struct ieee80211_supported_band *band;
        struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
        void *channels;
@@ -7176,7 +7186,7 @@ static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
                band->channels = channels;
                band->n_bitrates = ath12k_g_rates_size;
                band->bitrates = ath12k_g_rates;
-               ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
+               hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
 
                if (ar->ab->hw_params->single_pdev_only) {
                        phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
@@ -7203,7 +7213,7 @@ static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
                        band->channels = channels;
                        band->n_bitrates = ath12k_a_rates_size;
                        band->bitrates = ath12k_a_rates;
-                       ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
+                       hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
                        ath12k_mac_update_ch_list(ar, band,
                                                  reg_cap->low_5ghz_chan,
                                                  reg_cap->high_5ghz_chan);
@@ -7225,7 +7235,7 @@ static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
                        band->channels = channels;
                        band->n_bitrates = ath12k_a_rates_size;
                        band->bitrates = ath12k_a_rates;
-                       ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
+                       hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
 
                        if (ar->ab->hw_params->single_pdev_only) {
                                phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
@@ -7244,6 +7254,8 @@ static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
 static int ath12k_mac_setup_iface_combinations(struct ath12k *ar)
 {
        struct ath12k_base *ab = ar->ab;
+       struct ieee80211_hw *hw = ar->hw;
+       struct wiphy *wiphy = hw->wiphy;
        struct ieee80211_iface_combination *combinations;
        struct ieee80211_iface_limit *limits;
        int n_limits, max_interfaces;
@@ -7294,8 +7306,8 @@ static int ath12k_mac_setup_iface_combinations(struct ath12k *ar)
                                                BIT(NL80211_CHAN_WIDTH_40) |
                                                BIT(NL80211_CHAN_WIDTH_80);
 
-       ar->hw->wiphy->iface_combinations = combinations;
-       ar->hw->wiphy->n_iface_combinations = 1;
+       wiphy->iface_combinations = combinations;
+       wiphy->n_iface_combinations = 1;
 
        return 0;
 }
@@ -7339,9 +7351,12 @@ static const struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
 
 static void __ath12k_mac_unregister(struct ath12k *ar)
 {
+       struct ieee80211_hw *hw = ar->hw;
+       struct wiphy *wiphy = hw->wiphy;
+
        cancel_work_sync(&ar->regd_update_work);
 
-       ieee80211_unregister_hw(ar->hw);
+       ieee80211_unregister_hw(hw);
 
        idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
        idr_destroy(&ar->txmgmt_idr);
@@ -7350,10 +7365,10 @@ static void __ath12k_mac_unregister(struct ath12k *ar)
        kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
        kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
 
-       kfree(ar->hw->wiphy->iface_combinations[0].limits);
-       kfree(ar->hw->wiphy->iface_combinations);
+       kfree(wiphy->iface_combinations[0].limits);
+       kfree(wiphy->iface_combinations);
 
-       SET_IEEE80211_DEV(ar->hw, NULL);
+       SET_IEEE80211_DEV(hw, NULL);
 }
 
 void ath12k_mac_unregister(struct ath12k_base *ab)
@@ -7375,6 +7390,8 @@ void ath12k_mac_unregister(struct ath12k_base *ab)
 static int __ath12k_mac_register(struct ath12k *ar)
 {
        struct ath12k_base *ab = ar->ab;
+       struct ieee80211_hw *hw = ar->hw;
+       struct wiphy *wiphy = hw->wiphy;
        struct ath12k_pdev_cap *cap = &ar->pdev->cap;
        static const u32 cipher_suites[] = {
                WLAN_CIPHER_SUITE_TKIP,
@@ -7392,9 +7409,9 @@ static int __ath12k_mac_register(struct ath12k *ar)
 
        ath12k_pdev_caps_update(ar);
 
-       SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
+       SET_IEEE80211_PERM_ADDR(hw, ar->mac_addr);
 
-       SET_IEEE80211_DEV(ar->hw, ab->dev);
+       SET_IEEE80211_DEV(hw, ab->dev);
 
        ret = ath12k_mac_setup_channels_rates(ar,
                                              cap->supported_bands);
@@ -7410,103 +7427,102 @@ static int __ath12k_mac_register(struct ath12k *ar)
                goto err_free_channels;
        }
 
-       ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
-       ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
+       wiphy->available_antennas_rx = cap->rx_chain_mask;
+       wiphy->available_antennas_tx = cap->tx_chain_mask;
 
-       ar->hw->wiphy->interface_modes = ab->hw_params->interface_modes;
+       wiphy->interface_modes = ab->hw_params->interface_modes;
 
-       if (ar->hw->wiphy->bands[NL80211_BAND_2GHZ] &&
-           ar->hw->wiphy->bands[NL80211_BAND_5GHZ] &&
-           ar->hw->wiphy->bands[NL80211_BAND_6GHZ])
-               ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
+       if (wiphy->bands[NL80211_BAND_2GHZ] &&
+           wiphy->bands[NL80211_BAND_5GHZ] &&
+           wiphy->bands[NL80211_BAND_6GHZ])
+               ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
 
-       ieee80211_hw_set(ar->hw, SIGNAL_DBM);
-       ieee80211_hw_set(ar->hw, SUPPORTS_PS);
-       ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
-       ieee80211_hw_set(ar->hw, MFP_CAPABLE);
-       ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
-       ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
-       ieee80211_hw_set(ar->hw, AP_LINK_PS);
-       ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
-       ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
-       ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
-       ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
-       ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
-       ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
-       ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
+       ieee80211_hw_set(hw, SIGNAL_DBM);
+       ieee80211_hw_set(hw, SUPPORTS_PS);
+       ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
+       ieee80211_hw_set(hw, MFP_CAPABLE);
+       ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
+       ieee80211_hw_set(hw, HAS_RATE_CONTROL);
+       ieee80211_hw_set(hw, AP_LINK_PS);
+       ieee80211_hw_set(hw, SPECTRUM_MGMT);
+       ieee80211_hw_set(hw, CONNECTION_MONITOR);
+       ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
+       ieee80211_hw_set(hw, CHANCTX_STA_CSA);
+       ieee80211_hw_set(hw, QUEUE_CONTROL);
+       ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
+       ieee80211_hw_set(hw, REPORTS_LOW_ACK);
 
        if (ht_cap & WMI_HT_CAP_ENABLED) {
-               ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
-               ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
-               ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
-               ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
-               ieee80211_hw_set(ar->hw, USES_RSS);
+               ieee80211_hw_set(hw, AMPDU_AGGREGATION);
+               ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
+               ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
+               ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
+               ieee80211_hw_set(hw, USES_RSS);
        }
 
-       ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
-       ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
+       wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
+       wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
 
        /* TODO: Check if HT capability advertised from firmware is different
         * for each band for a dual band capable radio. It will be tricky to
         * handle it when the ht capability different for each band.
         */
        if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS)
-               ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
+               wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
 
-       ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
-       ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
+       wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
+       wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
 
-       ar->hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
+       hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
 
-       ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
-       ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
-       ar->hw->wiphy->max_remain_on_channel_duration = 5000;
+       wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
+       wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
+       wiphy->max_remain_on_channel_duration = 5000;
 
-       ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
-       ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
+       wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
+       wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
                                   NL80211_FEATURE_AP_SCAN;
 
        ar->max_num_stations = TARGET_NUM_STATIONS;
        ar->max_num_peers = TARGET_NUM_PEERS_PDEV;
 
-       ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
+       wiphy->max_ap_assoc_sta = ar->max_num_stations;
 
-       ar->hw->queues = ATH12K_HW_MAX_QUEUES;
-       ar->hw->wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
-       ar->hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
-       ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
+       hw->queues = ATH12K_HW_MAX_QUEUES;
+       wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
+       hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
+       hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
 
-       ar->hw->vif_data_size = sizeof(struct ath12k_vif);
-       ar->hw->sta_data_size = sizeof(struct ath12k_sta);
+       hw->vif_data_size = sizeof(struct ath12k_vif);
+       hw->sta_data_size = sizeof(struct ath12k_sta);
 
-       wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
-       wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
+       wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
+       wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
 
-       ar->hw->wiphy->cipher_suites = cipher_suites;
-       ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
+       wiphy->cipher_suites = cipher_suites;
+       wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
 
-       ar->hw->wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
-       ar->hw->wiphy->num_iftype_ext_capab =
-               ARRAY_SIZE(ath12k_iftypes_ext_capa);
+       wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
+       wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
 
        if (ar->supports_6ghz) {
-               wiphy_ext_feature_set(ar->hw->wiphy,
+               wiphy_ext_feature_set(wiphy,
                                      NL80211_EXT_FEATURE_FILS_DISCOVERY);
-               wiphy_ext_feature_set(ar->hw->wiphy,
+               wiphy_ext_feature_set(wiphy,
                                      NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
        }
 
-       wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_PUNCT);
+       wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
 
-       ath12k_reg_init(ar);
+       ath12k_reg_init(hw);
 
        if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
-               ar->hw->netdev_features = NETIF_F_HW_CSUM;
-               ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
-               ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
+               hw->netdev_features = NETIF_F_HW_CSUM;
+               ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
+               ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
        }
 
-       ret = ieee80211_register_hw(ar->hw);
+       ret = ieee80211_register_hw(hw);
        if (ret) {
                ath12k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
                goto err_free_if_combs;
@@ -7518,7 +7534,7 @@ static int __ath12k_mac_register(struct ath12k *ar)
                 * while. But that time is so short and in practise it make
                 * a difference in real life.
                 */
-               ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
+               wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
 
        /* Apply the regd received during initialization */
        ret = ath12k_regd_update(ar, true);
@@ -7530,11 +7546,11 @@ static int __ath12k_mac_register(struct ath12k *ar)
        return 0;
 
 err_unregister_hw:
-       ieee80211_unregister_hw(ar->hw);
+       ieee80211_unregister_hw(hw);
 
 err_free_if_combs:
-       kfree(ar->hw->wiphy->iface_combinations[0].limits);
-       kfree(ar->hw->wiphy->iface_combinations);
+       kfree(wiphy->iface_combinations[0].limits);
+       kfree(wiphy->iface_combinations);
 
 err_free_channels:
        kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
@@ -7542,7 +7558,7 @@ err_free_channels:
        kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
 
 err:
-       SET_IEEE80211_DEV(ar->hw, NULL);
+       SET_IEEE80211_DEV(hw, NULL);
        return ret;
 }
 
index 59b4e8f5eee059c2a1f61f0edd77765865e83e6f..7c63bb628adc1b664bb3a2df18d307b68a129c73 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_MAC_H
@@ -43,6 +43,7 @@ enum ath12k_supported_bw {
        ATH12K_BW_40    = 1,
        ATH12K_BW_80    = 2,
        ATH12K_BW_160   = 3,
+       ATH12K_BW_320   = 4,
 };
 
 extern const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default;
index 39e640293cdc0d52192d7814b0c6cf90268bd494..d5441ddb374b08158589e4e4076ce1f52ad79722 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/msi.h>
@@ -251,6 +251,7 @@ static int ath12k_mhi_get_msi(struct ath12k_pci *ab_pci)
        u32 user_base_data, base_vector;
        int ret, num_vectors, i;
        int *irq;
+       unsigned int msi_data;
 
        ret = ath12k_pci_get_user_msi_assignment(ab,
                                                 "MHI", &num_vectors,
@@ -265,9 +266,15 @@ static int ath12k_mhi_get_msi(struct ath12k_pci *ab_pci)
        if (!irq)
                return -ENOMEM;
 
-       for (i = 0; i < num_vectors; i++)
-               irq[i] = ath12k_pci_get_msi_irq(ab->dev,
-                                               base_vector + i);
+       msi_data = base_vector;
+       for (i = 0; i < num_vectors; i++) {
+               if (test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+                       irq[i] = ath12k_pci_get_msi_irq(ab->dev,
+                                                       msi_data++);
+               else
+                       irq[i] = ath12k_pci_get_msi_irq(ab->dev,
+                                                       msi_data);
+       }
 
        ab_pci->mhi_ctrl->irq = irq;
        ab_pci->mhi_ctrl->nr_irqs = num_vectors;
@@ -374,6 +381,9 @@ int ath12k_mhi_register(struct ath12k_pci *ab_pci)
                goto free_controller;
        }
 
+       if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               mhi_ctrl->irq_flags = IRQF_SHARED | IRQF_NOBALANCING;
+
        mhi_ctrl->iova_start = 0;
        mhi_ctrl->iova_stop = 0xffffffff;
        mhi_ctrl->sbl_size = SZ_512K;
index 3006cd3fbe119235ebf7b0d81d10eb46290d650a..f0d2e2d8719c006a90ebd3656d29050f6854f4a4 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -60,6 +60,17 @@ static const struct ath12k_msi_config ath12k_msi_config[] = {
        },
 };
 
+static const struct ath12k_msi_config msi_config_one_msi = {
+       .total_vectors = 1,
+       .total_users = 4,
+       .users = (struct ath12k_msi_user[]) {
+               { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
+               { .name = "CE", .num_vectors = 1, .base_vector = 0 },
+               { .name = "WAKE", .num_vectors = 1, .base_vector = 0 },
+               { .name = "DP", .num_vectors = 1, .base_vector = 0 },
+       },
+};
+
 static const char *irq_name[ATH12K_IRQ_NUM_MAX] = {
        "bhi",
        "mhi-er0",
@@ -355,16 +366,30 @@ static void ath12k_pci_free_irq(struct ath12k_base *ab)
 
 static void ath12k_pci_ce_irq_enable(struct ath12k_base *ab, u16 ce_id)
 {
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
        u32 irq_idx;
 
+       /* In case of one MSI vector, we handle irq enable/disable in a
+        * uniform way since we only have one irq
+        */
+       if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               return;
+
        irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_id;
        enable_irq(ab->irq_num[irq_idx]);
 }
 
 static void ath12k_pci_ce_irq_disable(struct ath12k_base *ab, u16 ce_id)
 {
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
        u32 irq_idx;
 
+       /* In case of one MSI vector, we handle irq enable/disable in a
+        * uniform way since we only have one irq
+        */
+       if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               return;
+
        irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_id;
        disable_irq_nosync(ab->irq_num[irq_idx]);
 }
@@ -373,6 +398,8 @@ static void ath12k_pci_ce_irqs_disable(struct ath12k_base *ab)
 {
        int i;
 
+       clear_bit(ATH12K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags);
+
        for (i = 0; i < ab->hw_params->ce_count; i++) {
                if (ath12k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
                        continue;
@@ -397,20 +424,27 @@ static void ath12k_pci_sync_ce_irqs(struct ath12k_base *ab)
 static void ath12k_pci_ce_tasklet(struct tasklet_struct *t)
 {
        struct ath12k_ce_pipe *ce_pipe = from_tasklet(ce_pipe, t, intr_tq);
+       int irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_pipe->pipe_num;
 
        ath12k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num);
 
-       ath12k_pci_ce_irq_enable(ce_pipe->ab, ce_pipe->pipe_num);
+       enable_irq(ce_pipe->ab->irq_num[irq_idx]);
 }
 
 static irqreturn_t ath12k_pci_ce_interrupt_handler(int irq, void *arg)
 {
        struct ath12k_ce_pipe *ce_pipe = arg;
+       struct ath12k_base *ab = ce_pipe->ab;
+       int irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_pipe->pipe_num;
+
+       if (!test_bit(ATH12K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags))
+               return IRQ_HANDLED;
 
        /* last interrupt received for this CE */
        ce_pipe->timestamp = jiffies;
 
-       ath12k_pci_ce_irq_disable(ce_pipe->ab, ce_pipe->pipe_num);
+       disable_irq_nosync(ab->irq_num[irq_idx]);
+
        tasklet_schedule(&ce_pipe->intr_tq);
 
        return IRQ_HANDLED;
@@ -418,8 +452,15 @@ static irqreturn_t ath12k_pci_ce_interrupt_handler(int irq, void *arg)
 
 static void ath12k_pci_ext_grp_disable(struct ath12k_ext_irq_grp *irq_grp)
 {
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(irq_grp->ab);
        int i;
 
+       /* In case of one MSI vector, we handle irq enable/disable
+        * in a uniform way since we only have one irq
+        */
+       if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               return;
+
        for (i = 0; i < irq_grp->num_irq; i++)
                disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
 }
@@ -428,6 +469,8 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)
 {
        int i;
 
+       clear_bit(ATH12K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
+
        for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {
                struct ath12k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
 
@@ -440,8 +483,15 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)
 
 static void ath12k_pci_ext_grp_enable(struct ath12k_ext_irq_grp *irq_grp)
 {
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(irq_grp->ab);
        int i;
 
+       /* In case of one MSI vector, we handle irq enable/disable in a
+        * uniform way since we only have one irq
+        */
+       if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               return;
+
        for (i = 0; i < irq_grp->num_irq; i++)
                enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
 }
@@ -467,11 +517,13 @@ static int ath12k_pci_ext_grp_napi_poll(struct napi_struct *napi, int budget)
                                                napi);
        struct ath12k_base *ab = irq_grp->ab;
        int work_done;
+       int i;
 
        work_done = ath12k_dp_service_srng(ab, irq_grp, budget);
        if (work_done < budget) {
                napi_complete_done(napi, work_done);
-               ath12k_pci_ext_grp_enable(irq_grp);
+               for (i = 0; i < irq_grp->num_irq; i++)
+                       enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
        }
 
        if (work_done > budget)
@@ -483,13 +535,19 @@ static int ath12k_pci_ext_grp_napi_poll(struct napi_struct *napi, int budget)
 static irqreturn_t ath12k_pci_ext_interrupt_handler(int irq, void *arg)
 {
        struct ath12k_ext_irq_grp *irq_grp = arg;
+       struct ath12k_base *ab = irq_grp->ab;
+       int i;
+
+       if (!test_bit(ATH12K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags))
+               return IRQ_HANDLED;
 
        ath12k_dbg(irq_grp->ab, ATH12K_DBG_PCI, "ext irq:%d\n", irq);
 
        /* last interrupt received for this group */
        irq_grp->timestamp = jiffies;
 
-       ath12k_pci_ext_grp_disable(irq_grp);
+       for (i = 0; i < irq_grp->num_irq; i++)
+               disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
 
        napi_schedule(&irq_grp->napi);
 
@@ -498,6 +556,7 @@ static irqreturn_t ath12k_pci_ext_interrupt_handler(int irq, void *arg)
 
 static int ath12k_pci_ext_irq_config(struct ath12k_base *ab)
 {
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
        int i, j, ret, num_vectors = 0;
        u32 user_base_data = 0, base_vector = 0, base_idx;
 
@@ -544,23 +603,32 @@ static int ath12k_pci_ext_irq_config(struct ath12k_base *ab)
 
                        irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);
                        ret = request_irq(irq, ath12k_pci_ext_interrupt_handler,
-                                         IRQF_SHARED,
+                                         ab_pci->irq_flags,
                                          "DP_EXT_IRQ", irq_grp);
                        if (ret) {
                                ath12k_err(ab, "failed request irq %d: %d\n",
                                           vector, ret);
                                return ret;
                        }
-
-                       disable_irq_nosync(ab->irq_num[irq_idx]);
                }
+               ath12k_pci_ext_grp_disable(irq_grp);
        }
 
        return 0;
 }
 
+static int ath12k_pci_set_irq_affinity_hint(struct ath12k_pci *ab_pci,
+                                           const struct cpumask *m)
+{
+       if (test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               return 0;
+
+       return irq_set_affinity_hint(ab_pci->pdev->irq, m);
+}
+
 static int ath12k_pci_config_irq(struct ath12k_base *ab)
 {
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
        struct ath12k_ce_pipe *ce_pipe;
        u32 msi_data_start;
        u32 msi_data_count, msi_data_idx;
@@ -589,7 +657,7 @@ static int ath12k_pci_config_irq(struct ath12k_base *ab)
                tasklet_setup(&ce_pipe->intr_tq, ath12k_pci_ce_tasklet);
 
                ret = request_irq(irq, ath12k_pci_ce_interrupt_handler,
-                                 IRQF_SHARED, irq_name[irq_idx],
+                                 ab_pci->irq_flags, irq_name[irq_idx],
                                  ce_pipe);
                if (ret) {
                        ath12k_err(ab, "failed to request irq %d: %d\n",
@@ -626,6 +694,8 @@ static void ath12k_pci_ce_irqs_enable(struct ath12k_base *ab)
 {
        int i;
 
+       set_bit(ATH12K_FLAG_CE_IRQ_ENABLED, &ab->dev_flags);
+
        for (i = 0; i < ab->hw_params->ce_count; i++) {
                if (ath12k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
                        continue;
@@ -670,16 +740,27 @@ static int ath12k_pci_msi_alloc(struct ath12k_pci *ab_pci)
                                            msi_config->total_vectors,
                                            msi_config->total_vectors,
                                            PCI_IRQ_MSI);
-       if (num_vectors != msi_config->total_vectors) {
-               ath12k_err(ab, "failed to get %d MSI vectors, only %d available",
-                          msi_config->total_vectors, num_vectors);
 
-               if (num_vectors >= 0)
-                       return -EINVAL;
-               else
-                       return num_vectors;
+       if (num_vectors == msi_config->total_vectors) {
+               set_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags);
+               ab_pci->irq_flags = IRQF_SHARED;
+       } else {
+               num_vectors = pci_alloc_irq_vectors(ab_pci->pdev,
+                                                   1,
+                                                   1,
+                                                   PCI_IRQ_MSI);
+               if (num_vectors < 0) {
+                       ret = -EINVAL;
+                       goto reset_msi_config;
+               }
+               clear_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags);
+               ab_pci->msi_config = &msi_config_one_msi;
+               ab_pci->irq_flags = IRQF_SHARED | IRQF_NOBALANCING;
+               ath12k_dbg(ab, ATH12K_DBG_PCI, "request MSI one vector\n");
        }
 
+       ath12k_info(ab, "MSI vectors: %d\n", num_vectors);
+
        ath12k_pci_msi_disable(ab_pci);
 
        msi_desc = irq_get_msi_desc(ab_pci->pdev->irq);
@@ -700,6 +781,7 @@ static int ath12k_pci_msi_alloc(struct ath12k_pci *ab_pci)
 free_msi_vector:
        pci_free_irq_vectors(ab_pci->pdev);
 
+reset_msi_config:
        return ret;
 }
 
@@ -708,6 +790,25 @@ static void ath12k_pci_msi_free(struct ath12k_pci *ab_pci)
        pci_free_irq_vectors(ab_pci->pdev);
 }
 
+static int ath12k_pci_config_msi_data(struct ath12k_pci *ab_pci)
+{
+       struct msi_desc *msi_desc;
+
+       msi_desc = irq_get_msi_desc(ab_pci->pdev->irq);
+       if (!msi_desc) {
+               ath12k_err(ab_pci->ab, "msi_desc is NULL!\n");
+               pci_free_irq_vectors(ab_pci->pdev);
+               return -EINVAL;
+       }
+
+       ab_pci->msi_ep_base_data = msi_desc->msg.data;
+
+       ath12k_dbg(ab_pci->ab, ATH12K_DBG_PCI, "pci after request_irq msi_ep_base_data %d\n",
+                  ab_pci->msi_ep_base_data);
+
+       return 0;
+}
+
 static int ath12k_pci_claim(struct ath12k_pci *ab_pci, struct pci_dev *pdev)
 {
        struct ath12k_base *ab = ab_pci->ab;
@@ -891,11 +992,11 @@ int ath12k_pci_get_user_msi_assignment(struct ath12k_base *ab, char *user_name,
        for (idx = 0; idx < msi_config->total_users; idx++) {
                if (strcmp(user_name, msi_config->users[idx].name) == 0) {
                        *num_vectors = msi_config->users[idx].num_vectors;
-                       *user_base_data = msi_config->users[idx].base_vector
-                               + ab_pci->msi_ep_base_data;
-                       *base_vector = msi_config->users[idx].base_vector;
+                       *base_vector =  msi_config->users[idx].base_vector;
+                       *user_base_data = *base_vector + ab_pci->msi_ep_base_data;
 
-                       ath12k_dbg(ab, ATH12K_DBG_PCI, "Assign MSI to user: %s, num_vectors: %d, user_base_data: %u, base_vector: %u\n",
+                       ath12k_dbg(ab, ATH12K_DBG_PCI,
+                                  "Assign MSI to user: %s, num_vectors: %d, user_base_data: %u, base_vector: %u\n",
                                   user_name, *num_vectors, *user_base_data,
                                   *base_vector);
 
@@ -956,6 +1057,8 @@ void ath12k_pci_ext_irq_enable(struct ath12k_base *ab)
 {
        int i;
 
+       set_bit(ATH12K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
+
        for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {
                struct ath12k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
 
@@ -1000,7 +1103,10 @@ int ath12k_pci_start(struct ath12k_base *ab)
 
        set_bit(ATH12K_PCI_FLAG_INIT_DONE, &ab_pci->flags);
 
-       ath12k_pci_aspm_restore(ab_pci);
+       if (test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               ath12k_pci_aspm_restore(ab_pci);
+       else
+               ath12k_info(ab, "leaving PCI ASPM disabled to avoid MHI M2 problems\n");
 
        ath12k_pci_ce_irqs_enable(ab);
        ath12k_ce_rx_post_buf(ab);
@@ -1262,10 +1368,16 @@ static int ath12k_pci_probe(struct pci_dev *pdev,
        if (ret)
                goto err_pci_msi_free;
 
+       ret = ath12k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
+       if (ret) {
+               ath12k_err(ab, "failed to set irq affinity %d\n", ret);
+               goto err_pci_msi_free;
+       }
+
        ret = ath12k_mhi_register(ab_pci);
        if (ret) {
                ath12k_err(ab, "failed to register mhi: %d\n", ret);
-               goto err_pci_msi_free;
+               goto err_irq_affinity_cleanup;
        }
 
        ret = ath12k_hal_srng_init(ab);
@@ -1286,6 +1398,17 @@ static int ath12k_pci_probe(struct pci_dev *pdev,
                goto err_ce_free;
        }
 
+       /* 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
+        * as msi_data will configured to srngs.
+        */
+       ret = ath12k_pci_config_msi_data(ab_pci);
+       if (ret) {
+               ath12k_err(ab, "failed to config msi_data: %d\n", ret);
+               goto err_free_irq;
+       }
+
        ret = ath12k_core_init(ab);
        if (ret) {
                ath12k_err(ab, "failed to init core: %d\n", ret);
@@ -1308,6 +1431,9 @@ err_mhi_unregister:
 err_pci_msi_free:
        ath12k_pci_msi_free(ab_pci);
 
+err_irq_affinity_cleanup:
+       ath12k_pci_set_irq_affinity_hint(ab_pci, NULL);
+
 err_pci_free_region:
        ath12k_pci_free_region(ab_pci);
 
@@ -1322,6 +1448,8 @@ static void ath12k_pci_remove(struct pci_dev *pdev)
        struct ath12k_base *ab = pci_get_drvdata(pdev);
        struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
 
+       ath12k_pci_set_irq_affinity_hint(ab_pci, NULL);
+
        if (test_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags)) {
                ath12k_pci_power_down(ab);
                ath12k_qmi_deinit_service(ab);
@@ -1348,7 +1476,9 @@ qmi_fail:
 static void ath12k_pci_shutdown(struct pci_dev *pdev)
 {
        struct ath12k_base *ab = pci_get_drvdata(pdev);
+       struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
 
+       ath12k_pci_set_irq_affinity_hint(ab_pci, NULL);
        ath12k_pci_power_down(ab);
 }
 
index 0f24fd9395cd9bb40a9230b8e6afd24bf4515bc5..b2edf32ada20a90f6296a80dd72c2ec5eea5da9f 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #ifndef ATH12K_PCI_H
 #define ATH12K_PCI_H
@@ -84,6 +84,7 @@ enum ath12k_pci_flags {
        ATH12K_PCI_FLAG_INIT_DONE,
        ATH12K_PCI_FLAG_IS_MSI_64,
        ATH12K_PCI_ASPM_RESTORE,
+       ATH12K_PCI_FLAG_MULTI_MSI_VECTORS,
 };
 
 struct ath12k_pci_ops {
@@ -108,6 +109,7 @@ struct ath12k_pci {
        /* enum ath12k_pci_flags */
        unsigned long flags;
        u16 link_ctl;
+       unsigned long irq_flags;
        const struct ath12k_pci_ops *pci_ops;
 };
 
index c6edb24cbedd88880ec9c564da222a208ca18a23..7b3500b5c8c20e295b2a0bbfd7627233b66a4027 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_PEER_H
index f6e949c618d0ae9943584d9c05361855f92a7025..77a132f6bbd1be09c2d74f572bbd60ea526b603e 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/elf.h>
index e20d6511d1ca04e411b1b1f044a5290c1e388930..e25bbaa125e83346e5cc7541aac196e89215a8ad 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_QMI_H
index 5c006256c82ad16ad8c1045629e97987da59aae3..f924bc13ccff5f1f85e47965084473b602319cab 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/rtnetlink.h>
 #include "core.h"
@@ -28,11 +28,11 @@ static const struct ieee80211_regdomain ath12k_world_regd = {
        }
 };
 
-static bool ath12k_regdom_changes(struct ath12k *ar, char *alpha2)
+static bool ath12k_regdom_changes(struct ieee80211_hw *hw, char *alpha2)
 {
        const struct ieee80211_regdomain *regd;
 
-       regd = rcu_dereference_rtnl(ar->hw->wiphy->regd);
+       regd = rcu_dereference_rtnl(hw->wiphy->regd);
        /* This can happen during wiphy registration where the previous
         * user request is received before we update the regd received
         * from firmware.
@@ -71,7 +71,7 @@ ath12k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
                return;
        }
 
-       if (!ath12k_regdom_changes(ar, request->alpha2)) {
+       if (!ath12k_regdom_changes(hw, request->alpha2)) {
                ath12k_dbg(ar->ab, ATH12K_DBG_REG, "Country is already set\n");
                return;
        }
@@ -199,6 +199,7 @@ static void ath12k_copy_regd(struct ieee80211_regdomain *regd_orig,
 
 int ath12k_regd_update(struct ath12k *ar, bool init)
 {
+       struct ieee80211_hw *hw = ar->hw;
        struct ieee80211_regdomain *regd, *regd_copy = NULL;
        int ret, regd_len, pdev_id;
        struct ath12k_base *ab;
@@ -246,9 +247,9 @@ int ath12k_regd_update(struct ath12k *ar, bool init)
        }
 
        rtnl_lock();
-       wiphy_lock(ar->hw->wiphy);
-       ret = regulatory_set_wiphy_regd_sync(ar->hw->wiphy, regd_copy);
-       wiphy_unlock(ar->hw->wiphy);
+       wiphy_lock(hw->wiphy);
+       ret = regulatory_set_wiphy_regd_sync(hw->wiphy, regd_copy);
+       wiphy_unlock(hw->wiphy);
        rtnl_unlock();
 
        kfree(regd_copy);
@@ -729,10 +730,10 @@ void ath12k_regd_update_work(struct work_struct *work)
        }
 }
 
-void ath12k_reg_init(struct ath12k *ar)
+void ath12k_reg_init(struct ieee80211_hw *hw)
 {
-       ar->hw->wiphy->regulatory_flags = REGULATORY_WIPHY_SELF_MANAGED;
-       ar->hw->wiphy->reg_notifier = ath12k_reg_notifier;
+       hw->wiphy->regulatory_flags = REGULATORY_WIPHY_SELF_MANAGED;
+       hw->wiphy->reg_notifier = ath12k_reg_notifier;
 }
 
 void ath12k_reg_free(struct ath12k_base *ab)
index 35569f03042d3dd7d59731b4cf7782fcb9ffc0e8..29c7ec3260dafe34ffe202b39d105294e93c817a 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_REG_H
@@ -89,7 +89,7 @@ enum ath12k_reg_phy_bitmap {
        ATH12K_REG_PHY_BITMAP_NO11BE    = BIT(6),
 };
 
-void ath12k_reg_init(struct ath12k *ar);
+void ath12k_reg_init(struct ieee80211_hw *hw);
 void ath12k_reg_free(struct ath12k_base *ab);
 void ath12k_regd_update_work(struct work_struct *work);
 struct ieee80211_regdomain *ath12k_reg_build_regd(struct ath12k_base *ab,
index c4058abc516ee03bf11ff449c3e196fd90fc53be..55f20c446ca9c887b721a980838716fa3e9db6cc 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #ifndef ATH12K_RX_DESC_H
 #define ATH12K_RX_DESC_H
index 0e5bf5ce8d4c38962a0eaac9b5ca36bae8f9f7d4..11cc3005c0f983502c0392c52168b27d0a83c83e 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/skbuff.h>
 #include <linux/ctype.h>
index 629373d6742120862686d9e07399e33c20269ce7..06e5b9b4049b0bde15c39537f8499bd5d2b63b90 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef ATH12K_WMI_H
@@ -1146,25 +1146,27 @@ enum wmi_tlv_vdev_param {
 };
 
 enum wmi_tlv_peer_flags {
-       WMI_TLV_PEER_AUTH = 0x00000001,
-       WMI_TLV_PEER_QOS = 0x00000002,
-       WMI_TLV_PEER_NEED_PTK_4_WAY = 0x00000004,
-       WMI_TLV_PEER_NEED_GTK_2_WAY = 0x00000010,
-       WMI_TLV_PEER_APSD = 0x00000800,
-       WMI_TLV_PEER_HT = 0x00001000,
-       WMI_TLV_PEER_40MHZ = 0x00002000,
-       WMI_TLV_PEER_STBC = 0x00008000,
-       WMI_TLV_PEER_LDPC = 0x00010000,
-       WMI_TLV_PEER_DYN_MIMOPS = 0x00020000,
-       WMI_TLV_PEER_STATIC_MIMOPS = 0x00040000,
-       WMI_TLV_PEER_SPATIAL_MUX = 0x00200000,
-       WMI_TLV_PEER_VHT = 0x02000000,
-       WMI_TLV_PEER_80MHZ = 0x04000000,
-       WMI_TLV_PEER_PMF = 0x08000000,
+       WMI_PEER_AUTH           = 0x00000001,
+       WMI_PEER_QOS            = 0x00000002,
+       WMI_PEER_NEED_PTK_4_WAY = 0x00000004,
+       WMI_PEER_NEED_GTK_2_WAY = 0x00000010,
+       WMI_PEER_HE             = 0x00000400,
+       WMI_PEER_APSD           = 0x00000800,
+       WMI_PEER_HT             = 0x00001000,
+       WMI_PEER_40MHZ          = 0x00002000,
+       WMI_PEER_STBC           = 0x00008000,
+       WMI_PEER_LDPC           = 0x00010000,
+       WMI_PEER_DYN_MIMOPS     = 0x00020000,
+       WMI_PEER_STATIC_MIMOPS  = 0x00040000,
+       WMI_PEER_SPATIAL_MUX    = 0x00200000,
+       WMI_PEER_TWT_REQ        = 0x00400000,
+       WMI_PEER_TWT_RESP       = 0x00800000,
+       WMI_PEER_VHT            = 0x02000000,
+       WMI_PEER_80MHZ          = 0x04000000,
+       WMI_PEER_PMF            = 0x08000000,
        WMI_PEER_IS_P2P_CAPABLE = 0x20000000,
        WMI_PEER_160MHZ         = 0x40000000,
        WMI_PEER_SAFEMODE_EN    = 0x80000000,
-
 };
 
 enum wmi_tlv_peer_flags_ext {
@@ -2220,6 +2222,7 @@ enum wmi_peer_chwidth {
        WMI_PEER_CHWIDTH_40MHZ = 1,
        WMI_PEER_CHWIDTH_80MHZ = 2,
        WMI_PEER_CHWIDTH_160MHZ = 3,
+       WMI_PEER_CHWIDTH_320MHZ = 4,
 };
 
 enum wmi_beacon_gen_mode {
@@ -3844,31 +3847,6 @@ struct wmi_unit_test_cmd {
 
 #define MAX_SUPPORTED_RATES 128
 
-#define WMI_PEER_AUTH          0x00000001
-#define WMI_PEER_QOS           0x00000002
-#define WMI_PEER_NEED_PTK_4_WAY        0x00000004
-#define WMI_PEER_NEED_GTK_2_WAY        0x00000010
-#define WMI_PEER_HE            0x00000400
-#define WMI_PEER_APSD          0x00000800
-#define WMI_PEER_HT            0x00001000
-#define WMI_PEER_40MHZ         0x00002000
-#define WMI_PEER_STBC          0x00008000
-#define WMI_PEER_LDPC          0x00010000
-#define WMI_PEER_DYN_MIMOPS    0x00020000
-#define WMI_PEER_STATIC_MIMOPS 0x00040000
-#define WMI_PEER_SPATIAL_MUX   0x00200000
-#define WMI_PEER_TWT_REQ       0x00400000
-#define WMI_PEER_TWT_RESP      0x00800000
-#define WMI_PEER_VHT           0x02000000
-#define WMI_PEER_80MHZ         0x04000000
-#define WMI_PEER_PMF           0x08000000
-/* TODO: Place holder for WLAN_PEER_F_PS_PRESEND_REQUIRED = 0x10000000.
- * Need to be cleaned up
- */
-#define WMI_PEER_IS_P2P_CAPABLE        0x20000000
-#define WMI_PEER_160MHZ                0x40000000
-#define WMI_PEER_SAFEMODE_EN   0x80000000
-
 struct ath12k_wmi_vht_rate_set_params {
        __le32 tlv_header;
        __le32 rx_max_rate;
@@ -4770,7 +4748,6 @@ struct wmi_probe_tmpl_cmd {
 struct ath12k_wmi_pdev {
        struct ath12k_wmi_base *wmi_ab;
        enum ath12k_htc_ep_id eid;
-       const struct wmi_peer_flags_map *peer_flags;
        u32 rx_decap_mode;
 };
 
@@ -4784,7 +4761,6 @@ struct ath12k_wmi_base {
        struct completion unified_ready;
        DECLARE_BITMAP(svc_map, WMI_MAX_EXT2_SERVICE);
        wait_queue_head_t tx_credits_wq;
-       const struct wmi_peer_flags_map *peer_flags;
        u32 num_mem_chunks;
        u32 rx_decap_mode;
        struct ath12k_wmi_host_mem_chunk_arg mem_chunks[WMI_MAX_MEM_REQS];
index 08bd5d3b00f104bd731423275eb17fad63e443ef..f27308ccb2f15e75c76449dffe39cb2d56b5b8e5 100644 (file)
@@ -185,7 +185,7 @@ static int ath_ahb_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int ath_ahb_remove(struct platform_device *pdev)
+static void ath_ahb_remove(struct platform_device *pdev)
 {
        struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);
        struct ieee80211_hw *hw = platform_get_drvdata(pdev);
@@ -193,7 +193,7 @@ static int ath_ahb_remove(struct platform_device *pdev)
        u32 reg;
 
        if (!hw)
-               return 0;
+               return;
 
        ah = hw->priv;
 
@@ -215,13 +215,11 @@ static int ath_ahb_remove(struct platform_device *pdev)
        ath5k_deinit_ah(ah);
        iounmap(ah->iobase);
        ieee80211_free_hw(hw);
-
-       return 0;
 }
 
 static struct platform_driver ath_ahb_driver = {
        .probe      = ath_ahb_probe,
-       .remove     = ath_ahb_remove,
+       .remove_new = ath_ahb_remove,
        .driver         = {
                .name   = "ar231x-wmac",
        },
index 693296ee9693f80bb942e93049c377d33ac25801..e85b713950b161e08ed0250db4fc29e06d405aa5 100644 (file)
@@ -489,7 +489,4 @@ struct ath5k_eeprom_info {
 
        /* Spur mitigation data (fbin values for spur channels) */
        u16     ee_spur_chans[AR5K_EEPROM_N_SPUR_CHANS][AR5K_EEPROM_N_FREQ_BANDS];
-
-       /* Antenna raw switch tables */
-       u32     ee_antenna[AR5K_EEPROM_N_MODES][AR5K_ANT_MAX];
 };
index 708c8969b503ab62848ecf19cb98d345b53dff09..a5eb43f3032013c6943039c15ce1962ec8c44617 100644 (file)
@@ -125,7 +125,7 @@ static void owl_rescan(struct pci_dev *pdev)
 
 static void owl_fw_cb(const struct firmware *fw, void *context)
 {
-       struct owl_ctx *ctx = (struct owl_ctx *)context;
+       struct owl_ctx *ctx = context;
 
        complete(&ctx->eeprom_load);
 
index 82de0fadbc956d0151a731fdbdb62edf881f86d3..7c13a1deb3acf1c1a1430a29a50f79bfb539e121 100644 (file)
@@ -124,7 +124,7 @@ static struct ieee80211_rate ath9k_legacy_rates[] = {
 
 int ath9k_cmn_init_channels_rates(struct ath_common *common)
 {
-       struct ath_hw *ah = (struct ath_hw *)common->ah;
+       struct ath_hw *ah = common->ah;
        void *channels;
 
        BUILD_BUG_ON(ARRAY_SIZE(ath9k_2ghz_chantable) +
index a5349c72c3321f8b9a39dd09ffd472d70fad201c..4b27445a5fb87d4c2b7167c270b99a2d8c588a7d 100644 (file)
@@ -471,7 +471,7 @@ int ath_cmn_process_fft(struct ath_spec_scan_priv *spec_priv, struct ieee80211_h
        u8 sample_buf[SPECTRAL_SAMPLE_MAX_LEN] = {0};
        struct ath_hw *ah = spec_priv->ah;
        struct ath_common *common = ath9k_hw_common(spec_priv->ah);
-       struct ath_softc *sc = (struct ath_softc *)common->priv;
+       struct ath_softc *sc = common->priv;
        u8 num_bins, *vdata = (u8 *)hdr;
        struct ath_radar_info *radar_info;
        int len = rs->rs_datalen;
index a0376a6787b8d0c8466d552f800f45686096c277..d84e3ee7b5d902cdfbdc0134ff635b12109f2029 100644 (file)
@@ -1376,7 +1376,7 @@ void ath9k_deinit_debug(struct ath_softc *sc)
 int ath9k_init_debug(struct ath_hw *ah)
 {
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath_softc *sc = (struct ath_softc *) common->priv;
+       struct ath_softc *sc = common->priv;
 
        sc->debug.debugfs_phy = debugfs_create_dir("ath9k",
                                                   sc->hw->wiphy->debugfsdir);
index 90cfe39aa433c939913c3ac5c8f0333a32ce1713..0c7841f952287f7915d2e92e04e277bfcbf76792 100644 (file)
@@ -70,7 +70,7 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev);
 
 static void hif_usb_regout_cb(struct urb *urb)
 {
-       struct cmd_buf *cmd = (struct cmd_buf *)urb->context;
+       struct cmd_buf *cmd = urb->context;
 
        switch (urb->status) {
        case 0:
@@ -134,7 +134,7 @@ static int hif_usb_send_regout(struct hif_device_usb *hif_dev,
 
 static void hif_usb_mgmt_cb(struct urb *urb)
 {
-       struct cmd_buf *cmd = (struct cmd_buf *)urb->context;
+       struct cmd_buf *cmd = urb->context;
        struct hif_device_usb *hif_dev;
        unsigned long flags;
        bool txok = true;
@@ -252,7 +252,7 @@ static inline void ath9k_skb_queue_complete(struct hif_device_usb *hif_dev,
 
 static void hif_usb_tx_cb(struct urb *urb)
 {
-       struct tx_buf *tx_buf = (struct tx_buf *) urb->context;
+       struct tx_buf *tx_buf = urb->context;
        struct hif_device_usb *hif_dev;
        bool txok = true;
 
@@ -687,7 +687,7 @@ invalid_pkt:
 
 static void ath9k_hif_usb_rx_cb(struct urb *urb)
 {
-       struct rx_buf *rx_buf = (struct rx_buf *)urb->context;
+       struct rx_buf *rx_buf = urb->context;
        struct hif_device_usb *hif_dev = rx_buf->hif_dev;
        struct sk_buff *skb = rx_buf->skb;
        int ret;
@@ -734,7 +734,7 @@ free:
 
 static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
 {
-       struct rx_buf *rx_buf = (struct rx_buf *)urb->context;
+       struct rx_buf *rx_buf = urb->context;
        struct hif_device_usb *hif_dev = rx_buf->hif_dev;
        struct sk_buff *skb = rx_buf->skb;
        int ret;
index 278ddc713fdc258de3c72c41f4a97fc7eacaf541..f7c6d9bc931196195cadb7ee0260b5caee0ad797 100644 (file)
@@ -482,7 +482,7 @@ void ath9k_htc_deinit_debug(struct ath9k_htc_priv *priv)
 int ath9k_htc_init_debug(struct ath_hw *ah)
 {
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
 
        priv->debug.debugfs_phy = debugfs_create_dir(KBUILD_MODNAME,
                                             priv->hw->wiphy->debugfsdir);
index dae3d9c7b640828ccb2656a4fa49902ced6f2d38..0aa5bdeb44a1b0bf605ddb1d67e46dd7e9f4302d 100644 (file)
@@ -63,12 +63,12 @@ static const struct ieee80211_tpt_blink ath9k_htc_tpt_blink[] = {
 
 static void ath9k_htc_op_ps_wakeup(struct ath_common *common)
 {
-       ath9k_htc_ps_wakeup((struct ath9k_htc_priv *) common->priv);
+       ath9k_htc_ps_wakeup(common->priv);
 }
 
 static void ath9k_htc_op_ps_restore(struct ath_common *common)
 {
-       ath9k_htc_ps_restore((struct ath9k_htc_priv *) common->priv);
+       ath9k_htc_ps_restore(common->priv);
 }
 
 static const struct ath_ps_ops ath9k_htc_ps_ops = {
@@ -235,7 +235,7 @@ static unsigned int ath9k_regread(void *hw_priv, u32 reg_offset)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
        __be32 val, reg = cpu_to_be32(reg_offset);
        int r;
 
@@ -257,7 +257,7 @@ static void ath9k_multi_regread(void *hw_priv, u32 *addr,
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
        __be32 tmpaddr[8];
        __be32 tmpval[8];
        int i, ret;
@@ -282,7 +282,7 @@ static void ath9k_multi_regread(void *hw_priv, u32 *addr,
 
 static void ath9k_regwrite_multi(struct ath_common *common)
 {
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
        u32 rsp_status;
        int r;
 
@@ -303,7 +303,7 @@ static void ath9k_regwrite_single(void *hw_priv, u32 val, u32 reg_offset)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
        const __be32 buf[2] = {
                cpu_to_be32(reg_offset),
                cpu_to_be32(val),
@@ -324,7 +324,7 @@ static void ath9k_regwrite_buffer(void *hw_priv, u32 val, u32 reg_offset)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
 
        mutex_lock(&priv->wmi->multi_write_mutex);
 
@@ -347,7 +347,7 @@ static void ath9k_regwrite(void *hw_priv, u32 val, u32 reg_offset)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
 
        if (atomic_read(&priv->wmi->mwrite_cnt))
                ath9k_regwrite_buffer(hw_priv, val, reg_offset);
@@ -359,7 +359,7 @@ static void ath9k_enable_regwrite_buffer(void *hw_priv)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
 
        atomic_inc(&priv->wmi->mwrite_cnt);
 }
@@ -368,7 +368,7 @@ static void ath9k_regwrite_flush(void *hw_priv)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
 
        atomic_dec(&priv->wmi->mwrite_cnt);
 
@@ -385,7 +385,7 @@ static void ath9k_reg_rmw_buffer(void *hw_priv,
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
        u32 rsp_status;
        int r;
 
@@ -423,7 +423,7 @@ static void ath9k_reg_rmw_flush(void *hw_priv)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
        u32 rsp_status;
        int r;
 
@@ -455,7 +455,7 @@ static void ath9k_enable_rmw_buffer(void *hw_priv)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
 
        if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags))
                return;
@@ -468,7 +468,7 @@ static void ath9k_reg_rmw_single(void *hw_priv,
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
        struct register_rmw buf, buf_ret;
        int ret;
 
@@ -490,7 +490,7 @@ static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
+       struct ath9k_htc_priv *priv = common->priv;
 
        if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags)) {
                u32 val;
@@ -518,7 +518,7 @@ static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
 
 static bool ath_usb_eeprom_read(struct ath_common *common, u32 off, u16 *data)
 {
-       struct ath_hw *ah = (struct ath_hw *) common->ah;
+       struct ath_hw *ah = common->ah;
 
        (void)REG_READ(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
 
@@ -970,7 +970,7 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
 
 err_init:
        ath9k_stop_wmi(priv);
-       hif_dev = (struct hif_device_usb *)htc_handle->hif_dev;
+       hif_dev = htc_handle->hif_dev;
        ath9k_hif_usb_dealloc_urbs(hif_dev);
        ath9k_destroy_wmi(priv);
 err_free:
@@ -988,7 +988,7 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
 
                ath9k_deinit_device(htc_handle->drv_priv);
                ath9k_stop_wmi(htc_handle->drv_priv);
-               ath9k_hif_usb_dealloc_urbs((struct hif_device_usb *)htc_handle->hif_dev);
+               ath9k_hif_usb_dealloc_urbs(htc_handle->hif_dev);
                ath9k_destroy_wmi(htc_handle->drv_priv);
                ieee80211_free_hw(htc_handle->drv_priv->hw);
        }
index 800177021baffdf325ffede35fffd32995222bed..efcaeccb055aa521414e99b630dd485159555efb 100644 (file)
@@ -652,9 +652,10 @@ void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event)
        struct ath9k_htc_tx_event *tx_pend;
        int i;
 
-       for (i = 0; i < txs->cnt; i++) {
-               WARN_ON(txs->cnt > HTC_MAX_TX_STATUS);
+       if (WARN_ON_ONCE(txs->cnt > HTC_MAX_TX_STATUS))
+               return;
 
+       for (i = 0; i < txs->cnt; i++) {
                __txs = &txs->txstatus[i];
 
                skb = ath9k_htc_tx_get_packet(priv, __txs);
index 99667aba289df0c9aeac94c15e7b1992db8907e0..eb631fd3336d8d586a9290d3081e25ec64202d3f 100644 (file)
@@ -89,7 +89,7 @@ static void htc_process_target_rdy(struct htc_target *target,
                                   void *buf)
 {
        struct htc_endpoint *endpoint;
-       struct htc_ready_msg *htc_ready_msg = (struct htc_ready_msg *) buf;
+       struct htc_ready_msg *htc_ready_msg = buf;
 
        target->credit_size = be16_to_cpu(htc_ready_msg->credit_size);
 
index 4f00400c7ffb83545d461c623f055b73481efb02..7fad7e75af6a372525667386c3681842685c542a 100644 (file)
@@ -151,12 +151,12 @@ static void ath9k_deinit_softc(struct ath_softc *sc);
 
 static void ath9k_op_ps_wakeup(struct ath_common *common)
 {
-       ath9k_ps_wakeup((struct ath_softc *) common->priv);
+       ath9k_ps_wakeup(common->priv);
 }
 
 static void ath9k_op_ps_restore(struct ath_common *common)
 {
-       ath9k_ps_restore((struct ath_softc *) common->priv);
+       ath9k_ps_restore(common->priv);
 }
 
 static const struct ath_ps_ops ath9k_ps_ops = {
@@ -174,7 +174,7 @@ static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath_softc *sc = (struct ath_softc *) common->priv;
+       struct ath_softc *sc = common->priv;
 
        if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_ON) {
                unsigned long flags;
@@ -189,7 +189,7 @@ static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath_softc *sc = (struct ath_softc *) common->priv;
+       struct ath_softc *sc = common->priv;
        u32 val;
 
        if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_ON) {
@@ -229,7 +229,7 @@ static unsigned int ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 cl
 {
        struct ath_hw *ah = hw_priv;
        struct ath_common *common = ath9k_hw_common(ah);
-       struct ath_softc *sc = (struct ath_softc *) common->priv;
+       struct ath_softc *sc = common->priv;
        unsigned long flags;
        u32 val;
 
@@ -608,7 +608,7 @@ static int ath9k_nvmem_request_eeprom(struct ath_softc *sc)
        }
 
        /* devres manages the calibration values release on shutdown */
-       ah->nvmem_blob = (u16 *)devm_kmemdup(sc->dev, buf, len, GFP_KERNEL);
+       ah->nvmem_blob = devm_kmemdup(sc->dev, buf, len, GFP_KERNEL);
        kfree(buf);
        if (!ah->nvmem_blob)
                return -ENOMEM;
index 9d84003db800e9513f07ee85a4203dbb7636edf0..d1e5767aab3cbc2ee91018edadf89a223cf1d759 100644 (file)
@@ -304,7 +304,7 @@ fail_paprd:
 void ath_ani_calibrate(struct timer_list *t)
 {
        struct ath_common *common = from_timer(common, t, ani.timer);
-       struct ath_softc *sc = (struct ath_softc *)common->priv;
+       struct ath_softc *sc = common->priv;
        struct ath_hw *ah = sc->sc_ah;
        bool longcal = false;
        bool shortcal = false;
index 1494feedb27dbcf93d7f24ba669df0ab13106e61..c48ff0ffbfefb3bde48571f564c60c2d5696cc29 100644 (file)
@@ -2383,7 +2383,22 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw,
 {
        struct ath_softc *sc = hw->priv;
        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       struct cfg80211_chan_def *chandef = &sc->cur_chan->chandef;
+       struct ieee80211_channel *chan = chandef->chan;
+       int pos = chan->hw_value;
        set_bit(ATH_OP_SCANNING, &common->op_flags);
+
+       /* Reset current survey */
+       if (!sc->cur_chan->offchannel) {
+               if (sc->cur_survey != &sc->survey[pos]) {
+                       if (sc->cur_survey)
+                               sc->cur_survey->filled &= ~SURVEY_INFO_IN_USE;
+                       sc->cur_survey = &sc->survey[pos];
+               }
+
+               memset(sc->cur_survey, 0, sizeof(struct survey_info));
+               sc->cur_survey->filled |= SURVEY_INFO_IN_USE;
+       }
 }
 
 static void ath9k_sw_scan_complete(struct ieee80211_hw *hw,
index 0633589b85c23a941f68782ca158439f72da24ab..e655cd8bbf94e1499bc6482ab50ea4404894f030 100644 (file)
@@ -781,7 +781,7 @@ static const struct pci_device_id ath_pci_id_table[] = {
 /* return bus cachesize in 4B word units */
 static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
 {
-       struct ath_softc *sc = (struct ath_softc *) common->priv;
+       struct ath_softc *sc = common->priv;
        u8 u8tmp;
 
        pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE, &u8tmp);
@@ -799,7 +799,7 @@ static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
 
 static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
 {
-       struct ath_hw *ah = (struct ath_hw *) common->ah;
+       struct ath_hw *ah = common->ah;
 
        common->ops->read(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
 
@@ -820,7 +820,7 @@ static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
 /* Need to be called after we discover btcoex capabilities */
 static void ath_pci_aspm_init(struct ath_common *common)
 {
-       struct ath_softc *sc = (struct ath_softc *) common->priv;
+       struct ath_softc *sc = common->priv;
        struct ath_hw *ah = sc->sc_ah;
        struct pci_dev *pdev = to_pci_dev(sc->dev);
        struct pci_dev *parent;
index 2bd1163177f08f5c201f03675225831ec88a0397..41119fb177e306f30280d1a1d83ae5583976668d 100644 (file)
@@ -1644,7 +1644,7 @@ out_err:
        return ret;
 }
 
-static int wcn36xx_remove(struct platform_device *pdev)
+static void wcn36xx_remove(struct platform_device *pdev)
 {
        struct ieee80211_hw *hw = platform_get_drvdata(pdev);
        struct wcn36xx *wcn = hw->priv;
@@ -1666,8 +1666,6 @@ static int wcn36xx_remove(struct platform_device *pdev)
 
        mutex_destroy(&wcn->hal_mutex);
        ieee80211_free_hw(hw);
-
-       return 0;
 }
 
 static const struct of_device_id wcn36xx_of_match[] = {
@@ -1678,7 +1676,7 @@ MODULE_DEVICE_TABLE(of, wcn36xx_of_match);
 
 static struct platform_driver wcn36xx_driver = {
        .probe      = wcn36xx_probe,
-       .remove     = wcn36xx_remove,
+       .remove_new = wcn36xx_remove,
        .driver         = {
                .name   = "wcn36xx",
                .of_match_table = wcn36xx_of_match,