Lines Matching +full:mem +full:- +full:io

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2022-2024 Chelsio Communications, Inc.
24 /* Transport-independent support for fabrics queue pairs and commands. */
62 qp = nt->nt_ops->allocate_qpair(controller, params); in nvmf_allocate_qpair()
64 refcount_acquire(&nt->nt_active_qpairs); in nvmf_allocate_qpair()
72 qp->nq_transport = nt; in nvmf_allocate_qpair()
73 qp->nq_ops = nt->nt_ops; in nvmf_allocate_qpair()
74 qp->nq_controller = controller; in nvmf_allocate_qpair()
75 qp->nq_error = error_cb; in nvmf_allocate_qpair()
76 qp->nq_error_arg = error_cb_arg; in nvmf_allocate_qpair()
77 qp->nq_receive = receive_cb; in nvmf_allocate_qpair()
78 qp->nq_receive_arg = receive_cb_arg; in nvmf_allocate_qpair()
79 qp->nq_admin = nvlist_get_bool(params, "admin"); in nvmf_allocate_qpair()
88 nt = qp->nq_transport; in nvmf_free_qpair()
89 qp->nq_ops->free_qpair(qp); in nvmf_free_qpair()
90 if (refcount_release(&nt->nt_active_qpairs)) in nvmf_free_qpair()
101 nc = qp->nq_ops->allocate_capsule(qp, how); in nvmf_allocate_command()
105 nc->nc_qpair = qp; in nvmf_allocate_command()
106 nc->nc_qe_len = sizeof(struct nvme_command); in nvmf_allocate_command()
107 memcpy(&nc->nc_sqe, sqe, nc->nc_qe_len); in nvmf_allocate_command()
110 nc->nc_sqe.fuse &= ~NVMEM(NVME_CMD_PSDT); in nvmf_allocate_command()
111 nc->nc_sqe.fuse |= NVMEF(NVME_CMD_PSDT, NVME_PSDT_SGL); in nvmf_allocate_command()
122 nc = qp->nq_ops->allocate_capsule(qp, how); in nvmf_allocate_response()
126 nc->nc_qpair = qp; in nvmf_allocate_response()
127 nc->nc_qe_len = sizeof(struct nvme_completion); in nvmf_allocate_response()
128 memcpy(&nc->nc_cqe, cqe, nc->nc_qe_len); in nvmf_allocate_response()
133 nvmf_capsule_append_data(struct nvmf_capsule *nc, struct memdesc *mem, in nvmf_capsule_append_data() argument
137 if (nc->nc_data.io_len != 0) in nvmf_capsule_append_data()
140 nc->nc_send_data = send; in nvmf_capsule_append_data()
141 nc->nc_data.io_mem = *mem; in nvmf_capsule_append_data()
142 nc->nc_data.io_len = len; in nvmf_capsule_append_data()
143 nc->nc_data.io_complete = complete_cb; in nvmf_capsule_append_data()
144 nc->nc_data.io_complete_arg = cb_arg; in nvmf_capsule_append_data()
151 nc->nc_qpair->nq_ops->free_capsule(nc); in nvmf_free_capsule()
157 return (nc->nc_qpair->nq_ops->transmit_capsule(nc)); in nvmf_transmit_capsule()
163 if (nc->nc_data.io_len != 0) in nvmf_abort_capsule_data()
164 nvmf_complete_io_request(&nc->nc_data, 0, error); in nvmf_abort_capsule_data()
170 KASSERT(nc->nc_qe_len == sizeof(struct nvme_command), in nvmf_capsule_sqe()
172 return (&nc->nc_sqe); in nvmf_capsule_sqe()
178 KASSERT(nc->nc_qe_len == sizeof(struct nvme_completion), in nvmf_capsule_cqe()
180 return (&nc->nc_cqe); in nvmf_capsule_cqe()
186 KASSERT(nc->nc_qe_len == sizeof(struct nvme_completion), in nvmf_sqhd_valid()
188 return (nc->nc_sqhd_valid); in nvmf_sqhd_valid()
194 KASSERT(nc->nc_qe_len == sizeof(struct nvme_command), in nvmf_validate_command_capsule()
197 if (NVMEV(NVME_CMD_PSDT, nc->nc_sqe.fuse) != NVME_PSDT_SGL) in nvmf_validate_command_capsule()
200 return (nc->nc_qpair->nq_ops->validate_command_capsule(nc)); in nvmf_validate_command_capsule()
206 return (nc->nc_qpair->nq_ops->capsule_data_len(nc)); in nvmf_capsule_data_len()
211 struct memdesc *mem, size_t len, nvmf_io_complete_t *complete_cb, in nvmf_receive_controller_data() argument
214 struct nvmf_io_request io; in nvmf_receive_controller_data() local
216 io.io_mem = *mem; in nvmf_receive_controller_data()
217 io.io_len = len; in nvmf_receive_controller_data()
218 io.io_complete = complete_cb; in nvmf_receive_controller_data()
219 io.io_complete_arg = cb_arg; in nvmf_receive_controller_data()
220 return (nc->nc_qpair->nq_ops->receive_controller_data(nc, data_offset, in nvmf_receive_controller_data()
221 &io)); in nvmf_receive_controller_data()
229 return (nc->nc_qpair->nq_ops->send_controller_data(nc, data_offset, m, in nvmf_send_controller_data()
243 if (nv->size == 0) { in nvmf_pack_ioc_nvlist()
244 nv->len = nvlist_size(nvl); in nvmf_pack_ioc_nvlist()
246 packed = nvlist_pack(nvl, &nv->len); in nvmf_pack_ioc_nvlist()
249 else if (nv->len > nv->size) in nvmf_pack_ioc_nvlist()
252 error = copyout(packed, nv->data, nv->len); in nvmf_pack_ioc_nvlist()
265 packed = malloc(nv->size, M_NVMF_TRANSPORT, M_WAITOK); in nvmf_unpack_ioc_nvlist()
266 error = copyin(nv->data, packed, nv->size); in nvmf_unpack_ioc_nvlist()
272 nvl = nvlist_unpack(packed, nv->size, 0); in nvmf_unpack_ioc_nvlist()
308 if (value > qsize - 1) in nvmf_validate_qpair_nvlist()
312 if (value > qsize - 1) in nvmf_validate_qpair_nvlist()
328 if (!nvmf_supported_trtype(ops->trtype)) { in nvmf_transport_module_handler()
329 printf("NVMF: Unsupported transport %u", ops->trtype); in nvmf_transport_module_handler()
334 nt->nt_ops = arg; in nvmf_transport_module_handler()
337 if (SLIST_EMPTY(&nvmf_transports[ops->trtype])) { in nvmf_transport_module_handler()
338 SLIST_INSERT_HEAD(&nvmf_transports[ops->trtype], nt, in nvmf_transport_module_handler()
342 SLIST_FOREACH(nt2, &nvmf_transports[ops->trtype], in nvmf_transport_module_handler()
344 if (ops->priority > nt2->nt_ops->priority) in nvmf_transport_module_handler()
349 SLIST_INSERT_HEAD(&nvmf_transports[ops->trtype], in nvmf_transport_module_handler()
358 if (!nvmf_supported_trtype(ops->trtype)) in nvmf_transport_module_handler()
362 SLIST_FOREACH(nt, &nvmf_transports[ops->trtype], nt_link) { in nvmf_transport_module_handler()
363 if (nt->nt_ops == ops) in nvmf_transport_module_handler()
370 if (nt->nt_active_qpairs != 0) { in nvmf_transport_module_handler()
378 if (!nvmf_supported_trtype(ops->trtype)) in nvmf_transport_module_handler()
383 SLIST_FOREACH(nt, &nvmf_transports[ops->trtype], nt_link) { in nvmf_transport_module_handler()
384 if (nt->nt_ops == ops) in nvmf_transport_module_handler()
394 SLIST_REMOVE_HEAD(&nvmf_transports[ops->trtype], in nvmf_transport_module_handler()
400 while (nt->nt_active_qpairs != 0 && error == 0) in nvmf_transport_module_handler()