summaryrefslogtreecommitdiff
path: root/net/wireless/reg.c
diff options
context:
space:
mode:
authorGanesh Kondabattini <ganeshk@codeaurora.org>2013-11-23 11:05:56 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:16:49 -0700
commitd91e2f37dcf7ce5dc1dc2bc212c8339a2c88d5fd (patch)
tree1befb168f1c7723c6aa6e364287f0d6139129865 /net/wireless/reg.c
parentbf6ab094caf74dfd85edcb8c2405739a74c543e0 (diff)
Revert "cfg80211/mac80211: disconnect on suspend"
This reverts commit 8125696991194aacb1173b6e8196d19098b44e17. The commit"cfg80211/mac80211: disconnect on suspend" forces disconnection on wlan interfaces if wake on wireless is not enabled from the user space. Wake on Wireless is enabled by default in wlan driver (CLD) and cfg80211 layer never aware of wake on wirless enabled status done in wlan driver. To avoid the disconnection while going to suspend and keep wlan driver in WOW mode by default, the commit "cfg80211/mac80211: disconnect on suspend" should be reverted. CRs-Fixed: 540571 Change-Id: I483fe0530f9f00c338680416449215af326e3df1 Signed-off-by: Ganesh Kondabattini <ganeshk@codeaurora.org>
Diffstat (limited to 'net/wireless/reg.c')
-rw-r--r--net/wireless/reg.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 9fbc23a1cb53..197223277901 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -1676,12 +1676,48 @@ static void reg_leave_invalid_chans(struct wiphy *wiphy)
{
struct wireless_dev *wdev;
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
-
+ struct net_device *dev;
+ struct cfg80211_sched_scan_request *sched_scan_req;
ASSERT_RTNL();
list_for_each_entry(wdev, &rdev->wdev_list, list)
- if (!reg_wdev_chan_valid(wiphy, wdev))
- cfg80211_leave(rdev, wdev);
+ if (!reg_wdev_chan_valid(wiphy, wdev)) {
+ dev = wdev->netdev;
+ switch (wdev->iftype) {
+ case NL80211_IFTYPE_ADHOC:
+ cfg80211_leave_ibss(rdev, dev, true);
+ break;
+ case NL80211_IFTYPE_P2P_CLIENT:
+ case NL80211_IFTYPE_STATION:
+ ASSERT_RTNL();
+ sched_scan_req = rtnl_dereference(rdev->sched_scan_req);
+ if (sched_scan_req && dev == sched_scan_req->dev)
+ __cfg80211_stop_sched_scan(rdev, false);
+
+ wdev_lock(wdev);
+#ifdef CONFIG_CFG80211_WEXT
+ kfree(wdev->wext.ie);
+ wdev->wext.ie = NULL;
+ wdev->wext.ie_len = 0;
+ wdev->wext.connect.auth_type =
+ NL80211_AUTHTYPE_AUTOMATIC;
+#endif
+ cfg80211_disconnect(rdev, dev,
+ WLAN_REASON_DEAUTH_LEAVING, true);
+ cfg80211_mlme_down(rdev, dev);
+ wdev_unlock(wdev);
+ break;
+ case NL80211_IFTYPE_MESH_POINT:
+ cfg80211_leave_mesh(rdev, dev);
+ break;
+ case NL80211_IFTYPE_AP:
+ cfg80211_stop_ap(rdev, dev, false);
+ break;
+ default:
+ break;
+ }
+ wdev->beacon_interval = 0;
+ }
}
static void reg_check_chans_work(struct work_struct *work)