1f619106bSadam radford /* 2f619106bSadam radford 3w-sas.h -- LSI 3ware SAS/SATA-RAID Controller device driver for Linux. 3f619106bSadam radford 42c9bce5bSadam radford Written By: Adam Radford <aradford@gmail.com> 5f619106bSadam radford 6f619106bSadam radford Copyright (C) 2009 LSI Corporation. 7f619106bSadam radford 8f619106bSadam radford This program is free software; you can redistribute it and/or modify 9f619106bSadam radford it under the terms of the GNU General Public License as published by 10f619106bSadam radford the Free Software Foundation; version 2 of the License. 11f619106bSadam radford 12f619106bSadam radford This program is distributed in the hope that it will be useful, 13f619106bSadam radford but WITHOUT ANY WARRANTY; without even the implied warranty of 14f619106bSadam radford MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15f619106bSadam radford GNU General Public License for more details. 16f619106bSadam radford 17f619106bSadam radford NO WARRANTY 18f619106bSadam radford THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR 19f619106bSadam radford CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT 20f619106bSadam radford LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, 21f619106bSadam radford MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is 22f619106bSadam radford solely responsible for determining the appropriateness of using and 23f619106bSadam radford distributing the Program and assumes all risks associated with its 24f619106bSadam radford exercise of rights under this Agreement, including but not limited to 25f619106bSadam radford the risks and costs of program errors, damage to or loss of data, 26f619106bSadam radford programs or equipment, and unavailability or interruption of operations. 27f619106bSadam radford 28f619106bSadam radford DISCLAIMER OF LIABILITY 29f619106bSadam radford NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY 30f619106bSadam radford DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31f619106bSadam radford DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND 32f619106bSadam radford ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 33f619106bSadam radford TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 34f619106bSadam radford USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED 35f619106bSadam radford HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 36f619106bSadam radford 37f619106bSadam radford You should have received a copy of the GNU General Public License 38f619106bSadam radford along with this program; if not, write to the Free Software 39f619106bSadam radford Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 40f619106bSadam radford 41f619106bSadam radford Bugs/Comments/Suggestions should be mailed to: 422c9bce5bSadam radford aradford@gmail.com 43f619106bSadam radford */ 44f619106bSadam radford 45f619106bSadam radford #ifndef _3W_SAS_H 46f619106bSadam radford #define _3W_SAS_H 47f619106bSadam radford 48f619106bSadam radford /* AEN severity table */ 49f619106bSadam radford static char *twl_aen_severity_table[] = 50f619106bSadam radford { 51f619106bSadam radford "None", "ERROR", "WARNING", "INFO", "DEBUG", NULL 52f619106bSadam radford }; 53f619106bSadam radford 54f619106bSadam radford /* Liberator register offsets */ 55f619106bSadam radford #define TWL_STATUS 0x0 /* Status */ 56f619106bSadam radford #define TWL_HIBDB 0x20 /* Inbound doorbell */ 57f619106bSadam radford #define TWL_HISTAT 0x30 /* Host interrupt status */ 58f619106bSadam radford #define TWL_HIMASK 0x34 /* Host interrupt mask */ 59f619106bSadam radford #define TWL_HOBDB 0x9C /* Outbound doorbell */ 60f619106bSadam radford #define TWL_HOBDBC 0xA0 /* Outbound doorbell clear */ 61f619106bSadam radford #define TWL_SCRPD3 0xBC /* Scratchpad */ 62f619106bSadam radford #define TWL_HIBQPL 0xC0 /* Host inbound Q low */ 63f619106bSadam radford #define TWL_HIBQPH 0xC4 /* Host inbound Q high */ 64f619106bSadam radford #define TWL_HOBQPL 0xC8 /* Host outbound Q low */ 65f619106bSadam radford #define TWL_HOBQPH 0xCC /* Host outbound Q high */ 66f619106bSadam radford #define TWL_HISTATUS_VALID_INTERRUPT 0xC 67f619106bSadam radford #define TWL_HISTATUS_ATTENTION_INTERRUPT 0x4 68f619106bSadam radford #define TWL_HISTATUS_RESPONSE_INTERRUPT 0x8 69f619106bSadam radford #define TWL_STATUS_OVERRUN_SUBMIT 0x2000 70f619106bSadam radford #define TWL_ISSUE_SOFT_RESET 0x100 71f619106bSadam radford #define TWL_CONTROLLER_READY 0x2000 72f619106bSadam radford #define TWL_DOORBELL_CONTROLLER_ERROR 0x200000 73f619106bSadam radford #define TWL_DOORBELL_ATTENTION_INTERRUPT 0x40000 74f619106bSadam radford #define TWL_PULL_MODE 0x1 75f619106bSadam radford 76f619106bSadam radford /* Command packet opcodes used by the driver */ 77f619106bSadam radford #define TW_OP_INIT_CONNECTION 0x1 78f619106bSadam radford #define TW_OP_GET_PARAM 0x12 79f619106bSadam radford #define TW_OP_SET_PARAM 0x13 80f619106bSadam radford #define TW_OP_EXECUTE_SCSI 0x10 81f619106bSadam radford 82f619106bSadam radford /* Asynchronous Event Notification (AEN) codes used by the driver */ 83f619106bSadam radford #define TW_AEN_QUEUE_EMPTY 0x0000 84f619106bSadam radford #define TW_AEN_SOFT_RESET 0x0001 85f619106bSadam radford #define TW_AEN_SYNC_TIME_WITH_HOST 0x031 86f619106bSadam radford #define TW_AEN_SEVERITY_ERROR 0x1 87f619106bSadam radford #define TW_AEN_SEVERITY_DEBUG 0x4 88f619106bSadam radford #define TW_AEN_NOT_RETRIEVED 0x1 89f619106bSadam radford 90f619106bSadam radford /* Command state defines */ 91f619106bSadam radford #define TW_S_INITIAL 0x1 /* Initial state */ 92f619106bSadam radford #define TW_S_STARTED 0x2 /* Id in use */ 93f619106bSadam radford #define TW_S_POSTED 0x4 /* Posted to the controller */ 94f619106bSadam radford #define TW_S_COMPLETED 0x8 /* Completed by isr */ 95f619106bSadam radford #define TW_S_FINISHED 0x10 /* I/O completely done */ 96f619106bSadam radford 97f619106bSadam radford /* Compatibility defines */ 98f619106bSadam radford #define TW_9750_ARCH_ID 10 99f619106bSadam radford #define TW_CURRENT_DRIVER_SRL 40 100f619106bSadam radford #define TW_CURRENT_DRIVER_BUILD 0 101f619106bSadam radford #define TW_CURRENT_DRIVER_BRANCH 0 102f619106bSadam radford 103f619106bSadam radford /* Misc defines */ 104f619106bSadam radford #define TW_SECTOR_SIZE 512 105f619106bSadam radford #define TW_MAX_UNITS 32 106f619106bSadam radford #define TW_INIT_MESSAGE_CREDITS 0x100 107f619106bSadam radford #define TW_INIT_COMMAND_PACKET_SIZE 0x3 108f619106bSadam radford #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED 0x6 109f619106bSadam radford #define TW_EXTENDED_INIT_CONNECT 0x2 110f619106bSadam radford #define TW_BASE_FW_SRL 24 111f619106bSadam radford #define TW_BASE_FW_BRANCH 0 112f619106bSadam radford #define TW_BASE_FW_BUILD 1 113f619106bSadam radford #define TW_Q_LENGTH 256 114f619106bSadam radford #define TW_Q_START 0 115f619106bSadam radford #define TW_MAX_SLOT 32 116f619106bSadam radford #define TW_MAX_RESET_TRIES 2 117f619106bSadam radford #define TW_MAX_CMDS_PER_LUN 254 118f619106bSadam radford #define TW_MAX_AEN_DRAIN 255 119f619106bSadam radford #define TW_IN_RESET 2 120f619106bSadam radford #define TW_USING_MSI 3 121f619106bSadam radford #define TW_IN_ATTENTION_LOOP 4 122f619106bSadam radford #define TW_MAX_SECTORS 256 123f619106bSadam radford #define TW_MAX_CDB_LEN 16 124f619106bSadam radford #define TW_IOCTL_CHRDEV_TIMEOUT 60 /* 60 seconds */ 125f619106bSadam radford #define TW_IOCTL_CHRDEV_FREE -1 126f619106bSadam radford #define TW_COMMAND_OFFSET 128 /* 128 bytes */ 127f619106bSadam radford #define TW_VERSION_TABLE 0x0402 128f619106bSadam radford #define TW_TIMEKEEP_TABLE 0x040A 129f619106bSadam radford #define TW_INFORMATION_TABLE 0x0403 130f619106bSadam radford #define TW_PARAM_FWVER 3 131f619106bSadam radford #define TW_PARAM_FWVER_LENGTH 16 132f619106bSadam radford #define TW_PARAM_BIOSVER 4 133f619106bSadam radford #define TW_PARAM_BIOSVER_LENGTH 16 134f619106bSadam radford #define TW_PARAM_MODEL 8 135f619106bSadam radford #define TW_PARAM_MODEL_LENGTH 16 136f619106bSadam radford #define TW_PARAM_PHY_SUMMARY_TABLE 1 137f619106bSadam radford #define TW_PARAM_PHYCOUNT 2 138f619106bSadam radford #define TW_PARAM_PHYCOUNT_LENGTH 1 139f619106bSadam radford #define TW_IOCTL_FIRMWARE_PASS_THROUGH 0x108 // Used by smartmontools 140f619106bSadam radford #define TW_ALLOCATION_LENGTH 128 141f619106bSadam radford #define TW_SENSE_DATA_LENGTH 18 142f619106bSadam radford #define TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED 0x10a 143f619106bSadam radford #define TW_ERROR_INVALID_FIELD_IN_CDB 0x10d 144f619106bSadam radford #define TW_ERROR_UNIT_OFFLINE 0x128 145f619106bSadam radford #define TW_MESSAGE_SOURCE_CONTROLLER_ERROR 3 146f619106bSadam radford #define TW_MESSAGE_SOURCE_CONTROLLER_EVENT 4 147f619106bSadam radford #define TW_DRIVER 6 148f619106bSadam radford #ifndef PCI_DEVICE_ID_3WARE_9750 149f619106bSadam radford #define PCI_DEVICE_ID_3WARE_9750 0x1010 150f619106bSadam radford #endif 151f619106bSadam radford 152f619106bSadam radford /* Bitmask macros to eliminate bitfields */ 153f619106bSadam radford 154f619106bSadam radford /* opcode: 5, reserved: 3 */ 155f619106bSadam radford #define TW_OPRES_IN(x,y) ((x << 5) | (y & 0x1f)) 156f619106bSadam radford #define TW_OP_OUT(x) (x & 0x1f) 157f619106bSadam radford 158f619106bSadam radford /* opcode: 5, sgloffset: 3 */ 159f619106bSadam radford #define TW_OPSGL_IN(x,y) ((x << 5) | (y & 0x1f)) 160f619106bSadam radford #define TW_SGL_OUT(x) ((x >> 5) & 0x7) 161f619106bSadam radford 162f619106bSadam radford /* severity: 3, reserved: 5 */ 163f619106bSadam radford #define TW_SEV_OUT(x) (x & 0x7) 164f619106bSadam radford 165f619106bSadam radford /* not_mfa: 1, reserved: 7, status: 8, request_id: 16 */ 166f619106bSadam radford #define TW_RESID_OUT(x) ((x >> 16) & 0xffff) 167f619106bSadam radford #define TW_NOTMFA_OUT(x) (x & 0x1) 168f619106bSadam radford 169f619106bSadam radford /* request_id: 12, lun: 4 */ 1701789671dSHannes Reinecke #define TW_REQ_LUN_IN(lun, request_id) \ 1711789671dSHannes Reinecke (((lun << 12) & 0xf000) | (request_id & 0xfff)) 172f619106bSadam radford #define TW_LUN_OUT(lun) ((lun >> 12) & 0xf) 173f619106bSadam radford 174f619106bSadam radford /* Register access macros */ 1751789671dSHannes Reinecke #define TWL_STATUS_REG_ADDR(x) \ 1761789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_STATUS) 1771789671dSHannes Reinecke #define TWL_HOBQPL_REG_ADDR(x) \ 1781789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HOBQPL) 1791789671dSHannes Reinecke #define TWL_HOBQPH_REG_ADDR(x) \ 1801789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HOBQPH) 1811789671dSHannes Reinecke #define TWL_HOBDB_REG_ADDR(x) \ 1821789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HOBDB) 1831789671dSHannes Reinecke #define TWL_HOBDBC_REG_ADDR(x) \ 1841789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HOBDBC) 1851789671dSHannes Reinecke #define TWL_HIMASK_REG_ADDR(x) \ 1861789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HIMASK) 1871789671dSHannes Reinecke #define TWL_HISTAT_REG_ADDR(x) \ 1881789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HISTAT) 1891789671dSHannes Reinecke #define TWL_HIBQPH_REG_ADDR(x) \ 1901789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HIBQPH) 1911789671dSHannes Reinecke #define TWL_HIBQPL_REG_ADDR(x) \ 1921789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HIBQPL) 1931789671dSHannes Reinecke #define TWL_HIBDB_REG_ADDR(x) \ 1941789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_HIBDB) 1951789671dSHannes Reinecke #define TWL_SCRPD3_REG_ADDR(x) \ 1961789671dSHannes Reinecke ((unsigned char __iomem *)x->base_addr + TWL_SCRPD3) 1971789671dSHannes Reinecke #define TWL_MASK_INTERRUPTS(x) \ 1981789671dSHannes Reinecke (writel(~0, TWL_HIMASK_REG_ADDR(tw_dev))) 1991789671dSHannes Reinecke #define TWL_UNMASK_INTERRUPTS(x) \ 2001789671dSHannes Reinecke (writel(~TWL_HISTATUS_VALID_INTERRUPT, TWL_HIMASK_REG_ADDR(tw_dev))) 2011789671dSHannes Reinecke #define TWL_CLEAR_DB_INTERRUPT(x) \ 2021789671dSHannes Reinecke (writel(~0, TWL_HOBDBC_REG_ADDR(tw_dev))) 2031789671dSHannes Reinecke #define TWL_SOFT_RESET(x) \ 2041789671dSHannes Reinecke (writel(TWL_ISSUE_SOFT_RESET, TWL_HIBDB_REG_ADDR(tw_dev))) 205f619106bSadam radford 206f619106bSadam radford /* Macros */ 207f619106bSadam radford #define TW_PRINTK(h,a,b,c) { \ 208f619106bSadam radford if (h) \ 209f619106bSadam radford printk(KERN_WARNING "3w-sas: scsi%d: ERROR: (0x%02X:0x%04X): %s.\n",h->host_no,a,b,c); \ 210f619106bSadam radford else \ 211f619106bSadam radford printk(KERN_WARNING "3w-sas: ERROR: (0x%02X:0x%04X): %s.\n",a,b,c); \ 212f619106bSadam radford } 213f619106bSadam radford #define TW_MAX_LUNS 16 214f619106bSadam radford #define TW_COMMAND_SIZE (sizeof(dma_addr_t) > 4 ? 6 : 4) 215f619106bSadam radford #define TW_LIBERATOR_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 46 : 92) 216f619106bSadam radford #define TW_LIBERATOR_MAX_SGL_LENGTH_OLD (sizeof(dma_addr_t) > 4 ? 47 : 94) 217f619106bSadam radford #define TW_PADDING_LENGTH_LIBERATOR 136 218f619106bSadam radford #define TW_PADDING_LENGTH_LIBERATOR_OLD 132 219f619106bSadam radford #define TW_CPU_TO_SGL(x) (sizeof(dma_addr_t) > 4 ? cpu_to_le64(x) : cpu_to_le32(x)) 220f619106bSadam radford 221f619106bSadam radford #pragma pack(1) 222f619106bSadam radford 223f619106bSadam radford /* SGL entry */ 224f619106bSadam radford typedef struct TAG_TW_SG_Entry_ISO { 225f619106bSadam radford dma_addr_t address; 226f619106bSadam radford dma_addr_t length; 227f619106bSadam radford } TW_SG_Entry_ISO; 228f619106bSadam radford 229f619106bSadam radford /* Old Command Packet with ISO SGL */ 230f619106bSadam radford typedef struct TW_Command { 231f619106bSadam radford unsigned char opcode__sgloffset; 232f619106bSadam radford unsigned char size; 233f619106bSadam radford unsigned char request_id; 234f619106bSadam radford unsigned char unit__hostid; 235f619106bSadam radford /* Second DWORD */ 236f619106bSadam radford unsigned char status; 237f619106bSadam radford unsigned char flags; 238f619106bSadam radford union { 239f619106bSadam radford unsigned short block_count; 240f619106bSadam radford unsigned short parameter_count; 241f619106bSadam radford } byte6_offset; 242f619106bSadam radford union { 243f619106bSadam radford struct { 244f619106bSadam radford u32 lba; 245f619106bSadam radford TW_SG_Entry_ISO sgl[TW_LIBERATOR_MAX_SGL_LENGTH_OLD]; 246f619106bSadam radford unsigned char padding[TW_PADDING_LENGTH_LIBERATOR_OLD]; 247f619106bSadam radford } io; 248f619106bSadam radford struct { 249f619106bSadam radford TW_SG_Entry_ISO sgl[TW_LIBERATOR_MAX_SGL_LENGTH_OLD]; 250f619106bSadam radford u32 padding; 251f619106bSadam radford unsigned char padding2[TW_PADDING_LENGTH_LIBERATOR_OLD]; 252f619106bSadam radford } param; 253f619106bSadam radford } byte8_offset; 254f619106bSadam radford } TW_Command; 255f619106bSadam radford 256f619106bSadam radford /* New Command Packet with ISO SGL */ 257f619106bSadam radford typedef struct TAG_TW_Command_Apache { 258f619106bSadam radford unsigned char opcode__reserved; 259f619106bSadam radford unsigned char unit; 260f619106bSadam radford unsigned short request_id__lunl; 261f619106bSadam radford unsigned char status; 262f619106bSadam radford unsigned char sgl_offset; 263f619106bSadam radford unsigned short sgl_entries__lunh; 264f619106bSadam radford unsigned char cdb[16]; 265f619106bSadam radford TW_SG_Entry_ISO sg_list[TW_LIBERATOR_MAX_SGL_LENGTH]; 266f619106bSadam radford unsigned char padding[TW_PADDING_LENGTH_LIBERATOR]; 267f619106bSadam radford } TW_Command_Apache; 268f619106bSadam radford 269f619106bSadam radford /* New command packet header */ 270f619106bSadam radford typedef struct TAG_TW_Command_Apache_Header { 271f619106bSadam radford unsigned char sense_data[TW_SENSE_DATA_LENGTH]; 272f619106bSadam radford struct { 273f619106bSadam radford char reserved[4]; 274f619106bSadam radford unsigned short error; 275f619106bSadam radford unsigned char padding; 276f619106bSadam radford unsigned char severity__reserved; 277f619106bSadam radford } status_block; 278f619106bSadam radford unsigned char err_specific_desc[98]; 279f619106bSadam radford struct { 280f619106bSadam radford unsigned char size_header; 281f619106bSadam radford unsigned short request_id; 282f619106bSadam radford unsigned char size_sense; 283f619106bSadam radford } header_desc; 284f619106bSadam radford } TW_Command_Apache_Header; 285f619106bSadam radford 286f619106bSadam radford /* This struct is a union of the 2 command packets */ 287f619106bSadam radford typedef struct TAG_TW_Command_Full { 288f619106bSadam radford TW_Command_Apache_Header header; 289f619106bSadam radford union { 290f619106bSadam radford TW_Command oldcommand; 291f619106bSadam radford TW_Command_Apache newcommand; 292f619106bSadam radford } command; 293f619106bSadam radford } TW_Command_Full; 294f619106bSadam radford 295f619106bSadam radford /* Initconnection structure */ 296f619106bSadam radford typedef struct TAG_TW_Initconnect { 297f619106bSadam radford unsigned char opcode__reserved; 298f619106bSadam radford unsigned char size; 299f619106bSadam radford unsigned char request_id; 300f619106bSadam radford unsigned char res2; 301f619106bSadam radford unsigned char status; 302f619106bSadam radford unsigned char flags; 303f619106bSadam radford unsigned short message_credits; 304f619106bSadam radford u32 features; 305f619106bSadam radford unsigned short fw_srl; 306f619106bSadam radford unsigned short fw_arch_id; 307f619106bSadam radford unsigned short fw_branch; 308f619106bSadam radford unsigned short fw_build; 309f619106bSadam radford u32 result; 310f619106bSadam radford } TW_Initconnect; 311f619106bSadam radford 312f619106bSadam radford /* Event info structure */ 313f619106bSadam radford typedef struct TAG_TW_Event 314f619106bSadam radford { 315f619106bSadam radford unsigned int sequence_id; 316f619106bSadam radford unsigned int time_stamp_sec; 317f619106bSadam radford unsigned short aen_code; 318f619106bSadam radford unsigned char severity; 319f619106bSadam radford unsigned char retrieved; 320f619106bSadam radford unsigned char repeat_count; 321f619106bSadam radford unsigned char parameter_len; 322f619106bSadam radford unsigned char parameter_data[98]; 323f619106bSadam radford } TW_Event; 324f619106bSadam radford 325f619106bSadam radford typedef struct TAG_TW_Ioctl_Driver_Command { 326f619106bSadam radford unsigned int control_code; 327f619106bSadam radford unsigned int status; 328f619106bSadam radford unsigned int unique_id; 329f619106bSadam radford unsigned int sequence_id; 330f619106bSadam radford unsigned int os_specific; 331f619106bSadam radford unsigned int buffer_length; 332f619106bSadam radford } TW_Ioctl_Driver_Command; 333f619106bSadam radford 334f619106bSadam radford typedef struct TAG_TW_Ioctl_Apache { 335f619106bSadam radford TW_Ioctl_Driver_Command driver_command; 336f619106bSadam radford char padding[488]; 337f619106bSadam radford TW_Command_Full firmware_command; 338*45b379f2SKees Cook char data_buffer[]; 339f619106bSadam radford } TW_Ioctl_Buf_Apache; 340f619106bSadam radford 341f619106bSadam radford /* GetParam descriptor */ 342f619106bSadam radford typedef struct { 343f619106bSadam radford unsigned short table_id; 344f619106bSadam radford unsigned short parameter_id; 345f619106bSadam radford unsigned short parameter_size_bytes; 346f619106bSadam radford unsigned short actual_parameter_size_bytes; 347*45b379f2SKees Cook unsigned char data[]; 348f619106bSadam radford } TW_Param_Apache; 349f619106bSadam radford 350f619106bSadam radford /* Compatibility information structure */ 351f619106bSadam radford typedef struct TAG_TW_Compatibility_Info 352f619106bSadam radford { 353f619106bSadam radford char driver_version[32]; 354f619106bSadam radford unsigned short working_srl; 355f619106bSadam radford unsigned short working_branch; 356f619106bSadam radford unsigned short working_build; 357f619106bSadam radford unsigned short driver_srl_high; 358f619106bSadam radford unsigned short driver_branch_high; 359f619106bSadam radford unsigned short driver_build_high; 360f619106bSadam radford unsigned short driver_srl_low; 361f619106bSadam radford unsigned short driver_branch_low; 362f619106bSadam radford unsigned short driver_build_low; 363f619106bSadam radford unsigned short fw_on_ctlr_srl; 364f619106bSadam radford unsigned short fw_on_ctlr_branch; 365f619106bSadam radford unsigned short fw_on_ctlr_build; 366f619106bSadam radford } TW_Compatibility_Info; 367f619106bSadam radford 368f619106bSadam radford #pragma pack() 369f619106bSadam radford 370f619106bSadam radford typedef struct TAG_TW_Device_Extension { 371f619106bSadam radford void __iomem *base_addr; 372f619106bSadam radford unsigned long *generic_buffer_virt[TW_Q_LENGTH]; 373f619106bSadam radford dma_addr_t generic_buffer_phys[TW_Q_LENGTH]; 374f619106bSadam radford TW_Command_Full *command_packet_virt[TW_Q_LENGTH]; 375f619106bSadam radford dma_addr_t command_packet_phys[TW_Q_LENGTH]; 376f619106bSadam radford TW_Command_Apache_Header *sense_buffer_virt[TW_Q_LENGTH]; 377f619106bSadam radford dma_addr_t sense_buffer_phys[TW_Q_LENGTH]; 378f619106bSadam radford struct pci_dev *tw_pci_dev; 379f619106bSadam radford struct scsi_cmnd *srb[TW_Q_LENGTH]; 380f619106bSadam radford unsigned char free_queue[TW_Q_LENGTH]; 381f619106bSadam radford unsigned char free_head; 382f619106bSadam radford unsigned char free_tail; 383f619106bSadam radford int state[TW_Q_LENGTH]; 384f619106bSadam radford unsigned int posted_request_count; 385f619106bSadam radford unsigned int max_posted_request_count; 386f619106bSadam radford unsigned int max_sgl_entries; 387f619106bSadam radford unsigned int sgl_entries; 388f619106bSadam radford unsigned int num_resets; 389f619106bSadam radford unsigned int sector_count; 390f619106bSadam radford unsigned int max_sector_count; 391f619106bSadam radford unsigned int aen_count; 392f619106bSadam radford struct Scsi_Host *host; 393f619106bSadam radford long flags; 394f619106bSadam radford TW_Event *event_queue[TW_Q_LENGTH]; 395f619106bSadam radford unsigned char error_index; 396f619106bSadam radford unsigned int error_sequence_id; 397f619106bSadam radford int chrdev_request_id; 398f619106bSadam radford wait_queue_head_t ioctl_wqueue; 399f619106bSadam radford struct mutex ioctl_lock; 400f619106bSadam radford TW_Compatibility_Info tw_compat_info; 401f619106bSadam radford char online; 402f619106bSadam radford } TW_Device_Extension; 403f619106bSadam radford 404f619106bSadam radford #endif /* _3W_SAS_H */ 405f619106bSadam radford 406