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; }
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; }