summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2014-05-07 16:55:08 +0000
committerjimharris <jimharris@FreeBSD.org>2014-05-07 16:55:08 +0000
commit559a6cde69a290918379d48eeea8fae6aec21d5d (patch)
tree500221dbbc1c048970e8a4a23f52480451c9ac63 /sys/dev
parent9f6b11fff35cf2f6cc4ed100a2c132573b82bad2 (diff)
downloadFreeBSD-src-559a6cde69a290918379d48eeea8fae6aec21d5d.zip
FreeBSD-src-559a6cde69a290918379d48eeea8fae6aec21d5d.tar.gz
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.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/nvme/nvme_ctrlr.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index de037b7..8acd645 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:
OpenPOWER on IntegriCloud