diff options
author | Nicolas Pitre <nico@cam.org> | 2007-10-03 15:32:57 -0400 |
---|---|---|
committer | Pierre Ossman <drzeus@drzeus.cx> | 2007-10-06 11:51:45 -0400 |
commit | 599473cf15a3fae78cbc3192cfb38ca04d5abc72 (patch) | |
tree | cba3a1c236711d4fc267ef6272c93d9dcf6a08e8 /drivers/mmc | |
parent | 3e01e4bcdd56209e70c39293e0c4c355d09364b8 (diff) |
sdio: make the IRQ thread more resilient in the presence of bad states
Currently we print a message about some bad states wrt function IRQ
handlers but return 0 from process_sdio_pending_irqs() nevertheless.
This can lead to an infinite loop as nothing might have cleared the
condition for the pending card interrupt from the host controller by
the time host->ops->enable_sdio_irq(host, 1) is called.
Signed-off-by: Nicolas Pitre <nico@marvell.com>
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/core/sdio_irq.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c index e7865059e126..3bd3021f5e80 100644 --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c | |||
@@ -45,16 +45,22 @@ static int process_sdio_pending_irqs(struct mmc_card *card) | |||
45 | printk(KERN_WARNING "%s: pending IRQ for " | 45 | printk(KERN_WARNING "%s: pending IRQ for " |
46 | "non-existant function\n", | 46 | "non-existant function\n", |
47 | mmc_card_id(card)); | 47 | mmc_card_id(card)); |
48 | ret = -EINVAL; | ||
48 | } else if (func->irq_handler) { | 49 | } else if (func->irq_handler) { |
49 | func->irq_handler(func); | 50 | func->irq_handler(func); |
50 | count++; | 51 | count++; |
51 | } else | 52 | } else { |
52 | printk(KERN_WARNING "%s: pending IRQ with no handler\n", | 53 | printk(KERN_WARNING "%s: pending IRQ with no handler\n", |
53 | sdio_func_id(func)); | 54 | sdio_func_id(func)); |
55 | ret = -EINVAL; | ||
56 | } | ||
54 | } | 57 | } |
55 | } | 58 | } |
56 | 59 | ||
57 | return count; | 60 | if (count) |
61 | return count; | ||
62 | |||
63 | return ret; | ||
58 | } | 64 | } |
59 | 65 | ||
60 | static int sdio_irq_thread(void *_host) | 66 | static int sdio_irq_thread(void *_host) |