3w-sas.h 14 KB

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