int rt2x00mac_start(struct ieee80211_hw *hw) { struct rt2x00_dev *rt2x00dev = hw->priv; if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) return 0; return rt2x00lib_start(rt2x00dev); }
int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev) { int retval; NOTICE(rt2x00dev, "Waking up.\n"); /* * Restore/enable extra components. */ rt2x00debug_register(rt2x00dev); rt2x00leds_resume(rt2x00dev); /* * Only continue if mac80211 had open interfaces. */ if (!__test_and_clear_bit(DEVICE_STARTED_SUSPEND, &rt2x00dev->flags)) return 0; /* * Reinitialize device and all active interfaces. */ retval = rt2x00lib_start(rt2x00dev); if (retval) goto exit; /* * Reconfigure device. */ retval = rt2x00mac_config(rt2x00dev->hw, &rt2x00dev->hw->conf); if (retval) goto exit; /* * Iterator over each active interface to * reconfigure the hardware. */ ieee80211_iterate_active_interfaces(rt2x00dev->hw, rt2x00lib_resume_intf, rt2x00dev); /* * We are ready again to receive requests from mac80211. */ __set_bit(DEVICE_PRESENT, &rt2x00dev->flags); /* * It is possible that during that mac80211 has attempted * to send frames while we were suspending or resuming. * In that case we have disabled the TX queue and should * now enable it again */ ieee80211_wake_queues(rt2x00dev->hw); /* * During interface iteration we might have changed the * delayed_flags, time to handles the event by calling * the work handler directly. */ rt2x00lib_intf_scheduled(&rt2x00dev->intf_work); return 0; exit: rt2x00lib_disable_radio(rt2x00dev); rt2x00lib_uninitialize(rt2x00dev); rt2x00debug_deregister(rt2x00dev); return retval; }