mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-21 22:47:56 +00:00
524704e677
Synchronize the ath11k backports with the current ath-next tree. This backports several memory leak issues, PCI IRQ fixup, peer add locking fix as well as IPQ5018 support, though IPQ5018 support is unused for now. This allows to easily backport further fixes as cherry picking them has started requiring manual conflict resolution. Signed-off-by: Robert Marko <robimarko@gmail.com>
162 lines
5.1 KiB
Diff
162 lines
5.1 KiB
Diff
From d45daa6d1a8da080f1b516c570a8428a7b9225e4 Mon Sep 17 00:00:00 2001
|
|
From: Karthikeyan Kathirvel <quic_kathirve@quicinc.com>
|
|
Date: Tue, 6 Dec 2022 00:51:25 +0530
|
|
Subject: [PATCH] wifi: ath11k: Fix scan request param frame size warning
|
|
|
|
Following warning was observed
|
|
|
|
drivers/net/wireless/ath/ath11k/mac.c:2351:1: warning: the frame
|
|
size of 1184 bytes is larger than 1024 bytes [-Wframe-larger-than=]
|
|
|
|
A local variable is declared with a size larger than 1024 bytes
|
|
this causing a compilation warning. Change the local variable to
|
|
heap memory to fix the warning.
|
|
|
|
Tested-on: IPQ8074 AHB WLAN.HK.2.7.0.1-01701-QCAHKSWPL_SILICONZ-1 v2
|
|
|
|
Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com>
|
|
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
|
Link: https://lore.kernel.org/r/20221205192125.13533-1-quic_kathirve@quicinc.com
|
|
---
|
|
drivers/net/wireless/ath/ath11k/mac.c | 83 +++++++++++++++------------
|
|
1 file changed, 45 insertions(+), 38 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
|
@@ -3612,7 +3612,7 @@ static int ath11k_mac_op_hw_scan(struct
|
|
struct ath11k *ar = hw->priv;
|
|
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
|
struct cfg80211_scan_request *req = &hw_req->req;
|
|
- struct scan_req_params arg;
|
|
+ struct scan_req_params *arg = NULL;
|
|
int ret = 0;
|
|
int i;
|
|
u32 scan_timeout;
|
|
@@ -3640,72 +3640,78 @@ static int ath11k_mac_op_hw_scan(struct
|
|
if (ret)
|
|
goto exit;
|
|
|
|
- memset(&arg, 0, sizeof(arg));
|
|
- ath11k_wmi_start_scan_init(ar, &arg);
|
|
- arg.vdev_id = arvif->vdev_id;
|
|
- arg.scan_id = ATH11K_SCAN_ID;
|
|
+ arg = kzalloc(sizeof(*arg), GFP_KERNEL);
|
|
+
|
|
+ if (!arg) {
|
|
+ ret = -ENOMEM;
|
|
+ goto exit;
|
|
+ }
|
|
+
|
|
+ ath11k_wmi_start_scan_init(ar, arg);
|
|
+ arg->vdev_id = arvif->vdev_id;
|
|
+ arg->scan_id = ATH11K_SCAN_ID;
|
|
|
|
if (req->ie_len) {
|
|
- arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
|
|
- if (!arg.extraie.ptr) {
|
|
+ arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
|
|
+ if (!arg->extraie.ptr) {
|
|
ret = -ENOMEM;
|
|
goto exit;
|
|
}
|
|
- arg.extraie.len = req->ie_len;
|
|
+ arg->extraie.len = req->ie_len;
|
|
}
|
|
|
|
if (req->n_ssids) {
|
|
- arg.num_ssids = req->n_ssids;
|
|
- for (i = 0; i < arg.num_ssids; i++) {
|
|
- arg.ssid[i].length = req->ssids[i].ssid_len;
|
|
- memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid,
|
|
+ arg->num_ssids = req->n_ssids;
|
|
+ for (i = 0; i < arg->num_ssids; i++) {
|
|
+ arg->ssid[i].length = req->ssids[i].ssid_len;
|
|
+ memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid,
|
|
req->ssids[i].ssid_len);
|
|
}
|
|
} else {
|
|
- arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
|
|
+ arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE;
|
|
}
|
|
|
|
if (req->n_channels) {
|
|
- arg.num_chan = req->n_channels;
|
|
- arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
|
|
- GFP_KERNEL);
|
|
+ arg->num_chan = req->n_channels;
|
|
+ arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
|
|
+ GFP_KERNEL);
|
|
|
|
- if (!arg.chan_list) {
|
|
+ if (!arg->chan_list) {
|
|
ret = -ENOMEM;
|
|
goto exit;
|
|
}
|
|
|
|
- for (i = 0; i < arg.num_chan; i++)
|
|
- arg.chan_list[i] = req->channels[i]->center_freq;
|
|
+ for (i = 0; i < arg->num_chan; i++)
|
|
+ arg->chan_list[i] = req->channels[i]->center_freq;
|
|
}
|
|
|
|
if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
|
- arg.scan_f_add_spoofed_mac_in_probe = 1;
|
|
- ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
|
|
- ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
|
|
+ arg->scan_f_add_spoofed_mac_in_probe = 1;
|
|
+ ether_addr_copy(arg->mac_addr.addr, req->mac_addr);
|
|
+ ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask);
|
|
}
|
|
|
|
/* if duration is set, default dwell times will be overwritten */
|
|
if (req->duration) {
|
|
- arg.dwell_time_active = req->duration;
|
|
- arg.dwell_time_active_2g = req->duration;
|
|
- arg.dwell_time_active_6g = req->duration;
|
|
- arg.dwell_time_passive = req->duration;
|
|
- arg.dwell_time_passive_6g = req->duration;
|
|
- arg.burst_duration = req->duration;
|
|
+ arg->dwell_time_active = req->duration;
|
|
+ arg->dwell_time_active_2g = req->duration;
|
|
+ arg->dwell_time_active_6g = req->duration;
|
|
+ arg->dwell_time_passive = req->duration;
|
|
+ arg->dwell_time_passive_6g = req->duration;
|
|
+ arg->burst_duration = req->duration;
|
|
|
|
- scan_timeout = min_t(u32, arg.max_rest_time *
|
|
- (arg.num_chan - 1) + (req->duration +
|
|
+ scan_timeout = min_t(u32, arg->max_rest_time *
|
|
+ (arg->num_chan - 1) + (req->duration +
|
|
ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
|
|
- arg.num_chan, arg.max_scan_time);
|
|
+ arg->num_chan, arg->max_scan_time);
|
|
} else {
|
|
- scan_timeout = arg.max_scan_time;
|
|
+ scan_timeout = arg->max_scan_time;
|
|
}
|
|
|
|
/* Add a margin to account for event/command processing */
|
|
scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;
|
|
|
|
- ret = ath11k_start_scan(ar, &arg);
|
|
+ ret = ath11k_start_scan(ar, arg);
|
|
if (ret) {
|
|
ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
|
|
spin_lock_bh(&ar->data_lock);
|
|
@@ -3717,10 +3723,11 @@ static int ath11k_mac_op_hw_scan(struct
|
|
msecs_to_jiffies(scan_timeout));
|
|
|
|
exit:
|
|
- kfree(arg.chan_list);
|
|
-
|
|
- if (req->ie_len)
|
|
- kfree(arg.extraie.ptr);
|
|
+ if (arg) {
|
|
+ kfree(arg->chan_list);
|
|
+ kfree(arg->extraie.ptr);
|
|
+ kfree(arg);
|
|
+ }
|
|
|
|
mutex_unlock(&ar->conf_mutex);
|
|
|