Lines Matching full:aer

38 nvmf_submit_aer(struct nvmf_softc *sc, struct nvmf_aer *aer)  in nvmf_submit_aer()  argument
46 req = nvmf_allocate_request(sc->admin, &cmd, nvmf_complete_aer, aer, in nvmf_submit_aer()
50 req->aer = true; in nvmf_submit_aer()
79 nvmf_finish_aer_page(struct nvmf_softc *sc, struct nvmf_aer *aer) in nvmf_finish_aer_page() argument
82 if (aer->error != 0 || aer->status != 0) in nvmf_finish_aer_page()
85 taskqueue_enqueue(taskqueue_thread, &aer->finish_page_task); in nvmf_finish_aer_page()
91 struct nvmf_aer *aer = arg; in nvmf_finish_aer_page_task() local
92 struct nvmf_softc *sc = aer->sc; in nvmf_finish_aer_page_task()
94 switch (aer->log_page_id) { in nvmf_finish_aer_page_task()
99 nvmf_handle_changed_namespaces(sc, aer->page); in nvmf_finish_aer_page_task()
103 /* Resubmit this AER command. */ in nvmf_finish_aer_page_task()
104 nvmf_submit_aer(sc, aer); in nvmf_finish_aer_page_task()
110 struct nvmf_aer *aer = arg; in nvmf_io_complete_aer_page() local
111 struct nvmf_softc *sc = aer->sc; in nvmf_io_complete_aer_page()
113 mtx_lock(aer->lock); in nvmf_io_complete_aer_page()
114 aer->error = error; in nvmf_io_complete_aer_page()
115 aer->pending--; in nvmf_io_complete_aer_page()
116 if (aer->pending == 0) { in nvmf_io_complete_aer_page()
117 mtx_unlock(aer->lock); in nvmf_io_complete_aer_page()
118 nvmf_finish_aer_page(sc, aer); in nvmf_io_complete_aer_page()
120 mtx_unlock(aer->lock); in nvmf_io_complete_aer_page()
126 struct nvmf_aer *aer = arg; in nvmf_complete_aer_page() local
127 struct nvmf_softc *sc = aer->sc; in nvmf_complete_aer_page()
129 mtx_lock(aer->lock); in nvmf_complete_aer_page()
130 aer->status = cqe->status; in nvmf_complete_aer_page()
131 aer->pending--; in nvmf_complete_aer_page()
132 if (aer->pending == 0) { in nvmf_complete_aer_page()
133 mtx_unlock(aer->lock); in nvmf_complete_aer_page()
134 nvmf_finish_aer_page(sc, aer); in nvmf_complete_aer_page()
136 mtx_unlock(aer->lock); in nvmf_complete_aer_page()
156 struct nvmf_aer *aer = arg; in nvmf_complete_aer() local
157 struct nvmf_softc *sc = aer->sc; in nvmf_complete_aer()
161 * The only error defined for AER is an abort due to in nvmf_complete_aer()
162 * submitting too many AER commands. Just discard this AER in nvmf_complete_aer()
165 * NB: Pending AER commands are aborted during controller in nvmf_complete_aer()
170 device_printf(sc->dev, "Ignoring error %#x for AER\n", in nvmf_complete_aer()
176 aer->log_page_id = NVMEV(NVME_ASYNC_EVENT_LOG_PAGE_ID, cdw0); in nvmf_complete_aer()
177 aer->info = NVMEV(NVME_ASYNC_EVENT_INFO, cdw0); in nvmf_complete_aer()
178 aer->type = NVMEV(NVME_ASYNC_EVENT_TYPE, cdw0); in nvmf_complete_aer()
180 device_printf(sc->dev, "AER type %u, info %#x, page %#x\n", in nvmf_complete_aer()
181 aer->type, aer->info, aer->log_page_id); in nvmf_complete_aer()
183 aer->page_len = nvmf_log_page_size(sc, aer->log_page_id); in nvmf_complete_aer()
184 taskqueue_enqueue(taskqueue_thread, &aer->complete_task); in nvmf_complete_aer()
190 struct nvmf_aer *aer = arg; in nvmf_complete_aer_task() local
191 struct nvmf_softc *sc = aer->sc; in nvmf_complete_aer_task()
193 if (aer->page_len != 0) { in nvmf_complete_aer_task()
195 aer->page_len = MIN(aer->page_len, MAX_LOG_PAGE_SIZE); in nvmf_complete_aer_task()
196 aer->pending = 2; in nvmf_complete_aer_task()
198 aer->log_page_id, 0, aer->page, aer->page_len, in nvmf_complete_aer_task()
199 nvmf_complete_aer_page, aer, nvmf_io_complete_aer_page, in nvmf_complete_aer_task()
200 aer, M_WAITOK); in nvmf_complete_aer_task()
202 /* Resubmit this AER command. */ in nvmf_complete_aer_task()
203 nvmf_submit_aer(sc, aer); in nvmf_complete_aer_task()
245 sc->aer = mallocarray(sc->num_aer, sizeof(*sc->aer), M_NVMF, in nvmf_init_aer()
248 sc->aer[i].sc = sc; in nvmf_init_aer()
249 sc->aer[i].page = malloc(MAX_LOG_PAGE_SIZE, M_NVMF, M_WAITOK); in nvmf_init_aer()
250 sc->aer[i].lock = mtx_pool_find(mtxpool_sleep, &sc->aer[i]); in nvmf_init_aer()
251 TASK_INIT(&sc->aer[i].complete_task, 0, nvmf_complete_aer_task, in nvmf_init_aer()
252 &sc->aer[i]); in nvmf_init_aer()
253 TASK_INIT(&sc->aer[i].finish_page_task, 0, in nvmf_init_aer()
254 nvmf_finish_aer_page_task, &sc->aer[i]); in nvmf_init_aer()
276 nvmf_submit_aer(sc, &sc->aer[i]); in nvmf_start_aer()
285 taskqueue_drain(taskqueue_thread, &sc->aer[i].complete_task); in nvmf_destroy_aer()
286 taskqueue_drain(taskqueue_thread, &sc->aer[i].finish_page_task); in nvmf_destroy_aer()
287 free(sc->aer[i].page, M_NVMF); in nvmf_destroy_aer()
289 free(sc->aer, M_NVMF); in nvmf_destroy_aer()