aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2011-09-15 14:46:52 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-09-19 16:10:10 -0400
commiteffd4d9aece9184f526e6556786a94d335e38b71 (patch)
tree193f5f428dca02fc307043648e62ef0d62e59ca0 /drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
parent7d8f2d50b5082385ad0e0ab5f7dc2a6f1c19819c (diff)
iwlagn: do not use interruptible waits
Since the dawn of its time, iwlwifi has used interruptible waits to wait for synchronous commands and firmware loading. This leads to "interesting" bugs, because it can't actually handle the interruptions; for example when a command sending is interrupted it will assume the command completed fully, and then leave it pending, which leads to all kinds of trouble when the command finishes later. Since there's no easy way to gracefully deal with interruptions, fix the driver to not use interruptible waits. This at least fixes the error iwlagn 0000:02:00.0: Error: Response NULL in 'REPLY_SCAN_ABORT_CMD' I have seen in P2P testing, but it is likely that there are other errors caused by this. Cc: Stanislaw Gruszka <sgruszka@redhat.com> Cc: stable@kernel.org [2.6.24+] Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
index 458a6fbc2e39..6f3f07dd817d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c
@@ -657,7 +657,7 @@ static void iwl_irq_handle_error(struct iwl_trans *trans)
657 */ 657 */
658 clear_bit(STATUS_READY, &trans->shrd->status); 658 clear_bit(STATUS_READY, &trans->shrd->status);
659 clear_bit(STATUS_HCMD_ACTIVE, &trans->shrd->status); 659 clear_bit(STATUS_HCMD_ACTIVE, &trans->shrd->status);
660 wake_up_interruptible(&priv->shrd->wait_command_queue); 660 wake_up(&priv->shrd->wait_command_queue);
661 IWL_ERR(trans, "RF is used by WiMAX\n"); 661 IWL_ERR(trans, "RF is used by WiMAX\n");
662 return; 662 return;
663 } 663 }
@@ -1098,7 +1098,7 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
1098 handled |= CSR_INT_BIT_FH_TX; 1098 handled |= CSR_INT_BIT_FH_TX;
1099 /* Wake up uCode load routine, now that load is complete */ 1099 /* Wake up uCode load routine, now that load is complete */
1100 priv(trans)->ucode_write_complete = 1; 1100 priv(trans)->ucode_write_complete = 1;
1101 wake_up_interruptible(&trans->shrd->wait_command_queue); 1101 wake_up(&trans->shrd->wait_command_queue);
1102 } 1102 }
1103 1103
1104 if (inta & ~handled) { 1104 if (inta & ~handled) {