1 /* 2 * Copyright (c) 2016 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 3. Neither the name of The DragonFly Project nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific, prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 #include "nvme.h" 36 37 int 38 nvme_getlog_ioctl(nvme_softc_t *sc, nvme_getlog_ioctl_t *ioc) 39 { 40 int error; 41 nvme_request_t *req; 42 43 if ((ioc->ret_size & 3) || ioc->ret_size > sizeof(ioc->info)) 44 return EINVAL; 45 if (ioc->ret_size < 4) 46 return EINVAL; 47 48 lockmgr(&sc->ioctl_lk, LK_EXCLUSIVE); 49 req = nvme_get_admin_request(sc, NVME_OP_GET_LOG_PAGE); 50 req->cmd.head.nsid = -1; 51 req->cmd.getlog.lid = ioc->lid; 52 req->cmd.getlog.numdl = ioc->ret_size / 4 - 1; 53 /* leave numdh 0 (NVMe 1.2.1 allows > 65535 dwords) */ 54 /* leave lpol and lpou 0 for now */ 55 bzero(req->info, sizeof(*req->info)); 56 nvme_submit_request(req); 57 ioc->status = nvme_wait_request(req); 58 bcopy(req->info, &ioc->info, ioc->ret_size); 59 nvme_put_request(req); 60 lockmgr(&sc->ioctl_lk, LK_RELEASE); 61 62 error = 0; 63 64 return error; 65 } 66