aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorIndan Zupancic <indan@nul.nu>2011-01-08 06:17:27 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-01-10 15:40:53 -0500
commit3c4a8cc46e8cc17910020964689f3faf6bffb8ad (patch)
tree29751a4eb0f9e1a41d914b9154ddac8daecd1452 /drivers/net
parented70c6e60ee51b0fb46752ab4fd372a071da59d8 (diff)
ipw2200: Check for -1 INTA in tasklet too.
This is an attempt to fix a long standing open bug: http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=1334 The interrupt handler checks for INTA being -1, apparently that means that the hardware is gone. But the interrupt handler defers actual interrupt processing to a tasklet. By the time the tasklet is run and checks INTA again, the hardware might be gone and INTA be -1, which confuses the driver because all event bits are set. The patch applies to 2.6.37. Signed-off-by: Indan Zupancic <indan@nul.nu> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2200.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c
index 8d6ed5f6f46f..ae438ed80c2f 100644
--- a/drivers/net/wireless/ipw2x00/ipw2200.c
+++ b/drivers/net/wireless/ipw2x00/ipw2200.c
@@ -1973,6 +1973,13 @@ static void ipw_irq_tasklet(struct ipw_priv *priv)
1973 1973
1974 inta = ipw_read32(priv, IPW_INTA_RW); 1974 inta = ipw_read32(priv, IPW_INTA_RW);
1975 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R); 1975 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
1976
1977 if (inta == 0xFFFFFFFF) {
1978 /* Hardware disappeared */
1979 IPW_WARNING("TASKLET INTA == 0xFFFFFFFF\n");
1980 /* Only handle the cached INTA values */
1981 inta = 0;
1982 }
1976 inta &= (IPW_INTA_MASK_ALL & inta_mask); 1983 inta &= (IPW_INTA_MASK_ALL & inta_mask);
1977 1984
1978 /* Add any cached INTA values that need to be handled */ 1985 /* Add any cached INTA values that need to be handled */