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