diff options
author | Hans Rosenfeld <hans.rosenfeld@nexenta.com> | 2016-08-08 15:20:32 +0200 |
---|---|---|
committer | Hans Rosenfeld <hans.rosenfeld@nexenta.com> | 2016-08-25 17:04:45 +0200 |
commit | bf26ea4b8945ba545fde8b47a2a31ce2d11b82cd (patch) | |
tree | 9fede7482c593cde2b1ec33dc9936f24c6d289e2 /usr/src | |
parent | 34c938c74e6f278ee870d39330b571ffea1b808e (diff) | |
download | illumos-joyent-bf26ea4b8945ba545fde8b47a2a31ce2d11b82cd.tar.gz |
7296 nvme initial interrupt issues
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/nvme/nvme.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/usr/src/uts/common/io/nvme/nvme.c b/usr/src/uts/common/io/nvme/nvme.c index 657c0a57c1..6a06c42cdb 100644 --- a/usr/src/uts/common/io/nvme/nvme.c +++ b/usr/src/uts/common/io/nvme/nvme.c @@ -1747,14 +1747,6 @@ nvme_init(nvme_t *nvme) char model[sizeof (nvme->n_idctl->id_model) + 1]; char *vendor, *product; - /* Setup fixed interrupt for admin queue. */ - if (nvme_setup_interrupts(nvme, DDI_INTR_TYPE_FIXED, 1) - != DDI_SUCCESS) { - dev_err(nvme->n_dip, CE_WARN, - "!failed to setup fixed interrupt"); - goto fail; - } - /* Check controller version */ vs.r = nvme_get32(nvme, NVME_REG_VS); dev_err(nvme->n_dip, CE_CONT, "?NVMe spec version %d.%d", @@ -1893,6 +1885,20 @@ nvme_init(nvme_t *nvme) sema_init(&nvme->n_abort_sema, 1, NULL, SEMA_DRIVER, NULL); /* + * Setup initial interrupt for admin queue. + */ + if ((nvme_setup_interrupts(nvme, DDI_INTR_TYPE_MSIX, 1) + != DDI_SUCCESS) && + (nvme_setup_interrupts(nvme, DDI_INTR_TYPE_MSI, 1) + != DDI_SUCCESS) && + (nvme_setup_interrupts(nvme, DDI_INTR_TYPE_FIXED, 1) + != DDI_SUCCESS)) { + dev_err(nvme->n_dip, CE_WARN, + "!failed to setup initial interrupt"); + goto fail; + } + + /* * Post an asynchronous event command to catch errors. */ if (nvme_async_event(nvme) != DDI_SUCCESS) { @@ -2174,6 +2180,7 @@ nvme_intr(caddr_t arg1, caddr_t arg2) /*LINTED: E_PTR_BAD_CAST_ALIGN*/ nvme_t *nvme = (nvme_t *)arg1; int inum = (int)(uintptr_t)arg2; + int ccnt = 0; int qnum; nvme_cmd_t *cmd; @@ -2191,10 +2198,11 @@ nvme_intr(caddr_t arg1, caddr_t arg2) while ((cmd = nvme_retrieve_cmd(nvme, nvme->n_ioq[qnum]))) { taskq_dispatch_ent((taskq_t *)cmd->nc_nvme->n_cmd_taskq, cmd->nc_callback, cmd, TQ_NOSLEEP, &cmd->nc_tqent); + ccnt++; } } - return (DDI_INTR_CLAIMED); + return (ccnt > 0 ? DDI_INTR_CLAIMED : DDI_INTR_UNCLAIMED); } static void |