Author: mav
Date: Sun Apr  2 20:39:51 2017
New Revision: 316427
URL: https://svnweb.freebsd.org/changeset/base/316427

Log:
  Add Log directory and SATA NCQ Send and Receive Log.
  
  Those are used at least by Linux guests to detect queued TRIM support.
  
  MFC after:    2 weeks
  Sponsored by: iXsystems, Inc.

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

Modified: head/usr.sbin/bhyve/pci_ahci.c
==============================================================================
--- head/usr.sbin/bhyve/pci_ahci.c      Sun Apr  2 18:16:00 2017        
(r316426)
+++ head/usr.sbin/bhyve/pci_ahci.c      Sun Apr  2 20:39:51 2017        
(r316427)
@@ -932,19 +932,36 @@ static void
 ahci_handle_read_log(struct ahci_port *p, int slot, uint8_t *cfis)
 {
        struct ahci_cmd_hdr *hdr;
-       uint8_t buf[512];
+       uint32_t buf[128];
+       uint8_t *buf8 = (uint8_t *)buf;
+       uint16_t *buf16 = (uint16_t *)buf;
 
        hdr = (struct ahci_cmd_hdr *)(p->cmd_lst + slot * AHCI_CL_SIZE);
-       if (p->atapi || hdr->prdtl == 0 || cfis[4] != 0x10 ||
-           cfis[5] != 0 || cfis[9] != 0 || cfis[12] != 1 || cfis[13] != 0) {
+       if (p->atapi || hdr->prdtl == 0 || cfis[5] != 0 ||
+           cfis[9] != 0 || cfis[12] != 1 || cfis[13] != 0) {
                ahci_write_fis_d2h(p, slot, cfis,
                    (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
                return;
        }
 
        memset(buf, 0, sizeof(buf));
-       memcpy(buf, p->err_cfis, sizeof(p->err_cfis));
-       ahci_checksum(buf, sizeof(buf));
+       if (cfis[4] == 0x00) {  /* Log directory */
+               buf16[0x00] = 1; /* Version -- 1 */
+               buf16[0x10] = 1; /* NCQ Command Error Log -- 1 page */
+               buf16[0x13] = 1; /* SATA NCQ Send and Receive Log -- 1 page */
+       } else if (cfis[4] == 0x10) {   /* NCQ Command Error Log */
+               memcpy(buf8, p->err_cfis, sizeof(p->err_cfis));
+               ahci_checksum(buf8, sizeof(buf8));
+       } else if (cfis[4] == 0x13) {   /* SATA NCQ Send and Receive Log */
+               if (blockif_candelete(p->bctx) && !blockif_is_ro(p->bctx)) {
+                       buf[0x00] = 1;  /* SFQ DSM supported */
+                       buf[0x01] = 1;  /* SFQ DSM TRIM supported */
+               }
+       } else {
+               ahci_write_fis_d2h(p, slot, cfis,
+                   (ATA_E_ABORT << 8) | ATA_S_READY | ATA_S_ERROR);
+               return;
+       }
 
        if (cfis[2] == ATA_READ_LOG_EXT)
                ahci_write_fis_piosetup(p);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to