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 const struct ahc_pci_identity ahc_pci_ident_table[] = {
172 /* aic7850 based controllers */
174 ID_AHA_2902_04_10_15_20C_30C,
176 "Adaptec 2902/04/10/15/20C/30C SCSI adapter",
179 /* aic7860 based controllers */
183 "Adaptec 2930CU SCSI adapter",
187 ID_AHA_1480A & ID_DEV_VENDOR_MASK,
189 "Adaptec 1480A Ultra SCSI adapter",
193 ID_AHA_2940AU_0 & ID_DEV_VENDOR_MASK,
195 "Adaptec 2940A Ultra SCSI adapter",
199 ID_AHA_2940AU_CN & ID_DEV_VENDOR_MASK,
201 "Adaptec 2940A/CN Ultra SCSI adapter",
205 ID_AHA_2930C_VAR & ID_DEV_VENDOR_MASK,
207 "Adaptec 2930C Ultra SCSI adapter (VAR)",
210 /* aic7870 based controllers */
214 "Adaptec 2940 SCSI adapter",
220 "Adaptec 3940 SCSI adapter",
226 "Adaptec 398X SCSI RAID adapter",
232 "Adaptec 2944 SCSI adapter",
238 "Adaptec 3944 SCSI adapter",
244 "Adaptec 4944 SCSI adapter",
247 /* aic7880 based controllers */
249 ID_AHA_2940U & ID_DEV_VENDOR_MASK,
251 "Adaptec 2940 Ultra SCSI adapter",
255 ID_AHA_3940U & ID_DEV_VENDOR_MASK,
257 "Adaptec 3940 Ultra SCSI adapter",
261 ID_AHA_2944U & ID_DEV_VENDOR_MASK,
263 "Adaptec 2944 Ultra SCSI adapter",
267 ID_AHA_3944U & ID_DEV_VENDOR_MASK,
269 "Adaptec 3944 Ultra SCSI adapter",
273 ID_AHA_398XU & ID_DEV_VENDOR_MASK,
275 "Adaptec 398X Ultra SCSI RAID adapter",
280 * XXX Don't know the slot numbers
281 * so we can't identify channels
283 ID_AHA_4944U & ID_DEV_VENDOR_MASK,
285 "Adaptec 4944 Ultra SCSI adapter",
289 ID_AHA_2930U & ID_DEV_VENDOR_MASK,
291 "Adaptec 2930 Ultra SCSI adapter",
295 ID_AHA_2940U_PRO & ID_DEV_VENDOR_MASK,
297 "Adaptec 2940 Pro Ultra SCSI adapter",
301 ID_AHA_2940U_CN & ID_DEV_VENDOR_MASK,
303 "Adaptec 2940/CN Ultra SCSI adapter",
306 /* Ignore all SISL (AAC on MB) based controllers. */
313 /* aic7890 based controllers */
317 "Adaptec 2930 Ultra2 SCSI adapter",
323 "Adaptec 2940B Ultra2 SCSI adapter",
329 "Adaptec 2940 Ultra2 SCSI adapter (OEM)",
335 "Adaptec 2940 Ultra2 SCSI adapter",
341 "Adaptec 2950 Ultra2 SCSI adapter",
347 "Adaptec aic7890/91 Ultra2 SCSI adapter (ARO)",
353 "Adaptec AAA-131 Ultra2 RAID adapter",
356 /* aic7892 based controllers */
360 "Adaptec 29160 Ultra160 SCSI adapter",
366 "Adaptec (Compaq OEM) 29160 Ultra160 SCSI adapter",
372 "Adaptec 29160N Ultra160 SCSI adapter",
378 "Adaptec 29160C Ultra160 SCSI adapter",
384 "Adaptec 29160B Ultra160 SCSI adapter",
390 "Adaptec 19160B Ultra160 SCSI adapter",
396 "Adaptec aic7892 Ultra160 SCSI adapter (ARO)",
402 "Adaptec 2915/30LP Ultra160 SCSI adapter",
405 /* aic7895 based controllers */
409 "Adaptec 2940/DUAL Ultra SCSI adapter",
415 "Adaptec 3940A Ultra SCSI adapter",
421 "Adaptec 3944A Ultra SCSI adapter",
427 "Adaptec aic7895 Ultra SCSI adapter (ARO)",
430 /* aic7896/97 based controllers */
434 "Adaptec 3950B Ultra2 SCSI adapter",
440 "Adaptec 3950B Ultra2 SCSI adapter",
446 "Adaptec 3950D Ultra2 SCSI adapter",
452 "Adaptec 3950D Ultra2 SCSI adapter",
458 "Adaptec aic7896/97 Ultra2 SCSI adapter (ARO)",
461 /* aic7899 based controllers */
465 "Adaptec 3960D Ultra160 SCSI adapter",
471 "Adaptec (Compaq OEM) 3960D Ultra160 SCSI adapter",
477 "Adaptec aic7899 Ultra160 SCSI adapter (ARO)",
480 /* Generic chip probes for devices we don't know 'exactly' */
482 ID_AIC7850 & ID_DEV_VENDOR_MASK,
484 "Adaptec aic7850 SCSI adapter",
488 ID_AIC7855 & ID_DEV_VENDOR_MASK,
490 "Adaptec aic7855 SCSI adapter",
494 ID_AIC7859 & ID_DEV_VENDOR_MASK,
496 "Adaptec aic7859 SCSI adapter",
500 ID_AIC7860 & ID_DEV_VENDOR_MASK,
502 "Adaptec aic7860 Ultra SCSI adapter",
506 ID_AIC7870 & ID_DEV_VENDOR_MASK,
508 "Adaptec aic7870 SCSI adapter",
512 ID_AIC7880 & ID_DEV_VENDOR_MASK,
514 "Adaptec aic7880 Ultra SCSI adapter",
518 ID_AIC7890 & ID_9005_GENERIC_MASK,
519 ID_9005_GENERIC_MASK,
520 "Adaptec aic7890/91 Ultra2 SCSI adapter",
524 ID_AIC7892 & ID_9005_GENERIC_MASK,
525 ID_9005_GENERIC_MASK,
526 "Adaptec aic7892 Ultra160 SCSI adapter",
530 ID_AIC7895 & ID_DEV_VENDOR_MASK,
532 "Adaptec aic7895 Ultra SCSI adapter",
536 ID_AIC7896 & ID_9005_GENERIC_MASK,
537 ID_9005_GENERIC_MASK,
538 "Adaptec aic7896/97 Ultra2 SCSI adapter",
542 ID_AIC7899 & ID_9005_GENERIC_MASK,
543 ID_9005_GENERIC_MASK,
544 "Adaptec aic7899 Ultra160 SCSI adapter",
548 ID_AIC7810 & ID_DEV_VENDOR_MASK,
550 "Adaptec aic7810 RAID memory controller",
554 ID_AIC7815 & ID_DEV_VENDOR_MASK,
556 "Adaptec aic7815 RAID memory controller",
561 static const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table);
563 #define AHC_394X_SLOT_CHANNEL_A 4
564 #define AHC_394X_SLOT_CHANNEL_B 5
566 #define AHC_398X_SLOT_CHANNEL_A 4
567 #define AHC_398X_SLOT_CHANNEL_B 8
568 #define AHC_398X_SLOT_CHANNEL_C 12
570 #define AHC_494X_SLOT_CHANNEL_A 4
571 #define AHC_494X_SLOT_CHANNEL_B 5
572 #define AHC_494X_SLOT_CHANNEL_C 6
573 #define AHC_494X_SLOT_CHANNEL_D 7
575 #define DEVCONFIG 0x40
576 #define PCIERRGENDIS 0x80000000ul
577 #define SCBSIZE32 0x00010000ul /* aic789X only */
578 #define REXTVALID 0x00001000ul /* ultra cards only */
579 #define MPORTMODE 0x00000400ul /* aic7870+ only */
580 #define RAMPSM 0x00000200ul /* aic7870+ only */
581 #define VOLSENSE 0x00000100ul
582 #define PCI64BIT 0x00000080ul /* 64Bit PCI bus (Ultra2 Only)*/
583 #define SCBRAMSEL 0x00000080ul
584 #define MRDCEN 0x00000040ul
585 #define EXTSCBTIME 0x00000020ul /* aic7870 only */
586 #define EXTSCBPEN 0x00000010ul /* aic7870 only */
587 #define BERREN 0x00000008ul
588 #define DACEN 0x00000004ul
589 #define STPWLEVEL 0x00000002ul
590 #define DIFACTNEGEN 0x00000001ul /* aic7870 only */
592 #define CSIZE_LATTIME 0x0c
593 #define CACHESIZE 0x0000003ful /* only 5 bits */
594 #define LATTIME 0x0000ff00ul
596 /* PCI STATUS definitions */
604 static int ahc_9005_subdevinfo_valid(uint16_t vendor, uint16_t device,
605 uint16_t subvendor, uint16_t subdevice);
606 static int ahc_ext_scbram_present(struct ahc_softc *ahc);
607 static void ahc_scbram_config(struct ahc_softc *ahc, int enable,
608 int pcheck, int fast, int large);
609 static void ahc_probe_ext_scbram(struct ahc_softc *ahc);
610 static void check_extport(struct ahc_softc *ahc, u_int *sxfrctl1);
611 static void ahc_parse_pci_eeprom(struct ahc_softc *ahc,
612 struct seeprom_config *sc);
613 static void configure_termination(struct ahc_softc *ahc,
614 struct seeprom_descriptor *sd,
615 u_int adapter_control,
618 static void ahc_new_term_detect(struct ahc_softc *ahc,
623 int *eeprom_present);
624 static void aic787X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
625 int *internal68_present,
626 int *externalcable_present,
627 int *eeprom_present);
628 static void aic785X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
629 int *externalcable_present,
630 int *eeprom_present);
631 static void write_brdctl(struct ahc_softc *ahc, uint8_t value);
632 static uint8_t read_brdctl(struct ahc_softc *ahc);
633 static void ahc_pci_intr(struct ahc_softc *ahc);
634 static int ahc_pci_chip_init(struct ahc_softc *ahc);
637 ahc_9005_subdevinfo_valid(uint16_t device, uint16_t vendor,
638 uint16_t subdevice, uint16_t subvendor)
642 /* Default to invalid. */
645 && subvendor == 0x9005
646 && subdevice != device
647 && SUBID_9005_TYPE_KNOWN(subdevice) != 0) {
649 switch (SUBID_9005_TYPE(subdevice)) {
650 case SUBID_9005_TYPE_MB:
652 case SUBID_9005_TYPE_CARD:
653 case SUBID_9005_TYPE_LCCARD:
655 * Currently only trust Adaptec cards to
656 * get the sub device info correct.
658 if (DEVID_9005_TYPE(device) == DEVID_9005_TYPE_HBA)
661 case SUBID_9005_TYPE_RAID:
670 const struct ahc_pci_identity *
671 ahc_find_pci_device(ahc_dev_softc_t pci)
678 const struct ahc_pci_identity *entry;
681 vendor = ahc_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
682 device = ahc_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
683 subvendor = ahc_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
684 subdevice = ahc_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
685 full_id = ahc_compose_id(device, vendor, subdevice, subvendor);
688 * If the second function is not hooked up, ignore it.
689 * Unfortunately, not all MB vendors implement the
690 * subdevice ID as per the Adaptec spec, so do our best
691 * to sanity check it prior to accepting the subdevice
694 if (ahc_get_pci_function(pci) > 0
695 && ahc_9005_subdevinfo_valid(vendor, device, subvendor, subdevice)
696 && SUBID_9005_MFUNCENB(subdevice) == 0)
699 for (i = 0; i < ahc_num_pci_devs; i++) {
700 entry = &ahc_pci_ident_table[i];
701 if (entry->full_id == (full_id & entry->id_mask)) {
702 /* Honor exclusion entries. */
703 if (entry->name == NULL)
712 ahc_pci_config(struct ahc_softc *ahc, const struct ahc_pci_identity *entry)
724 error = entry->setup(ahc);
727 ahc->chip |= AHC_PCI;
728 ahc->description = entry->name;
730 pci_set_power_state(ahc->dev_softc, AHC_POWER_STATE_D0);
732 error = ahc_pci_map_registers(ahc);
737 * Before we continue probing the card, ensure that
738 * its interrupts are *disabled*. We don't want
739 * a misstep to hang the machine in an interrupt
742 ahc_intr_enable(ahc, FALSE);
744 devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
747 * If we need to support high memory, enable dual
748 * address cycles. This bit must be set to enable
749 * high address bit generation even if we are on a
750 * 64bit bus (PCI64BIT set in devconfig).
752 if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
755 printf("%s: Enabling 39Bit Addressing\n",
760 /* Ensure that pci error generation, a test feature, is disabled. */
761 devconfig |= PCIERRGENDIS;
763 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
765 /* Ensure busmastering is enabled */
766 command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
767 command |= PCIM_CMD_BUSMASTEREN;
769 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
771 /* On all PCI adapters, we allow SCB paging */
772 ahc->flags |= AHC_PAGESCBS;
774 error = ahc_softc_init(ahc);
779 * Disable PCI parity error checking. Users typically
780 * do this to work around broken PCI chipsets that get
781 * the parity timing wrong and thus generate lots of spurious
782 * errors. The chip only allows us to disable *all* parity
783 * error reporting when doing this, so CIO bus, scb ram, and
784 * scratch ram parity errors will be ignored too.
786 if ((ahc->flags & AHC_DISABLE_PCI_PERR) != 0)
787 ahc->seqctl |= FAILDIS;
789 ahc->bus_intr = ahc_pci_intr;
790 ahc->bus_chip_init = ahc_pci_chip_init;
792 /* Remeber how the card was setup in case there is no SEEPROM */
793 if ((ahc_inb(ahc, HCNTRL) & POWRDN) == 0) {
795 if ((ahc->features & AHC_ULTRA2) != 0)
796 our_id = ahc_inb(ahc, SCSIID_ULTRA2) & OID;
798 our_id = ahc_inb(ahc, SCSIID) & OID;
799 sxfrctl1 = ahc_inb(ahc, SXFRCTL1) & STPWEN;
800 scsiseq = ahc_inb(ahc, SCSISEQ);
807 error = ahc_reset(ahc, /*reinit*/FALSE);
811 if ((ahc->features & AHC_DT) != 0) {
814 /* Perform ALT-Mode Setup */
815 sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
816 ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
817 ahc_outb(ahc, OPTIONMODE,
818 OPTIONMODE_DEFAULTS|AUTOACKEN|BUSFREEREV|EXPPHASEDIS);
819 ahc_outb(ahc, SFUNCT, sfunct);
821 /* Normal mode setup */
822 ahc_outb(ahc, CRCCONTROL1, CRCVALCHKEN|CRCENDCHKEN|CRCREQCHKEN
826 dscommand0 = ahc_inb(ahc, DSCOMMAND0);
827 dscommand0 |= MPARCKEN|CACHETHEN;
828 if ((ahc->features & AHC_ULTRA2) != 0) {
831 * DPARCKEN doesn't work correctly on
832 * some MBs so don't use it.
834 dscommand0 &= ~DPARCKEN;
838 * Handle chips that must have cache line
839 * streaming (dis/en)abled.
841 if ((ahc->bugs & AHC_CACHETHEN_DIS_BUG) != 0)
842 dscommand0 |= CACHETHEN;
844 if ((ahc->bugs & AHC_CACHETHEN_BUG) != 0)
845 dscommand0 &= ~CACHETHEN;
847 ahc_outb(ahc, DSCOMMAND0, dscommand0);
850 ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME,
851 /*bytes*/1) & CACHESIZE;
852 ahc->pci_cachesize *= 4;
854 if ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0
855 && ahc->pci_cachesize == 4) {
857 ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
859 ahc->pci_cachesize = 0;
863 * We cannot perform ULTRA speeds without the presense
864 * of the external precision resistor.
866 if ((ahc->features & AHC_ULTRA) != 0) {
869 devconfig = ahc_pci_read_config(ahc->dev_softc,
870 DEVCONFIG, /*bytes*/4);
871 if ((devconfig & REXTVALID) == 0)
872 ahc->features &= ~AHC_ULTRA;
875 /* See if we have a SEEPROM and perform auto-term */
876 check_extport(ahc, &sxfrctl1);
879 * Take the LED out of diagnostic mode
881 sblkctl = ahc_inb(ahc, SBLKCTL);
882 ahc_outb(ahc, SBLKCTL, (sblkctl & ~(DIAGLEDEN|DIAGLEDON)));
884 if ((ahc->features & AHC_ULTRA2) != 0) {
885 ahc_outb(ahc, DFF_THRSH, RD_DFTHRSH_MAX|WR_DFTHRSH_MAX);
887 ahc_outb(ahc, DSPCISTATUS, DFTHRSH_100);
890 if (ahc->flags & AHC_USEDEFAULTS) {
892 * PCI Adapter default setup
893 * Should only be used if the adapter does not have
896 /* See if someone else set us up already */
897 if ((ahc->flags & AHC_NO_BIOS_INIT) == 0
899 printf("%s: Using left over BIOS settings\n",
901 ahc->flags &= ~AHC_USEDEFAULTS;
902 ahc->flags |= AHC_BIOS_ENABLED;
905 * Assume only one connector and always turn
911 ahc_outb(ahc, SCSICONF, our_id|ENSPCHK|RESET_SCSI);
913 ahc->our_id = our_id;
917 * Take a look to see if we have external SRAM.
918 * We currently do not attempt to use SRAM that is
919 * shared among multiple controllers.
921 ahc_probe_ext_scbram(ahc);
924 * Record our termination setting for the
925 * generic initialization routine.
927 if ((sxfrctl1 & STPWEN) != 0)
928 ahc->flags |= AHC_TERM_ENB_A;
931 * Save chip register configuration data for chip resets
932 * that occur during runtime and resume events.
934 ahc->bus_softc.pci_softc.devconfig =
935 ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
936 ahc->bus_softc.pci_softc.command =
937 ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
938 ahc->bus_softc.pci_softc.csize_lattime =
939 ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1);
940 ahc->bus_softc.pci_softc.dscommand0 = ahc_inb(ahc, DSCOMMAND0);
941 ahc->bus_softc.pci_softc.dspcistatus = ahc_inb(ahc, DSPCISTATUS);
942 if ((ahc->features & AHC_DT) != 0) {
945 sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
946 ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
947 ahc->bus_softc.pci_softc.optionmode = ahc_inb(ahc, OPTIONMODE);
948 ahc->bus_softc.pci_softc.targcrccnt = ahc_inw(ahc, TARGCRCCNT);
949 ahc_outb(ahc, SFUNCT, sfunct);
950 ahc->bus_softc.pci_softc.crccontrol1 =
951 ahc_inb(ahc, CRCCONTROL1);
953 if ((ahc->features & AHC_MULTI_FUNC) != 0)
954 ahc->bus_softc.pci_softc.scbbaddr = ahc_inb(ahc, SCBBADDR);
956 if ((ahc->features & AHC_ULTRA2) != 0)
957 ahc->bus_softc.pci_softc.dff_thrsh = ahc_inb(ahc, DFF_THRSH);
959 /* Core initialization */
960 error = ahc_init(ahc);
965 * Allow interrupts now that we are completely setup.
967 error = ahc_pci_map_int(ahc);
976 * Test for the presense of external sram in an
977 * "unshared" configuration.
980 ahc_ext_scbram_present(struct ahc_softc *ahc)
987 chip = ahc->chip & AHC_CHIPID_MASK;
988 devconfig = ahc_pci_read_config(ahc->dev_softc,
989 DEVCONFIG, /*bytes*/4);
990 single_user = (devconfig & MPORTMODE) != 0;
992 if ((ahc->features & AHC_ULTRA2) != 0)
993 ramps = (ahc_inb(ahc, DSCOMMAND0) & RAMPS) != 0;
994 else if (chip == AHC_AIC7895 || chip == AHC_AIC7895C)
996 * External SCBRAM arbitration is flakey
997 * on these chips. Unfortunately this means
998 * we don't use the extra SCB ram space on the
1002 else if (chip >= AHC_AIC7870)
1003 ramps = (devconfig & RAMPSM) != 0;
1007 if (ramps && single_user)
1013 * Enable external scbram.
1016 ahc_scbram_config(struct ahc_softc *ahc, int enable, int pcheck,
1017 int fast, int large)
1021 if (ahc->features & AHC_MULTI_FUNC) {
1023 * Set the SCB Base addr (highest address bit)
1024 * depending on which channel we are.
1026 ahc_outb(ahc, SCBBADDR, ahc_get_pci_function(ahc->dev_softc));
1029 ahc->flags &= ~AHC_LSCBS_ENABLED;
1031 ahc->flags |= AHC_LSCBS_ENABLED;
1032 devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
1033 if ((ahc->features & AHC_ULTRA2) != 0) {
1036 dscommand0 = ahc_inb(ahc, DSCOMMAND0);
1038 dscommand0 &= ~INTSCBRAMSEL;
1040 dscommand0 |= INTSCBRAMSEL;
1042 dscommand0 &= ~USCBSIZE32;
1044 dscommand0 |= USCBSIZE32;
1045 ahc_outb(ahc, DSCOMMAND0, dscommand0);
1048 devconfig &= ~EXTSCBTIME;
1050 devconfig |= EXTSCBTIME;
1052 devconfig &= ~SCBRAMSEL;
1054 devconfig |= SCBRAMSEL;
1056 devconfig &= ~SCBSIZE32;
1058 devconfig |= SCBSIZE32;
1061 devconfig |= EXTSCBPEN;
1063 devconfig &= ~EXTSCBPEN;
1065 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
1069 * Take a look to see if we have external SRAM.
1070 * We currently do not attempt to use SRAM that is
1071 * shared among multiple controllers.
1074 ahc_probe_ext_scbram(struct ahc_softc *ahc)
1089 if (ahc_ext_scbram_present(ahc) == 0)
1093 * Probe for the best parameters to use.
1095 ahc_scbram_config(ahc, /*enable*/TRUE, pcheck, fast, large);
1096 num_scbs = ahc_probe_scbs(ahc);
1097 if (num_scbs == 0) {
1098 /* The SRAM wasn't really present. */
1104 * Clear any outstanding parity error
1105 * and ensure that parity error reporting
1108 ahc_outb(ahc, SEQCTL, 0);
1109 ahc_outb(ahc, CLRINT, CLRPARERR);
1110 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1112 /* Now see if we can do parity */
1113 ahc_scbram_config(ahc, enable, /*pcheck*/TRUE, fast, large);
1114 num_scbs = ahc_probe_scbs(ahc);
1115 if ((ahc_inb(ahc, INTSTAT) & BRKADRINT) == 0
1116 || (ahc_inb(ahc, ERROR) & MPARERR) == 0)
1119 /* Clear any resulting parity error */
1120 ahc_outb(ahc, CLRINT, CLRPARERR);
1121 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1123 /* Now see if we can do fast timing */
1124 ahc_scbram_config(ahc, enable, pcheck, /*fast*/TRUE, large);
1125 test_num_scbs = ahc_probe_scbs(ahc);
1126 if (test_num_scbs == num_scbs
1127 && ((ahc_inb(ahc, INTSTAT) & BRKADRINT) == 0
1128 || (ahc_inb(ahc, ERROR) & MPARERR) == 0))
1132 * See if we can use large SCBs and still maintain
1133 * the same overall count of SCBs.
1135 if ((ahc->features & AHC_LARGE_SCBS) != 0) {
1136 ahc_scbram_config(ahc, enable, pcheck, fast, /*large*/TRUE);
1137 test_num_scbs = ahc_probe_scbs(ahc);
1138 if (test_num_scbs >= num_scbs) {
1140 num_scbs = test_num_scbs;
1141 if (num_scbs >= 64) {
1143 * We have enough space to move the
1144 * "busy targets table" into SCB space
1145 * and make it qualify all the way to the
1148 ahc->flags |= AHC_SCB_BTT;
1154 * Disable parity error reporting until we
1155 * can load instruction ram.
1157 ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS);
1158 /* Clear any latched parity error */
1159 ahc_outb(ahc, CLRINT, CLRPARERR);
1160 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1161 if (bootverbose && enable) {
1162 printf("%s: External SRAM, %s access%s, %dbytes/SCB\n",
1163 ahc_name(ahc), fast ? "fast" : "slow",
1164 pcheck ? ", parity checking enabled" : "",
1167 ahc_scbram_config(ahc, enable, pcheck, fast, large);
1171 * Perform some simple tests that should catch situations where
1172 * our registers are invalidly mapped.
1175 ahc_pci_test_register_access(struct ahc_softc *ahc)
1185 * Enable PCI error interrupt status, but suppress NMIs
1186 * generated by SERR raised due to target aborts.
1188 cmd = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
1189 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
1190 cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
1193 * First a simple test to see if any
1194 * registers can be read. Reading
1195 * HCNTRL has no side effects and has
1196 * at least one bit that is guaranteed to
1197 * be zero so it is a good register to
1198 * use for this test.
1200 hcntrl = ahc_inb(ahc, HCNTRL);
1205 if ((hcntrl & CHIPRST) != 0) {
1207 * The chip has not been initialized since
1208 * PCI/EISA/VLB bus reset. Don't trust
1209 * "left over BIOS data".
1211 ahc->flags |= AHC_NO_BIOS_INIT;
1215 * Next create a situation where write combining
1216 * or read prefetching could be initiated by the
1217 * CPU or host bridge. Our device does not support
1218 * either, so look for data corruption and/or flagged
1219 * PCI errors. First pause without causing another
1223 ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
1224 while (ahc_is_paused(ahc) == 0)
1227 /* Clear any PCI errors that occurred before our driver attached. */
1228 status1 = ahc_pci_read_config(ahc->dev_softc,
1229 PCIR_STATUS + 1, /*bytes*/1);
1230 ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
1231 status1, /*bytes*/1);
1232 ahc_outb(ahc, CLRINT, CLRPARERR);
1234 ahc_outb(ahc, SEQCTL, PERRORDIS);
1235 ahc_outb(ahc, SCBPTR, 0);
1236 ahc_outl(ahc, SCB_BASE, 0x5aa555aa);
1237 if (ahc_inl(ahc, SCB_BASE) != 0x5aa555aa)
1240 status1 = ahc_pci_read_config(ahc->dev_softc,
1241 PCIR_STATUS + 1, /*bytes*/1);
1242 if ((status1 & STA) != 0)
1248 /* Silently clear any latched errors. */
1249 status1 = ahc_pci_read_config(ahc->dev_softc,
1250 PCIR_STATUS + 1, /*bytes*/1);
1251 ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
1252 status1, /*bytes*/1);
1253 ahc_outb(ahc, CLRINT, CLRPARERR);
1254 ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS);
1255 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
1260 * Check the external port logic for a serial eeprom
1261 * and termination/cable detection contrls.
1264 check_extport(struct ahc_softc *ahc, u_int *sxfrctl1)
1266 struct seeprom_descriptor sd;
1267 struct seeprom_config *sc;
1272 sd.sd_control_offset = SEECTL;
1273 sd.sd_status_offset = SEECTL;
1274 sd.sd_dataout_offset = SEECTL;
1275 sc = ahc->seep_config;
1278 * For some multi-channel devices, the c46 is simply too
1279 * small to work. For the other controller types, we can
1280 * get our information from either SEEPROM type. Set the
1281 * type to start our probe with accordingly.
1283 if (ahc->flags & AHC_LARGE_SEEPROM)
1284 sd.sd_chip = C56_66;
1295 have_seeprom = ahc_acquire_seeprom(ahc, &sd);
1299 printf("%s: Reading SEEPROM...", ahc_name(ahc));
1304 start_addr = 32 * (ahc->channel - 'A');
1306 have_seeprom = ahc_read_seeprom(&sd, (uint16_t *)sc,
1311 have_seeprom = ahc_verify_cksum(sc);
1313 if (have_seeprom != 0 || sd.sd_chip == C56_66) {
1315 if (have_seeprom == 0)
1316 printf ("checksum error\n");
1322 sd.sd_chip = C56_66;
1324 ahc_release_seeprom(&sd);
1326 /* Remember the SEEPROM type for later */
1327 if (sd.sd_chip == C56_66)
1328 ahc->flags |= AHC_LARGE_SEEPROM;
1331 if (!have_seeprom) {
1333 * Pull scratch ram settings and treat them as
1334 * if they are the contents of an seeprom if
1335 * the 'ADPT' signature is found in SCB2.
1336 * We manually compose the data as 16bit values
1337 * to avoid endian issues.
1339 ahc_outb(ahc, SCBPTR, 2);
1340 if (ahc_inb(ahc, SCB_BASE) == 'A'
1341 && ahc_inb(ahc, SCB_BASE + 1) == 'D'
1342 && ahc_inb(ahc, SCB_BASE + 2) == 'P'
1343 && ahc_inb(ahc, SCB_BASE + 3) == 'T') {
1347 sc_data = (uint16_t *)sc;
1348 for (i = 0; i < 32; i++, sc_data++) {
1352 *sc_data = ahc_inb(ahc, SRAM_BASE + j)
1353 | ahc_inb(ahc, SRAM_BASE + j + 1) << 8;
1355 have_seeprom = ahc_verify_cksum(sc);
1357 ahc->flags |= AHC_SCB_CONFIG_USED;
1360 * Clear any SCB parity errors in case this data and
1361 * its associated parity was not initialized by the BIOS
1363 ahc_outb(ahc, CLRINT, CLRPARERR);
1364 ahc_outb(ahc, CLRINT, CLRBRKADRINT);
1367 if (!have_seeprom) {
1369 printf("%s: No SEEPROM available.\n", ahc_name(ahc));
1370 ahc->flags |= AHC_USEDEFAULTS;
1371 free(ahc->seep_config, M_DEVBUF);
1372 ahc->seep_config = NULL;
1375 ahc_parse_pci_eeprom(ahc, sc);
1379 * Cards that have the external logic necessary to talk to
1380 * a SEEPROM, are almost certain to have the remaining logic
1381 * necessary for auto-termination control. This assumption
1382 * hasn't failed yet...
1384 have_autoterm = have_seeprom;
1387 * Some low-cost chips have SEEPROM and auto-term control built
1388 * in, instead of using a GAL. They can tell us directly
1389 * if the termination logic is enabled.
1391 if ((ahc->features & AHC_SPIOCAP) != 0) {
1392 if ((ahc_inb(ahc, SPIOCAP) & SSPIOCPS) == 0)
1393 have_autoterm = FALSE;
1396 if (have_autoterm) {
1397 ahc->flags |= AHC_HAS_TERM_LOGIC;
1398 ahc_acquire_seeprom(ahc, &sd);
1399 configure_termination(ahc, &sd, sc->adapter_control, sxfrctl1);
1400 ahc_release_seeprom(&sd);
1401 } else if (have_seeprom) {
1402 *sxfrctl1 &= ~STPWEN;
1403 if ((sc->adapter_control & CFSTERM) != 0)
1404 *sxfrctl1 |= STPWEN;
1406 printf("%s: Low byte termination %sabled\n",
1408 (*sxfrctl1 & STPWEN) ? "en" : "dis");
1413 ahc_parse_pci_eeprom(struct ahc_softc *ahc, struct seeprom_config *sc)
1416 * Put the data we've collected down into SRAM
1417 * where ahc_init will find it.
1420 int max_targ = sc->max_targets & CFMAXTARG;
1422 uint16_t discenable;
1427 if ((sc->adapter_control & CFULTRAEN) != 0) {
1429 * Determine if this adapter has a "newstyle"
1432 for (i = 0; i < max_targ; i++) {
1433 if ((sc->device_flags[i] & CFSYNCHISULTRA) != 0) {
1434 ahc->flags |= AHC_NEWEEPROM_FMT;
1440 for (i = 0; i < max_targ; i++) {
1442 uint16_t target_mask;
1444 target_mask = 0x01 << i;
1445 if (sc->device_flags[i] & CFDISC)
1446 discenable |= target_mask;
1447 if ((ahc->flags & AHC_NEWEEPROM_FMT) != 0) {
1448 if ((sc->device_flags[i] & CFSYNCHISULTRA) != 0)
1449 ultraenb |= target_mask;
1450 } else if ((sc->adapter_control & CFULTRAEN) != 0) {
1451 ultraenb |= target_mask;
1453 if ((sc->device_flags[i] & CFXFER) == 0x04
1454 && (ultraenb & target_mask) != 0) {
1455 /* Treat 10MHz as a non-ultra speed */
1456 sc->device_flags[i] &= ~CFXFER;
1457 ultraenb &= ~target_mask;
1459 if ((ahc->features & AHC_ULTRA2) != 0) {
1462 if (sc->device_flags[i] & CFSYNCH)
1463 offset = MAX_OFFSET_ULTRA2;
1466 ahc_outb(ahc, TARG_OFFSET + i, offset);
1469 * The ultra enable bits contain the
1470 * high bit of the ultra2 sync rate
1473 scsirate = (sc->device_flags[i] & CFXFER)
1474 | ((ultraenb & target_mask) ? 0x8 : 0x0);
1475 if (sc->device_flags[i] & CFWIDEB)
1476 scsirate |= WIDEXFER;
1478 scsirate = (sc->device_flags[i] & CFXFER) << 4;
1479 if (sc->device_flags[i] & CFSYNCH)
1481 if (sc->device_flags[i] & CFWIDEB)
1482 scsirate |= WIDEXFER;
1484 ahc_outb(ahc, TARG_SCSIRATE + i, scsirate);
1486 ahc->our_id = sc->brtime_id & CFSCSIID;
1488 scsi_conf = (ahc->our_id & 0x7);
1489 if (sc->adapter_control & CFSPARITY)
1490 scsi_conf |= ENSPCHK;
1491 if (sc->adapter_control & CFRESETB)
1492 scsi_conf |= RESET_SCSI;
1494 ahc->flags |= (sc->adapter_control & CFBOOTCHAN) >> CFBOOTCHANSHIFT;
1496 if (sc->bios_control & CFEXTEND)
1497 ahc->flags |= AHC_EXTENDED_TRANS_A;
1499 if (sc->bios_control & CFBIOSEN)
1500 ahc->flags |= AHC_BIOS_ENABLED;
1501 if (ahc->features & AHC_ULTRA
1502 && (ahc->flags & AHC_NEWEEPROM_FMT) == 0) {
1503 /* Should we enable Ultra mode? */
1504 if (!(sc->adapter_control & CFULTRAEN))
1505 /* Treat us as a non-ultra card */
1509 if (sc->signature == CFSIGNATURE
1510 || sc->signature == CFSIGNATURE2) {
1513 /* Honor the STPWLEVEL settings */
1514 devconfig = ahc_pci_read_config(ahc->dev_softc,
1515 DEVCONFIG, /*bytes*/4);
1516 devconfig &= ~STPWLEVEL;
1517 if ((sc->bios_control & CFSTPWLEVEL) != 0)
1518 devconfig |= STPWLEVEL;
1519 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG,
1520 devconfig, /*bytes*/4);
1522 /* Set SCSICONF info */
1523 ahc_outb(ahc, SCSICONF, scsi_conf);
1524 ahc_outb(ahc, DISC_DSB, ~(discenable & 0xff));
1525 ahc_outb(ahc, DISC_DSB + 1, ~((discenable >> 8) & 0xff));
1526 ahc_outb(ahc, ULTRA_ENB, ultraenb & 0xff);
1527 ahc_outb(ahc, ULTRA_ENB + 1, (ultraenb >> 8) & 0xff);
1531 configure_termination(struct ahc_softc *ahc,
1532 struct seeprom_descriptor *sd,
1533 u_int adapter_control,
1541 * Update the settings in sxfrctl1 to match the
1542 * termination settings
1547 * SEECS must be on for the GALS to latch
1548 * the data properly. Be sure to leave MS
1549 * on or we will release the seeprom.
1551 SEEPROM_OUTB(sd, sd->sd_MS | sd->sd_CS);
1552 if ((adapter_control & CFAUTOTERM) != 0
1553 || (ahc->features & AHC_NEW_TERMCTL) != 0) {
1554 int internal50_present;
1555 int internal68_present;
1556 int externalcable_present;
1568 if ((ahc->features & AHC_NEW_TERMCTL) != 0) {
1569 ahc_new_term_detect(ahc, &enableSEC_low,
1574 if ((adapter_control & CFSEAUTOTERM) == 0) {
1576 printf("%s: Manual SE Termination\n",
1578 enableSEC_low = (adapter_control & CFSELOWTERM);
1580 (adapter_control & CFSEHIGHTERM);
1582 if ((adapter_control & CFAUTOTERM) == 0) {
1584 printf("%s: Manual LVD Termination\n",
1586 enablePRI_low = (adapter_control & CFSTERM);
1587 enablePRI_high = (adapter_control & CFWSTERM);
1589 /* Make the table calculations below happy */
1590 internal50_present = 0;
1591 internal68_present = 1;
1592 externalcable_present = 1;
1593 } else if ((ahc->features & AHC_SPIOCAP) != 0) {
1594 aic785X_cable_detect(ahc, &internal50_present,
1595 &externalcable_present,
1597 /* Can never support a wide connector. */
1598 internal68_present = 0;
1600 aic787X_cable_detect(ahc, &internal50_present,
1601 &internal68_present,
1602 &externalcable_present,
1606 if ((ahc->features & AHC_WIDE) == 0)
1607 internal68_present = 0;
1610 && (ahc->features & AHC_ULTRA2) == 0) {
1611 printf("%s: internal 50 cable %s present",
1613 internal50_present ? "is":"not");
1615 if ((ahc->features & AHC_WIDE) != 0)
1616 printf(", internal 68 cable %s present",
1617 internal68_present ? "is":"not");
1618 printf("\n%s: external cable %s present\n",
1620 externalcable_present ? "is":"not");
1623 printf("%s: BIOS eeprom %s present\n",
1624 ahc_name(ahc), eeprom_present ? "is" : "not");
1626 if ((ahc->flags & AHC_INT50_SPEEDFLEX) != 0) {
1628 * The 50 pin connector is a separate bus,
1629 * so force it to always be terminated.
1630 * In the future, perform current sensing
1631 * to determine if we are in the middle of
1632 * a properly terminated bus.
1634 internal50_present = 0;
1638 * Now set the termination based on what
1640 * Flash Enable = BRDDAT7
1641 * Secondary High Term Enable = BRDDAT6
1642 * Secondary Low Term Enable = BRDDAT5 (7890)
1643 * Primary High Term Enable = BRDDAT4 (7890)
1645 if ((ahc->features & AHC_ULTRA2) == 0
1646 && (internal50_present != 0)
1647 && (internal68_present != 0)
1648 && (externalcable_present != 0)) {
1649 printf("%s: Illegal cable configuration!!. "
1650 "Only two connectors on the "
1651 "adapter may be used at a "
1652 "time!\n", ahc_name(ahc));
1655 * Pretend there are no cables in the hope
1656 * that having all of the termination on
1657 * gives us a more stable bus.
1659 internal50_present = 0;
1660 internal68_present = 0;
1661 externalcable_present = 0;
1664 if ((ahc->features & AHC_WIDE) != 0
1665 && ((externalcable_present == 0)
1666 || (internal68_present == 0)
1667 || (enableSEC_high != 0))) {
1670 if ((ahc->flags & AHC_INT50_SPEEDFLEX) != 0)
1671 printf("%s: 68 pin termination "
1672 "Enabled\n", ahc_name(ahc));
1674 printf("%s: %sHigh byte termination "
1675 "Enabled\n", ahc_name(ahc),
1676 enableSEC_high ? "Secondary "
1681 sum = internal50_present + internal68_present
1682 + externalcable_present;
1683 if (sum < 2 || (enableSEC_low != 0)) {
1684 if ((ahc->features & AHC_ULTRA2) != 0)
1687 *sxfrctl1 |= STPWEN;
1689 if ((ahc->flags & AHC_INT50_SPEEDFLEX) != 0)
1690 printf("%s: 50 pin termination "
1691 "Enabled\n", ahc_name(ahc));
1693 printf("%s: %sLow byte termination "
1694 "Enabled\n", ahc_name(ahc),
1695 enableSEC_low ? "Secondary "
1700 if (enablePRI_low != 0) {
1701 *sxfrctl1 |= STPWEN;
1703 printf("%s: Primary Low Byte termination "
1704 "Enabled\n", ahc_name(ahc));
1708 * Setup STPWEN before setting up the rest of
1709 * the termination per the tech note on the U160 cards.
1711 ahc_outb(ahc, SXFRCTL1, *sxfrctl1);
1713 if (enablePRI_high != 0) {
1716 printf("%s: Primary High Byte "
1717 "termination Enabled\n",
1721 write_brdctl(ahc, brddat);
1724 if ((adapter_control & CFSTERM) != 0) {
1725 *sxfrctl1 |= STPWEN;
1728 printf("%s: %sLow byte termination Enabled\n",
1730 (ahc->features & AHC_ULTRA2) ? "Primary "
1734 if ((adapter_control & CFWSTERM) != 0
1735 && (ahc->features & AHC_WIDE) != 0) {
1738 printf("%s: %sHigh byte termination Enabled\n",
1740 (ahc->features & AHC_ULTRA2)
1741 ? "Secondary " : "");
1745 * Setup STPWEN before setting up the rest of
1746 * the termination per the tech note on the U160 cards.
1748 ahc_outb(ahc, SXFRCTL1, *sxfrctl1);
1750 if ((ahc->features & AHC_WIDE) != 0)
1751 write_brdctl(ahc, brddat);
1753 SEEPROM_OUTB(sd, sd->sd_MS); /* Clear CS */
1757 ahc_new_term_detect(struct ahc_softc *ahc, int *enableSEC_low,
1758 int *enableSEC_high, int *enablePRI_low,
1759 int *enablePRI_high, int *eeprom_present)
1765 * BRDDAT6 = Enable Secondary High Byte termination
1766 * BRDDAT5 = Enable Secondary Low Byte termination
1767 * BRDDAT4 = Enable Primary high byte termination
1768 * BRDDAT3 = Enable Primary low byte termination
1770 brdctl = read_brdctl(ahc);
1771 *eeprom_present = brdctl & BRDDAT7;
1772 *enableSEC_high = (brdctl & BRDDAT6);
1773 *enableSEC_low = (brdctl & BRDDAT5);
1774 *enablePRI_high = (brdctl & BRDDAT4);
1775 *enablePRI_low = (brdctl & BRDDAT3);
1779 aic787X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
1780 int *internal68_present, int *externalcable_present,
1781 int *eeprom_present)
1786 * First read the status of our cables.
1787 * Set the rom bank to 0 since the
1788 * bank setting serves as a multiplexor
1789 * for the cable detection logic.
1790 * BRDDAT5 controls the bank switch.
1792 write_brdctl(ahc, 0);
1795 * Now read the state of the internal
1796 * connectors. BRDDAT6 is INT50 and
1799 brdctl = read_brdctl(ahc);
1800 *internal50_present = (brdctl & BRDDAT6) ? 0 : 1;
1801 *internal68_present = (brdctl & BRDDAT7) ? 0 : 1;
1804 * Set the rom bank to 1 and determine
1805 * the other signals.
1807 write_brdctl(ahc, BRDDAT5);
1810 * Now read the state of the external
1811 * connectors. BRDDAT6 is EXT68 and
1812 * BRDDAT7 is EPROMPS.
1814 brdctl = read_brdctl(ahc);
1815 *externalcable_present = (brdctl & BRDDAT6) ? 0 : 1;
1816 *eeprom_present = (brdctl & BRDDAT7) ? 1 : 0;
1820 aic785X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
1821 int *externalcable_present, int *eeprom_present)
1826 spiocap = ahc_inb(ahc, SPIOCAP);
1827 spiocap &= ~SOFTCMDEN;
1828 spiocap |= EXT_BRDCTL;
1829 ahc_outb(ahc, SPIOCAP, spiocap);
1830 ahc_outb(ahc, BRDCTL, BRDRW|BRDCS);
1831 ahc_flush_device_writes(ahc);
1833 ahc_outb(ahc, BRDCTL, 0);
1834 ahc_flush_device_writes(ahc);
1836 brdctl = ahc_inb(ahc, BRDCTL);
1837 *internal50_present = (brdctl & BRDDAT5) ? 0 : 1;
1838 *externalcable_present = (brdctl & BRDDAT6) ? 0 : 1;
1839 *eeprom_present = (ahc_inb(ahc, SPIOCAP) & EEPROM) ? 1 : 0;
1843 ahc_acquire_seeprom(struct ahc_softc *ahc, struct seeprom_descriptor *sd)
1847 if ((ahc->features & AHC_SPIOCAP) != 0
1848 && (ahc_inb(ahc, SPIOCAP) & SEEPROM) == 0)
1852 * Request access of the memory port. When access is
1853 * granted, SEERDY will go high. We use a 1 second
1854 * timeout which should be near 1 second more than
1855 * is needed. Reason: after the chip reset, there
1856 * should be no contention.
1858 SEEPROM_OUTB(sd, sd->sd_MS);
1859 wait = 1000; /* 1 second timeout in msec */
1860 while (--wait && ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0)) {
1861 ahc_delay(1000); /* delay 1 msec */
1863 if ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0) {
1864 SEEPROM_OUTB(sd, 0);
1871 ahc_release_seeprom(struct seeprom_descriptor *sd)
1873 /* Release access to the memory port and the serial EEPROM. */
1874 SEEPROM_OUTB(sd, 0);
1878 write_brdctl(struct ahc_softc *ahc, uint8_t value)
1882 if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7895) {
1884 if (ahc->channel == 'B')
1886 } else if ((ahc->features & AHC_ULTRA2) != 0) {
1889 brdctl = BRDSTB|BRDCS;
1891 ahc_outb(ahc, BRDCTL, brdctl);
1892 ahc_flush_device_writes(ahc);
1894 ahc_outb(ahc, BRDCTL, brdctl);
1895 ahc_flush_device_writes(ahc);
1896 if ((ahc->features & AHC_ULTRA2) != 0)
1897 brdctl |= BRDSTB_ULTRA2;
1900 ahc_outb(ahc, BRDCTL, brdctl);
1901 ahc_flush_device_writes(ahc);
1902 if ((ahc->features & AHC_ULTRA2) != 0)
1906 ahc_outb(ahc, BRDCTL, brdctl);
1910 read_brdctl(struct ahc_softc *ahc)
1915 if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7895) {
1917 if (ahc->channel == 'B')
1919 } else if ((ahc->features & AHC_ULTRA2) != 0) {
1920 brdctl = BRDRW_ULTRA2;
1922 brdctl = BRDRW|BRDCS;
1924 ahc_outb(ahc, BRDCTL, brdctl);
1925 ahc_flush_device_writes(ahc);
1926 value = ahc_inb(ahc, BRDCTL);
1927 ahc_outb(ahc, BRDCTL, 0);
1932 ahc_pci_intr(struct ahc_softc *ahc)
1937 error = ahc_inb(ahc, ERROR);
1938 if ((error & PCIERRSTAT) == 0)
1941 status1 = ahc_pci_read_config(ahc->dev_softc,
1942 PCIR_STATUS + 1, /*bytes*/1);
1944 printf("%s: PCI error Interrupt at seqaddr = 0x%x\n",
1946 ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8));
1948 if (status1 & DPE) {
1949 ahc->pci_target_perr_count++;
1950 printf("%s: Data Parity Error Detected during address "
1951 "or write data phase\n", ahc_name(ahc));
1953 if (status1 & SSE) {
1954 printf("%s: Signal System Error Detected\n", ahc_name(ahc));
1956 if (status1 & RMA) {
1957 printf("%s: Received a Master Abort\n", ahc_name(ahc));
1959 if (status1 & RTA) {
1960 printf("%s: Received a Target Abort\n", ahc_name(ahc));
1962 if (status1 & STA) {
1963 printf("%s: Signaled a Target Abort\n", ahc_name(ahc));
1965 if (status1 & DPR) {
1966 printf("%s: Data Parity Error has been reported via PERR#\n",
1970 /* Clear latched errors. */
1971 ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
1972 status1, /*bytes*/1);
1974 if ((status1 & (DPE|SSE|RMA|RTA|STA|DPR)) == 0) {
1975 printf("%s: Latched PCIERR interrupt with "
1976 "no status bits set\n", ahc_name(ahc));
1978 ahc_outb(ahc, CLRINT, CLRPARERR);
1981 if (ahc->pci_target_perr_count > AHC_PCI_TARGET_PERR_THRESH) {
1983 "%s: WARNING WARNING WARNING WARNING\n"
1984 "%s: Too many PCI parity errors observed as a target.\n"
1985 "%s: Some device on this bus is generating bad parity.\n"
1986 "%s: This is an error *observed by*, not *generated by*, this controller.\n"
1987 "%s: PCI parity error checking has been disabled.\n"
1988 "%s: WARNING WARNING WARNING WARNING\n",
1989 ahc_name(ahc), ahc_name(ahc), ahc_name(ahc),
1990 ahc_name(ahc), ahc_name(ahc), ahc_name(ahc));
1991 ahc->seqctl |= FAILDIS;
1992 ahc_outb(ahc, SEQCTL, ahc->seqctl);
1998 ahc_pci_chip_init(struct ahc_softc *ahc)
2000 ahc_outb(ahc, DSCOMMAND0, ahc->bus_softc.pci_softc.dscommand0);
2001 ahc_outb(ahc, DSPCISTATUS, ahc->bus_softc.pci_softc.dspcistatus);
2002 if ((ahc->features & AHC_DT) != 0) {
2005 sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
2006 ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
2007 ahc_outb(ahc, OPTIONMODE, ahc->bus_softc.pci_softc.optionmode);
2008 ahc_outw(ahc, TARGCRCCNT, ahc->bus_softc.pci_softc.targcrccnt);
2009 ahc_outb(ahc, SFUNCT, sfunct);
2010 ahc_outb(ahc, CRCCONTROL1,
2011 ahc->bus_softc.pci_softc.crccontrol1);
2013 if ((ahc->features & AHC_MULTI_FUNC) != 0)
2014 ahc_outb(ahc, SCBBADDR, ahc->bus_softc.pci_softc.scbbaddr);
2016 if ((ahc->features & AHC_ULTRA2) != 0)
2017 ahc_outb(ahc, DFF_THRSH, ahc->bus_softc.pci_softc.dff_thrsh);
2019 return (ahc_chip_init(ahc));
2024 ahc_pci_resume(struct ahc_softc *ahc)
2027 * We assume that the OS has restored our register
2028 * mappings, etc. Just update the config space registers
2029 * that the OS doesn't know about and rely on our chip
2030 * reset handler to handle the rest.
2032 ahc_pci_write_config(ahc->dev_softc, DEVCONFIG,
2033 ahc->bus_softc.pci_softc.devconfig, /*bytes*/4);
2034 ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
2035 ahc->bus_softc.pci_softc.command, /*bytes*/1);
2036 ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
2037 ahc->bus_softc.pci_softc.csize_lattime, /*bytes*/1);
2038 if ((ahc->flags & AHC_HAS_TERM_LOGIC) != 0) {
2039 struct seeprom_descriptor sd;
2043 sd.sd_control_offset = SEECTL;
2044 sd.sd_status_offset = SEECTL;
2045 sd.sd_dataout_offset = SEECTL;
2047 ahc_acquire_seeprom(ahc, &sd);
2048 configure_termination(ahc, &sd,
2049 ahc->seep_config->adapter_control,
2051 ahc_release_seeprom(&sd);
2057 ahc_aic785X_setup(struct ahc_softc *ahc)
2059 ahc_dev_softc_t pci;
2062 pci = ahc->dev_softc;
2064 ahc->chip = AHC_AIC7850;
2065 ahc->features = AHC_AIC7850_FE;
2066 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2067 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2069 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
2070 ahc->instruction_ram_size = 512;
2075 ahc_aic7860_setup(struct ahc_softc *ahc)
2077 ahc_dev_softc_t pci;
2080 pci = ahc->dev_softc;
2082 ahc->chip = AHC_AIC7860;
2083 ahc->features = AHC_AIC7860_FE;
2084 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2085 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2087 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
2088 ahc->instruction_ram_size = 512;
2093 ahc_apa1480_setup(struct ahc_softc *ahc)
2097 error = ahc_aic7860_setup(ahc);
2100 ahc->features |= AHC_REMOVABLE;
2105 ahc_aic7870_setup(struct ahc_softc *ahc)
2109 ahc->chip = AHC_AIC7870;
2110 ahc->features = AHC_AIC7870_FE;
2111 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2112 ahc->instruction_ram_size = 512;
2117 ahc_aic7870h_setup(struct ahc_softc *ahc)
2119 int error = ahc_aic7870_setup(ahc);
2121 ahc->features |= AHC_HVD;
2127 ahc_aha394X_setup(struct ahc_softc *ahc)
2131 error = ahc_aic7870_setup(ahc);
2133 error = ahc_aha394XX_setup(ahc);
2138 ahc_aha394Xh_setup(struct ahc_softc *ahc)
2140 int error = ahc_aha394X_setup(ahc);
2142 ahc->features |= AHC_HVD;
2148 ahc_aha398X_setup(struct ahc_softc *ahc)
2152 error = ahc_aic7870_setup(ahc);
2154 error = ahc_aha398XX_setup(ahc);
2159 ahc_aha494X_setup(struct ahc_softc *ahc)
2163 error = ahc_aic7870_setup(ahc);
2165 error = ahc_aha494XX_setup(ahc);
2170 ahc_aha494Xh_setup(struct ahc_softc *ahc)
2172 int error = ahc_aha494X_setup(ahc);
2174 ahc->features |= AHC_HVD;
2180 ahc_aic7880_setup(struct ahc_softc *ahc)
2182 ahc_dev_softc_t pci;
2185 pci = ahc->dev_softc;
2187 ahc->chip = AHC_AIC7880;
2188 ahc->features = AHC_AIC7880_FE;
2189 ahc->bugs |= AHC_TMODE_WIDEODD_BUG;
2190 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2192 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
2194 ahc->bugs |= AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
2196 ahc->instruction_ram_size = 512;
2201 ahc_aic7880h_setup(struct ahc_softc *ahc)
2203 int error = ahc_aic7880_setup(ahc);
2205 ahc->features |= AHC_HVD;
2212 ahc_aha2940Pro_setup(struct ahc_softc *ahc)
2215 ahc->flags |= AHC_INT50_SPEEDFLEX;
2216 return (ahc_aic7880_setup(ahc));
2220 ahc_aha394XU_setup(struct ahc_softc *ahc)
2224 error = ahc_aic7880_setup(ahc);
2226 error = ahc_aha394XX_setup(ahc);
2231 ahc_aha394XUh_setup(struct ahc_softc *ahc)
2233 int error = ahc_aha394XU_setup(ahc);
2235 ahc->features |= AHC_HVD;
2241 ahc_aha398XU_setup(struct ahc_softc *ahc)
2245 error = ahc_aic7880_setup(ahc);
2247 error = ahc_aha398XX_setup(ahc);
2252 ahc_aic7890_setup(struct ahc_softc *ahc)
2254 ahc_dev_softc_t pci;
2257 pci = ahc->dev_softc;
2259 ahc->chip = AHC_AIC7890;
2260 ahc->features = AHC_AIC7890_FE;
2261 ahc->flags |= AHC_NEWEEPROM_FMT;
2262 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2264 ahc->bugs |= AHC_AUTOFLUSH_BUG|AHC_CACHETHEN_BUG;
2265 ahc->instruction_ram_size = 768;
2270 ahc_aic7892_setup(struct ahc_softc *ahc)
2274 ahc->chip = AHC_AIC7892;
2275 ahc->features = AHC_AIC7892_FE;
2276 ahc->flags |= AHC_NEWEEPROM_FMT;
2277 ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
2278 ahc->instruction_ram_size = 1024;
2283 ahc_aic7895_setup(struct ahc_softc *ahc)
2285 ahc_dev_softc_t pci;
2288 pci = ahc->dev_softc;
2289 ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
2291 * The 'C' revision of the aic7895 has a few additional features.
2293 rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
2295 ahc->chip = AHC_AIC7895C;
2296 ahc->features = AHC_AIC7895C_FE;
2300 ahc->chip = AHC_AIC7895;
2301 ahc->features = AHC_AIC7895_FE;
2304 * The BIOS disables the use of MWI transactions
2305 * since it does not have the MWI bug work around
2306 * we have. Disabling MWI reduces performance, so
2309 command = ahc_pci_read_config(pci, PCIR_COMMAND, /*bytes*/1);
2310 command |= PCIM_CMD_MWRICEN;
2311 ahc_pci_write_config(pci, PCIR_COMMAND, command, /*bytes*/1);
2312 ahc->bugs |= AHC_PCI_MWI_BUG;
2315 * XXX Does CACHETHEN really not work??? What about PCI retry?
2316 * on C level chips. Need to test, but for now, play it safe.
2318 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_PCI_2_1_RETRY_BUG
2319 | AHC_CACHETHEN_BUG;
2325 * Cachesize must also be zero due to stray DAC
2326 * problem when sitting behind some bridges.
2328 ahc_pci_write_config(pci, CSIZE_LATTIME, 0, /*bytes*/1);
2329 devconfig = ahc_pci_read_config(pci, DEVCONFIG, /*bytes*/1);
2330 devconfig |= MRDCEN;
2331 ahc_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
2333 ahc->flags |= AHC_NEWEEPROM_FMT;
2334 ahc->instruction_ram_size = 512;
2339 ahc_aic7895h_setup(struct ahc_softc *ahc)
2341 int error = ahc_aic7895_setup(ahc);
2343 ahc->features |= AHC_HVD;
2349 ahc_aic7896_setup(struct ahc_softc *ahc)
2351 ahc_dev_softc_t pci;
2353 pci = ahc->dev_softc;
2354 ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
2355 ahc->chip = AHC_AIC7896;
2356 ahc->features = AHC_AIC7896_FE;
2357 ahc->flags |= AHC_NEWEEPROM_FMT;
2358 ahc->bugs |= AHC_CACHETHEN_DIS_BUG;
2359 ahc->instruction_ram_size = 768;
2364 ahc_aic7899_setup(struct ahc_softc *ahc)
2366 ahc_dev_softc_t pci;
2368 pci = ahc->dev_softc;
2369 ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
2370 ahc->chip = AHC_AIC7899;
2371 ahc->features = AHC_AIC7899_FE;
2372 ahc->flags |= AHC_NEWEEPROM_FMT;
2373 ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
2374 ahc->instruction_ram_size = 1024;
2379 ahc_aha29160C_setup(struct ahc_softc *ahc)
2383 error = ahc_aic7899_setup(ahc);
2386 ahc->features |= AHC_REMOVABLE;
2391 ahc_raid_setup(struct ahc_softc *ahc)
2393 printf("RAID functionality unsupported\n");
2398 ahc_aha394XX_setup(struct ahc_softc *ahc)
2400 ahc_dev_softc_t pci;
2402 pci = ahc->dev_softc;
2403 switch (ahc_get_pci_slot(pci)) {
2404 case AHC_394X_SLOT_CHANNEL_A:
2407 case AHC_394X_SLOT_CHANNEL_B:
2411 printf("adapter at unexpected slot %d\n"
2412 "unable to map to a channel\n",
2413 ahc_get_pci_slot(pci));
2420 ahc_aha398XX_setup(struct ahc_softc *ahc)
2422 ahc_dev_softc_t pci;
2424 pci = ahc->dev_softc;
2425 switch (ahc_get_pci_slot(pci)) {
2426 case AHC_398X_SLOT_CHANNEL_A:
2429 case AHC_398X_SLOT_CHANNEL_B:
2432 case AHC_398X_SLOT_CHANNEL_C:
2436 printf("adapter at unexpected slot %d\n"
2437 "unable to map to a channel\n",
2438 ahc_get_pci_slot(pci));
2442 ahc->flags |= AHC_LARGE_SEEPROM;
2447 ahc_aha494XX_setup(struct ahc_softc *ahc)
2449 ahc_dev_softc_t pci;
2451 pci = ahc->dev_softc;
2452 switch (ahc_get_pci_slot(pci)) {
2453 case AHC_494X_SLOT_CHANNEL_A:
2456 case AHC_494X_SLOT_CHANNEL_B:
2459 case AHC_494X_SLOT_CHANNEL_C:
2462 case AHC_494X_SLOT_CHANNEL_D:
2466 printf("adapter at unexpected slot %d\n"
2467 "unable to map to a channel\n",
2468 ahc_get_pci_slot(pci));
2471 ahc->flags |= AHC_LARGE_SEEPROM;