1 /* $NetBSD: aic77xx.c,v 1.1 2000/03/15 02:06:18 fvdl Exp $ */ 2 3 /* 4 * Common routines for AHA-27/284X and aic7770 motherboard SCSI controllers. 5 * 6 * Copyright (c) 1994, 1995, 1996, 1997, 1998 Justin T. Gibbs. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice immediately at the beginning of the file, without modification, 14 * this list of conditions, and the following disclaimer. 15 * 2. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 22 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * $FreeBSD: src/sys/dev/aic7xxx/ahc_eisa.c,v 1.15 2000/01/29 14:22:19 peter Exp $ 31 */ 32 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/device.h> 36 37 #include <machine/bus.h> 38 #include <machine/intr.h> 39 40 #include <dev/scsipi/scsi_all.h> 41 #include <dev/scsipi/scsipi_all.h> 42 #include <dev/scsipi/scsiconf.h> 43 44 #include <dev/microcode/aic7xxx/aic7xxx_reg.h> 45 #include <dev/ic/aic7xxxvar.h> 46 #include <dev/ic/aic77xxreg.h> 47 #include <dev/ic/aic77xxvar.h> 48 49 /* 50 * Return irq setting of the board, otherwise -1. 51 */ 52 int 53 ahc_aic77xx_irq(iot, ioh) 54 bus_space_tag_t iot; 55 bus_space_handle_t ioh; 56 { 57 int irq; 58 u_int8_t intdef; 59 u_int8_t hcntrl; 60 61 /* Pause the card preseving the IRQ type */ 62 hcntrl = bus_space_read_1(iot, ioh, HCNTRL) & IRQMS; 63 bus_space_write_1(iot, ioh, HCNTRL, hcntrl | PAUSE); 64 65 intdef = bus_space_read_1(iot, ioh, INTDEF); 66 irq = (intdef & INTDEF_IRQ_MASK); 67 switch (irq) { 68 case 9: 69 case 10: 70 case 11: 71 case 12: 72 case 14: 73 case 15: 74 break; 75 default: 76 printf("ahc_aic77xx_irq: illegal irq setting %d\n", intdef); 77 return (-1); 78 } 79 80 return (irq); 81 } 82 83 int 84 ahc_aic77xx_attach(ahc) 85 struct ahc_softc *ahc; 86 { 87 char *id_string; 88 u_int8_t sblkctl; 89 u_int8_t sblkctl_orig; 90 u_int8_t hostconf; 91 92 /* 93 * See if we have a Rev E or higher aic7770. Anything below a 94 * Rev E will have a R/O autoflush disable configuration bit. 95 */ 96 sblkctl_orig = ahc_inb(ahc, SBLKCTL); 97 sblkctl = sblkctl_orig ^ AUTOFLUSHDIS; 98 ahc_outb(ahc, SBLKCTL, sblkctl); 99 sblkctl = ahc_inb(ahc, SBLKCTL); 100 if (sblkctl != sblkctl_orig) { 101 id_string = "aic7770 >= Rev E, "; 102 /* 103 * Ensure autoflush is enabled 104 */ 105 sblkctl &= ~AUTOFLUSHDIS; 106 ahc_outb(ahc, SBLKCTL, sblkctl); 107 } else 108 id_string = "aic7770 <= Rev C, "; 109 110 printf("%s: %s", ahc_name(ahc), id_string); 111 112 /* Setup the FIFO threshold and the bus off time */ 113 hostconf = ahc_inb(ahc, HOSTCONF); 114 ahc_outb(ahc, BUSSPD, hostconf & DFTHRSH); 115 ahc_outb(ahc, BUSTIME, (hostconf << 2) & BOFF); 116 117 /* 118 * Generic aic7xxx initialization. 119 */ 120 if (ahc_init(ahc)) { 121 /* 122 * The board's IRQ line is not yet enabled so it's safe 123 * to release the irq. 124 */ 125 return (ENXIO); 126 } 127 128 /* 129 * Enable the board's BUS drivers 130 */ 131 ahc_outb(ahc, BCTL, ENABLE); 132 133 /* Attach sub-devices - always succeeds */ 134 ahc_attach(ahc); 135 136 return 0; 137 } 138 139