0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #ifndef NCR5380_H
0024 #define NCR5380_H
0025
0026 #include <linux/delay.h>
0027 #include <linux/interrupt.h>
0028 #include <linux/list.h>
0029 #include <linux/workqueue.h>
0030 #include <scsi/scsi_dbg.h>
0031 #include <scsi/scsi_eh.h>
0032 #include <scsi/scsi_transport_spi.h>
0033
0034 #define NDEBUG_ARBITRATION 0x1
0035 #define NDEBUG_AUTOSENSE 0x2
0036 #define NDEBUG_DMA 0x4
0037 #define NDEBUG_HANDSHAKE 0x8
0038 #define NDEBUG_INFORMATION 0x10
0039 #define NDEBUG_INIT 0x20
0040 #define NDEBUG_INTR 0x40
0041 #define NDEBUG_LINKED 0x80
0042 #define NDEBUG_MAIN 0x100
0043 #define NDEBUG_NO_DATAOUT 0x200
0044 #define NDEBUG_NO_WRITE 0x400
0045 #define NDEBUG_PIO 0x800
0046 #define NDEBUG_PSEUDO_DMA 0x1000
0047 #define NDEBUG_QUEUES 0x2000
0048 #define NDEBUG_RESELECTION 0x4000
0049 #define NDEBUG_SELECTION 0x8000
0050 #define NDEBUG_USLEEP 0x10000
0051 #define NDEBUG_LAST_BYTE_SENT 0x20000
0052 #define NDEBUG_RESTART_SELECT 0x40000
0053 #define NDEBUG_EXTENDED 0x80000
0054 #define NDEBUG_C400_PREAD 0x100000
0055 #define NDEBUG_C400_PWRITE 0x200000
0056 #define NDEBUG_LISTS 0x400000
0057 #define NDEBUG_ABORT 0x800000
0058 #define NDEBUG_TAGS 0x1000000
0059 #define NDEBUG_MERGING 0x2000000
0060
0061 #define NDEBUG_ANY 0xFFFFFFFFUL
0062
0063
0064
0065
0066
0067
0068
0069
0070 #define OUTPUT_DATA_REG 0
0071 #define CURRENT_SCSI_DATA_REG 0
0072
0073 #define INITIATOR_COMMAND_REG 1
0074 #define ICR_ASSERT_RST 0x80
0075 #define ICR_ARBITRATION_PROGRESS 0x40
0076 #define ICR_TRI_STATE 0x40
0077 #define ICR_ARBITRATION_LOST 0x20
0078 #define ICR_DIFF_ENABLE 0x20
0079 #define ICR_ASSERT_ACK 0x10
0080 #define ICR_ASSERT_BSY 0x08
0081 #define ICR_ASSERT_SEL 0x04
0082 #define ICR_ASSERT_ATN 0x02
0083 #define ICR_ASSERT_DATA 0x01
0084
0085 #define ICR_BASE 0
0086
0087 #define MODE_REG 2
0088
0089
0090
0091
0092
0093 #define MR_BLOCK_DMA_MODE 0x80
0094 #define MR_TARGET 0x40
0095 #define MR_ENABLE_PAR_CHECK 0x20
0096 #define MR_ENABLE_PAR_INTR 0x10
0097 #define MR_ENABLE_EOP_INTR 0x08
0098 #define MR_MONITOR_BSY 0x04
0099 #define MR_DMA_MODE 0x02
0100 #define MR_ARBITRATE 0x01
0101
0102 #define MR_BASE 0
0103
0104 #define TARGET_COMMAND_REG 3
0105 #define TCR_LAST_BYTE_SENT 0x80
0106 #define TCR_ASSERT_REQ 0x08
0107 #define TCR_ASSERT_MSG 0x04
0108 #define TCR_ASSERT_CD 0x02
0109 #define TCR_ASSERT_IO 0x01
0110
0111 #define STATUS_REG 4
0112
0113
0114
0115
0116 #define SR_RST 0x80
0117 #define SR_BSY 0x40
0118 #define SR_REQ 0x20
0119 #define SR_MSG 0x10
0120 #define SR_CD 0x08
0121 #define SR_IO 0x04
0122 #define SR_SEL 0x02
0123 #define SR_DBP 0x01
0124
0125
0126
0127
0128
0129 #define SELECT_ENABLE_REG 4
0130
0131 #define BUS_AND_STATUS_REG 5
0132 #define BASR_END_DMA_TRANSFER 0x80
0133 #define BASR_DRQ 0x40
0134 #define BASR_PARITY_ERROR 0x20
0135 #define BASR_IRQ 0x10
0136 #define BASR_PHASE_MATCH 0x08
0137 #define BASR_BUSY_ERROR 0x04
0138 #define BASR_ATN 0x02
0139 #define BASR_ACK 0x01
0140
0141
0142 #define START_DMA_SEND_REG 5
0143
0144
0145
0146
0147
0148 #define INPUT_DATA_REG 6
0149
0150
0151 #define START_DMA_TARGET_RECEIVE_REG 6
0152
0153
0154 #define RESET_PARITY_INTERRUPT_REG 7
0155
0156
0157 #define START_DMA_INITIATOR_RECEIVE_REG 7
0158
0159
0160 #define CSR_RESET 0x80
0161 #define CSR_53C80_REG 0x80
0162 #define CSR_TRANS_DIR 0x40
0163 #define CSR_SCSI_BUFF_INTR 0x20
0164 #define CSR_53C80_INTR 0x10
0165 #define CSR_SHARED_INTR 0x08
0166 #define CSR_HOST_BUF_NOT_RDY 0x04
0167 #define CSR_SCSI_BUF_RDY 0x02
0168 #define CSR_GATED_53C80_IRQ 0x01
0169
0170 #define CSR_BASE CSR_53C80_INTR
0171
0172
0173 #define PHASE_MASK (SR_MSG | SR_CD | SR_IO)
0174
0175 #define PHASE_DATAOUT 0
0176 #define PHASE_DATAIN SR_IO
0177 #define PHASE_CMDOUT SR_CD
0178 #define PHASE_STATIN (SR_CD | SR_IO)
0179 #define PHASE_MSGOUT (SR_MSG | SR_CD)
0180 #define PHASE_MSGIN (SR_MSG | SR_CD | SR_IO)
0181 #define PHASE_UNKNOWN 0xff
0182
0183
0184
0185
0186
0187
0188
0189 #define PHASE_SR_TO_TCR(phase) ((phase) >> 2)
0190
0191 #ifndef NO_IRQ
0192 #define NO_IRQ 0
0193 #endif
0194
0195 #define FLAG_DMA_FIXUP 1
0196 #define FLAG_NO_PSEUDO_DMA 8
0197 #define FLAG_LATE_DMA_SETUP 32
0198 #define FLAG_TOSHIBA_DELAY 128
0199
0200 struct NCR5380_hostdata {
0201 NCR5380_implementation_fields;
0202 u8 __iomem *io;
0203 u8 __iomem *pdma_io;
0204 unsigned long poll_loops;
0205 spinlock_t lock;
0206 struct scsi_cmnd *connected;
0207 struct list_head disconnected;
0208 struct Scsi_Host *host;
0209 struct workqueue_struct *work_q;
0210 struct work_struct main_task;
0211 int flags;
0212 int dma_len;
0213 int read_overruns;
0214 unsigned long io_port;
0215 unsigned long base;
0216 struct list_head unissued;
0217 struct scsi_cmnd *selecting;
0218 struct list_head autosense;
0219 struct scsi_cmnd *sensing;
0220 struct scsi_eh_save ses;
0221 unsigned char busy[8];
0222 unsigned char id_mask;
0223 unsigned char id_higher_mask;
0224 unsigned char last_message;
0225 unsigned long region_size;
0226 char info[168];
0227 };
0228
0229 struct NCR5380_cmd {
0230 char *ptr;
0231 int this_residual;
0232 struct scatterlist *buffer;
0233 int status;
0234 int message;
0235 int phase;
0236 struct list_head list;
0237 };
0238
0239 #define NCR5380_PIO_CHUNK_SIZE 256
0240
0241
0242 #define NCR5380_REG_POLL_TIME 10
0243
0244 static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr)
0245 {
0246 return ((struct scsi_cmnd *)ncmd_ptr) - 1;
0247 }
0248
0249 static inline struct NCR5380_cmd *NCR5380_to_ncmd(struct scsi_cmnd *cmd)
0250 {
0251 return scsi_cmd_priv(cmd);
0252 }
0253
0254 #ifndef NDEBUG
0255 #define NDEBUG (0)
0256 #endif
0257
0258 #define dprintk(flg, fmt, ...) \
0259 do { if ((NDEBUG) & (flg)) \
0260 printk(KERN_DEBUG fmt, ## __VA_ARGS__); } while (0)
0261
0262 #define dsprintk(flg, host, fmt, ...) \
0263 do { if ((NDEBUG) & (flg)) \
0264 shost_printk(KERN_DEBUG, host, fmt, ## __VA_ARGS__); \
0265 } while (0)
0266
0267 #if NDEBUG
0268 #define NCR5380_dprint(flg, arg) \
0269 do { if ((NDEBUG) & (flg)) NCR5380_print(arg); } while (0)
0270 #define NCR5380_dprint_phase(flg, arg) \
0271 do { if ((NDEBUG) & (flg)) NCR5380_print_phase(arg); } while (0)
0272 static void NCR5380_print_phase(struct Scsi_Host *instance);
0273 static void NCR5380_print(struct Scsi_Host *instance);
0274 #else
0275 #define NCR5380_dprint(flg, arg) do {} while (0)
0276 #define NCR5380_dprint_phase(flg, arg) do {} while (0)
0277 #endif
0278
0279 static int NCR5380_init(struct Scsi_Host *instance, int flags);
0280 static int NCR5380_maybe_reset_bus(struct Scsi_Host *);
0281 static void NCR5380_exit(struct Scsi_Host *instance);
0282 static void NCR5380_information_transfer(struct Scsi_Host *instance);
0283 static irqreturn_t NCR5380_intr(int irq, void *dev_id);
0284 static void NCR5380_main(struct work_struct *work);
0285 static const char *NCR5380_info(struct Scsi_Host *instance);
0286 static void NCR5380_reselect(struct Scsi_Host *instance);
0287 static bool NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *);
0288 static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
0289 static int NCR5380_transfer_pio(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data,
0290 unsigned int can_sleep);
0291 static int NCR5380_poll_politely2(struct NCR5380_hostdata *,
0292 unsigned int, u8, u8,
0293 unsigned int, u8, u8, unsigned long);
0294
0295 static inline int NCR5380_poll_politely(struct NCR5380_hostdata *hostdata,
0296 unsigned int reg, u8 bit, u8 val,
0297 unsigned long wait)
0298 {
0299 if ((NCR5380_read(reg) & bit) == val)
0300 return 0;
0301
0302 return NCR5380_poll_politely2(hostdata, reg, bit, val,
0303 reg, bit, val, wait);
0304 }
0305
0306 static int NCR5380_dma_xfer_len(struct NCR5380_hostdata *,
0307 struct scsi_cmnd *);
0308 static int NCR5380_dma_send_setup(struct NCR5380_hostdata *,
0309 unsigned char *, int);
0310 static int NCR5380_dma_recv_setup(struct NCR5380_hostdata *,
0311 unsigned char *, int);
0312 static int NCR5380_dma_residual(struct NCR5380_hostdata *);
0313
0314 static inline int NCR5380_dma_xfer_none(struct NCR5380_hostdata *hostdata,
0315 struct scsi_cmnd *cmd)
0316 {
0317 return 0;
0318 }
0319
0320 static inline int NCR5380_dma_setup_none(struct NCR5380_hostdata *hostdata,
0321 unsigned char *data, int count)
0322 {
0323 return 0;
0324 }
0325
0326 static inline int NCR5380_dma_residual_none(struct NCR5380_hostdata *hostdata)
0327 {
0328 return 0;
0329 }
0330
0331 #endif