rt2x00dev->intf_associated = 0;
 
        __set_bit(DEVICE_STARTED, &rt2x00dev->flags);
+       __set_bit(DEVICE_DIRTY_CONFIG, &rt2x00dev->flags);
 
        return 0;
 }
        /*
         * Reconfigure device.
         */
-       rt2x00lib_config(rt2x00dev, &rt2x00dev->hw->conf, 1);
-       if (!rt2x00dev->hw->conf.radio_enabled)
-               rt2x00lib_disable_radio(rt2x00dev);
+       retval = rt2x00mac_config(rt2x00dev->hw, &rt2x00dev->hw->conf);
+       if (retval)
+               goto exit;
 
        /*
         * Iterator over each active interface to
 
 int rt2x00mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
+       int force_reconfig;
 
        /*
         * Mac80211 might be calling this function while we are trying
                        rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
        }
 
-       rt2x00lib_config(rt2x00dev, conf, 0);
+       /*
+        * 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_DIRTY_CONFIG, &rt2x00dev->flags);
+
+       rt2x00lib_config(rt2x00dev, conf, force_reconfig);
 
        /*
         * Reenable RX only if the radio should be on.