void rt2x00rfkill_register(struct rt2x00_dev *rt2x00dev) { if (test_bit(RFKILL_STATE_REGISTERED, &rt2x00dev->rfkill_state)) return; if (rt2x00rfkill_allocate(rt2x00dev)) { ERROR(rt2x00dev, "Failed to allocate rfkill handler.\n"); return; } if (rfkill_register(rt2x00dev->rfkill)) { ERROR(rt2x00dev, "Failed to register rfkill handler.\n"); rt2x00rfkill_free(rt2x00dev); return; } __set_bit(RFKILL_STATE_REGISTERED, &rt2x00dev->rfkill_state); /* * Force initial poll which will detect the initial device state, * and correctly sends the signal to the rfkill layer about this * state. */ rt2x00rfkill_poll(&rt2x00dev->rfkill_work.work); }
void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) { __clear_bit(DEVICE_PRESENT, &rt2x00dev->flags); /* * Disable radio. */ rt2x00lib_disable_radio(rt2x00dev); /* * Uninitialize device. */ rt2x00lib_uninitialize(rt2x00dev); /* * Free extra components */ rt2x00debug_deregister(rt2x00dev); rt2x00rfkill_free(rt2x00dev); rt2x00leds_unregister(rt2x00dev); /* * Free ieee80211_hw memory. */ rt2x00lib_remove_hw(rt2x00dev); /* * Free firmware image. */ rt2x00lib_free_firmware(rt2x00dev); /* * Free queue structures. */ rt2x00queue_free(rt2x00dev); }