diff options
author | sos <sos@FreeBSD.org> | 2003-10-28 21:08:14 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2003-10-28 21:08:14 +0000 |
commit | 67cd4eebae31c6c9fada91f9e0cf697578cd17d3 (patch) | |
tree | b2c888507f16965a10489346138dec11d1ec8741 /sys | |
parent | b3e7c2f5bf5c5ea665901ea07f9c9ef450839291 (diff) | |
download | FreeBSD-src-67cd4eebae31c6c9fada91f9e0cf697578cd17d3.zip FreeBSD-src-67cd4eebae31c6c9fada91f9e0cf697578cd17d3.tar.gz |
Cleanup the interrupt code that deals with the busmaster bits.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ata/ata-chipset.c | 105 |
1 files changed, 58 insertions, 47 deletions
diff --git a/sys/dev/ata/ata-chipset.c b/sys/dev/ata/ata-chipset.c index 0758222..7118547 100644 --- a/sys/dev/ata/ata-chipset.c +++ b/sys/dev/ata/ata-chipset.c @@ -139,18 +139,19 @@ ata_generic_intr(void *data) { struct ata_pci_controller *ctlr = data; struct ata_channel *ch; - u_int8_t dmastat; int unit; /* implement this as a toggle instead to balance load XXX */ for (unit = 0; unit < 2; unit++) { if (!(ch = ctlr->interrupt[unit].argument)) continue; - if (ch->dma->flags & ATA_DMA_ACTIVE) { - if (!((dmastat = (ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & - ATA_BMSTAT_MASK)) & ATA_BMSTAT_INTERRUPT)) + if (ch->dma) { + int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; + + if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != + ATA_BMSTAT_INTERRUPT) continue; - ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, dmastat|ATA_BMSTAT_INTERRUPT); + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); DELAY(1); } ctlr->interrupt[unit].function(ch); @@ -223,22 +224,24 @@ ata_acard_intr(void *data) { struct ata_pci_controller *ctlr = data; struct ata_channel *ch; - u_int8_t dmastat; int unit; /* implement this as a toggle instead to balance load XXX */ for (unit = 0; unit < 2; unit++) { if (ctlr->chip->cfg1 == ATPOLD && ctlr->locked_ch != unit) + continue; + if (!(ch = ctlr->interrupt[unit].argument)) + continue; + if (ch->dma) { + int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; + + if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != + ATA_BMSTAT_INTERRUPT) continue; - ch = ctlr->interrupt[unit].argument; - if (ch->dma->flags & ATA_DMA_ACTIVE) { - if (!((dmastat = (ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & - ATA_BMSTAT_MASK)) & ATA_BMSTAT_INTERRUPT)) - continue; - ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, dmastat|ATA_BMSTAT_INTERRUPT); + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); DELAY(1); ATA_IDX_OUTB(ch, ATA_BMCMD_PORT, - ATA_IDX_INB(ch, ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP); + ATA_IDX_INB(ch, ATA_BMCMD_PORT)&~ATA_BMCMD_START_STOP); DELAY(1); } ctlr->interrupt[unit].function(ch); @@ -678,18 +681,21 @@ ata_highpoint_intr(void *data) { struct ata_pci_controller *ctlr = data; struct ata_channel *ch; - u_int8_t dmastat; int unit; /* implement this as a toggle instead to balance load XXX */ for (unit = 0; unit < 2; unit++) { if (!(ch = ctlr->interrupt[unit].argument)) continue; - if (((dmastat = (ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK)) & - (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT))!=ATA_BMSTAT_INTERRUPT) - continue; - ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, dmastat | ATA_BMSTAT_INTERRUPT); - DELAY(1); + if (ch->dma) { + int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; + + if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != + ATA_BMSTAT_INTERRUPT) + continue; + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); + DELAY(1); + } ctlr->interrupt[unit].function(ch); } } @@ -1210,7 +1216,6 @@ ata_promise_old_intr(void *data) { struct ata_pci_controller *ctlr = data; struct ata_channel *ch; - u_int8_t dmastat; int unit; /* implement this as a toggle instead to balance load XXX */ @@ -1218,11 +1223,13 @@ ata_promise_old_intr(void *data) if (!(ch = ctlr->interrupt[unit].argument)) continue; if (ATA_INL(ctlr->r_io1, 0x1c) & (ch->unit ? 0x00004000 : 0x00000400)) { - if (ch->dma->flags & ATA_DMA_ACTIVE) { - if (!((dmastat = (ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & - ATA_BMSTAT_MASK)) & ATA_BMSTAT_INTERRUPT)) + if (ch->dma) { + int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; + + if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != + ATA_BMSTAT_INTERRUPT) continue; - ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, dmastat|ATA_BMSTAT_INTERRUPT); + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); DELAY(1); } ctlr->interrupt[unit].function(ch); @@ -1235,7 +1242,6 @@ ata_promise_tx2_intr(void *data) { struct ata_pci_controller *ctlr = data; struct ata_channel *ch; - u_int8_t dmastat; int unit; /* implement this as a toggle instead to balance load XXX */ @@ -1244,11 +1250,13 @@ ata_promise_tx2_intr(void *data) continue; ATA_IDX_OUTB(ch, ATA_BMDEVSPEC_0, 0x0b); if (ATA_IDX_INB(ch, ATA_BMDEVSPEC_1) & 0x20) { - if (ch->dma->flags & ATA_DMA_ACTIVE) { - if (!((dmastat = (ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & - ATA_BMSTAT_MASK)) & ATA_BMSTAT_INTERRUPT)) + if (ch->dma) { + int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; + + if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != + ATA_BMSTAT_INTERRUPT) continue; - ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, dmastat|ATA_BMSTAT_INTERRUPT); + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); DELAY(1); } ctlr->interrupt[unit].function(ch); @@ -1668,7 +1676,6 @@ ata_sii_intr(void *data) { struct ata_pci_controller *ctlr = data; struct ata_channel *ch; - u_int8_t dmastat; int unit; /* implement this as a toggle instead to balance load XXX */ @@ -1676,11 +1683,13 @@ ata_sii_intr(void *data) if (!(ch = ctlr->interrupt[unit].argument)) continue; if (ATA_IDX_INB(ch, ATA_BMDEVSPEC_0) & 0x08) { - if (ch->dma->flags & ATA_DMA_ACTIVE) { - if (!((dmastat = (ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & - ATA_BMSTAT_MASK)) & ATA_BMSTAT_INTERRUPT)) + if (ch->dma) { + int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; + + if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != + ATA_BMSTAT_INTERRUPT) continue; - ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, dmastat|ATA_BMSTAT_INTERRUPT); + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); DELAY(1); } ctlr->interrupt[unit].function(ch); @@ -1693,26 +1702,28 @@ ata_cmd_intr(void *data) { struct ata_pci_controller *ctlr = data; struct ata_channel *ch; - u_int8_t dmastat, reg71; + u_int8_t reg71; int unit; /* implement this as a toggle instead to balance load XXX */ for (unit = 0; unit < 2; unit++) { if (!(ch = ctlr->interrupt[unit].argument)) continue; - if (!((reg71 = pci_read_config(device_get_parent(ch->dev), 0x71, 1)) & - (ch->unit ? 0x08 : 0x04))) - continue; - pci_write_config(device_get_parent(ch->dev), 0x71, - reg71 & ~(ch->unit ? 0x04 : 0x08), 1); - if (ch->dma->flags & ATA_DMA_ACTIVE) { - if (!((dmastat = (ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & - ATA_BMSTAT_MASK)) & ATA_BMSTAT_INTERRUPT)) - continue; - ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, dmastat | ATA_BMSTAT_INTERRUPT); - DELAY(1); + if (((reg71 = pci_read_config(device_get_parent(ch->dev), 0x71, 1)) & + (ch->unit ? 0x08 : 0x04))) { + pci_write_config(device_get_parent(ch->dev), 0x71, + reg71 & ~(ch->unit ? 0x04 : 0x08), 1); + if (ch->dma) { + int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; + + if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != + ATA_BMSTAT_INTERRUPT) + continue; + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); + DELAY(1); + } + ctlr->interrupt[unit].function(ch); } - ctlr->interrupt[unit].function(ch); } } |