Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _WD719X_H_
0003 #define _WD719X_H_
0004 
0005 #define WD719X_SG 255       /* Scatter/gather size */
0006 
0007 struct wd719x_sglist {
0008     __le32 ptr;
0009     __le32 length;
0010 } __packed;
0011 
0012 enum wd719x_card_type {
0013     WD719X_TYPE_UNKNOWN = 0,
0014     WD719X_TYPE_7193,
0015     WD719X_TYPE_7197,
0016     WD719X_TYPE_7296,
0017 };
0018 
0019 union wd719x_regs {
0020     __le32 all; /* All Status at once */
0021     struct {
0022         u8 OPC;     /* Opcode register */
0023         u8 SCSI;    /* SCSI Errors */
0024         u8 SUE;     /* Spider unique Errors */
0025         u8 INT;     /* Interrupt Status */
0026     } bytes;
0027 };
0028 
0029 /* Spider Command Block (SCB) */
0030 struct wd719x_scb {
0031     __le32 Int_SCB; /* 00-03 Internal SCB link pointer (must be cleared) */
0032     u8 SCB_opcode;  /* 04 SCB Command opcode */
0033     u8 CDB_tag; /* 05 SCSI Tag byte for CDB queues (0 if untagged) */
0034     u8 lun;     /* 06 SCSI LUN */
0035     u8 devid;   /* 07 SCSI Device ID */
0036     u8 CDB[16]; /* 08-23 SCSI CDB (16 bytes as defined by ANSI spec. */
0037     __le32 data_p;  /* 24-27 Data transfer address (or SG list address) */
0038     __le32 data_length; /* 28-31 Data transfer Length (or SG list length) */
0039     __le32 CDB_link;    /* 32-35 SCSI CDB Link Ptr */
0040     __le32 sense_buf;   /* 36-39 Auto request sense buffer address */
0041     u8 sense_buf_length;/* 40 Auto request sense transfer length */
0042     u8 reserved;    /* 41 reserved */
0043     u8 SCB_options; /* 42 SCB-options */
0044     u8 SCB_tag_msg; /* 43 Tagged messages options */
0045     /* Not filled in by host */
0046     __le32 req_ptr; /* 44-47 Ptr to Host Request returned on interrupt */
0047     u8 host_opcode; /* 48 Host Command Opcode (same as AMR_00) */
0048     u8 scsi_stat;   /* 49 SCSI Status returned */
0049     u8 ret_error;   /* 50 SPIDER Unique Error Code returned (SUE) */
0050     u8 int_stat;    /* 51 Message u8 / Interrupt Status byte returned */
0051     __le32 transferred; /* 52-55 Bytes Transferred */
0052     u8 last_trans[3];  /* 56-58 Bytes Transferred in last session */
0053     u8 length;  /* 59 SCSI Messages Length (1-8) */
0054     u8 sync_offset; /* 60 Synchronous offset */
0055     u8 sync_rate;   /* 61 Synchronous rate */
0056     u8 flags[2];    /* 62-63 SCB specific flags (local to each thread) */
0057     /* everything below is for driver use (not used by card) */
0058     dma_addr_t phys;    /* bus address of the SCB */
0059     dma_addr_t dma_handle;
0060     struct scsi_cmnd *cmd;  /* a copy of the pointer we were passed */
0061     struct list_head list;
0062     struct wd719x_sglist sg_list[WD719X_SG] __aligned(8); /* SG list */
0063 } __packed;
0064 
0065 struct wd719x {
0066     struct Scsi_Host *sh;   /* pointer to host structure */
0067     struct pci_dev *pdev;
0068     void __iomem *base;
0069     enum wd719x_card_type type; /* type of card */
0070     void *fw_virt;      /* firmware buffer CPU address */
0071     dma_addr_t fw_phys; /* firmware buffer bus address */
0072     size_t fw_size;     /* firmware buffer size */
0073     struct wd719x_host_param *params; /* host parameters (EEPROM) */
0074     dma_addr_t params_phys; /* host parameters bus address */
0075     void *hash_virt;    /* hash table CPU address */
0076     dma_addr_t hash_phys;   /* hash table bus address */
0077     struct list_head active_scbs;
0078 };
0079 
0080 /* timeout delays in microsecs */
0081 #define WD719X_WAIT_FOR_CMD_READY   500
0082 #define WD719X_WAIT_FOR_RISC        2000
0083 #define WD719X_WAIT_FOR_SCSI_RESET  3000000
0084 
0085 /* All commands except 0x00 generate an interrupt */
0086 #define WD719X_CMD_READY    0x00 /* Command register ready (or noop) */
0087 #define WD719X_CMD_INIT_RISC    0x01 /* Initialize RISC */
0088 /* 0x02 is reserved */
0089 #define WD719X_CMD_BUSRESET 0x03 /* Assert SCSI bus reset */
0090 #define WD719X_CMD_READ_FIRMVER 0x04 /* Read the Firmware Revision */
0091 #define WD719X_CMD_ECHO_BYTES   0x05 /* Echo command bytes (DW) */
0092 /* 0x06 is reserved */
0093 /* 0x07 is reserved */
0094 #define WD719X_CMD_GET_PARAM    0x08 /* Get programmable parameters */
0095 #define WD719X_CMD_SET_PARAM    0x09 /* Set programmable parameters */
0096 #define WD719X_CMD_SLEEP    0x0a /* Put SPIDER to sleep */
0097 #define WD719X_CMD_READ_INIT    0x0b /* Read initialization parameters */
0098 #define WD719X_CMD_RESTORE_INIT 0x0c /* Restore initialization parameters */
0099 /* 0x0d is reserved */
0100 /* 0x0e is reserved */
0101 /* 0x0f is reserved */
0102 #define WD719X_CMD_ABORT_TAG    0x10 /* Send Abort tag message to target */
0103 #define WD719X_CMD_ABORT    0x11 /* Send Abort message to target */
0104 #define WD719X_CMD_RESET    0x12 /* Send Reset message to target */
0105 #define WD719X_CMD_INIT_SCAM    0x13 /* Initiate SCAM */
0106 #define WD719X_CMD_GET_SYNC 0x14 /* Get synchronous rates */
0107 #define WD719X_CMD_SET_SYNC 0x15 /* Set synchronous rates */
0108 #define WD719X_CMD_GET_WIDTH    0x16 /* Get SCSI bus width */
0109 #define WD719X_CMD_SET_WIDTH    0x17 /* Set SCSI bus width */
0110 #define WD719X_CMD_GET_TAGS 0x18 /* Get tag flags */
0111 #define WD719X_CMD_SET_TAGS 0x19 /* Set tag flags */
0112 #define WD719X_CMD_GET_PARAM2   0x1a /* Get programmable params (format 2) */
0113 #define WD719X_CMD_SET_PARAM2   0x1b /* Set programmable params (format 2) */
0114 /* Commands with request pointers (mailbox) */
0115 #define WD719X_CMD_PROCESS_SCB  0x80 /* Process SCSI Control Block (SCB) */
0116 /* No interrupt generated on acceptance of SCB pointer */
0117 
0118 /* interrupt status defines */
0119 #define WD719X_INT_NONE     0x00 /* No interrupt pending */
0120 #define WD719X_INT_NOERRORS 0x01 /* Command completed with no errors */
0121 #define WD719X_INT_LINKNOERRORS 0x02 /* link cmd completed with no errors */
0122 #define WD719X_INT_LINKNOSTATUS 0x03 /* link cmd completed with no flag set */
0123 #define WD719X_INT_ERRORSLOGGED 0x04 /* cmd completed with errors logged */
0124 #define WD719X_INT_SPIDERFAILED 0x05 /* cmd failed without valid SCSI status */
0125 #define WD719X_INT_BADINT   0x80 /* unsolicited interrupt */
0126 #define WD719X_INT_PIOREADY 0xf0 /* data ready for PIO output */
0127 
0128 /* Spider Unique Error Codes (SUE) */
0129 #define WD719X_SUE_NOERRORS 0x00 /* No errors detected by SPIDER */
0130 #define WD719X_SUE_REJECTED 0x01 /* Command Rejected (bad opcode/param) */
0131 #define WD719X_SUE_SCBQFULL 0x02 /* SCB queue full */
0132 /* 0x03 is reserved */
0133 #define WD719X_SUE_TERM     0x04 /* Host terminated SCB via primative cmd */
0134 #define WD719X_SUE_CHAN1PAR 0x05 /* PCI Channel 1 parity error occurred */
0135 #define WD719X_SUE_CHAN1ABORT   0x06 /* PCI Channel 1 system abort occurred */
0136 #define WD719X_SUE_CHAN23PAR    0x07 /* PCI Channel 2/3 parity error occurred */
0137 #define WD719X_SUE_CHAN23ABORT  0x08 /* PCI Channel 2/3 system abort occurred */
0138 #define WD719X_SUE_TIMEOUT  0x10 /* Selection/reselection timeout */
0139 #define WD719X_SUE_RESET    0x11 /* SCSI bus reset occurred */
0140 #define WD719X_SUE_BUSERROR 0x12 /* SCSI bus error */
0141 #define WD719X_SUE_WRONGWAY 0x13 /* Wrong data transfer dir set by target */
0142 #define WD719X_SUE_BADPHASE 0x14 /* SCSI phase illegal or unexpected */
0143 #define WD719X_SUE_TOOLONG  0x15 /* target requested too much data */
0144 #define WD719X_SUE_BUSFREE  0x16 /* Unexpected SCSI bus free */
0145 #define WD719X_SUE_ARSDONE  0x17 /* Auto request sense executed */
0146 #define WD719X_SUE_IGNORED  0x18 /* SCSI message was ignored by target */
0147 #define WD719X_SUE_WRONGTAGS    0x19 /* Tagged SCB & tags off (or vice versa) */
0148 #define WD719X_SUE_BADTAGS  0x1a /* Wrong tag message type for target */
0149 #define WD719X_SUE_NOSCAMID 0x1b /* No SCAM soft ID available */
0150 
0151 /* code sizes */
0152 #define WD719X_HASH_TABLE_SIZE  4096
0153 
0154 /* Advanced Mode Registers */
0155 /* Regs 0x00..0x1f are for Advanced Mode of the card (RISC is running). */
0156 #define WD719X_AMR_COMMAND      0x00
0157 #define WD719X_AMR_CMD_PARAM        0x01
0158 #define WD719X_AMR_CMD_PARAM_2      0x02
0159 #define WD719X_AMR_CMD_PARAM_3      0x03
0160 #define WD719X_AMR_SCB_IN       0x04
0161 
0162 #define WD719X_AMR_BIOS_SHARE_INT   0x0f
0163 
0164 #define WD719X_AMR_SCB_OUT      0x18
0165 #define WD719X_AMR_OP_CODE      0x1c
0166 #define WD719X_AMR_SCSI_STATUS      0x1d
0167 #define WD719X_AMR_SCB_ERROR        0x1e
0168 #define WD719X_AMR_INT_STATUS       0x1f
0169 
0170 #define WD719X_DISABLE_INT  0x80
0171 
0172 /* SCB flags */
0173 #define WD719X_SCB_FLAGS_CHECK_DIRECTION    0x01
0174 #define WD719X_SCB_FLAGS_PCI_TO_SCSI        0x02
0175 #define WD719X_SCB_FLAGS_AUTO_REQUEST_SENSE 0x10
0176 #define WD719X_SCB_FLAGS_DO_SCATTER_GATHER  0x20
0177 #define WD719X_SCB_FLAGS_NO_DISCONNECT      0x40
0178 
0179 /* PCI Registers used for reset, initial code download */
0180 /* Regs 0x20..0x3f are for Normal (DOS) mode (RISC is asleep). */
0181 #define WD719X_PCI_GPIO_CONTROL     0x3C
0182 #define WD719X_PCI_GPIO_DATA        0x3D
0183 #define WD719X_PCI_PORT_RESET       0x3E
0184 #define WD719X_PCI_MODE_SELECT      0x3F
0185 
0186 #define WD719X_PCI_EXTERNAL_ADDR    0x60
0187 #define WD719X_PCI_INTERNAL_ADDR    0x64
0188 #define WD719X_PCI_DMA_TRANSFER_SIZE    0x66
0189 #define WD719X_PCI_CHANNEL2_3CMD    0x68
0190 #define WD719X_PCI_CHANNEL2_3STATUS 0x69
0191 
0192 #define WD719X_GPIO_ID_BITS     0x0a
0193 #define WD719X_PRAM_BASE_ADDR       0x00
0194 
0195 /* codes written to or read from the card */
0196 #define WD719X_PCI_RESET         0x01
0197 #define WD719X_ENABLE_ADVANCE_MODE   0x01
0198 
0199 #define WD719X_START_CHANNEL2_3DMA   0x17
0200 #define WD719X_START_CHANNEL2_3DONE  0x01
0201 #define WD719X_START_CHANNEL2_3ABORT     0x20
0202 
0203 /* 33C296 GPIO bits for EEPROM pins */
0204 #define WD719X_EE_DI    (1 << 1)
0205 #define WD719X_EE_CS    (1 << 2)
0206 #define WD719X_EE_CLK   (1 << 3)
0207 #define WD719X_EE_DO    (1 << 4)
0208 
0209 /* EEPROM contents */
0210 struct wd719x_eeprom_header {
0211     u8 sig1;
0212     u8 sig2;
0213     u8 version;
0214     u8 checksum;
0215     u8 cfg_offset;
0216     u8 cfg_size;
0217     u8 setup_offset;
0218     u8 setup_size;
0219 } __packed;
0220 
0221 #define WD719X_EE_SIG1      0
0222 #define WD719X_EE_SIG2      1
0223 #define WD719X_EE_VERSION   2
0224 #define WD719X_EE_CHECKSUM  3
0225 #define WD719X_EE_CFG_OFFSET    4
0226 #define WD719X_EE_CFG_SIZE  5
0227 #define WD719X_EE_SETUP_OFFSET  6
0228 #define WD719X_EE_SETUP_SIZE    7
0229 
0230 #define WD719X_EE_SCSI_ID_MASK  0xf
0231 
0232 /* SPIDER Host Parameters Block (=EEPROM configuration block) */
0233 struct wd719x_host_param {
0234     u8 ch_1_th; /* FIFO threshold */
0235     u8 scsi_conf;   /* SCSI configuration */
0236     u8 own_scsi_id; /* controller SCSI ID */
0237     u8 sel_timeout; /* selection timeout*/
0238     u8 sleep_timer; /* seep timer */
0239     __le16 cdb_size;/* CDB size groups */
0240     __le16 tag_en;  /* Tag msg enables (ID 0-15) */
0241     u8 scsi_pad;    /* SCSI pad control */
0242     __le32 wide;    /* WIDE msg options (ID 0-15) */
0243     __le32 sync;    /* SYNC msg options (ID 0-15) */
0244     u8 soft_mask;   /* soft error mask */
0245     u8 unsol_mask;  /* unsolicited error mask */
0246 } __packed;
0247 
0248 #endif /* _WD719X_H_ */