aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/bhyve/pci_ahci.c
diff options
context:
space:
mode:
authorTycho Nightingale <tychon@FreeBSD.org>2014-07-30 18:47:31 +0000
committerTycho Nightingale <tychon@FreeBSD.org>2014-07-30 18:47:31 +0000
commit42404fae46d617abfb3e665878acaac6a59b8761 (patch)
treef6135a408b495634b87ed1860464cf164f7a58c6 /usr.sbin/bhyve/pci_ahci.c
parente248a3d1f69cb7629b6df804e8c6cea004aaa9eb (diff)
downloadsrc-42404fae46d617abfb3e665878acaac6a59b8761.tar.gz
src-42404fae46d617abfb3e665878acaac6a59b8761.zip
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
Notes
Notes: svn path=/head/; revision=269317
Diffstat (limited to 'usr.sbin/bhyve/pci_ahci.c')
-rw-r--r--usr.sbin/bhyve/pci_ahci.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/usr.sbin/bhyve/pci_ahci.c b/usr.sbin/bhyve/pci_ahci.c
index 52724bb79369..214237df3757 100644
--- a/usr.sbin/bhyve/pci_ahci.c
+++ b/usr.sbin/bhyve/pci_ahci.c
@@ -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);
+ }
}
}