mirror of https://gitee.com/openkylin/linux.git
mmc: sh_mmcif: fix I/O errors
The INT_BUFWEN IRQ often arrives with other bits set too. If they are not cleared, an additional IRQ can be triggered, sometimes also after the MMC request has already been completed. This leads to block I/O errors. Earlier Teppei Kamijou also observed these additional interrupts and proposed to explicitly wait for them. This patch chooses an alternative approach of clearing all active bits immediately, when processing the main interrupt. Reported-by: Teppei Kamijou <teppei.kamijou.yb@renesas.com> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Chris Ball <cjb@laptop.org>
This commit is contained in:
parent
90f1cb438e
commit
276bc96b2a
|
@ -1238,7 +1238,9 @@ static irqreturn_t sh_mmcif_intr(int irq, void *dev_id)
|
|||
sh_mmcif_writel(host->addr, MMCIF_CE_INT, ~INT_BUFREN);
|
||||
sh_mmcif_bitclr(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
|
||||
} else if (state & INT_BUFWEN) {
|
||||
sh_mmcif_writel(host->addr, MMCIF_CE_INT, ~INT_BUFWEN);
|
||||
sh_mmcif_writel(host->addr, MMCIF_CE_INT,
|
||||
~(INT_BUFWEN | INT_DTRANE | INT_CMD12DRE |
|
||||
INT_CMD12RBE | INT_CMD12CRE));
|
||||
sh_mmcif_bitclr(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
|
||||
} else if (state & INT_CMD12DRE) {
|
||||
sh_mmcif_writel(host->addr, MMCIF_CE_INT,
|
||||
|
|
Loading…
Reference in New Issue