master
1/*-
2 * CAM ioctl compatibility shims
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 *
6 * Copyright (c) 2013 Scott Long
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 * without modification, immediately at the beginning of the file.
15 * 2. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
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 FOR
22 * 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#ifndef _CAM_CAM_COMPAT_H
32#define _CAM_CAM_COMPAT_H
33
34/* No user-serviceable parts in here. */
35#ifdef _KERNEL
36
37int cam_compat_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
38 struct thread *td, int(*cbfnp)(struct cdev *, u_long, caddr_t, int,
39 struct thread *));
40
41/* Version 0x16 compatibility */
42#define CAM_VERSION_0x16 0x16
43
44/* The size of the union ccb didn't change when going to 0x17 */
45#define CAMIOCOMMAND_0x16 _IOC(IOC_INOUT, CAM_VERSION_0x16, 2, CAM_0X17_LEN)
46#define CAMGETPASSTHRU_0x16 _IOC(IOC_INOUT, CAM_VERSION_0x16, 3, CAM_0X17_LEN)
47
48#define CAM_SCATTER_VALID_0x16 0x00000010
49#define CAM_SG_LIST_PHYS_0x16 0x00040000
50#define CAM_DATA_PHYS_0x16 0x00200000
51
52/* Version 0x17 compatibility */
53#define CAM_VERSION_0x17 0x17
54
55struct ccb_hdr_0x17 {
56 cam_pinfo pinfo; /* Info for priority scheduling */
57 camq_entry xpt_links; /* For chaining in the XPT layer */
58 camq_entry sim_links; /* For chaining in the SIM layer */
59 camq_entry periph_links; /* For chaining in the type driver */
60 uint32_t retry_count;
61 void (*cbfcnp)(struct cam_periph *, union ccb *);
62 xpt_opcode func_code; /* XPT function code */
63 uint32_t status; /* Status returned by CAM subsystem */
64 struct cam_path *path; /* Compiled path for this ccb */
65 path_id_t path_id; /* Path ID for the request */
66 target_id_t target_id; /* Target device ID */
67 u_int target_lun; /* Target LUN number */
68 uint32_t flags; /* ccb_flags */
69 ccb_ppriv_area periph_priv;
70 ccb_spriv_area sim_priv;
71 uint32_t timeout; /* Hard timeout value in seconds */
72 struct callout *timeout_ch;
73};
74
75struct ccb_pathinq_0x17 {
76 struct ccb_hdr_0x17 ccb_h;
77 uint8_t version_num; /* Version number for the SIM/HBA */
78 uint8_t hba_inquiry; /* Mimic of INQ byte 7 for the HBA */
79 uint8_t target_sprt; /* Flags for target mode support */
80 uint8_t hba_misc; /* Misc HBA features */
81 uint16_t hba_eng_cnt; /* HBA engine count */
82 /* Vendor Unique capabilities */
83 uint8_t vuhba_flags[VUHBALEN];
84 uint32_t max_target; /* Maximum supported Target */
85 uint32_t max_lun; /* Maximum supported Lun */
86 uint32_t async_flags; /* Installed Async handlers */
87 path_id_t hpath_id; /* Highest Path ID in the subsystem */
88 target_id_t initiator_id; /* ID of the HBA on the SCSI bus */
89 char sim_vid[SIM_IDLEN]; /* Vendor ID of the SIM */
90 char hba_vid[HBA_IDLEN]; /* Vendor ID of the HBA */
91 char dev_name[DEV_IDLEN];/* Device name for SIM */
92 uint32_t unit_number; /* Unit number for SIM */
93 uint32_t bus_id; /* Bus ID for SIM */
94 uint32_t base_transfer_speed;/* Base bus speed in KB/sec */
95 cam_proto protocol;
96 u_int protocol_version;
97 cam_xport transport;
98 u_int transport_version;
99 union {
100 struct ccb_pathinq_settings_spi spi;
101 struct ccb_pathinq_settings_fc fc;
102 struct ccb_pathinq_settings_sas sas;
103 char ccb_pathinq_settings_opaque[PATHINQ_SETTINGS_SIZE];
104 } xport_specific;
105 u_int maxio; /* Max supported I/O size, in bytes. */
106 uint16_t hba_vendor; /* HBA vendor ID */
107 uint16_t hba_device; /* HBA device ID */
108 uint16_t hba_subvendor; /* HBA subvendor ID */
109 uint16_t hba_subdevice; /* HBA subdevice ID */
110};
111
112struct ccb_trans_settings_0x17 {
113 struct ccb_hdr_0x17 ccb_h;
114 cts_type type; /* Current or User settings */
115 cam_proto protocol;
116 u_int protocol_version;
117 cam_xport transport;
118 u_int transport_version;
119 union {
120 u_int valid; /* Which fields to honor */
121 struct ccb_trans_settings_ata ata;
122 struct ccb_trans_settings_scsi scsi;
123 } proto_specific;
124 union {
125 u_int valid; /* Which fields to honor */
126 struct ccb_trans_settings_spi spi;
127 struct ccb_trans_settings_fc fc;
128 struct ccb_trans_settings_sas sas;
129 struct ccb_trans_settings_pata ata;
130 struct ccb_trans_settings_sata sata;
131 } xport_specific;
132};
133
134#define CAM_0X17_DATA_LEN CAM_0X18_DATA_LEN
135#define CAM_0X17_LEN (sizeof(struct ccb_hdr_0x17) + CAM_0X17_DATA_LEN)
136
137#define CAMIOCOMMAND_0x17 _IOC(IOC_INOUT, CAM_VERSION_0x17, 2, CAM_0X17_LEN)
138#define CAMGETPASSTHRU_0x17 _IOC(IOC_INOUT, CAM_VERSION_0x17, 3, CAM_0X17_LEN)
139
140/* Version 0x18 compatibility */
141#define CAM_VERSION_0x18 0x18
142
143struct ccb_hdr_0x18 {
144 cam_pinfo pinfo; /* Info for priority scheduling */
145 camq_entry xpt_links; /* For chaining in the XPT layer */
146 camq_entry sim_links; /* For chaining in the SIM layer */
147 camq_entry periph_links; /* For chaining in the type driver */
148 uint32_t retry_count;
149 void (*cbfcnp)(struct cam_periph *, union ccb *);
150 xpt_opcode func_code; /* XPT function code */
151 uint32_t status; /* Status returned by CAM subsystem */
152 struct cam_path *path; /* Compiled path for this ccb */
153 path_id_t path_id; /* Path ID for the request */
154 target_id_t target_id; /* Target device ID */
155 u_int target_lun; /* Target LUN number */
156 uint64_t ext_lun; /* 64-bit LUN, more or less */
157 uint32_t flags; /* ccb_flags */
158 uint32_t xflags; /* extended ccb_flags */
159 ccb_ppriv_area periph_priv;
160 ccb_spriv_area sim_priv;
161 ccb_qos_area qos;
162 uint32_t timeout; /* Hard timeout value in seconds */
163 struct timeval softtimeout; /* Soft timeout value in sec + usec */
164};
165
166typedef enum {
167 CAM_EXTLUN_VALID_0x18 = 0x00000001,/* 64bit lun field is valid */
168} ccb_xflags_0x18;
169
170struct ccb_trans_settings_0x18 {
171 struct ccb_hdr_0x18 ccb_h;
172 cts_type type; /* Current or User settings */
173 cam_proto protocol;
174 u_int protocol_version;
175 cam_xport transport;
176 u_int transport_version;
177 union {
178 u_int valid; /* Which fields to honor */
179 struct ccb_trans_settings_ata ata;
180 struct ccb_trans_settings_scsi scsi;
181 } proto_specific;
182 union {
183 u_int valid; /* Which fields to honor */
184 struct ccb_trans_settings_spi spi;
185 struct ccb_trans_settings_fc fc;
186 struct ccb_trans_settings_sas sas;
187 struct ccb_trans_settings_pata ata;
188 struct ccb_trans_settings_sata sata;
189 } xport_specific;
190};
191
192struct dev_match_result_0x18 {
193 dev_match_type type;
194 union {
195 struct {
196 char periph_name[DEV_IDLEN];
197 uint32_t unit_number;
198 path_id_t path_id;
199 target_id_t target_id;
200 u_int target_lun;
201 } periph_result;
202 struct {
203 path_id_t path_id;
204 target_id_t target_id;
205 u_int target_lun;
206 cam_proto protocol;
207 struct scsi_inquiry_data inq_data;
208 struct ata_params ident_data;
209 dev_result_flags flags;
210 } device_result;
211 struct bus_match_result bus_result;
212 } result;
213};
214
215#define CAM_0X18_DATA_LEN (sizeof(union ccb) - 2*sizeof(void *) - sizeof(struct ccb_hdr))
216#define CAM_0X18_LEN (sizeof(struct ccb_hdr_0x18) + CAM_0X18_DATA_LEN)
217
218#define CAMIOCOMMAND_0x18 _IOC(IOC_INOUT, CAM_VERSION_0x18, 2, CAM_0X18_LEN)
219#define CAMGETPASSTHRU_0x18 _IOC(IOC_INOUT, CAM_VERSION_0x18, 3, CAM_0X18_LEN)
220
221/* Version 0x19 compatibility */
222#define CAM_VERSION_0x19 0x19
223#define CAMIOCOMMAND_0x19 _IOWR(CAM_VERSION_0x19, 2, union ccb)
224#define CAMGETPASSTHRU_0x19 _IOWR(CAM_VERSION_0x19, 3, union ccb)
225#define CAMIOQUEUE_0x19 _IO(CAM_VERSION_0x19, 4)
226#define CAMIOGET_0x19 _IO(CAM_VERSION_0x19, 5)
227
228#endif
229#endif