Commit 5eadd94b authored by Wey-Yi Guy's avatar Wey-Yi Guy Committed by John W. Linville

iwlwifi: error checking for setting tx_power in sysfs

Perform error checking and report failure when setting tx power from
sysfs.
If fail to set the tx power, do not update the local copy, so user will
not see the incorrect tx power in sysfs
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent dc1b0973
...@@ -2477,10 +2477,15 @@ static ssize_t store_tx_power(struct device *d, ...@@ -2477,10 +2477,15 @@ static ssize_t store_tx_power(struct device *d,
ret = strict_strtoul(buf, 10, &val); ret = strict_strtoul(buf, 10, &val);
if (ret) if (ret)
IWL_INFO(priv, "%s is not in decimal form.\n", buf); IWL_INFO(priv, "%s is not in decimal form.\n", buf);
else else {
iwl_set_tx_power(priv, val, false); ret = iwl_set_tx_power(priv, val, false);
if (ret)
return count; IWL_ERR(priv, "failed setting tx power (0x%d).\n",
ret);
else
ret = count;
}
return ret;
} }
static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power); static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power);
......
...@@ -1701,6 +1701,8 @@ EXPORT_SYMBOL(iwl_init_drv); ...@@ -1701,6 +1701,8 @@ EXPORT_SYMBOL(iwl_init_drv);
int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
{ {
int ret = 0; int ret = 0;
s8 prev_tx_power = priv->tx_power_user_lmt;
if (tx_power < IWL_TX_POWER_TARGET_POWER_MIN) { if (tx_power < IWL_TX_POWER_TARGET_POWER_MIN) {
IWL_WARN(priv, "Requested user TXPOWER %d below lower limit %d.\n", IWL_WARN(priv, "Requested user TXPOWER %d below lower limit %d.\n",
tx_power, tx_power,
...@@ -1718,15 +1720,27 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) ...@@ -1718,15 +1720,27 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
if (priv->tx_power_user_lmt != tx_power) if (priv->tx_power_user_lmt != tx_power)
force = true; force = true;
priv->tx_power_user_lmt = tx_power;
/* if nic is not up don't send command */ /* if nic is not up don't send command */
if (!iwl_is_ready_rf(priv)) if (iwl_is_ready_rf(priv)) {
return ret; priv->tx_power_user_lmt = tx_power;
if (force && priv->cfg->ops->lib->send_tx_power)
if (force && priv->cfg->ops->lib->send_tx_power) ret = priv->cfg->ops->lib->send_tx_power(priv);
ret = priv->cfg->ops->lib->send_tx_power(priv); else if (!priv->cfg->ops->lib->send_tx_power)
ret = -EOPNOTSUPP;
/*
* if fail to set tx_power, restore the orig. tx power
*/
if (ret)
priv->tx_power_user_lmt = prev_tx_power;
}
/*
* Even this is an async host command, the command
* will always report success from uCode
* So once driver can placing the command into the queue
* successfully, driver can use priv->tx_power_user_lmt
* to reflect the current tx power
*/
return ret; return ret;
} }
EXPORT_SYMBOL(iwl_set_tx_power); EXPORT_SYMBOL(iwl_set_tx_power);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment