Commit f844a709 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by John W. Linville

iwlwifi: do not set tx power when channel is changing

Mac80211 can request for tx power and channel change in one ->config
call. If that happens, *_send_tx_power functions will try to setup tx
power for old channel, what can be not correct because we already change
the band. I.e  error  "Failed to get channel info for channel 140 [0]",
can be printed frequently when operating in software scanning mode.
Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Acked-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent efe1cf0c
...@@ -1890,7 +1890,7 @@ int iwl3945_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) ...@@ -1890,7 +1890,7 @@ int iwl3945_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
/* If we issue a new RXON command which required a tune then we must /* If we issue a new RXON command which required a tune then we must
* send a new TXPOWER command or we won't be able to Tx any frames */ * send a new TXPOWER command or we won't be able to Tx any frames */
rc = priv->cfg->ops->lib->send_tx_power(priv); rc = iwl_set_tx_power(priv, priv->tx_power_next, true);
if (rc) { if (rc) {
IWL_ERR(priv, "Error setting Tx power (%d).\n", rc); IWL_ERR(priv, "Error setting Tx power (%d).\n", rc);
return rc; return rc;
......
...@@ -1571,7 +1571,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c ...@@ -1571,7 +1571,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c
/* If we issue a new RXON command which required a tune then we must /* If we issue a new RXON command which required a tune then we must
* send a new TXPOWER command or we won't be able to Tx any frames */ * send a new TXPOWER command or we won't be able to Tx any frames */
ret = iwl_set_tx_power(priv, priv->tx_power_user_lmt, true); ret = iwl_set_tx_power(priv, priv->tx_power_next, true);
if (ret) { if (ret) {
IWL_ERR(priv, "Error sending TX power (%d)\n", ret); IWL_ERR(priv, "Error sending TX power (%d)\n", ret);
return ret; return ret;
......
...@@ -316,10 +316,9 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) ...@@ -316,10 +316,9 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
* If we issue a new RXON command which required a tune then we must * If we issue a new RXON command which required a tune then we must
* send a new TXPOWER command or we won't be able to Tx any frames. * send a new TXPOWER command or we won't be able to Tx any frames.
* *
* FIXME: which RXON requires a tune? Can we optimise this out in * It's expected we set power here if channel is changing.
* some cases?
*/ */
ret = iwl_set_tx_power(priv, priv->tx_power_user_lmt, true); ret = iwl_set_tx_power(priv, priv->tx_power_next, true);
if (ret) { if (ret) {
IWL_ERR(priv, "Error sending TX power (%d)\n", ret); IWL_ERR(priv, "Error sending TX power (%d)\n", ret);
return ret; return ret;
......
...@@ -1162,6 +1162,8 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) ...@@ -1162,6 +1162,8 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
{ {
int ret; int ret;
s8 prev_tx_power; s8 prev_tx_power;
bool defer;
struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
lockdep_assert_held(&priv->mutex); lockdep_assert_held(&priv->mutex);
...@@ -1189,10 +1191,15 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) ...@@ -1189,10 +1191,15 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
if (!iwl_is_ready_rf(priv)) if (!iwl_is_ready_rf(priv))
return -EIO; return -EIO;
/* scan complete use tx_power_next, need to be updated */ /* scan complete and commit_rxon use tx_power_next value,
* it always need to be updated for newest request */
priv->tx_power_next = tx_power; priv->tx_power_next = tx_power;
if (test_bit(STATUS_SCANNING, &priv->status) && !force) {
IWL_DEBUG_INFO(priv, "Deferring tx power set while scanning\n"); /* do not set tx power when scanning or channel changing */
defer = test_bit(STATUS_SCANNING, &priv->status) ||
memcmp(&ctx->active, &ctx->staging, sizeof(ctx->staging));
if (defer && !force) {
IWL_DEBUG_INFO(priv, "Deferring tx power set\n");
return 0; return 0;
} }
......
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