rt2x00: Remove usage of deprecated radio_enabled & IEEE80211_CONF_CHANGE_RADIO_ENABLED
authorIvo van Doorn <ivdoorn@gmail.com>
Sat, 8 Aug 2009 21:53:04 +0000 (23:53 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 14 Aug 2009 13:13:51 +0000 (09:13 -0400)
In the config() callback function the fields radio_enabled and
the change flag IEEE80211_CONF_CHANGE_RADIO_ENABLED have been
deprecated. This removes the usage of those fields by improving
antenna change detection in the antenna configuration function.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00config.c
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00link.c
drivers/net/wireless/rt2x00/rt2x00mac.c

index 3845316..3501788 100644 (file)
@@ -124,8 +124,9 @@ enum antenna rt2x00lib_config_antenna_check(enum antenna current_ant,
 }
 
 void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
-                             struct antenna_setup ant)
+                             struct antenna_setup config)
 {
+       struct link_ant *ant = &rt2x00dev->link.ant;
        struct antenna_setup *def = &rt2x00dev->default_ant;
        struct antenna_setup *active = &rt2x00dev->link.ant.active;
 
@@ -134,14 +135,23 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
         * ANTENNA_SW_DIVERSITY state to the driver.
         * If that happens, fallback to hardware defaults,
         * or our own default.
+        * If diversity handling is active for a particular antenna,
+        * we shouldn't overwrite that antenna.
         * The calls to rt2x00lib_config_antenna_check()
         * might have caused that we restore back to the already
         * active setting. If that has happened we can quit.
         */
-       ant.rx = rt2x00lib_config_antenna_check(ant.rx, def->rx);
-       ant.tx = rt2x00lib_config_antenna_check(ant.tx, def->tx);
+       if (!(ant->flags & ANTENNA_RX_DIVERSITY))
+               config.rx = rt2x00lib_config_antenna_check(config.rx, def->rx);
+       else
+               config.rx = active->rx;
 
-       if (ant.rx == active->rx && ant.tx == active->tx)
+       if (!(ant->flags & ANTENNA_TX_DIVERSITY))
+               config.tx = rt2x00lib_config_antenna_check(config.tx, def->tx);
+       else
+               config.tx = active->tx;
+
+       if (config.rx == active->rx && config.tx == active->tx)
                return;
 
        /*
@@ -156,11 +166,11 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
         * The latter is required since we need to recalibrate the
         * noise-sensitivity ratio for the new setup.
         */
-       rt2x00dev->ops->lib->config_ant(rt2x00dev, &ant);
+       rt2x00dev->ops->lib->config_ant(rt2x00dev, &config);
 
        rt2x00link_reset_tuner(rt2x00dev, true);
 
-       memcpy(active, &ant, sizeof(ant));
+       memcpy(active, &config, sizeof(config));
 
        if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
                rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK);
index db54fcc..e0348cc 100644 (file)
@@ -785,6 +785,13 @@ int rt2x00lib_start(struct rt2x00_dev *rt2x00dev)
        rt2x00dev->intf_sta_count = 0;
        rt2x00dev->intf_associated = 0;
 
+       /* Enable the radio */
+       retval = rt2x00lib_enable_radio(rt2x00dev);
+       if (retval) {
+               rt2x00queue_uninitialize(rt2x00dev);
+               return retval;
+       }
+
        set_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags);
 
        return 0;
index 9178316..fe951dc 100644 (file)
@@ -219,6 +219,7 @@ static void rt2x00lib_antenna_diversity_eval(struct rt2x00_dev *rt2x00dev)
 static void rt2x00lib_antenna_diversity(struct rt2x00_dev *rt2x00dev)
 {
        struct link_ant *ant = &rt2x00dev->link.ant;
+       unsigned int flags = ant->flags;
 
        /*
         * Determine if software diversity is enabled for
@@ -226,13 +227,13 @@ static void rt2x00lib_antenna_diversity(struct rt2x00_dev *rt2x00dev)
         * Always perform this check since within the link
         * tuner interval the configuration might have changed.
         */
-       ant->flags &= ~ANTENNA_RX_DIVERSITY;
-       ant->flags &= ~ANTENNA_TX_DIVERSITY;
+       flags &= ~ANTENNA_RX_DIVERSITY;
+       flags &= ~ANTENNA_TX_DIVERSITY;
 
        if (rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY)
-               ant->flags |= ANTENNA_RX_DIVERSITY;
+               flags |= ANTENNA_RX_DIVERSITY;
        if (rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY)
-               ant->flags |= ANTENNA_TX_DIVERSITY;
+               flags |= ANTENNA_TX_DIVERSITY;
 
        if (!(ant->flags & ANTENNA_RX_DIVERSITY) &&
            !(ant->flags & ANTENNA_TX_DIVERSITY)) {
@@ -240,6 +241,9 @@ static void rt2x00lib_antenna_diversity(struct rt2x00_dev *rt2x00dev)
                return;
        }
 
+       /* Update flags */
+       ant->flags = flags;
+
        /*
         * If we have only sampled the data over the last period
         * we should now harvest the data. Otherwise just evaluate
index 81febdf..4164fce 100644 (file)
@@ -338,7 +338,6 @@ int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
        struct ieee80211_conf *conf = &hw->conf;
-       int status;
 
        /*
         * mac80211 might be calling this function while we are trying
@@ -348,44 +347,29 @@ int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed)
                return 0;
 
        /*
-        * 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.
+        * Some configuration parameters (e.g. channel and antenna values) can
+        * only be set when the radio is enabled, but do require the RX to
+        * be off.
         */
-       if (conf->radio_enabled) {
-               /* For programming the values, we have to turn RX off */
-               rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
+       rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF);
 
-               /* Enable the radio */
-               status = rt2x00lib_enable_radio(rt2x00dev);
-               if (unlikely(status))
-                       return status;
+       /*
+        * When we've just turned on the radio, we want to reprogram
+        * everything to ensure a consistent state
+        */
+       rt2x00lib_config(rt2x00dev, conf, changed);
 
-               /*
-                * When we've just turned on the radio, we want to reprogram
-                * everything to ensure a consistent state
-                */
-               rt2x00lib_config(rt2x00dev, conf, changed);
+       /*
+        * After the radio has been enabled we need to configure
+        * the antenna to the default settings. rt2x00lib_config_antenna()
+        * should determine if any action should be taken based on
+        * checking if diversity has been enabled or no antenna changes
+        * have been made since the last configuration change.
+        */
+       rt2x00lib_config_antenna(rt2x00dev, rt2x00dev->default_ant);
 
-               /*
-                * The radio was enabled, configure the antenna to the
-                * default settings, the link tuner will later start
-                * continue configuring the antenna based on the software
-                * diversity. But for non-diversity configurations, we need
-                * to have configured the correct state now.
-                */
-               if (changed & IEEE80211_CONF_CHANGE_RADIO_ENABLED)
-                       rt2x00lib_config_antenna(rt2x00dev,
-                                                rt2x00dev->default_ant);
-
-               /* Turn RX back on */
-               rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
-       } else {
-               /* Disable the radio */
-               rt2x00lib_disable_radio(rt2x00dev);
-       }
+       /* Turn RX back on */
+       rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON);
 
        return 0;
 }