0001
0002
0003
0004
0005
0006
0007 #ifndef _ESP_SCSI_H
0008 #define _ESP_SCSI_H
0009
0010
0011 #define ESP_TCLOW 0x00UL
0012 #define ESP_TCMED 0x01UL
0013 #define ESP_FDATA 0x02UL
0014 #define ESP_CMD 0x03UL
0015 #define ESP_STATUS 0x04UL
0016 #define ESP_BUSID ESP_STATUS
0017 #define ESP_INTRPT 0x05UL
0018 #define ESP_TIMEO ESP_INTRPT
0019 #define ESP_SSTEP 0x06UL
0020 #define ESP_STP ESP_SSTEP
0021 #define ESP_FFLAGS 0x07UL
0022 #define ESP_SOFF ESP_FFLAGS
0023 #define ESP_CFG1 0x08UL
0024 #define ESP_CFACT 0x09UL
0025 #define ESP_STATUS2 ESP_CFACT
0026 #define ESP_CTEST 0x0aUL
0027 #define ESP_CFG2 0x0bUL
0028 #define ESP_CFG3 0x0cUL
0029 #define ESP_CFG4 0x0dUL
0030 #define ESP_TCHI 0x0eUL
0031 #define ESP_UID ESP_TCHI
0032 #define FAS_RLO ESP_TCHI
0033 #define ESP_FGRND 0x0fUL
0034 #define FAS_RHI ESP_FGRND
0035
0036 #define SBUS_ESP_REG_SIZE 0x40UL
0037
0038
0039
0040
0041 #define ESP_CONFIG1_ID 0x07
0042 #define ESP_CONFIG1_CHTEST 0x08
0043 #define ESP_CONFIG1_PENABLE 0x10
0044 #define ESP_CONFIG1_PARTEST 0x20
0045 #define ESP_CONFIG1_SRRDISAB 0x40
0046 #define ESP_CONFIG1_SLCABLE 0x80
0047
0048
0049 #define ESP_CONFIG2_DMAPARITY 0x01
0050 #define ESP_CONFIG2_REGPARITY 0x02
0051 #define ESP_CONFIG2_BADPARITY 0x04
0052 #define ESP_CONFIG2_SCSI2ENAB 0x08
0053 #define ESP_CONFIG2_HI 0x10
0054 #define ESP_CONFIG2_HMEFENAB 0x10
0055 #define ESP_CONFIG2_BCM 0x20
0056 #define ESP_CONFIG2_DISPINT 0x20
0057 #define ESP_CONFIG2_FENAB 0x40
0058 #define ESP_CONFIG2_SPL 0x40
0059 #define ESP_CONFIG2_MKDONE 0x40
0060 #define ESP_CONFIG2_HME32 0x80
0061 #define ESP_CONFIG2_MAGIC 0xe0
0062
0063
0064 #define ESP_CONFIG3_FCLOCK 0x01
0065 #define ESP_CONFIG3_TEM 0x01
0066 #define ESP_CONFIG3_FAST 0x02
0067 #define ESP_CONFIG3_ADMA 0x02
0068 #define ESP_CONFIG3_TENB 0x04
0069 #define ESP_CONFIG3_SRB 0x04
0070 #define ESP_CONFIG3_TMS 0x08
0071 #define ESP_CONFIG3_FCLK 0x08
0072 #define ESP_CONFIG3_IDMSG 0x10
0073 #define ESP_CONFIG3_FSCSI 0x10
0074 #define ESP_CONFIG3_GTM 0x20
0075 #define ESP_CONFIG3_IDBIT3 0x20
0076 #define ESP_CONFIG3_TBMS 0x40
0077 #define ESP_CONFIG3_EWIDE 0x40
0078 #define ESP_CONFIG3_IMS 0x80
0079 #define ESP_CONFIG3_OBPUSH 0x80
0080
0081
0082 #define ESP_CONFIG4_BBTE 0x01
0083 #define ESP_CONGIG4_TEST 0x02
0084 #define ESP_CONFIG4_RADE 0x04
0085 #define ESP_CONFIG4_RAE 0x08
0086 #define ESP_CONFIG4_PWD 0x20
0087 #define ESP_CONFIG4_GE0 0x40
0088 #define ESP_CONFIG4_GE1 0x80
0089
0090 #define ESP_CONFIG_GE_12NS (0)
0091 #define ESP_CONFIG_GE_25NS (ESP_CONFIG_GE1)
0092 #define ESP_CONFIG_GE_35NS (ESP_CONFIG_GE0)
0093 #define ESP_CONFIG_GE_0NS (ESP_CONFIG_GE0 | ESP_CONFIG_GE1)
0094
0095
0096
0097
0098
0099
0100
0101 #define ESP_CMD_NULL 0x00
0102 #define ESP_CMD_FLUSH 0x01
0103 #define ESP_CMD_RC 0x02
0104 #define ESP_CMD_RS 0x03
0105
0106
0107
0108
0109 #define ESP_CMD_TI 0x10
0110 #define ESP_CMD_ICCSEQ 0x11
0111 #define ESP_CMD_MOK 0x12
0112 #define ESP_CMD_TPAD 0x18
0113 #define ESP_CMD_SATN 0x1a
0114 #define ESP_CMD_RATN 0x1b
0115
0116
0117
0118
0119 #define ESP_CMD_SMSG 0x20
0120 #define ESP_CMD_SSTAT 0x21
0121 #define ESP_CMD_SDATA 0x22
0122 #define ESP_CMD_DSEQ 0x23
0123 #define ESP_CMD_TSEQ 0x24
0124 #define ESP_CMD_TCCSEQ 0x25
0125 #define ESP_CMD_DCNCT 0x27
0126 #define ESP_CMD_RMSG 0x28
0127 #define ESP_CMD_RCMD 0x29
0128 #define ESP_CMD_RDATA 0x2a
0129 #define ESP_CMD_RCSEQ 0x2b
0130
0131
0132
0133
0134
0135 #define ESP_CMD_RSEL 0x40
0136 #define ESP_CMD_SEL 0x41
0137 #define ESP_CMD_SELA 0x42
0138 #define ESP_CMD_SELAS 0x43
0139 #define ESP_CMD_ESEL 0x44
0140 #define ESP_CMD_DSEL 0x45
0141 #define ESP_CMD_SA3 0x46
0142 #define ESP_CMD_RSEL3 0x47
0143
0144
0145 #define ESP_CMD_DMA 0x80
0146
0147
0148 #define ESP_STAT_PIO 0x01
0149 #define ESP_STAT_PCD 0x02
0150 #define ESP_STAT_PMSG 0x04
0151 #define ESP_STAT_PMASK 0x07
0152 #define ESP_STAT_TDONE 0x08
0153 #define ESP_STAT_TCNT 0x10
0154 #define ESP_STAT_PERR 0x20
0155 #define ESP_STAT_SPAM 0x40
0156
0157
0158
0159 #define ESP_STAT_INTR 0x80
0160
0161
0162
0163
0164
0165
0166 #define ESP_DOP (0)
0167 #define ESP_DIP (ESP_STAT_PIO)
0168 #define ESP_CMDP (ESP_STAT_PCD)
0169 #define ESP_STATP (ESP_STAT_PCD|ESP_STAT_PIO)
0170 #define ESP_MOP (ESP_STAT_PMSG|ESP_STAT_PCD)
0171 #define ESP_MIP (ESP_STAT_PMSG|ESP_STAT_PCD|ESP_STAT_PIO)
0172
0173
0174 #define ESP_STAT2_SCHBIT 0x01
0175 #define ESP_STAT2_FFLAGS 0x02
0176 #define ESP_STAT2_XCNT 0x04
0177 #define ESP_STAT2_CREGA 0x08
0178 #define ESP_STAT2_WIDE 0x10
0179 #define ESP_STAT2_F1BYTE 0x20
0180 #define ESP_STAT2_FMSB 0x40
0181 #define ESP_STAT2_FEMPTY 0x80
0182
0183
0184 #define ESP_INTR_S 0x01
0185 #define ESP_INTR_SATN 0x02
0186 #define ESP_INTR_RSEL 0x04
0187 #define ESP_INTR_FDONE 0x08
0188 #define ESP_INTR_BSERV 0x10
0189 #define ESP_INTR_DC 0x20
0190 #define ESP_INTR_IC 0x40
0191 #define ESP_INTR_SR 0x80
0192
0193
0194 #define ESP_STEP_VBITS 0x07
0195 #define ESP_STEP_ASEL 0x00
0196 #define ESP_STEP_SID 0x01
0197 #define ESP_STEP_NCMD 0x02
0198 #define ESP_STEP_PPC 0x03
0199
0200
0201 #define ESP_STEP_FINI4 0x04
0202
0203
0204 #define ESP_STEP_FINI5 0x05
0205 #define ESP_STEP_FINI6 0x06
0206 #define ESP_STEP_FINI7 0x07
0207
0208
0209 #define ESP_TEST_TARG 0x01
0210 #define ESP_TEST_INI 0x02
0211 #define ESP_TEST_TS 0x04
0212
0213
0214 #define ESP_UID_FAM 0xf8
0215
0216 #define ESP_FAMILY(uid) (((uid) & ESP_UID_FAM) >> 3)
0217
0218
0219 #define ESP_UID_F100A 0x00
0220 #define ESP_UID_F236 0x02
0221 #define ESP_UID_HME 0x0a
0222 #define ESP_UID_FSC 0x14
0223
0224
0225
0226 #define ESP_FF_FBYTES 0x1f
0227 #define ESP_FF_ONOTZERO 0x20
0228 #define ESP_FF_SSTEP 0xe0
0229
0230
0231 #define ESP_CCF_F0 0x00
0232 #define ESP_CCF_NEVER 0x01
0233 #define ESP_CCF_F2 0x02
0234 #define ESP_CCF_F3 0x03
0235 #define ESP_CCF_F4 0x04
0236 #define ESP_CCF_F5 0x05
0237 #define ESP_CCF_F6 0x06
0238 #define ESP_CCF_F7 0x07
0239
0240
0241 #define ESP_BUSID_RESELID 0x10
0242 #define ESP_BUSID_CTR32BIT 0x40
0243
0244 #define ESP_BUS_TIMEOUT 250
0245 #define ESP_TIMEO_CONST 8192
0246 #define ESP_NEG_DEFP(mhz, cfact) \
0247 ((ESP_BUS_TIMEOUT * ((mhz) / 1000)) / (8192 * (cfact)))
0248 #define ESP_HZ_TO_CYCLE(hertz) ((1000000000) / ((hertz) / 1000))
0249 #define ESP_TICK(ccf, cycle) ((7682 * (ccf) * (cycle) / 1000))
0250
0251
0252
0253
0254
0255 #define SYNC_DEFP_SLOW 0x32
0256 #define SYNC_DEFP_FAST 0x19
0257
0258 struct esp_cmd_priv {
0259 int num_sg;
0260 int cur_residue;
0261 struct scatterlist *prv_sg;
0262 struct scatterlist *cur_sg;
0263 int tot_residue;
0264 };
0265
0266 #define ESP_CMD_PRIV(cmd) ((struct esp_cmd_priv *)scsi_cmd_priv(cmd))
0267
0268
0269 enum esp_rev {
0270 ESP100,
0271 ESP100A,
0272 ESP236,
0273 FAS236,
0274 PCSCSI,
0275 FSC,
0276 FAS100A,
0277 FAST,
0278 FASHME,
0279 };
0280
0281 struct esp_cmd_entry {
0282 struct list_head list;
0283
0284 struct scsi_cmnd *cmd;
0285
0286 unsigned int saved_cur_residue;
0287 struct scatterlist *saved_prv_sg;
0288 struct scatterlist *saved_cur_sg;
0289 unsigned int saved_tot_residue;
0290
0291 u8 flags;
0292 #define ESP_CMD_FLAG_WRITE 0x01
0293 #define ESP_CMD_FLAG_AUTOSENSE 0x04
0294 #define ESP_CMD_FLAG_RESIDUAL 0x08
0295
0296 u8 tag[2];
0297 u8 orig_tag[2];
0298
0299 u8 status;
0300 u8 message;
0301
0302 unsigned char *sense_ptr;
0303 unsigned char *saved_sense_ptr;
0304 dma_addr_t sense_dma;
0305
0306 struct completion *eh_done;
0307 };
0308
0309 #define ESP_DEFAULT_TAGS 16
0310
0311 #define ESP_MAX_TARGET 16
0312 #define ESP_MAX_LUN 8
0313 #define ESP_MAX_TAG 256
0314
0315 struct esp_lun_data {
0316 struct esp_cmd_entry *non_tagged_cmd;
0317 int num_tagged;
0318 int hold;
0319 struct esp_cmd_entry *tagged_cmds[ESP_MAX_TAG];
0320 };
0321
0322 struct esp_target_data {
0323
0324
0325
0326
0327 u8 esp_period;
0328 u8 esp_offset;
0329 u8 esp_config3;
0330
0331 u8 flags;
0332 #define ESP_TGT_WIDE 0x01
0333 #define ESP_TGT_DISCONNECT 0x02
0334 #define ESP_TGT_NEGO_WIDE 0x04
0335 #define ESP_TGT_NEGO_SYNC 0x08
0336 #define ESP_TGT_CHECK_NEGO 0x40
0337 #define ESP_TGT_BROKEN 0x80
0338
0339
0340
0341
0342 u8 nego_goal_period;
0343 u8 nego_goal_offset;
0344 u8 nego_goal_width;
0345 u8 nego_goal_tags;
0346
0347 struct scsi_target *starget;
0348 };
0349
0350 struct esp_event_ent {
0351 u8 type;
0352 #define ESP_EVENT_TYPE_EVENT 0x01
0353 #define ESP_EVENT_TYPE_CMD 0x02
0354 u8 val;
0355
0356 u8 sreg;
0357 u8 seqreg;
0358 u8 sreg2;
0359 u8 ireg;
0360 u8 select_state;
0361 u8 event;
0362 u8 __pad;
0363 };
0364
0365 struct esp;
0366 struct esp_driver_ops {
0367
0368
0369
0370
0371 void (*esp_write8)(struct esp *esp, u8 val, unsigned long reg);
0372 u8 (*esp_read8)(struct esp *esp, unsigned long reg);
0373
0374
0375
0376
0377
0378
0379 int (*irq_pending)(struct esp *esp);
0380
0381
0382
0383
0384 u32 (*dma_length_limit)(struct esp *esp, u32 dma_addr,
0385 u32 dma_len);
0386
0387
0388
0389
0390
0391 void (*reset_dma)(struct esp *esp);
0392
0393
0394
0395
0396 void (*dma_drain)(struct esp *esp);
0397
0398
0399 void (*dma_invalidate)(struct esp *esp);
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411 void (*send_dma_cmd)(struct esp *esp, u32 dma_addr, u32 esp_count,
0412 u32 dma_count, int write, u8 cmd);
0413
0414
0415
0416
0417 int (*dma_error)(struct esp *esp);
0418 };
0419
0420 #define ESP_MAX_MSG_SZ 8
0421 #define ESP_EVENT_LOG_SZ 32
0422
0423 #define ESP_QUICKIRQ_LIMIT 100
0424 #define ESP_RESELECT_TAG_LIMIT 2500
0425
0426 struct esp {
0427 void __iomem *regs;
0428 void __iomem *dma_regs;
0429
0430 const struct esp_driver_ops *ops;
0431
0432 struct Scsi_Host *host;
0433 struct device *dev;
0434
0435 struct esp_cmd_entry *active_cmd;
0436
0437 struct list_head queued_cmds;
0438 struct list_head active_cmds;
0439
0440 u8 *command_block;
0441 dma_addr_t command_block_dma;
0442
0443 unsigned int data_dma_len;
0444
0445
0446
0447
0448 u8 sreg;
0449 u8 seqreg;
0450 u8 sreg2;
0451 u8 ireg;
0452
0453 u32 prev_hme_dmacsr;
0454 u8 prev_soff;
0455 u8 prev_stp;
0456 u8 prev_cfg3;
0457 u8 num_tags;
0458
0459 struct list_head esp_cmd_pool;
0460
0461 struct esp_target_data target[ESP_MAX_TARGET];
0462
0463 int fifo_cnt;
0464 u8 fifo[16];
0465
0466 struct esp_event_ent esp_event_log[ESP_EVENT_LOG_SZ];
0467 int esp_event_cur;
0468
0469 u8 msg_out[ESP_MAX_MSG_SZ];
0470 int msg_out_len;
0471
0472 u8 msg_in[ESP_MAX_MSG_SZ];
0473 int msg_in_len;
0474
0475 u8 bursts;
0476 u8 config1;
0477 u8 config2;
0478 u8 config4;
0479
0480 u8 scsi_id;
0481 u32 scsi_id_mask;
0482
0483 enum esp_rev rev;
0484
0485 u32 flags;
0486 #define ESP_FLAG_DIFFERENTIAL 0x00000001
0487 #define ESP_FLAG_RESETTING 0x00000002
0488 #define ESP_FLAG_WIDE_CAPABLE 0x00000008
0489 #define ESP_FLAG_QUICKIRQ_CHECK 0x00000010
0490 #define ESP_FLAG_DISABLE_SYNC 0x00000020
0491 #define ESP_FLAG_USE_FIFO 0x00000040
0492 #define ESP_FLAG_NO_DMA_MAP 0x00000080
0493
0494 u8 select_state;
0495 #define ESP_SELECT_NONE 0x00
0496 #define ESP_SELECT_BASIC 0x01
0497 #define ESP_SELECT_MSGOUT 0x02
0498
0499
0500 u8 event;
0501 #define ESP_EVENT_NONE 0x00
0502 #define ESP_EVENT_CMD_START 0x01
0503 #define ESP_EVENT_CMD_DONE 0x02
0504 #define ESP_EVENT_DATA_IN 0x03
0505 #define ESP_EVENT_DATA_OUT 0x04
0506 #define ESP_EVENT_DATA_DONE 0x05
0507 #define ESP_EVENT_MSGIN 0x06
0508 #define ESP_EVENT_MSGIN_MORE 0x07
0509 #define ESP_EVENT_MSGIN_DONE 0x08
0510 #define ESP_EVENT_MSGOUT 0x09
0511 #define ESP_EVENT_MSGOUT_DONE 0x0a
0512 #define ESP_EVENT_STATUS 0x0b
0513 #define ESP_EVENT_FREE_BUS 0x0c
0514 #define ESP_EVENT_CHECK_PHASE 0x0d
0515 #define ESP_EVENT_RESET 0x10
0516
0517
0518 u32 cfact;
0519 u32 cfreq;
0520 u32 ccycle;
0521 u32 ctick;
0522 u32 neg_defp;
0523 u32 sync_defp;
0524
0525
0526 u32 max_period;
0527 u32 min_period;
0528 u32 radelay;
0529
0530
0531 u8 *cmd_bytes_ptr;
0532 int cmd_bytes_left;
0533
0534 struct completion *eh_reset;
0535
0536 void *dma;
0537 int dmarev;
0538
0539
0540 u8 __iomem *fifo_reg;
0541 int send_cmd_error;
0542 u32 send_cmd_residual;
0543 };
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575 extern struct scsi_host_template scsi_esp_template;
0576 extern int scsi_esp_register(struct esp *);
0577
0578 extern void scsi_esp_unregister(struct esp *);
0579 extern irqreturn_t scsi_esp_intr(int, void *);
0580 extern void scsi_esp_cmd(struct esp *, u8);
0581
0582 extern void esp_send_pio_cmd(struct esp *esp, u32 dma_addr, u32 esp_count,
0583 u32 dma_count, int write, u8 cmd);
0584
0585 #endif