MFC r200814:

Clear all ports interrupt status bits in single write. Clearing one by one
causes additional MSIs messages sent if several ports asked for attention
same time. Time window before clearing is not important, as these interrupts
are level triggered by interrupt source.
This commit is contained in:
Alexander Motin 2010-01-19 13:33:31 +00:00
parent 89dbf1bfd5
commit f288580266
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/8/; revision=202624

View File

@ -596,20 +596,18 @@ ahci_intr(void *data)
unit = irq->r_irq_rid - 1;
is = ATA_INL(ctlr->r_mem, AHCI_IS);
}
/* Some controllers have edge triggered IS. */
if (ctlr->quirks & AHCI_Q_EDGEIS)
ATA_OUTL(ctlr->r_mem, AHCI_IS, is);
for (; unit < ctlr->channels; unit++) {
if ((is & (1 << unit)) != 0 &&
(arg = ctlr->interrupt[unit].argument)) {
if (ctlr->quirks & AHCI_Q_EDGEIS) {
/* Some controller have edge triggered IS. */
ATA_OUTL(ctlr->r_mem, AHCI_IS, 1 << unit);
ctlr->interrupt[unit].function(arg);
} else {
/* but AHCI declares level triggered IS. */
ctlr->interrupt[unit].function(arg);
ATA_OUTL(ctlr->r_mem, AHCI_IS, 1 << unit);
}
}
}
/* AHCI declares level triggered IS. */
if (!(ctlr->quirks & AHCI_Q_EDGEIS))
ATA_OUTL(ctlr->r_mem, AHCI_IS, is);
}
/*