sbp2.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * sbp2.h - Defines and prototypes for sbp2.c
  3.  *
  4.  * Copyright (C) 2000 James Goodwin, Filanet Corporation (www.filanet.com)
  5.  * jamesg@filanet.com
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software Foundation,
  19.  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  20.  */
  21. #ifndef SBP2_H
  22. #define SBP2_H
  23. /* Some compatibility code */
  24. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
  25. #define SCSI_REGISTER_HOST(tmpl) scsi_register_module(MODULE_SCSI_HA, tmpl)
  26. #define SCSI_UNREGISTER_HOST(tmpl) scsi_unregister_module(MODULE_SCSI_HA, tmpl)
  27. #else
  28. #define SCSI_REGISTER_HOST(tmpl) scsi_register_host(tmpl)
  29. #define SCSI_UNREGISTER_HOST(tmpl) scsi_unregister_host(tmpl)
  30. #endif
  31. #define SBP2_DEVICE_NAME "sbp2"
  32. #define SBP2_DEVICE_NAME_SIZE 4
  33. /*
  34.  * SBP2 specific structures and defines
  35.  */
  36. #define ORB_FMT_CMD 0x0
  37. #define ORB_FMT_DUMMY 0x3
  38. #define ORB_DIRECTION_WRITE_TO_MEDIA    0x0
  39. #define ORB_DIRECTION_READ_FROM_MEDIA   0x1
  40. #define ORB_DIRECTION_NO_DATA_TRANSFER  0x2
  41. #define ORB_SET_NULL_PTR(value) ((value & 0x1) << 31)
  42. #define ORB_SET_NOTIFY(value)                   ((value & 0x1) << 31)
  43. #define ORB_SET_RQ_FMT(value)                   ((value & 0x3) << 29)
  44. #define ORB_SET_NODE_ID(value) ((value & 0xffff) << 16)
  45. struct sbp2_dummy_orb {
  46. volatile u32 next_ORB_hi;
  47. volatile u32 next_ORB_lo;
  48. u32 reserved1;
  49.         u32 reserved2;
  50. u32 notify_rq_fmt;
  51. u8 command_block[12];
  52. };
  53. #define ORB_SET_DATA_SIZE(value)                (value & 0xffff)
  54. #define ORB_SET_PAGE_SIZE(value)                ((value & 0x7) << 16)
  55. #define ORB_SET_PAGE_TABLE_PRESENT(value)       ((value & 0x1) << 19)
  56. #define ORB_SET_MAX_PAYLOAD(value)              ((value & 0xf) << 20)
  57. #define ORB_SET_SPEED(value)                    ((value & 0x7) << 24)
  58. #define ORB_SET_DIRECTION(value)                ((value & 0x1) << 27)
  59. struct sbp2_command_orb {
  60. volatile u32 next_ORB_hi;
  61. volatile u32 next_ORB_lo;
  62. u32 data_descriptor_hi;
  63. u32 data_descriptor_lo;
  64. u32 misc;
  65. u8 cdb[12];
  66. };
  67. #define LOGIN_REQUEST 0x0
  68. #define QUERY_LOGINS_REQUEST 0x1
  69. #define RECONNECT_REQUEST 0x3
  70. #define SET_PASSWORD_REQUEST 0x4
  71. #define LOGOUT_REQUEST 0x7
  72. #define ABORT_TASK_REQUEST 0xb
  73. #define ABORT_TASK_SET 0xc
  74. #define LOGICAL_UNIT_RESET 0xe
  75. #define TARGET_RESET_REQUEST 0xf
  76. #define ORB_SET_LUN(value)                      (value & 0xffff)
  77. #define ORB_SET_FUNCTION(value)                 ((value & 0xf) << 16)
  78. #define ORB_SET_RECONNECT(value)                ((value & 0xf) << 20)
  79. #define ORB_SET_EXCLUSIVE(value)                ((value & 0x1) << 28)
  80. #define ORB_SET_LOGIN_RESP_LENGTH(value)        (value & 0xffff)
  81. #define ORB_SET_PASSWD_LENGTH(value)            ((value & 0xffff) << 16)
  82. struct sbp2_login_orb {
  83. u32 password_hi;
  84. u32 password_lo;
  85. u32 login_response_hi;
  86. u32 login_response_lo;
  87. u32 lun_misc;
  88. u32 passwd_resp_lengths;
  89. u32 status_FIFO_hi;
  90. u32 status_FIFO_lo;
  91. };
  92. #define RESPONSE_GET_LOGIN_ID(value)            (value & 0xffff)
  93. #define RESPONSE_GET_LENGTH(value)              ((value >> 16) & 0xffff)
  94. #define RESPONSE_GET_RECONNECT_HOLD(value)      (value & 0xffff)
  95. struct sbp2_login_response {
  96. u32 length_login_ID;
  97. u32 command_block_agent_hi;
  98. u32 command_block_agent_lo;
  99. u32 reconnect_hold;
  100. };
  101. #define ORB_SET_LOGIN_ID(value)                 (value & 0xffff)
  102. struct sbp2_reconnect_orb {
  103. u32 reserved1;
  104. u32 reserved2;
  105.         u32 reserved3;
  106.         u32 reserved4;
  107. u32 login_ID_misc;
  108. u32 reserved5;
  109. u32 status_FIFO_hi;
  110. u32 status_FIFO_lo;
  111. };
  112. struct sbp2_logout_orb {
  113. u32 reserved1;
  114. u32 reserved2;
  115.         u32 reserved3;
  116.         u32 reserved4;
  117. u32 login_ID_misc;
  118. u32 reserved5;
  119. u32 status_FIFO_hi;
  120. u32 status_FIFO_lo;
  121. };
  122. #define PAGE_TABLE_SET_SEGMENT_BASE_HI(value)   (value & 0xffff)
  123. #define PAGE_TABLE_SET_SEGMENT_LENGTH(value)    ((value & 0xffff) << 16)
  124. struct sbp2_unrestricted_page_table {
  125. u32 length_segment_base_hi;
  126. u32 segment_base_lo;
  127. };
  128. #define RESP_STATUS_REQUEST_COMPLETE 0x0
  129. #define RESP_STATUS_TRANSPORT_FAILURE 0x1
  130. #define RESP_STATUS_ILLEGAL_REQUEST 0x2
  131. #define RESP_STATUS_VENDOR_DEPENDENT 0x3
  132. #define SBP2_STATUS_NO_ADDITIONAL_INFO 0x0
  133. #define SBP2_STATUS_REQ_TYPE_NOT_SUPPORTED 0x1
  134. #define SBP2_STATUS_SPEED_NOT_SUPPORTED 0x2
  135. #define SBP2_STATUS_PAGE_SIZE_NOT_SUPPORTED 0x3
  136. #define SBP2_STATUS_ACCESS_DENIED 0x4
  137. #define SBP2_STATUS_LU_NOT_SUPPORTED 0x5
  138. #define SBP2_STATUS_MAX_PAYLOAD_TOO_SMALL 0x6
  139. #define SBP2_STATUS_RESOURCES_UNAVAILABLE 0x8
  140. #define SBP2_STATUS_FUNCTION_REJECTED 0x9
  141. #define SBP2_STATUS_LOGIN_ID_NOT_RECOGNIZED 0xa
  142. #define SBP2_STATUS_DUMMY_ORB_COMPLETED 0xb
  143. #define SBP2_STATUS_REQUEST_ABORTED 0xc
  144. #define SBP2_STATUS_UNSPECIFIED_ERROR 0xff
  145. #define SFMT_CURRENT_ERROR 0x0
  146. #define SFMT_DEFERRED_ERROR 0x1
  147. #define SFMT_VENDOR_DEPENDENT_STATUS 0x3
  148. #define SBP2_SCSI_STATUS_GOOD 0x0
  149. #define SBP2_SCSI_STATUS_CHECK_CONDITION 0x2
  150. #define SBP2_SCSI_STATUS_CONDITION_MET 0x4
  151. #define SBP2_SCSI_STATUS_BUSY 0x8
  152. #define SBP2_SCSI_STATUS_RESERVATION_CONFLICT 0x18
  153. #define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22
  154. #define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff
  155. #define STATUS_GET_ORB_OFFSET_HI(value)         (value & 0xffff)
  156. #define STATUS_GET_SBP_STATUS(value)            ((value >> 16) & 0xff)
  157. #define STATUS_GET_LENGTH(value)                ((value >> 24) & 0x7)
  158. #define STATUS_GET_DEAD_BIT(value)              ((value >> 27) & 0x1)
  159. #define STATUS_GET_RESP(value)                  ((value >> 28) & 0x3)
  160. #define STATUS_GET_SRC(value)                   ((value >> 30) & 0x3)
  161. struct sbp2_status_block {
  162. u32 ORB_offset_hi_misc;
  163. u32 ORB_offset_lo;
  164.         u8 command_set_dependent[24];
  165. };
  166. /*
  167.  * Miscellaneous SBP2 related config rom defines
  168.  */
  169. /* 
  170.  * The status fifo address definition below is used as a status base, with a chunk
  171.  * separately assigned for each sbp2 device detected. For example, 0xfffe00000000ULL 
  172.  * is used for the first sbp2 device detected, 0xfffe00000020ULL for the next sbp2 
  173.  * device, and so on.
  174.  *
  175.  * Note: We could use a single status fifo address for all sbp2 devices, and figure 
  176.  * out which sbp2 device the status belongs to by looking at the source node id of
  177.  * the status write... but, using separate addresses for each sbp2 device allows for
  178.  * better code and the ability to support multiple luns within a single 1394 node.
  179.  *
  180.  * Also note that we choose the address range below as it is a region specified for
  181.  * write posting, where the ohci controller will automatically send an ack_complete
  182.  * when the status is written by the sbp2 device... saving a split transaction.   =)
  183.  */ 
  184. #define SBP2_STATUS_FIFO_ADDRESS 0xfffe00000000ULL
  185. #define SBP2_STATUS_FIFO_ADDRESS_HI                             0xfffe
  186. #define SBP2_STATUS_FIFO_ADDRESS_LO                             0x0
  187. #define SBP2_STATUS_FIFO_ENTRY_TO_OFFSET(entry) ((entry) << 5)
  188. #define SBP2_STATUS_FIFO_OFFSET_TO_ENTRY(offset) ((offset) >> 5)
  189. #define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1
  190. #define SBP2_CSR_OFFSET_KEY 0x54
  191. #define SBP2_UNIT_SPEC_ID_KEY 0x12
  192. #define SBP2_UNIT_SW_VERSION_KEY 0x13
  193. #define SBP2_COMMAND_SET_SPEC_ID_KEY 0x38
  194. #define SBP2_COMMAND_SET_KEY 0x39
  195. #define SBP2_UNIT_CHARACTERISTICS_KEY 0x3a
  196. #define SBP2_DEVICE_TYPE_AND_LUN_KEY 0x14
  197. #define SBP2_FIRMWARE_REVISION_KEY 0x3c
  198. #define SBP2_DEVICE_TYPE(q) (((q) >> 16) & 0x1f)
  199. #define SBP2_DEVICE_LUN(q) ((q) & 0xffff)
  200. #define SBP2_AGENT_STATE_OFFSET 0x00ULL
  201. #define SBP2_AGENT_RESET_OFFSET 0x04ULL
  202. #define SBP2_ORB_POINTER_OFFSET 0x08ULL
  203. #define SBP2_DOORBELL_OFFSET 0x10ULL
  204. #define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET 0x14ULL
  205. #define SBP2_UNSOLICITED_STATUS_VALUE 0xf
  206. #define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL
  207. #define SBP2_BUSY_TIMEOUT_VALUE 0xf
  208. #define SBP2_AGENT_RESET_DATA 0xf
  209. /*
  210.  * Unit spec id and sw version entry for SBP-2 devices
  211.  */
  212. #define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
  213. #define SBP2_SW_VERSION_ENTRY 0x00010483
  214. /*
  215.  * Other misc defines
  216.  */
  217. #define SBP2_128KB_BROKEN_FIRMWARE 0xa0b800
  218. #define SBP2_BROKEN_FIRMWARE_MAX_TRANSFER 0x20000
  219. #define SBP2_DEVICE_TYPE_LUN_UNINITIALIZED 0xffffffff
  220. /*
  221.  * Flags for SBP-2 functions
  222.  */
  223. #define SBP2_SEND_NO_WAIT 0x00000001
  224. /*
  225.  * SCSI specific stuff
  226.  */
  227. #define SBP2_MAX_SG_ELEMENTS SG_ALL
  228. #define SBP2_CLUSTERING ENABLE_CLUSTERING
  229. #define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
  230. #define SBP2SCSI_MAX_SCSI_IDS 16 /* Max sbp2 device instances supported */
  231. #define SBP2SCSI_MAX_OUTSTANDING_CMDS 8 /* Max total outstanding sbp2 commands allowed at a time! */
  232. #define SBP2SCSI_MAX_CMDS_PER_LUN 1  /* Max outstanding sbp2 commands per device - tune as needed */
  233. #define SBP2_MAX_SECTORS 255 /* Max sectors supported */
  234. #ifndef TYPE_SDAD
  235. #define TYPE_SDAD 0x0e /* simplified direct access device */
  236. #endif
  237. /*
  238.  * SCSI direction table... 
  239.  * (now used as a back-up in case the direction passed down from above is "unknown")
  240.  *
  241.  * DIN = IN data direction
  242.  * DOU = OUT data direction
  243.  * DNO = No data transfer
  244.  * DUN = Unknown data direction
  245.  *
  246.  * Opcode 0xec (Teac specific "opc execute") possibly should be DNO,
  247.  * but we'll change it when somebody reports a problem with this.
  248.  */
  249. #define DIN ORB_DIRECTION_READ_FROM_MEDIA
  250. #define DOU ORB_DIRECTION_WRITE_TO_MEDIA
  251. #define DNO ORB_DIRECTION_NO_DATA_TRANSFER
  252. #define DUN DIN 
  253. static unchar sbp2scsi_direction_table[0x100] = {
  254. DNO,DNO,DIN,DIN,DOU,DIN,DIN,DOU,DIN,DUN,DOU,DOU,DUN,DUN,DUN,DIN,
  255. DNO,DIN,DIN,DOU,DIN,DOU,DNO,DNO,DOU,DNO,DIN,DNO,DIN,DOU,DNO,DUN,
  256. DIN,DUN,DIN,DIN,DOU,DIN,DUN,DUN,DIN,DIN,DOU,DNO,DUN,DIN,DOU,DOU,
  257. DOU,DOU,DOU,DNO,DIN,DNO,DNO,DIN,DOU,DOU,DOU,DOU,DIN,DOU,DIN,DOU,
  258. DOU,DOU,DIN,DIN,DIN,DNO,DIN,DNO,DNO,DNO,DUN,DNO,DOU,DIN,DNO,DUN,
  259. DUN,DIN,DIN,DNO,DNO,DOU,DUN,DUN,DNO,DIN,DIN,DNO,DIN,DOU,DUN,DUN,
  260. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  261. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  262. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  263. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  264. DUN,DNO,DOU,DOU,DIN,DNO,DNO,DNO,DIN,DNO,DOU,DUN,DNO,DIN,DOU,DOU,
  265. DOU,DOU,DOU,DNO,DUN,DIN,DOU,DIN,DIN,DIN,DNO,DNO,DNO,DIN,DIN,DUN,
  266. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  267. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  268. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DOU,DUN,DUN,DUN,DUN,DUN,
  269. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN
  270. };
  271. #define SBP2_MAX_REQUEST_PACKETS (sbp2_max_outstanding_cmds * 2)
  272. #define SBP2_MAX_COMMAND_ORBS (sbp2_max_cmds_per_lun * 2)
  273. /*
  274.  * Request packets structure (used for sending command and agent reset packets)
  275.  */
  276. struct sbp2_request_packet {
  277. struct list_head list;
  278. struct hpsb_packet *packet;
  279. struct tq_struct tq;
  280. void *hi_context;
  281. };
  282. /* This is the two dma types we use for cmd_dma below */
  283. #define CMD_DMA_NONE   0x0
  284. #define CMD_DMA_PAGE   0x1
  285. #define CMD_DMA_SINGLE 0x2
  286. /* 
  287.  * Encapsulates all the info necessary for an outstanding command. 
  288.  */
  289. struct sbp2_command_info {
  290. struct list_head list;
  291. struct sbp2_command_orb command_orb ____cacheline_aligned;
  292. dma_addr_t command_orb_dma ____cacheline_aligned;
  293. Scsi_Cmnd *Current_SCpnt;
  294. void (*Current_done)(Scsi_Cmnd *);
  295. /* Also need s/g structure for each sbp2 command */
  296. struct sbp2_unrestricted_page_table scatter_gather_element[SBP2_MAX_SG_ELEMENTS] ____cacheline_aligned;
  297. dma_addr_t sge_dma ____cacheline_aligned;
  298. void *sge_buffer;
  299. dma_addr_t cmd_dma;
  300. int dma_type;
  301. unsigned long dma_size;
  302. int dma_dir;
  303. };
  304. /* A list of flags for detected oddities and brokeness. */
  305. #define SBP2_BREAKAGE_128K_MAX_TRANSFER 0x1
  306. #define SBP2_BREAKAGE_INQUIRY_HACK 0x2
  307. /*
  308.  * Information needed on a per scsi id basis (one for each sbp2 device)
  309.  */
  310. struct scsi_id_instance_data {
  311. /* SCSI ID */
  312. int id;
  313. /*
  314.  * Various sbp2 specific structures
  315.  */
  316. struct sbp2_command_orb *last_orb;
  317. dma_addr_t last_orb_dma;
  318. struct sbp2_login_orb *login_orb;
  319. dma_addr_t login_orb_dma;
  320. struct sbp2_login_response *login_response;
  321. dma_addr_t login_response_dma;
  322. struct sbp2_reconnect_orb *reconnect_orb;
  323. dma_addr_t reconnect_orb_dma;
  324. struct sbp2_logout_orb *logout_orb;
  325. dma_addr_t logout_orb_dma;
  326. struct sbp2_status_block status_block;
  327. /*
  328.  * Stuff we need to know about the sbp2 device itself
  329.  */
  330. u64 sbp2_management_agent_addr;
  331. u64 sbp2_command_block_agent_addr;
  332. u32 speed_code;
  333. u32 max_payload_size;
  334. /*
  335.  * Values pulled from the device's unit directory
  336.  */
  337. struct unit_directory *ud;
  338. u32 sbp2_command_set_spec_id;
  339. u32 sbp2_command_set;
  340. u32 sbp2_unit_characteristics;
  341. u32 sbp2_device_type_and_lun;
  342. u32 sbp2_firmware_revision;
  343. /* 
  344.  * Variable used for logins, reconnects, logouts 
  345.  */
  346. atomic_t sbp2_login_complete;
  347. /* 
  348.  * Pool of command orbs, so we can have more than overlapped command per id
  349.  */
  350. spinlock_t sbp2_command_orb_lock;
  351. struct list_head sbp2_command_orb_inuse;
  352. struct list_head sbp2_command_orb_completed;
  353. u32 sbp2_total_command_orbs;
  354. /* Node entry, as retrieved from NodeMgr entries */
  355. struct node_entry *ne;
  356. /* Device specific workarounds/brokeness */
  357. u32 workarounds;
  358. };
  359. /*
  360.  * Sbp2 host data structure (one per sbp2 host)
  361.  */
  362. struct sbp2scsi_host_info {
  363. /*
  364.  * For use in keeping track of hosts
  365.  */
  366. struct list_head list;
  367. struct hpsb_host *host;
  368. /*
  369.  * Spin locks for command processing and packet pool management
  370.  */
  371. spinlock_t sbp2_command_lock;
  372. spinlock_t sbp2_request_packet_lock;
  373. /*
  374.  * This is the scsi host we register with the scsi mid level.
  375.  * We keep a reference to it here, so we can unregister it
  376.  * when the hpsb_host is removed.
  377.  */
  378. struct Scsi_Host *scsi_host;
  379. /*
  380.  * Lists keeping track of inuse/free sbp2_request_packets. These structures are
  381.  * used for sending out sbp2 command and agent reset packets. We initially create
  382.  * a pool of request packets so that we don't have to do any kmallocs while in critical
  383.  * I/O paths.
  384.  */
  385. struct list_head sbp2_req_inuse;
  386. struct list_head sbp2_req_free;
  387. /*
  388.  * Here is the pool of request packets. All the hpsb packets (for 1394 bus transactions)
  389.  * are allocated at init and simply re-initialized when needed.
  390.  */
  391. struct sbp2_request_packet *request_packet;
  392. /*
  393.  * SCSI ID instance data (one for each sbp2 device instance possible)
  394.  */
  395. struct scsi_id_instance_data *scsi_id[SBP2SCSI_MAX_SCSI_IDS];
  396. };
  397. /*
  398.  * Function prototypes
  399.  */
  400. /*
  401.  * Various utility prototypes
  402.  */
  403. static int sbp2util_create_request_packet_pool(struct sbp2scsi_host_info *hi);
  404. static void sbp2util_remove_request_packet_pool(struct sbp2scsi_host_info *hi);
  405. static struct sbp2_request_packet *sbp2util_allocate_write_request_packet(struct sbp2scsi_host_info *hi,
  406.   struct node_entry *ne, u64 addr,
  407.   size_t data_size,
  408.   quadlet_t data);
  409. static void sbp2util_free_request_packet(struct sbp2_request_packet *request_packet);
  410. static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
  411. static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
  412. static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb);
  413. static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt);
  414. static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id, 
  415.   Scsi_Cmnd *Current_SCpnt, 
  416.   void (*Current_done)(Scsi_Cmnd *),
  417.   struct sbp2scsi_host_info *hi);
  418. static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
  419. struct sbp2_command_info *command);
  420. /*
  421.  * IEEE-1394 core driver related prototypes
  422.  */
  423. static void sbp2_add_host(struct hpsb_host *host);
  424. static struct sbp2scsi_host_info *sbp2_find_host_info(struct hpsb_host *host);
  425. static void sbp2_remove_host(struct hpsb_host *host);
  426. int sbp2_init(void);
  427. void sbp2_cleanup(void);
  428. static int sbp2_probe(struct unit_directory *ud);
  429. static void sbp2_disconnect(struct unit_directory *ud);
  430. static void sbp2_update(struct unit_directory *ud);
  431. static int sbp2_start_device(struct sbp2scsi_host_info *hi, 
  432.      struct unit_directory *ud);
  433. static void sbp2_remove_device(struct sbp2scsi_host_info *hi, 
  434.        struct scsi_id_instance_data *scsi_id);
  435. #ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
  436. static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data,
  437.                                      u64 addr, unsigned int length);
  438. static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_t *data,
  439.                                     u64 addr, unsigned int length);
  440. #endif
  441. /*
  442.  * SBP-2 protocol related prototypes
  443.  */
  444. static int sbp2_login_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
  445. static int sbp2_reconnect_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id); 
  446. static int sbp2_logout_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id); 
  447. static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid,
  448.     quadlet_t *data, u64 addr, unsigned int length);
  449. static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, u32 flags);
  450. static int sbp2_create_command_orb(struct sbp2scsi_host_info *hi, 
  451.    struct scsi_id_instance_data *scsi_id,
  452.    struct sbp2_command_info *command,
  453.    unchar *scsi_cmd,
  454.    unsigned int scsi_use_sg,
  455.    unsigned int scsi_request_bufflen,
  456.    void *scsi_request_buffer, 
  457.    unsigned char scsi_dir);
  458. static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
  459.  struct sbp2_command_info *command);
  460. static int sbp2_send_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
  461.      Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
  462. static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data);
  463. static void sbp2_check_sbp2_command(struct scsi_id_instance_data *scsi_id, unchar *cmd);
  464. static void sbp2_check_sbp2_response(struct scsi_id_instance_data *scsi_id, Scsi_Cmnd *SCpnt);
  465. static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id);
  466. static int sbp2_set_busy_timeout(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
  467. static int sbp2_max_speed_and_size(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
  468. /*
  469.  * Scsi interface related prototypes
  470.  */
  471. static int sbp2scsi_detect (Scsi_Host_Template *tpnt);
  472. static const char *sbp2scsi_info (struct Scsi_Host *host);
  473. void sbp2scsi_setup(char *str, int *ints);
  474. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28)
  475. static int sbp2scsi_biosparam (Scsi_Disk *disk, kdev_t dev, int geom[]);
  476. #else
  477. static int sbp2scsi_biosparam (Scsi_Disk *disk, struct block_device *dev, int geom[]);
  478. #endif
  479. static int sbp2scsi_abort (Scsi_Cmnd *SCpnt); 
  480. static int sbp2scsi_reset (Scsi_Cmnd *SCpnt); 
  481. static int sbp2scsi_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
  482. static void sbp2scsi_complete_all_commands(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, 
  483.    u32 status);
  484. static void sbp2scsi_complete_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, 
  485.       u32 scsi_status, Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
  486. #endif /* SBP2_H */