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>
This commit is contained in:
committed by
Pierre Ossman
parent
3e01e4bcdd
commit
599473cf15
@@ -45,16 +45,22 @@ static int process_sdio_pending_irqs(struct mmc_card *card)
|
|||||||
printk(KERN_WARNING "%s: pending IRQ for "
|
printk(KERN_WARNING "%s: pending IRQ for "
|
||||||
"non-existant function\n",
|
"non-existant function\n",
|
||||||
mmc_card_id(card));
|
mmc_card_id(card));
|
||||||
|
ret = -EINVAL;
|
||||||
} else if (func->irq_handler) {
|
} else if (func->irq_handler) {
|
||||||
func->irq_handler(func);
|
func->irq_handler(func);
|
||||||
count++;
|
count++;
|
||||||
} else
|
} else {
|
||||||
printk(KERN_WARNING "%s: pending IRQ with no handler\n",
|
printk(KERN_WARNING "%s: pending IRQ with no handler\n",
|
||||||
sdio_func_id(func));
|
sdio_func_id(func));
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (count)
|
||||||
return count;
|
return count;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sdio_irq_thread(void *_host)
|
static int sdio_irq_thread(void *_host)
|
||||||
|
Reference in New Issue
Block a user