diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2016-09-04 10:35:40 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2016-09-04 10:35:40 +0000 |
commit | b779d3e41287908c58a5b7f58cc193d4064de9ba (patch) | |
tree | 927b881661e273a79e15bc0d2f0c0dcde020f69a | |
parent | 0ef05abdf62cd780fa03ee6981a1c4026d135ab8 (diff) |
naddy discovered that bha no longer builds because it includes the now
deleted aha.h header. therefore bha must be dragged into the attic too.
-rw-r--r-- | share/man/man4/Makefile | 4 | ||||
-rw-r--r-- | share/man/man4/bha.4 | 80 | ||||
-rw-r--r-- | share/man/man4/eisa.4 | 6 | ||||
-rw-r--r-- | share/man/man4/isa.4 | 6 | ||||
-rw-r--r-- | share/man/man4/pci.4 | 6 | ||||
-rw-r--r-- | sys/dev/eisa/bha_eisa.c | 204 | ||||
-rw-r--r-- | sys/dev/eisa/files.eisa | 7 | ||||
-rw-r--r-- | sys/dev/ic/bha.c | 1445 | ||||
-rw-r--r-- | sys/dev/ic/bhareg.h | 512 | ||||
-rw-r--r-- | sys/dev/ic/bhavar.h | 128 | ||||
-rw-r--r-- | sys/dev/isa/bha_isa.c | 193 | ||||
-rw-r--r-- | sys/dev/isa/files.isa | 6 | ||||
-rw-r--r-- | sys/dev/pci/bha_pci.c | 156 | ||||
-rw-r--r-- | sys/dev/pci/files.pci | 6 |
14 files changed, 11 insertions, 2748 deletions
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index e8a6788da8e..88497738f9e 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.641 2016/09/03 21:37:28 tedu Exp $ +# $OpenBSD: Makefile,v 1.642 2016/09/04 10:35:39 tedu Exp $ MAN= aac.4 ac97.4 acphy.4 \ acpi.4 acpiac.4 acpials.4 acpiasus.4 acpibat.4 \ @@ -14,7 +14,7 @@ MAN= aac.4 ac97.4 acphy.4 \ asbtm.4 asmc.4 ast.4 atapiscsi.4 atphy.4 ath.4 athn.4 atu.4 atw.4 \ auacer.4 audio.4 \ aue.4 auglx.4 auich.4 auixp.4 autri.4 auvia.4 axe.4 axen.4 azalia.4 \ - bce.4 berkwdt.4 bge.4 bha.4 bio.4 bktr.4 bmtphy.4 bnx.4 \ + bce.4 berkwdt.4 bge.4 bio.4 bktr.4 bmtphy.4 bnx.4 \ boca.4 bpf.4 brgphy.4 bridge.4 brswphy.4 bwi.4 bytgpio.4 \ cac.4 cas.4 cardbus.4 carp.4 cd.4 cdce.4 cfxga.4 \ ch.4 chvgpio.4 ciphy.4 ciss.4 clcs.4 clct.4 cmpci.4 \ diff --git a/share/man/man4/bha.4 b/share/man/man4/bha.4 deleted file mode 100644 index e06cc326c9b..00000000000 --- a/share/man/man4/bha.4 +++ /dev/null @@ -1,80 +0,0 @@ -.\" $OpenBSD: bha.4,v 1.11 2012/08/14 01:08:19 dlg Exp $ -.\" $NetBSD: bha.4,v 1.10 1999/12/17 16:23:21 abs Exp $ -.\" -.\" Copyright (c) 1994 James A. Jegers -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.Dd $Mdocdate: August 14 2012 $ -.Dt BHA 4 -.Os -.Sh NAME -.Nm bha -.Nd Buslogic SCSI interface -.Sh SYNOPSIS -.Cd "bha0 at isa? port 0x330" -.Cd "bha1 at isa? port 0x334" -.\" .Cd "bha* at eisa?" -.Cd "bha* at pci?" -.Sh DESCRIPTION -The -.Nm bha -driver supports the following -.Tn Buslogic -.Tn SCSI -adapters: -.Pp -.Bl -tag -width Ds -offset indent -compact -.It Tn Buslogic ISA BT-445 -.It Tn Buslogic EISA BT-74x -(supported in ISA compatibility mode only) -.It Tn Buslogic PCI BT-9[45][68] -.El -.Sh SEE ALSO -.Xr cd 4 , -.Xr ch 4 , -.\" .Xr eisa 4 , -.Xr intro 4 , -.Xr isa 4 , -.Xr pci 4 , -.Xr scsi 4 , -.Xr sd 4 , -.Xr st 4 , -.Xr uk 4 -.Sh HISTORY -In -.Ox 3.0 -and earlier, this driver was named -.Nm bt -but was renamed to -.Nm bha -in later releases. -.Sh BUGS -The -.Tn Buslogic -BT-930 is not supported in this driver. -.Pp -The -.Tn Buslogic -BT-445S has a problem in early hardware and firmware revisions -which prevents proper operation on a system with more than 16MB of RAM. -Hardware revision D and firmware revision 3.37 should be considered minimum -requirements for using this board on systems configured in this manner. diff --git a/share/man/man4/eisa.4 b/share/man/man4/eisa.4 index 2ba226e0b3f..74ee8755432 100644 --- a/share/man/man4/eisa.4 +++ b/share/man/man4/eisa.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: eisa.4,v 1.21 2016/09/03 21:37:29 tedu Exp $ +.\" $OpenBSD: eisa.4,v 1.22 2016/09/04 10:35:39 tedu Exp $ .\" $NetBSD: eisa.4,v 1.10 2001/09/11 22:52:52 wiz Exp $ .\" .\" Copyright (c) 1997 Jonathan Stone @@ -29,7 +29,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: September 3 2016 $ +.Dd $Mdocdate: September 4 2016 $ .Dt EISA 4 .Os .Sh NAME @@ -72,8 +72,6 @@ DPT EATA SCSI RAID controller .Bl -tag -width 12n -offset ind -compact .It Xr ahc 4 Adaptec VL/EISA/PCI SCSI interface -.It Xr bha 4 -Buslogic SCSI interface .It Xr uha 4 Ultrastor SCSI interface .El diff --git a/share/man/man4/isa.4 b/share/man/man4/isa.4 index 57a4394324b..6774a8f3fb4 100644 --- a/share/man/man4/isa.4 +++ b/share/man/man4/isa.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: isa.4,v 1.77 2016/09/03 21:37:29 tedu Exp $ +.\" $OpenBSD: isa.4,v 1.78 2016/09/04 10:35:39 tedu Exp $ .\" $NetBSD: isa.4,v 1.19 2000/03/18 16:54:37 augustss Exp $ .\" .\" Copyright (c) 2000 Theo de Raadt. All rights reserved. @@ -31,7 +31,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: September 3 2016 $ +.Dd $Mdocdate: September 4 2016 $ .Dt ISA 4 .Os .Sh NAME @@ -85,8 +85,6 @@ Note that not all architectures support all devices. .Bl -tag -width 12n -offset ind -compact .It Xr aic 4 Adaptec AIC-6260 and AIC-6360 SCSI interface -.It Xr bha 4 -Buslogic SCSI interface .It Xr dpt 4 DPT EATA SCSI RAID controller .It Xr uha 4 diff --git a/share/man/man4/pci.4 b/share/man/man4/pci.4 index 5d5618e3271..aab90b7fccb 100644 --- a/share/man/man4/pci.4 +++ b/share/man/man4/pci.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: pci.4,v 1.352 2016/08/31 16:54:33 jmc Exp $ +.\" $OpenBSD: pci.4,v 1.353 2016/09/04 10:35:39 tedu Exp $ .\" $NetBSD: pci.4,v 1.29 2000/04/01 00:32:23 tsarna Exp $ .\" .\" Copyright (c) 2000 Theo de Raadt. All rights reserved. @@ -31,7 +31,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 31 2016 $ +.Dd $Mdocdate: September 4 2016 $ .Dt PCI 4 .Os .Sh NAME @@ -103,8 +103,6 @@ AdvanSys PCI SCSI interface Adaptec VL/EISA/PCI SCSI interface .It Xr ahd 4 Adaptec PCI/PCI-X AIC79xx-based Ultra320 SCSI interface -.It Xr bha 4 -Buslogic SCSI interface .It Xr iha 4 Initio INIC-940/950 based PCI SCSI interface .It Xr mpi 4 diff --git a/sys/dev/eisa/bha_eisa.c b/sys/dev/eisa/bha_eisa.c deleted file mode 100644 index 377d4b43c3b..00000000000 --- a/sys/dev/eisa/bha_eisa.c +++ /dev/null @@ -1,204 +0,0 @@ -/* $OpenBSD: bha_eisa.c,v 1.6 2009/03/29 21:53:52 sthen Exp $ */ -/* $NetBSD: bha_eisa.c,v 1.16 1998/08/15 10:10:49 mycroft Exp $ */ - -/*- - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/device.h> - -#include <machine/bus.h> -#include <machine/intr.h> - -#include <scsi/scsi_all.h> -#include <scsi/scsiconf.h> - -#include <dev/eisa/eisavar.h> -#include <dev/eisa/eisadevs.h> - -#include <dev/ic/bhareg.h> -#include <dev/ic/bhavar.h> - -#define BHA_EISA_SLOT_OFFSET 0x0c80 -#define BHA_EISA_IOSIZE 0x0010 -#define BHA_ISA_IOSIZE 0x0004 - -#define BHA_EISA_IOCONF 0x0c - -int bha_eisa_address(bus_space_tag_t, bus_space_handle_t, int *); -int bha_eisa_match(struct device *, void *, void *); -void bha_eisa_attach(struct device *, struct device *, void *); - -struct cfattach bha_eisa_ca = { - sizeof(struct bha_softc), bha_eisa_match, bha_eisa_attach -}; - -int -bha_eisa_address(iot, ioh, portp) - bus_space_tag_t iot; - bus_space_handle_t ioh; - int *portp; -{ - int port; - - switch (bus_space_read_1(iot, ioh, BHA_EISA_IOCONF) & 0x07) { - case 0x00: - port = 0x330; - break; - case 0x01: - port = 0x334; - break; - case 0x02: - port = 0x230; - break; - case 0x03: - port = 0x234; - break; - case 0x04: - port = 0x130; - break; - case 0x05: - port = 0x134; - break; - default: - return (1); - } - - *portp = port; - return (0); -} - -/* - * Check the slots looking for a board we recognise - * If we find one, note its address (slot) and call - * the actual probe routine to check it out. - */ -int -bha_eisa_match(parent, match, aux) - struct device *parent; - void *aux, *match; -{ - struct eisa_attach_args *ea = aux; - bus_space_tag_t iot = ea->ea_iot; - bus_space_handle_t ioh, ioh2; - int port; - int rv; - - /* must match one of our known ID strings */ - if (strcmp(ea->ea_idstring, "BUS4201") && - strcmp(ea->ea_idstring, "BUS4202")) - return (0); - - if (bus_space_map(iot, - EISA_SLOT_ADDR(ea->ea_slot) + BHA_EISA_SLOT_OFFSET, BHA_EISA_IOSIZE, - 0, &ioh)) - return (0); - - if (bha_eisa_address(iot, ioh, &port) || - bus_space_map(iot, port, BHA_ISA_IOSIZE, 0, &ioh2)) { - bus_space_unmap(iot, ioh, BHA_EISA_IOSIZE); - return (0); - } - - rv = bha_find(iot, ioh2, NULL); - - bus_space_unmap(iot, ioh2, BHA_ISA_IOSIZE); - bus_space_unmap(iot, ioh, BHA_EISA_IOSIZE); - - return (rv); -} - -/* - * Attach all the sub-devices we can find - */ -void -bha_eisa_attach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - struct eisa_attach_args *ea = aux; - struct bha_softc *sc = (void *)self; - bus_space_tag_t iot = ea->ea_iot; - bus_space_handle_t ioh, ioh2; - int port; - struct bha_probe_data bpd; - eisa_chipset_tag_t ec = ea->ea_ec; - eisa_intr_handle_t ih; - const char *model, *intrstr; - - if (!strcmp(ea->ea_idstring, "BUS4201")) - model = EISA_PRODUCT_BUS4201; - else if (!strcmp(ea->ea_idstring, "BUS4202")) - model = EISA_PRODUCT_BUS4202; - else - model = "unknown model!"; - - if (bus_space_map(iot, - EISA_SLOT_ADDR(ea->ea_slot) + BHA_EISA_SLOT_OFFSET, BHA_EISA_IOSIZE, - 0, &ioh)) { - printf(": can't map EISA slot\n"); - return; - } - - if (bha_eisa_address(iot, ioh, &port) || - bus_space_map(iot, port, BHA_ISA_IOSIZE, 0, &ioh2)) { - printf(": can't map ISA address\n"); - return; - } - - sc->sc_iot = iot; - sc->sc_ioh = ioh2; - sc->sc_dmat = ea->ea_dmat; - if (!bha_find(iot, ioh2, &bpd)) { - printf(": bha_find failed\n"); - return; - } - - sc->sc_dmaflags = 0; - - if (eisa_intr_map(ec, bpd.sc_irq, &ih)) { - printf(": couldn't map interrupt (%d)\n", bpd.sc_irq); - return; - } - intrstr = eisa_intr_string(ec, ih); - sc->sc_ih = eisa_intr_establish(ec, ih, IST_LEVEL, IPL_BIO, - bha_intr, sc, sc->sc_dev.dv_xname); - if (sc->sc_ih == NULL) { - printf(": couldn't establish interrupt"); - if (intrstr != NULL) - printf(" at %s", intrstr); - printf("\n"); - return; - } - printf(": %s, %s\n", intrstr, model); - - bha_attach(sc, &bpd); -} diff --git a/sys/dev/eisa/files.eisa b/sys/dev/eisa/files.eisa index 6b466ef330e..eceea7a4461 100644 --- a/sys/dev/eisa/files.eisa +++ b/sys/dev/eisa/files.eisa @@ -1,4 +1,4 @@ -# $OpenBSD: files.eisa,v 1.12 2016/09/03 21:37:29 tedu Exp $ +# $OpenBSD: files.eisa,v 1.13 2016/09/04 10:35:39 tedu Exp $ # $NetBSD: files.eisa,v 1.12 1996/09/01 00:10:55 mycroft Exp $ # # Config.new file and device description for machine-independent EISA code. @@ -14,11 +14,6 @@ file dev/eisa/eisa.c eisa needs-flag attach ahc at eisa with ahc_eisa file dev/eisa/ahc_eisa.c ahc_eisa -# BusLogic BT-7xx EISA family -# device declaration in sys/conf/files -attach bha at eisa with bha_eisa -file dev/eisa/bha_eisa.c bha_eisa - # DPT EATA SCSI controllers # device declaration in sys/conf/files attach dpt at eisa with dpt_eisa diff --git a/sys/dev/ic/bha.c b/sys/dev/ic/bha.c deleted file mode 100644 index a1083b11956..00000000000 --- a/sys/dev/ic/bha.c +++ /dev/null @@ -1,1445 +0,0 @@ -/* $OpenBSD: bha.c,v 1.31 2016/03/14 23:08:05 krw Exp $ */ -/* $NetBSD: bha.c,v 1.27 1998/11/19 21:53:00 thorpej Exp $ */ - -#undef BHADEBUG -#ifdef DDB -#define integrate -#else -#define integrate static inline -#endif - -/*- - * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace - * Simulation Facility, NASA Ames Research Center. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Originally written by Julian Elischer (julian@tfs.com) - * for TRW Financial Systems for use under the MACH(2.5) operating system. - * - * TRW Financial Systems, in accordance with their agreement with Carnegie - * Mellon University, makes this software available to CMU to distribute - * or use in any manner that they see fit as long as this message is kept with - * the software. For this reason TFS also grants any other persons or - * organisations permission to use or modify this software. - * - * TFS supplies this software to be publicly redistributed - * on the understanding that TFS is not responsible for the correct - * functioning of this software in any circumstances. - */ - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/errno.h> -#include <sys/ioctl.h> -#include <sys/device.h> -#include <sys/malloc.h> -#include <sys/buf.h> - -#include <machine/bus.h> -#include <machine/intr.h> - -#include <scsi/scsi_all.h> -#include <scsi/scsiconf.h> - -#include <dev/ic/bhareg.h> -#include <dev/ic/bhavar.h> - -#define BHA_MAXXFER ((BHA_NSEG - 1) << PGSHIFT) -#define ISWIDE(sc) ((sc)->sc_iswide) - -#ifdef BHADEBUG -int bha_debug = 1; -#endif /* BHADEBUG */ - -integrate void bha_finish_ccbs(struct bha_softc *); -integrate void bha_reset_ccb(struct bha_softc *, struct bha_ccb *); -void bha_ccb_free(void *, void *); -integrate int bha_init_ccb(struct bha_softc *, struct bha_ccb *); -void *bha_ccb_alloc(void *); -struct bha_ccb *bha_ccb_phys_kv(struct bha_softc *, u_long); -void bha_queue_ccb(struct bha_softc *, struct bha_ccb *); -void bha_collect_mbo(struct bha_softc *); -void bha_start_ccbs(struct bha_softc *); -void bha_done(struct bha_softc *, struct bha_ccb *); -int bha_init(struct bha_softc *); -void bhaminphys(struct buf *, struct scsi_link *); -void bha_scsi_cmd(struct scsi_xfer *); -int bha_poll(struct bha_softc *, struct scsi_xfer *, int); -void bha_timeout(void *arg); -int bha_create_ccbs(struct bha_softc *, struct bha_ccb *, int); - -struct cfdriver bha_cd = { - NULL, "bha", DV_DULL -}; - -#define BHA_RESET_TIMEOUT 2000 /* time to wait for reset (mSec) */ -#define BHA_ABORT_TIMEOUT 2000 /* time to wait for abort (mSec) */ - -/* - * bha_cmd(iot, ioh, sc, icnt, ibuf, ocnt, obuf) - * - * Activate Adapter command - * icnt: number of args (outbound bytes including opcode) - * ibuf: argument buffer - * ocnt: number of expected returned bytes - * obuf: result buffer - * wait: number of seconds to wait for response - * - * Performs an adapter command through the ports. Not to be confused with a - * scsi command, which is read in via the dma; one of the adapter commands - * tells it to read in a scsi command. - */ -int -bha_cmd(iot, ioh, sc, icnt, ibuf, ocnt, obuf) - bus_space_tag_t iot; - bus_space_handle_t ioh; - struct bha_softc *sc; - int icnt, ocnt; - u_char *ibuf, *obuf; -{ - const char *name; - register int i; - int wait; - u_char sts; - u_char opcode = ibuf[0]; - - if (sc != NULL) - name = sc->sc_dev.dv_xname; - else - name = "(bha probe)"; - - /* - * Calculate a reasonable timeout for the command. - */ - switch (opcode) { - case BHA_INQUIRE_DEVICES: - case BHA_INQUIRE_DEVICES_2: - wait = 90 * 20000; - break; - default: - wait = 1 * 20000; - break; - } - - /* - * Wait for the adapter to go idle, unless it's one of - * the commands which don't need this - */ - if (opcode != BHA_MBO_INTR_EN) { - for (i = 20000; i; i--) { /* 1 sec? */ - sts = bus_space_read_1(iot, ioh, BHA_STAT_PORT); - if (sts & BHA_STAT_IDLE) - break; - delay(50); - } - if (!i) { - printf("%s: bha_cmd, host not idle(0x%x)\n", - name, sts); - return (1); - } - } - /* - * Now that it is idle, if we expect output, preflush the - * queue feeding to us. - */ - if (ocnt) { - while ((bus_space_read_1(iot, ioh, BHA_STAT_PORT)) & - BHA_STAT_DF) - bus_space_read_1(iot, ioh, BHA_DATA_PORT); - } - /* - * Output the command and the number of arguments given - * for each byte, first check the port is empty. - */ - while (icnt--) { - for (i = wait; i; i--) { - sts = bus_space_read_1(iot, ioh, BHA_STAT_PORT); - if (!(sts & BHA_STAT_CDF)) - break; - delay(50); - } - if (!i) { - if (opcode != BHA_INQUIRE_REVISION) - printf("%s: bha_cmd, cmd/data port full\n", - name); - goto bad; - } - bus_space_write_1(iot, ioh, BHA_CMD_PORT, *ibuf++); - } - /* - * If we expect input, loop that many times, each time, - * looking for the data register to have valid data - */ - while (ocnt--) { - for (i = wait; i; i--) { - sts = bus_space_read_1(iot, ioh, BHA_STAT_PORT); - if (sts & BHA_STAT_DF) - break; - delay(50); - } - if (!i) { - if (opcode != BHA_INQUIRE_REVISION) - printf("%s: bha_cmd, cmd/data port empty %d\n", - name, ocnt); - goto bad; - } - *obuf++ = bus_space_read_1(iot, ioh, BHA_DATA_PORT); - } - /* - * Wait for the board to report a finished instruction. - * We may get an extra interrupt for the HACC signal, but this is - * unimportant. - */ - if (opcode != BHA_MBO_INTR_EN && opcode != BHA_MODIFY_IOPORT) { - for (i = 20000; i; i--) { /* 1 sec? */ - sts = bus_space_read_1(iot, ioh, BHA_INTR_PORT); - /* XXX Need to save this in the interrupt handler? */ - if (sts & BHA_INTR_HACC) - break; - delay(50); - } - if (!i) { - printf("%s: bha_cmd, host not finished(0x%x)\n", - name, sts); - return (1); - } - } - bus_space_write_1(iot, ioh, BHA_CTRL_PORT, BHA_CTRL_IRST); - return (0); - -bad: - bus_space_write_1(iot, ioh, BHA_CTRL_PORT, BHA_CTRL_SRST); - return (1); -} - -/* - * Attach all the sub-devices we can find - */ -void -bha_attach(sc, bpd) - struct bha_softc *sc; - struct bha_probe_data *bpd; -{ - struct scsibus_attach_args saa; - int s; - - TAILQ_INIT(&sc->sc_free_ccb); - TAILQ_INIT(&sc->sc_waiting_ccb); - - mtx_init(&sc->sc_ccb_mtx, IPL_BIO); - scsi_iopool_init(&sc->sc_iopool, sc, bha_ccb_alloc, bha_ccb_free); - - /* - * Fill in the adapter. - */ - sc->sc_adapter.scsi_cmd = bha_scsi_cmd; - sc->sc_adapter.scsi_minphys = bhaminphys; - - /* - * fill in the prototype scsi_link. - */ - sc->sc_link.adapter_softc = sc; - sc->sc_link.adapter_target = bpd->sc_scsi_dev; - sc->sc_link.adapter = &sc->sc_adapter; - sc->sc_link.openings = 4; - sc->sc_link.pool = &sc->sc_iopool; - - s = splbio(); - bha_inquire_setup_information(sc); - - printf("%s: model BT-%s, firmware %s\n", sc->sc_dev.dv_xname, - sc->sc_model, sc->sc_firmware); - - if (bha_init(sc) != 0) { - /* Error during initialization! */ - splx(s); - return; - } - - splx(s); - - bzero(&saa, sizeof(saa)); - saa.saa_sc_link = &sc->sc_link; - - /* - * ask the adapter what subunits are present - */ - config_found(&sc->sc_dev, &saa, scsiprint); -} - -integrate void -bha_finish_ccbs(sc) - struct bha_softc *sc; -{ - struct bha_mbx_in *wmbi; - struct bha_ccb *ccb; - int i; - - wmbi = wmbx->tmbi; - - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - - if (wmbi->comp_stat == BHA_MBI_FREE) { - for (i = 0; i < BHA_MBX_SIZE; i++) { - if (wmbi->comp_stat != BHA_MBI_FREE) { - printf("%s: mbi not in round-robin order\n", - sc->sc_dev.dv_xname); - goto AGAIN; - } - bha_nextmbx(wmbi, wmbx, mbi); - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_POSTREAD); - } -#ifdef BHADIAGnot - printf("%s: mbi interrupt with no full mailboxes\n", - sc->sc_dev.dv_xname); -#endif - return; - } - -AGAIN: - do { - ccb = bha_ccb_phys_kv(sc, phystol(wmbi->ccb_addr)); - if (!ccb) { - printf("%s: bad mbi ccb pointer; skipping\n", - sc->sc_dev.dv_xname); - goto next; - } - - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - -#ifdef BHADEBUG - if (bha_debug) { - u_int8_t *cp = ccb->scsi_cmd.bytes; - printf("op=%x %x %x %x %x %x\n", - ccb->scsi_cmd.opcode, - cp[0], cp[1], cp[2], cp[3], cp[4]); - printf("stat %x for mbi addr = 0x%08x, ", - wmbi->comp_stat, wmbi); - printf("ccb addr = 0x%x\n", ccb); - } -#endif /* BHADEBUG */ - - switch (wmbi->comp_stat) { - case BHA_MBI_OK: - case BHA_MBI_ERROR: - if ((ccb->flags & CCB_ABORT) != 0) { - /* - * If we already started an abort, wait for it - * to complete before clearing the CCB. We - * could instead just clear CCB_SENDING, but - * what if the mailbox was already received? - * The worst that happens here is that we clear - * the CCB a bit later than we need to. BFD. - */ - goto next; - } - break; - - case BHA_MBI_ABORT: - case BHA_MBI_UNKNOWN: - /* - * Even if the CCB wasn't found, we clear it anyway. - * See preceding comment. - */ - break; - - default: - printf("%s: bad mbi status %02x; skipping\n", - sc->sc_dev.dv_xname, wmbi->comp_stat); - goto next; - } - - timeout_del(&ccb->xs->stimeout); - bha_done(sc, ccb); - - next: - wmbi->comp_stat = BHA_MBI_FREE; - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); - bha_nextmbx(wmbi, wmbx, mbi); - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - } while (wmbi->comp_stat != BHA_MBI_FREE); - - wmbx->tmbi = wmbi; -} - -/* - * Catch an interrupt from the adaptor - */ -int -bha_intr(arg) - void *arg; -{ - struct bha_softc *sc = arg; - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - u_char sts; - -#ifdef BHADEBUG - printf("%s: bha_intr ", sc->sc_dev.dv_xname); -#endif /* BHADEBUG */ - - /* - * First acknowledge the interrupt, Then if it's not telling about - * a completed operation just return. - */ - sts = bus_space_read_1(iot, ioh, BHA_INTR_PORT); - if ((sts & BHA_INTR_ANYINTR) == 0) - return (0); - bus_space_write_1(iot, ioh, BHA_CTRL_PORT, BHA_CTRL_IRST); - -#ifdef BHADIAG - /* Make sure we clear CCB_SENDING before finishing a CCB. */ - bha_collect_mbo(sc); -#endif - - /* Mail box out empty? */ - if (sts & BHA_INTR_MBOA) { - struct bha_toggle toggle; - - toggle.cmd.opcode = BHA_MBO_INTR_EN; - toggle.cmd.enable = 0; - bha_cmd(iot, ioh, sc, - sizeof(toggle.cmd), (u_char *)&toggle.cmd, - 0, NULL); - bha_start_ccbs(sc); - } - - /* Mail box in full? */ - if (sts & BHA_INTR_MBIF) - bha_finish_ccbs(sc); - - return (1); -} - -integrate void -bha_reset_ccb(sc, ccb) - struct bha_softc *sc; - struct bha_ccb *ccb; -{ - - ccb->flags = 0; -} - -/* - * A ccb is put onto the free list. - */ -void -bha_ccb_free(xsc, xccb) - void *xsc, *xccb; -{ - struct bha_softc *sc = xsc; - struct bha_ccb *ccb = xccb; - - bha_reset_ccb(sc, ccb); - - mtx_enter(&sc->sc_ccb_mtx); - TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, chain); - mtx_leave(&sc->sc_ccb_mtx); -} - -integrate int -bha_init_ccb(sc, ccb) - struct bha_softc *sc; - struct bha_ccb *ccb; -{ - bus_dma_tag_t dmat = sc->sc_dmat; - int hashnum, error; - - /* - * Create the DMA map for this CCB. - */ - error = bus_dmamap_create(dmat, BHA_MAXXFER, BHA_NSEG, BHA_MAXXFER, - 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW | sc->sc_dmaflags, - &ccb->dmamap_xfer); - if (error) { - printf("%s: unable to create ccb DMA map, error = %d\n", - sc->sc_dev.dv_xname, error); - return (error); - } - - /* - * put in the phystokv hash table - * Never gets taken out. - */ - ccb->hashkey = sc->sc_dmamap_control->dm_segs[0].ds_addr + - BHA_CCB_OFF(ccb); - hashnum = CCB_HASH(ccb->hashkey); - ccb->nexthash = sc->sc_ccbhash[hashnum]; - sc->sc_ccbhash[hashnum] = ccb; - bha_reset_ccb(sc, ccb); - return (0); -} - -/* - * Create a set of ccbs and add them to the free list. Called once - * by bha_init(). We return the number of CCBs successfully created. - */ -int -bha_create_ccbs(sc, ccbstore, count) - struct bha_softc *sc; - struct bha_ccb *ccbstore; - int count; -{ - struct bha_ccb *ccb; - int i, error; - - for (i = 0; i < count; i++) { - ccb = &ccbstore[i]; - if ((error = bha_init_ccb(sc, ccb)) != 0) { - printf("%s: unable to initialize ccb, error = %d\n", - sc->sc_dev.dv_xname, error); - goto out; - } - TAILQ_INSERT_TAIL(&sc->sc_free_ccb, ccb, chain); - } - out: - return (i); -} - -/* - * Get a free ccb - */ -void * -bha_ccb_alloc(xsc) - void *xsc; -{ - struct bha_softc *sc = xsc; - struct bha_ccb *ccb; - - mtx_enter(&sc->sc_ccb_mtx); - ccb = TAILQ_FIRST(&sc->sc_free_ccb); - if (ccb) { - TAILQ_REMOVE(&sc->sc_free_ccb, ccb, chain); - ccb->flags |= CCB_ALLOC; - } - mtx_leave(&sc->sc_ccb_mtx); - - return (ccb); -} - -/* - * Given a physical address, find the ccb that it corresponds to. - */ -struct bha_ccb * -bha_ccb_phys_kv(sc, ccb_phys) - struct bha_softc *sc; - u_long ccb_phys; -{ - int hashnum = CCB_HASH(ccb_phys); - struct bha_ccb *ccb = sc->sc_ccbhash[hashnum]; - - while (ccb) { - if (ccb->hashkey == ccb_phys) - break; - ccb = ccb->nexthash; - } - return (ccb); -} - -/* - * Queue a CCB to be sent to the controller, and send it if possible. - */ -void -bha_queue_ccb(sc, ccb) - struct bha_softc *sc; - struct bha_ccb *ccb; -{ - - timeout_set(&ccb->xs->stimeout, bha_timeout, ccb); - TAILQ_INSERT_TAIL(&sc->sc_waiting_ccb, ccb, chain); - bha_start_ccbs(sc); -} - -/* - * Garbage collect mailboxes that are no longer in use. - */ -void -bha_collect_mbo(sc) - struct bha_softc *sc; -{ - struct bha_mbx_out *wmbo; /* Mail Box Out pointer */ -#ifdef BHADIAG - struct bha_ccb *ccb; -#endif - - wmbo = wmbx->cmbo; - - while (sc->sc_mbofull > 0) { - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - if (wmbo->cmd != BHA_MBO_FREE) - break; - -#ifdef BHADIAG - ccb = bha_ccb_phys_kv(sc, phystol(wmbo->ccb_addr)); - ccb->flags &= ~CCB_SENDING; -#endif - - --sc->sc_mbofull; - bha_nextmbx(wmbo, wmbx, mbo); - } - - wmbx->cmbo = wmbo; -} - -/* - * Send as many CCBs as we have empty mailboxes for. - */ -void -bha_start_ccbs(sc) - struct bha_softc *sc; -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - struct bha_mbx_out *wmbo; /* Mail Box Out pointer */ - struct bha_ccb *ccb; - struct scsi_xfer *xs; - - wmbo = wmbx->tmbo; - - while ((ccb = TAILQ_FIRST(&sc->sc_waiting_ccb)) != NULL) { - - xs = ccb->xs; - if (sc->sc_mbofull >= BHA_MBX_SIZE) { - bha_collect_mbo(sc); - if (sc->sc_mbofull >= BHA_MBX_SIZE) { - struct bha_toggle toggle; - - toggle.cmd.opcode = BHA_MBO_INTR_EN; - toggle.cmd.enable = 1; - bha_cmd(iot, ioh, sc, - sizeof(toggle.cmd), (u_char *)&toggle.cmd, - 0, NULL); - break; - } - } - - TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain); -#ifdef BHADIAG - ccb->flags |= CCB_SENDING; -#endif - - /* Link ccb to mbo. */ - ltophys(sc->sc_dmamap_control->dm_segs[0].ds_addr + - BHA_CCB_OFF(ccb), wmbo->ccb_addr); - if (ccb->flags & CCB_ABORT) - wmbo->cmd = BHA_MBO_ABORT; - else - wmbo->cmd = BHA_MBO_START; - - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); - - /* Tell the card to poll immediately. */ - bus_space_write_1(iot, ioh, BHA_CMD_PORT, BHA_START_SCSI); - - if ((xs->flags & SCSI_POLL) == 0) - timeout_add_msec(&xs->stimeout, ccb->timeout); - - ++sc->sc_mbofull; - bha_nextmbx(wmbo, wmbx, mbo); - } - - wmbx->tmbo = wmbo; -} - -/* - * We have a ccb which has been processed by the - * adaptor, now we look to see how the operation - * went. Wake up the owner if waiting - */ -void -bha_done(sc, ccb) - struct bha_softc *sc; - struct bha_ccb *ccb; -{ - bus_dma_tag_t dmat = sc->sc_dmat; - struct scsi_sense_data *s1, *s2; - struct scsi_xfer *xs = ccb->xs; - - SC_DEBUG(xs->sc_link, SDEV_DB2, ("bha_done\n")); - - /* - * If we were a data transfer, unload the map that described - * the data buffer. - */ - if (xs->datalen) { - bus_dmamap_sync(dmat, ccb->dmamap_xfer, - 0, ccb->dmamap_xfer->dm_mapsize, - (xs->flags & SCSI_DATA_IN) ? BUS_DMASYNC_POSTREAD : - BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(dmat, ccb->dmamap_xfer); - } - - /* - * Otherwise, put the results of the operation - * into the xfer and call whoever started it - */ -#ifdef BHADIAG - if (ccb->flags & CCB_SENDING) { - panic("%s: exiting ccb still in transit!", - sc->sc_dev.dv_xname); - return; - } -#endif - if ((ccb->flags & CCB_ALLOC) == 0) { - panic("%s: exiting ccb not allocated!", - sc->sc_dev.dv_xname); - return; - } - if (xs->error == XS_NOERROR) { - if (ccb->host_stat != BHA_OK) { - switch (ccb->host_stat) { - case BHA_SEL_TIMEOUT: /* No response */ - xs->error = XS_SELTIMEOUT; - break; - default: /* Other scsi protocol messes */ - printf("%s: host_stat %x\n", - sc->sc_dev.dv_xname, ccb->host_stat); - xs->error = XS_DRIVER_STUFFUP; - break; - } - } else if (ccb->target_stat != SCSI_OK) { - switch (ccb->target_stat) { - case SCSI_CHECK: - s1 = &ccb->scsi_sense; - s2 = &xs->sense; - *s2 = *s1; - xs->error = XS_SENSE; - break; - case SCSI_BUSY: - xs->error = XS_BUSY; - break; - default: - printf("%s: target_stat %x\n", - sc->sc_dev.dv_xname, ccb->target_stat); - xs->error = XS_DRIVER_STUFFUP; - break; - } - } else - xs->resid = 0; - } - scsi_done(xs); -} - -/* - * Find the board and find its irq/drq - */ -int -bha_find(iot, ioh, sc) - bus_space_tag_t iot; - bus_space_handle_t ioh; - struct bha_probe_data *sc; -{ - int i, iswide; - u_char sts; - struct bha_extended_inquire inquire; - struct bha_config config; - int irq, drq; - - /* Check something is at the ports we need to access */ - sts = bus_space_read_1(iot, ioh, BHA_STAT_PORT); - if (sts == 0xFF) { -#ifdef BHADEBUG - if (bha_debug) - printf("bha_find: Not present\n"); -#endif /* BHADEBUG */ - return (0); - } - - /* - * Reset board, If it doesn't respond, assume - * that it's not there.. good for the probe - */ - - bus_space_write_1(iot, ioh, BHA_CTRL_PORT, - BHA_CTRL_HRST | BHA_CTRL_SRST); - - for (i = BHA_RESET_TIMEOUT; i--;) { - delay(100); - sts = bus_space_read_1(iot, ioh, BHA_STAT_PORT); - if (sts == (BHA_STAT_IDLE | BHA_STAT_INIT)) - break; - } - if (i < 0) { -#ifdef BHADEBUG - if (bha_debug) - printf("bha_find: No answer from board a=%x sts=%b\n", - ioh, sts, BHA_STAT_BITS); -#endif /* BHADEBUG */ - return (0); - } - - /* - * The BusLogic cards implement an Adaptec 1542 (aha)-compatible - * interface. The native bha interface is not compatible with - * an aha. 1542. We need to ensure that we never match an - * Adaptec 1542. We must also avoid sending Adaptec-compatible - * commands to a real bha, lest it go into 1542 emulation mode. - * (On an indirect bus like ISA, we should always probe for BusLogic - * interfaces before Adaptec interfaces). - */ - - /* - * Make sure we don't match an AHA-1542A or AHA-1542B, by checking - * for an extended-geometry register. The 1542[AB] don't have one. - */ - sts = bus_space_read_1(iot, ioh, BHA_EXTGEOM_PORT); - if (sts == 0xFF) - return (0); - - /* - * Check that we actually know how to use this board. - */ - delay(1000); - inquire.cmd.opcode = BHA_INQUIRE_EXTENDED; - inquire.cmd.len = sizeof(inquire.reply); - i = bha_cmd(iot, ioh, NULL, - sizeof(inquire.cmd), (u_char *)&inquire.cmd, - sizeof(inquire.reply), (u_char *)&inquire.reply); - - /* - * Some 1542Cs (CP, perhaps not CF, may depend on firmware rev) - * have the extended-geometry register and also respond to - * BHA_INQUIRE_EXTENDED. Make sure we never match such cards, - * by checking the size of the reply is what a BusLogic card returns. - */ - if (i) { -#ifdef BHADEBUG - printf("bha_find: board returned %d instead of %d to %s\n", - i, sizeof(inquire.reply), "INQUIRE_EXTENDED"); -#endif - return (0); - } - - /* OK, we know we've found a buslogic adaptor. */ - - switch (inquire.reply.bus_type) { - case BHA_BUS_TYPE_24BIT: - case BHA_BUS_TYPE_32BIT: - break; - case BHA_BUS_TYPE_MCA: - /* We don't grok MicroChannel (yet). */ - return (0); - default: - printf("bha_find: illegal bus type %c\n", - inquire.reply.bus_type); - return (0); - } - - /* Note if we have a wide bus. */ - iswide = inquire.reply.scsi_flags & BHA_SCSI_WIDE; - - /* - * Assume we have a board at this stage setup dma channel from - * jumpers and save int level - */ - delay(1000); - config.cmd.opcode = BHA_INQUIRE_CONFIG; - bha_cmd(iot, ioh, NULL, - sizeof(config.cmd), (u_char *)&config.cmd, - sizeof(config.reply), (u_char *)&config.reply); - switch (config.reply.chan) { - case EISADMA: - drq = -1; - break; - case CHAN0: - drq = 0; - break; - case CHAN5: - drq = 5; - break; - case CHAN6: - drq = 6; - break; - case CHAN7: - drq = 7; - break; - default: - printf("bha_find: illegal drq setting %x\n", - config.reply.chan); - return (0); - } - - switch (config.reply.intr) { - case INT9: - irq = 9; - break; - case INT10: - irq = 10; - break; - case INT11: - irq = 11; - break; - case INT12: - irq = 12; - break; - case INT14: - irq = 14; - break; - case INT15: - irq = 15; - break; - default: - printf("bha_find: illegal irq setting %x\n", - config.reply.intr); - return (0); - } - - /* if we want to fill in softc, do so now */ - if (sc != NULL) { - sc->sc_irq = irq; - sc->sc_drq = drq; - sc->sc_scsi_dev = config.reply.scsi_dev; - sc->sc_iswide = iswide; - } - - return (1); -} - - -/* - * Disable the ISA-compatibility ioports on PCI bha devices, - * to ensure they're not autoconfigured a second time as an ISA bha. - */ -int -bha_disable_isacompat(sc) - struct bha_softc *sc; -{ - struct bha_isadisable isa_disable; - - isa_disable.cmd.opcode = BHA_MODIFY_IOPORT; - isa_disable.cmd.modifier = BHA_IOMODIFY_DISABLE1; - bha_cmd(sc->sc_iot, sc->sc_ioh, sc, - sizeof(isa_disable.cmd), (u_char *)&isa_disable.cmd, - 0, NULL); - return (0); -} - - -/* - * Start the board, ready for normal operation - */ -int -bha_init(sc) - struct bha_softc *sc; -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - bus_dma_segment_t seg; - struct bha_devices devices; - struct bha_setup setup; - struct bha_mailbox mailbox; - struct bha_period period; - int error, i, j, initial_ccbs, rlen, rseg; - - /* Enable round-robin scheme - appeared at firmware rev. 3.31. */ - if (strcmp(sc->sc_firmware, "3.31") >= 0) { - struct bha_toggle toggle; - - toggle.cmd.opcode = BHA_ROUND_ROBIN; - toggle.cmd.enable = 1; - bha_cmd(iot, ioh, sc, - sizeof(toggle.cmd), (u_char *)&toggle.cmd, - 0, NULL); - } - - /* - * Inquire installed devices (to force synchronous negotiation). - */ - - /* - * Poll targets 0 - 7. - */ - devices.cmd.opcode = BHA_INQUIRE_DEVICES; - bha_cmd(iot, ioh, sc, - sizeof(devices.cmd), (u_char *)&devices.cmd, - sizeof(devices.reply), (u_char *)&devices.reply); - - /* Count installed units. */ - initial_ccbs = 0; - for (i = 0; i < 8; i++) { - for (j = 0; j < 8; j++) { - if (((devices.reply.lun_map[i] >> j) & 1) == 1) - initial_ccbs++; - } - } - - /* - * Poll targets 8 - 15 if we have a wide bus. - */ - if (ISWIDE(sc)) { - devices.cmd.opcode = BHA_INQUIRE_DEVICES_2; - bha_cmd(iot, ioh, sc, - sizeof(devices.cmd), (u_char *)&devices.cmd, - sizeof(devices.reply), (u_char *)&devices.reply); - - for (i = 0; i < 8; i++) { - for (j = 0; j < 8; j++) { - if (((devices.reply.lun_map[i] >> j) & 1) == 1) - initial_ccbs++; - } - } - } - - initial_ccbs *= sc->sc_link.openings; - if (initial_ccbs > BHA_CCB_MAX) - initial_ccbs = BHA_CCB_MAX; - if (initial_ccbs == 0) /* yes, this can happen */ - initial_ccbs = sc->sc_link.openings; - - /* Obtain setup information from. */ - rlen = sizeof(setup.reply) + - (ISWIDE(sc) ? sizeof(setup.reply_w) : 0); - setup.cmd.opcode = BHA_INQUIRE_SETUP; - setup.cmd.len = rlen; - bha_cmd(iot, ioh, sc, - sizeof(setup.cmd), (u_char *)&setup.cmd, - rlen, (u_char *)&setup.reply); - - printf("%s: %s, %s\n", sc->sc_dev.dv_xname, - setup.reply.sync_neg ? "sync" : "async", - setup.reply.parity ? "parity" : "no parity"); - - for (i = 0; i < 8; i++) - period.reply.period[i] = setup.reply.sync[i].period * 5 + 20; - if (ISWIDE(sc)) { - for (i = 0; i < 8; i++) - period.reply_w.period[i] = - setup.reply_w.sync_high[i].period * 5 + 20; - } - - if (sc->sc_firmware[0] >= '3') { - rlen = sizeof(period.reply) + - (ISWIDE(sc) ? sizeof(period.reply_w) : 0); - period.cmd.opcode = BHA_INQUIRE_PERIOD; - period.cmd.len = sizeof(period.reply); - bha_cmd(iot, ioh, sc, - sizeof(period.cmd), (u_char *)&period.cmd, - rlen, (u_char *)&period.reply); - } - - for (i = 0; i < 8; i++) { - if (!setup.reply.sync[i].valid || - (!setup.reply.sync[i].offset && - !setup.reply.sync[i].period)) - continue; - printf("%s targ %d: sync, offset %d, period %dnsec\n", - sc->sc_dev.dv_xname, i, - setup.reply.sync[i].offset, period.reply.period[i] * 10); - } - if (ISWIDE(sc)) { - for (i = 0; i < 8; i++) { - if (!setup.reply_w.sync_high[i].valid || - (!setup.reply_w.sync_high[i].offset && - !setup.reply_w.sync_high[i].period)) - continue; - printf("%s targ %d: sync, offset %d, period %dnsec\n", - sc->sc_dev.dv_xname, i + 8, - setup.reply_w.sync_high[i].offset, - period.reply_w.period[i] * 10); - } - } - - /* - * Allocate the mailbox and control blocks. - */ - if ((error = bus_dmamem_alloc(sc->sc_dmat, sizeof(struct bha_control), - NBPG, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT | BUS_DMA_ZERO)) != 0) { - printf("%s: unable to allocate control structures, " - "error = %d\n", sc->sc_dev.dv_xname, error); - return (error); - } - if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, - sizeof(struct bha_control), (caddr_t *)&sc->sc_control, - BUS_DMA_NOWAIT)) != 0) { - printf("%s: unable to map control structures, error = %d\n", - sc->sc_dev.dv_xname, error); - return (error); - } - - /* - * Create and load the DMA map used for the mailbox and - * control blocks. - */ - if ((error = bus_dmamap_create(sc->sc_dmat, sizeof(struct bha_control), - 1, sizeof(struct bha_control), 0, BUS_DMA_NOWAIT | sc->sc_dmaflags, - &sc->sc_dmamap_control)) != 0) { - printf("%s: unable to create control DMA map, error = %d\n", - sc->sc_dev.dv_xname, error); - return (error); - } - if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap_control, - sc->sc_control, sizeof(struct bha_control), NULL, - BUS_DMA_NOWAIT)) != 0) { - printf("%s: unable to load control DMA map, error = %d\n", - sc->sc_dev.dv_xname, error); - return (error); - } - - /* - * Initialize the control blocks. - */ - i = bha_create_ccbs(sc, sc->sc_control->bc_ccbs, initial_ccbs); - if (i == 0) { - printf("%s: unable to create control blocks\n", - sc->sc_dev.dv_xname); - return (ENOMEM); - } else if (i != initial_ccbs) { - printf("%s: WARNING: only %d of %d control blocks created\n", - sc->sc_dev.dv_xname, i, initial_ccbs); - } - - /* - * Set up initial mail box for round-robin operation. - */ - for (i = 0; i < BHA_MBX_SIZE; i++) { - wmbx->mbo[i].cmd = BHA_MBO_FREE; - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); - wmbx->mbi[i].comp_stat = BHA_MBI_FREE; - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); - } - wmbx->cmbo = wmbx->tmbo = &wmbx->mbo[0]; - wmbx->tmbi = &wmbx->mbi[0]; - sc->sc_mbofull = 0; - - /* Initialize mail box. */ - mailbox.cmd.opcode = BHA_MBX_INIT_EXTENDED; - mailbox.cmd.nmbx = BHA_MBX_SIZE; - ltophys(sc->sc_dmamap_control->dm_segs[0].ds_addr + - offsetof(struct bha_control, bc_mbx), mailbox.cmd.addr); - bha_cmd(iot, ioh, sc, - sizeof(mailbox.cmd), (u_char *)&mailbox.cmd, - 0, NULL); - return (0); -} - -void -bha_inquire_setup_information(sc) - struct bha_softc *sc; -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - struct bha_model model; - struct bha_revision revision; - struct bha_digit digit; - char *p; - - /* - * Get the firmware revision. - */ - p = sc->sc_firmware; - revision.cmd.opcode = BHA_INQUIRE_REVISION; - bha_cmd(iot, ioh, sc, - sizeof(revision.cmd), (u_char *)&revision.cmd, - sizeof(revision.reply), (u_char *)&revision.reply); - *p++ = revision.reply.firm_revision; - *p++ = '.'; - *p++ = revision.reply.firm_version; - digit.cmd.opcode = BHA_INQUIRE_REVISION_3; - bha_cmd(iot, ioh, sc, - sizeof(digit.cmd), (u_char *)&digit.cmd, - sizeof(digit.reply), (u_char *)&digit.reply); - *p++ = digit.reply.digit; - if (revision.reply.firm_revision >= '3' || - (revision.reply.firm_revision == '3' && - revision.reply.firm_version >= '3')) { - digit.cmd.opcode = BHA_INQUIRE_REVISION_4; - bha_cmd(iot, ioh, sc, - sizeof(digit.cmd), (u_char *)&digit.cmd, - sizeof(digit.reply), (u_char *)&digit.reply); - *p++ = digit.reply.digit; - } - while (p > sc->sc_firmware && (p[-1] == ' ' || p[-1] == '\0')) - p--; - *p = '\0'; - - /* - * Get the model number. - */ - if (revision.reply.firm_revision >= '3') { - p = sc->sc_model; - model.cmd.opcode = BHA_INQUIRE_MODEL; - model.cmd.len = sizeof(model.reply); - bha_cmd(iot, ioh, sc, - sizeof(model.cmd), (u_char *)&model.cmd, - sizeof(model.reply), (u_char *)&model.reply); - *p++ = model.reply.id[0]; - *p++ = model.reply.id[1]; - *p++ = model.reply.id[2]; - *p++ = model.reply.id[3]; - while (p > sc->sc_model && (p[-1] == ' ' || p[-1] == '\0')) - p--; - *p++ = model.reply.version[0]; - *p++ = model.reply.version[1]; - while (p > sc->sc_model && (p[-1] == ' ' || p[-1] == '\0')) - p--; - *p = '\0'; - } else - strlcpy(sc->sc_model, "542B", sizeof sc->sc_model); -} - -void -bhaminphys(struct buf *bp, struct scsi_link *sl) -{ - if (bp->b_bcount > BHA_MAXXFER) - bp->b_bcount = BHA_MAXXFER; - minphys(bp); -} - -/* - * start a scsi operation given the command and the data address. Also needs - * the unit, target and lu. - */ -void -bha_scsi_cmd(xs) - struct scsi_xfer *xs; -{ - struct scsi_link *sc_link = xs->sc_link; - struct bha_softc *sc = sc_link->adapter_softc; - bus_dma_tag_t dmat = sc->sc_dmat; - struct bha_ccb *ccb; - int error, seg, flags, s; - - SC_DEBUG(sc_link, SDEV_DB2, ("bha_scsi_cmd\n")); - - /* - * get a ccb to use. If the transfer - * is from a buf (possibly from interrupt time) - * then we can't allow it to sleep - */ - flags = xs->flags; - ccb = xs->io; - - ccb->xs = xs; - ccb->timeout = xs->timeout; - - /* - * Put all the arguments for the xfer in the ccb - */ - if (flags & SCSI_RESET) { - ccb->opcode = BHA_RESET_CCB; - ccb->scsi_cmd_length = 0; - } else { - /* can't use S/G if zero length */ - ccb->opcode = (xs->datalen ? BHA_INIT_SCAT_GATH_CCB - : BHA_INITIATOR_CCB); - bcopy(xs->cmd, &ccb->scsi_cmd, - ccb->scsi_cmd_length = xs->cmdlen); - } - - if (xs->datalen) { - /* - * Map the DMA transfer. - */ - error = bus_dmamap_load(dmat, - ccb->dmamap_xfer, xs->data, xs->datalen, NULL, - (flags & SCSI_NOSLEEP) ? BUS_DMA_NOWAIT : - BUS_DMA_WAITOK); - - if (error) { - if (error == EFBIG) { - printf("%s: bha_scsi_cmd, more than %d" - " dma segments\n", - sc->sc_dev.dv_xname, BHA_NSEG); - } else { - printf("%s: bha_scsi_cmd, error %d loading" - " dma map\n", - sc->sc_dev.dv_xname, error); - } - goto bad; - } - - bus_dmamap_sync(dmat, ccb->dmamap_xfer, - 0, ccb->dmamap_xfer->dm_mapsize, - (flags & SCSI_DATA_IN) ? BUS_DMASYNC_PREREAD : - BUS_DMASYNC_PREWRITE); - - /* - * Load the hardware scatter/gather map with the - * contents of the DMA map. - */ - for (seg = 0; seg < ccb->dmamap_xfer->dm_nsegs; seg++) { - ltophys(ccb->dmamap_xfer->dm_segs[seg].ds_addr, - ccb->scat_gath[seg].seg_addr); - ltophys(ccb->dmamap_xfer->dm_segs[seg].ds_len, - ccb->scat_gath[seg].seg_len); - } - - ltophys(sc->sc_dmamap_control->dm_segs[0].ds_addr + - BHA_CCB_OFF(ccb) + offsetof(struct bha_ccb, scat_gath), - ccb->data_addr); - ltophys(ccb->dmamap_xfer->dm_nsegs * - sizeof(struct bha_scat_gath), ccb->data_length); - } else { - /* - * No data xfer, use non S/G values. - */ - ltophys(0, ccb->data_addr); - ltophys(0, ccb->data_length); - } - - ccb->data_out = 0; - ccb->data_in = 0; - ccb->target = sc_link->target; - ccb->lun = sc_link->lun; - ltophys(sc->sc_dmamap_control->dm_segs[0].ds_addr + - BHA_CCB_OFF(ccb) + offsetof(struct bha_ccb, scsi_sense), - ccb->sense_ptr); - ccb->req_sense_length = sizeof(ccb->scsi_sense); - ccb->host_stat = 0x00; - ccb->target_stat = 0x00; - ccb->link_id = 0; - ltophys(0, ccb->link_addr); - - bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_control, - 0, sc->sc_dmamap_control->dm_mapsize, - BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); - - s = splbio(); - bha_queue_ccb(sc, ccb); - splx(s); - - /* - * Usually return SUCCESSFULLY QUEUED - */ - SC_DEBUG(sc_link, SDEV_DB3, ("cmd_sent\n")); - if ((flags & SCSI_POLL) == 0) - return; - - /* - * If we can't use interrupts, poll on completion - */ - if (bha_poll(sc, xs, ccb->timeout)) { - bha_timeout(ccb); - if (bha_poll(sc, xs, ccb->timeout)) - bha_timeout(ccb); - } - return; - -bad: - xs->error = XS_DRIVER_STUFFUP; - scsi_done(xs); -} - -/* - * Poll a particular unit, looking for a particular xs - */ -int -bha_poll(sc, xs, count) - struct bha_softc *sc; - struct scsi_xfer *xs; - int count; -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - int s; - - /* timeouts are in msec, so we loop in 1000 usec cycles */ - while (count) { - /* - * If we had interrupts enabled, would we - * have got an interrupt? - */ - if (bus_space_read_1(iot, ioh, BHA_INTR_PORT) & - BHA_INTR_ANYINTR) { - s = splbio(); - bha_intr(sc); - splx(s); - } - if (xs->flags & ITSDONE) - return (0); - delay(1000); /* only happens in boot so ok */ - count--; - } - return (1); -} - -void -bha_timeout(arg) - void *arg; -{ - struct bha_ccb *ccb = arg; - struct scsi_xfer *xs = ccb->xs; - struct scsi_link *sc_link = xs->sc_link; - struct bha_softc *sc = sc_link->adapter_softc; - int s; - - sc_print_addr(sc_link); - printf("timed out"); - - s = splbio(); - -#ifdef BHADIAG - /* - * If the ccb's mbx is not free, then the board has gone Far East? - */ - bha_collect_mbo(sc); - if (ccb->flags & CCB_SENDING) - panic("%s: not taking commands!", sc->sc_dev.dv_xname); -#endif - - /* - * If it has been through before, then - * a previous abort has failed, don't - * try abort again - */ - if (ccb->flags & CCB_ABORT) { - /* abort timed out */ - printf(" AGAIN\n"); - /* XXX Must reset! */ - } else { - /* abort the operation that has timed out */ - printf("\n"); - ccb->xs->error = XS_TIMEOUT; - ccb->timeout = BHA_ABORT_TIMEOUT; - ccb->flags |= CCB_ABORT; - bha_queue_ccb(sc, ccb); - } - - splx(s); -} diff --git a/sys/dev/ic/bhareg.h b/sys/dev/ic/bhareg.h deleted file mode 100644 index d4c88d15b1d..00000000000 --- a/sys/dev/ic/bhareg.h +++ /dev/null @@ -1,512 +0,0 @@ -/* $OpenBSD: bhareg.h,v 1.5 2012/07/01 01:41:13 krw Exp $ */ -/* $NetBSD: bhareg.h,v 1.12 1998/08/17 00:26:33 mycroft Exp $ */ - -/*- - * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace - * Simulation Facility, NASA Ames Research Center. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Originally written by Julian Elischer (julian@tfs.com) - * for TRW Financial Systems for use under the MACH(2.5) operating system. - * - * TRW Financial Systems, in accordance with their agreement with Carnegie - * Mellon University, makes this software available to CMU to distribute - * or use in any manner that they see fit as long as this message is kept with - * the software. For this reason TFS also grants any other persons or - * organisations permission to use or modify this software. - * - * TFS supplies this software to be publicly redistributed - * on the understanding that TFS is not responsible for the correct - * functioning of this software in any circumstances. - */ - -typedef u_int8_t physaddr[4]; -typedef u_int8_t physlen[4]; - -static __inline void ltophys(u_int32_t val, u_int8_t *bytes); -static __inline u_int32_t phystol(u_int8_t *bytes); - -static __inline void -ltophys(u_int32_t val, u_int8_t *bytes) -{ - bytes[0] = val & 0xff; - bytes[1] = (val >> 8) & 0xff; - bytes[2] = (val >> 16) & 0xff; - bytes[3] = (val >> 24) & 0xff; -} - -static __inline u_int32_t -phystol(u_int8_t *bytes) -{ - u_int32_t rv; - - rv = bytes[0] | (bytes[1] << 8) | - (bytes[2] << 16) | (bytes[3] << 24); - return (rv); - } - -/* - * I/O port offsets - */ -#define BHA_CTRL_PORT 0 /* control (wo) */ -#define BHA_STAT_PORT 0 /* status (ro) */ -#define BHA_CMD_PORT 1 /* command (wo) */ -#define BHA_DATA_PORT 1 /* data (ro) */ -#define BHA_INTR_PORT 2 /* interrupt status (ro) */ -#define BHA_EXTGEOM_PORT 3 /* extended geometry (ro) */ - -/* - * BHA_CTRL bits - */ -#define BHA_CTRL_HRST 0x80 /* Hardware reset */ -#define BHA_CTRL_SRST 0x40 /* Software reset */ -#define BHA_CTRL_IRST 0x20 /* Interrupt reset */ -#define BHA_CTRL_SCRST 0x10 /* SCSI bus reset */ - -/* - * BHA_STAT bits - */ -#define BHA_STAT_STST 0x80 /* Self test in Progress */ -#define BHA_STAT_DIAGF 0x40 /* Diagnostic Failure */ -#define BHA_STAT_INIT 0x20 /* Mbx Init required */ -#define BHA_STAT_IDLE 0x10 /* Host Adapter Idle */ -#define BHA_STAT_CDF 0x08 /* cmd/data out port full */ -#define BHA_STAT_DF 0x04 /* Data in port full */ -#define BHA_STAT_INVDCMD 0x01 /* Invalid command */ -#define BHA_STAT_BITS "\020\1invcmd\3df\4cdf\5idle\6init\7diagf\10stst" - -/* - * BHA_CMD opcodes - */ -#define BHA_NOP 0x00 /* No operation */ -#define BHA_MBX_INIT 0x01 /* Mbx initialization */ -#define BHA_START_SCSI 0x02 /* start scsi command */ -#define BHA_EXECUTE_BIOS_CMD 0x03 /* execute BIOS command */ -#define BHA_INQUIRE_REVISION 0x04 /* Adapter Inquiry */ -#define BHA_MBO_INTR_EN 0x05 /* Enable MBO available interrupt */ -#define BHA_SEL_TIMEOUT_SET 0x06 /* set selection time-out */ -#define BHA_BUS_ON_TIME_SET 0x07 /* set bus-on time */ -#define BHA_BUS_OFF_TIME_SET 0x08 /* set bus-off time */ -#define BHA_BUS_SPEED_SET 0x09 /* set bus transfer speed */ -#define BHA_INQUIRE_DEVICES 0x0a /* return installed devices 0-7 */ -#define BHA_INQUIRE_CONFIG 0x0b /* return configuration data */ -#define BHA_TARGET_EN 0x0c /* enable target mode */ -#define BHA_INQUIRE_SETUP 0x0d /* return setup data */ -#define BHA_WRITE_LRAM 0x1a /* write adapter local RAM */ -#define BHA_READ_LRAM 0x1b /* read adapter local RAM */ -#define BHA_WRITE_CHIP_FIFO 0x1c /* write bus master chip FIFO */ -#define BHA_READ_CHIP_FIFO 0x1d /* read bus master chip FIFO */ -#define BHA_ECHO 0x1f /* Echo command byte */ -#define BHA_ADAPTER_DIAGNOSTICS 0x20 /* host adapter diagnostics */ -#define BHA_SET_ADAPTER_OPTIONS 0x21 /* set adapter options */ -#define BHA_INQUIRE_DEVICES_2 0x23 /* return installed devices 8-15 */ -#define BHA_INQUIRE_TARG_DEVS 0x24 /* inquire target devices */ -#define BHA_DISABLE_HAC_INTR 0x25 /* disable host adapter interrupt */ -#define BHA_MBX_INIT_EXTENDED 0x81 /* Mbx initialization */ -#define BHA_EXECUTE_SCSI_CMD 0x83 /* execute SCSI command */ -#define BHA_INQUIRE_REVISION_3 0x84 /* Get 3rd firmware version byte */ -#define BHA_INQUIRE_REVISION_4 0x85 /* Get 4th firmware version byte */ -#define BHA_INQUIRE_PCI_INFO 0x86 /* get PCI host adapter information */ -#define BHA_INQUIRE_MODEL 0x8b /* Get hardware ID and revision */ -#define BHA_INQUIRE_PERIOD 0x8c /* Get synchronous period */ -#define BHA_INQUIRE_EXTENDED 0x8d /* Adapter Setup Inquiry */ -#define BHA_ROUND_ROBIN 0x8f /* Enable/Disable(default) - round robin */ -#define BHA_STORE_LRAM 0x90 /* store host adapter local RAM */ -#define BHA_FETCH_LRAM 0x91 /* fetch host adapter local RAM */ -#define BHA_SAVE_TO_EEPROM 0x92 /* store local RAM data in EEPROM */ -#define BHA_UPLOAD_AUTOSCSI 0x94 /* upload AutoSCSI code */ -#define BHA_MODIFY_IOPORT 0x95 /* change or disable I/O port */ -#define BHA_SET_CCB_FORMAT 0x96 /* set CCB format (legacy/wide lun) */ -#define BHA_WRITE_INQUIRY_BUF 0x9a /* write inquiry buffer */ -#define BHA_READ_INQUIRY_BUF 0x9b /* read inquiry buffer */ -#define BHA_FLASH_UP_DOWNLOAD 0xa7 /* flash upload/downlod */ -#define BHA_READ_SCAM_DATA 0xa8 /* read SCAM data */ -#define BHA_WRITE_SCAM_DATA 0xa9 /* write SCAM data */ - -/* - * BHA_INTR bits - */ -#define BHA_INTR_ANYINTR 0x80 /* Any interrupt */ -#define BHA_INTR_SCRD 0x08 /* SCSI reset detected */ -#define BHA_INTR_HACC 0x04 /* Command complete */ -#define BHA_INTR_MBOA 0x02 /* MBX out empty */ -#define BHA_INTR_MBIF 0x01 /* MBX in full */ - -struct bha_mbx_out { - physaddr ccb_addr; - u_int8_t reserved[3]; - u_int8_t cmd; -} __packed; - -struct bha_mbx_in { - physaddr ccb_addr; - u_int8_t host_stat; - u_int8_t target_stat; - u_int8_t reserved; - u_int8_t comp_stat; -} __packed; - -/* - * mbo.cmd values - */ -#define BHA_MBO_FREE 0x0 /* MBO entry is free */ -#define BHA_MBO_START 0x1 /* MBO activate entry */ -#define BHA_MBO_ABORT 0x2 /* MBO abort entry */ - -/* - * mbi.comp_stat values - */ -#define BHA_MBI_FREE 0x0 /* MBI entry is free */ -#define BHA_MBI_OK 0x1 /* completed without error */ -#define BHA_MBI_ABORT 0x2 /* aborted ccb */ -#define BHA_MBI_UNKNOWN 0x3 /* Tried to abort invalid CCB */ -#define BHA_MBI_ERROR 0x4 /* Completed with error */ - -#if defined(BIG_DMA) -WARNING...THIS WON'T WORK(won't fit on 1 page) -#if 0 -#define BHA_NSEG 2048 /* Number of scatter gather segments - to much vm */ -#endif -#define BHA_NSEG 128 -#else -#define BHA_NSEG 33 -#endif /* BIG_DMA */ - -struct bha_scat_gath { - physlen seg_len; - physaddr seg_addr; -} __packed; - -struct bha_ccb { - u_int8_t opcode; -#if BYTE_ORDER == LITTLE_ENDIAN - u_int8_t :3, - data_in :1, - data_out :1, - wide_tag_enable :1, /* Wide Lun CCB format */ - wide_tag_type :2; /* Wide Lun CCB format */ -#else - u_int8_t wide_tag_type :2, /* Wide Lun CCB format */ - wide_tag_enable :1, /* Wide Lun CCB format */ - data_out :1, - data_in :1, - :3; -#endif - u_int8_t scsi_cmd_length; - u_int8_t req_sense_length; - /*------------------------------------longword boundary */ - physlen data_length; - /*------------------------------------longword boundary */ - physaddr data_addr; - /*------------------------------------longword boundary */ - u_int8_t reserved1[2]; - u_int8_t host_stat; - u_int8_t target_stat; - /*------------------------------------longword boundary */ - u_int8_t target; -#if BYTE_ORDER == LITTLE_ENDIAN - u_int8_t lun :5, - tag_enable :1, - tag_type :2; -#else - u_int8_t tag_type :2, - tag_enable :1, - lun :5; -#endif - struct scsi_generic scsi_cmd; - u_int8_t reserved2[1]; - u_int8_t link_id; - /*------------------------------------longword boundary */ - physaddr link_addr; - /*------------------------------------longword boundary */ - physaddr sense_ptr; -/*-----end of HW fields-----------------------longword boundary */ - struct scsi_sense_data scsi_sense; - /*------------------------------------longword boundary */ - struct bha_scat_gath scat_gath[BHA_NSEG]; - /*------------------------------------longword boundary */ - TAILQ_ENTRY(bha_ccb) chain; - struct bha_ccb *nexthash; - bus_addr_t hashkey; - - struct scsi_xfer *xs; /* the scsipi_xfer for this cmd */ - - int flags; -#define CCB_ALLOC 0x01 -#define CCB_ABORT 0x02 -#ifdef BHADIAG -#define CCB_SENDING 0x04 -#endif - int timeout; - - /* - * This DMA map maps the buffer involved in the transfer. - * Its contents are loaded into "scat_gath" above. - */ - bus_dmamap_t dmamap_xfer; -} __packed; - -/* - * opcode fields - */ -#define BHA_INITIATOR_CCB 0x00 /* SCSI Initiator CCB */ -#define BHA_TARGET_CCB 0x01 /* SCSI Target CCB */ -#define BHA_INIT_SCAT_GATH_CCB 0x02 /* SCSI Initiator with S/G */ -#define BHA_INIT_RESID_CCB 0x03 /* SCSI Initiator w/ residual */ -#define BHA_INIT_RESID_SG_CCB 0x04 /* SCSI Initiator w/ residual and S/G */ -#define BHA_RESET_CCB 0x81 /* SCSI Bus reset */ - -/* - * bha_ccb.host_stat values - */ -#define BHA_OK 0x00 /* cmd ok */ -#define BHA_LINK_OK 0x0a /* Link cmd ok */ -#define BHA_LINK_IT 0x0b /* Link cmd ok + int */ -#define BHA_DATA_UNDRN 0x0c /* data underrun error */ -#define BHA_SEL_TIMEOUT 0x11 /* Selection time out */ -#define BHA_OVER_UNDER 0x12 /* Data over/under run */ -#define BHA_BUS_FREE 0x13 /* Bus dropped at unexpected time */ -#define BHA_INV_BUS 0x14 /* Invalid bus phase/sequence */ -#define BHA_BAD_MBO 0x15 /* Incorrect MBO cmd */ -#define BHA_BAD_CCB 0x16 /* Incorrect ccb opcode */ -#define BHA_BAD_LINK 0x17 /* Not same values of LUN for links */ -#define BHA_INV_TARGET 0x18 /* Invalid target direction */ -#define BHA_CCB_DUP 0x19 /* Duplicate CCB received */ -#define BHA_INV_CCB 0x1a /* Invalid CCB or segment list */ -#define BHA_AUTOSENSE_FAILED 0x1b /* auto REQUEST SENSE failed */ -#define BHA_TAGGED_MSG_REJ 0x1c /* tagged queueing message rejected */ -#define BHA_UNSUP_MSG_RECVD 0x1d /* unsupported message received */ -#define BHA_HARDWARE_FAILURE 0x20 /* host adapter hardware failure */ -#define BHA_TARG_IGNORED_ATN 0x21 /* target ignored ATN signal */ -#define BHA_HA_SCSI_BUS_RESET 0x22 /* host adapter asserted RST */ -#define BHA_OTHER_SCSI_BUS_RESET 0x23 /* other device asserted RST */ -#define BHA_BAD_RECONNECT 0x24 /* target reconnected improperly */ -#define BHA_HA_BUS_DEVICE_RESET 0x25 /* host adapter performed BDR */ -#define BHA_ABORT_QUEUE 0x26 /* abort queue generated */ -#define BHA_SOFTWARE_FAILURE 0x27 /* host adapter software failure */ -#define BHA_HARDWARE_WATCHDOG 0x30 /* host adapter watchdog timer fired */ -#define BHA_SCSI_PARITY_ERROR 0x34 /* SCSI parity error detected */ - -struct bha_extended_inquire { - struct { - u_char opcode; - u_char len; - } __packed cmd; - struct { - u_char bus_type; /* Type of bus connected to */ -#define BHA_BUS_TYPE_24BIT 'A' /* ISA bus */ -#define BHA_BUS_TYPE_32BIT 'E' /* EISA/VLB/PCI bus */ -#define BHA_BUS_TYPE_MCA 'M' /* MicroChannel bus */ - u_char bios_address; /* Address of adapter BIOS */ - u_short sg_limit; - u_char mbox_count; - u_char mbox_baseaddr[4]; /* packed/unaligned u_int32_t */ - u_char intrflags; -#define BHA_INTR_FASTEISA 0x04 -#define BHA_INTR_LEVEL 0x40 /* bit 6: level-sensitive interrupt */ - u_char firmware_level[3]; /* last 3 digits of firmware rev */ - u_char scsi_flags; /* supported SCSI features */ -#define BHA_SCSI_WIDE 0x01 /* host adapter is wide */ -#define BHA_SCSI_DIFFERENTIAL 0x02 /* host adapter is differential */ -#define BHA_SCSI_SCAM 0x04 /* host adapter supports SCAM */ -#define BHA_SCSI_ULTRA 0x08 /* host adapter supports Ultra */ -#define BHA_SCSI_TERMINATION 0x10 /* host adapter supports smart - termination */ - } __packed reply; -} __packed; - -struct bha_config { - struct { - u_char opcode; - } __packed cmd; - struct { - u_char chan; - u_char intr; -#if BYTE_ORDER == LITTLE_ENDIAN - u_char scsi_dev :3, - :5; -#else - u_char :5, - scsi_dev :3; -#endif - } __packed reply; -} __packed; - -struct bha_toggle { - struct { - u_char opcode; - u_char enable; - } __packed cmd; -} __packed; - -struct bha_mailbox { - struct { - u_char opcode; - u_char nmbx; - physaddr addr; - } __packed cmd; -} __packed; - -struct bha_model { - struct { - u_char opcode; - u_char len; - } __packed cmd; - struct { - u_char id[4]; /* i.e bt742a -> '7','4','2','A' */ - u_char version[2]; /* i.e Board Revision 'H' -> 'H', 0x00 */ - } __packed reply; -} __packed; - -struct bha_revision { - struct { - u_char opcode; - } __packed cmd; - struct { - u_char board_type; - u_char custom_feature; - char firm_revision; - u_char firm_version; - } __packed reply; -} __packed; - -struct bha_digit { - struct { - u_char opcode; - } __packed cmd; - struct { - u_char digit; - } __packed reply; -} __packed; - -struct bha_devices { - struct { - u_char opcode; - } __packed cmd; - struct { - u_char lun_map[8]; - } __packed reply; -} __packed; - -struct bha_sync { -#if BYTE_ORDER == LITTLE_ENDIAN - u_char offset :4, - period :3, - valid :1; -#else - u_char valid :1, - period :3, - offset :4; -#endif -} __packed; - -struct bha_setup_reply { -#if BYTE_ORDER == LITTLE_ENDIAN - u_int8_t sync_neg :1, - parity :1, - :6; -#else - u_int8_t :6, - parity :1, - sync_neg :1; -#endif - u_int8_t speed; - u_int8_t bus_on; - u_int8_t bus_off; - u_int8_t num_mbx; - u_int8_t mbx[3]; /*XXX */ - /* doesn't make sense with 32bit addresses */ - struct bha_sync sync[8]; - u_int8_t disc_sts; -} __packed; - -/* additional reply data supplied by wide controllers */ -struct bha_setup_reply_wide { - u_int8_t signature; - u_int8_t letter_d; - u_int8_t ha_type; - u_int8_t low_wide_allowed; - u_int8_t low_wide_active; - struct bha_sync sync_high[8]; - u_int8_t high_disc_info; - u_int8_t reserved; - u_int8_t high_wide_allowed; - u_int8_t high_wide_active; -} __packed; - -struct bha_setup { - struct { - u_char opcode; - u_char len; - } __packed cmd; - struct bha_setup_reply reply; - struct bha_setup_reply_wide reply_w; /* for wide controllers */ -} __packed; - -struct bha_period_reply { - u_char period[8]; -} __packed; - -struct bha_period { - struct { - u_char opcode; - u_char len; - } __packed cmd; - struct bha_period_reply reply; - struct bha_period_reply reply_w; /* for wide controllers */ -} __packed; - -struct bha_isadisable { - struct { - u_char opcode; - u_char modifier; - } __packed cmd; -} __packed; - -/* - * bha_isadisable.modifier parameters - */ -#define BHA_IOMODIFY_330 0x00 -#define BHA_IOMODIFY_334 0x01 -#define BHA_IOMODIFY_DISABLE1 0x06 -#define BHA_IOMODIFY_DISABLE2 0x07 - -#define INT9 0x01 -#define INT10 0x02 -#define INT11 0x04 -#define INT12 0x08 -#define INT14 0x20 -#define INT15 0x40 - -#define EISADMA 0x00 -#define CHAN0 0x01 -#define CHAN5 0x20 -#define CHAN6 0x40 -#define CHAN7 0x80 diff --git a/sys/dev/ic/bhavar.h b/sys/dev/ic/bhavar.h deleted file mode 100644 index 577fb6de851..00000000000 --- a/sys/dev/ic/bhavar.h +++ /dev/null @@ -1,128 +0,0 @@ -/* $OpenBSD: bhavar.h,v 1.5 2011/04/03 12:42:36 krw Exp $ */ -/* $NetBSD: bhavar.h,v 1.12 1998/11/19 21:53:00 thorpej Exp $ */ - -/*- - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace - * Simulation Facility, NASA Ames Research Center. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/queue.h> - -/* - * Mail box defs etc. - * these could be bigger but we need the bha_softc to fit on a single page.. - */ -#define BHA_MBX_SIZE 32 /* mail box size (MAX 255 MBxs) */ - /* don't need that many really */ -#define BHA_CCB_MAX 32 /* store up to 32 CCBs at one time */ -#define CCB_HASH_SIZE 32 /* hash table size for phystokv */ -#define CCB_HASH_SHIFT 9 -#define CCB_HASH(x) ((((long)(x))>>CCB_HASH_SHIFT) & (CCB_HASH_SIZE - 1)) - -#define bha_nextmbx(wmb, mbx, mbio) \ - if ((wmb) == &(mbx)->mbio[BHA_MBX_SIZE - 1]) \ - (wmb) = &(mbx)->mbio[0]; \ - else \ - (wmb)++; - -struct bha_mbx { - struct bha_mbx_out mbo[BHA_MBX_SIZE]; - struct bha_mbx_in mbi[BHA_MBX_SIZE]; - struct bha_mbx_out *cmbo; /* Collection Mail Box out */ - struct bha_mbx_out *tmbo; /* Target Mail Box out */ - struct bha_mbx_in *tmbi; /* Target Mail Box in */ -}; - -struct bha_control { - struct bha_mbx bc_mbx; /* all our mailboxes */ - struct bha_ccb bc_ccbs[BHA_CCB_MAX]; /* all our control blocks */ -}; - -struct bha_softc { - struct device sc_dev; - - bus_space_tag_t sc_iot; - bus_space_handle_t sc_ioh; - bus_dma_tag_t sc_dmat; - bus_dmamap_t sc_dmamap_control; /* maps the control structures */ - int sc_dmaflags; /* bus-specific dma map flags */ - void *sc_ih; - - struct bha_control *sc_control; /* control structures */ - int sc_iswide; - -#define wmbx (&sc->sc_control->bc_mbx) - - struct bha_ccb *sc_ccbhash[CCB_HASH_SIZE]; - TAILQ_HEAD(, bha_ccb) sc_free_ccb, sc_waiting_ccb; - int sc_mbofull; - struct scsi_link sc_link; /* prototype for devs */ - struct scsi_adapter sc_adapter; - - struct mutex sc_ccb_mtx; - struct scsi_iopool sc_iopool; - - char sc_model[7]; - char sc_firmware[6]; -}; - -/* - * Offset of a Mail Box In from the beginning of the control DMA mapping. - */ -#define BHA_MBI_OFF(m) (offsetof(struct bha_control, bc_mbx.mbi[0]) + \ - (((u_long)(m)) - ((u_long)&wmbx->mbi[0]))) - -/* - * Offset of a Mail Box Out from the beginning of the control DMA mapping. - */ -#define BHA_MBO_OFF(m) (offsetof(struct bha_control, bc_mbx.mbo[0]) + \ - (((u_long)(m)) - ((u_long)&wmbx->mbo[0]))) - -/* - * Offset of a CCB from the beginning of the control DMA mapping. - */ -#define BHA_CCB_OFF(c) (offsetof(struct bha_control, bc_ccbs[0]) + \ - (((u_long)(c)) - ((u_long)&sc->sc_control->bc_ccbs[0]))) - -struct bha_probe_data { - int sc_irq, sc_drq; - int sc_scsi_dev; /* adapters scsi id */ - int sc_iswide; /* adapter is wide */ -}; - -/*#define ISWIDE(sc) (sc->sc_link.max_target >= 8)*/ - -int bha_cmd(bus_space_tag_t, bus_space_handle_t, struct bha_softc *, - int, u_char *, int, u_char *); -int bha_find(bus_space_tag_t, bus_space_handle_t, - struct bha_probe_data *); -void bha_attach(struct bha_softc *, struct bha_probe_data *); -int bha_intr(void *); - -int bha_disable_isacompat(struct bha_softc *); -void bha_inquire_setup_information(struct bha_softc *); diff --git a/sys/dev/isa/bha_isa.c b/sys/dev/isa/bha_isa.c deleted file mode 100644 index 4b61e97eedb..00000000000 --- a/sys/dev/isa/bha_isa.c +++ /dev/null @@ -1,193 +0,0 @@ -/* $OpenBSD: bha_isa.c,v 1.4 2008/06/26 05:42:16 ray Exp $ */ -/* $NetBSD: bha_isa.c,v 1.14 1998/08/15 10:10:51 mycroft Exp $ */ - -/*- - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/device.h> - -#include <machine/bus.h> -#include <machine/intr.h> - -#include <scsi/scsi_all.h> -#include <scsi/scsiconf.h> - -#include <dev/isa/isavar.h> -#include <dev/isa/isadmavar.h> - -#include <dev/ic/bhareg.h> -#include <dev/ic/bhavar.h> - -#include "aha.h" -#if NAHA > 0 -int btports[8]; /* cannot be more */ -int nbtports; -#endif - -#define BHA_ISA_IOSIZE 4 - -int bha_isa_probe(struct device *, void *, void *); -void bha_isa_attach(struct device *, struct device *, void *); - -struct cfattach bha_isa_ca = { - sizeof(struct bha_softc), bha_isa_probe, bha_isa_attach -}; - -/* - * Check the slots looking for a board we recognise - * If we find one, note its address (slot) and call - * the actual probe routine to check it out. - */ -int -bha_isa_probe(parent, match, aux) - struct device *parent; - void *aux, *match; -{ - struct isa_attach_args *ia = aux; - bus_space_tag_t iot = ia->ia_iot; - bus_space_handle_t ioh; - struct bha_probe_data bpd; -#if NAHA > 0 - struct bha_digit digit; -#endif - int rv; - - /* Disallow wildcarded i/o address. */ - if (ia->ia_iobase == IOBASEUNK) - return (0); - - if (bus_space_map(iot, ia->ia_iobase, BHA_ISA_IOSIZE, 0, &ioh)) - return (0); - - rv = bha_find(iot, ioh, &bpd); - -#if NAHA > 0 - if (rv) { - /* Adaptec 1542 cards do not support this */ - digit.reply.digit = '@'; - digit.cmd.opcode = BHA_INQUIRE_REVISION_3; - bha_cmd(iot, ioh, NULL, sizeof(digit.cmd), (u_char *)&digit.cmd, - sizeof(digit.reply), (u_char *)&digit.reply); - if (digit.reply.digit == '@') - return 1; - } -#endif - - bus_space_unmap(iot, ioh, BHA_ISA_IOSIZE); - - if (rv) { - if (ia->ia_irq != -1 && ia->ia_irq != bpd.sc_irq) - return (0); - if (ia->ia_drq != -1 && ia->ia_drq != bpd.sc_drq) - return (0); - ia->ia_irq = bpd.sc_irq; - ia->ia_drq = bpd.sc_drq; - ia->ia_msize = 0; - ia->ia_iosize = BHA_ISA_IOSIZE; - } - return (rv); -} - -/* - * Attach all the sub-devices we can find - */ -void -bha_isa_attach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - struct isa_attach_args *ia = aux; - struct bha_softc *sc = (void *)self; - bus_space_tag_t iot = ia->ia_iot; - bus_space_handle_t ioh; - struct bha_probe_data bpd; - isa_chipset_tag_t ic = ia->ia_ic; -#ifndef __OpenBSD__ - int error; -#endif - - printf("\n"); - - if (bus_space_map(iot, ia->ia_iobase, ia->ia_iosize, 0, &ioh)) { - printf("%s: can't map i/o space\n", sc->sc_dev.dv_xname); - return; - } - - sc->sc_iot = iot; - sc->sc_ioh = ioh; - sc->sc_dmat = ia->ia_dmat; - if (!bha_find(iot, ioh, &bpd)) { - printf("%s: bha_find failed\n", sc->sc_dev.dv_xname); - return; - } - - sc->sc_dmaflags = 0; - if (bpd.sc_drq != DRQUNK) { -#ifdef __OpenBSD__ - isa_dmacascade(ic, bpd.sc_drq); -#else - if ((error = isa_dmacascade(ic, bpd.sc_drq)) != 0) { - printf("%s: unable to cascade DRQ, error = %d\n", - sc->sc_dev.dv_xname, error); - return; - } -#endif - } else { - /* - * We have a VLB controller. If we're at least both - * hardware revision E and firmware revision 3.37, - * we can do 32-bit DMA (earlier revisions are buggy - * in this regard). - */ - bha_inquire_setup_information(sc); - if (strcmp(sc->sc_firmware, "3.37") < 0) - printf("%s: buggy VLB controller, disabling 32-bit DMA\n", - sc->sc_dev.dv_xname); - else - sc->sc_dmaflags = ISABUS_DMA_32BIT; - } - - sc->sc_ih = isa_intr_establish(ic, bpd.sc_irq, IST_EDGE, IPL_BIO, - bha_intr, sc, sc->sc_dev.dv_xname); - if (sc->sc_ih == NULL) { - printf("%s: couldn't establish interrupt\n", - sc->sc_dev.dv_xname); - return; - } - - bha_attach(sc, &bpd); - -#if NAHA > 0 - /* XXXX To avoid conflicting with the aha1542 probe */ - btports[nbtports++] = ia->ia_iobase; -#endif -} diff --git a/sys/dev/isa/files.isa b/sys/dev/isa/files.isa index fc08c9fa43a..22734ed33d6 100644 --- a/sys/dev/isa/files.isa +++ b/sys/dev/isa/files.isa @@ -1,4 +1,4 @@ -# $OpenBSD: files.isa,v 1.122 2016/09/03 21:37:29 tedu Exp $ +# $OpenBSD: files.isa,v 1.123 2016/09/04 10:35:39 tedu Exp $ # $NetBSD: files.isa,v 1.21 1996/05/16 03:45:55 mycroft Exp $ # # Config file and device description for machine-independent ISA code. @@ -96,10 +96,6 @@ file dev/isa/pcdisplay.c pcdisplay needs-flag # SCSI host adapters # -# BusLogic BT-74x EISA family (XXX; should be EISA. it's special) -attach bha at isa with bha_isa: isa_dma -file dev/isa/bha_isa.c bha_isa - # Adaptec AIC-6[32]60 ICs attach aic at isa with aic_isa: isa_dma file dev/isa/aic_isa.c aic_isa diff --git a/sys/dev/pci/bha_pci.c b/sys/dev/pci/bha_pci.c deleted file mode 100644 index 152567ee7ec..00000000000 --- a/sys/dev/pci/bha_pci.c +++ /dev/null @@ -1,156 +0,0 @@ -/* $OpenBSD: bha_pci.c,v 1.11 2011/04/03 15:36:02 jasper Exp $ */ -/* $NetBSD: bha_pci.c,v 1.16 1998/08/15 10:10:53 mycroft Exp $ */ - -/*- - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/device.h> - -#include <machine/bus.h> -#include <machine/intr.h> - -#include <scsi/scsi_all.h> -#include <scsi/scsiconf.h> - -#include <dev/pci/pcivar.h> -#include <dev/pci/pcidevs.h> - -#include <dev/ic/bhareg.h> -#include <dev/ic/bhavar.h> - -#define PCI_CBIO 0x10 - -int bha_pci_match(struct device *, void *, void *); -void bha_pci_attach(struct device *, struct device *, void *); - -struct cfattach bha_pci_ca = { - sizeof(struct bha_softc), bha_pci_match, bha_pci_attach -}; - -const struct pci_matchid bha_pci_devices[] = { - { PCI_VENDOR_BUSLOGIC, PCI_PRODUCT_BUSLOGIC_MULTIMASTER_NC }, - { PCI_VENDOR_BUSLOGIC, PCI_PRODUCT_BUSLOGIC_MULTIMASTER }, -}; - -/* - * Check the slots looking for a board we recognise - * If we find one, note its address (slot) and call - * the actual probe routine to check it out. - */ -int -bha_pci_match(parent, match, aux) - struct device *parent; - void *match, *aux; -{ - struct pci_attach_args *pa = aux; - bus_space_tag_t iot; - bus_space_handle_t ioh; - bus_size_t iosize; - int rv; - - if (pci_matchbyid(pa, bha_pci_devices, nitems(bha_pci_devices)) == 0) - return (0); - - if (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, &iot, &ioh, - NULL, &iosize, 0)) - return (0); - - rv = bha_find(iot, ioh, NULL); - bus_space_unmap(iot, ioh, iosize); - - return (rv); -} - -/* - * Attach all the sub-devices we can find - */ -void -bha_pci_attach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - struct pci_attach_args *pa = aux; - struct bha_softc *sc = (void *)self; - bus_space_tag_t iot; - bus_space_handle_t ioh; - bus_size_t iosize; - struct bha_probe_data bpd; - pci_chipset_tag_t pc = pa->pa_pc; - pci_intr_handle_t ih; - const char *model, *intrstr; - - if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BUSLOGIC_MULTIMASTER_NC) - model = "BusLogic 9xxC SCSI"; - else if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BUSLOGIC_MULTIMASTER) - model = "BusLogic 9xxC SCSI"; - else - model = "unknown model!"; - - if (pci_mapreg_map(pa, PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, &iot, &ioh, - NULL, &iosize, 0)) { - printf(": can't map i/o space\n"); - return; - } - - sc->sc_iot = iot; - sc->sc_ioh = ioh; - sc->sc_dmat = pa->pa_dmat; - if (!bha_find(iot, ioh, &bpd)) { - printf(": bha_find failed\n"); - bus_space_unmap(iot, ioh, iosize); - return; - } - - sc->sc_dmaflags = 0; - - if (pci_intr_map(pa, &ih)) { - printf(": can't map interrupt\n"); - bus_space_unmap(iot, ioh, iosize); - return; - } - intrstr = pci_intr_string(pc, ih); - sc->sc_ih = pci_intr_establish(pc, ih, IPL_BIO, bha_intr, sc, - sc->sc_dev.dv_xname); - if (sc->sc_ih == NULL) { - printf(": can't establish interrupt"); - if (intrstr != NULL) - printf(" at %s", intrstr); - printf("\n"); - bus_space_unmap(iot, ioh, iosize); - return; - } - printf(": %s, %s\n", intrstr, model); - - bha_attach(sc, &bpd); - - bha_disable_isacompat(sc); -} diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci index 40a605b43ec..a6b91fb30d7 100644 --- a/sys/dev/pci/files.pci +++ b/sys/dev/pci/files.pci @@ -1,4 +1,4 @@ -# $OpenBSD: files.pci,v 1.325 2016/08/31 15:53:06 tedu Exp $ +# $OpenBSD: files.pci,v 1.326 2016/09/04 10:35:39 tedu Exp $ # $NetBSD: files.pci,v 1.20 1996/09/24 17:47:15 christos Exp $ # # Config file and device description for machine-independent PCI code. @@ -66,10 +66,6 @@ file dev/pci/adw_pci.c adw_pci file dev/ic/adwlib.c adw_pci file dev/microcode/adw/adwmcode.c adw_pci -# BusLogic BT-9xx PCI family -attach bha at pci with bha_pci -file dev/pci/bha_pci.c bha_pci - # 3ware 5x000/6x000 RAID controllers attach twe at pci with twe_pci file dev/pci/twe_pci.c twe_pci |