1/*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2000 Michael Smith 5 * Copyright (c) 2000 Scott Long 6 * Copyright (c) 2000 BSDi 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 */ 30 31/* 32 * Command queue statistics 33 */ 34#define AACQ_FREE 0 35#define AACQ_BIO 1 36#define AACQ_READY 2 37#define AACQ_BUSY 3 38#define AACQ_COUNT 4 /* total number of queues */ 39 40struct aac_qstat { 41 u_int32_t q_length; 42 u_int32_t q_max; 43}; 44 45/* 46 * Statistics request 47 */ 48union aac_statrequest { 49 u_int32_t as_item; 50 struct aac_qstat as_qstat; 51}; 52 53#define AACIO_STATS _IOWR('T', 101, union aac_statrequest) 54 55/* 56 * Ioctl commands likely to be submitted from a Linux management application. 57 * These bit encodings are actually descended from Windows NT. Ick. 58 */ 59 60#define CTL_CODE(devType, func, meth, acc) (((devType) << 16) | ((acc) << 14) | ((func) << 2) | (meth)) 61#define METHOD_BUFFERED 0 62#define METHOD_IN_DIRECT 1 63#define METHOD_OUT_DIRECT 2 64#define METHOD_NEITHER 3 65#define FILE_ANY_ACCESS 0 66#define FILE_READ_ACCESS ( 0x0001 ) 67#define FILE_WRITE_ACCESS ( 0x0002 ) 68#define FILE_DEVICE_CONTROLLER 0x00000004 69 70#define FSACTL_LNX_SENDFIB CTL_CODE(FILE_DEVICE_CONTROLLER, 2050, \ 71 METHOD_BUFFERED, FILE_ANY_ACCESS) 72#define FSACTL_LNX_SEND_RAW_SRB CTL_CODE(FILE_DEVICE_CONTROLLER, 2067, \ 73 METHOD_BUFFERED, FILE_ANY_ACCESS) 74#define FSACTL_LNX_GET_COMM_PERF_DATA CTL_CODE(FILE_DEVICE_CONTROLLER, 2084, \ 75 METHOD_BUFFERED, FILE_ANY_ACCESS) 76#define FSACTL_LNX_OPENCLS_COMM_PERF_DATA CTL_CODE(FILE_DEVICE_CONTROLLER, \ 77 2085, METHOD_BUFFERED, FILE_ANY_ACCESS) 78#define FSACTL_LNX_OPEN_GET_ADAPTER_FIB CTL_CODE(FILE_DEVICE_CONTROLLER, 2100, \ 79 METHOD_BUFFERED, FILE_ANY_ACCESS) 80#define FSACTL_LNX_GET_NEXT_ADAPTER_FIB CTL_CODE(FILE_DEVICE_CONTROLLER, 2101, \ 81 METHOD_BUFFERED, FILE_ANY_ACCESS) 82#define FSACTL_LNX_CLOSE_GET_ADAPTER_FIB CTL_CODE(FILE_DEVICE_CONTROLLER, \ 83 2102, METHOD_BUFFERED, FILE_ANY_ACCESS) 84#define FSACTL_LNX_CLOSE_ADAPTER_CONFIG CTL_CODE(FILE_DEVICE_CONTROLLER, 2104, \ 85 METHOD_BUFFERED, FILE_ANY_ACCESS) 86#define FSACTL_LNX_OPEN_ADAPTER_CONFIG CTL_CODE(FILE_DEVICE_CONTROLLER, 2105, \ 87 METHOD_BUFFERED, FILE_ANY_ACCESS) 88#define FSACTL_LNX_MINIPORT_REV_CHECK CTL_CODE(FILE_DEVICE_CONTROLLER, 2107, \ 89 METHOD_BUFFERED, FILE_ANY_ACCESS) 90#define FSACTL_LNX_QUERY_ADAPTER_CONFIG CTL_CODE(FILE_DEVICE_CONTROLLER, 2113, \ 91 METHOD_BUFFERED, FILE_ANY_ACCESS) 92#define FSACTL_LNX_GET_PCI_INFO CTL_CODE(FILE_DEVICE_CONTROLLER, 2119, \ 93 METHOD_BUFFERED, FILE_ANY_ACCESS) 94#define FSACTL_LNX_FORCE_DELETE_DISK CTL_CODE(FILE_DEVICE_CONTROLLER, 2120, \ 95 METHOD_NEITHER, FILE_ANY_ACCESS) 96#define FSACTL_LNX_AIF_THREAD CTL_CODE(FILE_DEVICE_CONTROLLER, 2127, \ 97 METHOD_NEITHER, FILE_ANY_ACCESS) 98#define FSACTL_LNX_SEND_LARGE_FIB CTL_CODE(FILE_DEVICE_CONTROLLER, 2138, \ 99 METHOD_BUFFERED, FILE_ANY_ACCESS) 100#define FSACTL_LNX_GET_FEATURES CTL_CODE(FILE_DEVICE_CONTROLLER, 2139, \ 101 METHOD_BUFFERED, FILE_ANY_ACCESS) 102 103/* Why these don't follow the previous convention, I don't know */ 104#define FSACTL_LNX_NULL_IO_TEST 0x43 105#define FSACTL_LNX_SIM_IO_TEST 0x53 106#define FSACTL_LNX_DOWNLOAD 0x83 107#define FSACTL_LNX_GET_VAR 0x93 108#define FSACTL_LNX_SET_VAR 0xa3 109#define FSACTL_LNX_GET_FIBTIMES 0xb3 110#define FSACTL_LNX_ZERO_FIBTIMES 0xc3 111#define FSACTL_LNX_DELETE_DISK 0x163 112#define FSACTL_LNX_QUERY_DISK 0x173 113 114/* Ok, here it gets really lame */ 115#define FSACTL_LNX_PROBE_CONTAINERS 2131 /* Just guessing */ 116 117/* Do the native version of the ioctls. Since the BSD encoding scheme 118 * conflicts with the 'standard' AAC encoding scheme, the resulting numbers 119 * will be different. The '8' comes from the fact that the previous scheme 120 * used 12 bits for the number, with the 12th bit being the only set 121 * bit above bit 8. Thus the value of 8, with the lower 8 bits holding the 122 * command number. 9 is used for the odd overflow case. 123 */ 124#define FSACTL_SENDFIB _IO('8', 2) 125#define FSACTL_SEND_RAW_SRB _IO('8', 19) 126#define FSACTL_GET_COMM_PERF_DATA _IO('8', 36) 127#define FSACTL_OPENCLS_COMM_PERF_DATA _IO('8', 37) 128#define FSACTL_OPEN_GET_ADAPTER_FIB _IO('8', 52) 129#define FSACTL_GET_NEXT_ADAPTER_FIB _IO('8', 53) 130#define FSACTL_CLOSE_GET_ADAPTER_FIB _IO('8', 54) 131#define FSACTL_CLOSE_ADAPTER_CONFIG _IO('8', 56) 132#define FSACTL_OPEN_ADAPTER_CONFIG _IO('8', 57) 133#define FSACTL_MINIPORT_REV_CHECK _IO('8', 59) 134#define FSACTL_QUERY_ADAPTER_CONFIG _IO('8', 65) 135#define FSACTL_GET_PCI_INFO _IO('8', 71) 136#define FSACTL_FORCE_DELETE_DISK _IO('8', 72) 137#define FSACTL_AIF_THREAD _IO('8', 79) 138#define FSACTL_SEND_LARGE_FIB _IO('8', 90) 139#define FSACTL_GET_FEATURES _IO('8', 91) 140 141#define FSACTL_NULL_IO_TEST _IO('8', 67) 142#define FSACTL_SIM_IO_TEST _IO('8', 83) 143#define FSACTL_DOWNLOAD _IO('8', 131) 144#define FSACTL_GET_VAR _IO('8', 147) 145#define FSACTL_SET_VAR _IO('8', 163) 146#define FSACTL_GET_FIBTIMES _IO('8', 179) 147#define FSACTL_ZERO_FIBTIMES _IO('8', 195) 148#define FSACTL_DELETE_DISK _IO('8', 99) 149#define FSACTL_QUERY_DISK _IO('9', 115) 150 151#define FSACTL_PROBE_CONTAINERS _IO('9', 83) /* Just guessing */ 152 153#ifdef _KERNEL 154/* 155 * Support for faking the "miniport" version. 156 */ 157struct aac_rev_check { 158 RevComponent callingComponent; 159 struct FsaRevision callingRevision; 160}; 161 162struct aac_rev_check_resp { 163 int possiblyCompatible; 164 struct FsaRevision adapterSWRevision; 165}; 166 167/* 168 * Context passed in by a consumer looking to collect an AIF. 169 */ 170struct get_adapter_fib_ioctl { 171 u_int32_t AdapterFibContext; 172 int Wait; 173 caddr_t AifFib; 174}; 175 176#ifdef _KERNEL 177struct get_adapter_fib_ioctl32 { 178 u_int32_t AdapterFibContext; 179 int Wait; 180 u_int32_t AifFib; 181}; 182#endif 183 184struct aac_query_disk { 185 int32_t ContainerNumber; 186 int32_t Bus; 187 int32_t Target; 188 int32_t Lun; 189 u_int32_t Valid; 190 u_int32_t Locked; 191 u_int32_t Deleted; 192 int32_t Instance; 193 char diskDeviceName[10]; 194 u_int32_t UnMapped; 195}; 196 197/* Features, asked from the tools to know if the driver 198 * supports drives >2TB 199 */ 200typedef union { 201 struct { 202 u_int32_t largeLBA : 1; /* disk support greater 2TB */ 203 u_int32_t IoctlBuf : 1; /* ARCIOCTL call support */ 204 u_int32_t AIFSupport: 1; /* AIF support */ 205 u_int32_t JBODSupport:1; /* fw + driver support JBOD */ 206 u_int32_t fReserved : 28; 207 } fBits; 208 u_int32_t fValue; 209} featuresState; 210 211struct aac_features { 212 featuresState feat; 213 u_int32_t data[31]; 214 u_int32_t reserved[32]; 215} __packed; 216#endif 217