Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 709034 Details for
Bug 856863
cfg80211_mlme_down while suspended
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
cfg80211_mac80211_disconnect_on_suspend_v3.8.patch
cfg80211_mac80211_disconnect_on_suspend_v3.8.patch (text/plain), 5.24 KB, created by
Stanislaw Gruszka
on 2013-03-12 15:50:58 UTC
(
hide
)
Description:
cfg80211_mac80211_disconnect_on_suspend_v3.8.patch
Filename:
MIME Type:
Creator:
Stanislaw Gruszka
Created:
2013-03-12 15:50:58 UTC
Size:
5.24 KB
patch
obsolete
>diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c >index 79a48f3..ce4f973 100644 >--- a/net/mac80211/pm.c >+++ b/net/mac80211/pm.c >@@ -92,7 +92,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) > return err; > } else if (err > 0) { > WARN_ON(err != 1); >- local->wowlan = false; >+ return err; > } else { > list_for_each_entry(sdata, &local->interfaces, list) { > cancel_work_sync(&sdata->work); >diff --git a/net/wireless/core.c b/net/wireless/core.c >index b677eab..66cc98d 100644 >--- a/net/wireless/core.c >+++ b/net/wireless/core.c >@@ -806,6 +806,46 @@ void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev, > rdev->num_running_monitor_ifaces += num; > } > >+void cfg80211_leave(struct cfg80211_registered_device *rdev, >+ struct wireless_dev *wdev) >+{ >+ struct net_device *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: >+ mutex_lock(&rdev->sched_scan_mtx); >+ __cfg80211_stop_sched_scan(rdev, false); >+ mutex_unlock(&rdev->sched_scan_mtx); >+ >+ 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); >+ break; >+ default: >+ break; >+ } >+ >+ wdev->beacon_interval = 0; >+} >+ > static int cfg80211_netdev_notifier_call(struct notifier_block *nb, > unsigned long state, > void *ndev) >@@ -874,38 +914,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, > dev->priv_flags |= IFF_DONT_BRIDGE; > break; > case NETDEV_GOING_DOWN: >- switch (wdev->iftype) { >- case NL80211_IFTYPE_ADHOC: >- cfg80211_leave_ibss(rdev, dev, true); >- break; >- case NL80211_IFTYPE_P2P_CLIENT: >- case NL80211_IFTYPE_STATION: >- mutex_lock(&rdev->sched_scan_mtx); >- __cfg80211_stop_sched_scan(rdev, false); >- mutex_unlock(&rdev->sched_scan_mtx); >- >- 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); >- break; >- default: >- break; >- } >- wdev->beacon_interval = 0; >+ cfg80211_leave(rdev, wdev); > break; > case NETDEV_DOWN: > cfg80211_update_iface_num(rdev, wdev->iftype, -1); >diff --git a/net/wireless/core.h b/net/wireless/core.h >index 3563097..49d79d9 100644 >--- a/net/wireless/core.h >+++ b/net/wireless/core.h >@@ -481,6 +481,9 @@ int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev, > void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev, > enum nl80211_iftype iftype, int num); > >+void cfg80211_leave(struct cfg80211_registered_device *rdev, >+ struct wireless_dev *wdev); >+ > #define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10 > > #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS >diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h >index 6c0c819..08e4145 100644 >--- a/net/wireless/rdev-ops.h >+++ b/net/wireless/rdev-ops.h >@@ -6,11 +6,12 @@ > #include "core.h" > #include "trace.h" > >-static inline int rdev_suspend(struct cfg80211_registered_device *rdev) >+static inline int rdev_suspend(struct cfg80211_registered_device *rdev, >+ struct cfg80211_wowlan *wowlan) > { > int ret; >- trace_rdev_suspend(&rdev->wiphy, rdev->wowlan); >- ret = rdev->ops->suspend(&rdev->wiphy, rdev->wowlan); >+ trace_rdev_suspend(&rdev->wiphy, wowlan); >+ ret = rdev->ops->suspend(&rdev->wiphy, wowlan); > trace_rdev_return_int(&rdev->wiphy, ret); > return ret; > } >diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c >index 1f6f01e..a6a108b 100644 >--- a/net/wireless/sysfs.c >+++ b/net/wireless/sysfs.c >@@ -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; > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 856863
:
709033
| 709034