diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2004-06-14 14:40:59 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2004-06-14 14:40:59 -0400 |
| commit | c23562121ec2a36db28c1b0f8507f2d534700e69 (patch) | |
| tree | df3a04e58cf5401b5a22ea25262c0c6120cc1c49 /include | |
| parent | 77ca20f2f42b526733d7aa39fe41247dc5d4ce97 (diff) | |
[libata] PCI IDE DMA code shuffling
PCI IDE DMA standard (or "bmdma") helper routines ata_bmdma_stop,
ata_bmdma_ack_irq, and ata_bmdma_status are added to linux/libata.h,
and used in libata-core.
There is a minor behavior change, such that, the Alt Status register
is read before acknowledging the bmdma interrupt. This should be ok,
and furthermore there will be more significant behavior changes
in this area coming soon.
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/libata.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h index b2fd0adbe5b6..c9713d0d30af 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -541,4 +541,44 @@ static inline unsigned int sata_dev_present(struct ata_port *ap) return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0; } +static inline void ata_bmdma_stop(struct ata_port *ap) +{ + if (ap->flags & ATA_FLAG_MMIO) { + void *mmio = (void *) ap->ioaddr.bmdma_addr; + + /* clear start/stop bit */ + writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START, + mmio + ATA_DMA_CMD); + } else { + /* clear start/stop bit */ + outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START, + ap->ioaddr.bmdma_addr + ATA_DMA_CMD); + } + + /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ + ata_altstatus(ap); /* dummy read */ +} + +static inline void ata_bmdma_ack_irq(struct ata_port *ap) +{ + if (ap->flags & ATA_FLAG_MMIO) { + void *mmio = ((void *) 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); + } +} + +static inline u8 ata_bmdma_status(struct ata_port *ap) +{ + u8 host_stat; + if (ap->flags & ATA_FLAG_MMIO) { + void *mmio = (void *) ap->ioaddr.bmdma_addr; + host_stat = readb(mmio + ATA_DMA_STATUS); + } else + host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); + return host_stat; +} + #endif /* __LINUX_LIBATA_H__ */ |
