cfg80211: process events caused by suspend before suspending
When suspending without WoWLAN, cfg80211 will ask drivers to disconnect. Even when the driver does this synchronously, and immediately returns with a notification, cfg80211 schedules the handling thereof to a workqueue, and may then call back into the driver when the driver was already suspended/ing. Fix this by processing all events caused by cfg80211_leave_all() directly after that function returns. The driver still needs to do the right thing here and wait for the firmware response, but that is - at least - true for mwifiex where this occurred. Reported-by: Amitkumar Karwar <akarwar@marvell.com> Tested-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
b4f0fd4baa
commit
e1957dba5b
|
@ -104,13 +104,16 @@ static int wiphy_suspend(struct device *dev)
|
|||
|
||||
rtnl_lock();
|
||||
if (rdev->wiphy.registered) {
|
||||
if (!rdev->wiphy.wowlan_config)
|
||||
if (!rdev->wiphy.wowlan_config) {
|
||||
cfg80211_leave_all(rdev);
|
||||
cfg80211_process_rdev_events(rdev);
|
||||
}
|
||||
if (rdev->ops->suspend)
|
||||
ret = rdev_suspend(rdev, rdev->wiphy.wowlan_config);
|
||||
if (ret == 1) {
|
||||
/* Driver refuse to configure wowlan */
|
||||
cfg80211_leave_all(rdev);
|
||||
cfg80211_process_rdev_events(rdev);
|
||||
ret = rdev_suspend(rdev, NULL);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue