| /* | |
| * linux/drivers/message/fusion/mptioctl.h | |
| * Fusion MPT misc device (ioctl) driver. | |
| * For use with PCI chip/adapter(s): | |
| * LSIFC9xx/LSI409xx Fibre Channel | |
| * running LSI Fusion MPT (Message Passing Technology) firmware. | |
| * | |
| * Copyright (c) 1999-2008 LSI Corporation | |
| * (mailto:DL-MPTFusionLinux@lsi.com) | |
| * | |
| */ | |
| /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
| /* | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; version 2 of the License. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| NO WARRANTY | |
| THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR | |
| CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT | |
| LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, | |
| MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is | |
| solely responsible for determining the appropriateness of using and | |
| distributing the Program and assumes all risks associated with its | |
| exercise of rights under this Agreement, including but not limited to | |
| the risks and costs of program errors, damage to or loss of data, | |
| programs or equipment, and unavailability or interruption of operations. | |
| DISCLAIMER OF LIABILITY | |
| NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY | |
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND | |
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR | |
| TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE | |
| USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED | |
| HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES | |
| You should have received a copy of the GNU General Public License | |
| along with this program; if not, write to the Free Software | |
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #ifndef MPTCTL_H_INCLUDED | |
| #define MPTCTL_H_INCLUDED | |
| /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
| /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
| /* | |
| * | |
| */ | |
| #define MPT_MISCDEV_BASENAME "mptctl" | |
| #define MPT_MISCDEV_PATHNAME "/dev/" MPT_MISCDEV_BASENAME | |
| #define MPT_PRODUCT_LENGTH 12 | |
| /* | |
| * Generic MPT Control IOCTLs and structures | |
| */ | |
| #define MPT_MAGIC_NUMBER 'm' | |
| #define MPTRWPERF _IOWR(MPT_MAGIC_NUMBER,0,struct mpt_raw_r_w) | |
| #define MPTFWDOWNLOAD _IOWR(MPT_MAGIC_NUMBER,15,struct mpt_fw_xfer) | |
| #define MPTCOMMAND _IOWR(MPT_MAGIC_NUMBER,20,struct mpt_ioctl_command) | |
| #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | |
| #define MPTFWDOWNLOAD32 _IOWR(MPT_MAGIC_NUMBER,15,struct mpt_fw_xfer32) | |
| #define MPTCOMMAND32 _IOWR(MPT_MAGIC_NUMBER,20,struct mpt_ioctl_command32) | |
| #endif | |
| #define MPTIOCINFO _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo) | |
| #define MPTIOCINFO1 _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo_rev0) | |
| #define MPTIOCINFO2 _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo_rev1) | |
| #define MPTTARGETINFO _IOWR(MPT_MAGIC_NUMBER,18,struct mpt_ioctl_targetinfo) | |
| #define MPTTEST _IOWR(MPT_MAGIC_NUMBER,19,struct mpt_ioctl_test) | |
| #define MPTEVENTQUERY _IOWR(MPT_MAGIC_NUMBER,21,struct mpt_ioctl_eventquery) | |
| #define MPTEVENTENABLE _IOWR(MPT_MAGIC_NUMBER,22,struct mpt_ioctl_eventenable) | |
| #define MPTEVENTREPORT _IOWR(MPT_MAGIC_NUMBER,23,struct mpt_ioctl_eventreport) | |
| #define MPTHARDRESET _IOWR(MPT_MAGIC_NUMBER,24,struct mpt_ioctl_diag_reset) | |
| #define MPTFWREPLACE _IOWR(MPT_MAGIC_NUMBER,25,struct mpt_ioctl_replace_fw) | |
| /* | |
| * SPARC PLATFORM REMARKS: | |
| * IOCTL data structures that contain pointers | |
| * will have different sizes in the driver and applications | |
| * (as the app. will not use 8-byte pointers). | |
| * Apps should use MPTFWDOWNLOAD and MPTCOMMAND. | |
| * The driver will convert data from | |
| * mpt_fw_xfer32 (mpt_ioctl_command32) to mpt_fw_xfer (mpt_ioctl_command) | |
| * internally. | |
| * | |
| * If data structures change size, must handle as in IOCGETINFO. | |
| */ | |
| struct mpt_fw_xfer { | |
| unsigned int iocnum; /* IOC unit number */ | |
| unsigned int fwlen; | |
| void __user *bufp; /* Pointer to firmware buffer */ | |
| }; | |
| #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | |
| struct mpt_fw_xfer32 { | |
| unsigned int iocnum; | |
| unsigned int fwlen; | |
| u32 bufp; | |
| }; | |
| #endif /*}*/ | |
| /* | |
| * IOCTL header structure. | |
| * iocnum - must be defined. | |
| * port - must be defined for all IOCTL commands other than MPTIOCINFO | |
| * maxDataSize - ignored on MPTCOMMAND commands | |
| * - ignored on MPTFWREPLACE commands | |
| * - on query commands, reports the maximum number of bytes to be returned | |
| * to the host driver (count includes the header). | |
| * That is, set to sizeof(struct mpt_ioctl_iocinfo) for fixed sized commands. | |
| * Set to sizeof(struct mpt_ioctl_targetinfo) + datasize for variable | |
| * sized commands. (MPTTARGETINFO, MPTEVENTREPORT) | |
| */ | |
| typedef struct _mpt_ioctl_header { | |
| unsigned int iocnum; /* IOC unit number */ | |
| unsigned int port; /* IOC port number */ | |
| int maxDataSize; /* Maximum Num. bytes to transfer on read */ | |
| } mpt_ioctl_header; | |
| /* | |
| * Issue a diagnostic reset | |
| */ | |
| struct mpt_ioctl_diag_reset { | |
| mpt_ioctl_header hdr; | |
| }; | |
| /* | |
| * PCI bus/device/function information structure. | |
| */ | |
| struct mpt_ioctl_pci_info { | |
| union { | |
| struct { | |
| unsigned int deviceNumber : 5; | |
| unsigned int functionNumber : 3; | |
| unsigned int busNumber : 24; | |
| } bits; | |
| unsigned int asUlong; | |
| } u; | |
| }; | |
| struct mpt_ioctl_pci_info2 { | |
| union { | |
| struct { | |
| unsigned int deviceNumber : 5; | |
| unsigned int functionNumber : 3; | |
| unsigned int busNumber : 24; | |
| } bits; | |
| unsigned int asUlong; | |
| } u; | |
| int segmentID; | |
| }; | |
| /* | |
| * Adapter Information Page | |
| * Read only. | |
| * Data starts at offset 0xC | |
| */ | |
| #define MPT_IOCTL_INTERFACE_SCSI (0x00) | |
| #define MPT_IOCTL_INTERFACE_FC (0x01) | |
| #define MPT_IOCTL_INTERFACE_FC_IP (0x02) | |
| #define MPT_IOCTL_INTERFACE_SAS (0x03) | |
| #define MPT_IOCTL_VERSION_LENGTH (32) | |
| struct mpt_ioctl_iocinfo { | |
| mpt_ioctl_header hdr; | |
| int adapterType; /* SCSI or FCP */ | |
| int port; /* port number */ | |
| int pciId; /* PCI Id. */ | |
| int hwRev; /* hardware revision */ | |
| int subSystemDevice; /* PCI subsystem Device ID */ | |
| int subSystemVendor; /* PCI subsystem Vendor ID */ | |
| int numDevices; /* number of devices */ | |
| int FWVersion; /* FW Version (integer) */ | |
| int BIOSVersion; /* BIOS Version (integer) */ | |
| char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ | |
| char busChangeEvent; | |
| char hostId; | |
| char rsvd[2]; | |
| struct mpt_ioctl_pci_info2 pciInfo; /* Added Rev 2 */ | |
| }; | |
| struct mpt_ioctl_iocinfo_rev1 { | |
| mpt_ioctl_header hdr; | |
| int adapterType; /* SCSI or FCP */ | |
| int port; /* port number */ | |
| int pciId; /* PCI Id. */ | |
| int hwRev; /* hardware revision */ | |
| int subSystemDevice; /* PCI subsystem Device ID */ | |
| int subSystemVendor; /* PCI subsystem Vendor ID */ | |
| int numDevices; /* number of devices */ | |
| int FWVersion; /* FW Version (integer) */ | |
| int BIOSVersion; /* BIOS Version (integer) */ | |
| char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ | |
| char busChangeEvent; | |
| char hostId; | |
| char rsvd[2]; | |
| struct mpt_ioctl_pci_info pciInfo; /* Added Rev 1 */ | |
| }; | |
| /* Original structure, must always accept these | |
| * IOCTLs. 4 byte pads can occur based on arch with | |
| * above structure. Wish to re-align, but cannot. | |
| */ | |
| struct mpt_ioctl_iocinfo_rev0 { | |
| mpt_ioctl_header hdr; | |
| int adapterType; /* SCSI or FCP */ | |
| int port; /* port number */ | |
| int pciId; /* PCI Id. */ | |
| int hwRev; /* hardware revision */ | |
| int subSystemDevice; /* PCI subsystem Device ID */ | |
| int subSystemVendor; /* PCI subsystem Vendor ID */ | |
| int numDevices; /* number of devices */ | |
| int FWVersion; /* FW Version (integer) */ | |
| int BIOSVersion; /* BIOS Version (integer) */ | |
| char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ | |
| char busChangeEvent; | |
| char hostId; | |
| char rsvd[2]; | |
| }; | |
| /* | |
| * Device Information Page | |
| * Report the number of, and ids of, all targets | |
| * on this IOC. The ids array is a packed structure | |
| * of the known targetInfo. | |
| * bits 31-24: reserved | |
| * 23-16: LUN | |
| * 15- 8: Bus Number | |
| * 7- 0: Target ID | |
| */ | |
| struct mpt_ioctl_targetinfo { | |
| mpt_ioctl_header hdr; | |
| int numDevices; /* Num targets on this ioc */ | |
| int targetInfo[1]; | |
| }; | |
| /* | |
| * Event reporting IOCTL's. These IOCTL's will | |
| * use the following defines: | |
| */ | |
| struct mpt_ioctl_eventquery { | |
| mpt_ioctl_header hdr; | |
| unsigned short eventEntries; | |
| unsigned short reserved; | |
| unsigned int eventTypes; | |
| }; | |
| struct mpt_ioctl_eventenable { | |
| mpt_ioctl_header hdr; | |
| unsigned int eventTypes; | |
| }; | |
| #ifndef __KERNEL__ | |
| typedef struct { | |
| uint event; | |
| uint eventContext; | |
| uint data[2]; | |
| } MPT_IOCTL_EVENTS; | |
| #endif | |
| struct mpt_ioctl_eventreport { | |
| mpt_ioctl_header hdr; | |
| MPT_IOCTL_EVENTS eventData[1]; | |
| }; | |
| #define MPT_MAX_NAME 32 | |
| struct mpt_ioctl_test { | |
| mpt_ioctl_header hdr; | |
| u8 name[MPT_MAX_NAME]; | |
| int chip_type; | |
| u8 product [MPT_PRODUCT_LENGTH]; | |
| }; | |
| /* Replace the FW image cached in host driver memory | |
| * newImageSize - image size in bytes | |
| * newImage - first byte of the new image | |
| */ | |
| typedef struct mpt_ioctl_replace_fw { | |
| mpt_ioctl_header hdr; | |
| int newImageSize; | |
| u8 newImage[1]; | |
| } mpt_ioctl_replace_fw_t; | |
| /* General MPT Pass through data strucutre | |
| * | |
| * iocnum | |
| * timeout - in seconds, command timeout. If 0, set by driver to | |
| * default value. | |
| * replyFrameBufPtr - reply location | |
| * dataInBufPtr - destination for read | |
| * dataOutBufPtr - data source for write | |
| * senseDataPtr - sense data location | |
| * maxReplyBytes - maximum number of reply bytes to be sent to app. | |
| * dataInSize - num bytes for data transfer in (read) | |
| * dataOutSize - num bytes for data transfer out (write) | |
| * dataSgeOffset - offset in words from the start of the request message | |
| * to the first SGL | |
| * MF[1]; | |
| * | |
| * Remark: Some config pages have bi-directional transfer, | |
| * both a read and a write. The basic structure allows for | |
| * a bidirectional set up. Normal messages will have one or | |
| * both of these buffers NULL. | |
| */ | |
| struct mpt_ioctl_command { | |
| mpt_ioctl_header hdr; | |
| int timeout; /* optional (seconds) */ | |
| char __user *replyFrameBufPtr; | |
| char __user *dataInBufPtr; | |
| char __user *dataOutBufPtr; | |
| char __user *senseDataPtr; | |
| int maxReplyBytes; | |
| int dataInSize; | |
| int dataOutSize; | |
| int maxSenseBytes; | |
| int dataSgeOffset; | |
| char MF[1]; | |
| }; | |
| /* | |
| * SPARC PLATFORM: See earlier remark. | |
| */ | |
| #if defined(__KERNEL__) && defined(CONFIG_COMPAT) | |
| struct mpt_ioctl_command32 { | |
| mpt_ioctl_header hdr; | |
| int timeout; | |
| u32 replyFrameBufPtr; | |
| u32 dataInBufPtr; | |
| u32 dataOutBufPtr; | |
| u32 senseDataPtr; | |
| int maxReplyBytes; | |
| int dataInSize; | |
| int dataOutSize; | |
| int maxSenseBytes; | |
| int dataSgeOffset; | |
| char MF[1]; | |
| }; | |
| #endif /*}*/ | |
| /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
| #define CPQFCTS_IOC_MAGIC 'Z' | |
| #define HP_IOC_MAGIC 'Z' | |
| #define HP_GETHOSTINFO _IOR(HP_IOC_MAGIC, 20, hp_host_info_t) | |
| #define HP_GETHOSTINFO1 _IOR(HP_IOC_MAGIC, 20, hp_host_info_rev0_t) | |
| #define HP_GETTARGETINFO _IOR(HP_IOC_MAGIC, 21, hp_target_info_t) | |
| typedef struct _hp_header { | |
| unsigned int iocnum; | |
| unsigned int host; | |
| unsigned int channel; | |
| unsigned int id; | |
| unsigned int lun; | |
| } hp_header_t; | |
| /* | |
| * Header: | |
| * iocnum required (input) | |
| * host ignored | |
| * channe ignored | |
| * id ignored | |
| * lun ignored | |
| */ | |
| typedef struct _hp_host_info { | |
| hp_header_t hdr; | |
| u16 vendor; | |
| u16 device; | |
| u16 subsystem_vendor; | |
| u16 subsystem_id; | |
| u8 devfn; | |
| u8 bus; | |
| ushort host_no; /* SCSI Host number, if scsi driver not loaded*/ | |
| u8 fw_version[16]; /* string */ | |
| u8 serial_number[24]; /* string */ | |
| u32 ioc_status; | |
| u32 bus_phys_width; | |
| u32 base_io_addr; | |
| u32 rsvd; | |
| unsigned int hard_resets; /* driver initiated resets */ | |
| unsigned int soft_resets; /* ioc, external resets */ | |
| unsigned int timeouts; /* num timeouts */ | |
| } hp_host_info_t; | |
| /* replace ulongs with uints, need to preserve backwards | |
| * compatibility. | |
| */ | |
| typedef struct _hp_host_info_rev0 { | |
| hp_header_t hdr; | |
| u16 vendor; | |
| u16 device; | |
| u16 subsystem_vendor; | |
| u16 subsystem_id; | |
| u8 devfn; | |
| u8 bus; | |
| ushort host_no; /* SCSI Host number, if scsi driver not loaded*/ | |
| u8 fw_version[16]; /* string */ | |
| u8 serial_number[24]; /* string */ | |
| u32 ioc_status; | |
| u32 bus_phys_width; | |
| u32 base_io_addr; | |
| u32 rsvd; | |
| unsigned long hard_resets; /* driver initiated resets */ | |
| unsigned long soft_resets; /* ioc, external resets */ | |
| unsigned long timeouts; /* num timeouts */ | |
| } hp_host_info_rev0_t; | |
| /* | |
| * Header: | |
| * iocnum required (input) | |
| * host required | |
| * channel required (bus number) | |
| * id required | |
| * lun ignored | |
| * | |
| * All error values between 0 and 0xFFFF in size. | |
| */ | |
| typedef struct _hp_target_info { | |
| hp_header_t hdr; | |
| u32 parity_errors; | |
| u32 phase_errors; | |
| u32 select_timeouts; | |
| u32 message_rejects; | |
| u32 negotiated_speed; | |
| u8 negotiated_width; | |
| u8 rsvd[7]; /* 8 byte alignment */ | |
| } hp_target_info_t; | |
| #define HP_STATUS_OTHER 1 | |
| #define HP_STATUS_OK 2 | |
| #define HP_STATUS_FAILED 3 | |
| #define HP_BUS_WIDTH_UNK 1 | |
| #define HP_BUS_WIDTH_8 2 | |
| #define HP_BUS_WIDTH_16 3 | |
| #define HP_BUS_WIDTH_32 4 | |
| #define HP_DEV_SPEED_ASYNC 2 | |
| #define HP_DEV_SPEED_FAST 3 | |
| #define HP_DEV_SPEED_ULTRA 4 | |
| #define HP_DEV_SPEED_ULTRA2 5 | |
| #define HP_DEV_SPEED_ULTRA160 6 | |
| #define HP_DEV_SPEED_SCSI1 7 | |
| #define HP_DEV_SPEED_ULTRA320 8 | |
| /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
| /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | |
| #endif | |