summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/nvme/nvme.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/usr/src/uts/common/io/nvme/nvme.c b/usr/src/uts/common/io/nvme/nvme.c
index 6841f81564..657c0a57c1 100644
--- a/usr/src/uts/common/io/nvme/nvme.c
+++ b/usr/src/uts/common/io/nvme/nvme.c
@@ -11,6 +11,7 @@
/*
* Copyright 2016 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2016 Tegile Systems, Inc. All rights reserved.
*/
/*
@@ -782,7 +783,7 @@ nvme_check_vendor_cmd_status(nvme_cmd_t *cmd)
"sc = %x, sct = %x, dnr = %d, m = %d", cmd->nc_sqe.sqe_opc,
cqe->cqe_sqid, cqe->cqe_cid, cqe->cqe_sf.sf_sc, cqe->cqe_sf.sf_sct,
cqe->cqe_sf.sf_dnr, cqe->cqe_sf.sf_m);
- if (cmd->nc_nvme->n_ignore_unknown_vendor_status) {
+ if (!cmd->nc_nvme->n_ignore_unknown_vendor_status) {
cmd->nc_nvme->n_dead = B_TRUE;
ddi_fm_service_impact(cmd->nc_nvme->n_dip, DDI_SERVICE_LOST);
}
@@ -1408,7 +1409,7 @@ nvme_get_logpage(nvme_t *nvme, uint8_t logpage, ...)
{
nvme_cmd_t *cmd = nvme_alloc_cmd(nvme, KM_SLEEP);
void *buf = NULL;
- nvme_getlogpage_t getlogpage;
+ nvme_getlogpage_t getlogpage = { 0 };
size_t bufsize;
va_list ap;
@@ -1556,7 +1557,7 @@ nvme_set_nqueues(nvme_t *nvme, uint16_t nqueues)
nvme_cmd_t *cmd = nvme_alloc_cmd(nvme, KM_SLEEP);
nvme_nqueue_t nq = { 0 };
- nq.b.nq_nsq = nq.b.nq_ncq = nqueues;
+ nq.b.nq_nsq = nq.b.nq_ncq = nqueues - 1;
cmd->nc_sqid = 0;
cmd->nc_callback = nvme_wakeup_cmd;
@@ -1585,7 +1586,7 @@ nvme_set_nqueues(nvme_t *nvme, uint16_t nqueues)
* Always use the same number of submission and completion queues, and
* never use more than the requested number of queues.
*/
- return (MIN(nqueues, MIN(nq.b.nq_nsq, nq.b.nq_ncq)));
+ return (MIN(nqueues, MIN(nq.b.nq_nsq, nq.b.nq_ncq) + 1));
}
static int
@@ -1845,11 +1846,13 @@ nvme_init(nvme_t *nvme)
nvme_put64(nvme, NVME_REG_ASQ, asq);
nvme_put64(nvme, NVME_REG_ACQ, acq);
- cc.b.cc_ams = 0; /* use Round-Robin arbitration */
- cc.b.cc_css = 0; /* use NVM command set */
+ cc.b.cc_ams = 0; /* use Round-Robin arbitration */
+ cc.b.cc_css = 0; /* use NVM command set */
cc.b.cc_mps = nvme->n_pageshift - 12;
- cc.b.cc_shn = 0; /* no shutdown in progress */
- cc.b.cc_en = 1; /* enable controller */
+ cc.b.cc_shn = 0; /* no shutdown in progress */
+ cc.b.cc_en = 1; /* enable controller */
+ cc.b.cc_iosqes = 6; /* submission queue entry is 2^6 bytes long */
+ cc.b.cc_iocqes = 4; /* completion queue entry is 2^4 bytes long */
nvme_put32(nvme, NVME_REG_CC, cc.r);
@@ -2114,8 +2117,8 @@ nvme_init(nvme_t *nvme)
if (nvme->n_ioq_count < nqueues) {
nvme_release_interrupts(nvme);
- if (nvme_setup_interrupts(nvme, nvme->n_intr_type, nqueues)
- != DDI_SUCCESS) {
+ if (nvme_setup_interrupts(nvme, nvme->n_intr_type,
+ nvme->n_ioq_count) != DDI_SUCCESS) {
dev_err(nvme->n_dip, CE_WARN,
"!failed to reduce number of interrupts");
goto fail;