aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ieee1394/sbp2.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ieee1394/sbp2.h')
-rw-r--r--drivers/ieee1394/sbp2.h311
1 files changed, 124 insertions, 187 deletions
diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
index 1b16d6b9cf11..9ae842329bf3 100644
--- a/drivers/ieee1394/sbp2.h
+++ b/drivers/ieee1394/sbp2.h
@@ -25,25 +25,25 @@
25#define SBP2_DEVICE_NAME "sbp2" 25#define SBP2_DEVICE_NAME "sbp2"
26 26
27/* 27/*
28 * SBP2 specific structures and defines 28 * SBP-2 specific definitions
29 */ 29 */
30 30
31#define ORB_DIRECTION_WRITE_TO_MEDIA 0x0 31#define ORB_DIRECTION_WRITE_TO_MEDIA 0x0
32#define ORB_DIRECTION_READ_FROM_MEDIA 0x1 32#define ORB_DIRECTION_READ_FROM_MEDIA 0x1
33#define ORB_DIRECTION_NO_DATA_TRANSFER 0x2 33#define ORB_DIRECTION_NO_DATA_TRANSFER 0x2
34 34
35#define ORB_SET_NULL_PTR(value) ((value & 0x1) << 31) 35#define ORB_SET_NULL_PTR(v) (((v) & 0x1) << 31)
36#define ORB_SET_NOTIFY(value) ((value & 0x1) << 31) 36#define ORB_SET_NOTIFY(v) (((v) & 0x1) << 31)
37#define ORB_SET_RQ_FMT(value) ((value & 0x3) << 29) /* unused ? */ 37#define ORB_SET_RQ_FMT(v) (((v) & 0x3) << 29)
38#define ORB_SET_NODE_ID(value) ((value & 0xffff) << 16) 38#define ORB_SET_NODE_ID(v) (((v) & 0xffff) << 16)
39#define ORB_SET_STATUS_FIFO_HI(value, id) (value >> 32 | ORB_SET_NODE_ID(id)) 39#define ORB_SET_STATUS_FIFO_HI(v, id) ((v) >> 32 | ORB_SET_NODE_ID(id))
40#define ORB_SET_STATUS_FIFO_LO(value) (value & 0xffffffff) 40#define ORB_SET_STATUS_FIFO_LO(v) ((v) & 0xffffffff)
41#define ORB_SET_DATA_SIZE(value) (value & 0xffff) 41#define ORB_SET_DATA_SIZE(v) ((v) & 0xffff)
42#define ORB_SET_PAGE_SIZE(value) ((value & 0x7) << 16) 42#define ORB_SET_PAGE_SIZE(v) (((v) & 0x7) << 16)
43#define ORB_SET_PAGE_TABLE_PRESENT(value) ((value & 0x1) << 19) 43#define ORB_SET_PAGE_TABLE_PRESENT(v) (((v) & 0x1) << 19)
44#define ORB_SET_MAX_PAYLOAD(value) ((value & 0xf) << 20) 44#define ORB_SET_MAX_PAYLOAD(v) (((v) & 0xf) << 20)
45#define ORB_SET_SPEED(value) ((value & 0x7) << 24) 45#define ORB_SET_SPEED(v) (((v) & 0x7) << 24)
46#define ORB_SET_DIRECTION(value) ((value & 0x1) << 27) 46#define ORB_SET_DIRECTION(v) (((v) & 0x1) << 27)
47 47
48struct sbp2_command_orb { 48struct sbp2_command_orb {
49 u32 next_ORB_hi; 49 u32 next_ORB_hi;
@@ -64,12 +64,12 @@ struct sbp2_command_orb {
64#define SBP2_LOGICAL_UNIT_RESET 0xe 64#define SBP2_LOGICAL_UNIT_RESET 0xe
65#define SBP2_TARGET_RESET_REQUEST 0xf 65#define SBP2_TARGET_RESET_REQUEST 0xf
66 66
67#define ORB_SET_LUN(value) (value & 0xffff) 67#define ORB_SET_LUN(v) ((v) & 0xffff)
68#define ORB_SET_FUNCTION(value) ((value & 0xf) << 16) 68#define ORB_SET_FUNCTION(v) (((v) & 0xf) << 16)
69#define ORB_SET_RECONNECT(value) ((value & 0xf) << 20) 69#define ORB_SET_RECONNECT(v) (((v) & 0xf) << 20)
70#define ORB_SET_EXCLUSIVE(value) ((value & 0x1) << 28) 70#define ORB_SET_EXCLUSIVE(v) (((v) & 0x1) << 28)
71#define ORB_SET_LOGIN_RESP_LENGTH(value) (value & 0xffff) 71#define ORB_SET_LOGIN_RESP_LENGTH(v) ((v) & 0xffff)
72#define ORB_SET_PASSWD_LENGTH(value) ((value & 0xffff) << 16) 72#define ORB_SET_PASSWD_LENGTH(v) (((v) & 0xffff) << 16)
73 73
74struct sbp2_login_orb { 74struct sbp2_login_orb {
75 u32 password_hi; 75 u32 password_hi;
@@ -82,9 +82,9 @@ struct sbp2_login_orb {
82 u32 status_fifo_lo; 82 u32 status_fifo_lo;
83} __attribute__((packed)); 83} __attribute__((packed));
84 84
85#define RESPONSE_GET_LOGIN_ID(value) (value & 0xffff) 85#define RESPONSE_GET_LOGIN_ID(v) ((v) & 0xffff)
86#define RESPONSE_GET_LENGTH(value) ((value >> 16) & 0xffff) 86#define RESPONSE_GET_LENGTH(v) (((v) >> 16) & 0xffff)
87#define RESPONSE_GET_RECONNECT_HOLD(value) (value & 0xffff) 87#define RESPONSE_GET_RECONNECT_HOLD(v) ((v) & 0xffff)
88 88
89struct sbp2_login_response { 89struct sbp2_login_response {
90 u32 length_login_ID; 90 u32 length_login_ID;
@@ -93,9 +93,8 @@ struct sbp2_login_response {
93 u32 reconnect_hold; 93 u32 reconnect_hold;
94} __attribute__((packed)); 94} __attribute__((packed));
95 95
96#define ORB_SET_LOGIN_ID(value) (value & 0xffff) 96#define ORB_SET_LOGIN_ID(v) ((v) & 0xffff)
97 97#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(v) ((v) & 0xffff)
98#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(value) (value & 0xffff)
99 98
100struct sbp2_query_logins_orb { 99struct sbp2_query_logins_orb {
101 u32 reserved1; 100 u32 reserved1;
@@ -108,8 +107,8 @@ struct sbp2_query_logins_orb {
108 u32 status_fifo_lo; 107 u32 status_fifo_lo;
109} __attribute__((packed)); 108} __attribute__((packed));
110 109
111#define RESPONSE_GET_MAX_LOGINS(value) (value & 0xffff) 110#define RESPONSE_GET_MAX_LOGINS(v) ((v) & 0xffff)
112#define RESPONSE_GET_ACTIVE_LOGINS(value) ((RESPONSE_GET_LENGTH(value) - 4) / 12) 111#define RESPONSE_GET_ACTIVE_LOGINS(v) ((RESPONSE_GET_LENGTH((v)) - 4) / 12)
113 112
114struct sbp2_query_logins_response { 113struct sbp2_query_logins_response {
115 u32 length_max_logins; 114 u32 length_max_logins;
@@ -140,8 +139,8 @@ struct sbp2_logout_orb {
140 u32 status_fifo_lo; 139 u32 status_fifo_lo;
141} __attribute__((packed)); 140} __attribute__((packed));
142 141
143#define PAGE_TABLE_SET_SEGMENT_BASE_HI(value) (value & 0xffff) 142#define PAGE_TABLE_SET_SEGMENT_BASE_HI(v) ((v) & 0xffff)
144#define PAGE_TABLE_SET_SEGMENT_LENGTH(value) ((value & 0xffff) << 16) 143#define PAGE_TABLE_SET_SEGMENT_LENGTH(v) (((v) & 0xffff) << 16)
145 144
146struct sbp2_unrestricted_page_table { 145struct sbp2_unrestricted_page_table {
147 u32 length_segment_base_hi; 146 u32 length_segment_base_hi;
@@ -171,23 +170,14 @@ struct sbp2_unrestricted_page_table {
171#define SFMT_DEFERRED_ERROR 0x1 170#define SFMT_DEFERRED_ERROR 0x1
172#define SFMT_VENDOR_DEPENDENT_STATUS 0x3 171#define SFMT_VENDOR_DEPENDENT_STATUS 0x3
173 172
174#define SBP2_SCSI_STATUS_GOOD 0x0 173#define STATUS_GET_SRC(v) (((v) >> 30) & 0x3)
175#define SBP2_SCSI_STATUS_CHECK_CONDITION 0x2 174#define STATUS_GET_RESP(v) (((v) >> 28) & 0x3)
176#define SBP2_SCSI_STATUS_CONDITION_MET 0x4 175#define STATUS_GET_LEN(v) (((v) >> 24) & 0x7)
177#define SBP2_SCSI_STATUS_BUSY 0x8 176#define STATUS_GET_SBP_STATUS(v) (((v) >> 16) & 0xff)
178#define SBP2_SCSI_STATUS_RESERVATION_CONFLICT 0x18 177#define STATUS_GET_ORB_OFFSET_HI(v) ((v) & 0x0000ffff)
179#define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22 178#define STATUS_TEST_DEAD(v) ((v) & 0x08000000)
180
181#define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff
182
183#define STATUS_GET_SRC(value) (((value) >> 30) & 0x3)
184#define STATUS_GET_RESP(value) (((value) >> 28) & 0x3)
185#define STATUS_GET_LEN(value) (((value) >> 24) & 0x7)
186#define STATUS_GET_SBP_STATUS(value) (((value) >> 16) & 0xff)
187#define STATUS_GET_ORB_OFFSET_HI(value) ((value) & 0x0000ffff)
188#define STATUS_TEST_DEAD(value) ((value) & 0x08000000)
189/* test 'resp' | 'dead' | 'sbp2_status' */ 179/* test 'resp' | 'dead' | 'sbp2_status' */
190#define STATUS_TEST_RDS(value) ((value) & 0x38ff0000) 180#define STATUS_TEST_RDS(v) ((v) & 0x38ff0000)
191 181
192struct sbp2_status_block { 182struct sbp2_status_block {
193 u32 ORB_offset_hi_misc; 183 u32 ORB_offset_hi_misc;
@@ -195,66 +185,70 @@ struct sbp2_status_block {
195 u8 command_set_dependent[24]; 185 u8 command_set_dependent[24];
196} __attribute__((packed)); 186} __attribute__((packed));
197 187
188
198/* 189/*
199 * Miscellaneous SBP2 related config rom defines 190 * SBP2 related configuration ROM definitions
200 */ 191 */
201 192
202#define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1 193#define SBP2_UNIT_DIRECTORY_OFFSET_KEY 0xd1
203#define SBP2_CSR_OFFSET_KEY 0x54 194#define SBP2_CSR_OFFSET_KEY 0x54
204#define SBP2_UNIT_SPEC_ID_KEY 0x12 195#define SBP2_UNIT_SPEC_ID_KEY 0x12
205#define SBP2_UNIT_SW_VERSION_KEY 0x13 196#define SBP2_UNIT_SW_VERSION_KEY 0x13
206#define SBP2_COMMAND_SET_SPEC_ID_KEY 0x38 197#define SBP2_COMMAND_SET_SPEC_ID_KEY 0x38
207#define SBP2_COMMAND_SET_KEY 0x39 198#define SBP2_COMMAND_SET_KEY 0x39
208#define SBP2_UNIT_CHARACTERISTICS_KEY 0x3a 199#define SBP2_UNIT_CHARACTERISTICS_KEY 0x3a
209#define SBP2_DEVICE_TYPE_AND_LUN_KEY 0x14 200#define SBP2_DEVICE_TYPE_AND_LUN_KEY 0x14
210#define SBP2_FIRMWARE_REVISION_KEY 0x3c 201#define SBP2_FIRMWARE_REVISION_KEY 0x3c
211 202
212#define SBP2_AGENT_STATE_OFFSET 0x00ULL 203#define SBP2_AGENT_STATE_OFFSET 0x00ULL
213#define SBP2_AGENT_RESET_OFFSET 0x04ULL 204#define SBP2_AGENT_RESET_OFFSET 0x04ULL
214#define SBP2_ORB_POINTER_OFFSET 0x08ULL 205#define SBP2_ORB_POINTER_OFFSET 0x08ULL
215#define SBP2_DOORBELL_OFFSET 0x10ULL 206#define SBP2_DOORBELL_OFFSET 0x10ULL
216#define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET 0x14ULL 207#define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET 0x14ULL
217#define SBP2_UNSOLICITED_STATUS_VALUE 0xf 208#define SBP2_UNSOLICITED_STATUS_VALUE 0xf
218 209
219#define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL 210#define SBP2_BUSY_TIMEOUT_ADDRESS 0xfffff0000210ULL
220#define SBP2_BUSY_TIMEOUT_VALUE 0xf 211/* biggest possible value for Single Phase Retry count is 0xf */
212#define SBP2_BUSY_TIMEOUT_VALUE 0xf
221 213
222#define SBP2_AGENT_RESET_DATA 0xf 214#define SBP2_AGENT_RESET_DATA 0xf
223 215
224/* 216#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
225 * Unit spec id and sw version entry for SBP-2 devices 217#define SBP2_SW_VERSION_ENTRY 0x00010483
226 */
227 218
228#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
229#define SBP2_SW_VERSION_ENTRY 0x00010483
230 219
231/* 220/*
232 * SCSI specific stuff 221 * SCSI specific definitions
233 */ 222 */
234 223
235#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 224#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
236#define SBP2_MAX_SECTORS 255 /* Max sectors supported */ 225#define SBP2_MAX_SECTORS 255
237#define SBP2_MAX_CMDS 8 /* This should be safe */ 226/* There is no real limitation of the queue depth (i.e. length of the linked
227 * list of command ORBs) at the target. The chosen depth is merely an
228 * implementation detail of the sbp2 driver. */
229#define SBP2_MAX_CMDS 8
230
231#define SBP2_SCSI_STATUS_GOOD 0x0
232#define SBP2_SCSI_STATUS_CHECK_CONDITION 0x2
233#define SBP2_SCSI_STATUS_CONDITION_MET 0x4
234#define SBP2_SCSI_STATUS_BUSY 0x8
235#define SBP2_SCSI_STATUS_RESERVATION_CONFLICT 0x18
236#define SBP2_SCSI_STATUS_COMMAND_TERMINATED 0x22
237#define SBP2_SCSI_STATUS_SELECTION_TIMEOUT 0xff
238 238
239/* Flags for detected oddities and brokeness */
240#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1
241#define SBP2_WORKAROUND_INQUIRY_36 0x2
242#define SBP2_WORKAROUND_MODE_SENSE_8 0x4
243#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
244#define SBP2_WORKAROUND_OVERRIDE 0x100
245 239
246/* This is the two dma types we use for cmd_dma below */ 240/*
247enum cmd_dma_types { 241 * Representations of commands and devices
242 */
243
244enum sbp2_dma_types {
248 CMD_DMA_NONE, 245 CMD_DMA_NONE,
249 CMD_DMA_PAGE, 246 CMD_DMA_PAGE,
250 CMD_DMA_SINGLE 247 CMD_DMA_SINGLE
251}; 248};
252 249
253/* 250/* Per SCSI command */
254 * Encapsulates all the info necessary for an outstanding command.
255 */
256struct sbp2_command_info { 251struct sbp2_command_info {
257
258 struct list_head list; 252 struct list_head list;
259 struct sbp2_command_orb command_orb ____cacheline_aligned; 253 struct sbp2_command_orb command_orb ____cacheline_aligned;
260 dma_addr_t command_orb_dma ____cacheline_aligned; 254 dma_addr_t command_orb_dma ____cacheline_aligned;
@@ -262,25 +256,25 @@ struct sbp2_command_info {
262 void (*Current_done)(struct scsi_cmnd *); 256 void (*Current_done)(struct scsi_cmnd *);
263 257
264 /* Also need s/g structure for each sbp2 command */ 258 /* Also need s/g structure for each sbp2 command */
265 struct sbp2_unrestricted_page_table scatter_gather_element[SG_ALL] ____cacheline_aligned; 259 struct sbp2_unrestricted_page_table
260 scatter_gather_element[SG_ALL] ____cacheline_aligned;
266 dma_addr_t sge_dma ____cacheline_aligned; 261 dma_addr_t sge_dma ____cacheline_aligned;
267 void *sge_buffer; 262 void *sge_buffer;
268 dma_addr_t cmd_dma; 263 dma_addr_t cmd_dma;
269 enum cmd_dma_types dma_type; 264 enum sbp2_dma_types dma_type;
270 unsigned long dma_size; 265 unsigned long dma_size;
271 int dma_dir; 266 enum dma_data_direction dma_dir;
272
273}; 267};
274 268
275struct sbp2scsi_host_info; 269/* Per FireWire host */
270struct sbp2_fwhost_info {
271 struct hpsb_host *host;
272 struct list_head logical_units;
273};
276 274
277/* 275/* Per logical unit */
278 * Information needed on a per scsi id basis (one for each sbp2 device) 276struct sbp2_lu {
279 */ 277 /* Operation request blocks */
280struct scsi_id_instance_data {
281 /*
282 * Various sbp2 specific structures
283 */
284 struct sbp2_command_orb *last_orb; 278 struct sbp2_command_orb *last_orb;
285 dma_addr_t last_orb_dma; 279 dma_addr_t last_orb_dma;
286 struct sbp2_login_orb *login_orb; 280 struct sbp2_login_orb *login_orb;
@@ -297,116 +291,59 @@ struct scsi_id_instance_data {
297 dma_addr_t logout_orb_dma; 291 dma_addr_t logout_orb_dma;
298 struct sbp2_status_block status_block; 292 struct sbp2_status_block status_block;
299 293
300 /* 294 /* How to talk to the unit */
301 * Stuff we need to know about the sbp2 device itself 295 u64 management_agent_addr;
302 */ 296 u64 command_block_agent_addr;
303 u64 sbp2_management_agent_addr;
304 u64 sbp2_command_block_agent_addr;
305 u32 speed_code; 297 u32 speed_code;
306 u32 max_payload_size; 298 u32 max_payload_size;
299 u16 lun;
307 300
308 /* 301 /* Address for the unit to write status blocks to */
309 * Values pulled from the device's unit directory
310 */
311 u32 sbp2_command_set_spec_id;
312 u32 sbp2_command_set;
313 u32 sbp2_unit_characteristics;
314 u32 sbp2_lun;
315 u32 sbp2_firmware_revision;
316
317 /*
318 * Address for the device to write status blocks to
319 */
320 u64 status_fifo_addr; 302 u64 status_fifo_addr;
321 303
322 /* 304 /* Waitqueue flag for logins, reconnects, logouts, query logins */
323 * Waitqueue flag for logins, reconnects, logouts, query logins 305 unsigned int access_complete:1;
324 */
325 int access_complete:1;
326 306
327 /* 307 /* Pool of command ORBs for this logical unit */
328 * Pool of command orbs, so we can have more than overlapped command per id 308 spinlock_t cmd_orb_lock;
329 */ 309 struct list_head cmd_orb_inuse;
330 spinlock_t sbp2_command_orb_lock; 310 struct list_head cmd_orb_completed;
331 struct list_head sbp2_command_orb_inuse;
332 struct list_head sbp2_command_orb_completed;
333 311
334 struct list_head scsi_list; 312 /* Backlink to FireWire host; list of units attached to the host */
313 struct sbp2_fwhost_info *hi;
314 struct list_head lu_list;
335 315
336 /* Node entry, as retrieved from NodeMgr entries */ 316 /* IEEE 1394 core's device representations */
337 struct node_entry *ne; 317 struct node_entry *ne;
338 struct unit_directory *ud; 318 struct unit_directory *ud;
339 319
340 /* A backlink to our host_info */ 320 /* SCSI core's device representations */
341 struct sbp2scsi_host_info *hi;
342
343 /* SCSI related pointers */
344 struct scsi_device *sdev; 321 struct scsi_device *sdev;
345 struct Scsi_Host *scsi_host; 322 struct Scsi_Host *shost;
346 323
347 /* Device specific workarounds/brokeness */ 324 /* Device specific workarounds/brokeness */
348 unsigned workarounds; 325 unsigned workarounds;
349 326
327 /* Connection state */
350 atomic_t state; 328 atomic_t state;
351 struct delayed_work protocol_work; 329
330 /* For deferred requests to the fetch agent */
331 struct work_struct protocol_work;
352}; 332};
353 333
354/* For use in scsi_id_instance_data.state */ 334/* For use in sbp2_lu.state */
355enum sbp2lu_state_types { 335enum sbp2lu_state_types {
356 SBP2LU_STATE_RUNNING, /* all normal */ 336 SBP2LU_STATE_RUNNING, /* all normal */
357 SBP2LU_STATE_IN_RESET, /* between bus reset and reconnect */ 337 SBP2LU_STATE_IN_RESET, /* between bus reset and reconnect */
358 SBP2LU_STATE_IN_SHUTDOWN /* when sbp2_remove was called */ 338 SBP2LU_STATE_IN_SHUTDOWN /* when sbp2_remove was called */
359}; 339};
360 340
361/* Sbp2 host data structure (one per IEEE1394 host) */ 341/* For use in sbp2_lu.workarounds and in the corresponding
362struct sbp2scsi_host_info { 342 * module load parameter */
363 struct hpsb_host *host; /* IEEE1394 host */ 343#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1
364 struct list_head scsi_ids; /* List of scsi ids on this host */ 344#define SBP2_WORKAROUND_INQUIRY_36 0x2
365}; 345#define SBP2_WORKAROUND_MODE_SENSE_8 0x4
366 346#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
367/* 347#define SBP2_WORKAROUND_OVERRIDE 0x100
368 * Function prototypes
369 */
370
371/*
372 * Various utility prototypes
373 */
374static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id);
375static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id);
376static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb);
377static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt);
378static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id,
379 struct scsi_cmnd *Current_SCpnt,
380 void (*Current_done)(struct scsi_cmnd *));
381static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
382 struct sbp2_command_info *command);
383
384
385static int sbp2_start_device(struct scsi_id_instance_data *scsi_id);
386static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id);
387
388#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
389static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data,
390 u64 addr, size_t length, u16 flags);
391static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_t *data,
392 u64 addr, size_t length, u16 flags);
393#endif
394
395/*
396 * SBP-2 protocol related prototypes
397 */
398static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id);
399static int sbp2_login_device(struct scsi_id_instance_data *scsi_id);
400static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id);
401static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id);
402static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid,
403 quadlet_t *data, u64 addr, size_t length, u16 flags);
404static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait);
405static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status,
406 unchar *sense_data);
407static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
408 struct unit_directory *ud);
409static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id);
410static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id);
411 348
412#endif /* SBP2_H */ 349#endif /* SBP2_H */