mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-29 21:26:51 +00:00
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:
parent
e248a3d1f6
commit
42404fae46
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=269317
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue