summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2003-10-28 21:08:14 +0000
committersos <sos@FreeBSD.org>2003-10-28 21:08:14 +0000
commit67cd4eebae31c6c9fada91f9e0cf697578cd17d3 (patch)
treeb2c888507f16965a10489346138dec11d1ec8741 /sys
parentb3e7c2f5bf5c5ea665901ea07f9c9ef450839291 (diff)
downloadFreeBSD-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.c105
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);
}
}
OpenPOWER on IntegriCloud