1
2
3
4
5
6#ifndef _ESP_SCSI_H
7#define _ESP_SCSI_H
8
9
10#define ESP_TCLOW 0x00UL
11#define ESP_TCMED 0x01UL
12#define ESP_FDATA 0x02UL
13#define ESP_CMD 0x03UL
14#define ESP_STATUS 0x04UL
15#define ESP_BUSID ESP_STATUS
16#define ESP_INTRPT 0x05UL
17#define ESP_TIMEO ESP_INTRPT
18#define ESP_SSTEP 0x06UL
19#define ESP_STP ESP_SSTEP
20#define ESP_FFLAGS 0x07UL
21#define ESP_SOFF ESP_FFLAGS
22#define ESP_CFG1 0x08UL
23#define ESP_CFACT 0x09UL
24#define ESP_STATUS2 ESP_CFACT
25#define ESP_CTEST 0x0aUL
26#define ESP_CFG2 0x0bUL
27#define ESP_CFG3 0x0cUL
28#define ESP_CFG4 0x0dUL
29#define ESP_TCHI 0x0eUL
30#define ESP_UID ESP_TCHI
31#define FAS_RLO ESP_TCHI
32#define ESP_FGRND 0x0fUL
33#define FAS_RHI ESP_FGRND
34
35#define SBUS_ESP_REG_SIZE 0x40UL
36
37
38
39
40#define ESP_CONFIG1_ID 0x07
41#define ESP_CONFIG1_CHTEST 0x08
42#define ESP_CONFIG1_PENABLE 0x10
43#define ESP_CONFIG1_PARTEST 0x20
44#define ESP_CONFIG1_SRRDISAB 0x40
45#define ESP_CONFIG1_SLCABLE 0x80
46
47
48#define ESP_CONFIG2_DMAPARITY 0x01
49#define ESP_CONFIG2_REGPARITY 0x02
50#define ESP_CONFIG2_BADPARITY 0x04
51#define ESP_CONFIG2_SCSI2ENAB 0x08
52#define ESP_CONFIG2_HI 0x10
53#define ESP_CONFIG2_HMEFENAB 0x10
54#define ESP_CONFIG2_BCM 0x20
55#define ESP_CONFIG2_DISPINT 0x20
56#define ESP_CONFIG2_FENAB 0x40
57#define ESP_CONFIG2_SPL 0x40
58#define ESP_CONFIG2_MKDONE 0x40
59#define ESP_CONFIG2_HME32 0x80
60#define ESP_CONFIG2_MAGIC 0xe0
61
62
63#define ESP_CONFIG3_FCLOCK 0x01
64#define ESP_CONFIG3_TEM 0x01
65#define ESP_CONFIG3_FAST 0x02
66#define ESP_CONFIG3_ADMA 0x02
67#define ESP_CONFIG3_TENB 0x04
68#define ESP_CONFIG3_SRB 0x04
69#define ESP_CONFIG3_TMS 0x08
70#define ESP_CONFIG3_FCLK 0x08
71#define ESP_CONFIG3_IDMSG 0x10
72#define ESP_CONFIG3_FSCSI 0x10
73#define ESP_CONFIG3_GTM 0x20
74#define ESP_CONFIG3_IDBIT3 0x20
75#define ESP_CONFIG3_TBMS 0x40
76#define ESP_CONFIG3_EWIDE 0x40
77#define ESP_CONFIG3_IMS 0x80
78#define ESP_CONFIG3_OBPUSH 0x80
79
80
81#define ESP_CONFIG4_RADE 0x04
82#define ESP_CONFIG4_RAE 0x08
83#define ESP_CONFIG4_PWD 0x20
84#define ESP_CONFIG4_GE0 0x40
85#define ESP_CONFIG4_GE1 0x80
86
87#define ESP_CONFIG_GE_12NS (0)
88#define ESP_CONFIG_GE_25NS (ESP_CONFIG_GE1)
89#define ESP_CONFIG_GE_35NS (ESP_CONFIG_GE0)
90#define ESP_CONFIG_GE_0NS (ESP_CONFIG_GE0 | ESP_CONFIG_GE1)
91
92
93
94
95
96
97
98#define ESP_CMD_NULL 0x00
99#define ESP_CMD_FLUSH 0x01
100#define ESP_CMD_RC 0x02
101#define ESP_CMD_RS 0x03
102
103
104
105
106#define ESP_CMD_TI 0x10
107#define ESP_CMD_ICCSEQ 0x11
108#define ESP_CMD_MOK 0x12
109#define ESP_CMD_TPAD 0x18
110#define ESP_CMD_SATN 0x1a
111#define ESP_CMD_RATN 0x1b
112
113
114
115
116#define ESP_CMD_SMSG 0x20
117#define ESP_CMD_SSTAT 0x21
118#define ESP_CMD_SDATA 0x22
119#define ESP_CMD_DSEQ 0x23
120#define ESP_CMD_TSEQ 0x24
121#define ESP_CMD_TCCSEQ 0x25
122#define ESP_CMD_DCNCT 0x27
123#define ESP_CMD_RMSG 0x28
124#define ESP_CMD_RCMD 0x29
125#define ESP_CMD_RDATA 0x2a
126#define ESP_CMD_RCSEQ 0x2b
127
128
129
130
131
132#define ESP_CMD_RSEL 0x40
133#define ESP_CMD_SEL 0x41
134#define ESP_CMD_SELA 0x42
135#define ESP_CMD_SELAS 0x43
136#define ESP_CMD_ESEL 0x44
137#define ESP_CMD_DSEL 0x45
138#define ESP_CMD_SA3 0x46
139#define ESP_CMD_RSEL3 0x47
140
141
142#define ESP_CMD_DMA 0x80
143
144
145#define ESP_STAT_PIO 0x01
146#define ESP_STAT_PCD 0x02
147#define ESP_STAT_PMSG 0x04
148#define ESP_STAT_PMASK 0x07
149#define ESP_STAT_TDONE 0x08
150#define ESP_STAT_TCNT 0x10
151#define ESP_STAT_PERR 0x20
152#define ESP_STAT_SPAM 0x40
153
154
155
156#define ESP_STAT_INTR 0x80
157
158
159
160
161
162
163#define ESP_DOP (0)
164#define ESP_DIP (ESP_STAT_PIO)
165#define ESP_CMDP (ESP_STAT_PCD)
166#define ESP_STATP (ESP_STAT_PCD|ESP_STAT_PIO)
167#define ESP_MOP (ESP_STAT_PMSG|ESP_STAT_PCD)
168#define ESP_MIP (ESP_STAT_PMSG|ESP_STAT_PCD|ESP_STAT_PIO)
169
170
171#define ESP_STAT2_SCHBIT 0x01
172#define ESP_STAT2_FFLAGS 0x02
173#define ESP_STAT2_XCNT 0x04
174#define ESP_STAT2_CREGA 0x08
175#define ESP_STAT2_WIDE 0x10
176#define ESP_STAT2_F1BYTE 0x20
177#define ESP_STAT2_FMSB 0x40
178#define ESP_STAT2_FEMPTY 0x80
179
180
181#define ESP_INTR_S 0x01
182#define ESP_INTR_SATN 0x02
183#define ESP_INTR_RSEL 0x04
184#define ESP_INTR_FDONE 0x08
185#define ESP_INTR_BSERV 0x10
186#define ESP_INTR_DC 0x20
187#define ESP_INTR_IC 0x40
188#define ESP_INTR_SR 0x80
189
190
191#define ESP_STEP_VBITS 0x07
192#define ESP_STEP_ASEL 0x00
193#define ESP_STEP_SID 0x01
194#define ESP_STEP_NCMD 0x02
195#define ESP_STEP_PPC 0x03
196
197
198#define ESP_STEP_FINI4 0x04
199
200
201#define ESP_STEP_FINI5 0x05
202#define ESP_STEP_FINI6 0x06
203#define ESP_STEP_FINI7 0x07
204
205
206#define ESP_TEST_TARG 0x01
207#define ESP_TEST_INI 0x02
208#define ESP_TEST_TS 0x04
209
210
211#define ESP_UID_F100A 0x00
212#define ESP_UID_F236 0x02
213#define ESP_UID_REV 0x07
214#define ESP_UID_FAM 0xf8
215
216
217
218#define ESP_FF_FBYTES 0x1f
219#define ESP_FF_ONOTZERO 0x20
220#define ESP_FF_SSTEP 0xe0
221
222
223#define ESP_CCF_F0 0x00
224#define ESP_CCF_NEVER 0x01
225#define ESP_CCF_F2 0x02
226#define ESP_CCF_F3 0x03
227#define ESP_CCF_F4 0x04
228#define ESP_CCF_F5 0x05
229#define ESP_CCF_F6 0x06
230#define ESP_CCF_F7 0x07
231
232
233#define ESP_BUSID_RESELID 0x10
234#define ESP_BUSID_CTR32BIT 0x40
235
236#define ESP_BUS_TIMEOUT 250
237#define ESP_TIMEO_CONST 8192
238#define ESP_NEG_DEFP(mhz, cfact) \
239 ((ESP_BUS_TIMEOUT * ((mhz) / 1000)) / (8192 * (cfact)))
240#define ESP_HZ_TO_CYCLE(hertz) ((1000000000) / ((hertz) / 1000))
241#define ESP_TICK(ccf, cycle) ((7682 * (ccf) * (cycle) / 1000))
242
243
244
245
246
247#define SYNC_DEFP_SLOW 0x32
248#define SYNC_DEFP_FAST 0x19
249
250struct esp_cmd_priv {
251 union {
252 dma_addr_t dma_addr;
253 int num_sg;
254 } u;
255
256 int cur_residue;
257 struct scatterlist *cur_sg;
258 int tot_residue;
259};
260#define ESP_CMD_PRIV(CMD) ((struct esp_cmd_priv *)(&(CMD)->SCp))
261
262enum esp_rev {
263 ESP100 = 0x00,
264 ESP100A = 0x01,
265 ESP236 = 0x02,
266 FAS236 = 0x03,
267 FAS100A = 0x04,
268 FAST = 0x05,
269 FASHME = 0x06,
270 PCSCSI = 0x07,
271};
272
273struct esp_cmd_entry {
274 struct list_head list;
275
276 struct scsi_cmnd *cmd;
277
278 unsigned int saved_cur_residue;
279 struct scatterlist *saved_cur_sg;
280 unsigned int saved_tot_residue;
281
282 u8 flags;
283#define ESP_CMD_FLAG_WRITE 0x01
284#define ESP_CMD_FLAG_ABORT 0x02
285#define ESP_CMD_FLAG_AUTOSENSE 0x04
286#define ESP_CMD_FLAG_RESIDUAL 0x08
287
288 u8 tag[2];
289 u8 orig_tag[2];
290
291 u8 status;
292 u8 message;
293
294 unsigned char *sense_ptr;
295 unsigned char *saved_sense_ptr;
296 dma_addr_t sense_dma;
297
298 struct completion *eh_done;
299};
300
301#define ESP_DEFAULT_TAGS 16
302
303#define ESP_MAX_TARGET 16
304#define ESP_MAX_LUN 8
305#define ESP_MAX_TAG 256
306
307struct esp_lun_data {
308 struct esp_cmd_entry *non_tagged_cmd;
309 int num_tagged;
310 int hold;
311 struct esp_cmd_entry *tagged_cmds[ESP_MAX_TAG];
312};
313
314struct esp_target_data {
315
316
317
318
319 u8 esp_period;
320 u8 esp_offset;
321 u8 esp_config3;
322
323 u8 flags;
324#define ESP_TGT_WIDE 0x01
325#define ESP_TGT_DISCONNECT 0x02
326#define ESP_TGT_NEGO_WIDE 0x04
327#define ESP_TGT_NEGO_SYNC 0x08
328#define ESP_TGT_CHECK_NEGO 0x40
329#define ESP_TGT_BROKEN 0x80
330
331
332
333
334 u8 nego_goal_period;
335 u8 nego_goal_offset;
336 u8 nego_goal_width;
337 u8 nego_goal_tags;
338
339 struct scsi_target *starget;
340};
341
342struct esp_event_ent {
343 u8 type;
344#define ESP_EVENT_TYPE_EVENT 0x01
345#define ESP_EVENT_TYPE_CMD 0x02
346 u8 val;
347
348 u8 sreg;
349 u8 seqreg;
350 u8 sreg2;
351 u8 ireg;
352 u8 select_state;
353 u8 event;
354 u8 __pad;
355};
356
357struct esp;
358struct esp_driver_ops {
359
360
361
362
363 void (*esp_write8)(struct esp *esp, u8 val, unsigned long reg);
364 u8 (*esp_read8)(struct esp *esp, unsigned long reg);
365
366
367
368
369
370 dma_addr_t (*map_single)(struct esp *esp, void *buf,
371 size_t sz, int dir);
372 int (*map_sg)(struct esp *esp, struct scatterlist *sg,
373 int num_sg, int dir);
374 void (*unmap_single)(struct esp *esp, dma_addr_t addr,
375 size_t sz, int dir);
376 void (*unmap_sg)(struct esp *esp, struct scatterlist *sg,
377 int num_sg, int dir);
378
379
380
381
382
383
384 int (*irq_pending)(struct esp *esp);
385
386
387
388
389 u32 (*dma_length_limit)(struct esp *esp, u32 dma_addr,
390 u32 dma_len);
391
392
393
394
395
396 void (*reset_dma)(struct esp *esp);
397
398
399
400
401 void (*dma_drain)(struct esp *esp);
402
403
404 void (*dma_invalidate)(struct esp *esp);
405
406
407
408
409
410
411
412
413
414
415
416 void (*send_dma_cmd)(struct esp *esp, u32 dma_addr, u32 esp_count,
417 u32 dma_count, int write, u8 cmd);
418
419
420
421
422 int (*dma_error)(struct esp *esp);
423};
424
425#define ESP_MAX_MSG_SZ 8
426#define ESP_EVENT_LOG_SZ 32
427
428#define ESP_QUICKIRQ_LIMIT 100
429#define ESP_RESELECT_TAG_LIMIT 2500
430
431struct esp {
432 void __iomem *regs;
433 void __iomem *dma_regs;
434
435 const struct esp_driver_ops *ops;
436
437 struct Scsi_Host *host;
438 void *dev;
439
440 struct esp_cmd_entry *active_cmd;
441
442 struct list_head queued_cmds;
443 struct list_head active_cmds;
444
445 u8 *command_block;
446 dma_addr_t command_block_dma;
447
448 unsigned int data_dma_len;
449
450
451
452
453 u8 sreg;
454 u8 seqreg;
455 u8 sreg2;
456 u8 ireg;
457
458 u32 prev_hme_dmacsr;
459 u8 prev_soff;
460 u8 prev_stp;
461 u8 prev_cfg3;
462 u8 num_tags;
463
464 struct list_head esp_cmd_pool;
465
466 struct esp_target_data target[ESP_MAX_TARGET];
467
468 int fifo_cnt;
469 u8 fifo[16];
470
471 struct esp_event_ent esp_event_log[ESP_EVENT_LOG_SZ];
472 int esp_event_cur;
473
474 u8 msg_out[ESP_MAX_MSG_SZ];
475 int msg_out_len;
476
477 u8 msg_in[ESP_MAX_MSG_SZ];
478 int msg_in_len;
479
480 u8 bursts;
481 u8 config1;
482 u8 config2;
483 u8 config4;
484
485 u8 scsi_id;
486 u32 scsi_id_mask;
487
488 enum esp_rev rev;
489
490 u32 flags;
491#define ESP_FLAG_DIFFERENTIAL 0x00000001
492#define ESP_FLAG_RESETTING 0x00000002
493#define ESP_FLAG_DOING_SLOWCMD 0x00000004
494#define ESP_FLAG_WIDE_CAPABLE 0x00000008
495#define ESP_FLAG_QUICKIRQ_CHECK 0x00000010
496#define ESP_FLAG_DISABLE_SYNC 0x00000020
497#define ESP_FLAG_USE_FIFO 0x00000040
498
499 u8 select_state;
500#define ESP_SELECT_NONE 0x00
501#define ESP_SELECT_BASIC 0x01
502#define ESP_SELECT_MSGOUT 0x02
503
504
505 u8 event;
506#define ESP_EVENT_NONE 0x00
507#define ESP_EVENT_CMD_START 0x01
508#define ESP_EVENT_CMD_DONE 0x02
509#define ESP_EVENT_DATA_IN 0x03
510#define ESP_EVENT_DATA_OUT 0x04
511#define ESP_EVENT_DATA_DONE 0x05
512#define ESP_EVENT_MSGIN 0x06
513#define ESP_EVENT_MSGIN_MORE 0x07
514#define ESP_EVENT_MSGIN_DONE 0x08
515#define ESP_EVENT_MSGOUT 0x09
516#define ESP_EVENT_MSGOUT_DONE 0x0a
517#define ESP_EVENT_STATUS 0x0b
518#define ESP_EVENT_FREE_BUS 0x0c
519#define ESP_EVENT_CHECK_PHASE 0x0d
520#define ESP_EVENT_RESET 0x10
521
522
523 u32 cfact;
524 u32 cfreq;
525 u32 ccycle;
526 u32 ctick;
527 u32 neg_defp;
528 u32 sync_defp;
529
530
531 u32 max_period;
532 u32 min_period;
533 u32 radelay;
534
535
536 u8 *cmd_bytes_ptr;
537 int cmd_bytes_left;
538
539 struct completion *eh_reset;
540
541 void *dma;
542 int dmarev;
543};
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576extern struct scsi_host_template scsi_esp_template;
577extern int scsi_esp_register(struct esp *, struct device *);
578
579extern void scsi_esp_unregister(struct esp *);
580extern irqreturn_t scsi_esp_intr(int, void *);
581extern void scsi_esp_cmd(struct esp *, u8);
582
583#endif
584