}
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, ¶ms))
+ 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, ¶ms);
+- if (!err)
++ if (!err) {
++ wdev->preset_chan = params.channel;
++ wdev->preset_chantype = params.channel_type;
+ wdev->beacon_interval = params.beacon_interval;
++ }
+ return err;
+ }
+
__NL80211_STA_INFO_AFTER_LAST,
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -2523,6 +2523,33 @@ nla_put_failure:
+@@ -2553,6 +2553,33 @@ nla_put_failure:
return false;
}
static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
int flags,
struct cfg80211_registered_device *rdev,
-@@ -2584,6 +2611,18 @@ static int nl80211_send_station(struct s
+@@ -2614,6 +2641,18 @@ static int nl80211_send_station(struct s
default:
break;
}