aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
diff options
context:
space:
mode:
authorGaren Tamrazian <garenx.tamrazian@intel.com>2011-03-30 05:29:32 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-04-08 10:59:37 -0400
commit68b993118f715cc631b62b6a50574e4701fe9ace (patch)
tree4f4a138506a2903f6ecd406b4afc0990d34aa7b8 /drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
parent3ecccbcd3c67374aeee447c08fcb9e39a99f7ee5 (diff)
iwlagn: fix radar frame rejection
The microcode may sometimes reject TX frames when on a radar channel even after we associated as it clears information during association and needs to receive a new beacon before allowing that channel again. This manifests itself as a TX status value of TX_STATUS_FAIL_PASSIVE_NO_RX. So in this case, stop the corresponding queue and give the frame back to mac80211 for retransmission. We start the queue again when a beacon from the AP is received which will make the regulatory enforcement in the device allow transmitting again. Signed-off-by: Garen Tamrazian <garenx.tamrazian@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-ucode.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-ucode.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
index 01a6d2fc795c..5c30f6b19a7f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
@@ -428,6 +428,7 @@ void iwlagn_send_bt_env(struct iwl_priv *priv, u8 action, u8 type)
428int iwlagn_alive_notify(struct iwl_priv *priv) 428int iwlagn_alive_notify(struct iwl_priv *priv)
429{ 429{
430 const struct queue_to_fifo_ac *queue_to_fifo; 430 const struct queue_to_fifo_ac *queue_to_fifo;
431 struct iwl_rxon_context *ctx;
431 u32 a; 432 u32 a;
432 unsigned long flags; 433 unsigned long flags;
433 int i, chan; 434 int i, chan;
@@ -501,6 +502,8 @@ int iwlagn_alive_notify(struct iwl_priv *priv)
501 memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped)); 502 memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped));
502 for (i = 0; i < 4; i++) 503 for (i = 0; i < 4; i++)
503 atomic_set(&priv->queue_stop_count[i], 0); 504 atomic_set(&priv->queue_stop_count[i], 0);
505 for_each_context(priv, ctx)
506 ctx->last_tx_rejected = false;
504 507
505 /* reset to 0 to enable all the queue first */ 508 /* reset to 0 to enable all the queue first */
506 priv->txq_ctx_active_msk = 0; 509 priv->txq_ctx_active_msk = 0;