cciss_cmd.h 6.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2
#ifndef CCISS_CMD_H
#define CCISS_CMD_H
3 4 5

#include <linux/cciss_defs.h>

D
dann frazier 已提交
6
/* DEFINES */
L
Linus Torvalds 已提交
7 8
#define CISS_VERSION "1.00"

D
dann frazier 已提交
9
/* general boundary definitions */
10 11
#define MAXSGENTRIES            32
#define CCISS_SG_CHAIN          0x80000000
L
Linus Torvalds 已提交
12 13
#define MAXREPLYQS              256

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/* Unit Attentions ASC's as defined for the MSA2012sa */
#define POWER_OR_RESET			0x29
#define STATE_CHANGED			0x2a
#define UNIT_ATTENTION_CLEARED		0x2f
#define LUN_FAILED			0x3e
#define REPORT_LUNS_CHANGED		0x3f

/* Unit Attentions ASCQ's as defined for the MSA2012sa */

	/* These ASCQ's defined for ASC = POWER_OR_RESET */
#define POWER_ON_RESET			0x00
#define POWER_ON_REBOOT			0x01
#define SCSI_BUS_RESET			0x02
#define MSA_TARGET_RESET		0x03
#define CONTROLLER_FAILOVER		0x04
#define TRANSCEIVER_SE			0x05
#define TRANSCEIVER_LVD			0x06

	/* These ASCQ's defined for ASC = STATE_CHANGED */
#define RESERVATION_PREEMPTED		0x03
#define ASYM_ACCESS_CHANGED		0x06
#define LUN_CAPACITY_CHANGED		0x09

D
dann frazier 已提交
37
/* config space register offsets */
L
Linus Torvalds 已提交
38 39 40 41 42
#define CFG_VENDORID            0x00
#define CFG_DEVICEID            0x02
#define CFG_I2OBAR              0x10
#define CFG_MEM1BAR             0x14

D
dann frazier 已提交
43
/* i2o space register offsets */
L
Linus Torvalds 已提交
44 45 46 47 48 49
#define I2O_IBDB_SET            0x20
#define I2O_IBDB_CLEAR          0x70
#define I2O_INT_STATUS          0x30
#define I2O_INT_MASK            0x34
#define I2O_IBPOST_Q            0x40
#define I2O_OBPOST_Q            0x44
50
#define I2O_DMA1_CFG		0x214
L
Linus Torvalds 已提交
51

D
dann frazier 已提交
52
/* Configuration Table */
L
Linus Torvalds 已提交
53 54
#define CFGTBL_ChangeReq        0x00000001l
#define CFGTBL_AccCmds          0x00000001l
S
Stephen M. Cameron 已提交
55
#define DOORBELL_CTLR_RESET     0x00000004l
L
Linus Torvalds 已提交
56 57

#define CFGTBL_Trans_Simple     0x00000002l
58
#define CFGTBL_Trans_Performant 0x00000004l
L
Linus Torvalds 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

#define CFGTBL_BusType_Ultra2   0x00000001l
#define CFGTBL_BusType_Ultra3   0x00000002l
#define CFGTBL_BusType_Fibre1G  0x00000100l
#define CFGTBL_BusType_Fibre2G  0x00000200l
typedef struct _vals32
{
        __u32   lower;
        __u32   upper;
} vals32;

typedef union _u64bit
{
   vals32	val32;
   __u64	val;
} u64bit;

D
dann frazier 已提交
76
/* Type defs used in the following structs */
L
Linus Torvalds 已提交
77 78
#define QWORD vals32 

D
dann frazier 已提交
79
/* STRUCTURES */
L
Linus Torvalds 已提交
80
#define CISS_MAX_PHYS_LUN	1024
D
dann frazier 已提交
81
/* SCSI-3 Cmmands */
L
Linus Torvalds 已提交
82 83 84 85

#pragma pack(1)	

