--- /dev/null
+From 0262ab0df64a67d4c0ed7577a29b7d866819cc68 Mon Sep 17 00:00:00 2001
+From: Ivo van Doorn <ivdoorn@gmail.com>
+Date: Fri, 29 Aug 2008 21:04:26 +0200
+Subject: [PATCH] rt2x00: Fix race conditions in flag handling
+Patch-mainline: 2.6.28-rc3
+References: bnc#462551
+
+Some of the flags should be accessed atomically to
+prevent race conditions. The flags that are most important
+are those that can change often and indicate the actual
+state of the device, queue or queue entry.
+
+The big flag rename was done to move all state flags to
+the same naming type as the other rt2x00dev flags and
+made sure all places where the flags were used were changed. ;)
+
+Thanks to Stephen for most of the queue flags updates,
+which fixes some of the most obvious consequences of the
+race conditions. Among those the notorious:
+
+rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 0.
+rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 0.
+rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 0.
+
+Signed-off-by: Stephen Blackheath <tramp.enshrine.stephen@blacksapphire.com>
+Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+---
+ drivers/net/wireless/rt2x00/rt2400pci.c | 2 -
+ drivers/net/wireless/rt2x00/rt2500pci.c | 2 -
+ drivers/net/wireless/rt2x00/rt2500usb.c | 2 -
+ drivers/net/wireless/rt2x00/rt2x00.h | 16 ++++----
+ drivers/net/wireless/rt2x00/rt2x00config.c | 4 +-
+ drivers/net/wireless/rt2x00/rt2x00dev.c | 58 +++++++++++++++--------------
+ drivers/net/wireless/rt2x00/rt2x00mac.c | 26 ++++++-------
+ drivers/net/wireless/rt2x00/rt2x00queue.c | 6 +--
+ drivers/net/wireless/rt2x00/rt2x00rfkill.c | 6 +--
+ drivers/net/wireless/rt2x00/rt2x00usb.c | 10 ++---
+ drivers/net/wireless/rt2x00/rt61pci.c | 2 -
+ 11 files changed, 68 insertions(+), 66 deletions(-)
+
+--- a/drivers/net/wireless/rt2x00/rt2400pci.c
++++ b/drivers/net/wireless/rt2x00/rt2400pci.c
+@@ -1241,7 +1241,7 @@ static irqreturn_t rt2400pci_interrupt(i
+ if (!reg)
+ return IRQ_NONE;
+
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return IRQ_HANDLED;
+
+ /*
+--- a/drivers/net/wireless/rt2x00/rt2500pci.c
++++ b/drivers/net/wireless/rt2x00/rt2500pci.c
+@@ -1377,7 +1377,7 @@ static irqreturn_t rt2500pci_interrupt(i
+ if (!reg)
+ return IRQ_NONE;
+
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return IRQ_HANDLED;
+
+ /*
+--- a/drivers/net/wireless/rt2x00/rt2500usb.c
++++ b/drivers/net/wireless/rt2x00/rt2500usb.c
+@@ -1297,7 +1297,7 @@ static void rt2500usb_beacondone(struct
+ struct queue_entry *entry = (struct queue_entry *)urb->context;
+ struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data;
+
+- if (!test_bit(DEVICE_ENABLED_RADIO, &entry->queue->rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &entry->queue->rt2x00dev->flags))
+ return;
+
+ /*
+--- a/drivers/net/wireless/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/rt2x00/rt2x00.h
+@@ -599,14 +599,14 @@ enum rt2x00_flags {
+ /*
+ * Device state flags
+ */
+- DEVICE_PRESENT,
+- DEVICE_REGISTERED_HW,
+- DEVICE_INITIALIZED,
+- DEVICE_STARTED,
+- DEVICE_STARTED_SUSPEND,
+- DEVICE_ENABLED_RADIO,
+- DEVICE_DISABLED_RADIO_HW,
+- DEVICE_DIRTY_CONFIG,
++ DEVICE_STATE_PRESENT,
++ DEVICE_STATE_REGISTERED_HW,
++ DEVICE_STATE_INITIALIZED,
++ DEVICE_STATE_STARTED,
++ DEVICE_STATE_STARTED_SUSPEND,
++ DEVICE_STATE_ENABLED_RADIO,
++ DEVICE_STATE_DISABLED_RADIO_HW,
++ DEVICE_STATE_DIRTY_CONFIG,
+
+ /*
+ * Driver features
+--- a/drivers/net/wireless/rt2x00/rt2x00config.c
++++ b/drivers/net/wireless/rt2x00/rt2x00config.c
+@@ -121,7 +121,7 @@ void rt2x00lib_config_antenna(struct rt2
+ * Antenna setup changes require the RX to be disabled,
+ * else the changes will be ignored by the device.
+ */
+- if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF_LINK);
+
+ /*
+@@ -136,7 +136,7 @@ void rt2x00lib_config_antenna(struct rt2
+ rt2x00dev->link.ant.active.rx = libconf.ant.rx;
+ rt2x00dev->link.ant.active.tx = libconf.ant.tx;
+
+- if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK);
+ }
+
+--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+@@ -34,7 +34,7 @@
+ */
+ void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
+ {
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return;
+
+ /*
+@@ -94,8 +94,8 @@ int rt2x00lib_enable_radio(struct rt2x00
+ * Don't enable the radio twice.
+ * And check if the hardware button has been disabled.
+ */
+- if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
+- test_bit(DEVICE_DISABLED_RADIO_HW, &rt2x00dev->flags))
++ if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags) ||
++ test_bit(DEVICE_STATE_DISABLED_RADIO_HW, &rt2x00dev->flags))
+ return 0;
+
+ /*
+@@ -117,7 +117,7 @@ int rt2x00lib_enable_radio(struct rt2x00
+ rt2x00leds_led_radio(rt2x00dev, true);
+ rt2x00led_led_activity(rt2x00dev, true);
+
+- __set_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags);
+
+ /*
+ * Enable RX.
+@@ -134,7 +134,7 @@ int rt2x00lib_enable_radio(struct rt2x00
+
+ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev)
+ {
+- if (!__test_and_clear_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_and_clear_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return;
+
+ /*
+@@ -354,7 +354,7 @@ static void rt2x00lib_link_tuner(struct
+ * When the radio is shutting down we should
+ * immediately cease all link tuning.
+ */
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return;
+
+ /*
+@@ -431,7 +431,7 @@ static void rt2x00lib_intf_scheduled_ite
+ * note that in the spinlock protected area above the delayed_flags
+ * have been cleared correctly.
+ */
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return;
+
+ if (delayed_flags & DELAYED_UPDATE_BEACON)
+@@ -484,7 +484,7 @@ static void rt2x00lib_beacondone_iter(vo
+
+ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
+ {
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return;
+
+ ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
+@@ -563,7 +563,7 @@ void rt2x00lib_txdone(struct queue_entry
+
+ rt2x00dev->ops->lib->init_txentry(rt2x00dev, entry);
+
+- __clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
++ clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
+ rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE);
+
+ /*
+@@ -878,7 +878,7 @@ static int rt2x00lib_probe_hw_modes(stru
+
+ static void rt2x00lib_remove_hw(struct rt2x00_dev *rt2x00dev)
+ {
+- if (test_bit(DEVICE_REGISTERED_HW, &rt2x00dev->flags))
++ if (test_bit(DEVICE_STATE_REGISTERED_HW, &rt2x00dev->flags))
+ ieee80211_unregister_hw(rt2x00dev->hw);
+
+ if (likely(rt2x00dev->hw->wiphy->bands[IEEE80211_BAND_2GHZ])) {
+@@ -894,6 +894,9 @@ static int rt2x00lib_probe_hw(struct rt2
+ struct hw_mode_spec *spec = &rt2x00dev->spec;
+ int status;
+
++ if (test_bit(DEVICE_STATE_REGISTERED_HW, &rt2x00dev->flags))
++ return 0;
++
+ /*
+ * Initialize HW modes.
+ */
+@@ -915,7 +918,7 @@ static int rt2x00lib_probe_hw(struct rt2
+ return status;
+ }
+
+- __set_bit(DEVICE_REGISTERED_HW, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_REGISTERED_HW, &rt2x00dev->flags);
+
+ return 0;
+ }
+@@ -925,7 +928,7 @@ static int rt2x00lib_probe_hw(struct rt2
+ */
+ static void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev)
+ {
+- if (!__test_and_clear_bit(DEVICE_INITIALIZED, &rt2x00dev->flags))
++ if (!test_and_clear_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags))
+ return;
+
+ /*
+@@ -948,7 +951,7 @@ static int rt2x00lib_initialize(struct r
+ {
+ int status;
+
+- if (test_bit(DEVICE_INITIALIZED, &rt2x00dev->flags))
++ if (test_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags))
+ return 0;
+
+ /*
+@@ -967,7 +970,7 @@ static int rt2x00lib_initialize(struct r
+ return status;
+ }
+
+- __set_bit(DEVICE_INITIALIZED, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags);
+
+ /*
+ * Register the extra components.
+@@ -981,7 +984,7 @@ int rt2x00lib_start(struct rt2x00_dev *r
+ {
+ int retval;
+
+- if (test_bit(DEVICE_STARTED, &rt2x00dev->flags))
++ if (test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags))
+ return 0;
+
+ /*
+@@ -1012,15 +1015,15 @@ int rt2x00lib_start(struct rt2x00_dev *r
+ rt2x00dev->intf_sta_count = 0;
+ rt2x00dev->intf_associated = 0;
+
+- __set_bit(DEVICE_STARTED, &rt2x00dev->flags);
+- __set_bit(DEVICE_DIRTY_CONFIG, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_DIRTY_CONFIG, &rt2x00dev->flags);
+
+ return 0;
+ }
+
+ void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev)
+ {
+- if (!test_bit(DEVICE_STARTED, &rt2x00dev->flags))
++ if (!test_and_clear_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags))
+ return;
+
+ /*
+@@ -1032,8 +1035,6 @@ void rt2x00lib_stop(struct rt2x00_dev *r
+ rt2x00dev->intf_ap_count = 0;
+ rt2x00dev->intf_sta_count = 0;
+ rt2x00dev->intf_associated = 0;
+-
+- __clear_bit(DEVICE_STARTED, &rt2x00dev->flags);
+ }
+
+ /*
+@@ -1088,7 +1089,7 @@ int rt2x00lib_probe_dev(struct rt2x00_de
+ rt2x00rfkill_allocate(rt2x00dev);
+ rt2x00debug_register(rt2x00dev);
+
+- __set_bit(DEVICE_PRESENT, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
+
+ return 0;
+
+@@ -1101,7 +1102,7 @@ EXPORT_SYMBOL_GPL(rt2x00lib_probe_dev);
+
+ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
+ {
+- __clear_bit(DEVICE_PRESENT, &rt2x00dev->flags);
++ clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
+
+ /*
+ * Disable radio.
+@@ -1146,14 +1147,15 @@ int rt2x00lib_suspend(struct rt2x00_dev
+ int retval;
+
+ NOTICE(rt2x00dev, "Going to sleep.\n");
+- __clear_bit(DEVICE_PRESENT, &rt2x00dev->flags);
+
+ /*
+ * Only continue if mac80211 has open interfaces.
+ */
+- if (!test_bit(DEVICE_STARTED, &rt2x00dev->flags))
++ if (!test_and_clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) ||
++ !test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags))
+ goto exit;
+- __set_bit(DEVICE_STARTED_SUSPEND, &rt2x00dev->flags);
++
++ set_bit(DEVICE_STATE_STARTED_SUSPEND, &rt2x00dev->flags);
+
+ /*
+ * Disable radio.
+@@ -1225,7 +1227,7 @@ int rt2x00lib_resume(struct rt2x00_dev *
+ /*
+ * Only continue if mac80211 had open interfaces.
+ */
+- if (!__test_and_clear_bit(DEVICE_STARTED_SUSPEND, &rt2x00dev->flags))
++ if (!test_and_clear_bit(DEVICE_STATE_STARTED_SUSPEND, &rt2x00dev->flags))
+ return 0;
+
+ /*
+@@ -1252,7 +1254,7 @@ int rt2x00lib_resume(struct rt2x00_dev *
+ /*
+ * We are ready again to receive requests from mac80211.
+ */
+- __set_bit(DEVICE_PRESENT, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
+
+ /*
+ * It is possible that during that mac80211 has attempted
+@@ -1272,7 +1274,7 @@ int rt2x00lib_resume(struct rt2x00_dev *
+ return 0;
+
+ exit:
+- rt2x00lib_disable_radio(rt2x00dev);
++ rt2x00lib_stop(rt2x00dev);
+ rt2x00lib_uninitialize(rt2x00dev);
+ rt2x00debug_deregister(rt2x00dev);
+
+--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
+@@ -106,7 +106,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw
+ * Note that we can only stop the TX queues inside the TX path
+ * due to possible race conditions in mac80211.
+ */
+- if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags)) {
++ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) {
+ ieee80211_stop_queues(hw);
+ dev_kfree_skb_any(skb);
+ return NETDEV_TX_OK;
+@@ -168,7 +168,7 @@ int rt2x00mac_start(struct ieee80211_hw
+ {
+ struct rt2x00_dev *rt2x00dev = hw->priv;
+
+- if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
+ return 0;
+
+ return rt2x00lib_start(rt2x00dev);
+@@ -179,7 +179,7 @@ void rt2x00mac_stop(struct ieee80211_hw
+ {
+ struct rt2x00_dev *rt2x00dev = hw->priv;
+
+- if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
+ return;
+
+ rt2x00lib_stop(rt2x00dev);
+@@ -199,8 +199,8 @@ int rt2x00mac_add_interface(struct ieee8
+ * Don't allow interfaces to be added
+ * the device has disappeared.
+ */
+- if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags) ||
+- !test_bit(DEVICE_STARTED, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) ||
++ !test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags))
+ return -ENODEV;
+
+ switch (conf->type) {
+@@ -249,7 +249,7 @@ int rt2x00mac_add_interface(struct ieee8
+ */
+ for (i = 0; i < queue->limit; i++) {
+ entry = &queue->entries[i];
+- if (!__test_and_set_bit(ENTRY_BCN_ASSIGNED, &entry->flags))
++ if (!test_and_set_bit(ENTRY_BCN_ASSIGNED, &entry->flags))
+ break;
+ }
+
+@@ -303,7 +303,7 @@ void rt2x00mac_remove_interface(struct i
+ * either the device has disappeared or when
+ * no interface is present.
+ */
+- if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags) ||
++ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) ||
+ (conf->type == IEEE80211_IF_TYPE_AP && !rt2x00dev->intf_ap_count) ||
+ (conf->type != IEEE80211_IF_TYPE_AP && !rt2x00dev->intf_sta_count))
+ return;
+@@ -317,7 +317,7 @@ void rt2x00mac_remove_interface(struct i
+ * Release beacon entry so it is available for
+ * new interfaces again.
+ */
+- __clear_bit(ENTRY_BCN_ASSIGNED, &intf->beacon->flags);
++ clear_bit(ENTRY_BCN_ASSIGNED, &intf->beacon->flags);
+
+ /*
+ * Make sure the bssid and mac address registers
+@@ -337,14 +337,14 @@ int rt2x00mac_config(struct ieee80211_hw
+ * Mac80211 might be calling this function while we are trying
+ * to remove the device or perhaps suspending it.
+ */
+- if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
+ return 0;
+
+ /*
+ * Check if we need to disable the radio,
+ * if this is not the case, at least the RX must be disabled.
+ */
+- if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) {
++ if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) {
+ if (!conf->radio_enabled)
+ rt2x00lib_disable_radio(rt2x00dev);
+ else
+@@ -359,14 +359,14 @@ int rt2x00mac_config(struct ieee80211_hw
+ * initialized.
+ */
+ force_reconfig =
+- __test_and_clear_bit(DEVICE_DIRTY_CONFIG, &rt2x00dev->flags);
++ test_and_clear_bit(DEVICE_STATE_DIRTY_CONFIG, &rt2x00dev->flags);
+
+ rt2x00lib_config(rt2x00dev, conf, force_reconfig);
+
+ /*
+ * Reenable RX only if the radio should be on.
+ */
+- if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
+ else if (conf->radio_enabled)
+ return rt2x00lib_enable_radio(rt2x00dev);
+@@ -388,7 +388,7 @@ int rt2x00mac_config_interface(struct ie
+ * Mac80211 might be calling this function while we are trying
+ * to remove the device or perhaps suspending it.
+ */
+- if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
+ return 0;
+
+ spin_lock(&intf->lock);
+--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
++++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
+@@ -309,7 +309,7 @@ int rt2x00queue_write_tx_frame(struct da
+ if (unlikely(rt2x00queue_full(queue)))
+ return -EINVAL;
+
+- if (__test_and_set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) {
++ if (test_and_set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) {
+ ERROR(queue->rt2x00dev,
+ "Arrived at non-free entry in the non-full queue %d.\n"
+ "Please file bug report to %s.\n",
+@@ -333,14 +333,14 @@ int rt2x00queue_write_tx_frame(struct da
+ skbdesc->entry = entry;
+
+ if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry))) {
+- __clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
++ clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
+ return -EIO;
+ }
+
+ if (test_bit(DRIVER_REQUIRE_DMA, &queue->rt2x00dev->flags))
+ rt2x00queue_map_txskb(queue->rt2x00dev, skb);
+
+- __set_bit(ENTRY_DATA_PENDING, &entry->flags);
++ set_bit(ENTRY_DATA_PENDING, &entry->flags);
+
+ rt2x00queue_index_inc(queue, Q_INDEX);
+ rt2x00queue_write_tx_descriptor(entry, &txdesc);
+--- a/drivers/net/wireless/rt2x00/rt2x00rfkill.c
++++ b/drivers/net/wireless/rt2x00/rt2x00rfkill.c
+@@ -41,16 +41,16 @@ static int rt2x00rfkill_toggle_radio(voi
+ /*
+ * Only continue if there are enabled interfaces.
+ */
+- if (!test_bit(DEVICE_STARTED, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags))
+ return 0;
+
+ if (state == RFKILL_STATE_UNBLOCKED) {
+ INFO(rt2x00dev, "Hardware button pressed, enabling radio.\n");
+- __clear_bit(DEVICE_DISABLED_RADIO_HW, &rt2x00dev->flags);
++ clear_bit(DEVICE_STATE_DISABLED_RADIO_HW, &rt2x00dev->flags);
+ retval = rt2x00lib_enable_radio(rt2x00dev);
+ } else if (state == RFKILL_STATE_SOFT_BLOCKED) {
+ INFO(rt2x00dev, "Hardware button pressed, disabling radio.\n");
+- __set_bit(DEVICE_DISABLED_RADIO_HW, &rt2x00dev->flags);
++ set_bit(DEVICE_STATE_DISABLED_RADIO_HW, &rt2x00dev->flags);
+ rt2x00lib_disable_radio(rt2x00dev);
+ } else {
+ WARNING(rt2x00dev, "Received unexpected rfkill state %d.\n",
+--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
++++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
+@@ -163,7 +163,7 @@ static void rt2x00usb_interrupt_txdone(s
+ struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
+ struct txdone_entry_desc txdesc;
+
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags) ||
+ !test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ return;
+
+@@ -232,7 +232,7 @@ static inline void rt2x00usb_kick_tx_ent
+ {
+ struct queue_entry_priv_usb *entry_priv = entry->priv_data;
+
+- if (__test_and_clear_bit(ENTRY_DATA_PENDING, &entry->flags))
++ if (test_and_clear_bit(ENTRY_DATA_PENDING, &entry->flags))
+ usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
+ }
+
+@@ -283,7 +283,7 @@ static void rt2x00usb_interrupt_rxdone(s
+ struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
+ u8 rxd[32];
+
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags) ||
+ !test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
+ return;
+
+@@ -293,7 +293,7 @@ static void rt2x00usb_interrupt_rxdone(s
+ * a problem.
+ */
+ if (urb->actual_length < entry->queue->desc_size || urb->status) {
+- __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
++ set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
+ usb_submit_urb(urb, GFP_ATOMIC);
+ return;
+ }
+@@ -361,7 +361,7 @@ void rt2x00usb_init_rxentry(struct rt2x0
+ entry->skb->data, entry->skb->len,
+ rt2x00usb_interrupt_rxdone, entry);
+
+- __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
++ set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
+ usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
+ }
+ EXPORT_SYMBOL_GPL(rt2x00usb_init_rxentry);
+--- a/drivers/net/wireless/rt2x00/rt61pci.c
++++ b/drivers/net/wireless/rt2x00/rt61pci.c
+@@ -1860,7 +1860,7 @@ static irqreturn_t rt61pci_interrupt(int
+ if (!reg && !reg_mcu)
+ return IRQ_NONE;
+
+- if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
++ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+ return IRQ_HANDLED;
+
+ /*