Exemple #1
0
void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
                  enum antenna rx, enum antenna tx)
{
    struct rt2x00lib_conf libconf;

    libconf.ant.rx = rx;
    libconf.ant.tx = tx;

    if (rx == rt2x00dev->link.ant.active.rx &&
        tx == rt2x00dev->link.ant.active.tx)
        return;

    /*
     * 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))
        rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF_LINK);

    /*
     * Write new antenna setup to device and reset the link tuner.
     * The latter is required since we need to recalibrate the
     * noise-sensitivity ratio for the new setup.
     */
    rt2x00dev->ops->lib->config(rt2x00dev, &libconf, CONFIG_UPDATE_ANTENNA);
    rt2x00lib_reset_link_tuner(rt2x00dev);
    rt2x00_reset_link_ant_rssi(&rt2x00dev->link);

    rt2x00dev->link.ant.active.rx = libconf.ant.rx;
    rt2x00dev->link.ant.active.tx = libconf.ant.tx;

    if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags))
        rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK);
}
static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)
{
	/*
	 * Clear all (possibly) pre-existing quality statistics.
	 */
	memset(&rt2x00dev->link.qual, 0, sizeof(rt2x00dev->link.qual));

	/*
	 * The RX and TX percentage should start at 50%
	 * this will assure we will get at least get some
	 * decent value when the link tuner starts.
	 * The value will be dropped and overwritten with
	 * the correct (measured )value anyway during the
	 * first run of the link tuner.
	 */
	rt2x00dev->link.qual.rx_percentage = 50;
	rt2x00dev->link.qual.tx_percentage = 50;

	rt2x00lib_reset_link_tuner(rt2x00dev);

	queue_delayed_work(rt2x00dev->hw->workqueue,
			   &rt2x00dev->link.work, LINK_TUNE_INTERVAL);
}
Exemple #3
0
void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
              struct ieee80211_conf *conf, const int force_config)
{
    struct rt2x00lib_conf libconf;
    struct ieee80211_supported_band *band;
    struct antenna_setup *default_ant = &rt2x00dev->default_ant;
    struct antenna_setup *active_ant = &rt2x00dev->link.ant.active;
    int flags = 0;
    int short_slot_time;

    /*
     * In some situations we want to force all configurations
     * to be reloaded (When resuming for instance).
     */
    if (force_config) {
        flags = CONFIG_UPDATE_ALL;
        goto config;
    }

    /*
     * Check which configuration options have been
     * updated and should be send to the device.
     */
    if (rt2x00dev->rx_status.band != conf->channel->band)
        flags |= CONFIG_UPDATE_PHYMODE;
    if (rt2x00dev->rx_status.freq != conf->channel->center_freq)
        flags |= CONFIG_UPDATE_CHANNEL;
    if (rt2x00dev->tx_power != conf->power_level)
        flags |= CONFIG_UPDATE_TXPOWER;

    /*
     * Determining changes in the antenna setups request several checks:
     * antenna_sel_{r,t}x = 0
     *    -> Does active_{r,t}x match default_{r,t}x
     *    -> Is default_{r,t}x SW_DIVERSITY
     * antenna_sel_{r,t}x = 1/2
     *    -> Does active_{r,t}x match antenna_sel_{r,t}x
     * The reason for not updating the antenna while SW diversity
     * should be used is simple: Software diversity means that
     * we should switch between the antenna's based on the
     * quality. This means that the current antenna is good enough
     * to work with untill the link tuner decides that an antenna
     * switch should be performed.
     */
    if (!conf->antenna_sel_rx &&
        default_ant->rx != ANTENNA_SW_DIVERSITY &&
        default_ant->rx != active_ant->rx)
        flags |= CONFIG_UPDATE_ANTENNA;
    else if (conf->antenna_sel_rx &&
         conf->antenna_sel_rx != active_ant->rx)
        flags |= CONFIG_UPDATE_ANTENNA;
    else if (active_ant->rx == ANTENNA_SW_DIVERSITY)
        flags |= CONFIG_UPDATE_ANTENNA;

    if (!conf->antenna_sel_tx &&
        default_ant->tx != ANTENNA_SW_DIVERSITY &&
        default_ant->tx != active_ant->tx)
        flags |= CONFIG_UPDATE_ANTENNA;
    else if (conf->antenna_sel_tx &&
         conf->antenna_sel_tx != active_ant->tx)
        flags |= CONFIG_UPDATE_ANTENNA;
    else if (active_ant->tx == ANTENNA_SW_DIVERSITY)
        flags |= CONFIG_UPDATE_ANTENNA;

    /*
     * The following configuration options are never
     * stored anywhere and will always be updated.
     */
    flags |= CONFIG_UPDATE_SLOT_TIME;
    flags |= CONFIG_UPDATE_BEACON_INT;

    /*
     * We have determined what options should be updated,
     * now precalculate device configuration values depending
     * on what configuration options need to be updated.
     */
config:
    memset(&libconf, 0, sizeof(libconf));

    if (flags & CONFIG_UPDATE_PHYMODE) {
        band = &rt2x00dev->bands[conf->channel->band];

        libconf.band = conf->channel->band;
        libconf.basic_rates = rt2x00lib_get_basic_rates(band);
    }

    if (flags & CONFIG_UPDATE_CHANNEL) {
        memcpy(&libconf.rf,
               &rt2x00dev->spec.channels[conf->channel->hw_value],
               sizeof(libconf.rf));
    }

    if (flags & CONFIG_UPDATE_ANTENNA) {
        if (conf->antenna_sel_rx)
            libconf.ant.rx = conf->antenna_sel_rx;
        else if (default_ant->rx != ANTENNA_SW_DIVERSITY)
            libconf.ant.rx = default_ant->rx;
        else if (active_ant->rx == ANTENNA_SW_DIVERSITY)
            libconf.ant.rx = ANTENNA_B;

        if (conf->antenna_sel_tx)
            libconf.ant.tx = conf->antenna_sel_tx;
        else if (default_ant->tx != ANTENNA_SW_DIVERSITY)
            libconf.ant.tx = default_ant->tx;
        else if (active_ant->tx == ANTENNA_SW_DIVERSITY)
            libconf.ant.tx = ANTENNA_B;
    }

    if (flags & CONFIG_UPDATE_SLOT_TIME) {
        short_slot_time = conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME;

        libconf.slot_time =
            short_slot_time ? SHORT_SLOT_TIME : SLOT_TIME;
        libconf.sifs = SIFS;
        libconf.pifs = short_slot_time ? SHORT_PIFS : PIFS;
        libconf.difs = short_slot_time ? SHORT_DIFS : DIFS;
        libconf.eifs = EIFS;
    }

    libconf.conf = conf;

    /*
     * Start configuration.
     */
    rt2x00dev->ops->lib->config(rt2x00dev, &libconf, flags);

    /*
     * Some configuration changes affect the link quality
     * which means we need to reset the link tuner.
     */
    if (flags & (CONFIG_UPDATE_CHANNEL | CONFIG_UPDATE_ANTENNA))
        rt2x00lib_reset_link_tuner(rt2x00dev);

    if (flags & CONFIG_UPDATE_PHYMODE) {
        rt2x00dev->curr_band = conf->channel->band;
        rt2x00dev->rx_status.band = conf->channel->band;
    }

    rt2x00dev->rx_status.freq = conf->channel->center_freq;
    rt2x00dev->tx_power = conf->power_level;

    if (flags & CONFIG_UPDATE_ANTENNA) {
        rt2x00dev->link.ant.active.rx = libconf.ant.rx;
        rt2x00dev->link.ant.active.tx = libconf.ant.tx;
    }
}