]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/wireless/sysfs.c
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney...
[karo-tx-linux.git] / net / wireless / sysfs.c
index 1f6f01e2dc4cb9f0a5528f459b6e6c49dba47cb1..8f28b9f798d88a48281a7b633406b99bad4b5e98 100644 (file)
@@ -83,6 +83,14 @@ static int wiphy_uevent(struct device *dev, struct kobj_uevent_env *env)
        return 0;
 }
 
+static void cfg80211_leave_all(struct cfg80211_registered_device *rdev)
+{
+       struct wireless_dev *wdev;
+
+       list_for_each_entry(wdev, &rdev->wdev_list, list)
+               cfg80211_leave(rdev, wdev);
+}
+
 static int wiphy_suspend(struct device *dev, pm_message_t state)
 {
        struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
@@ -90,12 +98,19 @@ static int wiphy_suspend(struct device *dev, pm_message_t state)
 
        rdev->suspend_at = get_seconds();
 
-       if (rdev->ops->suspend) {
-               rtnl_lock();
-               if (rdev->wiphy.registered)
-                       ret = rdev_suspend(rdev);
-               rtnl_unlock();
+       rtnl_lock();
+       if (rdev->wiphy.registered) {
+               if (!rdev->wowlan)
+                       cfg80211_leave_all(rdev);
+               if (rdev->ops->suspend)
+                       ret = rdev_suspend(rdev, rdev->wowlan);
+               if (ret == 1) {
+                       /* Driver refuse to configure wowlan */
+                       cfg80211_leave_all(rdev);
+                       ret = rdev_suspend(rdev, NULL);
+               }
        }
+       rtnl_unlock();
 
        return ret;
 }
@@ -106,9 +121,7 @@ static int wiphy_resume(struct device *dev)
        int ret = 0;
 
        /* Age scan results with time spent in suspend */
-       spin_lock_bh(&rdev->bss_lock);
        cfg80211_bss_age(rdev, get_seconds() - rdev->suspend_at);
-       spin_unlock_bh(&rdev->bss_lock);
 
        if (rdev->ops->resume) {
                rtnl_lock();