2 * Product specific probe and attach routines for:
3 * 3940, 2940, aic7895, aic7890, aic7880,
4 * aic7870, aic7860 and aic7850 SCSI controllers
6 * Copyright (c) 1994-2001 Justin T. Gibbs.
7 * Copyright (c) 2000-2001 Adaptec Inc.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions, and the following disclaimer,
15 * without modification.
16 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
17 * substantially similar to the "NO WARRANTY" disclaimer below
18 * ("Disclaimer") and any redistribution must be conditioned upon
19 * including a substantially similar Disclaimer requirement for further
20 * binary redistribution.
21 * 3. Neither the names of the above-listed copyright holders nor the names
22 * of any contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
25 * Alternatively, this software may be distributed under the terms of the
26 * GNU General Public License ("GPL") version 2 as published by the Free
27 * Software Foundation.
30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
33 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
34 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
38 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
39 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
40 * POSSIBILITY OF SUCH DAMAGES.
42 * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#79 $
46 #include "aic7xxx_osm.h"
47 #include "aic7xxx_inline.h"
48 #include "aic7xxx_93cx6.h"
50 #include <dev/aic7xxx/aic7xxx_osm.h>
51 #include <dev/aic7xxx/aic7xxx_inline.h>
52 #include <dev/aic7xxx/aic7xxx_93cx6.h>
55 #include "aic7xxx_pci.h"
57 static __inline uint64_t
58 ahc_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
64 | ((uint64_t)vendor << 32)
65 | ((uint64_t)device << 48);
70 #define AHC_PCI_IOADDR PCIR_MAPS /* I/O Address */
71 #define AHC_PCI_MEMADDR (PCIR_MAPS + 4) /* Mem I/O Address */
73 #define DEVID_9005_TYPE(id) ((id) & 0xF)
74 #define DEVID_9005_TYPE_HBA 0x0 /* Standard Card */
75 #define DEVID_9005_TYPE_AAA 0x3 /* RAID Card */
76 #define DEVID_9005_TYPE_SISL 0x5 /* Container ROMB */
77 #define DEVID_9005_TYPE_MB 0xF /* On Motherboard */
79 #define DEVID_9005_MAXRATE(id) (((id) & 0x30) >> 4)
80 #define DEVID_9005_MAXRATE_U160 0x0
81 #define DEVID_9005_MAXRATE_ULTRA2 0x1
82 #define DEVID_9005_MAXRATE_ULTRA 0x2
83 #define DEVID_9005_MAXRATE_FAST 0x3
85 #define DEVID_9005_MFUNC(id) (((id) & 0x40) >> 6)
87 #define DEVID_9005_CLASS(id) (((id) & 0xFF00) >> 8)
88 #define DEVID_9005_CLASS_SPI 0x0 /* Parallel SCSI */
90 #define SUBID_9005_TYPE(id) ((id) & 0xF)
91 #define SUBID_9005_TYPE_MB 0xF /* On Motherboard */
92 #define SUBID_9005_TYPE_CARD 0x0 /* Standard Card */
93 #define SUBID_9005_TYPE_LCCARD 0x1 /* Low Cost Card */
94 #define SUBID_9005_TYPE_RAID 0x3 /* Combined with Raid */
96 #define SUBID_9005_TYPE_KNOWN(id) \
97 ((((id) & 0xF) == SUBID_9005_TYPE_MB) \
98 || (((id) & 0xF) == SUBID_9005_TYPE_CARD) \
99 || (((id) & 0xF) == SUBID_9005_TYPE_LCCARD) \
100 || (((id) & 0xF) == SUBID_9005_TYPE_RAID))
102 #define SUBID_9005_MAXRATE(id) (((id) & 0x30) >> 4)
103 #define SUBID_9005_MAXRATE_ULTRA2 0x0
104 #define SUBID_9005_MAXRATE_ULTRA 0x1
105 #define SUBID_9005_MAXRATE_U160 0x2
106 #define SUBID_9005_MAXRATE_RESERVED 0x3
108 #define SUBID_9005_SEEPTYPE(id) \
109 ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \
110 ? ((id) & 0xC0) >> 6 \
111 : ((id) & 0x300) >> 8)
112 #define SUBID_9005_SEEPTYPE_NONE 0x0
113 #define SUBID_9005_SEEPTYPE_1K 0x1
114 #define SUBID_9005_SEEPTYPE_2K_4K 0x2
115 #define SUBID_9005_SEEPTYPE_RESERVED 0x3
116 #define SUBID_9005_AUTOTERM(id) \
117 ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \
118 ? (((id) & 0x400) >> 10) == 0 \
119 : (((id) & 0x40) >> 6) == 0)
121 #define SUBID_9005_NUMCHAN(id) \
122 ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \
123 ? ((id) & 0x300) >> 8 \
124 : ((id) & 0xC00) >> 10)
126 #define SUBID_9005_LEGACYCONN(id) \
127 ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \
129 : ((id) & 0x80) >> 7)
131 #define SUBID_9005_MFUNCENB(id) \
132 ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \
133 ? ((id) & 0x800) >> 11 \
134 : ((id) & 0x1000) >> 12)
136 * Informational only. Should use chip register to be
137 * certain, but may be use in identification strings.
139 #define SUBID_9005_CARD_SCSIWIDTH_MASK 0x2000
140 #define SUBID_9005_CARD_PCIWIDTH_MASK 0x4000
141 #define SUBID_9005_CARD_SEDIFF_MASK 0x8000
143 static ahc_device_setup_t ahc_aic785X_setup;
144 static ahc_device_setup_t ahc_aic7860_setup;
145 static ahc_device_setup_t ahc_apa1480_setup;
146 static ahc_device_setup_t ahc_aic7870_setup;
147 static ahc_device_setup_t ahc_aic7870h_setup;
148 static ahc_device_setup_t ahc_aha394X_setup;
149 static ahc_device_setup_t ahc_aha394Xh_setup;
150 static ahc_device_setup_t ahc_aha494X_setup;
151 static ahc_device_setup_t ahc_aha494Xh_setup;
152 static ahc_device_setup_t ahc_aha398X_setup;
153 static ahc_device_setup_t ahc_aic7880_setup;
154 static ahc_device_setup_t ahc_aic7880h_setup;
155 static ahc_device_setup_t ahc_aha2940Pro_setup;
156 static ahc_device_setup_t ahc_aha394XU_setup;
157 static ahc_device_setup_t ahc_aha394XUh_setup;
158 static ahc_device_setup_t ahc_aha398XU_setup;
159 static ahc_device_setup_t ahc_aic7890_setup;
160 static ahc_device_setup_t ahc_aic7892_setup;
161 static ahc_device_setup_t ahc_aic7895_setup;
162 static ahc_device_setup_t ahc_aic7895h_setup;
163 static ahc_device_setup_t ahc_aic7896_setup;
164 static ahc_device_setup_t ahc_aic7899_setup;
165 static ahc_device_setup_t ahc_aha29160C_setup;
166 static ahc_device_setup_t ahc_raid_setup;
167 static ahc_device_setup_t ahc_aha394XX_setup;
168 static ahc_device_setup_t ahc_aha494XX_setup;
169 static ahc_device_setup_t ahc_aha398XX_setup;
171 static struct ahc_pci_identity ahc_pci_ident_table [] =
173 /* aic7850 based controllers */
175 ID_AHA_2902_04_10_15_20C_30C,
177 "Adaptec 2902/04/10/15/20C/30C SCSI adapter",
180 /* aic7860 based controllers */
184 "Adaptec 2930CU SCSI adapter",
188 ID_AHA_1480A & ID_DEV_VENDOR_MASK,
190 "Adaptec 1480A Ultra SCSI adapter",
194 ID_AHA_2940AU_0 & ID_DEV_VENDOR_MASK,
196 "Adaptec 2940A Ultra SCSI adapter",
200 ID_AHA_2940AU_CN & ID_DEV_VENDOR_MASK,
202 "Adaptec 2940A/CN Ultra SCSI adapter",
206 ID_AHA_2930C_VAR & ID_DEV_VENDOR_MASK,
208 "Adaptec 2930C Ultra SCSI adapter (VAR)",
211 /* aic7870 based controllers */
215 "Adaptec 2940 SCSI adapter",
221 "Adaptec 3940 SCSI adapter",
227 "Adaptec 398X SCSI RAID adapter",
233 "Adaptec 2944 SCSI adapter",
239 "Adaptec 3944 SCSI adapter",
245 "Adaptec 4944 SCSI adapter",
248 /* aic7880 based controllers */
250 ID_AHA_2940U & ID_DEV_VENDOR_MASK,
252 "Adaptec 2940 Ultra SCSI adapter",
256 ID_AHA_3940U & ID_DEV_VENDOR_MASK,
258 "Adaptec 3940 Ultra SCSI adapter",
262 ID_AHA_2944U & ID_DEV_VENDOR_MASK,
264 "Adaptec 2944 Ultra SCSI adapter",
268 ID_AHA_3944U & ID_DEV_VENDOR_MASK,
270 "Adaptec 3944 Ultra SCSI adapter",
274 ID_AHA_398XU & ID_DEV_VENDOR_MASK,
276 "Adaptec 398X Ultra SCSI RAID adapter",
281 * XXX Don't know the slot numbers
282 * so we can't identify channels
284 ID_AHA_4944U & ID_DEV_VENDOR_MASK,
286 "Adaptec 4944 Ultra SCSI adapter",
290 ID_AHA_2930U & ID_DEV_VENDOR_MASK,
292 "Adaptec 2930 Ultra SCSI adapter",
296 ID_AHA_2940U_PRO & ID_DEV_VENDOR_MASK,
298 "Adaptec 2940 Pro Ultra SCSI adapter",
302 ID_AHA_2940U_CN & ID_DEV_VENDOR_MASK,
304 "Adaptec 2940/CN Ultra SCSI adapter",
307 /* Ignore all SISL (AAC on MB) based controllers. */
314 /* aic7890 based controllers */
318 "Adaptec 2930 Ultra2 SCSI adapter",
324 "Adaptec 2940B Ultra2 SCSI adapter",
330 "Adaptec 2940 Ultra2 SCSI adapter (OEM)",
336 "Adaptec 2940 Ultra2 SCSI adapter",
342 "Adaptec 2950 Ultra2 SCSI adapter",
348 "Adaptec aic7890/91 Ultra2 SCSI adapter (ARO)",
354 "Adaptec AAA-131 Ultra2 RAID adapter",
357 /* aic7892 based controllers */
361 "Adaptec 29160 Ultra160 SCSI adapter",
367 "Adaptec (Compaq OEM) 29160 Ultra160 SCSI adapter",
373 "Adaptec 29160N Ultra160 SCSI adapter",
379 "Adaptec 29160C Ultra160 SCSI adapter",
385 "Adaptec 29160B Ultra160 SCSI adapter",
391 "Adaptec 19160B Ultra160 SCSI adapter",
397 "Adaptec aic7892 Ultra160 SCSI adapter (ARO)",
403 "Adaptec 2915/30LP Ultra160 SCSI adapter",
406 /* aic7895 based controllers */
410 "Adaptec 2940/DUAL Ultra SCSI adapter",
416 "Adaptec 3940A Ultra SCSI adapter",
422 "Adaptec 3944A Ultra SCSI adapter",
428 "Adaptec aic7895 Ultra SCSI adapter (ARO)",
431 /* aic7896/97 based controllers */
435 "Adaptec 3950B Ultra2 SCSI adapter",
441 "Adaptec 3950B Ultra2 SCSI adapter",
447 "Adaptec 3950D Ultra2 SCSI adapter",
453 "Adaptec 3950D Ultra2 SCSI adapter",
459 "Adaptec aic7896/97 Ultra2 SCSI adapter (ARO)",
462 /* aic7899 based controllers */
466 "Adaptec 3960D Ultra160 SCSI adapter",
472 "Adaptec (Compaq OEM) 3960D Ultra160 SCSI adapter",
478 "Adaptec aic7899 Ultra160 SCSI adapter (ARO)",
481 /* Generic chip probes for devices we don't know 'exactly' */
483 ID_AIC7850 & ID_DEV_VENDOR_MASK,
485 "Adaptec aic7850 SCSI adapter",
489 ID_AIC7855 & ID_DEV_VENDOR_MASK,
491 "Adaptec aic7855 SCSI adapter",
495 ID_AIC7859 & ID_DEV_VENDOR_MASK,
497 "Adaptec aic7859 SCSI adapter",
501 ID_AIC7860 & ID_DEV_VENDOR_MASK,
503 "Adaptec aic7860 Ultra SCSI adapter",
507 ID_AIC7870 & ID_DEV_VENDOR_MASK,
509 "Adaptec aic7870 SCSI adapter",
513 ID_AIC7880 & ID_DEV_VENDOR_MASK,
515 "Adaptec aic7880 Ultra SCSI adapter",
519 ID_AIC7890 & ID_9005_GENERIC_MASK,
520 ID_9005_GENERIC_MASK,
521 "Adaptec aic7890/91 Ultra2 SCSI adapter",
525 ID_AIC7892 & ID_9005_GENERIC_MASK,
526 ID_9005_GENERIC_MASK,
527 "Adaptec aic7892 Ultra160 SCSI adapter",
531 ID_AIC7895 & ID_DEV_VENDOR_MASK,
533 "Adaptec aic7895 Ultra SCSI adapter",
537 ID_AIC7896 & ID_9005_GENERIC_MASK,
538 ID_9005_GENERIC_MASK,
539 "Adaptec aic7896/97 Ultra2 SCSI adapter",
543 ID_AIC7899 & ID_9005_GENERIC_MASK,
544 ID_9005_GENERIC_MASK,
545 "Adaptec aic7899 Ultra160 SCSI adapter",
549 ID_AIC7810 & ID_DEV_VENDOR_MASK,
551 "Adaptec aic7810 RAID memory controller",
555 ID_AIC7815 & ID_DEV_VENDOR_MASK,
557 "Adaptec aic7815 RAID memory controller",
562 static const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table);
564 #define AHC_394X_SLOT_CHANNEL_A 4
565 #define AHC_394X_SLOT_CHANNEL_B 5
567 #define AHC_398X_SLOT_CHANNEL_A 4
568 #define AHC_398X_SLOT_CHANNEL_B 8
569 #define AHC_398X_SLOT_CHANNEL_C 12
571 #define AHC_494X_SLOT_CHANNEL_A 4
572 #define AHC_494X_SLOT_CHANNEL_B 5
573 #define AHC_494X_SLOT_CHANNEL_C 6
574 #define AHC_494X_SLOT_CHANNEL_D 7
576 #define DEVCONFIG 0x40
577 #define PCIERRGENDIS 0x80000000ul
578 #define SCBSIZE32 0x00010000ul /* aic789X only */
579 #define REXTVALID 0x00001000ul /* ultra cards only */
580 #define MPORTMODE 0x00000400ul /* aic7870+ only */
581 #define RAMPSM 0x00000200ul /* aic7870+ only */
582 #define VOLSENSE 0x00000100ul
583 #define PCI64BIT 0x00000080ul /* 64Bit PCI bus (Ultra2 Only)*/
584 #define SCBRAMSEL 0x00000080ul
585 #define MRDCEN 0x00000040ul
586 #define EXTSCBTIME 0x00000020ul /* aic7870 only */
587 #define EXTSCBPEN 0x00000010ul /* aic7870 only */
588 #define BERREN 0x00000008ul
589 #define DACEN 0x00000004ul
590 #define STPWLEVEL 0x00000002ul
591 #define DIFACTNEGEN 0x00000001ul /* aic7870 only */
593 #define CSIZE_LATTIME 0x0c
594 #define CACHESIZE 0x0000003ful /* only 5 bits */
595 #define LATTIME 0x0000ff00ul
597 /* PCI STATUS definitions */
605 static int ahc_9005_subdevinfo_valid(uint16_t vendor, uint16_t device,
606 uint16_t subvendor, uint16_t subdevice);
607 static int ahc_ext_scbram_present(struct ahc_softc *ahc);
608 static void ahc_scbram_config(struct ahc_softc *ahc, int enable,
609 int pcheck, int fast, int large);
610 static void ahc_probe_ext_scbram(struct ahc_softc *ahc);
611 static void check_extport(struct ahc_softc *ahc, u_int *sxfrctl1);
612 static void ahc_parse_pci_eeprom(struct ahc_softc *ahc,
613 struct seeprom_config *sc);
614 static void configure_termination(struct ahc_softc *ahc,
615 struct seeprom_descriptor *sd,
616 u_int adapter_control,
619 static void ahc_new_term_detect(struct ahc_softc *ahc,
624 int *eeprom_present);
625 static void aic787X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
626 int *internal68_present,
627 int *externalcable_present,
628 int *eeprom_present);
629 static void aic785X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
630 int *externalcable_present,
631 int *eeprom_present);
632 static void write_brdctl(struct ahc_softc *ahc, uint8_t value);
633 static uint8_t read_brdctl(struct ahc_softc *ahc);
634 static void ahc_pci_intr(struct ahc_softc *ahc);
635 static int ahc_pci_chip_init(struct ahc_softc *ahc);
638 ahc_9005_subdevinfo_valid(uint16_t device, uint16_t vendor,
639 uint16_t subdevice, uint16_t subvendor)
643 /* Default to invalid. */
646 && subvendor == 0x9005
647 && subdevice != device
648 && SUBID_9005_TYPE_KNOWN(subdevice) != 0) {
650 switch (SUBID_9005_TYPE(subdevice)) {
651 case SUBID_9005_TYPE_MB:
653 case SUBID_9005_TYPE_CARD:
654 case SUBID_9005_TYPE_LCCARD:
656 * Currently only trust Adaptec cards to
657 * get the sub device info correct.
659 if (DEVID_9005_TYPE(device) == DEVID_9005_TYPE_HBA)
662 case SUBID_9005_TYPE_RAID:
671 struct ahc_pci_identity *
672 ahc_find_pci_device(ahc_dev_softc_t pci)
679 struct ahc_pci_identity *entry;
682 vendor = ahc_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
683 device = ahc_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
684 subvendor = ahc_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
685 subdevice = ahc_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
686 full_id = ahc_compose_id(device, vendor, subdevice, subvendor);
689 * If the second function is not hooked up, ignore it.
690 * Unfortunately, not all MB vendors implement the
691 * subdevice ID as per the Adaptec spec, so do our best
692 * to sanity check it prior to accepting the subdevice
695 if (ahc_get_pci_function(pci) > 0
696 && ahc_9005_subdevinfo_valid(vendor, device, subvendor, subdevice)
697 && SUBID_9005_MFUNCENB(subdevice) == 0)
700 for (i = 0; i < ahc_num_pci_devs; i++) {
701 entry = &ahc_pci_ident_table[i];
702 if (entry->full_id == (full_id & entry->id_mask)) {
703 /* Honor exclusion entries. */
704 if (entry->name == NULL)
713 ahc_pci_config(struct ahc_softc *ahc, struct ahc_pci_identity *entry)
725 error = entry->setup(ahc);
728 ahc->chip |= AHC_PCI;
729 ahc->description = entry->name;
731 pci_set_power_state(ahc->dev_softc, AHC_POWER_STATE_D0);
733 error = ahc_pci_map_registers(ahc);
738 * Before we continue probing the card, ensure that
739 * its interrupts are *disabled*. We don't want
740 * a misstep to hang the machine in an interrupt
743 ahc_intr_enable(ahc, FALSE);
745 devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
748 * If we need to support high memory, enable dual
749 * address cycles. This bit must be set to enable
750 * high address bit generation even if we are on a
751 * 64bit bus (PCI64BIT set in devconfig).
753 if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
756 printf("%s: Enabling 39Bit Addressing\n",
761 /* Ensure that pci error generation, a test feature, is disabled. */
762 devconfig |= PCIERRGENDIS;
764 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
766 /* Ensure busmastering is enabled */
767 command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
768 command |= PCIM_CMD_BUSMASTEREN;
770 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
772 /* On all PCI adapters, we allow SCB paging */
773 ahc->flags |= AHC_PAGESCBS;
775 error = ahc_softc_init(ahc);
780 * Disable PCI parity error checking. Users typically
781 * do this to work around broken PCI chipsets that get
782 * the parity timing wrong and thus generate lots of spurious
783 * errors. The chip only allows us to disable *all* parity
784 * error reporting when doing this, so CIO bus, scb ram, and
785 * scratch ram parity errors will be ignored too.
787 if ((ahc->flags & AHC_DISABLE_PCI_PERR) != 0)
788 ahc->seqctl |= FAILDIS;
790 ahc->bus_intr = ahc_pci_intr;
791 ahc->bus_chip_init = ahc_pci_chip_init;
793 /* Remeber how the card was setup in case there is no SEEPROM */
794 if ((ahc_inb(ahc, HCNTRL) & POWRDN) == 0) {
796 if ((ahc->features & AHC_ULTRA2) != 0)
797 our_id = ahc_inb(ahc, SCSIID_ULTRA2) & OID;
799 our_id = ahc_inb(ahc, SCSIID) & OID;
800 sxfrctl1 = ahc_inb(ahc, SXFRCTL1) & STPWEN;
801 scsiseq = ahc_inb(ahc, SCSISEQ);
808 error = ahc_reset(ahc, /*reinit*/FALSE);
812 if ((ahc->features & AHC_DT) != 0) {
815 /* Perform ALT-Mode Setup */
816 sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
817 ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
818 ahc_outb(ahc, OPTIONMODE,
819 OPTIONMODE_DEFAULTS|AUTOACKEN|BUSFREEREV|EXPPHASEDIS);
820 ahc_outb(ahc, SFUNCT, sfunct);
822 /* Normal mode setup */
823 ahc_outb(ahc, CRCCONTROL1, CRCVALCHKEN|CRCENDCHKEN|CRCREQCHKEN
827 dscommand0 = ahc_inb(ahc, DSCOMMAND0);
828 dscommand0 |= MPARCKEN|CACHETHEN;
829 if ((ahc->features & AHC_ULTRA2) != 0) {
832 * DPARCKEN doesn't work correctly on
833 * some MBs so don't use it.
835 dscommand0 &= ~DPARCKEN;
839 * Handle chips that must have cache line
840 * streaming (dis/en)abled.
842 if ((ahc->bugs & AHC_CACHETHEN_DIS_BUG) != 0)
843 dscommand0 |= CACHETHEN;
845 if ((ahc->bugs & AHC_CACHETHEN_BUG) != 0)
846 dscommand0 &= ~CACHETHEN;
848 ahc_outb(ahc, DSCOMMAND0, dscommand0);
851 ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME,
852 /*bytes*/1) & CACHESIZE;
853 ahc->pci_cachesize *= 4;
855 if ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0
856 && ahc->pci_cachesize == 4) {
858 ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
860 ahc->pci_cachesize = 0;
864 * We cannot perform ULTRA speeds without the presense
865 * of the external precision resistor.
867 if ((ahc->features & AHC_ULTRA) != 0) {
870 devconfig = ahc_pci_read_config(ahc->dev_softc,
871 DEVCONFIG, /*bytes*/4);
872 if ((devconfig & REXTVALID) == 0)
873 ahc->features &= ~AHC_ULTRA;
876 /* See if we have a SEEPROM and perform auto-term */
877 check_extport(ahc, &sxfrctl1);
880 * Take the LED out of diagnostic mode
882 sblkctl = ahc_inb(ahc, SBLKCTL);
883 ahc_outb(ahc, SBLKCTL, (sblkctl & ~(DIAGLEDEN|DIAGLEDON)));
885 if ((ahc->features & AHC_ULTRA2) != 0) {
886 ahc_outb(ahc, DFF_THRSH, RD_DFTHRSH_MAX|WR_DFTHRSH_MAX);
888 ahc_outb(ahc, DSPCISTATUS, DFTHRSH_100);
891 if (ahc->flags & AHC_USEDEFAULTS) {
893 * PCI Adapter default setup
894 * Should only be used if the adapter does not have
897 /* See if someone else set us up already */
898 if ((ahc->flags & AHC_NO_BIOS_INIT) == 0
900 printf("%s: Using left over BIOS settings\n",
902 ahc->flags &= ~AHC_USEDEFAULTS;
903 ahc->flags |= AHC_BIOS_ENABLED;
906 * Assume only one connector and always turn
912 ahc_outb(ahc, SCSICONF, our_id|ENSPCHK|RESET_SCSI);
914 ahc->our_id = our_id;
918 * Take a look to see if we have external SRAM.
919 * We currently do not attempt to use SRAM that is
920 * shared among multiple controllers.
922 ahc_probe_ext_scbram(ahc);
925 * Record our termination setting for the
926 * generic initialization routine.
928 if ((sxfrctl1 & STPWEN) != 0)
929 ahc->flags |= AHC_TERM_ENB_A;
932 * Save chip register configuration data for chip resets
933 * that occur during runtime and resume events.
935 ahc->bus_softc.pci_softc.devconfig =
936 ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
937 ahc->bus_softc.pci_softc.command =
938 ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
939 ahc->bus_softc.pci_softc.csize_lattime =
940 ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1);
941 ahc->bus_softc.pci_softc.dscommand0 = ahc_inb(ahc, DSCOMMAND0);
942 ahc->bus_softc.pci_softc.dspcistatus = ahc_inb(ahc, DSPCISTATUS);
943 if ((ahc->features & AHC_DT) != 0) {
946 sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
947 ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
948 ahc->bus_softc.pci_softc.optionmode = ahc_inb(ahc, OPTIONMODE);
949 ahc->bus_softc.pci_softc.targcrccnt = ahc_inw(ahc, TARGCRCCNT);
950 ahc_outb(ahc, SFUNCT, sfunct);
951 ahc->bus_softc.pci_softc.crccontrol1 =
952 ahc_inb(ahc, CRCCONTROL1);
954 if ((ahc->features & AHC_MULTI_FUNC) != 0)
955 ahc->bus_softc.pci_softc.scbbaddr = ahc_inb(ahc, SCBBADDR);
957 if ((ahc->features & AHC_ULTRA2) != 0)
958 ahc->bus_softc.pci_softc.dff_thrsh = ahc_inb(ahc, DFF_THRSH);
960 /* Core initialization */
961 error = ahc_init(ahc);
966 * Allow interrupts now that we are completely setup.
968 error = ahc_pci_map_int(ahc);
977 * Test for the presense of external sram in an
978 * "unshared" configuration.
981 ahc_ext_scbram_present(struct ahc_softc *ahc)
988 chip = ahc->chip & AHC_CHIPID_MASK;
989 devconfig = ahc_pci_read_config(ahc->dev_softc,
990 DEVCONFIG, /*bytes*/4);
991 single_user = (devconfig & MPORTMODE) != 0;
993 if ((ahc->features & AHC_ULTRA2) != 0)
994 ramps = (ahc_inb(ahc, DSCOMMAND0) & RAMPS) != 0;
995 else if (chip == AHC_AIC7895 || chip == AHC_AIC7895C)
997 * External SCBRAM arbitration is flakey
998 * on these chips. Unfortunately this means
999 * we don't use the extra SCB ram space on the
1003 else if (chip >= AHC_AIC7870)
1004 ramps = (devconfig & RAMPSM) != 0;
1008 if (ramps && single_user)
1014 * Enable external scbram.
1017 ahc_scbram_config(struct ahc_softc *ahc, int enable, int pcheck,
1018 int fast, int large)
1022 if (ahc->features & AHC_MULTI_FUNC) {
1024 * Set the SCB Base addr (highest address bit)
1025 * depending on which channel we are.
1027 ahc_outb(ahc, SCBBADDR, ahc_get_pci_function(ahc->dev_softc));
1030 ahc->flags &= ~AHC_LSCBS_ENABLED;
1032 ahc->flags |= AHC_LSCBS_ENABLED;
1033 devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
1034 if ((ahc->features & AHC_ULTRA2) != 0) {
1037 dscommand0 = ahc_inb(ahc, DSCOMMAND0);
1039 dscommand0 &= ~INTSCBRAMSEL;
1041 dscommand0 |= INTSCBRAMSEL;
1043 dscommand0 &= ~USCBSIZE32;
1045 dscommand0 |= USCBSIZE32;
1046 ahc_outb(ahc, DSCOMMAND0, dscommand0);
1049 devconfig &= ~EXTSCBTIME;
1051 devconfig |= EXTSCBTIME;
1053 devconfig &= ~SCBRAMSEL;
1055 devconfig |= SCBRAMSEL;
1057 devconfig &= ~SCBSIZE32;
1059 devconfig |= SCBSIZE32;
1062 devconfig |= EXTSCBPEN;
1064 devconfig &= ~EXTSCBPEN;
1066 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
1070 * Take a look to see if we have external SRAM.
1071 * We currently do not attempt to use SRAM that is
1072 * shared among multiple controllers.
1075 ahc_probe_ext_scbram(struct ahc_softc *ahc)
1090 if (ahc_ext_scbram_present(ahc) == 0)
1094 * Probe for the best parameters to use.
1096 ahc_scbram_config(ahc, /*enable*/TRUE, pcheck, fast, large);
1097 num_scbs = ahc_probe_scbs(ahc);
1098 if (num_scbs == 0) {
1099 /* The SRAM wasn't really present. */
1105 * Clear any outstanding parity error
1106 * and ensure that parity error reporting
1109 ahc_outb(ahc, SEQCTL, 0);
1110 ahc_outb(ahc, CLRINT, CLRPARERR);
1111 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1113 /* Now see if we can do parity */
1114 ahc_scbram_config(ahc, enable, /*pcheck*/TRUE, fast, large);
1115 num_scbs = ahc_probe_scbs(ahc);
1116 if ((ahc_inb(ahc, INTSTAT) & BRKADRINT) == 0
1117 || (ahc_inb(ahc, ERROR) & MPARERR) == 0)
1120 /* Clear any resulting parity error */
1121 ahc_outb(ahc, CLRINT, CLRPARERR);
1122 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1124 /* Now see if we can do fast timing */
1125 ahc_scbram_config(ahc, enable, pcheck, /*fast*/TRUE, large);
1126 test_num_scbs = ahc_probe_scbs(ahc);
1127 if (test_num_scbs == num_scbs
1128 && ((ahc_inb(ahc, INTSTAT) & BRKADRINT) == 0
1129 || (ahc_inb(ahc, ERROR) & MPARERR) == 0))
1133 * See if we can use large SCBs and still maintain
1134 * the same overall count of SCBs.
1136 if ((ahc->features & AHC_LARGE_SCBS) != 0) {
1137 ahc_scbram_config(ahc, enable, pcheck, fast, /*large*/TRUE);
1138 test_num_scbs = ahc_probe_scbs(ahc);
1139 if (test_num_scbs >= num_scbs) {
1141 num_scbs = test_num_scbs;
1142 if (num_scbs >= 64) {
1144 * We have enough space to move the
1145 * "busy targets table" into SCB space
1146 * and make it qualify all the way to the
1149 ahc->flags |= AHC_SCB_BTT;
1155 * Disable parity error reporting until we
1156 * can load instruction ram.
1158 ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS);
1159 /* Clear any latched parity error */
1160 ahc_outb(ahc, CLRINT, CLRPARERR);
1161 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1162 if (bootverbose && enable) {
1163 printf("%s: External SRAM, %s access%s, %dbytes/SCB\n",
1164 ahc_name(ahc), fast ? "fast" : "slow",
1165 pcheck ? ", parity checking enabled" : "",
1168 ahc_scbram_config(ahc, enable, pcheck, fast, large);
1172 * Perform some simple tests that should catch situations where
1173 * our registers are invalidly mapped.
1176 ahc_pci_test_register_access(struct ahc_softc *ahc)
1186 * Enable PCI error interrupt status, but suppress NMIs
1187 * generated by SERR raised due to target aborts.
1189 cmd = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
1190 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
1191 cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
1194 * First a simple test to see if any
1195 * registers can be read. Reading
1196 * HCNTRL has no side effects and has
1197 * at least one bit that is guaranteed to
1198 * be zero so it is a good register to
1199 * use for this test.
1201 hcntrl = ahc_inb(ahc, HCNTRL);
1206 if ((hcntrl & CHIPRST) != 0) {
1208 * The chip has not been initialized since
1209 * PCI/EISA/VLB bus reset. Don't trust
1210 * "left over BIOS data".
1212 ahc->flags |= AHC_NO_BIOS_INIT;
1216 * Next create a situation where write combining
1217 * or read prefetching could be initiated by the
1218 * CPU or host bridge. Our device does not support
1219 * either, so look for data corruption and/or flagged
1220 * PCI errors. First pause without causing another
1224 ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
1225 while (ahc_is_paused(ahc) == 0)
1228 /* Clear any PCI errors that occurred before our driver attached. */
1229 status1 = ahc_pci_read_config(ahc->dev_softc,
1230 PCIR_STATUS + 1, /*bytes*/1);
1231 ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
1232 status1, /*bytes*/1);
1233 ahc_outb(ahc, CLRINT, CLRPARERR);
1235 ahc_outb(ahc, SEQCTL, PERRORDIS);
1236 ahc_outb(ahc, SCBPTR, 0);
1237 ahc_outl(ahc, SCB_BASE, 0x5aa555aa);
1238 if (ahc_inl(ahc, SCB_BASE) != 0x5aa555aa)
1241 status1 = ahc_pci_read_config(ahc->dev_softc,
1242 PCIR_STATUS + 1, /*bytes*/1);
1243 if ((status1 & STA) != 0)
1249 /* Silently clear any latched errors. */
1250 status1 = ahc_pci_read_config(ahc->dev_softc,
1251 PCIR_STATUS + 1, /*bytes*/1);
1252 ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
1253 status1, /*bytes*/1);
1254 ahc_outb(ahc, CLRINT, CLRPARERR);
1255 ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS);
1256 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
1261 * Check the external port logic for a serial eeprom
1262 * and termination/cable detection contrls.
1265 check_extport(struct ahc_softc *ahc, u_int *sxfrctl1)
1267 struct seeprom_descriptor sd;
1268 struct seeprom_config *sc;
1273 sd.sd_control_offset = SEECTL;
1274 sd.sd_status_offset = SEECTL;
1275 sd.sd_dataout_offset = SEECTL;
1276 sc = ahc->seep_config;
1279 * For some multi-channel devices, the c46 is simply too
1280 * small to work. For the other controller types, we can
1281 * get our information from either SEEPROM type. Set the
1282 * type to start our probe with accordingly.
1284 if (ahc->flags & AHC_LARGE_SEEPROM)
1285 sd.sd_chip = C56_66;
1296 have_seeprom = ahc_acquire_seeprom(ahc, &sd);
1300 printf("%s: Reading SEEPROM...", ahc_name(ahc));
1305 start_addr = 32 * (ahc->channel - 'A');
1307 have_seeprom = ahc_read_seeprom(&sd, (uint16_t *)sc,
1312 have_seeprom = ahc_verify_cksum(sc);
1314 if (have_seeprom != 0 || sd.sd_chip == C56_66) {
1316 if (have_seeprom == 0)
1317 printf ("checksum error\n");
1323 sd.sd_chip = C56_66;
1325 ahc_release_seeprom(&sd);
1327 /* Remember the SEEPROM type for later */
1328 if (sd.sd_chip == C56_66)
1329 ahc->flags |= AHC_LARGE_SEEPROM;
1332 if (!have_seeprom) {
1334 * Pull scratch ram settings and treat them as
1335 * if they are the contents of an seeprom if
1336 * the 'ADPT' signature is found in SCB2.
1337 * We manually compose the data as 16bit values
1338 * to avoid endian issues.
1340 ahc_outb(ahc, SCBPTR, 2);
1341 if (ahc_inb(ahc, SCB_BASE) == 'A'
1342 && ahc_inb(ahc, SCB_BASE + 1) == 'D'
1343 && ahc_inb(ahc, SCB_BASE + 2) == 'P'
1344 && ahc_inb(ahc, SCB_BASE + 3) == 'T') {
1348 sc_data = (uint16_t *)sc;
1349 for (i = 0; i < 32; i++, sc_data++) {
1353 *sc_data = ahc_inb(ahc, SRAM_BASE + j)
1354 | ahc_inb(ahc, SRAM_BASE + j + 1) << 8;
1356 have_seeprom = ahc_verify_cksum(sc);
1358 ahc->flags |= AHC_SCB_CONFIG_USED;
1361 * Clear any SCB parity errors in case this data and
1362 * its associated parity was not initialized by the BIOS
1364 ahc_outb(ahc, CLRINT, CLRPARERR);
1365 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1368 if (!have_seeprom) {
1370 printf("%s: No SEEPROM available.\n", ahc_name(ahc));
1371 ahc->flags |= AHC_USEDEFAULTS;
1372 free(ahc->seep_config, M_DEVBUF);
1373 ahc->seep_config = NULL;
1376 ahc_parse_pci_eeprom(ahc, sc);
1380 * Cards that have the external logic necessary to talk to
1381 * a SEEPROM, are almost certain to have the remaining logic
1382 * necessary for auto-termination control. This assumption
1383 * hasn't failed yet...
1385 have_autoterm = have_seeprom;
1388 * Some low-cost chips have SEEPROM and auto-term control built
1389 * in, instead of using a GAL. They can tell us directly
1390 * if the termination logic is enabled.
1392 if ((ahc->features & AHC_SPIOCAP) != 0) {
1393 if ((ahc_inb(ahc, SPIOCAP) & SSPIOCPS) == 0)
1394 have_autoterm = FALSE;
1397 if (have_autoterm) {
1398 ahc->flags |= AHC_HAS_TERM_LOGIC;
1399 ahc_acquire_seeprom(ahc, &sd);
1400 configure_termination(ahc, &sd, sc->adapter_control, sxfrctl1);
1401 ahc_release_seeprom(&sd);
1402 } else if (have_seeprom) {
1403 *sxfrctl1 &= ~STPWEN;
1404 if ((sc->adapter_control & CFSTERM) != 0)
1405 *sxfrctl1 |= STPWEN;
1407 printf("%s: Low byte termination %sabled\n",
1409 (*sxfrctl1 & STPWEN) ? "en" : "dis");
1414 ahc_parse_pci_eeprom(struct ahc_softc *ahc, struct seeprom_config *sc)
1417 * Put the data we've collected down into SRAM
1418 * where ahc_init will find it.
1421 int max_targ = sc->max_targets & CFMAXTARG;
1423 uint16_t discenable;
1428 if ((sc->adapter_control & CFULTRAEN) != 0) {
1430 * Determine if this adapter has a "newstyle"
1433 for (i = 0; i < max_targ; i++) {
1434 if ((sc->device_flags[i] & CFSYNCHISULTRA) != 0) {
1435 ahc->flags |= AHC_NEWEEPROM_FMT;
1441 for (i = 0; i < max_targ; i++) {
1443 uint16_t target_mask;
1445 target_mask = 0x01 << i;
1446 if (sc->device_flags[i] & CFDISC)
1447 discenable |= target_mask;
1448 if ((ahc->flags & AHC_NEWEEPROM_FMT) != 0) {
1449 if ((sc->device_flags[i] & CFSYNCHISULTRA) != 0)
1450 ultraenb |= target_mask;
1451 } else if ((sc->adapter_control & CFULTRAEN) != 0) {
1452 ultraenb |= target_mask;
1454 if ((sc->device_flags[i] & CFXFER) == 0x04
1455 && (ultraenb & target_mask) != 0) {
1456 /* Treat 10MHz as a non-ultra speed */
1457 sc->device_flags[i] &= ~CFXFER;
1458 ultraenb &= ~target_mask;
1460 if ((ahc->features & AHC_ULTRA2) != 0) {
1463 if (sc->device_flags[i] & CFSYNCH)
1464 offset = MAX_OFFSET_ULTRA2;
1467 ahc_outb(ahc, TARG_OFFSET + i, offset);
1470 * The ultra enable bits contain the
1471 * high bit of the ultra2 sync rate
1474 scsirate = (sc->device_flags[i] & CFXFER)
1475 | ((ultraenb & target_mask) ? 0x8 : 0x0);
1476 if (sc->device_flags[i] & CFWIDEB)
1477 scsirate |= WIDEXFER;
1479 scsirate = (sc->device_flags[i] & CFXFER) << 4;
1480 if (sc->device_flags[i] & CFSYNCH)
1482 if (sc->device_flags[i] & CFWIDEB)
1483 scsirate |= WIDEXFER;
1485 ahc_outb(ahc, TARG_SCSIRATE + i, scsirate);
1487 ahc->our_id = sc->brtime_id & CFSCSIID;
1489 scsi_conf = (ahc->our_id & 0x7);
1490 if (sc->adapter_control & CFSPARITY)
1491 scsi_conf |= ENSPCHK;
1492 if (sc->adapter_control & CFRESETB)
1493 scsi_conf |= RESET_SCSI;
1495 ahc->flags |= (sc->adapter_control & CFBOOTCHAN) >> CFBOOTCHANSHIFT;
1497 if (sc->bios_control & CFEXTEND)
1498 ahc->flags |= AHC_EXTENDED_TRANS_A;
1500 if (sc->bios_control & CFBIOSEN)
1501 ahc->flags |= AHC_BIOS_ENABLED;
1502 if (ahc->features & AHC_ULTRA
1503 && (ahc->flags & AHC_NEWEEPROM_FMT) == 0) {
1504 /* Should we enable Ultra mode? */
1505 if (!(sc->adapter_control & CFULTRAEN))
1506 /* Treat us as a non-ultra card */
1510 if (sc->signature == CFSIGNATURE
1511 || sc->signature == CFSIGNATURE2) {
1514 /* Honor the STPWLEVEL settings */
1515 devconfig = ahc_pci_read_config(ahc->dev_softc,
1516 DEVCONFIG, /*bytes*/4);
1517 devconfig &= ~STPWLEVEL;
1518 if ((sc->bios_control & CFSTPWLEVEL) != 0)
1519 devconfig |= STPWLEVEL;
1520 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG,
1521 devconfig, /*bytes*/4);
1523 /* Set SCSICONF info */
1524 ahc_outb(ahc, SCSICONF, scsi_conf);
1525 ahc_outb(ahc, DISC_DSB, ~(discenable & 0xff));
1526 ahc_outb(ahc, DISC_DSB + 1, ~((discenable >> 8) & 0xff));
1527 ahc_outb(ahc, ULTRA_ENB, ultraenb & 0xff);
1528 ahc_outb(ahc, ULTRA_ENB + 1, (ultraenb >> 8) & 0xff);
1532 configure_termination(struct ahc_softc *ahc,
1533 struct seeprom_descriptor *sd,
1534 u_int adapter_control,
1542 * Update the settings in sxfrctl1 to match the
1543 * termination settings
1548 * SEECS must be on for the GALS to latch
1549 * the data properly. Be sure to leave MS
1550 * on or we will release the seeprom.
1552 SEEPROM_OUTB(sd, sd->sd_MS | sd->sd_CS);
1553 if ((adapter_control & CFAUTOTERM) != 0
1554 || (ahc->features & AHC_NEW_TERMCTL) != 0) {
1555 int internal50_present;
1556 int internal68_present;
1557 int externalcable_present;
1569 if ((ahc->features & AHC_NEW_TERMCTL) != 0) {
1570 ahc_new_term_detect(ahc, &enableSEC_low,
1575 if ((adapter_control & CFSEAUTOTERM) == 0) {
1577 printf("%s: Manual SE Termination\n",
1579 enableSEC_low = (adapter_control & CFSELOWTERM);
1581 (adapter_control & CFSEHIGHTERM);
1583 if ((adapter_control & CFAUTOTERM) == 0) {
1585 printf("%s: Manual LVD Termination\n",
1587 enablePRI_low = (adapter_control & CFSTERM);
1588 enablePRI_high = (adapter_control & CFWSTERM);
1590 /* Make the table calculations below happy */
1591 internal50_present = 0;
1592 internal68_present = 1;
1593 externalcable_present = 1;
1594 } else if ((ahc->features & AHC_SPIOCAP) != 0) {
1595 aic785X_cable_detect(ahc, &internal50_present,
1596 &externalcable_present,
1598 /* Can never support a wide connector. */
1599 internal68_present = 0;
1601 aic787X_cable_detect(ahc, &internal50_present,
1602 &internal68_present,
1603 &externalcable_present,
1607 if ((ahc->features & AHC_WIDE) == 0)
1608 internal68_present = 0;
1611 && (ahc->features & AHC_ULTRA2) == 0) {
1612 printf("%s: internal 50 cable %s present",
1614 internal50_present ? "is":"not");
1616 if ((ahc->features & AHC_WIDE) != 0)
1617 printf(", internal 68 cable %s present",
1618 internal68_present ? "is":"not");
1619 printf("\n%s: external cable %s present\n",
1621 externalcable_present ? "is":"not");
1624 printf("%s: BIOS eeprom %s present\n",
1625 ahc_name(ahc), eeprom_present ? "is" : "not");
1627 if ((ahc->flags & AHC_INT50_SPEEDFLEX) != 0) {
1629 * The 50 pin connector is a separate bus,
1630 * so force it to always be terminated.
1631 * In the future, perform current sensing
1632 * to determine if we are in the middle of
1633 * a properly terminated bus.
1635 internal50_present = 0;
1639 * Now set the termination based on what
1641 * Flash Enable = BRDDAT7
1642 * Secondary High Term Enable = BRDDAT6
1643 * Secondary Low Term Enable = BRDDAT5 (7890)
1644 * Primary High Term Enable = BRDDAT4 (7890)
1646 if ((ahc->features & AHC_ULTRA2) == 0
1647 && (internal50_present != 0)
1648 && (internal68_present != 0)
1649 && (externalcable_present != 0)) {
1650 printf("%s: Illegal cable configuration!!. "
1651 "Only two connectors on the "
1652 "adapter may be used at a "
1653 "time!\n", ahc_name(ahc));
1656 * Pretend there are no cables in the hope
1657 * that having all of the termination on
1658 * gives us a more stable bus.
1660 internal50_present = 0;
1661 internal68_present = 0;
1662 externalcable_present = 0;
1665 if ((ahc->features & AHC_WIDE) != 0
1666 && ((externalcable_present == 0)
1667 || (internal68_present == 0)
1668 || (enableSEC_high != 0))) {
1671 if ((ahc->flags & AHC_INT50_SPEEDFLEX) != 0)
1672 printf("%s: 68 pin termination "
1673 "Enabled\n", ahc_name(ahc));
1675 printf("%s: %sHigh byte termination "
1676 "Enabled\n", ahc_name(ahc),
1677 enableSEC_high ? "Secondary "
1682 sum = internal50_present + internal68_present
1683 + externalcable_present;
1684 if (sum < 2 || (enableSEC_low != 0)) {
1685 if ((ahc->features & AHC_ULTRA2) != 0)
1688 *sxfrctl1 |= STPWEN;
1690 if ((ahc->flags & AHC_INT50_SPEEDFLEX) != 0)
1691 printf("%s: 50 pin termination "
1692 "Enabled\n", ahc_name(ahc));
1694 printf("%s: %sLow byte termination "
1695 "Enabled\n", ahc_name(ahc),
1696 enableSEC_low ? "Secondary "
1701 if (enablePRI_low != 0) {
1702 *sxfrctl1 |= STPWEN;
1704 printf("%s: Primary Low Byte termination "
1705 "Enabled\n", ahc_name(ahc));
1709 * Setup STPWEN before setting up the rest of
1710 * the termination per the tech note on the U160 cards.
1712 ahc_outb(ahc, SXFRCTL1, *sxfrctl1);
1714 if (enablePRI_high != 0) {
1717 printf("%s: Primary High Byte "
1718 "termination Enabled\n",
1722 write_brdctl(ahc, brddat);
1725 if ((adapter_control & CFSTERM) != 0) {
1726 *sxfrctl1 |= STPWEN;
1729 printf("%s: %sLow byte termination Enabled\n",
1731 (ahc->features & AHC_ULTRA2) ? "Primary "
1735 if ((adapter_control & CFWSTERM) != 0
1736 && (ahc->features & AHC_WIDE) != 0) {
1739 printf("%s: %sHigh byte termination Enabled\n",
1741 (ahc->features & AHC_ULTRA2)
1742 ? "Secondary " : "");
1746 * Setup STPWEN before setting up the rest of
1747 * the termination per the tech note on the U160 cards.
1749 ahc_outb(ahc, SXFRCTL1, *sxfrctl1);
1751 if ((ahc->features & AHC_WIDE) != 0)
1752 write_brdctl(ahc, brddat);
1754 SEEPROM_OUTB(sd, sd->sd_MS); /* Clear CS */
1758 ahc_new_term_detect(struct ahc_softc *ahc, int *enableSEC_low,
1759 int *enableSEC_high, int *enablePRI_low,
1760 int *enablePRI_high, int *eeprom_present)
1766 * BRDDAT6 = Enable Secondary High Byte termination
1767 * BRDDAT5 = Enable Secondary Low Byte termination
1768 * BRDDAT4 = Enable Primary high byte termination
1769 * BRDDAT3 = Enable Primary low byte termination
1771 brdctl = read_brdctl(ahc);
1772 *eeprom_present = brdctl & BRDDAT7;
1773 *enableSEC_high = (brdctl & BRDDAT6);
1774 *enableSEC_low = (brdctl & BRDDAT5);
1775 *enablePRI_high = (brdctl & BRDDAT4);
1776 *enablePRI_low = (brdctl & BRDDAT3);
1780 aic787X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
1781 int *internal68_present, int *externalcable_present,
1782 int *eeprom_present)
1787 * First read the status of our cables.
1788 * Set the rom bank to 0 since the
1789 * bank setting serves as a multiplexor
1790 * for the cable detection logic.
1791 * BRDDAT5 controls the bank switch.
1793 write_brdctl(ahc, 0);
1796 * Now read the state of the internal
1797 * connectors. BRDDAT6 is INT50 and
1800 brdctl = read_brdctl(ahc);
1801 *internal50_present = (brdctl & BRDDAT6) ? 0 : 1;
1802 *internal68_present = (brdctl & BRDDAT7) ? 0 : 1;
1805 * Set the rom bank to 1 and determine
1806 * the other signals.
1808 write_brdctl(ahc, BRDDAT5);
1811 * Now read the state of the external
1812 * connectors. BRDDAT6 is EXT68 and
1813 * BRDDAT7 is EPROMPS.
1815 brdctl = read_brdctl(ahc);
1816 *externalcable_present = (brdctl & BRDDAT6) ? 0 : 1;
1817 *eeprom_present = (brdctl & BRDDAT7) ? 1 : 0;
1821 aic785X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
1822 int *externalcable_present, int *eeprom_present)
1827 spiocap = ahc_inb(ahc, SPIOCAP);
1828 spiocap &= ~SOFTCMDEN;
1829 spiocap |= EXT_BRDCTL;
1830 ahc_outb(ahc, SPIOCAP, spiocap);
1831 ahc_outb(ahc, BRDCTL, BRDRW|BRDCS);
1832 ahc_flush_device_writes(ahc);
1834 ahc_outb(ahc, BRDCTL, 0);
1835 ahc_flush_device_writes(ahc);
1837 brdctl = ahc_inb(ahc, BRDCTL);
1838 *internal50_present = (brdctl & BRDDAT5) ? 0 : 1;
1839 *externalcable_present = (brdctl & BRDDAT6) ? 0 : 1;
1840 *eeprom_present = (ahc_inb(ahc, SPIOCAP) & EEPROM) ? 1 : 0;
1844 ahc_acquire_seeprom(struct ahc_softc *ahc, struct seeprom_descriptor *sd)
1848 if ((ahc->features & AHC_SPIOCAP) != 0
1849 && (ahc_inb(ahc, SPIOCAP) & SEEPROM) == 0)
1853 * Request access of the memory port. When access is
1854 * granted, SEERDY will go high. We use a 1 second
1855 * timeout which should be near 1 second more than
1856 * is needed. Reason: after the chip reset, there
1857 * should be no contention.
1859 SEEPROM_OUTB(sd, sd->sd_MS);
1860 wait = 1000; /* 1 second timeout in msec */
1861 while (--wait && ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0)) {
1862 ahc_delay(1000); /* delay 1 msec */
1864 if ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0) {
1865 SEEPROM_OUTB(sd, 0);
1872 ahc_release_seeprom(struct seeprom_descriptor *sd)
1874 /* Release access to the memory port and the serial EEPROM. */
1875 SEEPROM_OUTB(sd, 0);
1879 write_brdctl(struct ahc_softc *ahc, uint8_t value)
1883 if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7895) {
1885 if (ahc->channel == 'B')
1887 } else if ((ahc->features & AHC_ULTRA2) != 0) {
1890 brdctl = BRDSTB|BRDCS;
1892 ahc_outb(ahc, BRDCTL, brdctl);
1893 ahc_flush_device_writes(ahc);
1895 ahc_outb(ahc, BRDCTL, brdctl);
1896 ahc_flush_device_writes(ahc);
1897 if ((ahc->features & AHC_ULTRA2) != 0)
1898 brdctl |= BRDSTB_ULTRA2;
1901 ahc_outb(ahc, BRDCTL, brdctl);
1902 ahc_flush_device_writes(ahc);
1903 if ((ahc->features & AHC_ULTRA2) != 0)
1907 ahc_outb(ahc, BRDCTL, brdctl);
1911 read_brdctl(struct ahc_softc *ahc)
1916 if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7895) {
1918 if (ahc->channel == 'B')
1920 } else if ((ahc->features & AHC_ULTRA2) != 0) {
1921 brdctl = BRDRW_ULTRA2;
1923 brdctl = BRDRW|BRDCS;
1925 ahc_outb(ahc, BRDCTL, brdctl);
1926 ahc_flush_device_writes(ahc);
1927 value = ahc_inb(ahc, BRDCTL);
1928 ahc_outb(ahc, BRDCTL, 0);
1933 ahc_pci_intr(struct ahc_softc *ahc)
1938 error = ahc_inb(ahc, ERROR);
1939 if ((error & PCIERRSTAT) == 0)
1942 status1 = ahc_pci_read_config(ahc->dev_softc,
1943 PCIR_STATUS + 1, /*bytes*/1);
1945 printf("%s: PCI error Interrupt at seqaddr = 0x%x\n",
1947 ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8));
1949 if (status1 & DPE) {
1950 ahc->pci_target_perr_count++;
1951 printf("%s: Data Parity Error Detected during address "
1952 "or write data phase\n", ahc_name(ahc));
1954 if (status1 & SSE) {
1955 printf("%s: Signal System Error Detected\n", ahc_name(ahc));
1957 if (status1 & RMA) {
1958 printf("%s: Received a Master Abort\n", ahc_name(ahc));
1960 if (status1 & RTA) {
1961 printf("%s: Received a Target Abort\n", ahc_name(ahc));
1963 if (status1 & STA) {
1964 printf("%s: Signaled a Target Abort\n", ahc_name(ahc));
1966 if (status1 & DPR) {
1967 printf("%s: Data Parity Error has been reported via PERR#\n",
1971 /* Clear latched errors. */
1972 ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
1973 status1, /*bytes*/1);
1975 if ((status1 & (DPE|SSE|RMA|RTA|STA|DPR)) == 0) {
1976 printf("%s: Latched PCIERR interrupt with "
1977 "no status bits set\n", ahc_name(ahc));
1979 ahc_outb(ahc, CLRINT, CLRPARERR);
1982 if (ahc->pci_target_perr_count > AHC_PCI_TARGET_PERR_THRESH) {
1984 "%s: WARNING WARNING WARNING WARNING\n"
1985 "%s: Too many PCI parity errors observed as a target.\n"
1986 "%s: Some device on this bus is generating bad parity.\n"
1987 "%s: This is an error *observed by*, not *generated by*, this controller.\n"
1988 "%s: PCI parity error checking has been disabled.\n"
1989 "%s: WARNING WARNING WARNING WARNING\n",
1990 ahc_name(ahc), ahc_name(ahc), ahc_name(ahc),
1991 ahc_name(ahc), ahc_name(ahc), ahc_name(ahc));
1992 ahc->seqctl |= FAILDIS;
1993 ahc_outb(ahc, SEQCTL, ahc->seqctl);
1999 ahc_pci_chip_init(struct ahc_softc *ahc)
2001 ahc_outb(ahc, DSCOMMAND0, ahc->bus_softc.pci_softc.dscommand0);
2002 ahc_outb(ahc, DSPCISTATUS, ahc->bus_softc.pci_softc.dspcistatus);
2003 if ((ahc->features & AHC_DT) != 0) {
2006 sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
2007 ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
2008 ahc_outb(ahc, OPTIONMODE, ahc->bus_softc.pci_softc.optionmode);
2009 ahc_outw(ahc, TARGCRCCNT, ahc->bus_softc.pci_softc.targcrccnt);
2010 ahc_outb(ahc, SFUNCT, sfunct);
2011 ahc_outb(ahc, CRCCONTROL1,
2012 ahc->bus_softc.pci_softc.crccontrol1);
2014 if ((ahc->features & AHC_MULTI_FUNC) != 0)
2015 ahc_outb(ahc, SCBBADDR, ahc->bus_softc.pci_softc.scbbaddr);
2017 if ((ahc->features & AHC_ULTRA2) != 0)
2018 ahc_outb(ahc, DFF_THRSH, ahc->bus_softc.pci_softc.dff_thrsh);
2020 return (ahc_chip_init(ahc));
2025 ahc_pci_resume(struct ahc_softc *ahc)
2028 * We assume that the OS has restored our register
2029 * mappings, etc. Just update the config space registers
2030 * that the OS doesn't know about and rely on our chip
2031 * reset handler to handle the rest.
2033 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG,
2034 ahc->bus_softc.pci_softc.devconfig, /*bytes*/4);
2035 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
2036 ahc->bus_softc.pci_softc.command, /*bytes*/1);
2037 ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
2038 ahc->bus_softc.pci_softc.csize_lattime, /*bytes*/1);
2039 if ((ahc->flags & AHC_HAS_TERM_LOGIC) != 0) {
2040 struct seeprom_descriptor sd;
2044 sd.sd_control_offset = SEECTL;
2045 sd.sd_status_offset = SEECTL;
2046 sd.sd_dataout_offset = SEECTL;
2048 ahc_acquire_seeprom(ahc, &sd);
2049 configure_termination(ahc, &sd,
2050 ahc->seep_config->adapter_control,
2052 ahc_release_seeprom(&sd);
2058 ahc_aic785X_setup(struct ahc_softc *ahc)
2060 ahc_dev_softc_t pci;
2063 pci = ahc->dev_softc;
2065 ahc->chip = AHC_AIC7850;
2066 ahc->features = AHC_AIC7850_FE;
2067 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2068 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2070 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
2071 ahc->instruction_ram_size = 512;
2076 ahc_aic7860_setup(struct ahc_softc *ahc)
2078 ahc_dev_softc_t pci;
2081 pci = ahc->dev_softc;
2083 ahc->chip = AHC_AIC7860;
2084 ahc->features = AHC_AIC7860_FE;
2085 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2086 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2088 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
2089 ahc->instruction_ram_size = 512;
2094 ahc_apa1480_setup(struct ahc_softc *ahc)
2098 error = ahc_aic7860_setup(ahc);
2101 ahc->features |= AHC_REMOVABLE;
2106 ahc_aic7870_setup(struct ahc_softc *ahc)
2110 ahc->chip = AHC_AIC7870;
2111 ahc->features = AHC_AIC7870_FE;
2112 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2113 ahc->instruction_ram_size = 512;
2118 ahc_aic7870h_setup(struct ahc_softc *ahc)
2120 int error = ahc_aic7870_setup(ahc);
2122 ahc->features |= AHC_HVD;
2128 ahc_aha394X_setup(struct ahc_softc *ahc)
2132 error = ahc_aic7870_setup(ahc);
2134 error = ahc_aha394XX_setup(ahc);
2139 ahc_aha394Xh_setup(struct ahc_softc *ahc)
2141 int error = ahc_aha394X_setup(ahc);
2143 ahc->features |= AHC_HVD;
2149 ahc_aha398X_setup(struct ahc_softc *ahc)
2153 error = ahc_aic7870_setup(ahc);
2155 error = ahc_aha398XX_setup(ahc);
2160 ahc_aha494X_setup(struct ahc_softc *ahc)
2164 error = ahc_aic7870_setup(ahc);
2166 error = ahc_aha494XX_setup(ahc);
2171 ahc_aha494Xh_setup(struct ahc_softc *ahc)
2173 int error = ahc_aha494X_setup(ahc);
2175 ahc->features |= AHC_HVD;
2181 ahc_aic7880_setup(struct ahc_softc *ahc)
2183 ahc_dev_softc_t pci;
2186 pci = ahc->dev_softc;
2188 ahc->chip = AHC_AIC7880;
2189 ahc->features = AHC_AIC7880_FE;
2190 ahc->bugs |= AHC_TMODE_WIDEODD_BUG;
2191 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2193 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
2195 ahc->bugs |= AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2197 ahc->instruction_ram_size = 512;
2202 ahc_aic7880h_setup(struct ahc_softc *ahc)
2204 int error = ahc_aic7880_setup(ahc);
2206 ahc->features |= AHC_HVD;
2213 ahc_aha2940Pro_setup(struct ahc_softc *ahc)
2216 ahc->flags |= AHC_INT50_SPEEDFLEX;
2217 return (ahc_aic7880_setup(ahc));
2221 ahc_aha394XU_setup(struct ahc_softc *ahc)
2225 error = ahc_aic7880_setup(ahc);
2227 error = ahc_aha394XX_setup(ahc);
2232 ahc_aha394XUh_setup(struct ahc_softc *ahc)
2234 int error = ahc_aha394XU_setup(ahc);
2236 ahc->features |= AHC_HVD;
2242 ahc_aha398XU_setup(struct ahc_softc *ahc)
2246 error = ahc_aic7880_setup(ahc);
2248 error = ahc_aha398XX_setup(ahc);
2253 ahc_aic7890_setup(struct ahc_softc *ahc)
2255 ahc_dev_softc_t pci;
2258 pci = ahc->dev_softc;
2260 ahc->chip = AHC_AIC7890;
2261 ahc->features = AHC_AIC7890_FE;
2262 ahc->flags |= AHC_NEWEEPROM_FMT;
2263 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2265 ahc->bugs |= AHC_AUTOFLUSH_BUG|AHC_CACHETHEN_BUG;
2266 ahc->instruction_ram_size = 768;
2271 ahc_aic7892_setup(struct ahc_softc *ahc)
2275 ahc->chip = AHC_AIC7892;
2276 ahc->features = AHC_AIC7892_FE;
2277 ahc->flags |= AHC_NEWEEPROM_FMT;
2278 ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
2279 ahc->instruction_ram_size = 1024;
2284 ahc_aic7895_setup(struct ahc_softc *ahc)
2286 ahc_dev_softc_t pci;
2289 pci = ahc->dev_softc;
2290 ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
2292 * The 'C' revision of the aic7895 has a few additional features.
2294 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2296 ahc->chip = AHC_AIC7895C;
2297 ahc->features = AHC_AIC7895C_FE;
2301 ahc->chip = AHC_AIC7895;
2302 ahc->features = AHC_AIC7895_FE;
2305 * The BIOS disables the use of MWI transactions
2306 * since it does not have the MWI bug work around
2307 * we have. Disabling MWI reduces performance, so
2310 command = ahc_pci_read_config(pci, PCIR_COMMAND, /*bytes*/1);
2311 command |= PCIM_CMD_MWRICEN;
2312 ahc_pci_write_config(pci, PCIR_COMMAND, command, /*bytes*/1);
2313 ahc->bugs |= AHC_PCI_MWI_BUG;
2316 * XXX Does CACHETHEN really not work??? What about PCI retry?
2317 * on C level chips. Need to test, but for now, play it safe.
2319 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_PCI_2_1_RETRY_BUG
2320 | AHC_CACHETHEN_BUG;
2326 * Cachesize must also be zero due to stray DAC
2327 * problem when sitting behind some bridges.
2329 ahc_pci_write_config(pci, CSIZE_LATTIME, 0, /*bytes*/1);
2330 devconfig = ahc_pci_read_config(pci, DEVCONFIG, /*bytes*/1);
2331 devconfig |= MRDCEN;
2332 ahc_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
2334 ahc->flags |= AHC_NEWEEPROM_FMT;
2335 ahc->instruction_ram_size = 512;
2340 ahc_aic7895h_setup(struct ahc_softc *ahc)
2342 int error = ahc_aic7895_setup(ahc);
2344 ahc->features |= AHC_HVD;
2350 ahc_aic7896_setup(struct ahc_softc *ahc)
2352 ahc_dev_softc_t pci;
2354 pci = ahc->dev_softc;
2355 ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
2356 ahc->chip = AHC_AIC7896;
2357 ahc->features = AHC_AIC7896_FE;
2358 ahc->flags |= AHC_NEWEEPROM_FMT;
2359 ahc->bugs |= AHC_CACHETHEN_DIS_BUG;
2360 ahc->instruction_ram_size = 768;
2365 ahc_aic7899_setup(struct ahc_softc *ahc)
2367 ahc_dev_softc_t pci;
2369 pci = ahc->dev_softc;
2370 ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
2371 ahc->chip = AHC_AIC7899;
2372 ahc->features = AHC_AIC7899_FE;
2373 ahc->flags |= AHC_NEWEEPROM_FMT;
2374 ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
2375 ahc->instruction_ram_size = 1024;
2380 ahc_aha29160C_setup(struct ahc_softc *ahc)
2384 error = ahc_aic7899_setup(ahc);
2387 ahc->features |= AHC_REMOVABLE;
2392 ahc_raid_setup(struct ahc_softc *ahc)
2394 printf("RAID functionality unsupported\n");
2399 ahc_aha394XX_setup(struct ahc_softc *ahc)
2401 ahc_dev_softc_t pci;
2403 pci = ahc->dev_softc;
2404 switch (ahc_get_pci_slot(pci)) {
2405 case AHC_394X_SLOT_CHANNEL_A:
2408 case AHC_394X_SLOT_CHANNEL_B:
2412 printf("adapter at unexpected slot %d\n"
2413 "unable to map to a channel\n",
2414 ahc_get_pci_slot(pci));
2421 ahc_aha398XX_setup(struct ahc_softc *ahc)
2423 ahc_dev_softc_t pci;
2425 pci = ahc->dev_softc;
2426 switch (ahc_get_pci_slot(pci)) {
2427 case AHC_398X_SLOT_CHANNEL_A:
2430 case AHC_398X_SLOT_CHANNEL_B:
2433 case AHC_398X_SLOT_CHANNEL_C:
2437 printf("adapter at unexpected slot %d\n"
2438 "unable to map to a channel\n",
2439 ahc_get_pci_slot(pci));
2443 ahc->flags |= AHC_LARGE_SEEPROM;
2448 ahc_aha494XX_setup(struct ahc_softc *ahc)
2450 ahc_dev_softc_t pci;
2452 pci = ahc->dev_softc;
2453 switch (ahc_get_pci_slot(pci)) {
2454 case AHC_494X_SLOT_CHANNEL_A:
2457 case AHC_494X_SLOT_CHANNEL_B:
2460 case AHC_494X_SLOT_CHANNEL_C:
2463 case AHC_494X_SLOT_CHANNEL_D:
2467 printf("adapter at unexpected slot %d\n"
2468 "unable to map to a channel\n",
2469 ahc_get_pci_slot(pci));
2472 ahc->flags |= AHC_LARGE_SEEPROM;