From b72008cea07201f8f0d1c68dd1425b5ecf61ce0f Mon Sep 17 00:00:00 2001 From: jimharris Date: Wed, 7 May 2014 16:42:19 +0000 Subject: [PATCH] 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. git-svn-id: svn://svn.freebsd.org/base/stable/9@265559 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/dev/nvme/nvme_ctrlr.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c index de037b7a3..8acd64541 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -181,8 +181,8 @@ nvme_chatham_populate_cdata(struct nvme_controller *ctrlr) 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_long cmd, caddr_t arg, int flag, 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: -- 2.45.2