|
@@ -338,7 +338,8 @@ EXPORT_SYMBOL_GPL(rt2x00mac_remove_interface);
|
|
|
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
|
|
@@ -348,35 +349,34 @@ int rt2x00mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf)
|
|
|
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;
|
|
|
}
|