Author: tychon
Date: Wed Jul 30 18:47:31 2014
New Revision: 269317
URL: http://svnweb.freebsd.org/changeset/base/269317

Log:
  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

Modified:
  head/usr.sbin/bhyve/pci_ahci.c

Modified: head/usr.sbin/bhyve/pci_ahci.c
==============================================================================
--- head/usr.sbin/bhyve/pci_ahci.c      Wed Jul 30 18:21:06 2014        
(r269316)
+++ head/usr.sbin/bhyve/pci_ahci.c      Wed Jul 30 18:47:31 2014        
(r269317)
@@ -336,8 +336,9 @@ ahci_write_fis_d2h(struct ahci_port *p, 
        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
                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 *
                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
                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
                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);
+               }
        }
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to