mirror of https://gitee.com/openkylin/linux.git
[libata] fix oops on non-DMA bmdma hardware
Alan noted: "bmdma may be zero but the bmdma_irq_clear function gets called even in this case during pure PIO operation. Check we have a bmdma before we use it." I fixed this by adding a check for zero. While was I there, I fixed the non-standard indentation of the small function's code. Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
17bb34a3c5
commit
4d4681f6b9
|
@ -4202,14 +4202,17 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
void ata_bmdma_irq_clear(struct ata_port *ap)
|
void ata_bmdma_irq_clear(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
if (ap->flags & ATA_FLAG_MMIO) {
|
if (!ap->ioaddr.bmdma_addr)
|
||||||
void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS;
|
return;
|
||||||
writeb(readb(mmio), mmio);
|
|
||||||
} else {
|
|
||||||
unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
|
|
||||||
outb(inb(addr), addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (ap->flags & ATA_FLAG_MMIO) {
|
||||||
|
void __iomem *mmio =
|
||||||
|
((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS;
|
||||||
|
writeb(readb(mmio), mmio);
|
||||||
|
} else {
|
||||||
|
unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
|
||||||
|
outb(inb(addr), addr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue