linux/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#define SBP2_DEVICE_NAME                "sbp2"
  26
  27/*
  28 * There is no transport protocol limit to the CDB length,  but we implement
  29 * a fixed length only.  16 bytes is enough for disks larger than 2 TB.
  30 */
  31#define SBP2_MAX_CDB_SIZE               16
  32
  33/*
  34 * SBP-2 specific definitions
  35 */
  36
  37#define ORB_DIRECTION_WRITE_TO_MEDIA    0x0
  38#define ORB_DIRECTION_READ_FROM_MEDIA   0x1
  39#define ORB_DIRECTION_NO_DATA_TRANSFER  0x2
  40
  41#define ORB_SET_NULL_PTR(v)             (((v) & 0x1) << 31)
  42#define ORB_SET_NOTIFY(v)               (((v) & 0x1) << 31)
  43#define ORB_SET_RQ_FMT(v)               (((v) & 0x3) << 29)
  44#define ORB_SET_NODE_ID(v)              (((v) & 0xffff) << 16)
  45#define ORB_SET_STATUS_FIFO_HI(v, id)   ((v) >> 32 | ORB_SET_NODE_ID(id))
  46#define ORB_SET_STATUS_FIFO_LO(v)       ((v) & 0xffffffff)
  47#define ORB_SET_DATA_SIZE(v)            ((v) & 0xffff)
  48#define ORB_SET_PAGE_SIZE(v)            (((v) & 0x7) << 16)
  49#define ORB_SET_PAGE_TABLE_PRESENT(v)   (((v) & 0x1) << 19)
  50#define ORB_SET_MAX_PAYLOAD(v)          (((v) & 0xf) << 20)
  51#define ORB_SET_SPEED(v)                (((v) & 0x7) << 24)
  52#define ORB_SET_DIRECTION(v)            (((v) & 0x1) << 27)
  53
  54struct sbp2_command_orb {
  55        u32 next_ORB_hi;
  56        u32 next_ORB_lo;
  57        u32 data_descriptor_hi;
  58        u32 data_descriptor_lo;
  59        u32 misc;
  60        u8 cdb[SBP2_MAX_CDB_SIZE];
  61} __attribute__((packed));
  62
  63#define SBP2_LOGIN_REQUEST              0x0
  64#define SBP2_QUERY_LOGINS_REQUEST       0x1
  65#define SBP2_RECONNECT_REQUEST          0x3
  66#define SBP2_SET_PASSWORD_REQUEST       0x4
  67#define SBP2_LOGOUT_REQUEST             0x7
  68#define SBP2_ABORT_TASK_REQUEST         0xb
  69#define SBP2_ABORT_TASK_SET             0xc
  70#define SBP2_LOGICAL_UNIT_RESET         0xe
  71#define SBP2_TARGET_RESET_REQUEST       0xf
  72
  73#define ORB_SET_LUN(v)                  ((v) & 0xffff)
  74#define ORB_SET_FUNCTION(v)             (((v) & 0xf) << 16)
  75#define ORB_SET_RECONNECT(v)            (((v) & 0xf) << 20)
  76#define ORB_SET_EXCLUSIVE(v)            ((v) ? 1 << 28 : 0)
  77#define ORB_SET_LOGIN_RESP_LENGTH(v)    ((v) & 0xffff)
  78#define ORB_SET_PASSWD_LENGTH(v)        (((v) & 0xffff) << 16)
  79
  80struct sbp2_login_orb {
  81        u32 password_hi;
  82        u32 password_lo;
  83        u32 login_response_hi;
  84        u32 login_response_lo;
  85        u32 lun_misc;
  86        u32 passwd_resp_lengths;
  87        u32 status_fifo_hi;
  88        u32 status_fifo_lo;
  89} __attribute__((packed));
  90
  91#define RESPONSE_GET_LOGIN_ID(v)        ((v) & 0xffff)
  92#define RESPONSE_GET_LENGTH(v)          (((v) >> 16) & 0xffff)
  93#define RESPONSE_GET_RECONNECT_HOLD(v)  ((v) & 0xffff)
  94
  95struct 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} __attribute__((packed));
 101
 102#define ORB_SET_LOGIN_ID(v)                 ((v) & 0xffff)
 103#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(v) ((v) & 0xffff)
 104
 105struct sbp2_query_logins_orb {
 106        u32 reserved1;
 107        u32 reserved2;
 108        u32 query_response_hi;
 109        u32 query_response_lo;
 110        u32 lun_misc;
 111        u32 reserved_resp_length;
 112        u32 status_fifo_hi;
 113        u32 status_fifo_lo;
 114} __attribute__((packed));
 115
 116#define RESPONSE_GET_MAX_LOGINS(v)      ((v) & 0xffff)
 117#define RESPONSE_GET_ACTIVE_LOGINS(v)   ((RESPONSE_GET_LENGTH((v)) - 4) / 12)
 118
 119struct sbp2_query_logins_response {
 120        u32 length_max_logins;
 121        u32 misc_IDs;
 122        u32 initiator_misc_hi;
 123        u32 initiator_misc_lo;
 124} __attribute__((packed));
 125
 126struct sbp2_reconnect_orb {
 127        u32 reserved1;
 128        u32 reserved2;
 129        u32 reserved3;
 130        u32 reserved4;
 131        u32 login_ID_misc;
 132        u32 reserved5;
 133        u32 status_fifo_hi;
 134        u32 status_fifo_lo;
 135} __attribute__((packed));
 136
 137struct sbp2_logout_orb {
 138        u32 reserved1;
 139        u32 reserved2;
 140        u32 reserved3;
 141        u32 reserved4;
 142        u32 login_ID_misc;
 143        u32 reserved5;
 144        u32 status_fifo_hi;
 145        u32 status_fifo_lo;
 146} __attribute__((packed));
 147
 148struct sbp2_unrestricted_page_table {
 149        __be32 high;
 150        __be32 low;
 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 STATUS_GET_SRC(v)                       (((v) >> 30) & 0x3)
 177#define STATUS_GET_RESP(v)                      (((v) >> 28) & 0x3)
 178#define STATUS_GET_LEN(v)                       (((v) >> 24) & 0x7)
 179#define STATUS_GET_SBP_STATUS(v)                (((v) >> 16) & 0xff)
 180#define STATUS_GET_ORB_OFFSET_HI(v)             ((v) & 0x0000ffff)
 181#define STATUS_TEST_DEAD(v)                     ((v) & 0x08000000)
 182/* test 'resp' | 'dead' | 'sbp2_status' */
 183#define STATUS_TEST_RDS(v)                      ((v) & 0x38ff0000)
 184
 185struct sbp2_status_block {
 186        u32 ORB_offset_hi_misc;
 187        u32 ORB_offset_lo;
 188        u8 command_set_dependent[24];
 189} __attribute__((packed));
 190
 191
 192/*
 193 * SBP2 related configuration ROM definitions
 194 */
 195
 196#define SBP2_UNIT_DIRECTORY_OFFSET_KEY          0xd1
 197#define SBP2_CSR_OFFSET_KEY                     0x54
 198#define SBP2_UNIT_SPEC_ID_KEY                   0x12
 199#define SBP2_UNIT_SW_VERSION_KEY                0x13
 200#define SBP2_COMMAND_SET_SPEC_ID_KEY            0x38
 201#define SBP2_COMMAND_SET_KEY                    0x39
 202#define SBP2_UNIT_CHARACTERISTICS_KEY           0x3a
 203#define SBP2_DEVICE_TYPE_AND_LUN_KEY            0x14
 204#define SBP2_FIRMWARE_REVISION_KEY              0x3c
 205
 206#define SBP2_AGENT_STATE_OFFSET                 0x00ULL
 207#define SBP2_AGENT_RESET_OFFSET                 0x04ULL
 208#define SBP2_ORB_POINTER_OFFSET                 0x08ULL
 209#define SBP2_DOORBELL_OFFSET                    0x10ULL
 210#define SBP2_UNSOLICITED_STATUS_ENABLE_OFFSET   0x14ULL
 211#define SBP2_UNSOLICITED_STATUS_VALUE           0xf
 212
 213#define SBP2_BUSY_TIMEOUT_ADDRESS               0xfffff0000210ULL
 214/* biggest possible value for Single Phase Retry count is 0xf */
 215#define SBP2_BUSY_TIMEOUT_VALUE                 0xf
 216
 217#define SBP2_AGENT_RESET_DATA                   0xf
 218
 219#define SBP2_UNIT_SPEC_ID_ENTRY                 0x0000609e
 220#define SBP2_SW_VERSION_ENTRY                   0x00010483
 221
 222/*
 223 * The default maximum s/g segment size of a FireWire controller is
 224 * usually 0x10000, but SBP-2 only allows 0xffff. Since buffers have to
 225 * be quadlet-aligned, we set the length limit to 0xffff & ~3.
 226 */
 227#define SBP2_MAX_SEG_SIZE                       0xfffc
 228
 229/*
 230 * There is no real limitation of the queue depth (i.e. length of the linked
 231 * list of command ORBs) at the target. The chosen depth is merely an
 232 * implementation detail of the sbp2 driver.
 233 */
 234#define SBP2_MAX_CMDS                           8
 235
 236#define SBP2_SCSI_STATUS_GOOD                   0x0
 237#define SBP2_SCSI_STATUS_CHECK_CONDITION        0x2
 238#define SBP2_SCSI_STATUS_CONDITION_MET          0x4
 239#define SBP2_SCSI_STATUS_BUSY                   0x8
 240#define SBP2_SCSI_STATUS_RESERVATION_CONFLICT   0x18
 241#define SBP2_SCSI_STATUS_COMMAND_TERMINATED     0x22
 242#define SBP2_SCSI_STATUS_SELECTION_TIMEOUT      0xff
 243
 244
 245/*
 246 * Representations of commands and devices
 247 */
 248
 249/* Per SCSI command */
 250struct sbp2_command_info {
 251        struct list_head list;
 252        struct sbp2_command_orb command_orb;
 253        dma_addr_t command_orb_dma;
 254        struct scsi_cmnd *Current_SCpnt;
 255        void (*Current_done)(struct scsi_cmnd *);
 256
 257        /* Also need s/g structure for each sbp2 command */
 258        struct sbp2_unrestricted_page_table
 259                scatter_gather_element[SG_ALL] __attribute__((aligned(8)));
 260        dma_addr_t sge_dma;
 261};
 262
 263/* Per FireWire host */
 264struct sbp2_fwhost_info {
 265        struct hpsb_host *host;
 266        struct list_head logical_units;
 267};
 268
 269/* Per logical unit */
 270struct sbp2_lu {
 271        /* Operation request blocks */
 272        struct sbp2_command_orb *last_orb;
 273        dma_addr_t last_orb_dma;
 274        struct sbp2_login_orb *login_orb;
 275        dma_addr_t login_orb_dma;
 276        struct sbp2_login_response *login_response;
 277        dma_addr_t login_response_dma;
 278        struct sbp2_query_logins_orb *query_logins_orb;
 279        dma_addr_t query_logins_orb_dma;
 280        struct sbp2_query_logins_response *query_logins_response;
 281        dma_addr_t query_logins_response_dma;
 282        struct sbp2_reconnect_orb *reconnect_orb;
 283        dma_addr_t reconnect_orb_dma;
 284        struct sbp2_logout_orb *logout_orb;
 285        dma_addr_t logout_orb_dma;
 286        struct sbp2_status_block status_block;
 287
 288        /* How to talk to the unit */
 289        u64 management_agent_addr;
 290        u64 command_block_agent_addr;
 291        u32 speed_code;
 292        u32 max_payload_size;
 293        u16 lun;
 294
 295        /* Address for the unit to write status blocks to */
 296        u64 status_fifo_addr;
 297
 298        /* Waitqueue flag for logins, reconnects, logouts, query logins */
 299        unsigned int access_complete:1;
 300
 301        /* Pool of command ORBs for this logical unit */
 302        spinlock_t cmd_orb_lock;
 303        struct list_head cmd_orb_inuse;
 304        struct list_head cmd_orb_completed;
 305
 306        /* Backlink to FireWire host; list of units attached to the host */
 307        struct sbp2_fwhost_info *hi;
 308        struct list_head lu_list;
 309
 310        /* IEEE 1394 core's device representations */
 311        struct node_entry *ne;
 312        struct unit_directory *ud;
 313
 314        /* SCSI core's device representations */
 315        struct scsi_device *sdev;
 316        struct Scsi_Host *shost;
 317
 318        /* Device specific workarounds/brokeness */
 319        unsigned workarounds;
 320
 321        /* Connection state */
 322        atomic_t state;
 323
 324        /* For deferred requests to the fetch agent */
 325        struct work_struct protocol_work;
 326};
 327
 328/* For use in sbp2_lu.state */
 329enum sbp2lu_state_types {
 330        SBP2LU_STATE_RUNNING,           /* all normal */
 331        SBP2LU_STATE_IN_RESET,          /* between bus reset and reconnect */
 332        SBP2LU_STATE_IN_SHUTDOWN        /* when sbp2_remove was called */
 333};
 334
 335/* For use in sbp2_lu.workarounds and in the corresponding
 336 * module load parameter */
 337#define SBP2_WORKAROUND_128K_MAX_TRANS  0x1
 338#define SBP2_WORKAROUND_INQUIRY_36      0x2
 339#define SBP2_WORKAROUND_MODE_SENSE_8    0x4
 340#define SBP2_WORKAROUND_FIX_CAPACITY    0x8
 341#define SBP2_WORKAROUND_DELAY_INQUIRY   0x10
 342#define SBP2_INQUIRY_DELAY              12
 343#define SBP2_WORKAROUND_POWER_CONDITION 0x20
 344#define SBP2_WORKAROUND_OVERRIDE        0x100
 345
 346#endif /* SBP2_H */
 347
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.