mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-18 01:41:24 +00:00
This series is based on * 2020-07-10 ipq6018-ilq-11-0_qca_oem-034672b0676c37b1f4519e5720e18e95fe6236ef Add support for * qsdk kernel/v4.4 * qsdk ethernet subsystem * v5.7 ath11k backport + QualComm staging patches (wlan_ap_1.0) * ath11k-firmware * hostapd/iw/... Feature support * full boot, system detection * sysupgrade to nand * HE support via latest hostapd * driver support for usb, crypto, hwmon, cpufreq, ... Missing * NSS/HW flow offloading - FW blob is not redistributable Using the qsdk v4.4 is an intermediate solution while the vanilla is being tested. Vanilla kernel is almost on feature par. Work has already started to upstream the ethernet and switch drivers. Once complete the target will be fully upstream. Signed-off-by: John Crispin <john@phrozen.org>
199 lines
6.0 KiB
Diff
199 lines
6.0 KiB
Diff
--- a/include/net/cfg80211.h
|
|
+++ b/include/net/cfg80211.h
|
|
@@ -1941,6 +1941,7 @@ struct cfg80211_scan_info {
|
|
* @channels: channels to scan on.
|
|
* @n_channels: total number of channels to scan
|
|
* @scan_width: channel width for scanning
|
|
+ * @chandef: defines the channel to do wide band scan
|
|
* @ie: optional information element(s) to add into Probe Request or %NULL
|
|
* @ie_len: length of ie in octets
|
|
* @duration: how long to listen on each channel, in TUs. If
|
|
@@ -1967,6 +1968,7 @@ struct cfg80211_scan_request {
|
|
int n_ssids;
|
|
u32 n_channels;
|
|
enum nl80211_bss_scan_width scan_width;
|
|
+ struct cfg80211_chan_def *chandef;
|
|
const u8 *ie;
|
|
size_t ie_len;
|
|
u16 duration;
|
|
--- a/include/uapi/linux/nl80211.h
|
|
+++ b/include/uapi/linux/nl80211.h
|
|
@@ -5539,6 +5539,9 @@ enum nl80211_feature_flags {
|
|
* feature, which prevents bufferbloat by using the expected transmission
|
|
* time to limit the amount of data buffered in the hardware.
|
|
*
|
|
+ * @NL80211_EXT_FEATURE_WIDE_BAND_SCAN: Driver/device supports wide band scan
|
|
+ * on a frequency along with its corresponding phymode (40Mhz, 80Mhz)
|
|
+ *
|
|
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
|
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
|
*/
|
|
@@ -5585,6 +5588,7 @@ enum nl80211_ext_feature_index {
|
|
NL80211_EXT_FEATURE_STA_TX_PWR,
|
|
NL80211_EXT_FEATURE_SAE_OFFLOAD,
|
|
NL80211_EXT_FEATURE_VLAN_OFFLOAD,
|
|
+ NL80211_EXT_FEATURE_WIDE_BAND_SCAN,
|
|
NL80211_EXT_FEATURE_AQL,
|
|
|
|
/* add new features before the definition below */
|
|
@@ -5697,6 +5701,8 @@ enum nl80211_timeout_reason {
|
|
* @NL80211_SCAN_FLAG_MIN_PREQ_CONTENT: minimize probe request content to
|
|
* only have supported rates and no additional capabilities (unless
|
|
* added by userspace explicitly.)
|
|
+ * @NL80211_SCAN_FLAG_WIDE_BAND_SCAN: This flag intends the driver to perform
|
|
+ * wide band scan only if the driver supports it.
|
|
*/
|
|
enum nl80211_scan_flags {
|
|
NL80211_SCAN_FLAG_LOW_PRIORITY = 1<<0,
|
|
@@ -5712,6 +5718,7 @@ enum nl80211_scan_flags {
|
|
NL80211_SCAN_FLAG_HIGH_ACCURACY = 1<<10,
|
|
NL80211_SCAN_FLAG_RANDOM_SN = 1<<11,
|
|
NL80211_SCAN_FLAG_MIN_PREQ_CONTENT = 1<<12,
|
|
+ NL80211_SCAN_FLAG_WIDE_BAND_SCAN = 1<<13,
|
|
};
|
|
|
|
/**
|
|
--- a/net/mac80211/scan.c
|
|
+++ b/net/mac80211/scan.c
|
|
@@ -687,11 +687,13 @@ static int __ieee80211_start_scan(struct
|
|
|
|
local->hw_scan_req = kmalloc(
|
|
sizeof(*local->hw_scan_req) +
|
|
+ sizeof(*req->chandef) +
|
|
req->n_channels * sizeof(req->channels[0]) +
|
|
local->hw_scan_ies_bufsize, GFP_KERNEL);
|
|
if (!local->hw_scan_req)
|
|
return -ENOMEM;
|
|
|
|
+ local->hw_scan_req->req.chandef = req->chandef;
|
|
local->hw_scan_req->req.ssids = req->ssids;
|
|
local->hw_scan_req->req.n_ssids = req->n_ssids;
|
|
ies = (u8 *)local->hw_scan_req +
|
|
--- a/net/wireless/nl80211.c
|
|
+++ b/net/wireless/nl80211.c
|
|
@@ -7583,7 +7583,10 @@ nl80211_check_scan_flags(struct wiphy *w
|
|
NL80211_EXT_FEATURE_SCAN_RANDOM_SN) ||
|
|
!nl80211_check_scan_feat(wiphy, *flags,
|
|
NL80211_SCAN_FLAG_MIN_PREQ_CONTENT,
|
|
- NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT))
|
|
+ NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT) ||
|
|
+ !nl80211_check_scan_feat(wiphy, *flags,
|
|
+ NL80211_SCAN_FLAG_WIDE_BAND_SCAN,
|
|
+ NL80211_EXT_FEATURE_WIDE_BAND_SCAN))
|
|
return -EOPNOTSUPP;
|
|
|
|
if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
|
@@ -7606,10 +7609,12 @@ static int nl80211_trigger_scan(struct s
|
|
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
struct wireless_dev *wdev = info->user_ptr[1];
|
|
struct cfg80211_scan_request *request;
|
|
+ struct cfg80211_chan_def chandef;
|
|
struct nlattr *attr;
|
|
struct wiphy *wiphy;
|
|
- int err, tmp, n_ssids = 0, n_channels, i;
|
|
+ int err, tmp, n_ssids = 0, n_channels = 0, i;
|
|
size_t ie_len;
|
|
+ bool chandef_found = false;
|
|
|
|
wiphy = &rdev->wiphy;
|
|
|
|
@@ -7624,7 +7629,14 @@ static int nl80211_trigger_scan(struct s
|
|
goto unlock;
|
|
}
|
|
|
|
- if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
|
|
+ if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
|
+ n_channels = 1;
|
|
+ if (nl80211_parse_chandef(rdev, info, &chandef)) {
|
|
+ err = -EINVAL;
|
|
+ goto unlock;
|
|
+ }
|
|
+ chandef_found = true;
|
|
+ } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
|
|
n_channels = validate_scan_freqs(
|
|
info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
|
|
if (!n_channels) {
|
|
@@ -7655,6 +7667,7 @@ static int nl80211_trigger_scan(struct s
|
|
}
|
|
|
|
request = kzalloc(sizeof(*request)
|
|
+ + sizeof(*request->chandef)
|
|
+ sizeof(*request->ssids) * n_ssids
|
|
+ sizeof(*request->channels) * n_channels
|
|
+ ie_len, GFP_KERNEL);
|
|
@@ -7663,6 +7676,12 @@ static int nl80211_trigger_scan(struct s
|
|
goto unlock;
|
|
}
|
|
|
|
+ if (chandef_found) {
|
|
+ request->chandef = &chandef;
|
|
+ request->channels[0] = chandef.chan;
|
|
+ request->n_channels = n_channels;
|
|
+ }
|
|
+
|
|
if (n_ssids)
|
|
request->ssids = (void *)&request->channels[n_channels];
|
|
request->n_ssids = n_ssids;
|
|
@@ -7693,7 +7712,7 @@ static int nl80211_trigger_scan(struct s
|
|
request->channels[i] = chan;
|
|
i++;
|
|
}
|
|
- } else {
|
|
+ } else if (!chandef_found) {
|
|
enum nl80211_band band;
|
|
|
|
/* all channels */
|
|
@@ -7716,31 +7735,32 @@ static int nl80211_trigger_scan(struct s
|
|
}
|
|
}
|
|
|
|
- if (!i) {
|
|
- err = -EINVAL;
|
|
- goto out_free;
|
|
- }
|
|
-
|
|
- request->n_channels = i;
|
|
-
|
|
- wdev_lock(wdev);
|
|
- if (!cfg80211_off_channel_oper_allowed(wdev)) {
|
|
- struct ieee80211_channel *chan;
|
|
-
|
|
- if (request->n_channels != 1) {
|
|
- wdev_unlock(wdev);
|
|
- err = -EBUSY;
|
|
+ if (!chandef_found) {
|
|
+ if (!i) {
|
|
+ err = -EINVAL;
|
|
goto out_free;
|
|
}
|
|
+ request->n_channels = i;
|
|
|
|
- chan = request->channels[0];
|
|
- if (chan->center_freq != wdev->chandef.chan->center_freq) {
|
|
- wdev_unlock(wdev);
|
|
- err = -EBUSY;
|
|
- goto out_free;
|
|
+ wdev_lock(wdev);
|
|
+ if (!cfg80211_off_channel_oper_allowed(wdev)) {
|
|
+ struct ieee80211_channel *chan;
|
|
+
|
|
+ if (request->n_channels != 1) {
|
|
+ wdev_unlock(wdev);
|
|
+ err = -EBUSY;
|
|
+ goto out_free;
|
|
+ }
|
|
+
|
|
+ chan = request->channels[0];
|
|
+ if (chan->center_freq != wdev->chandef.chan->center_freq) {
|
|
+ wdev_unlock(wdev);
|
|
+ err = -EBUSY;
|
|
+ goto out_free;
|
|
+ }
|
|
}
|
|
+ wdev_unlock(wdev);
|
|
}
|
|
- wdev_unlock(wdev);
|
|
|
|
i = 0;
|
|
if (n_ssids) {
|