Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/nvme/nvme_qpair.c
Show First 20 Lines • Show All 669 Lines • ▼ Show 20 Lines | nvme_qpair_construct(struct nvme_qpair *qpair, | ||||
uint8_t *queuemem, *prpmem, *prp_list; | uint8_t *queuemem, *prpmem, *prp_list; | ||||
int i, err; | int i, err; | ||||
qpair->vector = ctrlr->msix_enabled ? qpair->id : 0; | qpair->vector = ctrlr->msix_enabled ? qpair->id : 0; | ||||
qpair->num_entries = num_entries; | qpair->num_entries = num_entries; | ||||
qpair->num_trackers = num_trackers; | qpair->num_trackers = num_trackers; | ||||
qpair->ctrlr = ctrlr; | qpair->ctrlr = ctrlr; | ||||
if (ctrlr->msix_enabled) { | |||||
/* | |||||
* MSI-X vector resource IDs start at 1, so we add one to | |||||
* the queue's vector to get the corresponding rid to use. | |||||
*/ | |||||
qpair->rid = qpair->vector + 1; | |||||
qpair->res = bus_alloc_resource_any(ctrlr->dev, SYS_RES_IRQ, | |||||
&qpair->rid, RF_ACTIVE); | |||||
if (bus_setup_intr(ctrlr->dev, qpair->res, | |||||
INTR_TYPE_MISC | INTR_MPSAFE, NULL, | |||||
nvme_qpair_msix_handler, qpair, &qpair->tag) != 0) { | |||||
nvme_printf(ctrlr, "unable to setup intx handler\n"); | |||||
goto out; | |||||
} | |||||
if (qpair->id == 0) { | |||||
bus_describe_intr(ctrlr->dev, qpair->res, qpair->tag, | |||||
"admin"); | |||||
} else { | |||||
bus_describe_intr(ctrlr->dev, qpair->res, qpair->tag, | |||||
"io%d", qpair->id - 1); | |||||
} | |||||
} | |||||
mtx_init(&qpair->lock, "nvme qpair lock", NULL, MTX_DEF); | mtx_init(&qpair->lock, "nvme qpair lock", NULL, MTX_DEF); | ||||
/* Note: NVMe PRP format is restricted to 4-byte alignment. */ | /* Note: NVMe PRP format is restricted to 4-byte alignment. */ | ||||
err = bus_dma_tag_create(bus_get_dma_tag(ctrlr->dev), | err = bus_dma_tag_create(bus_get_dma_tag(ctrlr->dev), | ||||
4, PAGE_SIZE, BUS_SPACE_MAXADDR, | 4, PAGE_SIZE, BUS_SPACE_MAXADDR, | ||||
BUS_SPACE_MAXADDR, NULL, NULL, ctrlr->max_xfer_size, | BUS_SPACE_MAXADDR, NULL, NULL, ctrlr->max_xfer_size, | ||||
btoc(ctrlr->max_xfer_size) + 1, PAGE_SIZE, 0, | btoc(ctrlr->max_xfer_size) + 1, PAGE_SIZE, 0, | ||||
NULL, NULL, &qpair->dma_tag_payload); | NULL, NULL, &qpair->dma_tag_payload); | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | nvme_qpair_construct(struct nvme_qpair *qpair, | ||||
if (qpair->num_trackers == 0) { | if (qpair->num_trackers == 0) { | ||||
nvme_printf(ctrlr, "failed to allocate enough trackers\n"); | nvme_printf(ctrlr, "failed to allocate enough trackers\n"); | ||||
goto out; | goto out; | ||||
} | } | ||||
qpair->act_tr = malloc_domainset(sizeof(struct nvme_tracker *) * | qpair->act_tr = malloc_domainset(sizeof(struct nvme_tracker *) * | ||||
qpair->num_entries, M_NVME, DOMAINSET_PREF(qpair->domain), | qpair->num_entries, M_NVME, DOMAINSET_PREF(qpair->domain), | ||||
M_ZERO | M_WAITOK); | M_ZERO | M_WAITOK); | ||||
if (ctrlr->msix_enabled) { | |||||
/* | |||||
* MSI-X vector resource IDs start at 1, so we add one to | |||||
* the queue's vector to get the corresponding rid to use. | |||||
*/ | |||||
qpair->rid = qpair->vector + 1; | |||||
qpair->res = bus_alloc_resource_any(ctrlr->dev, SYS_RES_IRQ, | |||||
&qpair->rid, RF_ACTIVE); | |||||
if (bus_setup_intr(ctrlr->dev, qpair->res, | |||||
INTR_TYPE_MISC | INTR_MPSAFE, NULL, | |||||
nvme_qpair_msix_handler, qpair, &qpair->tag) != 0) { | |||||
nvme_printf(ctrlr, "unable to setup intx handler\n"); | |||||
goto out; | |||||
} | |||||
if (qpair->id == 0) { | |||||
bus_describe_intr(ctrlr->dev, qpair->res, qpair->tag, | |||||
"admin"); | |||||
} else { | |||||
bus_describe_intr(ctrlr->dev, qpair->res, qpair->tag, | |||||
"io%d", qpair->id - 1); | |||||
} | |||||
} | |||||
return (0); | return (0); | ||||
out: | out: | ||||
nvme_qpair_destroy(qpair); | nvme_qpair_destroy(qpair); | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
static void | static void | ||||
▲ Show 20 Lines • Show All 483 Lines • Show Last 20 Lines |