#define CISS_INQUIRY 0x12
D
dann frazier 已提交
86
/* Date returned */
L
Linus Torvalds 已提交
87 88 89 90 91 92 93
typedef struct _InquiryData_struct
{
  BYTE data_byte[36];
} InquiryData_struct;

#define CISS_REPORT_LOG 0xc2    /* Report Logical LUNs */
#define CISS_REPORT_PHYS 0xc3   /* Report Physical LUNs */
D
dann frazier 已提交
94
/* Data returned */
L
Linus Torvalds 已提交
95 96 97 98 99 100 101 102 103 104
typedef struct _ReportLUNdata_struct
{
  BYTE LUNListLength[4];
  DWORD reserved;
  BYTE LUN[CISS_MAX_LUN][8];
} ReportLunData_struct;

#define CCISS_READ_CAPACITY 0x25 /* Read Capacity */ 
typedef struct _ReadCapdata_struct
{
D
dann frazier 已提交
105 106
  BYTE total_size[4];	/* Total size in blocks */
  BYTE block_size[4];	/* Size of blocks in bytes */
L
Linus Torvalds 已提交
107 108
} ReadCapdata_struct;

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
#define CCISS_READ_CAPACITY_16 0x9e /* Read Capacity 16 */

/* service action to differentiate a 16 byte read capacity from
   other commands that use the 0x9e SCSI op code */

#define CCISS_READ_CAPACITY_16_SERVICE_ACT 0x10

typedef struct _ReadCapdata_struct_16
{
	BYTE total_size[8];   /* Total size in blocks */
	BYTE block_size[4];   /* Size of blocks in bytes */
	BYTE prot_en:1;       /* protection enable bit */
	BYTE rto_en:1;        /* reference tag own enable bit */
	BYTE reserved:6;      /* reserved bits */
	BYTE reserved2[18];   /* reserved bytes per spec */
} ReadCapdata_struct_16;

/* Define the supported read/write commands for cciss based controllers */

#define CCISS_READ_10   0x28    /* Read(10)  */
#define CCISS_WRITE_10  0x2a    /* Write(10) */
#define CCISS_READ_16   0x88    /* Read(16)  */
#define CCISS_WRITE_16  0x8a    /* Write(16) */

/* Define the CDB lengths supported by cciss based controllers */

#define CDB_LEN10	10
#define CDB_LEN16	16
L
Linus Torvalds 已提交
137

D
dann frazier 已提交
138
/* BMIC commands */
L
Linus Torvalds 已提交
139 140 141
#define BMIC_READ 0x26
#define BMIC_WRITE 0x27
#define BMIC_CACHE_FLUSH 0xc2
D
dann frazier 已提交
142
#define CCISS_CACHE_FLUSH 0x01	/* C2 was already being used by CCISS */
L
Linus Torvalds 已提交
143

D
dann frazier 已提交
144
/* Command List Structure */
145 146
#define CTLR_LUNID "\0\0\0\0\0\0\0\0"

L
Linus Torvalds 已提交
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
typedef struct _CommandListHeader_struct {
  BYTE              ReplyQueue;
  BYTE              SGList;
  HWORD             SGTotal;
  QWORD             Tag;
  LUNAddr_struct    LUN;
} CommandListHeader_struct;
typedef struct _ErrDescriptor_struct {
  QWORD  Addr;
  DWORD  Len;
} ErrDescriptor_struct;
typedef struct _SGDescriptor_struct {
  QWORD  Addr;
  DWORD  Len;
  DWORD  Ext;
} SGDescriptor_struct;

/* Command types */
#define CMD_RWREQ       0x00
#define CMD_IOCTL_PEND  0x01
#define CMD_SCSI	0x03
#define CMD_MSG_DONE	0x04
#define CMD_MSG_TIMEOUT 0x05
170
#define CMD_MSG_STALE	0xff
L
Linus Torvalds 已提交
171

