summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/300-pending_work.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/300-pending_work.patch')
-rw-r--r--package/mac80211/patches/300-pending_work.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index cb219c914..4f96a013f 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -1544,3 +1544,61 @@
}
u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -2246,6 +2246,33 @@ static int nl80211_parse_beacon(struct g
+ return 0;
+ }
+
++static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
++ struct cfg80211_ap_settings *params)
++{
++ struct wireless_dev *wdev;
++ bool ret = false;
++
++ mutex_lock(&rdev->devlist_mtx);
++
++ list_for_each_entry(wdev, &rdev->netdev_list, list) {
++ if (wdev->iftype != NL80211_IFTYPE_AP &&
++ wdev->iftype != NL80211_IFTYPE_P2P_GO)
++ continue;
++
++ if (!wdev->preset_chan)
++ continue;
++
++ params->channel = wdev->preset_chan;
++ params->channel_type = wdev->preset_chantype;
++ ret = true;
++ break;
++ }
++
++ mutex_unlock(&rdev->devlist_mtx);
++
++ return ret;
++}
++
+ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
+ {
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
+@@ -2348,7 +2375,7 @@ static int nl80211_start_ap(struct sk_bu
+ } else if (wdev->preset_chan) {
+ params.channel = wdev->preset_chan;
+ params.channel_type = wdev->preset_chantype;
+- } else
++ } else if (!nl80211_get_ap_channel(rdev, &params))
+ return -EINVAL;
+
+ if (!cfg80211_can_beacon_sec_chan(&rdev->wiphy, params.channel,
+@@ -2356,8 +2383,11 @@ static int nl80211_start_ap(struct sk_bu
+ return -EINVAL;
+
+ err = rdev->ops->start_ap(&rdev->wiphy, dev, &params);
+- if (!err)
++ if (!err) {
++ wdev->preset_chan = params.channel;
++ wdev->preset_chantype = params.channel_type;
+ wdev->beacon_interval = params.beacon_interval;
++ }
+ return err;
+ }
+