summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorHans Rosenfeld <hans.rosenfeld@nexenta.com>2016-08-08 15:20:32 +0200
committerHans Rosenfeld <hans.rosenfeld@nexenta.com>2016-08-25 17:04:45 +0200
commitbf26ea4b8945ba545fde8b47a2a31ce2d11b82cd (patch)
tree9fede7482c593cde2b1ec33dc9936f24c6d289e2 /usr/src
parent34c938c74e6f278ee870d39330b571ffea1b808e (diff)
downloadillumos-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.c26
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