This source file includes following definitions.
- ADW_EEPROM
- ADW_DVC_CFG
- ADW_SG_BLOCK
- ADW_SOFTC
- ADW_SCSI_REQ_Q
- ADW_SCSI_INQUIRY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 #ifndef _ADVANSYS_WIDE_LIBRARY_H_
57 #define _ADVANSYS_WIDE_LIBRARY_H_
58
59
60
61
62
63
64 #define ADW_LIB_VERSION_MAJOR 5
65 #define ADW_LIB_VERSION_MINOR 8
66
67
68
69 #define ADW_TENTHS(num, den) \
70 (((10 * ((num)/(den))) > (((num) * 10)/(den))) ? \
71 0 : ((((num) * 10)/(den)) - (10 * ((num)/(den)))))
72
73
74
75
76
77
78 #define ADW_SCSI_RESET_HOLD_TIME_US 60
79
80
81
82
83
84 #define ADW_EEP_DVC_CFG_BEGIN (0x00)
85 #define ADW_EEP_DVC_CFG_END (0x15)
86 #define ADW_EEP_DVC_CTL_BEGIN (0x16)
87 #define ADW_EEP_MAX_WORD_ADDR (0x1E)
88
89 #define ADW_EEP_DELAY_MS 100
90
91
92
93
94 #define ADW_EEPROM_BIG_ENDIAN 0x8000
95 #define ADW_EEPROM_BIOS_ENABLE 0x4000
96 #define ADW_EEPROM_TERM_POL 0x2000
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 #define ADW_EEPROM_BIG_ENDIAN 0x8000
114 #define ADW_EEPROM_BIOS_ENABLE 0x4000
115
116
117
118
119
120 #define ADW_EEPROM_TERM_POL 0x2000
121 #define ADW_EEPROM_CIS_LD 0x2000
122
123
124
125
126
127
128
129
130
131
132
133
134 #define ADW_EEPROM_INTAB 0x0800
135
136 typedef struct adw_eeprom
137 {
138
139
140 u_int16_t cfg_lsw;
141
142
143
144 u_int16_t cfg_msw;
145 u_int16_t disc_enable;
146 u_int16_t wdtr_able;
147 union {
148 u_int16_t sdtr_able;
149 u_int16_t sdtr_speed1;
150 } sdtr1;
151 u_int16_t start_motor;
152 u_int16_t tagqng_able;
153 u_int16_t bios_scan;
154 u_int16_t scam_tolerant;
155
156 u_int8_t adapter_scsi_id;
157 u_int8_t bios_boot_delay;
158
159 u_int8_t scsi_reset_delay;
160 u_int8_t bios_id_lun;
161
162
163
164 u_int8_t termination_se;
165
166
167
168
169
170 u_int8_t termination_lvd;
171
172
173
174
175
176 u_int16_t bios_ctrl;
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193 union {
194 u_int16_t ultra_able;
195 u_int16_t sdtr_speed2;
196 } sdtr2;
197 union {
198 u_int16_t reserved2;
199 u_int16_t sdtr_speed3;
200 } sdtr3;
201 u_int8_t max_host_qng;
202 u_int8_t max_dvc_qng;
203 u_int16_t dvc_cntl;
204 union {
205 u_int16_t bug_fix;
206 u_int16_t sdtr_speed4;
207 } sdtr4;
208 u_int16_t serial_number[3];
209 u_int16_t check_sum;
210 u_int8_t oem_name[16];
211 u_int16_t dvc_err_code;
212 u_int16_t adw_err_code;
213 u_int16_t adw_err_addr;
214 u_int16_t saved_dvc_err_code;
215 u_int16_t saved_adw_err_code;
216 u_int16_t saved_adw_err_addr;
217 u_int16_t reserved1[20];
218 u_int16_t cisptr_lsw;
219 u_int16_t cisprt_msw;
220 u_int16_t subsysvid;
221 u_int16_t subsysid;
222 u_int16_t reserved2[4];
223 } ADW_EEPROM;
224
225
226
227
228
229 #define ADW_EEP_CMD_READ 0x80
230 #define ADW_EEP_CMD_WRITE 0x40
231 #define ADW_EEP_CMD_WRITE_ABLE 0x30
232 #define ADW_EEP_CMD_WRITE_DISABLE 0x00
233
234 #define ADW_EEP_CMD_DONE 0x0200
235 #define ADW_EEP_CMD_DONE_ERR 0x0001
236
237
238 #define EEP_CFG_WORD_BIG_ENDIAN 0x8000
239
240
241 #define BIOS_CTRL_BIOS 0x0001
242 #define BIOS_CTRL_EXTENDED_XLAT 0x0002
243 #define BIOS_CTRL_GT_2_DISK 0x0004
244 #define BIOS_CTRL_BIOS_REMOVABLE 0x0008
245 #define BIOS_CTRL_BOOTABLE_CD 0x0010
246 #define BIOS_CTRL_MULTIPLE_LUN 0x0040
247 #define BIOS_CTRL_DISPLAY_MSG 0x0080
248 #define BIOS_CTRL_NO_SCAM 0x0100
249 #define BIOS_CTRL_RESET_SCSI_BUS 0x0200
250 #define BIOS_CTRL_INIT_VERBOSE 0x0800
251 #define BIOS_CTRL_SCSI_PARITY 0x1000
252 #define BIOS_CTRL_AIPP_DIS 0x2000
253
254 #define ADW_3550_MEMSIZE 0x2000
255 #define ADW_3550_IOLEN 0x40
256
257 #define ADW_38C0800_MEMSIZE 0x4000
258 #define ADW_38C0800_IOLEN 0x100
259
260 #define ADW_38C1600_MEMSIZE 0x8000
261 #define ADW_38C1600_IOLEN 0x100
262 #define ADW_38C1600_MEMLEN 0x1000
263
264
265
266
267 #define IOPB_INTR_STATUS_REG 0x00
268 #define IOPB_CHIP_ID_1 0x01
269 #define IOPB_INTR_ENABLES 0x02
270 #define IOPB_CHIP_TYPE_REV 0x03
271 #define IOPB_RES_ADDR_4 0x04
272 #define IOPB_RES_ADDR_5 0x05
273 #define IOPB_RAM_DATA 0x06
274 #define IOPB_RES_ADDR_7 0x07
275 #define IOPB_FLAG_REG 0x08
276 #define IOPB_RES_ADDR_9 0x09
277 #define IOPB_RISC_CSR 0x0A
278 #define IOPB_RES_ADDR_B 0x0B
279 #define IOPB_RES_ADDR_C 0x0C
280 #define IOPB_RES_ADDR_D 0x0D
281 #define IOPB_SOFT_OVER_WR 0x0E
282 #define IOPB_RES_ADDR_F 0x0F
283 #define IOPB_MEM_CFG 0x10
284 #define IOPB_RES_ADDR_11 0x11
285 #define IOPB_GPIO_DATA 0x12
286 #define IOPB_RES_ADDR_13 0x13
287 #define IOPB_FLASH_PAGE 0x14
288 #define IOPB_RES_ADDR_15 0x15
289 #define IOPB_GPIO_CNTL 0x16
290 #define IOPB_RES_ADDR_17 0x17
291 #define IOPB_FLASH_DATA 0x18
292 #define IOPB_RES_ADDR_19 0x19
293 #define IOPB_RES_ADDR_1A 0x1A
294 #define IOPB_RES_ADDR_1B 0x1B
295 #define IOPB_RES_ADDR_1C 0x1C
296 #define IOPB_RES_ADDR_1D 0x1D
297 #define IOPB_RES_ADDR_1E 0x1E
298 #define IOPB_RES_ADDR_1F 0x1F
299 #define IOPB_DMA_CFG0 0x20
300 #define IOPB_DMA_CFG1 0x21
301 #define IOPB_TICKLE 0x22
302 #define IOPB_DMA_REG_WR 0x23
303 #define IOPB_SDMA_STATUS 0x24
304 #define IOPB_SCSI_BYTE_CNT 0x25
305 #define IOPB_HOST_BYTE_CNT 0x26
306 #define IOPB_BYTE_LEFT_TO_XFER 0x27
307 #define IOPB_BYTE_TO_XFER_0 0x28
308 #define IOPB_BYTE_TO_XFER_1 0x29
309 #define IOPB_BYTE_TO_XFER_2 0x2A
310 #define IOPB_BYTE_TO_XFER_3 0x2B
311 #define IOPB_ACC_GRP 0x2C
312 #define IOPB_RES_ADDR_2D 0x2D
313 #define IOPB_DEV_ID 0x2E
314 #define IOPB_RES_ADDR_2F 0x2F
315 #define IOPB_SCSI_DATA 0x30
316 #define IOPB_RES_ADDR_31 0x31
317 #define IOPB_RES_ADDR_32 0x32
318 #define IOPB_SCSI_DATA_HSHK 0x33
319 #define IOPB_SCSI_CTRL 0x34
320 #define IOPB_RES_ADDR_35 0x35
321 #define IOPB_RES_ADDR_36 0x36
322 #define IOPB_RES_ADDR_37 0x37
323 #define IOPB_RAM_BIST 0x38
324 #define IOPB_PLL_TEST 0x39
325 #define IOPB_PCI_INT_CFG 0x3A
326 #define IOPB_RES_ADDR_3B 0x3B
327 #define IOPB_RFIFO_CNT 0x3C
328 #define IOPB_RES_ADDR_3D 0x3D
329 #define IOPB_RES_ADDR_3E 0x3E
330 #define IOPB_RES_ADDR_3F 0x3F
331
332
333
334
335 #define IOPW_CHIP_ID_0 0x00
336 #define IOPW_CTRL_REG 0x02
337 #define IOPW_RAM_ADDR 0x04
338 #define IOPW_RAM_DATA 0x06
339 #define IOPW_RES_ADDR_08 0x08
340 #define IOPW_RISC_CSR 0x0A
341 #define IOPW_SCSI_CFG0 0x0C
342 #define IOPW_SCSI_CFG1 0x0E
343 #define IOPW_RES_ADDR_10 0x10
344 #define IOPW_SEL_MASK 0x12
345 #define IOPW_RES_ADDR_14 0x14
346 #define IOPW_FLASH_ADDR 0x16
347 #define IOPW_RES_ADDR_18 0x18
348 #define IOPW_EE_CMD 0x1A
349 #define IOPW_EE_DATA 0x1C
350 #define IOPW_SFIFO_CNT 0x1E
351 #define IOPW_RES_ADDR_20 0x20
352 #define IOPW_Q_BASE 0x22
353 #define IOPW_QP 0x24
354 #define IOPW_IX 0x26
355 #define IOPW_SP 0x28
356 #define IOPW_PC 0x2A
357 #define IOPW_RES_ADDR_2C 0x2C
358 #define IOPW_RES_ADDR_2E 0x2E
359 #define IOPW_SCSI_DATA 0x30
360 #define IOPW_SCSI_DATA_HSHK 0x32
361 #define IOPW_SCSI_CTRL 0x34
362 #define IOPW_HSHK_CFG 0x36
363 #define IOPW_SXFR_STATUS 0x36
364 #define IOPW_SXFR_CNTL 0x38
365 #define IOPW_SXFR_CNTH 0x3A
366 #define IOPW_RES_ADDR_3C 0x3C
367 #define IOPW_RFIFO_DATA 0x3E
368
369
370
371
372 #define IOPDW_RES_ADDR_0 0x00
373 #define IOPDW_RAM_DATA 0x04
374 #define IOPDW_RES_ADDR_8 0x08
375 #define IOPDW_RES_ADDR_C 0x0C
376 #define IOPDW_RES_ADDR_10 0x10
377 #define IOPDW_COMMA 0x14
378 #define IOPDW_COMMB 0x18
379 #define IOPDW_RES_ADDR_1C 0x1C
380 #define IOPDW_SDMA_ADDR0 0x20
381 #define IOPDW_SDMA_ADDR1 0x24
382 #define IOPDW_SDMA_COUNT 0x28
383 #define IOPDW_SDMA_ERROR 0x2C
384 #define IOPDW_RDMA_ADDR0 0x30
385 #define IOPDW_RDMA_ADDR1 0x34
386 #define IOPDW_RDMA_COUNT 0x38
387 #define IOPDW_RDMA_ERROR 0x3C
388
389 #define ADW_CHIP_ID_BYTE 0x25
390 #define ADW_CHIP_ID_WORD 0x04C1
391
392 #define ADW_SC_SCSI_BUS_RESET 0x2000
393
394 #define ADW_INTR_ENABLE_HOST_INTR 0x01
395 #define ADW_INTR_ENABLE_SEL_INTR 0x02
396 #define ADW_INTR_ENABLE_DPR_INTR 0x04
397 #define ADW_INTR_ENABLE_RTA_INTR 0x08
398 #define ADW_INTR_ENABLE_RMA_INTR 0x10
399 #define ADW_INTR_ENABLE_RST_INTR 0x20
400 #define ADW_INTR_ENABLE_DPE_INTR 0x40
401 #define ADW_INTR_ENABLE_GLOBAL_INTR 0x80
402
403 #define ADW_INTR_STATUS_INTRA 0x01
404 #define ADW_INTR_STATUS_INTRB 0x02
405 #define ADW_INTR_STATUS_INTRC 0x04
406
407 #define ADW_RISC_CSR_STOP (0x0000)
408 #define ADW_RISC_TEST_COND (0x2000)
409 #define ADW_RISC_CSR_RUN (0x4000)
410 #define ADW_RISC_CSR_SINGLE_STEP (0x8000)
411
412 #define ADW_CTRL_REG_HOST_INTR 0x0100
413 #define ADW_CTRL_REG_SEL_INTR 0x0200
414 #define ADW_CTRL_REG_DPR_INTR 0x0400
415 #define ADW_CTRL_REG_RTA_INTR 0x0800
416 #define ADW_CTRL_REG_RMA_INTR 0x1000
417 #define ADW_CTRL_REG_RES_BIT14 0x2000
418 #define ADW_CTRL_REG_DPE_INTR 0x4000
419 #define ADW_CTRL_REG_POWER_DONE 0x8000
420 #define ADW_CTRL_REG_ANY_INTR 0xFF00
421
422 #define ADW_CTRL_REG_CMD_RESET 0x00C6
423 #define ADW_CTRL_REG_CMD_WR_IO_REG 0x00C5
424 #define ADW_CTRL_REG_CMD_RD_IO_REG 0x00C4
425 #define ADW_CTRL_REG_CMD_WR_PCI_CFG_SPACE 0x00C3
426 #define ADW_CTRL_REG_CMD_RD_PCI_CFG_SPACE 0x00C2
427
428 #define ADW_TICKLE_NOP 0x00
429 #define ADW_TICKLE_A 0x01
430 #define ADW_TICKLE_B 0x02
431 #define ADW_TICKLE_C 0x03
432
433 #define ADW_SCSI_CTRL_RSTOUT 0x2000
434
435 #define ADW_IS_INT_PENDING(iot, ioh) \
436 (ADW_READ_WORD_REGISTER((iot), (ioh), IOPW_CTRL_REG) & ADW_CTRL_REG_HOST_INTR)
437
438
439
440
441 #define ADW_TIMER_MODEAB 0xC000
442 #define ADW_PARITY_EN 0x2000
443 #define ADW_EVEN_PARITY 0x1000
444 #define ADW_WD_LONG 0x0800
445 #define ADW_QUEUE_128 0x0400
446 #define ADW_PRIM_MODE 0x0100
447 #define ADW_SCAM_EN 0x0080
448 #define ADW_SEL_TMO_LONG 0x0040
449 #define ADW_CFRM_ID 0x0020
450 #define ADW_OUR_ID_EN 0x0010
451 #define ADW_OUR_ID 0x000F
452
453
454
455
456 #define ADW_BIG_ENDIAN 0x8000
457 #define ADW_TERM_POL 0x2000
458 #define ADW_SLEW_RATE 0x1000
459 #define ADW_FILTER_SEL 0x0C00
460 #define ADW_FLTR_DISABLE 0x0000
461 #define ADW_FLTR_11_TO_20NS 0x0800
462 #define ADW_FLTR_21_TO_39NS 0x0C00
463 #define ADW_ACTIVE_DBL 0x0200
464 #define ADW_DIFF_MODE 0x0100
465 #define ADW_DIFF_SENSE 0x0080
466 #define ADW_TERM_CTL_SEL 0x0040
467 #define ADW_TERM_CTL 0x0030
468 #define ADW_TERM_CTL_H 0x0020
469 #define ADW_TERM_CTL_L 0x0010
470 #define ADW_CABLE_DETECT 0x000F
471
472
473
474
475
476
477
478
479
480
481
482
483 #define ADW_DIS_TERM_DRV 0x4000
484 #define ADW_HVD_LVD_SE 0x1C00
485 #define ADW_HVD 0x1000
486 #define ADW_LVD 0x0800
487 #define ADW_SE 0x0400
488 #define ADW_TERM_LVD 0x00C0
489 #define ADW_TERM_LVD_HI 0x0080
490 #define ADW_TERM_LVD_LO 0x0040
491 #define ADW_TERM_SE 0x0030
492 #define ADW_TERM_SE_HI 0x0020
493 #define ADW_TERM_SE_LO 0x0010
494 #define ADW_C_DET_LVD 0x000C
495 #define ADW_C_DET3 0x0008
496 #define ADW_C_DET2 0x0004
497 #define ADW_C_DET_SE 0x0003
498 #define ADW_C_DET1 0x0002
499 #define ADW_C_DET0 0x0001
500
501
502 #define CABLE_ILLEGAL_A 0x7
503
504
505 #define CABLE_ILLEGAL_B 0xB
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540 #define ADW_BIOS_EN 0x40
541 #define ADW_FAST_EE_CLK 0x20
542 #define ADW_RAM_SZ 0x1C
543 #define ADW_RAM_SZ_2KB 0x00
544 #define ADW_RAM_SZ_4KB 0x04
545 #define ADW_RAM_SZ_8KB 0x08
546 #define ADW_RAM_SZ_16KB 0x0C
547 #define ADW_RAM_SZ_32KB 0x10
548 #define ADW_RAM_SZ_64KB 0x14
549
550
551
552
553
554
555 #define BC_THRESH_ENB 0x80
556 #define FIFO_THRESH 0x70
557 #define FIFO_THRESH_16B 0x00
558 #define FIFO_THRESH_32B 0x20
559 #define FIFO_THRESH_48B 0x30
560 #define FIFO_THRESH_64B 0x40
561 #define FIFO_THRESH_80B 0x50
562 #define FIFO_THRESH_96B 0x60
563 #define FIFO_THRESH_112B 0x70
564 #define START_CTL 0x0C
565 #define START_CTL_TH 0x00
566 #define START_CTL_ID 0x04
567 #define START_CTL_THID 0x08
568 #define START_CTL_EMFU 0x0C
569 #define READ_CMD 0x03
570 #define READ_CMD_MR 0x00
571 #define READ_CMD_MRL 0x02
572 #define READ_CMD_MRM 0x03
573
574
575
576
577 #define RAM_TEST_MODE 0x80
578 #define PRE_TEST_MODE 0x40
579 #define NORMAL_MODE 0x00
580 #define RAM_TEST_DONE 0x10
581 #define RAM_TEST_STATUS 0x0F
582 #define RAM_TEST_HOST_ERROR 0x08
583 #define RAM_TEST_INTRAM_ERROR 0x04
584 #define RAM_TEST_RISC_ERROR 0x02
585 #define RAM_TEST_SCSI_ERROR 0x01
586 #define RAM_TEST_SUCCESS 0x00
587 #define PRE_TEST_VALUE 0x05
588 #define NORMAL_VALUE 0x00
589
590
591
592
593
594
595
596 #define INTAB_LD 0x80
597
598
599
600
601
602
603
604 #define TOTEMPOLE 0x02
605
606
607
608
609
610
611
612
613
614
615 #define INTAB 0x01
616
617
618 #define ADW_MAX_TID 15
619 #define ADW_MAX_LUN 7
620
621
622
623
624
625 #define ADW_TRUE 1
626 #define ADW_FALSE 0
627 #define ADW_NOERROR 1
628 #define ADW_SUCCESS 1
629 #define ADW_BUSY 0
630 #define ADW_ERROR (-1)
631
632
633
634
635
636 #define ADW_WARN_BUSRESET_ERROR 0x0001
637 #define ADW_WARN_EEPROM_CHKSUM 0x0002
638 #define ADW_WARN_EEPROM_TERMINATION 0x0004
639 #define ADW_WARN_SET_PCI_CONFIG_SPACE 0x0080
640 #define ADW_WARN_ERROR 0xFFFF
641
642
643
644
645 #define ADW_IERR_WRITE_EEPROM 0x0001
646 #define ADW_IERR_MCODE_CHKSUM 0x0002
647 #define ADW_IERR_NO_CARRIER 0x0004
648 #define ADW_IERR_START_STOP_CHIP 0x0008
649 #define ADW_IERR_CHIP_VERSION 0x0040
650 #define ADW_IERR_SET_SCSI_ID 0x0080
651 #define ADW_IERR_HVD_DEVICE 0x0100
652 #define ADW_IERR_BAD_SIGNATURE 0x0200
653 #define ADW_IERR_ILLEGAL_CONNECTION 0x0400
654 #define ADW_IERR_SINGLE_END_DEVICE 0x0800
655 #define ADW_IERR_REVERSED_CABLE 0x1000
656 #define ADW_IERR_BIST_PRE_TEST 0x2000
657 #define ADW_IERR_BIST_RAM_TEST 0x4000
658 #define ADW_IERR_BAD_CHIPTYPE 0x8000
659
660
661
662
663 #define BIOS_CODESEG 0x54
664 #define BIOS_CODELEN 0x56
665 #define BIOS_SIGNATURE 0x58
666 #define BIOS_VERSION 0x5A
667
668
669
670
671 #define ADW_CHIP_ASC3550 0x01
672 #define ADW_CHIP_ASC38C0800 0x02
673 #define ADW_CHIP_ASC38C1600 0x03
674
675
676
677
678
679
680
681
682
683
684
685
686 typedef struct adw_dvc_cfg {
687 u_int16_t disc_enable;
688 u_int8_t chip_version;
689 u_int8_t termination;
690 u_int16_t pci_device_id;
691 u_int16_t lib_version;
692 u_int16_t control_flag;
693 u_int16_t mcode_date;
694 u_int16_t mcode_version;
695 u_int16_t pci_slot_info;
696
697
698
699 u_int16_t serial1;
700 u_int16_t serial2;
701 u_int16_t serial3;
702 } ADW_DVC_CFG;
703
704
705 #define NO_OF_SG_PER_BLOCK 15
706
707 typedef struct adw_sg_block {
708 u_int8_t reserved1;
709 u_int8_t reserved2;
710 u_int8_t reserved3;
711 u_int8_t sg_cnt;
712 u_int32_t sg_ptr;
713 struct {
714 u_int32_t sg_addr;
715 u_int32_t sg_count;
716 } sg_list[NO_OF_SG_PER_BLOCK];
717 } ADW_SG_BLOCK;
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732 #define CCB_HASH_SIZE 32
733 #define CCB_HASH_SHIFT 9
734 #define CCB_HASH(x) ((((x)) >> CCB_HASH_SHIFT) & (CCB_HASH_SIZE - 1))
735
736 typedef int (* ADW_CALLBACK) (int);
737
738 typedef struct adw_softc {
739
740 struct device sc_dev;
741
742 bus_space_tag_t sc_iot;
743 bus_space_handle_t sc_ioh;
744 bus_dma_tag_t sc_dmat;
745 bus_dmamap_t sc_dmamap_control;
746 bus_dmamap_t sc_dmamap_carrier;
747 void *sc_ih;
748
749 struct adw_control *sc_control;
750
751 struct adw_ccb *sc_ccbhash[CCB_HASH_SIZE];
752 TAILQ_HEAD(, adw_ccb) sc_free_ccb, sc_waiting_ccb;
753 TAILQ_HEAD(adw_pending_ccb, adw_ccb) sc_pending_ccb;
754 struct scsi_link sc_link;
755 struct scsi_adapter sc_adapter;
756
757 LIST_HEAD(, scsi_xfer) sc_queue;
758 struct scsi_xfer *sc_queuelast;
759
760 int sc_freeze_dev[ADW_MAX_TID+1];
761
762 ADW_CALLBACK isr_callback;
763 ADW_CALLBACK async_callback;
764 u_int16_t bios_ctrl;
765 u_int16_t wdtr_able;
766 u_int16_t sdtr_able;
767 u_int16_t ultra_able;
768 u_int16_t sdtr_speed1;
769 u_int16_t sdtr_speed2;
770 u_int16_t sdtr_speed3;
771 u_int16_t sdtr_speed4;
772 u_int16_t tagqng_able;
773 u_int16_t ppr_able;
774 u_int16_t start_motor;
775 u_int8_t max_dvc_qng;
776 u_int8_t scsi_reset_wait;
777 u_int8_t chip_no;
778 u_int8_t max_host_qng;
779 u_int8_t irq_no;
780 u_int8_t chip_type;
781 u_int16_t no_scam;
782 u_int32_t drv_ptr;
783 u_int8_t chip_scsi_id;
784 u_int8_t bist_err_code;
785 u_int16_t carr_pending_cnt;
786 struct adw_carrier *carr_freelist;
787 struct adw_carrier *icq_sp;
788 struct adw_carrier *irq_sp;
789
790
791
792
793 ADW_DVC_CFG cfg;
794 } ADW_SOFTC;
795
796
797
798
799
800
801
802
803
804
805 typedef struct adw_scsi_req_q {
806 u_int8_t cntl;
807 u_int8_t target_cmd;
808 u_int8_t target_id;
809 u_int8_t target_lun;
810 u_int32_t data_addr;
811 u_int32_t data_cnt;
812 u_int32_t sense_addr;
813 u_int32_t carr_ba;
814 u_int8_t mflag;
815 u_int8_t sense_len;
816 u_int8_t cdb_len;
817 u_int8_t scsi_cntl;
818 u_int8_t done_status;
819 u_int8_t scsi_status;
820 u_int8_t host_status;
821 u_int8_t sg_working_ix;
822 u_int8_t cdb[12];
823 u_int32_t sg_real_addr;
824 u_int32_t scsiq_rptr;
825 u_int8_t cdb16[4];
826 u_int32_t ccb_ptr;
827 u_int32_t carr_va;
828
829
830
831
832 struct scsi_sense_data *vsense_addr;
833 u_char *vdata_addr;
834 } ADW_SCSI_REQ_Q;
835
836
837
838
839 #define QD_NO_STATUS 0x00
840 #define QD_NO_ERROR 0x01
841 #define QD_ABORTED_BY_HOST 0x02
842 #define QD_WITH_ERROR 0x04
843
844
845
846
847 #define QHSTA_NO_ERROR 0x00
848 #define QHSTA_M_SEL_TIMEOUT 0x11
849 #define QHSTA_M_DATA_OVER_RUN 0x12
850 #define QHSTA_M_UNEXPECTED_BUS_FREE 0x13
851 #define QHSTA_M_QUEUE_ABORTED 0x15
852 #define QHSTA_M_SXFR_SDMA_ERR 0x16
853 #define QHSTA_M_SXFR_SXFR_PERR 0x17
854 #define QHSTA_M_RDMA_PERR 0x18
855 #define QHSTA_M_SXFR_OFF_UFLW 0x19
856 #define QHSTA_M_SXFR_OFF_OFLW 0x20
857 #define QHSTA_M_SXFR_WD_TMO 0x21
858 #define QHSTA_M_SXFR_DESELECTED 0x22
859
860 #define QHSTA_M_SXFR_XFR_OFLW 0x12
861 #define QHSTA_M_SXFR_XFR_PH_ERR 0x24
862 #define QHSTA_M_SXFR_UNKNOWN_ERROR 0x25
863 #define QHSTA_M_SCSI_BUS_RESET 0x30
864 #define QHSTA_M_SCSI_BUS_RESET_UNSOL 0x31
865 #define QHSTA_M_BUS_DEVICE_RESET 0x32
866 #define QHSTA_M_DIRECTION_ERR 0x35
867 #define QHSTA_M_DIRECTION_ERR_HUNG 0x36
868 #define QHSTA_M_WTM_TIMEOUT 0x41
869 #define QHSTA_M_BAD_CMPL_STATUS_IN 0x42
870 #define QHSTA_M_NO_AUTO_REQ_SENSE 0x43
871 #define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
872 #define QHSTA_M_INVALID_DEVICE 0x45
873 #define QHSTA_M_FROZEN_TIDQ 0x46
874 #define QHSTA_M_SGBACKUP_ERROR 0x47
875
876
877
878
879 #define IDLE_CMD_COMPLETED 0
880 #define IDLE_CMD_STOP_CHIP 0x0001
881 #define IDLE_CMD_STOP_CHIP_SEND_INT 0x0002
882 #define IDLE_CMD_SEND_INT 0x0004
883 #define IDLE_CMD_ABORT 0x0008
884 #define IDLE_CMD_DEVICE_RESET 0x0010
885 #define IDLE_CMD_SCSI_RESET_START 0x0020
886 #define IDLE_CMD_SCSI_RESET_END 0x0040
887 #define IDLE_CMD_SCSIREQ 0x0080
888
889 #define IDLE_CMD_STATUS_SUCCESS 0x0001
890 #define IDLE_CMD_STATUS_FAILURE 0x0002
891
892
893
894
895 #define ADW_NOWAIT 0x01
896
897
898
899
900 #define SCSI_WAIT_10_SEC 10UL
901 #define SCSI_WAIT_100_MSEC 100UL
902 #define SCSI_US_PER_MSEC 1000
903 #define SCSI_MS_PER_SEC 1000UL
904 #define SCSI_MAX_RETRY 10
905
906 #define ADW_ASYNC_RDMA_FAILURE 0x01
907 #define ADW_ASYNC_SCSI_BUS_RESET_DET 0x02
908 #define ADW_ASYNC_CARRIER_READY_FAILURE 0x03
909
910 #define ADW_HOST_SCSI_BUS_RESET 0x80
911
912
913
914 #define ADW_READ_BYTE_REGISTER(iot, ioh, reg_off) \
915 bus_space_read_1((iot), (ioh), (reg_off))
916
917
918 #define ADW_WRITE_BYTE_REGISTER(iot, ioh, reg_off, byte) \
919 bus_space_write_1((iot), (ioh), (reg_off), (byte))
920
921
922 #define ADW_READ_WORD_REGISTER(iot, ioh, reg_off) \
923 bus_space_read_2((iot), (ioh), (reg_off))
924
925
926 #define ADW_WRITE_WORD_REGISTER(iot, ioh, reg_off, word) \
927 bus_space_write_2((iot), (ioh), (reg_off), (word))
928
929
930 #define ADW_WRITE_DWORD_REGISTER(iot, ioh, reg_off, dword) \
931 bus_space_write_4((iot), (ioh), (reg_off), (dword))
932
933
934 #define ADW_READ_BYTE_LRAM(iot, ioh, addr, byte) \
935 do { \
936 bus_space_write_2((iot), (ioh), IOPW_RAM_ADDR, (addr)); \
937 (byte) = bus_space_read_1((iot), (ioh), IOPB_RAM_DATA); \
938 } while (0)
939
940
941 #define ADW_WRITE_BYTE_LRAM(iot, ioh, addr, byte) \
942 do { \
943 bus_space_write_2((iot), (ioh), IOPW_RAM_ADDR, (addr)); \
944 bus_space_write_1((iot), (ioh), IOPB_RAM_DATA, (byte)); \
945 } while (0)
946
947
948 #define ADW_READ_WORD_LRAM(iot, ioh, addr, word) \
949 do { \
950 bus_space_write_2((iot), (ioh), IOPW_RAM_ADDR, (addr)); \
951 (word) = bus_space_read_2((iot), (ioh), IOPW_RAM_DATA); \
952 } while (0)
953
954
955 #define ADW_WRITE_WORD_LRAM(iot, ioh, addr, word) \
956 do { \
957 bus_space_write_2((iot), (ioh), IOPW_RAM_ADDR, (addr)); \
958 bus_space_write_2((iot), (ioh), IOPW_RAM_DATA, (word)); \
959 } while (0)
960
961
962
963 #define ADW_WRITE_DWORD_LRAM(iot, ioh, addr, dword) \
964 do { \
965 bus_space_write_2((iot), (ioh), IOPW_RAM_ADDR, (addr)); \
966 bus_space_write_2((iot), (ioh), IOPW_RAM_DATA, \
967 (u_int16_t) ((dword) & 0xFFFF)); \
968 bus_space_write_2((iot), (ioh), IOPW_RAM_ADDR, (addr) + 2); \
969 bus_space_write_2((iot), (ioh), IOPW_RAM_DATA, \
970 (u_int16_t) ((dword >> 16) & 0xFFFF)); \
971 } while (0)
972
973
974 #define ADW_READ_WORD_AUTO_INC_LRAM(iot, ioh) \
975 bus_space_read_2((iot), (ioh), IOPW_RAM_DATA) \
976
977
978 #define ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, word) \
979 bus_space_write_2((iot), (ioh), IOPW_RAM_DATA, (word))
980
981
982
983
984
985
986
987 #define ADW_FIND_SIGNATURE(iot, ioh) \
988 (((ADW_READ_BYTE_REGISTER((iot), (ioh), IOPB_CHIP_ID_1) == \
989 ADW_CHIP_ID_BYTE) && \
990 (ADW_READ_WORD_REGISTER((iot), (ioh), IOPW_CHIP_ID_0) == \
991 ADW_CHIP_ID_WORD)) ? ADW_TRUE : ADW_FALSE)
992
993
994
995
996
997
998 #define ADW_GET_CHIP_VERSION(iot, ioh, bus_type) \
999 ADW_READ_BYTE_REGISTER((iot), (ioh), IOPB_CHIP_TYPE_REV)
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013 #define ADW_ABORT_CCB(sc, ccb_ptr) \
1014 AdwSendIdleCmd((sc), (u_int16_t) IDLE_CMD_ABORT, (ccb_ptr)->hashkey)
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027 #define ADW_RESET_DEVICE(sc, target_id) \
1028 AdwSendIdleCmd((sc), (u_int16_t) IDLE_CMD_DEVICE_RESET, (target_id), 0)
1029
1030
1031
1032
1033 #define ADW_SCSI_BIT_ID_TYPE u_int16_t
1034
1035
1036
1037
1038 #define ADW_SCAN_LUN 0x01
1039 #define ADW_CAPINFO_NOLUN 0x02
1040
1041
1042
1043
1044 #define ADW_TID_TO_TIDMASK(tid) (0x01 << ((tid) & ADW_MAX_TID))
1045
1046
1047
1048
1049
1050 #define INQ_CLOCKING_ST_ONLY 0x0
1051 #define INQ_CLOCKING_DT_ONLY 0x1
1052 #define INQ_CLOCKING_ST_AND_DT 0x3
1053
1054 typedef struct {
1055 u_int8_t peri_dvc_type : 5;
1056 u_int8_t peri_qualifier : 3;
1057 u_int8_t dvc_type_modifier : 7;
1058 u_int8_t rmb : 1;
1059 u_int8_t ansi_apr_ver : 3;
1060 u_int8_t ecma_ver : 3;
1061 u_int8_t iso_ver : 2;
1062 u_int8_t rsp_data_fmt : 4;
1063
1064
1065
1066
1067 u_int8_t res1 : 2;
1068 u_int8_t TemIOP : 1;
1069 u_int8_t aenc : 1;
1070 u_int8_t add_len;
1071 u_int8_t res2 : 7;
1072 u_int8_t SCC : 1;
1073 u_int8_t Addr16 : 1;
1074 u_int8_t res3 : 2;
1075 u_int8_t MChngr : 1;
1076 u_int8_t MultiPort: 1;
1077 u_int8_t res4 : 1;
1078 u_int8_t EncServ : 1;
1079 u_int8_t BaseQue : 1;
1080 u_int8_t StfRe : 1;
1081 u_int8_t CmdQue : 1;
1082 u_int8_t res5 : 1;
1083 u_int8_t Linked : 1;
1084 u_int8_t Sync : 1;
1085 u_int8_t WBus16 : 1;
1086 u_int8_t WBus32 : 1;
1087 u_int8_t RelAdr : 1;
1088 u_int8_t vendor_id[8];
1089 u_int8_t product_id[16];
1090 u_int8_t product_rev_level[4];
1091 u_int8_t vendor_specific[20];
1092 u_int8_t IUS : 1;
1093 u_int8_t QAS : 1;
1094 u_int8_t Clocking : 2;
1095 u_int8_t res6 : 4;
1096 u_int8_t res7;
1097 u_int8_t version_descriptor[8][2];
1098 } ADW_SCSI_INQUIRY;
1099
1100
1101
1102
1103
1104 int AdwInitFromEEPROM(ADW_SOFTC *);
1105 int AdwInitDriver(ADW_SOFTC *);
1106 int AdwExeScsiQueue(ADW_SOFTC *, ADW_SCSI_REQ_Q *);
1107 int AdwISR(ADW_SOFTC *);
1108 void AdwResetChip(bus_space_tag_t, bus_space_handle_t);
1109 int AdwSendIdleCmd(ADW_SOFTC *, u_int16_t, u_int32_t);
1110 int AdwResetSCSIBus(ADW_SOFTC *);
1111 int AdwResetCCB(ADW_SOFTC *);
1112
1113 #endif