1 | /* |
2 | * linux/drivers/message/fusion/mptioctl.h |
3 | * Fusion MPT misc device (ioctl) driver. |
4 | * For use with PCI chip/adapter(s): |
5 | * LSIFC9xx/LSI409xx Fibre Channel |
6 | * running LSI Fusion MPT (Message Passing Technology) firmware. |
7 | * |
8 | * Copyright (c) 1999-2008 LSI Corporation |
9 | * (mailto:DL-MPTFusionLinux@lsi.com) |
10 | * |
11 | */ |
12 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
13 | /* |
14 | This program is free software; you can redistribute it and/or modify |
15 | it under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation; version 2 of the License. |
17 | |
18 | This program is distributed in the hope that it will be useful, |
19 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
21 | GNU General Public License for more details. |
22 | |
23 | NO WARRANTY |
24 | THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR |
25 | CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT |
26 | LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, |
27 | MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is |
28 | solely responsible for determining the appropriateness of using and |
29 | distributing the Program and assumes all risks associated with its |
30 | exercise of rights under this Agreement, including but not limited to |
31 | the risks and costs of program errors, damage to or loss of data, |
32 | programs or equipment, and unavailability or interruption of operations. |
33 | |
34 | DISCLAIMER OF LIABILITY |
35 | NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY |
36 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
37 | DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND |
38 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR |
39 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE |
40 | USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED |
41 | HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES |
42 | |
43 | You should have received a copy of the GNU General Public License |
44 | along with this program; if not, write to the Free Software |
45 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
46 | */ |
47 | |
48 | #ifndef MPTCTL_H_INCLUDED |
49 | #define MPTCTL_H_INCLUDED |
50 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
51 | |
52 | |
53 | |
54 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
55 | /* |
56 | * |
57 | */ |
58 | #define MPT_MISCDEV_BASENAME "mptctl" |
59 | #define MPT_MISCDEV_PATHNAME "/dev/" MPT_MISCDEV_BASENAME |
60 | |
61 | #define MPT_PRODUCT_LENGTH 12 |
62 | |
63 | /* |
64 | * Generic MPT Control IOCTLs and structures |
65 | */ |
66 | #define MPT_MAGIC_NUMBER 'm' |
67 | |
68 | #define MPTRWPERF _IOWR(MPT_MAGIC_NUMBER,0,struct mpt_raw_r_w) |
69 | |
70 | #define MPTFWDOWNLOAD _IOWR(MPT_MAGIC_NUMBER,15,struct mpt_fw_xfer) |
71 | #define MPTCOMMAND _IOWR(MPT_MAGIC_NUMBER,20,struct mpt_ioctl_command) |
72 | |
73 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) |
74 | #define MPTFWDOWNLOAD32 _IOWR(MPT_MAGIC_NUMBER,15,struct mpt_fw_xfer32) |
75 | #define MPTCOMMAND32 _IOWR(MPT_MAGIC_NUMBER,20,struct mpt_ioctl_command32) |
76 | #endif |
77 | |
78 | #define MPTIOCINFO _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo) |
79 | #define MPTIOCINFO1 _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo_rev0) |
80 | #define MPTIOCINFO2 _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo_rev1) |
81 | #define MPTTARGETINFO _IOWR(MPT_MAGIC_NUMBER,18,struct mpt_ioctl_targetinfo) |
82 | #define MPTTEST _IOWR(MPT_MAGIC_NUMBER,19,struct mpt_ioctl_test) |
83 | #define MPTEVENTQUERY _IOWR(MPT_MAGIC_NUMBER,21,struct mpt_ioctl_eventquery) |
84 | #define MPTEVENTENABLE _IOWR(MPT_MAGIC_NUMBER,22,struct mpt_ioctl_eventenable) |
85 | #define MPTEVENTREPORT _IOWR(MPT_MAGIC_NUMBER,23,struct mpt_ioctl_eventreport) |
86 | #define MPTHARDRESET _IOWR(MPT_MAGIC_NUMBER,24,struct mpt_ioctl_diag_reset) |
87 | #define MPTFWREPLACE _IOWR(MPT_MAGIC_NUMBER,25,struct mpt_ioctl_replace_fw) |
88 | |
89 | /* |
90 | * SPARC PLATFORM REMARKS: |
91 | * IOCTL data structures that contain pointers |
92 | * will have different sizes in the driver and applications |
93 | * (as the app. will not use 8-byte pointers). |
94 | * Apps should use MPTFWDOWNLOAD and MPTCOMMAND. |
95 | * The driver will convert data from |
96 | * mpt_fw_xfer32 (mpt_ioctl_command32) to mpt_fw_xfer (mpt_ioctl_command) |
97 | * internally. |
98 | * |
99 | * If data structures change size, must handle as in IOCGETINFO. |
100 | */ |
101 | struct mpt_fw_xfer { |
102 | unsigned int iocnum; /* IOC unit number */ |
103 | unsigned int fwlen; |
104 | void __user *bufp; /* Pointer to firmware buffer */ |
105 | }; |
106 | |
107 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) |
108 | struct mpt_fw_xfer32 { |
109 | unsigned int iocnum; |
110 | unsigned int fwlen; |
111 | u32 bufp; |
112 | }; |
113 | #endif /*}*/ |
114 | |
115 | /* |
116 | * IOCTL header structure. |
117 | * iocnum - must be defined. |
118 | * port - must be defined for all IOCTL commands other than MPTIOCINFO |
119 | * maxDataSize - ignored on MPTCOMMAND commands |
120 | * - ignored on MPTFWREPLACE commands |
121 | * - on query commands, reports the maximum number of bytes to be returned |
122 | * to the host driver (count includes the header). |
123 | * That is, set to sizeof(struct mpt_ioctl_iocinfo) for fixed sized commands. |
124 | * Set to sizeof(struct mpt_ioctl_targetinfo) + datasize for variable |
125 | * sized commands. (MPTTARGETINFO, MPTEVENTREPORT) |
126 | */ |
127 | typedef struct { |
128 | unsigned int ; /* IOC unit number */ |
129 | unsigned int ; /* IOC port number */ |
130 | int ; /* Maximum Num. bytes to transfer on read */ |
131 | } ; |
132 | |
133 | /* |
134 | * Issue a diagnostic reset |
135 | */ |
136 | struct mpt_ioctl_diag_reset { |
137 | mpt_ioctl_header hdr; |
138 | }; |
139 | |
140 | |
141 | /* |
142 | * PCI bus/device/function information structure. |
143 | */ |
144 | struct mpt_ioctl_pci_info { |
145 | union { |
146 | struct { |
147 | unsigned int deviceNumber : 5; |
148 | unsigned int functionNumber : 3; |
149 | unsigned int busNumber : 24; |
150 | } bits; |
151 | unsigned int asUlong; |
152 | } u; |
153 | }; |
154 | |
155 | struct mpt_ioctl_pci_info2 { |
156 | union { |
157 | struct { |
158 | unsigned int deviceNumber : 5; |
159 | unsigned int functionNumber : 3; |
160 | unsigned int busNumber : 24; |
161 | } bits; |
162 | unsigned int asUlong; |
163 | } u; |
164 | int segmentID; |
165 | }; |
166 | |
167 | /* |
168 | * Adapter Information Page |
169 | * Read only. |
170 | * Data starts at offset 0xC |
171 | */ |
172 | #define MPT_IOCTL_INTERFACE_SCSI (0x00) |
173 | #define MPT_IOCTL_INTERFACE_FC (0x01) |
174 | #define MPT_IOCTL_INTERFACE_FC_IP (0x02) |
175 | #define MPT_IOCTL_INTERFACE_SAS (0x03) |
176 | #define MPT_IOCTL_VERSION_LENGTH (32) |
177 | |
178 | struct mpt_ioctl_iocinfo { |
179 | mpt_ioctl_header hdr; |
180 | int adapterType; /* SCSI or FCP */ |
181 | int port; /* port number */ |
182 | int pciId; /* PCI Id. */ |
183 | int hwRev; /* hardware revision */ |
184 | int subSystemDevice; /* PCI subsystem Device ID */ |
185 | int subSystemVendor; /* PCI subsystem Vendor ID */ |
186 | int numDevices; /* number of devices */ |
187 | int FWVersion; /* FW Version (integer) */ |
188 | int BIOSVersion; /* BIOS Version (integer) */ |
189 | char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ |
190 | char busChangeEvent; |
191 | char hostId; |
192 | char rsvd[2]; |
193 | struct mpt_ioctl_pci_info2 pciInfo; /* Added Rev 2 */ |
194 | }; |
195 | |
196 | struct mpt_ioctl_iocinfo_rev1 { |
197 | mpt_ioctl_header hdr; |
198 | int adapterType; /* SCSI or FCP */ |
199 | int port; /* port number */ |
200 | int pciId; /* PCI Id. */ |
201 | int hwRev; /* hardware revision */ |
202 | int subSystemDevice; /* PCI subsystem Device ID */ |
203 | int subSystemVendor; /* PCI subsystem Vendor ID */ |
204 | int numDevices; /* number of devices */ |
205 | int FWVersion; /* FW Version (integer) */ |
206 | int BIOSVersion; /* BIOS Version (integer) */ |
207 | char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ |
208 | char busChangeEvent; |
209 | char hostId; |
210 | char rsvd[2]; |
211 | struct mpt_ioctl_pci_info pciInfo; /* Added Rev 1 */ |
212 | }; |
213 | |
214 | /* Original structure, must always accept these |
215 | * IOCTLs. 4 byte pads can occur based on arch with |
216 | * above structure. Wish to re-align, but cannot. |
217 | */ |
218 | struct mpt_ioctl_iocinfo_rev0 { |
219 | mpt_ioctl_header hdr; |
220 | int adapterType; /* SCSI or FCP */ |
221 | int port; /* port number */ |
222 | int pciId; /* PCI Id. */ |
223 | int hwRev; /* hardware revision */ |
224 | int subSystemDevice; /* PCI subsystem Device ID */ |
225 | int subSystemVendor; /* PCI subsystem Vendor ID */ |
226 | int numDevices; /* number of devices */ |
227 | int FWVersion; /* FW Version (integer) */ |
228 | int BIOSVersion; /* BIOS Version (integer) */ |
229 | char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ |
230 | char busChangeEvent; |
231 | char hostId; |
232 | char rsvd[2]; |
233 | }; |
234 | |
235 | /* |
236 | * Device Information Page |
237 | * Report the number of, and ids of, all targets |
238 | * on this IOC. The ids array is a packed structure |
239 | * of the known targetInfo. |
240 | * bits 31-24: reserved |
241 | * 23-16: LUN |
242 | * 15- 8: Bus Number |
243 | * 7- 0: Target ID |
244 | */ |
245 | struct mpt_ioctl_targetinfo { |
246 | mpt_ioctl_header hdr; |
247 | int numDevices; /* Num targets on this ioc */ |
248 | int targetInfo[1]; |
249 | }; |
250 | |
251 | |
252 | /* |
253 | * Event reporting IOCTL's. These IOCTL's will |
254 | * use the following defines: |
255 | */ |
256 | struct mpt_ioctl_eventquery { |
257 | mpt_ioctl_header hdr; |
258 | unsigned short eventEntries; |
259 | unsigned short reserved; |
260 | unsigned int eventTypes; |
261 | }; |
262 | |
263 | struct mpt_ioctl_eventenable { |
264 | mpt_ioctl_header hdr; |
265 | unsigned int eventTypes; |
266 | }; |
267 | |
268 | #ifndef __KERNEL__ |
269 | typedef struct { |
270 | uint event; |
271 | uint eventContext; |
272 | uint data[2]; |
273 | } MPT_IOCTL_EVENTS; |
274 | #endif |
275 | |
276 | struct mpt_ioctl_eventreport { |
277 | mpt_ioctl_header hdr; |
278 | MPT_IOCTL_EVENTS eventData[1]; |
279 | }; |
280 | |
281 | #define MPT_MAX_NAME 32 |
282 | struct mpt_ioctl_test { |
283 | mpt_ioctl_header hdr; |
284 | u8 name[MPT_MAX_NAME]; |
285 | int chip_type; |
286 | u8 product [MPT_PRODUCT_LENGTH]; |
287 | }; |
288 | |
289 | /* Replace the FW image cached in host driver memory |
290 | * newImageSize - image size in bytes |
291 | * newImage - first byte of the new image |
292 | */ |
293 | typedef struct mpt_ioctl_replace_fw { |
294 | mpt_ioctl_header hdr; |
295 | int newImageSize; |
296 | u8 newImage[1]; |
297 | } mpt_ioctl_replace_fw_t; |
298 | |
299 | /* General MPT Pass through data strucutre |
300 | * |
301 | * iocnum |
302 | * timeout - in seconds, command timeout. If 0, set by driver to |
303 | * default value. |
304 | * replyFrameBufPtr - reply location |
305 | * dataInBufPtr - destination for read |
306 | * dataOutBufPtr - data source for write |
307 | * senseDataPtr - sense data location |
308 | * maxReplyBytes - maximum number of reply bytes to be sent to app. |
309 | * dataInSize - num bytes for data transfer in (read) |
310 | * dataOutSize - num bytes for data transfer out (write) |
311 | * dataSgeOffset - offset in words from the start of the request message |
312 | * to the first SGL |
313 | * MF[1]; |
314 | * |
315 | * Remark: Some config pages have bi-directional transfer, |
316 | * both a read and a write. The basic structure allows for |
317 | * a bidirectional set up. Normal messages will have one or |
318 | * both of these buffers NULL. |
319 | */ |
320 | struct mpt_ioctl_command { |
321 | mpt_ioctl_header hdr; |
322 | int timeout; /* optional (seconds) */ |
323 | char __user *replyFrameBufPtr; |
324 | char __user *dataInBufPtr; |
325 | char __user *dataOutBufPtr; |
326 | char __user *senseDataPtr; |
327 | int maxReplyBytes; |
328 | int dataInSize; |
329 | int dataOutSize; |
330 | int maxSenseBytes; |
331 | int dataSgeOffset; |
332 | char MF[1]; |
333 | }; |
334 | |
335 | /* |
336 | * SPARC PLATFORM: See earlier remark. |
337 | */ |
338 | #if defined(__KERNEL__) && defined(CONFIG_COMPAT) |
339 | struct mpt_ioctl_command32 { |
340 | mpt_ioctl_header hdr; |
341 | int timeout; |
342 | u32 replyFrameBufPtr; |
343 | u32 dataInBufPtr; |
344 | u32 dataOutBufPtr; |
345 | u32 senseDataPtr; |
346 | int maxReplyBytes; |
347 | int dataInSize; |
348 | int dataOutSize; |
349 | int maxSenseBytes; |
350 | int dataSgeOffset; |
351 | char MF[1]; |
352 | }; |
353 | #endif /*}*/ |
354 | |
355 | |
356 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
357 | |
358 | #define CPQFCTS_IOC_MAGIC 'Z' |
359 | #define HP_IOC_MAGIC 'Z' |
360 | #define HP_GETHOSTINFO _IOR(HP_IOC_MAGIC, 20, hp_host_info_t) |
361 | #define HP_GETHOSTINFO1 _IOR(HP_IOC_MAGIC, 20, hp_host_info_rev0_t) |
362 | #define HP_GETTARGETINFO _IOR(HP_IOC_MAGIC, 21, hp_target_info_t) |
363 | |
364 | typedef struct { |
365 | unsigned int ; |
366 | unsigned int ; |
367 | unsigned int ; |
368 | unsigned int ; |
369 | unsigned int ; |
370 | } ; |
371 | |
372 | /* |
373 | * Header: |
374 | * iocnum required (input) |
375 | * host ignored |
376 | * channe ignored |
377 | * id ignored |
378 | * lun ignored |
379 | */ |
380 | typedef struct _hp_host_info { |
381 | hp_header_t hdr; |
382 | u16 vendor; |
383 | u16 device; |
384 | u16 subsystem_vendor; |
385 | u16 subsystem_id; |
386 | u8 devfn; |
387 | u8 bus; |
388 | ushort host_no; /* SCSI Host number, if scsi driver not loaded*/ |
389 | u8 fw_version[16]; /* string */ |
390 | u8 serial_number[24]; /* string */ |
391 | u32 ioc_status; |
392 | u32 bus_phys_width; |
393 | u32 base_io_addr; |
394 | u32 rsvd; |
395 | unsigned int hard_resets; /* driver initiated resets */ |
396 | unsigned int soft_resets; /* ioc, external resets */ |
397 | unsigned int timeouts; /* num timeouts */ |
398 | } hp_host_info_t; |
399 | |
400 | /* replace ulongs with uints, need to preserve backwards |
401 | * compatibility. |
402 | */ |
403 | typedef struct _hp_host_info_rev0 { |
404 | hp_header_t hdr; |
405 | u16 vendor; |
406 | u16 device; |
407 | u16 subsystem_vendor; |
408 | u16 subsystem_id; |
409 | u8 devfn; |
410 | u8 bus; |
411 | ushort host_no; /* SCSI Host number, if scsi driver not loaded*/ |
412 | u8 fw_version[16]; /* string */ |
413 | u8 serial_number[24]; /* string */ |
414 | u32 ioc_status; |
415 | u32 bus_phys_width; |
416 | u32 base_io_addr; |
417 | u32 rsvd; |
418 | unsigned long hard_resets; /* driver initiated resets */ |
419 | unsigned long soft_resets; /* ioc, external resets */ |
420 | unsigned long timeouts; /* num timeouts */ |
421 | } hp_host_info_rev0_t; |
422 | |
423 | /* |
424 | * Header: |
425 | * iocnum required (input) |
426 | * host required |
427 | * channel required (bus number) |
428 | * id required |
429 | * lun ignored |
430 | * |
431 | * All error values between 0 and 0xFFFF in size. |
432 | */ |
433 | typedef struct _hp_target_info { |
434 | hp_header_t hdr; |
435 | u32 parity_errors; |
436 | u32 phase_errors; |
437 | u32 select_timeouts; |
438 | u32 message_rejects; |
439 | u32 negotiated_speed; |
440 | u8 negotiated_width; |
441 | u8 rsvd[7]; /* 8 byte alignment */ |
442 | } hp_target_info_t; |
443 | |
444 | #define HP_STATUS_OTHER 1 |
445 | #define HP_STATUS_OK 2 |
446 | #define HP_STATUS_FAILED 3 |
447 | |
448 | #define HP_BUS_WIDTH_UNK 1 |
449 | #define HP_BUS_WIDTH_8 2 |
450 | #define HP_BUS_WIDTH_16 3 |
451 | #define HP_BUS_WIDTH_32 4 |
452 | |
453 | #define HP_DEV_SPEED_ASYNC 2 |
454 | #define HP_DEV_SPEED_FAST 3 |
455 | #define HP_DEV_SPEED_ULTRA 4 |
456 | #define HP_DEV_SPEED_ULTRA2 5 |
457 | #define HP_DEV_SPEED_ULTRA160 6 |
458 | #define HP_DEV_SPEED_SCSI1 7 |
459 | #define HP_DEV_SPEED_ULTRA320 8 |
460 | |
461 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
462 | |
463 | |
464 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
465 | |
466 | #endif |
467 | |
468 | |