diff --git a/sys/dev/nvme/nvme.c b/sys/dev/nvme/nvme.c --- a/sys/dev/nvme/nvme.c +++ b/sys/dev/nvme/nvme.c @@ -34,6 +34,7 @@ #include #include "nvme_private.h" +#include "nvmec_if.h" struct nvme_consumer { uint32_t id; @@ -189,23 +190,21 @@ } void -nvme_notify_async_consumers(struct nvme_controller *ctrlr, - const struct nvme_completion *async_cpl, - uint32_t log_page_id, void *log_page_buffer, - uint32_t log_page_size) +nvme_notify_async(struct nvme_controller *ctrlr, + const struct nvme_completion *async_cpl, + uint32_t log_page_id, void *log_page_buffer, uint32_t log_page_size) { - struct nvme_consumer *cons; - void *ctrlr_cookie; - uint32_t i; + device_t *children; + int n_children; - for (i = 0; i < NVME_MAX_CONSUMERS; i++) { - cons = &nvme_consumer[i]; - if (cons->id != INVALID_CONSUMER_ID && cons->async_fn != NULL && - (ctrlr_cookie = ctrlr->cons_cookie[i]) != NULL) { - (*cons->async_fn)(ctrlr_cookie, async_cpl, - log_page_id, log_page_buffer, log_page_size); - } - } + if (device_get_children(ctrlr->dev, &children, &n_children) != 0) + return; + + for (int i = 0; i < n_children; i++) + NVMEC_ASYNC(children[i], async_cpl, log_page_id, + log_page_buffer, log_page_size); + + free(children, M_TEMP); } void diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -696,8 +696,8 @@ * should never happen. */ if (nvme_completion_is_error(cpl)) - nvme_notify_async_consumers(aer->ctrlr, &aer->cpl, - aer->log_page_id, NULL, 0); + nvme_notify_async(aer->ctrlr, &aer->cpl, aer->log_page_id, + NULL, 0); else { /* Convert data to host endian */ switch (aer->log_page_id) { @@ -774,8 +774,8 @@ * Pass the cpl data from the original async event completion, * not the log page fetch. */ - nvme_notify_async_consumers(aer->ctrlr, &aer->cpl, - aer->log_page_id, aer->log_page_buffer, aer->log_page_size); + nvme_notify_async(aer->ctrlr, &aer->cpl, aer->log_page_id, + aer->log_page_buffer, aer->log_page_size); } /* @@ -818,7 +818,7 @@ aer); /* Wait to notify consumers until after log page is fetched. */ } else { - nvme_notify_async_consumers(aer->ctrlr, cpl, aer->log_page_id, + nvme_notify_async(aer->ctrlr, cpl, aer->log_page_id, NULL, 0); /* diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -555,10 +555,10 @@ #define nvme_free_request(req) free(req, M_NVME) -void nvme_notify_async_consumers(struct nvme_controller *ctrlr, - const struct nvme_completion *async_cpl, - uint32_t log_page_id, void *log_page_buffer, - uint32_t log_page_size); +void nvme_notify_async(struct nvme_controller *ctrlr, + const struct nvme_completion *async_cpl, + uint32_t log_page_id, void *log_page_buffer, + uint32_t log_page_size); void nvme_notify_fail_consumers(struct nvme_controller *ctrlr); void nvme_ctrlr_shared_handler(void *arg);