162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Product specific probe and attach routines for: 362306a36Sopenharmony_ci * 27/284X and aic7770 motherboard SCSI controllers 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 1994-1998, 2000, 2001 Justin T. Gibbs. 662306a36Sopenharmony_ci * All rights reserved. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 962306a36Sopenharmony_ci * modification, are permitted provided that the following conditions 1062306a36Sopenharmony_ci * are met: 1162306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1262306a36Sopenharmony_ci * notice, this list of conditions, and the following disclaimer, 1362306a36Sopenharmony_ci * without modification. 1462306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1562306a36Sopenharmony_ci * substantially similar to the "NO WARRANTY" disclaimer below 1662306a36Sopenharmony_ci * ("Disclaimer") and any redistribution must be conditioned upon 1762306a36Sopenharmony_ci * including a substantially similar Disclaimer requirement for further 1862306a36Sopenharmony_ci * binary redistribution. 1962306a36Sopenharmony_ci * 3. Neither the names of the above-listed copyright holders nor the names 2062306a36Sopenharmony_ci * of any contributors may be used to endorse or promote products derived 2162306a36Sopenharmony_ci * from this software without specific prior written permission. 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * Alternatively, this software may be distributed under the terms of the 2462306a36Sopenharmony_ci * GNU General Public License ("GPL") version 2 as published by the Free 2562306a36Sopenharmony_ci * Software Foundation. 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * NO WARRANTY 2862306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2962306a36Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3062306a36Sopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3162306a36Sopenharmony_ci * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3262306a36Sopenharmony_ci * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3362306a36Sopenharmony_ci * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3462306a36Sopenharmony_ci * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3562306a36Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3662306a36Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 3762306a36Sopenharmony_ci * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3862306a36Sopenharmony_ci * POSSIBILITY OF SUCH DAMAGES. 3962306a36Sopenharmony_ci * 4062306a36Sopenharmony_ci * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#32 $ 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * $FreeBSD$ 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#include "aic7xxx_osm.h" 4662306a36Sopenharmony_ci#include "aic7xxx_inline.h" 4762306a36Sopenharmony_ci#include "aic7xxx_93cx6.h" 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define ID_AIC7770 0x04907770 5062306a36Sopenharmony_ci#define ID_AHA_274x 0x04907771 5162306a36Sopenharmony_ci#define ID_AHA_284xB 0x04907756 /* BIOS enabled */ 5262306a36Sopenharmony_ci#define ID_AHA_284x 0x04907757 /* BIOS disabled*/ 5362306a36Sopenharmony_ci#define ID_OLV_274x 0x04907782 /* Olivetti OEM */ 5462306a36Sopenharmony_ci#define ID_OLV_274xD 0x04907783 /* Olivetti OEM (Differential) */ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic int aic7770_chip_init(struct ahc_softc *ahc); 5762306a36Sopenharmony_cistatic int aha2840_load_seeprom(struct ahc_softc *ahc); 5862306a36Sopenharmony_cistatic ahc_device_setup_t ahc_aic7770_VL_setup; 5962306a36Sopenharmony_cistatic ahc_device_setup_t ahc_aic7770_EISA_setup; 6062306a36Sopenharmony_cistatic ahc_device_setup_t ahc_aic7770_setup; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistruct aic7770_identity aic7770_ident_table[] = 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci { 6562306a36Sopenharmony_ci ID_AHA_274x, 6662306a36Sopenharmony_ci 0xFFFFFFFF, 6762306a36Sopenharmony_ci "Adaptec 274X SCSI adapter", 6862306a36Sopenharmony_ci ahc_aic7770_EISA_setup 6962306a36Sopenharmony_ci }, 7062306a36Sopenharmony_ci { 7162306a36Sopenharmony_ci ID_AHA_284xB, 7262306a36Sopenharmony_ci 0xFFFFFFFE, 7362306a36Sopenharmony_ci "Adaptec 284X SCSI adapter", 7462306a36Sopenharmony_ci ahc_aic7770_VL_setup 7562306a36Sopenharmony_ci }, 7662306a36Sopenharmony_ci { 7762306a36Sopenharmony_ci ID_AHA_284x, 7862306a36Sopenharmony_ci 0xFFFFFFFE, 7962306a36Sopenharmony_ci "Adaptec 284X SCSI adapter (BIOS Disabled)", 8062306a36Sopenharmony_ci ahc_aic7770_VL_setup 8162306a36Sopenharmony_ci }, 8262306a36Sopenharmony_ci { 8362306a36Sopenharmony_ci ID_OLV_274x, 8462306a36Sopenharmony_ci 0xFFFFFFFF, 8562306a36Sopenharmony_ci "Adaptec (Olivetti OEM) 274X SCSI adapter", 8662306a36Sopenharmony_ci ahc_aic7770_EISA_setup 8762306a36Sopenharmony_ci }, 8862306a36Sopenharmony_ci { 8962306a36Sopenharmony_ci ID_OLV_274xD, 9062306a36Sopenharmony_ci 0xFFFFFFFF, 9162306a36Sopenharmony_ci "Adaptec (Olivetti OEM) 274X Differential SCSI adapter", 9262306a36Sopenharmony_ci ahc_aic7770_EISA_setup 9362306a36Sopenharmony_ci }, 9462306a36Sopenharmony_ci /* Generic chip probes for devices we don't know 'exactly' */ 9562306a36Sopenharmony_ci { 9662306a36Sopenharmony_ci ID_AIC7770, 9762306a36Sopenharmony_ci 0xFFFFFFFF, 9862306a36Sopenharmony_ci "Adaptec aic7770 SCSI adapter", 9962306a36Sopenharmony_ci ahc_aic7770_EISA_setup 10062306a36Sopenharmony_ci } 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ciconst int ahc_num_aic7770_devs = ARRAY_SIZE(aic7770_ident_table); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistruct aic7770_identity * 10562306a36Sopenharmony_ciaic7770_find_device(uint32_t id) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci struct aic7770_identity *entry; 10862306a36Sopenharmony_ci int i; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci for (i = 0; i < ahc_num_aic7770_devs; i++) { 11162306a36Sopenharmony_ci entry = &aic7770_ident_table[i]; 11262306a36Sopenharmony_ci if (entry->full_id == (id & entry->id_mask)) 11362306a36Sopenharmony_ci return (entry); 11462306a36Sopenharmony_ci } 11562306a36Sopenharmony_ci return (NULL); 11662306a36Sopenharmony_ci} 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciint 11962306a36Sopenharmony_ciaic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry, u_int io) 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci int error; 12262306a36Sopenharmony_ci int have_seeprom; 12362306a36Sopenharmony_ci u_int hostconf; 12462306a36Sopenharmony_ci u_int irq; 12562306a36Sopenharmony_ci u_int intdef; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci error = entry->setup(ahc); 12862306a36Sopenharmony_ci have_seeprom = 0; 12962306a36Sopenharmony_ci if (error != 0) 13062306a36Sopenharmony_ci return (error); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci error = aic7770_map_registers(ahc, io); 13362306a36Sopenharmony_ci if (error != 0) 13462306a36Sopenharmony_ci return (error); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci /* 13762306a36Sopenharmony_ci * Before we continue probing the card, ensure that 13862306a36Sopenharmony_ci * its interrupts are *disabled*. We don't want 13962306a36Sopenharmony_ci * a misstep to hang the machine in an interrupt 14062306a36Sopenharmony_ci * storm. 14162306a36Sopenharmony_ci */ 14262306a36Sopenharmony_ci ahc_intr_enable(ahc, FALSE); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci ahc->description = entry->name; 14562306a36Sopenharmony_ci error = ahc_softc_init(ahc); 14662306a36Sopenharmony_ci if (error != 0) 14762306a36Sopenharmony_ci return (error); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci ahc->bus_chip_init = aic7770_chip_init; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci error = ahc_reset(ahc, /*reinit*/FALSE); 15262306a36Sopenharmony_ci if (error != 0) 15362306a36Sopenharmony_ci return (error); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci /* Make sure we have a valid interrupt vector */ 15662306a36Sopenharmony_ci intdef = ahc_inb(ahc, INTDEF); 15762306a36Sopenharmony_ci irq = intdef & VECTOR; 15862306a36Sopenharmony_ci switch (irq) { 15962306a36Sopenharmony_ci case 9: 16062306a36Sopenharmony_ci case 10: 16162306a36Sopenharmony_ci case 11: 16262306a36Sopenharmony_ci case 12: 16362306a36Sopenharmony_ci case 14: 16462306a36Sopenharmony_ci case 15: 16562306a36Sopenharmony_ci break; 16662306a36Sopenharmony_ci default: 16762306a36Sopenharmony_ci printk("aic7770_config: invalid irq setting %d\n", intdef); 16862306a36Sopenharmony_ci return (ENXIO); 16962306a36Sopenharmony_ci } 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci if ((intdef & EDGE_TRIG) != 0) 17262306a36Sopenharmony_ci ahc->flags |= AHC_EDGE_INTERRUPT; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci switch (ahc->chip & (AHC_EISA|AHC_VL)) { 17562306a36Sopenharmony_ci case AHC_EISA: 17662306a36Sopenharmony_ci { 17762306a36Sopenharmony_ci u_int biosctrl; 17862306a36Sopenharmony_ci u_int scsiconf; 17962306a36Sopenharmony_ci u_int scsiconf1; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci biosctrl = ahc_inb(ahc, HA_274_BIOSCTRL); 18262306a36Sopenharmony_ci scsiconf = ahc_inb(ahc, SCSICONF); 18362306a36Sopenharmony_ci scsiconf1 = ahc_inb(ahc, SCSICONF + 1); 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci /* Get the primary channel information */ 18662306a36Sopenharmony_ci if ((biosctrl & CHANNEL_B_PRIMARY) != 0) 18762306a36Sopenharmony_ci ahc->flags |= 1; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci if ((biosctrl & BIOSMODE) == BIOSDISABLED) { 19062306a36Sopenharmony_ci ahc->flags |= AHC_USEDEFAULTS; 19162306a36Sopenharmony_ci } else { 19262306a36Sopenharmony_ci if ((ahc->features & AHC_WIDE) != 0) { 19362306a36Sopenharmony_ci ahc->our_id = scsiconf1 & HWSCSIID; 19462306a36Sopenharmony_ci if (scsiconf & TERM_ENB) 19562306a36Sopenharmony_ci ahc->flags |= AHC_TERM_ENB_A; 19662306a36Sopenharmony_ci } else { 19762306a36Sopenharmony_ci ahc->our_id = scsiconf & HSCSIID; 19862306a36Sopenharmony_ci ahc->our_id_b = scsiconf1 & HSCSIID; 19962306a36Sopenharmony_ci if (scsiconf & TERM_ENB) 20062306a36Sopenharmony_ci ahc->flags |= AHC_TERM_ENB_A; 20162306a36Sopenharmony_ci if (scsiconf1 & TERM_ENB) 20262306a36Sopenharmony_ci ahc->flags |= AHC_TERM_ENB_B; 20362306a36Sopenharmony_ci } 20462306a36Sopenharmony_ci } 20562306a36Sopenharmony_ci if ((ahc_inb(ahc, HA_274_BIOSGLOBAL) & HA_274_EXTENDED_TRANS)) 20662306a36Sopenharmony_ci ahc->flags |= AHC_EXTENDED_TRANS_A|AHC_EXTENDED_TRANS_B; 20762306a36Sopenharmony_ci break; 20862306a36Sopenharmony_ci } 20962306a36Sopenharmony_ci case AHC_VL: 21062306a36Sopenharmony_ci { 21162306a36Sopenharmony_ci have_seeprom = aha2840_load_seeprom(ahc); 21262306a36Sopenharmony_ci break; 21362306a36Sopenharmony_ci } 21462306a36Sopenharmony_ci default: 21562306a36Sopenharmony_ci break; 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci if (have_seeprom == 0) { 21862306a36Sopenharmony_ci kfree(ahc->seep_config); 21962306a36Sopenharmony_ci ahc->seep_config = NULL; 22062306a36Sopenharmony_ci } 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci /* 22362306a36Sopenharmony_ci * Ensure autoflush is enabled 22462306a36Sopenharmony_ci */ 22562306a36Sopenharmony_ci ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~AUTOFLUSHDIS); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci /* Setup the FIFO threshold and the bus off time */ 22862306a36Sopenharmony_ci hostconf = ahc_inb(ahc, HOSTCONF); 22962306a36Sopenharmony_ci ahc_outb(ahc, BUSSPD, hostconf & DFTHRSH); 23062306a36Sopenharmony_ci ahc_outb(ahc, BUSTIME, (hostconf << 2) & BOFF); 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci ahc->bus_softc.aic7770_softc.busspd = hostconf & DFTHRSH; 23362306a36Sopenharmony_ci ahc->bus_softc.aic7770_softc.bustime = (hostconf << 2) & BOFF; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci /* 23662306a36Sopenharmony_ci * Generic aic7xxx initialization. 23762306a36Sopenharmony_ci */ 23862306a36Sopenharmony_ci error = ahc_init(ahc); 23962306a36Sopenharmony_ci if (error != 0) 24062306a36Sopenharmony_ci return (error); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci error = aic7770_map_int(ahc, irq); 24362306a36Sopenharmony_ci if (error != 0) 24462306a36Sopenharmony_ci return (error); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci ahc->init_level++; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci /* 24962306a36Sopenharmony_ci * Enable the board's BUS drivers 25062306a36Sopenharmony_ci */ 25162306a36Sopenharmony_ci ahc_outb(ahc, BCTL, ENABLE); 25262306a36Sopenharmony_ci return (0); 25362306a36Sopenharmony_ci} 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic int 25662306a36Sopenharmony_ciaic7770_chip_init(struct ahc_softc *ahc) 25762306a36Sopenharmony_ci{ 25862306a36Sopenharmony_ci ahc_outb(ahc, BUSSPD, ahc->bus_softc.aic7770_softc.busspd); 25962306a36Sopenharmony_ci ahc_outb(ahc, BUSTIME, ahc->bus_softc.aic7770_softc.bustime); 26062306a36Sopenharmony_ci ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~AUTOFLUSHDIS); 26162306a36Sopenharmony_ci ahc_outb(ahc, BCTL, ENABLE); 26262306a36Sopenharmony_ci return (ahc_chip_init(ahc)); 26362306a36Sopenharmony_ci} 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci/* 26662306a36Sopenharmony_ci * Read the 284x SEEPROM. 26762306a36Sopenharmony_ci */ 26862306a36Sopenharmony_cistatic int 26962306a36Sopenharmony_ciaha2840_load_seeprom(struct ahc_softc *ahc) 27062306a36Sopenharmony_ci{ 27162306a36Sopenharmony_ci struct seeprom_descriptor sd; 27262306a36Sopenharmony_ci struct seeprom_config *sc; 27362306a36Sopenharmony_ci int have_seeprom; 27462306a36Sopenharmony_ci uint8_t scsi_conf; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci sd.sd_ahc = ahc; 27762306a36Sopenharmony_ci sd.sd_control_offset = SEECTL_2840; 27862306a36Sopenharmony_ci sd.sd_status_offset = STATUS_2840; 27962306a36Sopenharmony_ci sd.sd_dataout_offset = STATUS_2840; 28062306a36Sopenharmony_ci sd.sd_chip = C46; 28162306a36Sopenharmony_ci sd.sd_MS = 0; 28262306a36Sopenharmony_ci sd.sd_RDY = EEPROM_TF; 28362306a36Sopenharmony_ci sd.sd_CS = CS_2840; 28462306a36Sopenharmony_ci sd.sd_CK = CK_2840; 28562306a36Sopenharmony_ci sd.sd_DO = DO_2840; 28662306a36Sopenharmony_ci sd.sd_DI = DI_2840; 28762306a36Sopenharmony_ci sc = ahc->seep_config; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci if (bootverbose) 29062306a36Sopenharmony_ci printk("%s: Reading SEEPROM...", ahc_name(ahc)); 29162306a36Sopenharmony_ci have_seeprom = ahc_read_seeprom(&sd, (uint16_t *)sc, 29262306a36Sopenharmony_ci /*start_addr*/0, sizeof(*sc)/2); 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci if (have_seeprom) { 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci if (ahc_verify_cksum(sc) == 0) { 29762306a36Sopenharmony_ci if(bootverbose) 29862306a36Sopenharmony_ci printk ("checksum error\n"); 29962306a36Sopenharmony_ci have_seeprom = 0; 30062306a36Sopenharmony_ci } else if (bootverbose) { 30162306a36Sopenharmony_ci printk("done.\n"); 30262306a36Sopenharmony_ci } 30362306a36Sopenharmony_ci } 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci if (!have_seeprom) { 30662306a36Sopenharmony_ci if (bootverbose) 30762306a36Sopenharmony_ci printk("%s: No SEEPROM available\n", ahc_name(ahc)); 30862306a36Sopenharmony_ci ahc->flags |= AHC_USEDEFAULTS; 30962306a36Sopenharmony_ci } else { 31062306a36Sopenharmony_ci /* 31162306a36Sopenharmony_ci * Put the data we've collected down into SRAM 31262306a36Sopenharmony_ci * where ahc_init will find it. 31362306a36Sopenharmony_ci */ 31462306a36Sopenharmony_ci int i; 31562306a36Sopenharmony_ci int max_targ; 31662306a36Sopenharmony_ci uint16_t discenable; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci max_targ = (ahc->features & AHC_WIDE) != 0 ? 16 : 8; 31962306a36Sopenharmony_ci discenable = 0; 32062306a36Sopenharmony_ci for (i = 0; i < max_targ; i++){ 32162306a36Sopenharmony_ci uint8_t target_settings; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci target_settings = (sc->device_flags[i] & CFXFER) << 4; 32462306a36Sopenharmony_ci if (sc->device_flags[i] & CFSYNCH) 32562306a36Sopenharmony_ci target_settings |= SOFS; 32662306a36Sopenharmony_ci if (sc->device_flags[i] & CFWIDEB) 32762306a36Sopenharmony_ci target_settings |= WIDEXFER; 32862306a36Sopenharmony_ci if (sc->device_flags[i] & CFDISC) 32962306a36Sopenharmony_ci discenable |= (0x01 << i); 33062306a36Sopenharmony_ci ahc_outb(ahc, TARG_SCSIRATE + i, target_settings); 33162306a36Sopenharmony_ci } 33262306a36Sopenharmony_ci ahc_outb(ahc, DISC_DSB, ~(discenable & 0xff)); 33362306a36Sopenharmony_ci ahc_outb(ahc, DISC_DSB + 1, ~((discenable >> 8) & 0xff)); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci ahc->our_id = sc->brtime_id & CFSCSIID; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci scsi_conf = (ahc->our_id & 0x7); 33862306a36Sopenharmony_ci if (sc->adapter_control & CFSPARITY) 33962306a36Sopenharmony_ci scsi_conf |= ENSPCHK; 34062306a36Sopenharmony_ci if (sc->adapter_control & CFRESETB) 34162306a36Sopenharmony_ci scsi_conf |= RESET_SCSI; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci if (sc->bios_control & CF284XEXTEND) 34462306a36Sopenharmony_ci ahc->flags |= AHC_EXTENDED_TRANS_A; 34562306a36Sopenharmony_ci /* Set SCSICONF info */ 34662306a36Sopenharmony_ci ahc_outb(ahc, SCSICONF, scsi_conf); 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci if (sc->adapter_control & CF284XSTERM) 34962306a36Sopenharmony_ci ahc->flags |= AHC_TERM_ENB_A; 35062306a36Sopenharmony_ci } 35162306a36Sopenharmony_ci return (have_seeprom); 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic int 35562306a36Sopenharmony_ciahc_aic7770_VL_setup(struct ahc_softc *ahc) 35662306a36Sopenharmony_ci{ 35762306a36Sopenharmony_ci int error; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci error = ahc_aic7770_setup(ahc); 36062306a36Sopenharmony_ci ahc->chip |= AHC_VL; 36162306a36Sopenharmony_ci return (error); 36262306a36Sopenharmony_ci} 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistatic int 36562306a36Sopenharmony_ciahc_aic7770_EISA_setup(struct ahc_softc *ahc) 36662306a36Sopenharmony_ci{ 36762306a36Sopenharmony_ci int error; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci error = ahc_aic7770_setup(ahc); 37062306a36Sopenharmony_ci ahc->chip |= AHC_EISA; 37162306a36Sopenharmony_ci return (error); 37262306a36Sopenharmony_ci} 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_cistatic int 37562306a36Sopenharmony_ciahc_aic7770_setup(struct ahc_softc *ahc) 37662306a36Sopenharmony_ci{ 37762306a36Sopenharmony_ci ahc->channel = 'A'; 37862306a36Sopenharmony_ci ahc->channel_b = 'B'; 37962306a36Sopenharmony_ci ahc->chip = AHC_AIC7770; 38062306a36Sopenharmony_ci ahc->features = AHC_AIC7770_FE; 38162306a36Sopenharmony_ci ahc->bugs |= AHC_TMODE_WIDEODD_BUG; 38262306a36Sopenharmony_ci ahc->flags |= AHC_PAGESCBS; 38362306a36Sopenharmony_ci ahc->instruction_ram_size = 448; 38462306a36Sopenharmony_ci return (0); 38562306a36Sopenharmony_ci} 386