This source file includes following definitions.
- AdwInitFromEEPROM
- AdwInitDriver
- AdwRamSelfTest
- AdwLoadMCode
- AdwASC3550Cabling
- AdwASC38C0800Cabling
- AdwASC38C1600Cabling
- AdwGetEEPROMConfig
- AdwReadEEPWord
- AdwWaitEEPCmd
- AdwSetEEPROMConfig
- AdwExeScsiQueue
- AdwResetChip
- AdwResetCCB
- AdwResetSCSIBus
- AdwISR
- AdwSendIdleCmd
- AdwInquiryHandling
- AdwSleepMilliSecond
- AdwDelayMicroSecond
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 #include <sys/types.h>
56 #include <sys/param.h>
57 #include <sys/systm.h>
58 #include <sys/malloc.h>
59 #include <sys/kernel.h>
60 #include <sys/queue.h>
61 #include <sys/device.h>
62
63 #include <machine/bus.h>
64 #include <machine/intr.h>
65
66 #include <scsi/scsi_all.h>
67 #include <scsi/scsiconf.h>
68
69 #include <dev/pci/pcidevs.h>
70
71 #include <dev/ic/adwlib.h>
72 #include <dev/microcode/adw/adwmcode.h>
73 #include <dev/ic/adw.h>
74
75
76 int AdwRamSelfTest(bus_space_tag_t, bus_space_handle_t, u_int8_t);
77 int AdwLoadMCode(bus_space_tag_t, bus_space_handle_t, u_int16_t *,
78 u_int8_t);
79 int AdwASC3550Cabling(bus_space_tag_t, bus_space_handle_t, ADW_DVC_CFG *);
80 int AdwASC38C0800Cabling(bus_space_tag_t, bus_space_handle_t,
81 ADW_DVC_CFG *);
82 int AdwASC38C1600Cabling(bus_space_tag_t, bus_space_handle_t,
83 ADW_DVC_CFG *);
84
85 u_int16_t AdwGetEEPROMConfig(bus_space_tag_t, bus_space_handle_t,
86 ADW_EEPROM *);
87 void AdwSetEEPROMConfig(bus_space_tag_t, bus_space_handle_t,
88 ADW_EEPROM *);
89 u_int16_t AdwReadEEPWord(bus_space_tag_t, bus_space_handle_t, int);
90 void AdwWaitEEPCmd(bus_space_tag_t, bus_space_handle_t);
91
92 void AdwInquiryHandling(ADW_SOFTC *, ADW_SCSI_REQ_Q *);
93
94 void AdwSleepMilliSecond(u_int32_t);
95 void AdwDelayMicroSecond(u_int32_t);
96
97
98
99
100
101
102
103
104
105
106 const static ADW_EEPROM adw_3550_Default_EEPROM = {
107 ADW_EEPROM_BIOS_ENABLE,
108 0x0000,
109 0xFFFF,
110 0xFFFF,
111 { 0xFFFF },
112 0xFFFF,
113 0xFFFF,
114 0xFFFF,
115 0,
116 7,
117 0,
118 3,
119 0,
120 0,
121 0,
122 0xFFE7,
123 { 0xFFFF },
124 { 0 },
125 ADW_DEF_MAX_HOST_QNG,
126 ADW_DEF_MAX_DVC_QNG,
127 0,
128 { 0 },
129 { 0,0,0 },
130 0,
131 {
132 0,0,0,0,0,0,0,0,
133 0,0,0,0,0,0,0,0
134 },
135 0,
136 0,
137 0,
138 0,
139 0,
140 0
141 };
142
143 const static ADW_EEPROM adw_38C0800_Default_EEPROM = {
144 ADW_EEPROM_BIOS_ENABLE,
145 0x0000,
146 0xFFFF,
147 0xFFFF,
148 { 0x4444 },
149 0xFFFF,
150 0xFFFF,
151 0xFFFF,
152 0,
153 7,
154 0,
155 3,
156 0,
157 0,
158 0,
159 0xFFE7,
160 { 0x4444 },
161 { 0x4444 },
162 ADW_DEF_MAX_HOST_QNG,
163 ADW_DEF_MAX_DVC_QNG,
164 0,
165 { 0x4444 },
166 { 0,0,0 },
167 0,
168 {
169 0,0,0,0,0,0,0,0,
170 0,0,0,0,0,0,0,0
171 },
172 0,
173 0,
174 0,
175 0,
176 0,
177 0,
178 {
179 0,0,0,0,0,0,0,0,0,0,
180 0,0,0,0,0,0,0,0,0,0
181 },
182 0,
183 0,
184 PCI_VENDOR_ADVSYS,
185 PCI_PRODUCT_ADVSYS_U2W,
186 { 0,0,0,0 }
187 };
188
189 const static ADW_EEPROM adw_38C1600_Default_EEPROM = {
190 ADW_EEPROM_BIOS_ENABLE,
191 0x0000,
192 0xFFFF,
193 0xFFFF,
194 { 0x5555 },
195 0xFFFF,
196 0xFFFF,
197 0xFFFF,
198 0,
199 7,
200 0,
201 3,
202 0,
203 0,
204 0,
205 0xFFE7,
206 { 0x5555 },
207 { 0x5555 },
208 ADW_DEF_MAX_HOST_QNG,
209 ADW_DEF_MAX_DVC_QNG,
210 0,
211 { 0x5555 },
212 { 0,0,0 },
213 0,
214 {
215 0,0,0,0,0,0,0,0,
216 0,0,0,0,0,0,0,0
217 },
218 0,
219 0,
220 0,
221 0,
222 0,
223 0,
224 {
225 0,0,0,0,0,0,0,0,0,0,
226 0,0,0,0,0,0,0,0,0,0
227 },
228 0,
229 0,
230 PCI_VENDOR_ADVSYS,
231 PCI_PRODUCT_ADVSYS_U3W,
232 { 0,0,0,0 }
233 };
234
235
236
237
238
239
240
241
242
243
244
245
246 int
247 AdwInitFromEEPROM(sc)
248 ADW_SOFTC *sc;
249 {
250 bus_space_tag_t iot = sc->sc_iot;
251 bus_space_handle_t ioh = sc->sc_ioh;
252 ADW_EEPROM eep_config;
253 u_int16_t warn_code;
254 u_int16_t sdtr_speed = 0;
255 u_int8_t tid, termination;
256 int i, j;
257
258
259 warn_code = 0;
260
261
262
263
264
265
266
267
268 if (AdwGetEEPROMConfig(iot, ioh, &eep_config) != eep_config.check_sum) {
269 warn_code |= ADW_WARN_EEPROM_CHKSUM;
270
271
272
273
274 switch(sc->chip_type) {
275 case ADW_CHIP_ASC3550:
276 eep_config = adw_3550_Default_EEPROM;
277 break;
278 case ADW_CHIP_ASC38C0800:
279 eep_config = adw_38C0800_Default_EEPROM;
280 break;
281 case ADW_CHIP_ASC38C1600:
282 eep_config = adw_38C1600_Default_EEPROM;
283
284
285 if (sc->cfg.pci_slot_info != 0) {
286 u_int8_t lsw_msb;
287
288 lsw_msb = eep_config.cfg_lsw >> 8;
289
290
291
292
293
294
295
296
297
298
299
300 lsw_msb &= ~(((ADW_EEPROM_BIOS_ENABLE |
301 ADW_EEPROM_INTAB) >> 8) & 0xFF);
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317 ADW_WRITE_BYTE_REGISTER(iot, ioh,
318 IOPB_GPIO_CNTL, 0);
319 if (ADW_READ_BYTE_REGISTER(iot, ioh,
320 IOPB_GPIO_DATA) & 0x01) {
321
322
323
324
325 lsw_msb |= (ADW_EEPROM_INTAB >> 8)
326 & 0xFF;
327 }
328 eep_config.cfg_lsw &= 0x00FF;
329 eep_config.cfg_lsw |= lsw_msb << 8;
330 }
331 break;
332 }
333
334
335
336
337
338
339 for (i=2, j=1; i>=0; i--, j++) {
340 eep_config.serial_number[i] =
341 AdwReadEEPWord(iot, ioh, ADW_EEP_DVC_CFG_END - j);
342 }
343
344 AdwSetEEPROMConfig(iot, ioh, &eep_config);
345 }
346
347
348
349
350
351
352 sc->wdtr_able = eep_config.wdtr_able;
353 if (sc->chip_type == ADW_CHIP_ASC3550) {
354 sc->sdtr_able = eep_config.sdtr1.sdtr_able;
355 sc->ultra_able = eep_config.sdtr2.ultra_able;
356 } else {
357 sc->sdtr_speed1 = eep_config.sdtr1.sdtr_speed1;
358 sc->sdtr_speed2 = eep_config.sdtr2.sdtr_speed2;
359 sc->sdtr_speed3 = eep_config.sdtr3.sdtr_speed3;
360 sc->sdtr_speed4 = eep_config.sdtr4.sdtr_speed4;
361 }
362 sc->ppr_able = 0;
363 sc->tagqng_able = eep_config.tagqng_able;
364 sc->cfg.disc_enable = eep_config.disc_enable;
365 sc->max_host_qng = eep_config.max_host_qng;
366 sc->max_dvc_qng = eep_config.max_dvc_qng;
367 sc->chip_scsi_id = (eep_config.adapter_scsi_id & ADW_MAX_TID);
368 sc->start_motor = eep_config.start_motor;
369 sc->scsi_reset_wait = eep_config.scsi_reset_delay;
370 sc->bios_ctrl = eep_config.bios_ctrl;
371 sc->no_scam = eep_config.scam_tolerant;
372 sc->cfg.serial1 = eep_config.serial_number[0];
373 sc->cfg.serial2 = eep_config.serial_number[1];
374 sc->cfg.serial3 = eep_config.serial_number[2];
375
376 if (sc->chip_type == ADW_CHIP_ASC38C0800 ||
377 sc->chip_type == ADW_CHIP_ASC38C1600) {
378 sc->sdtr_able = 0;
379 for (tid = 0; tid <= ADW_MAX_TID; tid++) {
380 if (tid == 0) {
381 sdtr_speed = sc->sdtr_speed1;
382 } else if (tid == 4) {
383 sdtr_speed = sc->sdtr_speed2;
384 } else if (tid == 8) {
385 sdtr_speed = sc->sdtr_speed3;
386 } else if (tid == 12) {
387 sdtr_speed = sc->sdtr_speed4;
388 }
389 if (sdtr_speed & ADW_MAX_TID) {
390 sc->sdtr_able |= (1 << tid);
391 }
392 sdtr_speed >>= 4;
393 }
394 }
395
396
397
398
399
400 if (eep_config.max_host_qng > ADW_DEF_MAX_HOST_QNG) {
401 eep_config.max_host_qng = ADW_DEF_MAX_HOST_QNG;
402 } else if (eep_config.max_host_qng < ADW_DEF_MIN_HOST_QNG)
403 {
404
405 if (eep_config.max_host_qng == 0) {
406 eep_config.max_host_qng = ADW_DEF_MAX_HOST_QNG;
407 } else {
408 eep_config.max_host_qng = ADW_DEF_MIN_HOST_QNG;
409 }
410 }
411
412 if (eep_config.max_dvc_qng > ADW_DEF_MAX_DVC_QNG) {
413 eep_config.max_dvc_qng = ADW_DEF_MAX_DVC_QNG;
414 } else if (eep_config.max_dvc_qng < ADW_DEF_MIN_DVC_QNG) {
415
416 if (eep_config.max_dvc_qng == 0) {
417 eep_config.max_dvc_qng = ADW_DEF_MAX_DVC_QNG;
418 } else {
419 eep_config.max_dvc_qng = ADW_DEF_MIN_DVC_QNG;
420 }
421 }
422
423
424
425
426
427 if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
428 eep_config.max_dvc_qng = eep_config.max_host_qng;
429 }
430
431
432
433
434
435 sc->max_host_qng = eep_config.max_host_qng;
436 sc->max_dvc_qng = eep_config.max_dvc_qng;
437
438
439
440
441
442
443
444
445
446
447
448 switch(sc->chip_type) {
449 case ADW_CHIP_ASC3550:
450 sc->cfg.termination = 0;
451 switch(eep_config.termination_se) {
452 case 3:
453
454 sc->cfg.termination |= ADW_TERM_CTL_L;
455 case 2:
456
457 sc->cfg.termination |= ADW_TERM_CTL_H;
458 case 1:
459
460 sc->cfg.termination |= ADW_TERM_CTL_SEL;
461 case 0:
462 break;
463 default:
464 warn_code |= ADW_WARN_EEPROM_TERMINATION;
465 }
466 break;
467
468 case ADW_CHIP_ASC38C0800:
469 case ADW_CHIP_ASC38C1600:
470 switch(eep_config.termination_se) {
471 case 0:
472
473 termination = 0;
474 break;
475 case 1:
476
477 termination = 0;
478 break;
479 case 2:
480
481 termination = ADW_TERM_SE_HI;
482 break;
483 case 3:
484
485 termination = ADW_TERM_SE;
486 break;
487 default:
488
489
490
491
492 termination = 0;
493 warn_code |= ADW_WARN_EEPROM_TERMINATION;
494 }
495
496 switch(eep_config.termination_lvd) {
497 case 0:
498
499 sc->cfg.termination = termination;
500 break;
501 case 1:
502
503 sc->cfg.termination = termination;
504 break;
505 case 2:
506
507 sc->cfg.termination = termination | ADW_TERM_LVD_HI;
508 break;
509 case 3:
510
511 sc->cfg.termination = termination | ADW_TERM_LVD;
512 break;
513 default:
514
515
516
517
518 sc->cfg.termination = termination;
519 warn_code |= ADW_WARN_EEPROM_TERMINATION;
520 }
521 break;
522 }
523
524 return warn_code;
525 }
526
527
528
529
530
531
532
533 int
534 AdwInitDriver(sc)
535 ADW_SOFTC *sc;
536 {
537 bus_space_tag_t iot = sc->sc_iot;
538 bus_space_handle_t ioh = sc->sc_ioh;
539 u_int16_t error_code;
540 int word;
541 int i;
542 u_int16_t bios_mem[ADW_MC_BIOSLEN/2];
543
544 u_int16_t wdtr_able = 0, sdtr_able, ppr_able, tagqng_able;
545 u_int8_t max_cmd[ADW_MAX_TID + 1];
546 u_int8_t tid;
547
548
549 error_code = 0;
550
551
552
553
554
555
556
557
558
559 for (i = 0; i < ADW_MC_BIOSLEN/2; i++) {
560 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_BIOSMEM+(2*i), bios_mem[i]);
561 }
562
563
564
565
566 switch (sc->chip_type) {
567 case ADW_CHIP_ASC3550:
568 if (bios_mem[(ADW_MC_BIOS_SIGNATURE-ADW_MC_BIOSMEM)/2]==0x55AA){
569
570 u_int16_t bios_version, major, minor;
571
572 bios_version = bios_mem[(ADW_MC_BIOS_VERSION -
573 ADW_MC_BIOSMEM) / 2];
574 major = (bios_version >> 12) & 0xF;
575 minor = (bios_version >> 8) & 0xF;
576 if (major < 3 || (major == 3 && minor == 1)) {
577
578
579
580
581 ADW_READ_WORD_LRAM(iot, ioh, 0x120, wdtr_able);
582 } else {
583 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE,
584 wdtr_able);
585 }
586 }
587 break;
588
589 case ADW_CHIP_ASC38C1600:
590 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_PPR_ABLE, ppr_able);
591
592 case ADW_CHIP_ASC38C0800:
593 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE, wdtr_able);
594 break;
595 }
596 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE, sdtr_able);
597 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_TAGQNG_ABLE, tagqng_able);
598 for (tid = 0; tid <= ADW_MAX_TID; tid++) {
599 ADW_READ_BYTE_LRAM(iot, ioh, ADW_MC_NUMBER_OF_MAX_CMD + tid,
600 max_cmd[tid]);
601 }
602
603
604
605
606 if((error_code = AdwRamSelfTest(iot, ioh, sc->chip_type))) {
607 return error_code;
608 }
609
610
611
612
613 ;
614 if((error_code = AdwLoadMCode(iot, ioh, bios_mem, sc->chip_type))) {
615 return error_code;
616 }
617
618
619
620
621 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_VERSION_DATE, sc->cfg.mcode_date);
622 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_VERSION_NUM, sc->cfg.mcode_version);
623
624
625
626
627
628
629
630 if (sc->cfg.control_flag & CONTROL_FLAG_IGNORE_PERR) {
631 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_CONTROL_FLAG, word);
632 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_CONTROL_FLAG,
633 word | CONTROL_FLAG_IGNORE_PERR);
634 }
635
636 switch (sc->chip_type) {
637 case ADW_CHIP_ASC3550:
638
639
640
641
642
643 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_DMA_CFG0,
644 START_CTL_EMFU | READ_CMD_MRM);
645 break;
646
647 case ADW_CHIP_ASC38C0800:
648
649
650
651
652
653
654
655
656 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1,
657 ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1)
658 | ADW_DIS_TERM_DRV);
659
660
661
662
663
664
665
666
667
668
669 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_DMA_CFG0,
670 BC_THRESH_ENB | FIFO_THRESH_80B
671 | START_CTL_TH | READ_CMD_MRM);
672 break;
673
674 case ADW_CHIP_ASC38C1600:
675
676
677
678
679
680
681
682
683 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1,
684 ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1)
685 | ADW_DIS_TERM_DRV);
686
687
688
689
690
691
692
693 if ((sc->bios_ctrl & BIOS_CTRL_AIPP_DIS) == 0) {
694 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_CONTROL_FLAG, word);
695 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_CONTROL_FLAG,
696 word | CONTROL_FLAG_ENABLE_AIPP);
697 }
698
699
700
701
702
703 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_DMA_CFG0,
704 FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
705 break;
706 }
707
708
709
710
711
712
713
714
715
716
717
718
719
720 if ((sc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
721 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE, sc->wdtr_able);
722 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE, sc->sdtr_able);
723 }
724
725
726
727
728
729
730
731
732
733
734
735 switch (sc->chip_type) {
736 case ADW_CHIP_ASC3550:
737 word = 0;
738 for (tid = 0; tid <= ADW_MAX_TID; tid++) {
739 if (ADW_TID_TO_TIDMASK(tid) & sc->ultra_able) {
740
741 word |= (0x3 << (4 * (tid % 4)));
742 } else {
743
744 word |= (0x2 << (4 * (tid % 4)));
745 }
746
747 if (tid == 3) {
748 ADW_WRITE_WORD_LRAM(iot, ioh,
749 ADW_MC_SDTR_SPEED1, word);
750 word = 0;
751
752 } else if (tid == 7) {
753 ADW_WRITE_WORD_LRAM(iot, ioh,
754 ADW_MC_SDTR_SPEED2, word);
755 word = 0;
756
757 } else if (tid == 11) {
758 ADW_WRITE_WORD_LRAM(iot, ioh,
759 ADW_MC_SDTR_SPEED3, word);
760 word = 0;
761
762 } else if (tid == 15) {
763 ADW_WRITE_WORD_LRAM(iot, ioh,
764 ADW_MC_SDTR_SPEED4, word);
765
766 }
767 }
768
769
770
771
772
773 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DISC_ENABLE,
774 sc->cfg.disc_enable);
775 break;
776
777 case ADW_CHIP_ASC38C0800:
778
779 case ADW_CHIP_ASC38C1600:
780 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DISC_ENABLE,
781 sc->cfg.disc_enable);
782 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_SPEED1,
783 sc->sdtr_speed1);
784 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_SPEED2,
785 sc->sdtr_speed2);
786 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_SPEED3,
787 sc->sdtr_speed3);
788 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_SPEED4,
789 sc->sdtr_speed4);
790 break;
791 }
792
793
794
795
796
797
798
799
800 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_SCSI_CFG0,
801 ADW_PARITY_EN | ADW_QUEUE_128 | ADW_SEL_TMO_LONG |
802 ADW_OUR_ID_EN | sc->chip_scsi_id);
803
804
805 switch(sc->chip_type) {
806 case ADW_CHIP_ASC3550:
807 error_code = AdwASC3550Cabling(iot, ioh, &sc->cfg);
808 break;
809
810 case ADW_CHIP_ASC38C0800:
811 error_code = AdwASC38C0800Cabling(iot, ioh, &sc->cfg);
812 break;
813
814 case ADW_CHIP_ASC38C1600:
815 error_code = AdwASC38C1600Cabling(iot, ioh, &sc->cfg);
816 break;
817 }
818 if(error_code) {
819 return error_code;
820 }
821
822
823
824
825
826
827
828 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_SEL_MASK,
829 ADW_TID_TO_TIDMASK(sc->chip_scsi_id));
830
831
832
833
834 sc->carr_freelist = AdwInitCarriers(sc->sc_dmamap_carrier,
835 sc->sc_control->carriers);
836
837
838
839
840
841 if ((sc->icq_sp = sc->carr_freelist) == NULL) {
842 return ADW_IERR_NO_CARRIER;
843 }
844 sc->carr_freelist = ADW_CARRIER_VADDR(sc,
845 ADW_GET_CARRP(sc->icq_sp->next_ba));
846
847
848
849
850 sc->icq_sp->next_ba = ADW_CQ_STOPPER;
851
852
853
854
855 ADW_WRITE_DWORD_LRAM(iot, ioh, ADW_MC_ICQ, sc->icq_sp->carr_ba);
856
857
858
859
860
861 if(sc->chip_type == ADW_CHIP_ASC38C1600) {
862 ADW_WRITE_DWORD_REGISTER(iot, ioh, IOPDW_COMMA,
863 sc->icq_sp->carr_ba);
864 }
865
866
867
868
869 if ((sc->irq_sp = sc->carr_freelist) == NULL) {
870 return ADW_IERR_NO_CARRIER;
871 }
872 sc->carr_freelist = ADW_CARRIER_VADDR(sc,
873 ADW_GET_CARRP(sc->irq_sp->next_ba));
874
875
876
877
878
879
880
881
882 sc->irq_sp->next_ba = ADW_CQ_STOPPER;
883
884
885
886
887 ADW_WRITE_DWORD_LRAM(iot, ioh, ADW_MC_IRQ, sc->irq_sp->carr_ba);
888 sc->carr_pending_cnt = 0;
889
890 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_INTR_ENABLES,
891 (ADW_INTR_ENABLE_HOST_INTR | ADW_INTR_ENABLE_GLOBAL_INTR));
892 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_CODE_BEGIN_ADDR, word);
893 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_PC, word);
894
895
896 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RISC_CSR, ADW_RISC_CSR_RUN);
897
898
899
900
901
902
903 if (sc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
904 {
905
906
907
908
909
910 if (bios_mem[(ADW_MC_BIOS_SIGNATURE - ADW_MC_BIOSMEM)/2] ==
911 0x55AA) {
912
913
914
915 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE,
916 wdtr_able);
917 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE,
918 sdtr_able);
919 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_TAGQNG_ABLE,
920 tagqng_able);
921 for (tid = 0; tid <= ADW_MAX_TID; tid++) {
922 ADW_WRITE_BYTE_LRAM(iot, ioh,
923 ADW_MC_NUMBER_OF_MAX_CMD + tid,
924 max_cmd[tid]);
925 }
926 } else {
927 if (AdwResetCCB(sc) != ADW_TRUE) {
928 error_code = ADW_WARN_BUSRESET_ERROR;
929 }
930 }
931 }
932
933 return error_code;
934 }
935
936
937 int
938 AdwRamSelfTest(iot, ioh, chip_type)
939 bus_space_tag_t iot;
940 bus_space_handle_t ioh;
941 u_int8_t chip_type;
942 {
943 int i;
944 u_int8_t byte;
945
946
947 if ((chip_type == ADW_CHIP_ASC38C0800) ||
948 (chip_type == ADW_CHIP_ASC38C1600)) {
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979 for (i = 0; i < 2; i++) {
980 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST,
981 PRE_TEST_MODE);
982
983 AdwSleepMilliSecond(10);
984 byte = ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST);
985 if ((byte & RAM_TEST_DONE) == 0 || (byte & 0x0F) !=
986 PRE_TEST_VALUE) {
987 return ADW_IERR_BIST_PRE_TEST;
988 }
989
990 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST,
991 NORMAL_MODE);
992
993 AdwSleepMilliSecond(10);
994 if (ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST)
995 != NORMAL_VALUE) {
996 return ADW_IERR_BIST_PRE_TEST;
997 }
998 }
999
1000
1001
1002
1003
1004
1005
1006
1007
1008 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST, RAM_TEST_MODE);
1009
1010 AdwSleepMilliSecond(10);
1011
1012 byte = ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST);
1013 if ((byte & RAM_TEST_DONE)==0 || (byte & RAM_TEST_STATUS)!=0) {
1014
1015 return ADW_IERR_BIST_RAM_TEST;
1016 }
1017
1018
1019 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST, NORMAL_MODE);
1020 }
1021
1022 return 0;
1023 }
1024
1025
1026 int
1027 AdwLoadMCode(iot, ioh, bios_mem, chip_type)
1028 bus_space_tag_t iot;
1029 bus_space_handle_t ioh;
1030 u_int16_t *bios_mem;
1031 u_int8_t chip_type;
1032 {
1033 u_int8_t *mcode_data;
1034 u_int32_t mcode_chksum;
1035 u_int16_t mcode_size;
1036 u_int32_t sum;
1037 u_int16_t code_sum;
1038 int begin_addr;
1039 int end_addr;
1040 int word;
1041 int adw_memsize;
1042 int adw_mcode_expanded_size;
1043 int i, j;
1044
1045
1046 switch(chip_type) {
1047 case ADW_CHIP_ASC3550:
1048 mcode_data = (u_int8_t *)adw_asc3550_mcode_data.mcode_data;
1049 mcode_chksum = (u_int32_t)adw_asc3550_mcode_data.mcode_chksum;
1050 mcode_size = (u_int16_t)adw_asc3550_mcode_data.mcode_size;
1051 adw_memsize = ADW_3550_MEMSIZE;
1052 break;
1053
1054 case ADW_CHIP_ASC38C0800:
1055 mcode_data = (u_int8_t *)adw_asc38C0800_mcode_data.mcode_data;
1056 mcode_chksum =(u_int32_t)adw_asc38C0800_mcode_data.mcode_chksum;
1057 mcode_size = (u_int16_t)adw_asc38C0800_mcode_data.mcode_size;
1058 adw_memsize = ADW_38C0800_MEMSIZE;
1059 break;
1060
1061 case ADW_CHIP_ASC38C1600:
1062 mcode_data = (u_int8_t *)adw_asc38C1600_mcode_data.mcode_data;
1063 mcode_chksum =(u_int32_t)adw_asc38C1600_mcode_data.mcode_chksum;
1064 mcode_size = (u_int16_t)adw_asc38C1600_mcode_data.mcode_size;
1065 adw_memsize = ADW_38C1600_MEMSIZE;
1066 break;
1067 }
1068
1069
1070
1071
1072 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, 0);
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089 word = 0;
1090 for (i = 253 * 2; i < mcode_size; i++) {
1091 if (mcode_data[i] == 0xff) {
1092 for (j = 0; j < mcode_data[i + 1]; j++) {
1093 ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh,
1094 (((u_int16_t)mcode_data[i + 3] << 8) |
1095 mcode_data[i + 2]));
1096 word++;
1097 }
1098 i += 3;
1099 } else if (mcode_data[i] == 0xfe) {
1100 ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh,
1101 (((u_int16_t)mcode_data[i + 2] << 8) |
1102 mcode_data[i + 1]));
1103 i += 2;
1104 word++;
1105 } else {
1106 ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, (((u_int16_t)
1107 mcode_data[(mcode_data[i] * 2) + 1] <<8) |
1108 mcode_data[mcode_data[i] * 2]));
1109 word++;
1110 }
1111 }
1112
1113
1114
1115
1116
1117 word *= 2;
1118 adw_mcode_expanded_size = word;
1119
1120
1121
1122
1123 for (; word < adw_memsize; word += 2) {
1124 ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, 0);
1125 }
1126
1127
1128
1129
1130 sum = 0;
1131 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, 0);
1132
1133 for (word = 0; word < adw_mcode_expanded_size; word += 2) {
1134 sum += ADW_READ_WORD_AUTO_INC_LRAM(iot, ioh);
1135 }
1136
1137 if (sum != mcode_chksum) {
1138 return ADW_IERR_MCODE_CHKSUM;
1139 }
1140
1141
1142
1143
1144 for (i = 0; i < ADW_MC_BIOSLEN/2; i++) {
1145 if(chip_type == ADW_CHIP_ASC3550) {
1146 ADW_WRITE_BYTE_LRAM(iot, ioh, ADW_MC_BIOSMEM + (2 * i),
1147 bios_mem[i]);
1148 } else {
1149 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_BIOSMEM + (2 * i),
1150 bios_mem[i]);
1151 }
1152 }
1153
1154
1155
1156
1157
1158 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_CODE_BEGIN_ADDR, begin_addr);
1159 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_CODE_END_ADDR, end_addr);
1160 code_sum = 0;
1161 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, begin_addr);
1162 for (word = begin_addr; word < end_addr; word += 2) {
1163 code_sum += ADW_READ_WORD_AUTO_INC_LRAM(iot, ioh);
1164 }
1165 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_CODE_CHK_SUM, code_sum);
1166
1167
1168
1169
1170 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_CHIP_TYPE, chip_type);
1171
1172 return 0;
1173 }
1174
1175
1176 int
1177 AdwASC3550Cabling(iot, ioh, cfg)
1178 bus_space_tag_t iot;
1179 bus_space_handle_t ioh;
1180 ADW_DVC_CFG *cfg;
1181 {
1182 u_int16_t scsi_cfg1;
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193 scsi_cfg1 = ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1);
1194
1195
1196
1197
1198 if ((scsi_cfg1 & CABLE_ILLEGAL_A) == 0 ||
1199 (scsi_cfg1 & CABLE_ILLEGAL_B) == 0) {
1200 return ADW_IERR_ILLEGAL_CONNECTION;
1201 }
1202
1203
1204
1205
1206
1207
1208 if ((ADW_READ_WORD_REGISTER(iot,ioh, IOPW_SCSI_CTRL) & 0x3F07)==0x3F07){
1209 return ADW_IERR_REVERSED_CABLE;
1210 }
1211
1212
1213
1214
1215
1216 if ((scsi_cfg1 & ADW_DIFF_MODE) &&
1217 (scsi_cfg1 & ADW_DIFF_SENSE) == 0) {
1218 return ADW_IERR_SINGLE_END_DEVICE;
1219 }
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229 if (cfg->termination == 0) {
1230
1231
1232
1233
1234
1235
1236 cfg->termination |= ADW_TERM_CTL_SEL;
1237
1238 switch(scsi_cfg1 & ADW_CABLE_DETECT) {
1239
1240 case 0x3: case 0x7: case 0xB:
1241 case 0xD: case 0xE: case 0xF:
1242 cfg->termination |=
1243 (ADW_TERM_CTL_H | ADW_TERM_CTL_L);
1244 break;
1245
1246
1247 case 0x1: case 0x5: case 0x9:
1248 case 0xA: case 0xC:
1249 cfg->termination |= ADW_TERM_CTL_H;
1250 break;
1251
1252
1253 case 0x2: case 0x6:
1254 break;
1255 }
1256 }
1257
1258
1259
1260
1261 scsi_cfg1 &= ~ADW_TERM_CTL;
1262
1263
1264
1265
1266
1267
1268
1269 scsi_cfg1 |= (ADW_TERM_CTL_SEL | (~cfg->termination & ADW_TERM_CTL));
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_SCSI_CFG1,
1281 ADW_FLTR_DISABLE | scsi_cfg1);
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_MEM_CFG,
1295 ADW_BIOS_EN | ADW_RAM_SZ_8KB);
1296
1297 return 0;
1298 }
1299
1300
1301 int
1302 AdwASC38C0800Cabling(iot, ioh, cfg)
1303 bus_space_tag_t iot;
1304 bus_space_handle_t ioh;
1305 ADW_DVC_CFG *cfg;
1306 {
1307 u_int16_t scsi_cfg1;
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318 scsi_cfg1 = ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1);
1319
1320
1321
1322
1323
1324
1325 if ((ADW_READ_WORD_REGISTER(iot,ioh, IOPW_SCSI_CTRL) & 0x3F07)==0x3F07){
1326 return ADW_IERR_REVERSED_CABLE;
1327 }
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342 if (scsi_cfg1 & ADW_HVD) {
1343 return ADW_IERR_HVD_DEVICE;
1344 }
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354 if ((cfg->termination & ADW_TERM_SE) == 0) {
1355
1356 switch(scsi_cfg1 & ADW_C_DET_SE) {
1357
1358 case 0x1: case 0x2: case 0x3:
1359 cfg->termination |= ADW_TERM_SE;
1360 break;
1361
1362
1363 case 0x0:
1364 cfg->termination |= ADW_TERM_SE_HI;
1365 break;
1366 }
1367 }
1368
1369 if ((cfg->termination & ADW_TERM_LVD) == 0) {
1370
1371 switch(scsi_cfg1 & ADW_C_DET_LVD) {
1372
1373 case 0x4: case 0x8: case 0xC:
1374 cfg->termination |= ADW_TERM_LVD;
1375 break;
1376
1377
1378 case 0x0:
1379 break;
1380 }
1381 }
1382
1383
1384
1385
1386 scsi_cfg1 &= (~ADW_TERM_SE & ~ADW_TERM_LVD);
1387
1388
1389
1390
1391 scsi_cfg1 |= (~cfg->termination & 0xF0);
1392
1393
1394
1395
1396
1397
1398 scsi_cfg1 &= (~ADW_BIG_ENDIAN & ~ADW_DIS_TERM_DRV &
1399 ~ADW_TERM_POL & ~ADW_HVD_LVD_SE);
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_MEM_CFG,
1424 ADW_BIOS_EN | ADW_RAM_SZ_16KB);
1425
1426 return 0;
1427 }
1428
1429
1430 int
1431 AdwASC38C1600Cabling(iot, ioh, cfg)
1432 bus_space_tag_t iot;
1433 bus_space_handle_t ioh;
1434 ADW_DVC_CFG *cfg;
1435 {
1436 u_int16_t scsi_cfg1;
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449 scsi_cfg1 = ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1);
1450
1451
1452
1453
1454
1455
1456 if ((ADW_READ_WORD_REGISTER(iot,ioh, IOPW_SCSI_CTRL) & 0x3F07)==0x3F07){
1457 return ADW_IERR_REVERSED_CABLE;
1458 }
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468 if (scsi_cfg1 & ADW_HVD) {
1469 return ADW_IERR_HVD_DEVICE;
1470 }
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486 if ((cfg->termination & ADW_TERM_SE) == 0) {
1487
1488 switch(scsi_cfg1 & ADW_C_DET_SE) {
1489
1490 case 0x1: case 0x2: case 0x3:
1491 cfg->termination |= ADW_TERM_SE;
1492 break;
1493
1494 case 0x0:
1495
1496
1497
1498
1499
1500
1501
1502 cfg->termination |= ADW_TERM_SE_HI;
1503
1504 break;
1505 }
1506 }
1507
1508
1509
1510
1511 scsi_cfg1 &= ~ADW_TERM_SE;
1512
1513
1514
1515
1516 scsi_cfg1 |= (~cfg->termination & ADW_TERM_SE);
1517
1518
1519
1520
1521
1522
1523 scsi_cfg1 &= (~ADW_BIG_ENDIAN & ~ADW_DIS_TERM_DRV & ~ADW_TERM_POL);
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_DEFAULT_MEM_CFG,
1548 ADW_BIOS_EN | ADW_RAM_SZ_32KB);
1549
1550 return 0;
1551 }
1552
1553
1554
1555
1556
1557
1558
1559 u_int16_t
1560 AdwGetEEPROMConfig(iot, ioh, cfg_buf)
1561 bus_space_tag_t iot;
1562 bus_space_handle_t ioh;
1563 ADW_EEPROM *cfg_buf;
1564 {
1565 u_int16_t wval, chksum;
1566 u_int16_t *wbuf;
1567 int eep_addr;
1568
1569
1570 wbuf = (u_int16_t *) cfg_buf;
1571 chksum = 0;
1572
1573 for (eep_addr = ADW_EEP_DVC_CFG_BEGIN;
1574 eep_addr < ADW_EEP_DVC_CFG_END;
1575 eep_addr++, wbuf++) {
1576 wval = AdwReadEEPWord(iot, ioh, eep_addr);
1577 chksum += wval;
1578 *wbuf = wval;
1579 }
1580
1581 *wbuf = AdwReadEEPWord(iot, ioh, eep_addr);
1582 wbuf++;
1583 for (eep_addr = ADW_EEP_DVC_CTL_BEGIN;
1584 eep_addr < ADW_EEP_MAX_WORD_ADDR;
1585 eep_addr++, wbuf++) {
1586 *wbuf = AdwReadEEPWord(iot, ioh, eep_addr);
1587 }
1588
1589 return chksum;
1590 }
1591
1592
1593
1594
1595
1596 u_int16_t
1597 AdwReadEEPWord(iot, ioh, eep_word_addr)
1598 bus_space_tag_t iot;
1599 bus_space_handle_t ioh;
1600 int eep_word_addr;
1601 {
1602 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
1603 ADW_EEP_CMD_READ | eep_word_addr);
1604 AdwWaitEEPCmd(iot, ioh);
1605
1606 return ADW_READ_WORD_REGISTER(iot, ioh, IOPW_EE_DATA);
1607 }
1608
1609
1610
1611
1612
1613 void
1614 AdwWaitEEPCmd(iot, ioh)
1615 bus_space_tag_t iot;
1616 bus_space_handle_t ioh;
1617 {
1618 int eep_delay_ms;
1619
1620
1621 for (eep_delay_ms = 0; eep_delay_ms < ADW_EEP_DELAY_MS; eep_delay_ms++){
1622 if (ADW_READ_WORD_REGISTER(iot, ioh, IOPW_EE_CMD) &
1623 ADW_EEP_CMD_DONE) {
1624 break;
1625 }
1626 AdwSleepMilliSecond(1);
1627 }
1628
1629 ADW_READ_WORD_REGISTER(iot, ioh, IOPW_EE_CMD);
1630 }
1631
1632
1633
1634
1635
1636 void
1637 AdwSetEEPROMConfig(iot, ioh, cfg_buf)
1638 bus_space_tag_t iot;
1639 bus_space_handle_t ioh;
1640 ADW_EEPROM *cfg_buf;
1641 {
1642 u_int16_t *wbuf;
1643 u_int16_t addr, chksum;
1644
1645
1646 wbuf = (u_int16_t *) cfg_buf;
1647 chksum = 0;
1648
1649 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD, ADW_EEP_CMD_WRITE_ABLE);
1650 AdwWaitEEPCmd(iot, ioh);
1651
1652
1653
1654
1655 for (addr = ADW_EEP_DVC_CFG_BEGIN;
1656 addr < ADW_EEP_DVC_CFG_END; addr++, wbuf++) {
1657 chksum += *wbuf;
1658 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, *wbuf);
1659 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
1660 ADW_EEP_CMD_WRITE | addr);
1661 AdwWaitEEPCmd(iot, ioh);
1662 AdwSleepMilliSecond(ADW_EEP_DELAY_MS);
1663 }
1664
1665
1666
1667
1668 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, chksum);
1669 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
1670 ADW_EEP_CMD_WRITE | addr);
1671 AdwWaitEEPCmd(iot, ioh);
1672 wbuf++;
1673
1674
1675
1676
1677 for (addr = ADW_EEP_DVC_CTL_BEGIN;
1678 addr < ADW_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
1679 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, *wbuf);
1680 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
1681 ADW_EEP_CMD_WRITE | addr);
1682 AdwWaitEEPCmd(iot, ioh);
1683 }
1684
1685 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
1686 ADW_EEP_CMD_WRITE_DISABLE);
1687 AdwWaitEEPCmd(iot, ioh);
1688
1689 return;
1690 }
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710 int
1711 AdwExeScsiQueue(sc, scsiq)
1712 ADW_SOFTC *sc;
1713 ADW_SCSI_REQ_Q *scsiq;
1714 {
1715 bus_space_tag_t iot = sc->sc_iot;
1716 bus_space_handle_t ioh = sc->sc_ioh;
1717 ADW_CCB *ccb;
1718 long req_size;
1719 u_int32_t req_paddr;
1720 ADW_CARRIER *new_carrp;
1721
1722
1723
1724
1725 if (scsiq->target_id > ADW_MAX_TID) {
1726 scsiq->host_status = QHSTA_M_INVALID_DEVICE;
1727 scsiq->done_status = QD_WITH_ERROR;
1728 return ADW_ERROR;
1729 }
1730
1731
1732
1733
1734
1735 ccb = adw_ccb_phys_kv(sc, scsiq->ccb_ptr);
1736
1737
1738
1739
1740 if ((new_carrp = sc->carr_freelist) == NULL) {
1741 return ADW_BUSY;
1742 }
1743 sc->carr_freelist = ADW_CARRIER_VADDR(sc,
1744 ADW_GET_CARRP(new_carrp->next_ba));
1745 sc->carr_pending_cnt++;
1746
1747
1748
1749
1750
1751
1752 new_carrp->next_ba = ADW_CQ_STOPPER;
1753
1754 req_size = sizeof(ADW_SCSI_REQ_Q);
1755 req_paddr = sc->sc_dmamap_control->dm_segs[0].ds_addr +
1756 ADW_CCB_OFF(ccb) + offsetof(struct adw_ccb, scsiq);
1757
1758
1759 scsiq->scsiq_rptr = req_paddr;
1760
1761
1762
1763
1764
1765 scsiq->carr_ba = sc->icq_sp->carr_ba;
1766 scsiq->carr_va = sc->icq_sp->carr_ba;
1767
1768
1769
1770
1771
1772
1773 sc->icq_sp->areq_ba = req_paddr;
1774
1775
1776
1777
1778
1779
1780 sc->icq_sp->next_ba = new_carrp->carr_ba;
1781
1782 #if ADW_DEBUG
1783 printf("icq 0x%x, 0x%x, 0x%x, 0x%x\n",
1784 sc->icq_sp->carr_id,
1785 sc->icq_sp->carr_ba,
1786 sc->icq_sp->areq_ba,
1787 sc->icq_sp->next_ba);
1788 #endif
1789
1790
1791
1792 sc->icq_sp = new_carrp;
1793
1794 if (sc->chip_type == ADW_CHIP_ASC3550 ||
1795 sc->chip_type == ADW_CHIP_ASC38C0800) {
1796
1797
1798
1799
1800 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADW_TICKLE_A);
1801 if (sc->chip_type == ADW_CHIP_ASC3550) {
1802
1803
1804
1805
1806
1807 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE,
1808 ADW_TICKLE_NOP);
1809 }
1810 } else if (sc->chip_type == ADW_CHIP_ASC38C1600) {
1811
1812
1813
1814
1815 ADW_WRITE_DWORD_REGISTER(iot, ioh, IOPDW_COMMA,
1816 new_carrp->carr_ba);
1817 }
1818
1819
1820
1821
1822
1823 return ADW_SUCCESS;
1824 }
1825
1826
1827 void
1828 AdwResetChip(iot, ioh)
1829 bus_space_tag_t iot;
1830 bus_space_handle_t ioh;
1831 {
1832
1833
1834
1835
1836 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
1837 ADW_CTRL_REG_CMD_RESET);
1838 AdwSleepMilliSecond(100);
1839 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
1840 ADW_CTRL_REG_CMD_WR_IO_REG);
1841 }
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853 int
1854 AdwResetCCB(sc)
1855 ADW_SOFTC *sc;
1856 {
1857 int status;
1858
1859
1860
1861
1862
1863 status = AdwSendIdleCmd(sc, (u_int16_t) IDLE_CMD_SCSI_RESET_START, 0L);
1864 if (status != ADW_TRUE) {
1865 return status;
1866 }
1867
1868
1869
1870
1871
1872
1873
1874 AdwDelayMicroSecond((u_int16_t) ADW_SCSI_RESET_HOLD_TIME_US);
1875
1876
1877
1878
1879
1880 status = AdwSendIdleCmd(sc, (u_int16_t) IDLE_CMD_SCSI_RESET_END, 0L);
1881 if (status != ADW_TRUE) {
1882 return status;
1883 }
1884
1885 AdwSleepMilliSecond((u_int32_t) sc->scsi_reset_wait * 1000);
1886
1887 return status;
1888 }
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898 int
1899 AdwResetSCSIBus(sc)
1900 ADW_SOFTC *sc;
1901 {
1902 bus_space_tag_t iot = sc->sc_iot;
1903 bus_space_handle_t ioh = sc->sc_ioh;
1904 int status;
1905 u_int16_t wdtr_able, sdtr_able, ppr_able, tagqng_able;
1906 u_int8_t tid, max_cmd[ADW_MAX_TID + 1];
1907 u_int16_t bios_sig;
1908
1909
1910
1911
1912
1913 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE, wdtr_able);
1914 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE, sdtr_able);
1915 if (sc->chip_type == ADW_CHIP_ASC38C1600) {
1916 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_PPR_ABLE, ppr_able);
1917 }
1918 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_TAGQNG_ABLE, tagqng_able);
1919 for (tid = 0; tid <= ADW_MAX_TID; tid++) {
1920 ADW_READ_BYTE_LRAM(iot, ioh, ADW_MC_NUMBER_OF_MAX_CMD + tid,
1921 max_cmd[tid]);
1922 }
1923
1924
1925
1926
1927
1928
1929
1930 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_BIOS_SIGNATURE, bios_sig);
1931 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_BIOS_SIGNATURE, 0);
1932
1933
1934
1935
1936 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RISC_CSR, ADW_RISC_CSR_STOP);
1937 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
1938 ADW_CTRL_REG_CMD_RESET);
1939 AdwSleepMilliSecond(100);
1940 ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
1941 ADW_CTRL_REG_CMD_WR_IO_REG);
1942
1943
1944
1945
1946
1947
1948 status = (AdwInitDriver(sc) == 0)? ADW_TRUE : ADW_FALSE;
1949
1950
1951
1952
1953 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_BIOS_SIGNATURE, bios_sig);
1954
1955
1956
1957
1958 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE, wdtr_able);
1959 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE, sdtr_able);
1960 if (sc->chip_type == ADW_CHIP_ASC38C1600) {
1961 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_PPR_ABLE, ppr_able);
1962 }
1963 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_TAGQNG_ABLE, tagqng_able);
1964 for (tid = 0; tid <= ADW_MAX_TID; tid++) {
1965 ADW_WRITE_BYTE_LRAM(iot, ioh, ADW_MC_NUMBER_OF_MAX_CMD + tid,
1966 max_cmd[tid]);
1967 }
1968
1969 return status;
1970 }
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989 int
1990 AdwISR(sc)
1991 ADW_SOFTC *sc;
1992 {
1993 bus_space_tag_t iot = sc->sc_iot;
1994 bus_space_handle_t ioh = sc->sc_ioh;
1995 u_int8_t int_stat;
1996 u_int16_t target_bit;
1997 ADW_CARRIER *free_carrp;
1998 u_int32_t irq_next_pa;
1999 ADW_SCSI_REQ_Q *scsiq;
2000 ADW_CCB *ccb;
2001 int s;
2002
2003
2004 s = splbio();
2005
2006
2007 int_stat = ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_INTR_STATUS_REG);
2008
2009 if ((int_stat & (ADW_INTR_STATUS_INTRA | ADW_INTR_STATUS_INTRB |
2010 ADW_INTR_STATUS_INTRC)) == 0) {
2011 splx(s);
2012 return ADW_FALSE;
2013 }
2014
2015
2016
2017
2018
2019
2020 if (int_stat & ADW_INTR_STATUS_INTRB) {
2021 u_int8_t intrb_code;
2022
2023 ADW_READ_BYTE_LRAM(iot, ioh, ADW_MC_INTRB_CODE, intrb_code);
2024
2025 if (sc->chip_type == ADW_CHIP_ASC3550 ||
2026 sc->chip_type == ADW_CHIP_ASC38C0800) {
2027 if (intrb_code == ADW_ASYNC_CARRIER_READY_FAILURE &&
2028 sc->carr_pending_cnt != 0) {
2029 ADW_WRITE_BYTE_REGISTER(iot, ioh,
2030 IOPB_TICKLE, ADW_TICKLE_A);
2031 if (sc->chip_type == ADW_CHIP_ASC3550) {
2032 ADW_WRITE_BYTE_REGISTER(iot, ioh,
2033 IOPB_TICKLE, ADW_TICKLE_NOP);
2034 }
2035 }
2036 }
2037
2038 if (sc->async_callback != 0) {
2039 (*(ADW_ASYNC_CALLBACK)sc->async_callback)(sc, intrb_code);
2040 }
2041 }
2042
2043
2044
2045
2046 while (((irq_next_pa = sc->irq_sp->next_ba) & ADW_RQ_DONE) != 0)
2047 {
2048 #if ADW_DEBUG
2049 printf("irq 0x%x, 0x%x, 0x%x, 0x%x\n",
2050 sc->irq_sp->carr_id,
2051 sc->irq_sp->carr_ba,
2052 sc->irq_sp->areq_ba,
2053 sc->irq_sp->next_ba);
2054 #endif
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065 ccb = adw_ccb_phys_kv(sc, sc->irq_sp->areq_ba);
2066 scsiq = &ccb->scsiq;
2067 scsiq->ccb_ptr = sc->irq_sp->areq_ba;
2068
2069
2070
2071
2072
2073
2074 if ((irq_next_pa & ADW_RQ_GOOD) != 0) {
2075 scsiq->done_status = QD_NO_ERROR;
2076 scsiq->host_status = scsiq->scsi_status = 0;
2077 scsiq->data_cnt = 0L;
2078 }
2079
2080
2081
2082
2083
2084
2085 free_carrp = sc->irq_sp;
2086 sc->irq_sp = ADW_CARRIER_VADDR(sc, ADW_GET_CARRP(irq_next_pa));
2087
2088 free_carrp->next_ba = (sc->carr_freelist == NULL) ? NULL
2089 : sc->carr_freelist->carr_ba;
2090 sc->carr_freelist = free_carrp;
2091 sc->carr_pending_cnt--;
2092
2093 target_bit = ADW_TID_TO_TIDMASK(scsiq->target_id);
2094
2095
2096
2097
2098 scsiq->cntl = 0;
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108 if (scsiq->done_status == QD_NO_ERROR &&
2109 scsiq->cdb[0] == INQUIRY &&
2110 scsiq->target_lun == 0) {
2111 AdwInquiryHandling(sc, scsiq);
2112 }
2113
2114
2115
2116
2117
2118 (*(ADW_ISR_CALLBACK)sc->isr_callback)(sc, scsiq);
2119
2120
2121
2122
2123
2124
2125
2126 }
2127
2128 splx(s);
2129
2130 return ADW_TRUE;
2131 }
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148 int
2149 AdwSendIdleCmd(sc, idle_cmd, idle_cmd_parameter)
2150 ADW_SOFTC *sc;
2151 u_int16_t idle_cmd;
2152 u_int32_t idle_cmd_parameter;
2153 {
2154 bus_space_tag_t iot = sc->sc_iot;
2155 bus_space_handle_t ioh = sc->sc_ioh;
2156 u_int16_t result;
2157 u_int32_t i, j, s;
2158
2159 s = splbio();
2160
2161
2162
2163
2164
2165 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_IDLE_CMD_STATUS, (u_int16_t) 0);
2166
2167
2168
2169
2170
2171
2172
2173 ADW_WRITE_DWORD_LRAM(iot, ioh, ADW_MC_IDLE_CMD_PARAMETER,
2174 idle_cmd_parameter);
2175 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_IDLE_CMD, idle_cmd);
2176
2177
2178
2179
2180 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADW_TICKLE_B);
2181 if (sc->chip_type == ADW_CHIP_ASC3550) {
2182
2183
2184
2185
2186
2187 ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADW_TICKLE_NOP);
2188 }
2189
2190
2191 for (i = 0; i < SCSI_WAIT_100_MSEC; i++) {
2192
2193 for (j = 0; j < SCSI_US_PER_MSEC; j++) {
2194 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_IDLE_CMD_STATUS,
2195 result);
2196 if (result != 0) {
2197 splx(s);
2198 return result;
2199 }
2200 AdwDelayMicroSecond(1);
2201 }
2202 }
2203
2204 splx(s);
2205 return ADW_ERROR;
2206 }
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216 void
2217 AdwInquiryHandling(sc, scsiq)
2218 ADW_SOFTC *sc;
2219 ADW_SCSI_REQ_Q *scsiq;
2220 {
2221 #ifndef FAILSAFE
2222 bus_space_tag_t iot = sc->sc_iot;
2223 bus_space_handle_t ioh = sc->sc_ioh;
2224 u_int8_t tid;
2225 ADW_SCSI_INQUIRY *inq;
2226 u_int16_t tidmask;
2227 u_int16_t cfg_word;
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240 if (scsiq->cdb[4] < 8 || (scsiq->cdb[4] - scsiq->data_cnt) < 8) {
2241 return;
2242 }
2243
2244 tid = scsiq->target_id;
2245
2246 inq = (ADW_SCSI_INQUIRY *) scsiq->vdata_addr;
2247
2248
2249
2250
2251 if ((inq->rsp_data_fmt < 2) &&
2252 (inq->ansi_apr_ver < 2)) {
2253 return;
2254 } else {
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264 tidmask = ADW_TID_TO_TIDMASK(tid);
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274 #ifdef SCSI_ADW_WDTR_DISABLE
2275 if(!(tidmask & SCSI_ADW_WDTR_DISABLE))
2276 #endif
2277 if ((sc->wdtr_able & tidmask) && inq->WBus16) {
2278 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE,
2279 cfg_word);
2280 if ((cfg_word & tidmask) == 0) {
2281 cfg_word |= tidmask;
2282 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_WDTR_ABLE,
2283 cfg_word);
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_DONE,
2294 cfg_word);
2295 cfg_word &= ~tidmask;
2296 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_DONE,
2297 cfg_word);
2298 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_WDTR_DONE,
2299 cfg_word);
2300 cfg_word &= ~tidmask;
2301 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_WDTR_DONE,
2302 cfg_word);
2303 }
2304 }
2305
2306
2307
2308
2309
2310
2311
2312
2313 #ifdef SCSI_ADW_SDTR_DISABLE
2314 if(!(tidmask & SCSI_ADW_SDTR_DISABLE))
2315 #endif
2316 if ((sc->sdtr_able & tidmask) && inq->Sync) {
2317 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE,cfg_word);
2318 if ((cfg_word & tidmask) == 0) {
2319 cfg_word |= tidmask;
2320 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE,
2321 cfg_word);
2322
2323
2324
2325
2326
2327
2328 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_DONE,
2329 cfg_word);
2330 cfg_word &= ~tidmask;
2331 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_SDTR_DONE,
2332 cfg_word);
2333 }
2334 }
2335
2336
2337
2338
2339 if (sc->chip_type == ADW_CHIP_ASC38C1600 &&
2340 (scsiq->cdb[4] >= 57 ||
2341 (scsiq->cdb[4] - scsiq->data_cnt) >= 57)) {
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351 if((inq->Clocking) & INQ_CLOCKING_DT_ONLY){
2352 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_PPR_ABLE,
2353 sc->ppr_able);
2354 sc->ppr_able |= tidmask;
2355 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_PPR_ABLE,
2356 sc->ppr_able);
2357 }
2358 }
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372 #ifdef SCSI_ADW_TAGQ_DISABLE
2373 if(!(tidmask & SCSI_ADW_TAGQ_DISABLE))
2374 #endif
2375 if ((sc->tagqng_able & tidmask) && inq->CmdQue) {
2376 ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_TAGQNG_ABLE,
2377 cfg_word);
2378 cfg_word |= tidmask;
2379 ADW_WRITE_WORD_LRAM(iot, ioh, ADW_MC_TAGQNG_ABLE,
2380 cfg_word);
2381
2382 ADW_WRITE_BYTE_LRAM(iot, ioh,
2383 ADW_MC_NUMBER_OF_MAX_CMD + tid,
2384 sc->max_dvc_qng);
2385 }
2386 }
2387 #endif
2388 }
2389
2390
2391 void
2392 AdwSleepMilliSecond(n)
2393 u_int32_t n;
2394 {
2395
2396 DELAY(n * 1000);
2397 }
2398
2399
2400 void
2401 AdwDelayMicroSecond(n)
2402 u_int32_t n;
2403 {
2404
2405 DELAY(n);
2406 }
2407