linux-old/drivers/ieee1394/sbp2.h
<<
>>
Prefs
   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
  22#ifndef SBP2_H
  23#define SBP2_H
  24
  25/* Some compatibility code */
  26#define SCSI_REGISTER_HOST(tmpl)        scsi_register_module(MODULE_SCSI_HA, tmpl)
  27#define SCSI_UNREGISTER_HOST(tmpl)      scsi_unregister_module(MODULE_SCSI_HA, tmpl)
  28
  29#define SBP2_DEVICE_NAME                "sbp2"
  30
  31/*
  32 * SBP2 specific structures and defines
  33 */
  34
  35#define ORB_DIRECTION_WRITE_TO_MEDIA    0x0
  36#define ORB_DIRECTION_READ_FROM_MEDIA   0x1
  37#define ORB_DIRECTION_NO_DATA_TRANSFER  0x2
  38
  39#define ORB_SET_NULL_PTR(value)                 ((value & 0x1) << 31)
  40#define ORB_SET_NOTIFY(value)                   ((value & 0x1) << 31)
  41#define ORB_SET_RQ_FMT(value)                   ((value & 0x3) << 29) /* unused ? */
  42#define ORB_SET_NODE_ID(value)                  ((value & 0xffff) << 16)
  43#define ORB_SET_DATA_SIZE(value)                (value & 0xffff)
  44#define ORB_SET_PAGE_SIZE(value)                ((value & 0x7) << 16)
  45#define ORB_SET_PAGE_TABLE_PRESENT(value)       ((value & 0x1) << 19)
  46#define ORB_SET_MAX_PAYLOAD(value)              ((value & 0xf) << 20)
  47#define ORB_SET_SPEED(value)                    ((value & 0x7) << 24)
  48#define ORB_SET_DIRECTION(value)                ((value & 0x1) << 27)
  49
  50struct 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
  59#define LOGIN_REQUEST                   0x0
  60#define QUERY_LOGINS_REQUEST            0x1
  61#define RECONNECT_REQUEST               0x3
  62#define SET_PASSWORD_REQUEST            0x4
  63#define LOGOUT_REQUEST                  0x7
  64#define ABORT_TASK_REQUEST              0xb
  65#define ABORT_TASK_SET                  0xc
  66#define LOGICAL_UNIT_RESET              0xe
  67#define TARGET_RESET_REQUEST            0xf
  68
  69#define ORB_SET_LUN(value)                      (value & 0xffff)
  70#define ORB_SET_FUNCTION(value)                 ((value & 0xf) << 16)
  71#define ORB_SET_RECONNECT(value)                ((value & 0xf) << 20)
  72#define ORB_SET_EXCLUSIVE(value)                ((value & 0x1) << 28)
  73#define ORB_SET_LOGIN_RESP_LENGTH(value)        (value & 0xffff)
  74#define ORB_SET_PASSWD_LENGTH(value)            ((value & 0xffff) << 16)
  75
  76struct sbp2_login_orb {
  77        u32 password_hi;
  78        u32 password_lo;
  79        u32 login_response_hi;
  80        u32 login_response_lo;
  81        u32 lun_misc;
  82        u32 passwd_resp_lengths;
  83        u32 status_FIFO_hi;
  84        u32 status_FIFO_lo;
  85};
  86
  87#define RESPONSE_GET_LOGIN_ID(value)            (value & 0xffff)
  88#define RESPONSE_GET_LENGTH(value)              ((value >> 16) & 0xffff)
  89#define RESPONSE_GET_RECONNECT_HOLD(value)      (value & 0xffff)
  90
  91struct sbp2_login_response {
  92        u32 length_login_ID;
  93        u32 command_block_agent_hi;
  94        u32 command_block_agent_lo;
  95        u32 reconnect_hold;
  96};
  97
  98#define ORB_SET_LOGIN_ID(value)                 (value & 0xffff)
  99
 100#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(value) (value & 0xffff)
 101
 102struct sbp2_query_logins_orb {
 103        u32 reserved1;
 104        u32 reserved2;
 105        u32 query_response_hi;
 106        u32 query_response_lo;
 107        u32 lun_misc;
 108        u32 reserved_resp_length;
 109        u32 status_FIFO_hi;
 110        u32 status_FIFO_lo;
 111};
 112
 113#define RESPONSE_GET_MAX_LOGINS(value)          (value & 0xffff)
 114#define RESPONSE_GET_ACTIVE_LOGINS(value)       ((RESPONSE_GET_LENGTH(value) - 4) / 12)
 115
 116struct sbp2_query_logins_response {
 117        u32 length_max_logins;
 118        u32 misc_IDs;
 119        u32 initiator_misc_hi;
 120        u32 initiator_misc_lo;
 121};
 122
 123struct sbp2_reconnect_orb {
 124        u32 reserved1;
 125        u32 reserved2;
 126        u32 reserved3;
 127        u32 reserved4;
 128        u32 login_ID_misc;
 129        u32 reserved5;
 130        u32 status_FIFO_hi;
 131        u32 status_FIFO_lo;
 132};
 133
 134struct sbp2_logout_orb {
 135        u32 reserved1;
 136        u32 reserved2;
 137        u32 reserved3;
 138        u32 reserved4;
 139        u32 login_ID_misc;
 140        u32 reserved5;
 141        u32 status_FIFO_hi;
 142        u32 status_FIFO_lo;
 143};
 144
 145#define PAGE_TABLE_SET_SEGMENT_BASE_HI(value)   (value & 0xffff)
 146#define PAGE_TABLE_SET_SEGMENT_LENGTH(value)    ((value & 0xffff) << 16)
 147
 148struct sbp2_unrestricted_page_table {
 149        u32 length_segment_base_hi;
 150        u32 segment_base_lo;
 151};
 152
 153#define RESP_STATUS_REQUEST_COMPLETE            0x0
 154#define RESP_STATUS_TRANSPORT_FAILURE           0x1
 155#define RESP_STATUS_ILLEGAL_REQUEST             0x2
 156#define RESP_STATUS_VENDOR_DEPENDENT            0x3
 157
 158#define SBP2_STATUS_NO_ADDITIONAL_INFO          0x0
 159#define SBP2_STATUS_REQ_TYPE_NOT_SUPPORTED      0x1
 160#define SBP2_STATUS_SPEED_NOT_SUPPORTED         0x2
 161#define SBP2_STATUS_PAGE_SIZE_NOT_SUPPORTED     0x3
 162#define SBP2_STATUS_ACCESS_DENIED               0x4
 163#define SBP2_STATUS_LU_NOT_SUPPORTED            0x5
 164#define SBP2_STATUS_MAX_PAYLOAD_TOO_SMALL       0x6
 165#define SBP2_STATUS_RESOURCES_UNAVAILABLE       0x8
 166#define SBP2_STATUS_FUNCTION_REJECTED           0x9
 167#define SBP2_STATUS_LOGIN_ID_NOT_RECOGNIZED     0xa
 168#define SBP2_STATUS_DUMMY_ORB_COMPLETED         0xb
 169#define SBP2_STATUS_REQUEST_ABORTED             0xc
 170#define SBP2_STATUS_UNSPECIFIED_ERROR           0xff
 171
 172#define SFMT_CURRENT_ERROR                      0x0
 173#define SFMT_DEFERRED_ERROR                     0x1
 174#define SFMT_VENDOR_DEPENDENT_STATUS            0x3
 175
 176#define SBP2_SCSI_STATUS_GOOD                   0x0
 177#define SBP2_SCSI_STATUS_CHECK_CONDITION        0x2
 178#define SBP2_SCSI_STATUS_CONDITION_MET          0x4
 179#define SBP2_SCSI_STATUS_BUSY                   0x8
 180#define SBP2_SCSI_STATUS_RESERVATION_CONFLICT   0x18
 181#define SBP2_SCSI_STATUS_COMMAND_TERMINATED     0x22
 182
 183#define SBP2_SCSI_STATUS_SELECTION_TIMEOUT      0xff
 184
 185#define STATUS_GET_ORB_OFFSET_HI(value)         (value & 0xffff)
 186#define STATUS_GET_SBP_STATUS(value)            ((value >> 16) & 0xff)
 187#define STATUS_GET_LENGTH(value)                ((value >> 24) & 0x7)
 188#define STATUS_GET_DEAD_BIT(value)              ((value >> 27) & 0x1)
 189#define STATUS_GET_RESP(value)                  ((value >> 28) & 0x3)
 190#define STATUS_GET_SRC(value)                   ((value >> 30) & 0x3)
 191
 192struct sbp2_status_block {
 193        u32 ORB_offset_hi_misc;
 194        u32 ORB_offset_lo;
 195        u8 command_set_dependent[24];
 196};
 197
 198/*
 199 * Miscellaneous SBP2 related config rom defines
 200 */
 201
 202/* 
 203 * The status fifo address definition below is used as a status base, with a chunk
 204 * separately assigned for each sbp2 device detected. For example, 0xfffe00000000ULL 
 205 * is used for the first sbp2 device detected, 0xfffe00000020ULL for the next sbp2 
 206 * device, and so on.
 207 *
 208 * Note: We could use a single status fifo address for all sbp2 devices, and figure 
 209 * out which sbp2 device the status belongs to by looking at the source node id of
 210 * the status write... but, using separate addresses for each sbp2 device allows for
 211 * better code and the ability to support multiple luns within a single 1394 node.
 212 *
 213 * Also note that we choose the address range below as it is a region specified for
 214 * write posting, where the ohci controller will automatically send an ack_complete
 215 * when the status is written by the sbp2 device... saving a split transaction.   =)
 216 */ 
 217#define SBP2_STATUS_FIFO_ADDRESS                                0xfffe00000000ULL
 218#define SBP2_STATUS_FIFO_ADDRESS_HI                             0xfffe
 219#define SBP2_STATUS_FIFO_ADDRESS_LO                             0x0
 220
 221#define SBP2_STATUS_FIFO_ENTRY_TO_OFFSET(entry)                 ((entry) << 5)
 222#define SBP2_STATUS_FIFO_OFFSET_TO_ENTRY(offset)                ((offset) >> 5)
 223
 224#define SBP2_UNIT_DIRECTORY_OFFSET_KEY                          0xd1
 225#define SBP2_CSR_OFFSET_KEY                                     0x54
 226#define SBP2_UNIT_SPEC_ID_KEY                                   0x12
 227#define SBP2_UNIT_SW_VERSION_KEY                                0x13
 228#define SBP2_COMMAND_SET_SPEC_ID_KEY                            0x38
 229#define SBP2_COMMAND_SET_KEY                                    0x39
 230#define SBP2_UNIT_CHARACTERISTICS_KEY                           0x3a
 231#define SBP2_DEVICE_TYPE_AND_LUN_KEY                            0x14
 232#define SBP2_FIRMWARE_REVISION_KEY                              0x3c
 233
 234#define SBP2_DEVICE_TYPE(q)                                     (((q) >> 16) & 0x1f)
 235#define SBP2_DEVICE_LUN(q)                                      ((q) & 0xffff)
 236
 237#define SBP2_AGENT_STATE_OFFSET                                 0x00ULL
 238#define SBP2_AGENT_RESET_OFFSET                                 0x04ULL
 239#define SBP2_ORB_POINTER_OFFSET                                 0x08ULL
 240#define SBP2_DOORBELL_OFFSET                                    0x10ULL
 241#define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET                   0x14ULL
 242#define SBP2_UNSOLICITED_STATUS_VALUE                           0xf
 243
 244#define SBP2_BUSY_TIMEOUT_ADDRESS                               0xfffff0000210ULL
 245#define SBP2_BUSY_TIMEOUT_VALUE                                 0xf
 246
 247#define SBP2_AGENT_RESET_DATA                                   0xf
 248
 249/*
 250 * Unit spec id and sw version entry for SBP-2 devices
 251 */
 252
 253#define SBP2_UNIT_SPEC_ID_ENTRY                                 0x0000609e
 254#define SBP2_SW_VERSION_ENTRY                                   0x00010483
 255
 256/*
 257 * Other misc defines
 258 */
 259#define SBP2_128KB_BROKEN_FIRMWARE                              0xa0b800
 260
 261#define SBP2_DEVICE_TYPE_LUN_UNINITIALIZED                      0xffffffff
 262
 263/*
 264 * SCSI specific stuff
 265 */
 266
 267#define SBP2_MAX_SG_ELEMENT_LENGTH      0xf000
 268#define SBP2SCSI_MAX_SCSI_IDS           32      /* Max sbp2 device instances supported */
 269#define SBP2_MAX_SECTORS                255     /* Max sectors supported */
 270
 271#ifndef TYPE_SDAD
 272#define TYPE_SDAD                       0x0e    /* simplified direct access device */
 273#endif
 274
 275/*
 276 * SCSI direction table... 
 277 * (now used as a back-up in case the direction passed down from above is "unknown")
 278 *
 279 * DIN = IN data direction
 280 * DOU = OUT data direction
 281 * DNO = No data transfer
 282 * DUN = Unknown data direction
 283 *
 284 * Opcode 0xec (Teac specific "opc execute") possibly should be DNO,
 285 * but we'll change it when somebody reports a problem with this.
 286 */
 287#define DIN                             ORB_DIRECTION_READ_FROM_MEDIA
 288#define DOU                             ORB_DIRECTION_WRITE_TO_MEDIA
 289#define DNO                             ORB_DIRECTION_NO_DATA_TRANSFER
 290#define DUN                             DIN 
 291
 292static unchar sbp2scsi_direction_table[0x100] = {
 293        DNO,DNO,DIN,DIN,DOU,DIN,DIN,DOU,DIN,DUN,DOU,DOU,DUN,DUN,DUN,DIN,
 294        DNO,DIN,DIN,DOU,DIN,DOU,DNO,DNO,DOU,DNO,DIN,DNO,DIN,DOU,DNO,DUN,
 295        DIN,DUN,DIN,DIN,DOU,DIN,DUN,DUN,DIN,DIN,DOU,DNO,DUN,DIN,DOU,DOU,
 296        DOU,DOU,DOU,DNO,DIN,DNO,DNO,DIN,DOU,DOU,DOU,DOU,DIN,DOU,DIN,DOU,
 297        DOU,DOU,DIN,DIN,DIN,DNO,DIN,DNO,DNO,DNO,DUN,DNO,DOU,DIN,DNO,DUN,
 298        DUN,DIN,DIN,DNO,DNO,DOU,DUN,DUN,DNO,DIN,DIN,DNO,DIN,DOU,DUN,DUN,
 299        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
 300        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
 301        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
 302        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
 303        DUN,DNO,DOU,DOU,DIN,DNO,DNO,DNO,DIN,DNO,DOU,DUN,DNO,DIN,DOU,DOU,
 304        DOU,DOU,DOU,DNO,DUN,DIN,DOU,DIN,DIN,DIN,DNO,DNO,DNO,DIN,DIN,DUN,
 305        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
 306        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,
 307        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DOU,DUN,DUN,DUN,DUN,DUN,
 308        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN
 309};
 310
 311/* This should be safe. If there's more than one LUN per node, we could
 312 * saturate the tlabel's though.  */
 313#define SBP2_MAX_CMDS_PER_LUN   8
 314#define SBP2_MAX_SCSI_QUEUE     (SBP2_MAX_CMDS_PER_LUN * SBP2SCSI_MAX_SCSI_IDS)
 315#define SBP2_MAX_COMMAND_ORBS   SBP2_MAX_SCSI_QUEUE
 316
 317/* This is the two dma types we use for cmd_dma below */
 318enum cmd_dma_types {
 319        CMD_DMA_NONE,
 320        CMD_DMA_PAGE,
 321        CMD_DMA_SINGLE
 322};
 323
 324/* 
 325 * Encapsulates all the info necessary for an outstanding command. 
 326 */
 327struct sbp2_command_info {
 328
 329        struct list_head list;
 330        struct sbp2_command_orb command_orb ____cacheline_aligned;
 331        dma_addr_t command_orb_dma ____cacheline_aligned;
 332        Scsi_Cmnd *Current_SCpnt;
 333        void (*Current_done)(Scsi_Cmnd *);
 334
 335        /* Also need s/g structure for each sbp2 command */
 336        struct sbp2_unrestricted_page_table scatter_gather_element[SG_ALL] ____cacheline_aligned;
 337        dma_addr_t sge_dma ____cacheline_aligned;
 338        void *sge_buffer;
 339        dma_addr_t cmd_dma;
 340        enum cmd_dma_types dma_type;
 341        unsigned long dma_size;
 342        int dma_dir;
 343
 344};
 345
 346/* A list of flags for detected oddities and brokeness. */
 347#define SBP2_BREAKAGE_128K_MAX_TRANSFER         0x1
 348#define SBP2_BREAKAGE_INQUIRY_HACK              0x2
 349
 350
 351struct sbp2scsi_host_info;
 352
 353
 354/*
 355 * Information needed on a per scsi id basis (one for each sbp2 device)
 356 */
 357struct scsi_id_instance_data {
 358        /* SCSI ID */
 359        int id;
 360
 361        /*
 362         * Various sbp2 specific structures
 363         */
 364        struct sbp2_command_orb *last_orb;
 365        dma_addr_t last_orb_dma;
 366        struct sbp2_login_orb *login_orb;
 367        dma_addr_t login_orb_dma;
 368        struct sbp2_login_response *login_response;
 369        dma_addr_t login_response_dma;
 370        struct sbp2_query_logins_orb *query_logins_orb;
 371        dma_addr_t query_logins_orb_dma;
 372        struct sbp2_query_logins_response *query_logins_response;
 373        dma_addr_t query_logins_response_dma;
 374        struct sbp2_reconnect_orb *reconnect_orb;
 375        dma_addr_t reconnect_orb_dma;
 376        struct sbp2_logout_orb *logout_orb;
 377        dma_addr_t logout_orb_dma;
 378        struct sbp2_status_block status_block;
 379
 380        /*
 381         * Stuff we need to know about the sbp2 device itself
 382         */
 383        u64 sbp2_management_agent_addr;
 384        u64 sbp2_command_block_agent_addr;
 385        u32 speed_code;
 386        u32 max_payload_size;
 387
 388        /*
 389         * Values pulled from the device's unit directory
 390         */
 391        u32 sbp2_command_set_spec_id;
 392        u32 sbp2_command_set;
 393        u32 sbp2_unit_characteristics;
 394        u32 sbp2_device_type_and_lun;
 395        u32 sbp2_firmware_revision;
 396
 397        /* 
 398         * Variable used for logins, reconnects, logouts, query logins
 399         */
 400        atomic_t sbp2_login_complete;
 401
 402        /* 
 403         * Pool of command orbs, so we can have more than overlapped command per id
 404         */
 405        spinlock_t sbp2_command_orb_lock;
 406        struct list_head sbp2_command_orb_inuse;
 407        struct list_head sbp2_command_orb_completed;
 408
 409        struct list_head list;
 410
 411        /* Node entry, as retrieved from NodeMgr entries */
 412        struct node_entry *ne;
 413
 414        /* A backlink to our host_info */
 415        struct sbp2scsi_host_info *hi;
 416
 417        /* Device specific workarounds/brokeness */
 418        u32 workarounds;
 419};
 420
 421
 422/* Describes a per-ud scsi_id group */
 423struct scsi_id_group {
 424        struct list_head scsi_id_list;
 425};
 426
 427
 428/*
 429 * Sbp2 host data structure (one per sbp2 host)
 430 */
 431struct sbp2scsi_host_info {
 432        struct hpsb_host *host;
 433
 434        /* Spin locks for command processing */
 435        spinlock_t sbp2_command_lock;
 436
 437        /* This is the scsi host we register with the scsi mid level. */
 438        struct Scsi_Host *scsi_host;
 439
 440        /* Our allocated scsi_host_template */
 441        Scsi_Host_Template sht;
 442
 443        /* The proc_name used with the above sht */
 444        char proc_name[32];
 445
 446        struct hpsb_highlevel *hl;
 447
 448        /* SCSI ID instance data (one for each sbp2 device instance possible) */
 449        struct scsi_id_instance_data *scsi_id[SBP2SCSI_MAX_SCSI_IDS];
 450};
 451
 452/*
 453 * Function prototypes
 454 */
 455
 456/*
 457 * Various utility prototypes
 458 */
 459static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id);
 460static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id);
 461static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb);
 462static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt);
 463static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id, 
 464                                                          Scsi_Cmnd *Current_SCpnt, 
 465                                                          void (*Current_done)(Scsi_Cmnd *));
 466static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
 467                struct sbp2_command_info *command);
 468
 469/*
 470 * IEEE-1394 core driver related prototypes
 471 */
 472static struct sbp2scsi_host_info *sbp2_add_host(struct hpsb_host *host);
 473static void sbp2_remove_host(struct hpsb_host *host);
 474static int sbp2_probe(struct unit_directory *ud);
 475static void sbp2_disconnect(struct unit_directory *ud);
 476static void sbp2_update(struct unit_directory *ud);
 477
 478static int sbp2_start_ud(struct sbp2scsi_host_info *hi,
 479                         struct unit_directory *ud);
 480static int sbp2_start_device(struct scsi_id_instance_data *scsi_id);
 481static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id);
 482
 483#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
 484static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data,
 485                                     u64 addr, size_t length, u16 flags);
 486static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_t *data,
 487                                    u64 addr, size_t length, u16 flags);
 488#endif
 489
 490/*
 491 * SBP-2 protocol related prototypes
 492 */
 493static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id);
 494static int sbp2_login_device(struct scsi_id_instance_data *scsi_id);
 495static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id); 
 496static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id); 
 497static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid,
 498                                    quadlet_t *data, u64 addr, size_t length, u16 flags);
 499static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait);
 500static int sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id,
 501                                   struct sbp2_command_info *command,
 502                                   unchar *scsi_cmd,
 503                                   unsigned int scsi_use_sg,
 504                                   unsigned int scsi_request_bufflen,
 505                                   void *scsi_request_buffer, 
 506                                   unsigned char scsi_dir);
 507static int sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id,
 508                                 struct sbp2_command_info *command);
 509static int sbp2_send_command(struct scsi_id_instance_data *scsi_id,
 510                             Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
 511static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data);
 512static void sbp2_check_sbp2_command(struct scsi_id_instance_data *scsi_id, unchar *cmd);
 513static void sbp2_check_sbp2_response(struct scsi_id_instance_data *scsi_id, Scsi_Cmnd *SCpnt);
 514static void sbp2_parse_unit_directory(struct scsi_id_group *scsi_group,
 515                                      struct unit_directory *ud);
 516static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id);
 517static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id);
 518
 519#endif /* SBP2_H */
 520
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.