MFC r200196:

Add Asynchronous Notification support for controllers without SNTF
capability by snooping SDB FIS receive area. It should be even faster
then regular way, but less reliable.
This commit is contained in:
Alexander Motin 2009-12-09 13:27:06 +00:00
parent 417f972601
commit 240d980d7c

View file

@ -1129,7 +1129,8 @@ ahci_notify_events(device_t dev, u_int32_t status)
struct cam_path *dpath;
int i;
ATA_OUTL(ch->r_mem, AHCI_P_SNTF, status);
if (ch->caps & AHCI_CAP_SSNTF)
ATA_OUTL(ch->r_mem, AHCI_P_SNTF, status);
if (bootverbose)
device_printf(dev, "SNTF 0x%04x\n", status);
for (i = 0; i < 16; i++) {
@ -1188,8 +1189,16 @@ ahci_ch_intr(void *data)
/* Read command statuses. */
sstatus = ATA_INL(ch->r_mem, AHCI_P_SACT);
cstatus = ATA_INL(ch->r_mem, AHCI_P_CI);
if ((istatus & AHCI_P_IX_SDB) && (ch->caps & AHCI_CAP_SSNTF))
sntf = ATA_INL(ch->r_mem, AHCI_P_SNTF);
if (istatus & AHCI_P_IX_SDB) {
if (ch->caps & AHCI_CAP_SSNTF)
sntf = ATA_INL(ch->r_mem, AHCI_P_SNTF);
else {
u_int8_t *fis = ch->dma.rfis + 0x58;
if (fis[1] & 0x80)
sntf = (1 << (fis[1] & 0x0f));
}
}
/* Process PHY events */
if (istatus & (AHCI_P_IX_PC | AHCI_P_IX_PRC | AHCI_P_IX_OF |
AHCI_P_IX_IF | AHCI_P_IX_HBD | AHCI_P_IX_HBF | AHCI_P_IX_TFE)) {