int rt2x00mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
-       int force_reconfig;
+       int radio_on;
+       int status;
 
        /*
         * Mac80211 might be calling this function while we are trying
                return 0;
 
        /*
-        * Check if we need to disable the radio,
-        * if this is not the case, at least the RX must be disabled.
+        * Only change device state when the radio is enabled. It does not
+        * matter what parameters we have configured when the radio is disabled
+        * because we won't be able to send or receive anyway. Also note that
+        * some configuration parameters (e.g. channel and antenna values) can
+        * only be set when the radio is enabled.
         */
-       if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) {
-               if (!conf->radio_enabled)
-                       rt2x00lib_disable_radio(rt2x00dev);
-               else
-                       rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
-       }
+       radio_on = test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags);
+       if (conf->radio_enabled) {
+               /* For programming the values, we have to turn RX off */
+               rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
 
-       /*
-        * When the DEVICE_DIRTY_CONFIG flag is set, the device has recently
-        * been started and the configuration must be forced upon the hardware.
-        * Otherwise registers will not be intialized correctly and could
-        * result in non-working hardware because essential registers aren't
-        * initialized.
-        */
-       force_reconfig =
-           test_and_clear_bit(DEVICE_STATE_DIRTY_CONFIG, &rt2x00dev->flags);
+               /* Enable the radio */
+               status = rt2x00lib_enable_radio(rt2x00dev);
+               if (unlikely(status))
+                       return status;
 
-       rt2x00lib_config(rt2x00dev, conf, force_reconfig);
+               /*
+                * When we've just turned on the radio, we want to reprogram
+                * everything to ensure a consistent state
+                */
+               rt2x00lib_config(rt2x00dev, conf, !radio_on);
 
-       /*
-        * Reenable RX only if the radio should be on.
-        */
-       if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
+               /* Turn RX back on */
                rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
-       else if (conf->radio_enabled)
-               return rt2x00lib_enable_radio(rt2x00dev);
+       } else {
+               /* Disable the radio */
+               rt2x00lib_disable_radio(rt2x00dev);
+       }
 
        return 0;
 }