Commands which encounter a fatal error shouldn't be marked as completed.

Furthermore, provide an indication of the current command so it can be
determined which one actually failed.

Reviewed by:	grehan
This commit is contained in:
Tycho Nightingale 2014-07-30 18:47:31 +00:00
parent e248a3d1f6
commit 42404fae46
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=269317

View file

@ -336,8 +336,9 @@ ahci_write_fis_d2h(struct ahci_port *p, int slot, uint8_t *cfis, uint32_t tfd)
fis[13] = cfis[13];
if (fis[2] & ATA_S_ERROR)
p->is |= AHCI_P_IX_TFE;
else
p->ci &= ~(1 << slot);
p->tfd = tfd;
p->ci &= ~(1 << slot);
ahci_write_fis(p, FIS_TYPE_REGD2H, fis);
}
@ -651,8 +652,8 @@ handle_identify(struct ahci_port *p, int slot, uint8_t *cfis)
write_prdt(p, slot, cfis, (void *)buf, sizeof(buf));
p->tfd = ATA_S_DSC | ATA_S_READY;
p->is |= AHCI_P_IX_DP;
p->ci &= ~(1 << slot);
}
p->ci &= ~(1 << slot);
ahci_generate_intr(p->pr_sc);
}
@ -694,8 +695,8 @@ handle_atapi_identify(struct ahci_port *p, int slot, uint8_t *cfis)
write_prdt(p, slot, cfis, (void *)buf, sizeof(buf));
p->tfd = ATA_S_DSC | ATA_S_READY;
p->is |= AHCI_P_IX_DHR;
p->ci &= ~(1 << slot);
}
p->ci &= ~(1 << slot);
ahci_generate_intr(p->pr_sc);
}
@ -1298,7 +1299,6 @@ ahci_handle_cmd(struct ahci_port *p, int slot, uint8_t *cfis)
if (!p->atapi) {
p->tfd = (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR;
p->is |= AHCI_P_IX_TFE;
p->ci &= ~(1 << slot);
ahci_generate_intr(p->pr_sc);
} else
handle_packet_cmd(p, slot, cfis);
@ -1307,7 +1307,6 @@ ahci_handle_cmd(struct ahci_port *p, int slot, uint8_t *cfis)
WPRINTF("Unsupported cmd:%02x\n", cfis[2]);
p->tfd = (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR;
p->is |= AHCI_P_IX_TFE;
p->ci &= ~(1 << slot);
ahci_generate_intr(p->pr_sc);
break;
}
@ -1375,8 +1374,11 @@ ahci_handle_port(struct ahci_port *p)
* are already in-flight.
*/
for (i = 0; (i < 32) && p->ci; i++) {
if ((p->ci & (1 << i)) && !(p->pending & (1 << i)))
if ((p->ci & (1 << i)) && !(p->pending & (1 << i))) {
p->cmd &= ~AHCI_P_CMD_CCS_MASK;
p->cmd |= i << AHCI_P_CMD_CCS_SHIFT;
ahci_handle_slot(p, i);
}
}
}