diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/nvme/nvme.c | 23 |
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; |