sdio: make the IRQ thread more resilient in the presence of bad states
authorNicolas Pitre <nico@cam.org>
Wed, 3 Oct 2007 19:32:57 +0000 (15:32 -0400)
committerPierre Ossman <drzeus@drzeus.cx>
Sat, 6 Oct 2007 15:51:45 +0000 (17:51 +0200)
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>
drivers/mmc/core/sdio_irq.c

index e7865059e126b82ec6d330d2a899ce709d7672e0..3bd3021f5e808866d7e45bebb78de5535e84d67b 100644 (file)
@@ -45,16 +45,22 @@ static int process_sdio_pending_irqs(struct mmc_card *card)
                                printk(KERN_WARNING "%s: pending IRQ for "
                                        "non-existant function\n",
                                        mmc_card_id(card));
+                               ret = -EINVAL;
                        } else if (func->irq_handler) {
                                func->irq_handler(func);
                                count++;
-                       } else
+                       } else {
                                printk(KERN_WARNING "%s: pending IRQ with no handler\n",
                                       sdio_func_id(func));
+                               ret = -EINVAL;
+                       }
                }
        }
 
-       return count;
+       if (count)
+               return count;
+
+       return ret;
 }
 
 static int sdio_irq_thread(void *_host)