If the driver can't support WoWLAN in the current
state, this patch allows it to return 1 from the
suspend callback to do the normal deconfiguration
instead of using suspend/resume calls. Note that
if it does this, resume won't be called.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  *     ask the device to suspend. This is only invoked when WoWLAN is
  *     configured, otherwise the device is deconfigured completely and
  *     reconfigured at resume time.
+ *     The driver may also impose special conditions under which it
+ *     wants to use the "normal" suspend (deconfigure), say if it only
+ *     supports WoWLAN when the device is associated. In this case, it
+ *     must return 1 from this function.
  *
  * @resume: If WoWLAN was configured, this indicates that mac80211 is
  *     now resuming its operation, after this the device must be fully
 
        local->wowlan = wowlan && local->open_count;
        if (local->wowlan) {
                int err = drv_suspend(local, wowlan);
-               if (err) {
+               if (err < 0) {
                        local->quiescing = false;
                        return err;
+               } else if (err > 0) {
+                       WARN_ON(err != 1);
+                       local->wowlan = false;
+               } else {
+                       list_for_each_entry(sdata, &local->interfaces, list) {
+                               cancel_work_sync(&sdata->work);
+                               ieee80211_quiesce(sdata);
+                       }
+                       goto suspend;
                }
-               list_for_each_entry(sdata, &local->interfaces, list) {
-                       cancel_work_sync(&sdata->work);
-                       ieee80211_quiesce(sdata);
-               }
-               goto suspend;
        }
 
        /* disable keys */