aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c13
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c28
2 files changed, 30 insertions, 11 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 2232b1794e76..533b393e8cf6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -2477,10 +2477,15 @@ static ssize_t store_tx_power(struct device *d,
2477 ret = strict_strtoul(buf, 10, &val); 2477 ret = strict_strtoul(buf, 10, &val);
2478 if (ret) 2478 if (ret)
2479 IWL_INFO(priv, "%s is not in decimal form.\n", buf); 2479 IWL_INFO(priv, "%s is not in decimal form.\n", buf);
2480 else 2480 else {
2481 iwl_set_tx_power(priv, val, false); 2481 ret = iwl_set_tx_power(priv, val, false);
2482 2482 if (ret)
2483 return count; 2483 IWL_ERR(priv, "failed setting tx power (0x%d).\n",
2484 ret);
2485 else
2486 ret = count;
2487 }
2488 return ret;
2484} 2489}
2485 2490
2486static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power); 2491static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power);
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 82dadd043b8f..c62c081cfbb7 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1701,6 +1701,8 @@ EXPORT_SYMBOL(iwl_init_drv);
1701int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) 1701int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
1702{ 1702{
1703 int ret = 0; 1703 int ret = 0;
1704 s8 prev_tx_power = priv->tx_power_user_lmt;
1705
1704 if (tx_power < IWL_TX_POWER_TARGET_POWER_MIN) { 1706 if (tx_power < IWL_TX_POWER_TARGET_POWER_MIN) {
1705 IWL_WARN(priv, "Requested user TXPOWER %d below lower limit %d.\n", 1707 IWL_WARN(priv, "Requested user TXPOWER %d below lower limit %d.\n",
1706 tx_power, 1708 tx_power,
@@ -1718,15 +1720,27 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
1718 if (priv->tx_power_user_lmt != tx_power) 1720 if (priv->tx_power_user_lmt != tx_power)
1719 force = true; 1721 force = true;
1720 1722
1721 priv->tx_power_user_lmt = tx_power;
1722
1723 /* if nic is not up don't send command */ 1723 /* if nic is not up don't send command */
1724 if (!iwl_is_ready_rf(priv)) 1724 if (iwl_is_ready_rf(priv)) {
1725 return ret; 1725 priv->tx_power_user_lmt = tx_power;
1726 1726 if (force && priv->cfg->ops->lib->send_tx_power)
1727 if (force && priv->cfg->ops->lib->send_tx_power) 1727 ret = priv->cfg->ops->lib->send_tx_power(priv);
1728 ret = priv->cfg->ops->lib->send_tx_power(priv); 1728 else if (!priv->cfg->ops->lib->send_tx_power)
1729 ret = -EOPNOTSUPP;
1730 /*
1731 * if fail to set tx_power, restore the orig. tx power
1732 */
1733 if (ret)
1734 priv->tx_power_user_lmt = prev_tx_power;
1735 }
1729 1736
1737 /*
1738 * Even this is an async host command, the command
1739 * will always report success from uCode
1740 * So once driver can placing the command into the queue
1741 * successfully, driver can use priv->tx_power_user_lmt
1742 * to reflect the current tx power
1743 */
1730 return ret; 1744 return ret;
1731} 1745}
1732EXPORT_SYMBOL(iwl_set_tx_power); 1746EXPORT_SYMBOL(iwl_set_tx_power);