diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index c8e2e3a42b4b..e4c2e1e448ad 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -1258,7 +1258,15 @@ static void iwl_irq_tasklet(struct iwl_priv *priv) | |||
1258 | /* Ack/clear/reset pending uCode interrupts. | 1258 | /* Ack/clear/reset pending uCode interrupts. |
1259 | * Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS, | 1259 | * Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS, |
1260 | */ | 1260 | */ |
1261 | iwl_write32(priv, CSR_INT, priv->inta); | 1261 | /* There is a hardware bug in the interrupt mask function that some |
1262 | * interrupts (i.e. CSR_INT_BIT_SCD) can still be generated even if | ||
1263 | * they are disabled in the CSR_INT_MASK register. Furthermore the | ||
1264 | * ICT interrupt handling mechanism has another bug that might cause | ||
1265 | * these unmasked interrupts fail to be detected. We workaround the | ||
1266 | * hardware bugs here by ACKing all the possible interrupts so that | ||
1267 | * interrupt coalescing can still be achieved. | ||
1268 | */ | ||
1269 | iwl_write32(priv, CSR_INT, priv->inta | ~priv->inta_mask); | ||
1262 | 1270 | ||
1263 | inta = priv->inta; | 1271 | inta = priv->inta; |
1264 | 1272 | ||