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