提交 e1957dba 编写于 作者: J Johannes Berg

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: NAmitkumar Karwar <akarwar@marvell.com>
Tested-by: NAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
上级 b4f0fd4b
...@@ -104,13 +104,16 @@ static int wiphy_suspend(struct device *dev) ...@@ -104,13 +104,16 @@ static int wiphy_suspend(struct device *dev)
rtnl_lock(); rtnl_lock();
if (rdev->wiphy.registered) { if (rdev->wiphy.registered) {
if (!rdev->wiphy.wowlan_config) if (!rdev->wiphy.wowlan_config) {
cfg80211_leave_all(rdev); cfg80211_leave_all(rdev);
cfg80211_process_rdev_events(rdev);
}
if (rdev->ops->suspend) if (rdev->ops->suspend)
ret = rdev_suspend(rdev, rdev->wiphy.wowlan_config); ret = rdev_suspend(rdev, rdev->wiphy.wowlan_config);
if (ret == 1) { if (ret == 1) {
/* Driver refuse to configure wowlan */ /* Driver refuse to configure wowlan */
cfg80211_leave_all(rdev); cfg80211_leave_all(rdev);
cfg80211_process_rdev_events(rdev);
ret = rdev_suspend(rdev, NULL); ret = rdev_suspend(rdev, NULL);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册