sbp2.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:17k
源码类别:

嵌入式Linux

开发平台:

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. #define SBP2_DEVICE_NAME "sbp2"
  24. #define SBP2_DEVICE_NAME_SIZE 4
  25. /*
  26.  * SBP2 specific structures and defines
  27.  */
  28. #define ORB_FMT_CMD 0x0
  29. #define ORB_FMT_DUMMY 0x3
  30. #define ORB_DIRECTION_WRITE_TO_MEDIA    0x0
  31. #define ORB_DIRECTION_READ_FROM_MEDIA   0x1
  32. #define ORB_DIRECTION_NO_DATA_TRANSFER  0x2
  33. #define ORB_SET_NOTIFY(value)                   ((value & 0x1) << 31)
  34. #define ORB_SET_RQ_FMT(value)                   ((value & 0x3) << 29)
  35. #define ORB_SET_NODE_ID(value) ((value & 0xffff) << 16)
  36. struct sbp2_dummy_orb {
  37. volatile u32 next_ORB_hi;
  38. volatile u32 next_ORB_lo;
  39. u32 reserved1;
  40.         u32 reserved2;
  41. u32 notify_rq_fmt;
  42. u8 command_block[12];
  43. };
  44. #define ORB_SET_DATA_SIZE(value)                (value & 0xffff)
  45. #define ORB_SET_PAGE_SIZE(value)                ((value & 0x7) << 16)
  46. #define ORB_SET_PAGE_TABLE_PRESENT(value)       ((value & 0x1) << 19)
  47. #define ORB_SET_MAX_PAYLOAD(value)              ((value & 0xf) << 20)
  48. #define ORB_SET_SPEED(value)                    ((value & 0x7) << 24)
  49. #define ORB_SET_DIRECTION(value)                ((value & 0x1) << 27)
  50. struct sbp2_command_orb {
  51. volatile u32 next_ORB_hi;
  52. volatile u32 next_ORB_lo;
  53. u32 data_descriptor_hi;
  54. u32 data_descriptor_lo;
  55. u32 misc;
  56. u8 cdb[12];
  57. };
  58. #define LOGIN_REQUEST 0x0
  59. #define QUERY_LOGINS_REQUEST 0x1
  60. #define RECONNECT_REQUEST 0x3
  61. #define SET_PASSWORD_REQUEST 0x4
  62. #define LOGOUT_REQUEST 0x7
  63. #define ABORT_TASK_REQUEST 0xb
  64. #define ABORT_TASK_SET 0xc
  65. #define LOGICAL_UNIT_RESET 0xe
  66. #define TARGET_RESET_REQUEST 0xf
  67. #define ORB_SET_LUN(value)                      (value & 0xffff)
  68. #define ORB_SET_FUNCTION(value)                 ((value & 0xf) << 16)
  69. #define ORB_SET_RECONNECT(value)                ((value & 0xf) << 20)
  70. #define ORB_SET_EXCLUSIVE(value)                ((value & 0x1) << 28)
  71. #define ORB_SET_LOGIN_RESP_LENGTH(value)        (value & 0xffff)
  72. #define ORB_SET_PASSWD_LENGTH(value)            ((value & 0xffff) << 16)
  73. struct sbp2_login_orb {
  74. u32 password_hi;
  75. u32 password_lo;
  76. u32 login_response_hi;
  77. u32 login_response_lo;
  78. u32 lun_misc;
  79. u32 passwd_resp_lengths;
  80. u32 status_FIFO_hi;
  81. u32 status_FIFO_lo;
  82. };
  83. #define RESPONSE_GET_LOGIN_ID(value)            (value & 0xffff)
  84. #define RESPONSE_GET_LENGTH(value)              ((value >> 16) & 0xffff)
  85. #define RESPONSE_GET_RECONNECT_HOLD(value)      (value & 0xffff)
  86. struct sbp2_login_response {
  87. u32 length_login_ID;
  88. u32 command_block_agent_hi;
  89. u32 command_block_agent_lo;
  90. u32 reconnect_hold;
  91. };
  92. #define ORB_SET_LOGIN_ID(value)                 (value & 0xffff)
  93. struct sbp2_reconnect_orb {
  94. u32 reserved1;
  95. u32 reserved2;
  96.         u32 reserved3;
  97.         u32 reserved4;
  98. u32 login_ID_misc;
  99. u32 reserved5;
  100. u32 status_FIFO_hi;
  101. u32 status_FIFO_lo;
  102. };
  103. struct sbp2_logout_orb {
  104. u32 reserved1;
  105. u32 reserved2;
  106.         u32 reserved3;
  107.         u32 reserved4;
  108. u32 login_ID_misc;
  109. u32 reserved5;
  110. u32 status_FIFO_hi;
  111. u32 status_FIFO_lo;
  112. };
  113. #define PAGE_TABLE_SET_SEGMENT_BASE_HI(value)   (value & 0xffff)
  114. #define PAGE_TABLE_SET_SEGMENT_LENGTH(value)    ((value & 0xffff) << 16)
  115. struct sbp2_unrestricted_page_table {
  116. u32 length_segment_base_hi;
  117. u32 segment_base_lo;
  118. };
  119. #define RESP_STATUS_REQUEST_COMPLETE 0x0
  120. #define RESP_STATUS_TRANSPORT_FAILURE 0x1
  121. #define RESP_STATUS_ILLEGAL_REQUEST 0x2
  122. #define RESP_STATUS_VENDOR_DEPENDENT 0x3
  123. #define SBP2_STATUS_NO_ADDITIONAL_INFO 0x0
  124. #define SBP2_STATUS_REQ_TYPE_NOT_SUPPORTED 0x1
  125. #define SBP2_STATUS_SPEED_NOT_SUPPORTED 0x2
  126. #define SBP2_STATUS_PAGE_SIZE_NOT_SUPPORTED 0x3
  127. #define SBP2_STATUS_ACCESS_DENIED 0x4
  128. #define SBP2_STATUS_LU_NOT_SUPPORTED 0x5
  129. #define SBP2_STATUS_MAX_PAYLOAD_TOO_SMALL 0x6
  130. #define SBP2_STATUS_RESOURCES_UNAVAILABLE 0x8
  131. #define SBP2_STATUS_FUNCTION_REJECTED 0x9
  132. #define SBP2_STATUS_LOGIN_ID_NOT_RECOGNIZED 0xa
  133. #define SBP2_STATUS_DUMMY_ORB_COMPLETED 0xb
  134. #define SBP2_STATUS_REQUEST_ABORTED 0xc
  135. #define SBP2_STATUS_UNSPECIFIED_ERROR 0xff
  136. #define SFMT_CURRENT_ERROR 0x0
  137. #define SFMT_DEFERRED_ERROR 0x1
  138. #define SFMT_VENDOR_DEPENDENT_STATUS 0x3
  139. #define SBP2_SCSI_STATUS_GOOD 0x0
  140. #define SBP2_SCSI_STATUS_CHECK_CONDITION 0x2
  141. #define SBP2_SCSI_STATUS_CONDITION_MET 0x4
  142. #define SBP2_SCSI_STATUS_BUSY 0x8
  143. #define SBP2_SCSI_STATUS_RESERVATION_CONFLICT 0x18
  144. #define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22
  145. #define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff
  146. #define STATUS_GET_ORB_OFFSET_HI(value)         (value & 0xffff)
  147. #define STATUS_GET_SBP_STATUS(value)            ((value >> 16) & 0xff)
  148. #define STATUS_GET_LENGTH(value)                ((value >> 24) & 0x7)
  149. #define STATUS_GET_DEAD_BIT(value)              ((value >> 27) & 0x1)
  150. #define STATUS_GET_RESP(value)                  ((value >> 28) & 0x3)
  151. #define STATUS_GET_SRC(value)                   ((value >> 30) & 0x3)
  152. struct sbp2_status_block {
  153. u32 ORB_offset_hi_misc;
  154. u32 ORB_offset_lo;
  155.         u8 command_set_dependent[24];
  156. };
  157. /*
  158.  * Miscellaneous SBP2 related config rom defines
  159.  */
  160. #define SBP2_STATUS_FIFO_ADDRESS 0xfffe00000000ULL     /* for write posting! */
  161. #define SBP2_STATUS_FIFO_ADDRESS_HI                             0xfffe
  162. #define SBP2_STATUS_FIFO_ADDRESS_LO                             0x0
  163. #define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1
  164. #define SBP2_CSR_OFFSET_KEY 0x54
  165. #define SBP2_UNIT_SPEC_ID_KEY 0x12
  166. #define SBP2_UNIT_SW_VERSION_KEY 0x13
  167. #define SBP2_COMMAND_SET_SPEC_ID_KEY 0x38
  168. #define SBP2_COMMAND_SET_KEY 0x39
  169. #define SBP2_UNIT_CHARACTERISTICS_KEY 0x3a
  170. #define SBP2_DEVICE_TYPE_AND_LUN_KEY 0x14
  171. #define SBP2_FIRMWARE_REVISION_KEY 0x3c
  172. #define SBP2_AGENT_STATE_OFFSET 0x00ULL
  173. #define SBP2_AGENT_RESET_OFFSET 0x04ULL
  174. #define SBP2_ORB_POINTER_OFFSET 0x08ULL
  175. #define SBP2_DOORBELL_OFFSET 0x10ULL
  176. #define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET 0x14ULL
  177. #define SBP2_UNSOLICITED_STATUS_VALUE 0xf
  178. #define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL
  179. #define SBP2_BUSY_TIMEOUT_VALUE 0xf
  180. #define SBP2_AGENT_RESET_DATA 0xf
  181. /*
  182.  * Unit spec id and sw version entry for SBP-2 devices
  183.  */
  184. #define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
  185. #define SBP2_SW_VERSION_ENTRY 0x00010483
  186. /*
  187.  * Miscellaneous general config rom related defines
  188.  */
  189. #define CONFIG_ROM_INITIAL_MEMORY_SPACE  0xfffff0000000ULL
  190. #define CONFIG_ROM_BASE_ADDRESS 0xfffff0000400ULL
  191. #define CONFIG_ROM_ROOT_DIR_BASE 0xfffff0000414ULL
  192. #define CONFIG_ROM_UNIT_DIRECTORY_OFFSET 0xfffff0000424ULL
  193. #define SBP2_128KB_BROKEN_FIRMWARE 0xa0b800
  194. #define SBP2_BROKEN_FIRMWARE_MAX_TRANSFER 0x20000
  195. /*
  196.  * Flags for SBP-2 functions
  197.  */
  198. #define SBP2_SEND_NO_WAIT 0x00000001
  199. /*
  200.  * SCSI specific stuff
  201.  */
  202. #define SBP2_MAX_SG_ELEMENTS SG_ALL
  203. #define SBP2_CLUSTERING ENABLE_CLUSTERING
  204. #define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
  205. #define SBP2SCSI_MAX_SCSI_IDS 8
  206. #define SBP2SCSI_MAX_OUTSTANDING_CMDS 8 /* Max total outstanding sbp2 commands allowed at a time! */
  207. #define SBP2SCSI_MAX_CMDS_PER_LUN 4  /* Max outstanding sbp2 commands per device - tune as needed */
  208. #ifndef TYPE_SDAD
  209. #define TYPE_SDAD 0x0e /* simplified direct access device */
  210. #endif
  211. /*
  212.  * SCSI direction table... since the scsi stack doesn't specify direction...   =(
  213.  *
  214.  * DIN = IN data direction
  215.  * DOU = OUT data direction
  216.  * DNO = No data transfer
  217.  * DUN = Unknown data direction
  218.  *
  219.  * Opcode 0xec (Teac specific "opc execute") possibly should be DNO,
  220.  * but we'll change it when somebody reports a problem with this.
  221.  */
  222. #define DIN ORB_DIRECTION_READ_FROM_MEDIA
  223. #define DOU ORB_DIRECTION_WRITE_TO_MEDIA
  224. #define DNO ORB_DIRECTION_NO_DATA_TRANSFER
  225. #define DUN DIN 
  226. static unchar sbp2scsi_direction_table[0x100] = {
  227. DNO,DNO,DIN,DIN,DOU,DIN,DIN,DOU,DIN,DUN,DOU,DOU,DUN,DUN,DUN,DIN,
  228. DNO,DIN,DIN,DOU,DIN,DOU,DNO,DNO,DOU,DNO,DIN,DNO,DIN,DOU,DNO,DUN,
  229. DIN,DUN,DIN,DIN,DOU,DIN,DUN,DUN,DIN,DIN,DOU,DNO,DUN,DIN,DOU,DOU,
  230. DOU,DOU,DOU,DNO,DIN,DNO,DNO,DIN,DOU,DOU,DOU,DOU,DIN,DOU,DIN,DOU,
  231. DOU,DOU,DIN,DIN,DIN,DNO,DIN,DNO,DNO,DNO,DUN,DNO,DOU,DIN,DNO,DUN,
  232. DUN,DIN,DIN,DNO,DNO,DOU,DUN,DUN,DNO,DIN,DIN,DNO,DIN,DOU,DUN,DUN,
  233. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  234. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  235. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  236. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  237. DUN,DNO,DOU,DOU,DIN,DNO,DNO,DNO,DIN,DNO,DOU,DUN,DNO,DIN,DOU,DOU,
  238. DOU,DOU,DOU,DNO,DUN,DIN,DOU,DIN,DIN,DIN,DNO,DNO,DNO,DIN,DIN,DUN,
  239. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  240. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
  241. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DOU,DUN,DUN,DUN,DUN,DUN,
  242. DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN
  243. };
  244. /*
  245.  * Number of request packets available for actual sbp2 I/O requests (these are used
  246.  * for sending command and agent reset packets).
  247.  */
  248. #define SBP2_MAX_REQUEST_PACKETS SBP2SCSI_MAX_OUTSTANDING_CMDS /* Per host adapter instance */
  249. #define SBP2_MAX_COMMAND_ORBS SBP2SCSI_MAX_CMDS_PER_LUN * 2 /* Per sbp2 device instance */
  250. /*
  251.  * Request packets structure (used for sending command and agent reset packets)
  252.  */
  253. struct sbp2_request_packet {
  254. struct list_head list;
  255. struct hpsb_packet *packet;
  256. struct tq_struct tq;
  257. void *hi_context;
  258. };
  259. /* 
  260.  * Encapsulates all the info necessary for an outstanding command. 
  261.  */
  262. struct sbp2_command_info {
  263. struct list_head list;
  264. struct sbp2_command_orb command_orb;
  265. dma_addr_t command_orb_dma;
  266. Scsi_Cmnd *Current_SCpnt;
  267. void (*Current_done)(Scsi_Cmnd *);
  268. unsigned int linked;
  269. /* Also need s/g structure for each sbp2 command */
  270. struct sbp2_unrestricted_page_table scatter_gather_element[SBP2_MAX_SG_ELEMENTS];
  271. dma_addr_t sge_dma;
  272. void *sge_buffer;
  273. dma_addr_t cmd_dma;
  274. int dma_type;
  275. unsigned long dma_size;
  276. int dma_dir;
  277. };
  278. /*
  279.  * Information needed on a per scsi id basis (one for each sbp2 device)
  280.  */
  281. struct scsi_id_instance_data {
  282. /* SCSI ID */
  283. int id;
  284. /*
  285.  * Various sbp2 specific structures
  286.  */
  287. struct sbp2_command_orb *last_orb;
  288. struct sbp2_login_orb *login_orb;
  289. dma_addr_t login_orb_dma;
  290. struct sbp2_login_response *login_response;
  291. dma_addr_t login_response_dma;
  292. struct sbp2_reconnect_orb *reconnect_orb;
  293. dma_addr_t reconnect_orb_dma;
  294. struct sbp2_logout_orb *logout_orb;
  295. dma_addr_t logout_orb_dma;
  296. struct sbp2_status_block status_block;
  297. /*
  298.  * Stuff we need to know about the sbp2 device itself
  299.  */
  300. u64 sbp2_management_agent_addr;
  301. u64 sbp2_command_block_agent_addr;
  302. u32 speed_code;
  303. u32 max_payload_size;
  304. /*
  305.  * Values pulled from the device's unit directory
  306.  */
  307. struct unit_directory *ud;
  308. u32 sbp2_command_set_spec_id;
  309. u32 sbp2_command_set;
  310. u32 sbp2_unit_characteristics;
  311. u32 sbp2_device_type_and_lun;
  312. u32 sbp2_firmware_revision;
  313. /* 
  314.  * Wait queue used for logins, reconnects, logouts 
  315.  */
  316. wait_queue_head_t sbp2_login_wait;
  317. /* 
  318.  * Pool of command orbs, so we can have more than overlapped command per id
  319.  */
  320. spinlock_t sbp2_command_orb_lock;
  321. struct list_head sbp2_command_orb_inuse;
  322. struct list_head sbp2_command_orb_completed;
  323. u32 sbp2_total_command_orbs;
  324. /* Node entry, as retrieved from NodeMgr entries */
  325. struct node_entry *ne;
  326. };
  327. /*
  328.  * Sbp2 host data structure (one per sbp2 host)
  329.  */
  330. struct sbp2scsi_host_info {
  331. /*
  332.  * For use in keeping track of hosts
  333.  */
  334. struct list_head list;
  335. struct hpsb_host *host;
  336. /*
  337.  * Spin locks for command processing and packet pool management
  338.  */
  339. spinlock_t sbp2_command_lock;
  340. spinlock_t sbp2_request_packet_lock;
  341. /*
  342.  * This is the scsi host we register with the scsi mid level.
  343.  * We keep a reference to it here, so we can unregister it
  344.  * when the hpsb_host is removed.
  345.  */
  346. struct Scsi_Host *scsi_host;
  347. /*
  348.  * Lists keeping track of inuse/free sbp2_request_packets. These structures are
  349.  * used for sending out sbp2 command and agent reset packets. We initially create
  350.  * a pool of request packets so that we don't have to do any kmallocs while in critical
  351.  * I/O paths.
  352.  */
  353. struct list_head sbp2_req_inuse;
  354. struct list_head sbp2_req_free;
  355. /*
  356.  * Here is the pool of request packets. All the hpsb packets (for 1394 bus transactions)
  357.  * are allocated at init and simply re-initialized when needed.
  358.  */
  359. struct sbp2_request_packet request_packet[SBP2_MAX_REQUEST_PACKETS];
  360. /*
  361.  * SCSI ID instance data (one for each sbp2 device instance possible)
  362.  */
  363. struct scsi_id_instance_data *scsi_id[SBP2SCSI_MAX_SCSI_IDS];
  364. };
  365. /*
  366.  * Function prototypes
  367.  */
  368. /*
  369.  * Various utility prototypes
  370.  */
  371. static int sbp2util_create_request_packet_pool(struct sbp2scsi_host_info *hi);
  372. static void sbp2util_remove_request_packet_pool(struct sbp2scsi_host_info *hi);
  373. static struct sbp2_request_packet *sbp2util_allocate_write_request_packet(struct sbp2scsi_host_info *hi,
  374.   nodeid_t node, u64 addr,
  375.   size_t data_size,
  376.   quadlet_t data);
  377. static void sbp2util_free_request_packet(struct sbp2_request_packet *request_packet);
  378. static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
  379. static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
  380. static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb);
  381. static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt);
  382. static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id, 
  383.   Scsi_Cmnd *Current_SCpnt, 
  384.   void (*Current_done)(Scsi_Cmnd *),
  385.   struct sbp2scsi_host_info *hi);
  386. static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
  387. struct sbp2_command_info *command);
  388. /*
  389.  * IEEE-1394 core driver related prototypes
  390.  */
  391. static void sbp2_add_host(struct hpsb_host *host);
  392. static struct sbp2scsi_host_info *sbp2_find_host_info(struct hpsb_host *host);
  393. static void sbp2_remove_host(struct hpsb_host *host);
  394. int sbp2_init(void);
  395. void sbp2_cleanup(void);
  396. static int sbp2_probe(struct unit_directory *ud);
  397. static void sbp2_disconnect(struct unit_directory *ud);
  398. static void sbp2_update(struct unit_directory *ud);
  399. static int sbp2_start_device(struct sbp2scsi_host_info *hi, 
  400.      struct unit_directory *ud);
  401. static void sbp2_remove_device(struct sbp2scsi_host_info *hi, 
  402.        struct scsi_id_instance_data *scsi_id);
  403. /*
  404.  * SBP-2 protocol related prototypes
  405.  */
  406. static int sbp2_login_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
  407. static int sbp2_reconnect_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id); 
  408. static int sbp2_logout_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id); 
  409. static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid,
  410.     quadlet_t *data, u64 addr, unsigned int length);
  411. static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, u32 flags);
  412. static int sbp2_create_command_orb(struct sbp2scsi_host_info *hi, 
  413.    struct scsi_id_instance_data *scsi_id,
  414.    struct sbp2_command_info *command,
  415.    unchar *scsi_cmd,
  416.    unsigned int scsi_use_sg,
  417.    unsigned int scsi_request_bufflen,
  418.    void *scsi_request_buffer, int dma_dir);
  419. static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
  420.  struct sbp2_command_info *command);
  421. static int sbp2_send_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
  422.      Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
  423. static int sbp2_send_split_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
  424.    Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
  425. static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data);
  426. static void sbp2_check_sbp2_command(unchar *cmd);
  427. static void sbp2_check_sbp2_response(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, 
  428.      Scsi_Cmnd *SCpnt);
  429. static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id);
  430. static int sbp2_set_busy_timeout(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
  431. static int sbp2_max_speed_and_size(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
  432. /*
  433.  * Scsi interface related prototypes
  434.  */
  435. static int sbp2scsi_detect (Scsi_Host_Template *tpnt);
  436. void sbp2scsi_setup(char *str, int *ints);
  437. static int sbp2scsi_biosparam (Scsi_Disk *disk, kdev_t dev, int geom[]);
  438. static int sbp2scsi_abort (Scsi_Cmnd *SCpnt); 
  439. static int sbp2scsi_reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags); 
  440. static int sbp2scsi_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
  441. static void sbp2scsi_complete_all_commands(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, 
  442.    u32 status);
  443. static void sbp2scsi_complete_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, 
  444.       u32 scsi_status, Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
  445. #endif /* SBP2_H */