aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2007-10-03 15:32:57 -0400
committerPierre Ossman <drzeus@drzeus.cx>2007-10-06 11:51:45 -0400
commit599473cf15a3fae78cbc3192cfb38ca04d5abc72 (patch)
treecba3a1c236711d4fc267ef6272c93d9dcf6a08e8
parent3e01e4bcdd56209e70c39293e0c4c355d09364b8 (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>
-rw-r--r--drivers/mmc/core/sdio_irq.c10
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
60static int sdio_irq_thread(void *_host) 66static int sdio_irq_thread(void *_host)