diff options
author | Garen Tamrazian <garenx.tamrazian@intel.com> | 2011-03-30 05:29:32 -0400 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-04-08 10:59:37 -0400 |
commit | 68b993118f715cc631b62b6a50574e4701fe9ace (patch) | |
tree | 4f4a138506a2903f6ecd406b4afc0990d34aa7b8 /drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | |
parent | 3ecccbcd3c67374aeee447c08fcb9e39a99f7ee5 (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.c | 3 |
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) | |||
428 | int iwlagn_alive_notify(struct iwl_priv *priv) | 428 | int 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; |