172 173 174 175 176
/* This structure needs to be divisible by COMMANDLIST_ALIGNMENT
 * because low bits of the address are used to to indicate that
 * whether the tag contains an index or an address.  PAD_32 and
 * PAD_64 can be adjusted independently as needed for 32-bit
 * and 64-bits systems.
177
 */
178
#define COMMANDLIST_ALIGNMENT (32)
179 180
#define IS_64_BIT ((sizeof(long) - 4)/4)
#define IS_32_BIT (!IS_64_BIT)
181
#define PAD_32 (0)
182 183
#define PAD_64 (4)
#define PADSIZE (IS_32_BIT * PAD_32 + IS_64_BIT * PAD_64)
184 185 186
#define DIRECT_LOOKUP_BIT 0x10
#define DIRECT_LOOKUP_SHIFT 5

L
Linus Torvalds 已提交
187 188 189 190 191 192 193 194 195 196
typedef struct _CommandList_struct {
  CommandListHeader_struct Header;
  RequestBlock_struct      Request;
  ErrDescriptor_struct     ErrDesc;
  SGDescriptor_struct      SG[MAXSGENTRIES];
	/* information associated with the command */ 
  __u32			   busaddr; /* physical address of this record */
  ErrorInfo_struct * 	   err_info; /* pointer to the allocated mem */ 
  int			   ctlr;
  int			   cmd_type; 
197
  long			   cmdindex;
198
  struct list_head list;
L
Linus Torvalds 已提交
199 200 201 202
  struct request *	   rq;
  struct completion *waiting;
  int	 retry_count;
  void * scsi_cmd;
203
  char pad[PADSIZE];
L
Linus Torvalds 已提交
204 205
} CommandList_struct;

D
dann frazier 已提交
206
/* Configuration Table Structure */
L
Linus Torvalds 已提交
207 208 209 210 211 212 213 214 215 216
typedef struct _HostWrite_struct {
  DWORD TransportRequest;
  DWORD Reserved;
  DWORD CoalIntDelay;
  DWORD CoalIntCount;
} HostWrite_struct;

typedef struct _CfgTable_struct {
  BYTE             Signature[4];
  DWORD            SpecValence;
217 218 219
#define SIMPLE_MODE	0x02
#define PERFORMANT_MODE	0x04
#define MEMQ_MODE	0x08
L
Linus Torvalds 已提交
220 221 222 223 224
  DWORD            TransportSupport;
  DWORD            TransportActive;
  HostWrite_struct HostWrite;
  DWORD            CmdsOutMax;
  DWORD            BusTypes;
225
  DWORD            TransMethodOffset;
L
Linus Torvalds 已提交
226 227 228
  BYTE             ServerName[16];
  DWORD            HeartBeat;
  DWORD            SCSI_Prefetch;
229 230 231 232
  DWORD            MaxSGElements;
  DWORD            MaxLogicalUnits;
  DWORD            MaxPhysicalDrives;
  DWORD            MaxPhysicalDrivesPerLogicalUnit;
233
  DWORD            MaxPerformantModeCommands;
S
Stephen M. Cameron 已提交
234 235 236
  u8		   reserved[0x78 - 0x58];
  u32		   misc_fw_support; /* offset 0x78 */
#define MISC_FW_DOORBELL_RESET (0x02)
L
Linus Torvalds 已提交
237
} CfgTable_struct;
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

struct TransTable_struct {
  u32 BlockFetch0;
  u32 BlockFetch1;
  u32 BlockFetch2;
  u32 BlockFetch3;
  u32 BlockFetch4;
  u32 BlockFetch5;
  u32 BlockFetch6;
  u32 BlockFetch7;
  u32 RepQSize;
  u32 RepQCount;
  u32 RepQCtrAddrLow32;
  u32 RepQCtrAddrHigh32;
  u32 RepQAddr0Low32;
  u32 RepQAddr0High32;
};

L
Linus Torvalds 已提交
256
#pragma pack()	 
D
dann frazier 已提交
257
#endif /* CCISS_CMD_H */