Author: jimharris
Date: Wed May  7 16:55:08 2014
New Revision: 265569
URL: http://svnweb.freebsd.org/changeset/base/265569

Log:
  MFC r260382:
  
  For IDENTIFY passthrough commands to Chatham prototype controllers, copy
  the spoofed identify data into the user buffer rather than issuing the
  command to the controller, since Chatham IDENTIFY data is always spoofed.
  
  While here, fix a bug in the spoofed data for Chatham submission and
  completion queue entry sizes.

Modified:
  stable/10/sys/dev/nvme/nvme_ctrlr.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- stable/10/sys/dev/nvme/nvme_ctrlr.c Wed May  7 16:53:42 2014        
(r265568)
+++ stable/10/sys/dev/nvme/nvme_ctrlr.c Wed May  7 16:55:08 2014        
(r265569)
@@ -181,8 +181,8 @@ nvme_chatham_populate_cdata(struct nvme_
        cdata->lpa.ns_smart = 1;
        cdata->sqes.min = 6;
        cdata->sqes.max = 6;
-       cdata->sqes.min = 4;
-       cdata->sqes.max = 4;
+       cdata->cqes.min = 4;
+       cdata->cqes.max = 4;
        cdata->nn = 1;
 
        /* Chatham2 doesn't support DSM command */
@@ -1041,6 +1041,27 @@ nvme_ctrlr_ioctl(struct cdev *cdev, u_lo
                break;
        case NVME_PASSTHROUGH_CMD:
                pt = (struct nvme_pt_command *)arg;
+#ifdef CHATHAM2
+               /*
+                * Chatham IDENTIFY data is spoofed, so copy the spoofed data
+                *  rather than issuing the command to the Chatham controller.
+                */
+               if (pci_get_devid(ctrlr->dev) == CHATHAM_PCI_ID &&
+                    pt->cmd.opc == NVME_OPC_IDENTIFY) {
+                       if (pt->cmd.cdw10 == 1) {
+                               if (pt->len != sizeof(ctrlr->cdata))
+                                       return (EINVAL);
+                               return (copyout(&ctrlr->cdata, pt->buf,
+                                   pt->len));
+                       } else {
+                               if (pt->len != sizeof(ctrlr->ns[0].data) ||
+                                   pt->cmd.nsid != 1)
+                                       return (EINVAL);
+                               return (copyout(&ctrlr->ns[0].data, pt->buf,
+                                   pt->len));
+                       }
+               }
+#endif
                return (nvme_ctrlr_passthrough_cmd(ctrlr, pt, pt->cmd.nsid,
                    1 /* is_user_buffer */, 1 /* is_admin_cmd */));
        default:
_______________________________________________
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