Ejemplo n.º 1
0
static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
                                      struct iw_request_info *info,
                                      union iwreq_data *data, char *extra)
{
    struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
    bool need_reconfig = 0;
    int new_power_level;

    if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
        return -EINVAL;
    if (data->txpower.flags & IW_TXPOW_RANGE)
        return -EINVAL;

    if (data->txpower.fixed) {
        new_power_level = data->txpower.value;
    } else {
        /*
         * Automatic power level. Use maximum power for the current
         * channel. Should be part of rate control.
         */
        struct ieee80211_channel* chan = local->hw.conf.channel;
        if (!chan)
            return -EINVAL;

        new_power_level = chan->max_power;
    }

    if (local->hw.conf.power_level != new_power_level) {
        local->hw.conf.power_level = new_power_level;
        need_reconfig = 1;
    }

    if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) {
        local->hw.conf.radio_enabled = !(data->txpower.disabled);
        need_reconfig = 1;
        ieee80211_led_radio(local, local->hw.conf.radio_enabled);
    }

    if (need_reconfig) {
        ieee80211_hw_config(local);
        /* The return value of hw_config is not of big interest here,
         * as it doesn't say that it failed because of _this_ config
         * change or something else. Ignore it. */
    }

    return 0;
}
Ejemplo n.º 2
0
static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
				      struct iw_request_info *info,
				      union iwreq_data *data, char *extra)
{
	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
	struct ieee80211_channel* chan = local->hw.conf.channel;
	u32 reconf_flags = 0;
	int new_power_level;

	if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
		return -EINVAL;
	if (data->txpower.flags & IW_TXPOW_RANGE)
		return -EINVAL;
	if (!chan)
		return -EINVAL;

	if (data->txpower.fixed)
		new_power_level = min(data->txpower.value, chan->max_power);
	else /* Automatic power level setting */
		new_power_level = chan->max_power;

	if (local->hw.conf.power_level != new_power_level) {
		local->hw.conf.power_level = new_power_level;
		reconf_flags |= IEEE80211_CONF_CHANGE_POWER;
	}

	if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) {
		local->hw.conf.radio_enabled = !(data->txpower.disabled);
		reconf_flags |= IEEE80211_CONF_CHANGE_RADIO_ENABLED;
		ieee80211_led_radio(local, local->hw.conf.radio_enabled);
	}

	if (reconf_flags)
		ieee80211_hw_config(local, reconf_flags);

	return 0;
}