Lines Matching +full:lock +full:- +full:status
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
10 #include <sys/lock.h>
26 uint16_t status; member
28 struct mtx *lock; member
46 req = nvmf_allocate_request(sc->admin, &cmd, nvmf_complete_aer, aer, in nvmf_submit_aer()
50 req->aer = true; in nvmf_submit_aer()
64 if (ns_list->ns[0] == 0xffffffff) { in nvmf_handle_changed_namespaces()
69 for (u_int i = 0; i < nitems(ns_list->ns); i++) { in nvmf_handle_changed_namespaces()
70 if (ns_list->ns[i] == 0) in nvmf_handle_changed_namespaces()
73 nsid = le32toh(ns_list->ns[i]); in nvmf_handle_changed_namespaces()
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()
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()
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()
120 mtx_unlock(aer->lock); in nvmf_io_complete_aer_page()
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()
136 mtx_unlock(aer->lock); in nvmf_complete_aer_page()
144 return ((sc->cdata->elpe + 1) * in nvmf_log_page_size()
157 struct nvmf_softc *sc = aer->sc; in nvmf_complete_aer()
168 if (cqe->status != 0) { in nvmf_complete_aer()
170 device_printf(sc->dev, "Ignoring error %#x for AER\n", in nvmf_complete_aer()
171 le16toh(cqe->status)); in nvmf_complete_aer()
175 cdw0 = le32toh(cqe->cdw0); 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()
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()
211 struct nvmf_completion_status status; in nvmf_set_async_event_config() local
219 nvmf_status_init(&status); in nvmf_set_async_event_config()
220 req = nvmf_allocate_request(sc->admin, &cmd, nvmf_complete, &status, in nvmf_set_async_event_config()
223 device_printf(sc->dev, in nvmf_set_async_event_config()
228 nvmf_wait_for_reply(&status); in nvmf_set_async_event_config()
230 if (status.cqe.status != 0) { in nvmf_set_async_event_config()
231 device_printf(sc->dev, in nvmf_set_async_event_config()
232 "SET_FEATURES (ASYNC_EVENT_CONFIGURATION) failed, status %#x\n", in nvmf_set_async_event_config()
233 le16toh(status.cqe.status)); in nvmf_set_async_event_config()
244 sc->num_aer = min(8, sc->cdata->aerl + 1); in nvmf_init_aer()
245 sc->aer = mallocarray(sc->num_aer, sizeof(*sc->aer), M_NVMF, in nvmf_init_aer()
247 for (u_int i = 0; i < sc->num_aer; i++) { 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()
268 if (sc->cdata->ver >= NVME_REV(1, 2)) in nvmf_start_aer()
270 sc->cdata->oaes & NVME_ASYNC_EVENT_NS_ATTRIBUTE; in nvmf_start_aer()
275 for (u_int i = 0; i < sc->num_aer; i++) in nvmf_start_aer()
276 nvmf_submit_aer(sc, &sc->aer[i]); in nvmf_start_aer()
284 for (u_int i = 0; i < sc->num_aer; i++) { in nvmf_destroy_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()