1#ifndef CCISS_CMD_H 2#define CCISS_CMD_H 3 4#include <linux/cciss_defs.h> 5 6/* DEFINES */ 7#define CISS_VERSION "1.00" 8 9/* general boundary definitions */ 10#define MAXSGENTRIES 32 11#define CCISS_SG_CHAIN 0x80000000 12#define MAXREPLYQS 256 13 14/* Unit Attentions ASC's as defined for the MSA2012sa */ 15#define POWER_OR_RESET 0x29 16#define STATE_CHANGED 0x2a 17#define UNIT_ATTENTION_CLEARED 0x2f 18#define LUN_FAILED 0x3e 19#define REPORT_LUNS_CHANGED 0x3f 20 21/* Unit Attentions ASCQ's as defined for the MSA2012sa */ 22 23 /* These ASCQ's defined for ASC = POWER_OR_RESET */ 24#define POWER_ON_RESET 0x00 25#define POWER_ON_REBOOT 0x01 26#define SCSI_BUS_RESET 0x02 27#define MSA_TARGET_RESET 0x03 28#define CONTROLLER_FAILOVER 0x04 29#define TRANSCEIVER_SE 0x05 30#define TRANSCEIVER_LVD 0x06 31 32 /* These ASCQ's defined for ASC = STATE_CHANGED */ 33#define RESERVATION_PREEMPTED 0x03 34#define ASYM_ACCESS_CHANGED 0x06 35#define LUN_CAPACITY_CHANGED 0x09 36 37/* config space register offsets */ 38#define CFG_VENDORID 0x00 39#define CFG_DEVICEID 0x02 40#define CFG_I2OBAR 0x10 41#define CFG_MEM1BAR 0x14 42 43/* i2o space register offsets */ 44#define I2O_IBDB_SET 0x20 45#define I2O_IBDB_CLEAR 0x70 46#define I2O_INT_STATUS 0x30 47#define I2O_INT_MASK 0x34 48#define I2O_IBPOST_Q 0x40 49#define I2O_OBPOST_Q 0x44 50#define I2O_DMA1_CFG 0x214 51 52/* Configuration Table */ 53#define CFGTBL_ChangeReq 0x00000001l 54#define CFGTBL_AccCmds 0x00000001l 55#define DOORBELL_CTLR_RESET 0x00000004l 56 57#define CFGTBL_Trans_Simple 0x00000002l 58#define CFGTBL_Trans_Performant 0x00000004l 59 60#define CFGTBL_BusType_Ultra2 0x00000001l 61#define CFGTBL_BusType_Ultra3 0x00000002l 62#define CFGTBL_BusType_Fibre1G 0x00000100l 63#define CFGTBL_BusType_Fibre2G 0x00000200l 64typedef struct _vals32 65{ 66 __u32 lower; 67 __u32 upper; 68} vals32; 69 70typedef union _u64bit 71{ 72 vals32 val32; 73 __u64 val; 74} u64bit; 75 76/* Type defs used in the following structs */ 77#define QWORD vals32 78 79/* STRUCTURES */ 80#define CISS_MAX_PHYS_LUN 1024 81/* SCSI-3 Cmmands */ 82 83#pragma pack(1) 84 85#define CISS_INQUIRY 0x12 86/* Date returned */ 87typedef struct _InquiryData_struct 88{ 89 BYTE data_byte[36]; 90} InquiryData_struct; 91 92#define CISS_REPORT_LOG 0xc2 /* Report Logical LUNs */ 93#define CISS_REPORT_PHYS 0xc3 /* Report Physical LUNs */ 94/* Data returned */ 95typedef struct _ReportLUNdata_struct 96{ 97 BYTE LUNListLength[4]; 98 DWORD reserved; 99 BYTE LUN[CISS_MAX_LUN][8]; 100} ReportLunData_struct; 101 102#define CCISS_READ_CAPACITY 0x25 /* Read Capacity */ 103typedef struct _ReadCapdata_struct 104{ 105 BYTE total_size[4]; /* Total size in blocks */ 106 BYTE block_size[4]; /* Size of blocks in bytes */ 107} ReadCapdata_struct; 108 109#define CCISS_READ_CAPACITY_16 0x9e /* Read Capacity 16 */ 110 111/* service action to differentiate a 16 byte read capacity from 112 other commands that use the 0x9e SCSI op code */ 113 114#define CCISS_READ_CAPACITY_16_SERVICE_ACT 0x10 115 116typedef struct _ReadCapdata_struct_16 117{ 118 BYTE total_size[8]; /* Total size in blocks */ 119 BYTE block_size[4]; /* Size of blocks in bytes */ 120 BYTE prot_en:1; /* protection enable bit */ 121 BYTE rto_en:1; /* reference tag own enable bit */ 122 BYTE reserved:6; /* reserved bits */ 123 BYTE reserved2[18]; /* reserved bytes per spec */ 124} ReadCapdata_struct_16; 125 126/* Define the supported read/write commands for cciss based controllers */ 127 128#define CCISS_READ_10 0x28 /* Read(10) */ 129#define CCISS_WRITE_10 0x2a /* Write(10) */ 130#define CCISS_READ_16 0x88 /* Read(16) */ 131#define CCISS_WRITE_16 0x8a /* Write(16) */ 132 133/* Define the CDB lengths supported by cciss based controllers */ 134 135#define CDB_LEN10 10 136#define CDB_LEN16 16 137 138/* BMIC commands */ 139#define BMIC_READ 0x26 140#define BMIC_WRITE 0x27 141#define BMIC_CACHE_FLUSH 0xc2 142#define CCISS_CACHE_FLUSH 0x01 /* C2 was already being used by CCISS */ 143 144/* Command List Structure */ 145#define CTLR_LUNID "\0\0\0\0\0\0\0\0" 146 147typedef struct _CommandListHeader_struct { 148 BYTE ReplyQueue; 149 BYTE SGList; 150 HWORD SGTotal; 151 QWORD Tag; 152 LUNAddr_struct LUN; 153} CommandListHeader_struct; 154typedef struct _ErrDescriptor_struct { 155 QWORD Addr; 156 DWORD Len; 157} ErrDescriptor_struct; 158typedef struct _SGDescriptor_struct { 159 QWORD Addr; 160 DWORD Len; 161 DWORD Ext; 162} SGDescriptor_struct; 163 164/* Command types */ 165#define CMD_RWREQ 0x00 166#define CMD_IOCTL_PEND 0x01 167#define CMD_SCSI 0x03 168#define CMD_MSG_DONE 0x04 169#define CMD_MSG_TIMEOUT 0x05 170#define CMD_MSG_STALE 0xff 171 172/* This structure needs to be divisible by COMMANDLIST_ALIGNMENT 173 * because low bits of the address are used to to indicate that 174 * whether the tag contains an index or an address. PAD_32 and 175 * PAD_64 can be adjusted independently as needed for 32-bit 176 * and 64-bits systems. 177 */ 178#define COMMANDLIST_ALIGNMENT (32) 179#define IS_64_BIT ((sizeof(long) - 4)/4) 180#define IS_32_BIT (!IS_64_BIT) 181#define PAD_32 (0) 182#define PAD_64 (4) 183#define PADSIZE (IS_32_BIT * PAD_32 + IS_64_BIT * PAD_64) 184#define DIRECT_LOOKUP_BIT 0x10 185#define DIRECT_LOOKUP_SHIFT 5 186 187typedef struct _CommandList_struct { 188 CommandListHeader_struct Header; 189 RequestBlock_struct Request; 190 ErrDescriptor_struct ErrDesc; 191 SGDescriptor_struct SG[MAXSGENTRIES]; 192 /* information associated with the command */ 193 __u32 busaddr; /* physical address of this record */ 194 ErrorInfo_struct * err_info; /* pointer to the allocated mem */ 195 int ctlr; 196 int cmd_type; 197 long cmdindex; 198 struct hlist_node list; 199 struct request * rq; 200 struct completion *waiting; 201 int retry_count; 202 void * scsi_cmd; 203 char pad[PADSIZE]; 204} CommandList_struct; 205 206/* Configuration Table Structure */ 207typedef struct _HostWrite_struct { 208 DWORD TransportRequest; 209 DWORD Reserved; 210 DWORD CoalIntDelay; 211 DWORD CoalIntCount; 212} HostWrite_struct; 213 214typedef struct _CfgTable_struct { 215 BYTE Signature[4]; 216 DWORD SpecValence; 217#define SIMPLE_MODE 0x02 218#define PERFORMANT_MODE 0x04 219#define MEMQ_MODE 0x08 220 DWORD TransportSupport; 221 DWORD TransportActive; 222 HostWrite_struct HostWrite; 223 DWORD CmdsOutMax; 224 DWORD BusTypes; 225 DWORD TransMethodOffset; 226 BYTE ServerName[16]; 227 DWORD HeartBeat; 228 DWORD SCSI_Prefetch; 229 DWORD MaxSGElements; 230 DWORD MaxLogicalUnits; 231 DWORD MaxPhysicalDrives; 232 DWORD MaxPhysicalDrivesPerLogicalUnit; 233 DWORD MaxPerformantModeCommands; 234 u8 reserved[0x78 - 0x58]; 235 u32 misc_fw_support; /* offset 0x78 */ 236#define MISC_FW_DOORBELL_RESET (0x02) 237} CfgTable_struct; 238 239struct TransTable_struct { 240 u32 BlockFetch0; 241 u32 BlockFetch1; 242 u32 BlockFetch2; 243 u32 BlockFetch3; 244 u32 BlockFetch4; 245 u32 BlockFetch5; 246 u32 BlockFetch6; 247 u32 BlockFetch7; 248 u32 RepQSize; 249 u32 RepQCount; 250 u32 RepQCtrAddrLow32; 251 u32 RepQCtrAddrHigh32; 252 u32 RepQAddr0Low32; 253 u32 RepQAddr0High32; 254}; 255 256#pragma pack() 257#endif /* CCISS_CMD_H */ 258