summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Unangst <tedu@cvs.openbsd.org>2016-09-03 21:37:30 +0000
committerTed Unangst <tedu@cvs.openbsd.org>2016-09-03 21:37:30 +0000
commitd429d7b806bb0b5f43c45e3ff2b0f504d68d3fb0 (patch)
treecef1ba8acd4875464fdd7b032dd323131a6f3b21
parent549864ea258c6c04b713005cc6b0535bc4fc0542 (diff)
the src tree is growing too large. delete the aha and ahb drivers in
order to make room for llvm. er, the llvm makefiles. er, some of them.
-rw-r--r--share/man/man4/Makefile4
-rw-r--r--share/man/man4/aha.461
-rw-r--r--share/man/man4/ahb.445
-rw-r--r--share/man/man4/eisa.46
-rw-r--r--share/man/man4/isa.46
-rw-r--r--share/man/man4/isapnp.46
-rw-r--r--sys/arch/hppa/conf/GENERIC3
-rw-r--r--sys/arch/i386/conf/GENERIC6
-rw-r--r--sys/arch/i386/conf/RAMDISK_CD6
-rw-r--r--sys/dev/eisa/aha1742.c1131
-rw-r--r--sys/dev/eisa/files.eisa7
-rw-r--r--sys/dev/isa/aha.c1412
-rw-r--r--sys/dev/isa/ahareg.h269
-rw-r--r--sys/dev/isa/files.isa7
14 files changed, 13 insertions, 2956 deletions
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile
index 7e8eff69446..e8a6788da8e 100644
--- a/share/man/man4/Makefile
+++ b/share/man/man4/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.640 2016/09/03 16:18:21 tedu Exp $
+# $OpenBSD: Makefile,v 1.641 2016/09/03 21:37:28 tedu Exp $
MAN= aac.4 ac97.4 acphy.4 \
acpi.4 acpiac.4 acpials.4 acpiasus.4 acpibat.4 \
@@ -8,7 +8,7 @@ MAN= aac.4 ac97.4 acphy.4 \
acpivout.4 acpitz.4 \
acx.4 adc.4 addcom.4 adl.4 admcts.4 admlc.4 admtemp.4 \
admtm.4 admtmp.4 admtt.4 adt.4 adtfsm.4 adv.4 age.4 alc.4 ale.4 agp.4 \
- aha.4 ahb.4 ahc.4 ahci.4 ahd.4 aibs.4 aic.4 \
+ ahc.4 ahci.4 ahd.4 aibs.4 aic.4 \
akbd.4 alipm.4 amas.4 amdiic.4 amdpm.4 ami.4 amphy.4 \
ams.4 an.4 andl.4 aps.4 arc.4 arcofi.4 \
asbtm.4 asmc.4 ast.4 atapiscsi.4 atphy.4 ath.4 athn.4 atu.4 atw.4 \
diff --git a/share/man/man4/aha.4 b/share/man/man4/aha.4
deleted file mode 100644
index 0a1a419e5f0..00000000000
--- a/share/man/man4/aha.4
+++ /dev/null
@@ -1,61 +0,0 @@
-.\" $OpenBSD: aha.4,v 1.10 2012/08/14 01:08:19 dlg 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 AHA 4
-.Os
-.Sh NAME
-.Nm aha
-.Nd Adaptec 154x SCSI interface
-.Sh SYNOPSIS
-.Cd "aha0 at isa? port 0x330"
-.Cd "aha1 at isa? port 0x334"
-.Sh DESCRIPTION
-The
-.Nm
-driver provides support for the following SCSI adapters:
-.Pp
-.Bl -tag -width Ds -offset indent -compact
-.It Adaptec AHA-1540
-.It Adaptec AHA-154xA
-.It Adaptec AHA-154xB
-.It Adaptec AHA-1542C
-.It Adaptec AHA-1542CF
-.It Adaptec AHA-1542CP
-.It Adaptec AHA-1640
-.It Buslogic BT-54x
-.It Tekram DC-300B
-.It Tekram DC-320E
-.El
-.Pp
-This driver uses bounce buffers if the machine has more than 16
-megabytes of memory.
-.Sh SEE ALSO
-.Xr cd 4 ,
-.Xr ch 4 ,
-.Xr intro 4 ,
-.Xr scsi 4 ,
-.Xr sd 4 ,
-.Xr st 4 ,
-.Xr uk 4
diff --git a/share/man/man4/ahb.4 b/share/man/man4/ahb.4
deleted file mode 100644
index 75696eff4c7..00000000000
--- a/share/man/man4/ahb.4
+++ /dev/null
@@ -1,45 +0,0 @@
-.\" $OpenBSD: ahb.4,v 1.9 2012/08/14 01:08:19 dlg 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 AHB 4
-.Os
-.Sh NAME
-.Nm ahb
-.Nd Adaptec 1742 SCSI interface
-.Sh SYNOPSIS
-.Cd "ahb0 at eisa?"
-.Sh DESCRIPTION
-The
-.Nm
-driver provides support for the Adaptec AHA-1742 EISA SCSI adapter.
-.Sh SEE ALSO
-.Xr cd 4 ,
-.Xr ch 4 ,
-.Xr eisa 4 ,
-.Xr intro 4 ,
-.Xr scsi 4 ,
-.Xr sd 4 ,
-.Xr st 4 ,
-.Xr uk 4
diff --git a/share/man/man4/eisa.4 b/share/man/man4/eisa.4
index 268ad1d82a6..2ba226e0b3f 100644
--- a/share/man/man4/eisa.4
+++ b/share/man/man4/eisa.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: eisa.4,v 1.20 2015/04/18 12:04:59 jmc Exp $
+.\" $OpenBSD: eisa.4,v 1.21 2016/09/03 21:37:29 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: April 18 2015 $
+.Dd $Mdocdate: September 3 2016 $
.Dt EISA 4
.Os
.Sh NAME
@@ -70,8 +70,6 @@ DPT EATA SCSI RAID controller
.El
.Ss SCSI interfaces
.Bl -tag -width 12n -offset ind -compact
-.It Xr ahb 4
-Adaptec 1742 SCSI interface
.It Xr ahc 4
Adaptec VL/EISA/PCI SCSI interface
.It Xr bha 4
diff --git a/share/man/man4/isa.4 b/share/man/man4/isa.4
index b3d97d83762..57a4394324b 100644
--- a/share/man/man4/isa.4
+++ b/share/man/man4/isa.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: isa.4,v 1.76 2016/08/31 16:54:33 jmc Exp $
+.\" $OpenBSD: isa.4,v 1.77 2016/09/03 21:37:29 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: August 31 2016 $
+.Dd $Mdocdate: September 3 2016 $
.Dt ISA 4
.Os
.Sh NAME
@@ -83,8 +83,6 @@ provides support for the following devices.
Note that not all architectures support all devices.
.Ss SCSI controllers
.Bl -tag -width 12n -offset ind -compact
-.It Xr aha 4
-Adaptec 154x SCSI interface
.It Xr aic 4
Adaptec AIC-6260 and AIC-6360 SCSI interface
.It Xr bha 4
diff --git a/share/man/man4/isapnp.4 b/share/man/man4/isapnp.4
index 9d47fdd1a04..fb8ee28093a 100644
--- a/share/man/man4/isapnp.4
+++ b/share/man/man4/isapnp.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: isapnp.4,v 1.41 2016/08/31 16:54:33 jmc Exp $
+.\" $OpenBSD: isapnp.4,v 1.42 2016/09/03 21:37:29 tedu Exp $
.\" $NetBSD: isapnp.4,v 1.8 1998/06/07 09:08:46 enami 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: August 31 2016 $
+.Dd $Mdocdate: September 3 2016 $
.Dt ISAPNP 4
.Os
.Sh NAME
@@ -52,8 +52,6 @@ includes machine-independent ISAPNP drivers, sorted by function
and driver name:
.Ss Disk controllers
.Bl -tag -width 12n -offset ind -compact
-.It Xr aha 4
-Adaptec 154x SCSI interface
.It Xr aic 4
Adaptec AIC-6260 and AIC-6360 SCSI interface
.It Xr wdc 4
diff --git a/sys/arch/hppa/conf/GENERIC b/sys/arch/hppa/conf/GENERIC
index fa3276c59fa..b1653d63d46 100644
--- a/sys/arch/hppa/conf/GENERIC
+++ b/sys/arch/hppa/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.171 2016/06/28 04:41:37 jmatthew Exp $
+# $OpenBSD: GENERIC,v 1.172 2016/09/03 21:37:29 tedu Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -240,7 +240,6 @@ pckbd* at gsckbc? # PS/2 keyboard
pms* at gsckbc? # PS/2 mouse
#sh* at eisa? # Interphase Seahawk 4811 EISA/FDDI
-#ahb* at eisa? # Adaptec 174[024] SCSI controllers
#ahc* at eisa? # Adaptec 274x, aic7770 SCSI controllers
ahc* at pci? # Adaptec 2940 SCSI controllers
mpi* at pci? # LSI Logic Fusion MPT Message Passing Interface
diff --git a/sys/arch/i386/conf/GENERIC b/sys/arch/i386/conf/GENERIC
index b62389c36be..e5aecd1e01d 100644
--- a/sys/arch/i386/conf/GENERIC
+++ b/sys/arch/i386/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.820 2016/09/03 16:18:21 tedu Exp $
+# $OpenBSD: GENERIC,v 1.821 2016/09/03 21:37:29 tedu Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -428,10 +428,6 @@ bha1 at isa? disable port 0x334 # BusLogic [57]4X SCSI controllers
bha2 at isa? disable
bha* at pci?
#bha* at eisa? # XXX eisa still runs in isa-compat
-aha0 at isa? port 0x330 # Adaptec 154[02] SCSI controllers
-aha1 at isa? port 0x334 # Adaptec 154[02] SCSI controllers
-aha* at isapnp?
-ahb* at eisa? # Adaptec 174[024] SCSI controllers
#ahc0 at isa? # Adaptec 284x SCSI controllers
ahc* at eisa? # Adaptec 274x, aic7770 SCSI controllers
ahc* at pci? # Adaptec 2940/3940/78?? SCSI controllers
diff --git a/sys/arch/i386/conf/RAMDISK_CD b/sys/arch/i386/conf/RAMDISK_CD
index 29d63292768..7a965889d9f 100644
--- a/sys/arch/i386/conf/RAMDISK_CD
+++ b/sys/arch/i386/conf/RAMDISK_CD
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK_CD,v 1.229 2016/06/28 04:41:37 jmatthew Exp $
+# $OpenBSD: RAMDISK_CD,v 1.230 2016/09/03 21:37:29 tedu Exp $
machine i386
maxusers 4
@@ -129,10 +129,6 @@ com* at isapnp?
bha0 at isa? port 0x330 # BusLogic [57]4X SCSI controllers
bha* at pci?
-aha0 at isa? port 0x330 # Adaptec 154[02] SCSI controllers
-aha1 at isa? port 0x334 # Adaptec 154[02] SCSI controllers
-aha* at isapnp?
-ahb* at eisa? # Adaptec 174[024] SCSI controllers
ahc* at eisa? # Adaptec 274x, aic7770 SCSI controllers
ahc* at pci? # Adaptec 2940/3940/78?? SCSI controllers
jmb* at pci? # JMicron JMB36x controllers
diff --git a/sys/dev/eisa/aha1742.c b/sys/dev/eisa/aha1742.c
deleted file mode 100644
index 2a7b67f56b5..00000000000
--- a/sys/dev/eisa/aha1742.c
+++ /dev/null
@@ -1,1131 +0,0 @@
-/* $OpenBSD: aha1742.c,v 1.44 2014/09/14 14:17:24 jsg Exp $ */
-/* $NetBSD: aha1742.c,v 1.61 1996/05/12 23:40:01 mycroft Exp $ */
-
-/*
- * Copyright (c) 1994 Charles Hannum. 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. 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.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Charles Hannum.
- * 4. 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.
- */
-
-/*
- * 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.
- *
- * commenced: Sun Sep 27 18:14:01 PDT 1992
- */
-
-#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 <dev/eisa/eisareg.h>
-#include <dev/eisa/eisavar.h>
-#include <dev/eisa/eisadevs.h>
-
-#include <scsi/scsi_all.h>
-#include <scsi/scsiconf.h>
-
-typedef u_long physaddr;
-typedef u_long physlen;
-
-#define KVTOPHYS(x) kvtop((caddr_t)x)
-
-#define AHB_ECB_MAX 32 /* store up to 32 ECBs at one time */
-#define ECB_HASH_SIZE 32 /* hash table size for phystokv */
-#define ECB_HASH_SHIFT 9
-#define ECB_HASH(x) ((((long)(x))>>ECB_HASH_SHIFT) & (ECB_HASH_SIZE - 1))
-
-#define AHB_NSEG 33 /* number of dma segments supported */
-
-/*
- * EISA registers (offset from slot base)
- */
-#define EISA_VENDOR 0x0c80 /* vendor ID (2 ports) */
-#define EISA_MODEL 0x0c82 /* model number (2 ports) */
-#define EISA_CONTROL 0x0c84
-#define EISA_RESET 0x04
-#define EISA_ERROR 0x02
-#define EISA_ENABLE 0x01
-
-/*
- * AHA1740 EISA board mode registers (Offset from slot base)
- */
-#define PORTADDR 0xCC0
-#define PORTADDR_ENHANCED 0x80
-#define BIOSADDR 0xCC1
-#define INTDEF 0xCC2
-#define SCSIDEF 0xCC3
-#define BUSDEF 0xCC4
-#define RESV0 0xCC5
-#define RESV1 0xCC6
-#define RESV2 0xCC7
-/**** bit definitions for INTDEF ****/
-#define INT9 0x00
-#define INT10 0x01
-#define INT11 0x02
-#define INT12 0x03
-#define INT14 0x05
-#define INT15 0x06
-#define INTHIGH 0x08 /* int high=ACTIVE (else edge) */
-#define INTEN 0x10
-/**** bit definitions for SCSIDEF ****/
-#define HSCSIID 0x0F /* our SCSI ID */
-#define RSTPWR 0x10 /* reset scsi bus on power up or reset */
-/**** bit definitions for BUSDEF ****/
-#define B0uS 0x00 /* give up bus immediately */
-#define B4uS 0x01 /* delay 4uSec. */
-#define B8uS 0x02
-
-/*
- * AHA1740 ENHANCED mode mailbox control regs (Offset from slot base)
- */
-#define MBOXOUT0 0xCD0
-#define MBOXOUT1 0xCD1
-#define MBOXOUT2 0xCD2
-#define MBOXOUT3 0xCD3
-
-#define ATTN 0xCD4
-#define G2CNTRL 0xCD5
-#define G2INTST 0xCD6
-#define G2STAT 0xCD7
-
-#define MBOXIN0 0xCD8
-#define MBOXIN1 0xCD9
-#define MBOXIN2 0xCDA
-#define MBOXIN3 0xCDB
-
-#define G2STAT2 0xCDC
-
-/*
- * Bit definitions for the 5 control/status registers
- */
-#define ATTN_TARGET 0x0F
-#define ATTN_OPCODE 0xF0
-#define OP_IMMED 0x10
-#define AHB_TARG_RESET 0x80
-#define OP_START_ECB 0x40
-#define OP_ABORT_ECB 0x50
-
-#define G2CNTRL_SET_HOST_READY 0x20
-#define G2CNTRL_CLEAR_EISA_INT 0x40
-#define G2CNTRL_HARD_RESET 0x80
-
-#define G2INTST_TARGET 0x0F
-#define G2INTST_INT_STAT 0xF0
-#define AHB_ECB_OK 0x10
-#define AHB_ECB_RECOVERED 0x50
-#define AHB_HW_ERR 0x70
-#define AHB_IMMED_OK 0xA0
-#define AHB_ECB_ERR 0xC0
-#define AHB_ASN 0xD0 /* for target mode */
-#define AHB_IMMED_ERR 0xE0
-
-#define G2STAT_BUSY 0x01
-#define G2STAT_INT_PEND 0x02
-#define G2STAT_MBOX_EMPTY 0x04
-
-#define G2STAT2_HOST_READY 0x01
-
-struct ahb_dma_seg {
- physaddr seg_addr;
- physlen seg_len;
-};
-
-struct ahb_ecb_status {
- u_short status;
-#define ST_DON 0x0001
-#define ST_DU 0x0002
-#define ST_QF 0x0008
-#define ST_SC 0x0010
-#define ST_DO 0x0020
-#define ST_CH 0x0040
-#define ST_INT 0x0080
-#define ST_ASA 0x0100
-#define ST_SNS 0x0200
-#define ST_INI 0x0800
-#define ST_ME 0x1000
-#define ST_ECA 0x4000
- u_char host_stat;
-#define HS_OK 0x00
-#define HS_CMD_ABORTED_HOST 0x04
-#define HS_CMD_ABORTED_ADAPTER 0x05
-#define HS_TIMED_OUT 0x11
-#define HS_HARDWARE_ERR 0x20
-#define HS_SCSI_RESET_ADAPTER 0x22
-#define HS_SCSI_RESET_INCOMING 0x23
- u_char target_stat;
- u_long resid_count;
- u_long resid_addr;
- u_short addit_status;
- u_char sense_len;
- u_char unused[9];
- u_char cdb[6];
-};
-
-struct ahb_ecb {
- u_char opcode;
-#define ECB_SCSI_OP 0x01
- u_char:4;
- u_char options:3;
- u_char:1;
- short opt1;
-#define ECB_CNE 0x0001
-#define ECB_DI 0x0080
-#define ECB_SES 0x0400
-#define ECB_S_G 0x1000
-#define ECB_DSB 0x4000
-#define ECB_ARS 0x8000
- short opt2;
-#define ECB_LUN 0x0007
-#define ECB_TAG 0x0008
-#define ECB_TT 0x0030
-#define ECB_ND 0x0040
-#define ECB_DAT 0x0100
-#define ECB_DIR 0x0200
-#define ECB_ST 0x0400
-#define ECB_CHK 0x0800
-#define ECB_REC 0x4000
-#define ECB_NRB 0x8000
- u_short unused1;
- physaddr data_addr;
- physlen data_length;
- physaddr status;
- physaddr link_addr;
- short unused2;
- short unused3;
- physaddr sense_ptr;
- u_char req_sense_length;
- u_char scsi_cmd_length;
- short cksum;
- struct scsi_generic scsi_cmd;
- /*-----------------end of hardware supported fields----------------*/
- TAILQ_ENTRY(ahb_ecb) chain;
- struct ahb_ecb *nexthash;
- long hashkey;
- struct scsi_xfer *xs; /* the scsi_xfer for this cmd */
- int flags;
-#define ECB_FREE 0
-#define ECB_ACTIVE 1
-#define ECB_ABORTED 2
-#define ECB_IMMED 4
-#define ECB_IMMED_FAIL 8
- struct ahb_dma_seg ahb_dma[AHB_NSEG];
- struct ahb_ecb_status ecb_status;
- struct scsi_sense_data ecb_sense;
-};
-
-struct ahb_softc {
- struct device sc_dev;
- bus_space_tag_t sc_iot;
- eisa_chipset_tag_t sc_ec;
-
- bus_space_handle_t sc_ioh;
- int sc_irq;
- void *sc_ih;
-
- struct ahb_ecb *immed_ecb; /* an outstanding immediate command */
- struct ahb_ecb *ecbhash[ECB_HASH_SIZE];
- TAILQ_HEAD(, ahb_ecb) free_ecb;
- int numecbs;
- int ahb_scsi_dev; /* our scsi id */
- struct scsi_link sc_link;
- struct mutex sc_ecb_mtx;
- struct scsi_iopool sc_iopool;
-};
-
-void ahb_send_mbox(struct ahb_softc *, int, struct ahb_ecb *);
-int ahb_poll(struct ahb_softc *, struct scsi_xfer *, int);
-void ahb_send_immed(struct ahb_softc *, int, u_long);
-int ahbintr(void *);
-void ahb_done(struct ahb_softc *, struct ahb_ecb *);
-void ahb_ecb_free(void *, void *);
-void *ahb_ecb_alloc(void *);
-struct ahb_ecb *ahb_ecb_phys_kv(struct ahb_softc *, physaddr);
-int ahb_find(bus_space_tag_t, bus_space_handle_t, struct ahb_softc *);
-void ahb_init(struct ahb_softc *);
-void ahbminphys(struct buf *, struct scsi_link *);
-void ahb_scsi_cmd(struct scsi_xfer *);
-void ahb_timeout(void *);
-void ahb_print_ecb(struct ahb_ecb *);
-void ahb_print_active_ecb(struct ahb_softc *);
-int ahbprint(void *, const char *);
-
-#define MAX_SLOTS 15
-
-#ifdef AHBDEBUG
-int ahb_debug = 0;
-#endif /* AHBDEBUG */
-#define AHB_SHOWECBS 0x01
-#define AHB_SHOWINTS 0x02
-#define AHB_SHOWCMDS 0x04
-#define AHB_SHOWMISC 0x08
-
-struct scsi_adapter ahb_switch = {
- ahb_scsi_cmd,
- ahbminphys,
- 0,
- 0,
-};
-
-int ahbmatch(struct device *, void *, void *);
-void ahbattach(struct device *, struct device *, void *);
-
-struct cfattach ahb_ca = {
- sizeof(struct ahb_softc), ahbmatch, ahbattach
-};
-
-struct cfdriver ahb_cd = {
- NULL, "ahb", DV_DULL
-};
-
-/*
- * Function to send a command out through a mailbox
- */
-void
-ahb_send_mbox(sc, opcode, ecb)
- struct ahb_softc *sc;
- int opcode;
- struct ahb_ecb *ecb;
-{
- bus_space_tag_t iot = sc->sc_iot;
- bus_space_handle_t ioh = sc->sc_ioh;
- int wait = 300; /* 1ms should be enough */
-
- while (--wait) {
- if ((bus_space_read_1(iot, ioh, G2STAT) &
- (G2STAT_BUSY | G2STAT_MBOX_EMPTY)) == (G2STAT_MBOX_EMPTY))
- break;
- delay(10);
- }
- if (!wait)
- panic("%s: board not responding", sc->sc_dev.dv_xname);
-
- /* don't know this will work */
- bus_space_write_4(iot, ioh, MBOXOUT0, KVTOPHYS(ecb));
- bus_space_write_1(iot, ioh, ATTN, opcode | ecb->xs->sc_link->target);
-}
-
-/*
- * Function to poll for command completion when in poll mode
- */
-int
-ahb_poll(sc, xs, count)
- struct ahb_softc *sc;
- struct scsi_xfer *xs;
- int count;
-{ /* in msec */
- bus_space_tag_t iot = sc->sc_iot;
- bus_space_handle_t ioh = sc->sc_ioh;
- int s;
-
- while (count) {
- /*
- * If we had interrupts enabled, would we
- * have got an interrupt?
- */
- if (bus_space_read_1(iot, ioh, G2STAT) & G2STAT_INT_PEND) {
- s = splbio();
- ahbintr(sc);
- splx(s);
- }
- if (xs->flags & ITSDONE)
- return 0;
- delay(1000);
- count--;
- }
- return 1;
-}
-
-/*
- * Function to send an immediate type command to the adapter
- */
-void
-ahb_send_immed(sc, target, cmd)
- struct ahb_softc *sc;
- int target;
- u_long cmd;
-{
- bus_space_tag_t iot = sc->sc_iot;
- bus_space_handle_t ioh = sc->sc_ioh;
- int wait = 100; /* 1 ms enough? */
-
- while (--wait) {
- if ((bus_space_read_1(iot, ioh, G2STAT) &
- (G2STAT_BUSY | G2STAT_MBOX_EMPTY)) == (G2STAT_MBOX_EMPTY))
- break;
- delay(10);
- }
- if (!wait)
- panic("%s: board not responding", sc->sc_dev.dv_xname);
-
- /* don't know this will work */
- bus_space_write_4(iot, ioh, MBOXOUT0, cmd);
- bus_space_write_1(iot, ioh, G2CNTRL, G2CNTRL_SET_HOST_READY);
- bus_space_write_1(iot, ioh, ATTN, OP_IMMED | target);
-}
-
-/*
- * 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
-ahbmatch(parent, match, aux)
- struct device *parent;
- void *match, *aux;
-{
- struct eisa_attach_args *ea = aux;
- bus_space_tag_t iot = ea->ea_iot;
- bus_space_handle_t ioh;
- int rv;
-
- /* must match one of our known ID strings */
- if (strcmp(ea->ea_idstring, "ADP0000") &&
- strcmp(ea->ea_idstring, "ADP0001") &&
- strcmp(ea->ea_idstring, "ADP0002") &&
- strcmp(ea->ea_idstring, "ADP0400"))
- return (0);
-
- if (bus_space_map(iot, EISA_SLOT_ADDR(ea->ea_slot), EISA_SLOT_SIZE, 0,
- &ioh))
- return (0);
-
-#ifdef notyet
- /* This won't compile as-is, anyway. */
- bus_space_write_1(iot, ioh, EISA_CONTROL, EISA_ENABLE | EISA_RESET);
- delay(10);
- bus_space_write_1(iot, ioh, EISA_CONTROL, EISA_ENABLE);
- /* Wait for reset? */
- delay(1000);
-#endif
-
- rv = !ahb_find(iot, ioh, NULL);
-
- bus_space_unmap(ea->ea_iot, ioh, EISA_SLOT_SIZE);
-
- return (rv);
-}
-
-int
-ahbprint(aux, name)
- void *aux;
- const char *name;
-{
- return UNCONF;
-}
-
-/*
- * Attach all the sub-devices we can find
- */
-void
-ahbattach(parent, self, aux)
- struct device *parent, *self;
- void *aux;
-{
- struct eisa_attach_args *ea = aux;
- struct ahb_softc *sc = (void *)self;
- struct scsibus_attach_args saa;
- bus_space_tag_t iot = ea->ea_iot;
- bus_space_handle_t ioh;
- eisa_chipset_tag_t ec = ea->ea_ec;
- eisa_intr_handle_t ih;
- const char *model, *intrstr;
-
- sc->sc_iot = iot;
- sc->sc_ec = ec;
-
- if (bus_space_map(iot, EISA_SLOT_ADDR(ea->ea_slot), EISA_SLOT_SIZE, 0,
- &ioh))
- panic("ahbattach: can't map i/o addresses");
- sc->sc_ioh = ioh;
- if (ahb_find(iot, ioh, sc))
- panic("ahbattach: ahb_find failed!");
-
- ahb_init(sc);
- TAILQ_INIT(&sc->free_ecb);
- mtx_init(&sc->sc_ecb_mtx, IPL_BIO);
- scsi_iopool_init(&sc->sc_iopool, sc, ahb_ecb_alloc, ahb_ecb_free);
-
- /*
- * fill in the prototype scsi_link.
- */
- sc->sc_link.adapter_softc = sc;
- sc->sc_link.adapter_target = sc->ahb_scsi_dev;
- sc->sc_link.adapter = &ahb_switch;
- sc->sc_link.openings = 2;
- sc->sc_link.pool = &sc->sc_iopool;
-
- if (!strcmp(ea->ea_idstring, "ADP0000"))
- model = EISA_PRODUCT_ADP0000;
- else if (!strcmp(ea->ea_idstring, "ADP0001"))
- model = EISA_PRODUCT_ADP0001;
- else if (!strcmp(ea->ea_idstring, "ADP0002"))
- model = EISA_PRODUCT_ADP0002;
- else if (!strcmp(ea->ea_idstring, "ADP0400"))
- model = EISA_PRODUCT_ADP0400;
- else
- model = "unknown model!";
- printf(": <%s> ", model);
-
- if (eisa_intr_map(ec, sc->sc_irq, &ih)) {
- printf("%s: couldn't map interrupt (%d)\n",
- sc->sc_dev.dv_xname, sc->sc_irq);
- return;
- }
- intrstr = eisa_intr_string(ec, ih);
- sc->sc_ih = eisa_intr_establish(ec, ih, IST_LEVEL, IPL_BIO,
- ahbintr, sc, sc->sc_dev.dv_xname);
- if (sc->sc_ih == NULL) {
- printf("%s: couldn't establish interrupt",
- sc->sc_dev.dv_xname);
- if (intrstr != NULL)
- printf(" at %s", intrstr);
- printf("\n");
- return;
- }
- if (intrstr != NULL)
- printf("%s\n", intrstr);
-
- bzero(&saa, sizeof(saa));
- saa.saa_sc_link = &sc->sc_link;
-
- /*
- * ask the adapter what subunits are present
- */
- config_found(self, &saa, ahbprint);
-}
-
-/*
- * Catch an interrupt from the adaptor
- */
-int
-ahbintr(arg)
- void *arg;
-{
- struct ahb_softc *sc = arg;
- bus_space_tag_t iot = sc->sc_iot;
- bus_space_handle_t ioh = sc->sc_ioh;
- struct ahb_ecb *ecb;
- u_char ahbstat;
- u_long mboxval;
-
-#ifdef AHBDEBUG
- printf("%s: ahbintr ", sc->sc_dev.dv_xname);
-#endif /* AHBDEBUG */
-
- if ((bus_space_read_1(iot, ioh, G2STAT) & G2STAT_INT_PEND) == 0)
- return 0;
-
- for (;;) {
- /*
- * First get all the information and then
- * acknowledge the interrupt
- */
- ahbstat = bus_space_read_1(iot, ioh, G2INTST);
- mboxval = bus_space_read_4(iot, ioh, MBOXIN0);
- bus_space_write_1(iot, ioh, G2CNTRL, G2CNTRL_CLEAR_EISA_INT);
-
-#ifdef AHBDEBUG
- printf("status = 0x%x ", ahbstat);
-#endif /*AHBDEBUG */
-
- /*
- * Process the completed operation
- */
- switch (ahbstat & G2INTST_INT_STAT) {
- case AHB_ECB_OK:
- case AHB_ECB_RECOVERED:
- case AHB_ECB_ERR:
- ecb = ahb_ecb_phys_kv(sc, mboxval);
- if (!ecb) {
- printf("%s: BAD ECB RETURNED!\n",
- sc->sc_dev.dv_xname);
- continue; /* whatever it was, it'll timeout */
- }
- break;
-
- case AHB_IMMED_ERR:
- ecb->flags |= ECB_IMMED_FAIL;
- case AHB_IMMED_OK:
- ecb = sc->immed_ecb;
- sc->immed_ecb = NULL;
- break;
-
- default:
- printf("%s: unexpected interrupt %x\n",
- sc->sc_dev.dv_xname, ahbstat);
- ecb = 0;
- break;
- }
- if (ecb) {
-#ifdef AHBDEBUG
- if (ahb_debug & AHB_SHOWCMDS)
- show_scsi_cmd(ecb->xs);
- if ((ahb_debug & AHB_SHOWECBS) && ecb)
- printf("<int ecb(%x)>", ecb);
-#endif /*AHBDEBUG */
- timeout_del(&ecb->xs->stimeout);
- ahb_done(sc, ecb);
- }
-
- if ((bus_space_read_1(iot, ioh, G2STAT) & G2STAT_INT_PEND) ==
- 0)
- return 1;
- }
-}
-
-/*
- * We have a ecb which has been processed by the adaptor, now we look to see
- * how the operation went.
- */
-void
-ahb_done(sc, ecb)
- struct ahb_softc *sc;
- struct ahb_ecb *ecb;
-{
- struct ahb_ecb_status *stat = &ecb->ecb_status;
- struct scsi_sense_data *s1, *s2;
- struct scsi_xfer *xs = ecb->xs;
-
- SC_DEBUG(xs->sc_link, SDEV_DB2, ("ahb_done\n"));
- /*
- * Otherwise, put the results of the operation
- * into the xfer and call whoever started it
- */
- if (ecb->flags & ECB_IMMED) {
- if (ecb->flags & ECB_IMMED_FAIL)
- xs->error = XS_DRIVER_STUFFUP;
- goto done;
- }
- if (xs->error == XS_NOERROR) {
- if (stat->host_stat != HS_OK) {
- switch (stat->host_stat) {
- case HS_SCSI_RESET_ADAPTER:
- break;
- case HS_SCSI_RESET_INCOMING:
- break;
- case HS_CMD_ABORTED_HOST:
- case HS_CMD_ABORTED_ADAPTER:
- xs->error = XS_DRIVER_STUFFUP;
- break;
- case HS_TIMED_OUT: /* No response */
- xs->error = XS_SELTIMEOUT;
- break;
- default: /* Other scsi protocol messes */
- printf("%s: host_stat %x\n",
- sc->sc_dev.dv_xname, stat->host_stat);
- xs->error = XS_DRIVER_STUFFUP;
- }
- } else if (stat->target_stat != SCSI_OK) {
- switch (stat->target_stat) {
- case SCSI_CHECK:
- s1 = &ecb->ecb_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, stat->target_stat);
- xs->error = XS_DRIVER_STUFFUP;
- }
- } else
- xs->resid = 0;
- }
-done:
- scsi_done(xs);
-}
-
-/*
- * A ecb (and hence a mbx-out) is put onto the free list.
- */
-void
-ahb_ecb_free(xsc, xecb)
- void *xsc, *xecb;
-{
- struct ahb_softc *sc = xsc;
- struct ahb_ecb *ecb = xecb;
-
- ecb->flags = ECB_FREE;
-
- mtx_enter(&sc->sc_ecb_mtx);
- TAILQ_INSERT_HEAD(&sc->free_ecb, ecb, chain);
- mtx_leave(&sc->sc_ecb_mtx);
-}
-
-static inline void ahb_init_ecb(struct ahb_softc *, struct ahb_ecb *);
-
-static inline void
-ahb_init_ecb(sc, ecb)
- struct ahb_softc *sc;
- struct ahb_ecb *ecb;
-{
- int hashnum;
-
- bzero(ecb, sizeof(struct ahb_ecb));
- /*
- * put in the phystokv hash table
- * Never gets taken out.
- */
- ecb->hashkey = KVTOPHYS(ecb);
- hashnum = ECB_HASH(ecb->hashkey);
- ecb->nexthash = sc->ecbhash[hashnum];
- sc->ecbhash[hashnum] = ecb;
-}
-
-/*
- * Get a free ecb
- */
-void *
-ahb_ecb_alloc(xsc)
- void *xsc;
-{
- struct ahb_softc *sc = xsc;
- struct ahb_ecb *ecb;
-
- mtx_enter(&sc->sc_ecb_mtx);
- ecb = TAILQ_FIRST(&sc->free_ecb);
- if (ecb) {
- TAILQ_REMOVE(&sc->free_ecb, ecb, chain);
- ecb->flags = ECB_ACTIVE;
- }
- mtx_leave(&sc->sc_ecb_mtx);
-
- return ecb;
-}
-
-/*
- * given a physical address, find the ecb that it corresponds to.
- */
-struct ahb_ecb *
-ahb_ecb_phys_kv(sc, ecb_phys)
- struct ahb_softc *sc;
- physaddr ecb_phys;
-{
- int hashnum = ECB_HASH(ecb_phys);
- struct ahb_ecb *ecb = sc->ecbhash[hashnum];
-
- while (ecb) {
- if (ecb->hashkey == ecb_phys)
- break;
- ecb = ecb->nexthash;
- }
- return ecb;
-}
-
-/*
- * Start the board, ready for normal operation
- */
-int
-ahb_find(iot, ioh, sc)
- bus_space_tag_t iot;
- bus_space_handle_t ioh;
- struct ahb_softc *sc;
-{
- u_char intdef;
- int i, irq, busid;
- int wait = 1000; /* 1 sec enough? */
-
- bus_space_write_1(iot, ioh, PORTADDR, PORTADDR_ENHANCED);
-
-#define NO_NO 1
-#ifdef NO_NO
- /*
- * reset board, If it doesn't respond, assume
- * that it's not there.. good for the probe
- */
- bus_space_write_1(iot, ioh, G2CNTRL, G2CNTRL_HARD_RESET);
- delay(1000);
- bus_space_write_1(iot, ioh, G2CNTRL, 0);
- delay(10000);
- while (--wait) {
- if ((bus_space_read_1(iot, ioh, G2STAT) & G2STAT_BUSY) == 0)
- break;
- delay(1000);
- }
- if (!wait) {
-#ifdef AHBDEBUG
- if (ahb_debug & AHB_SHOWMISC)
- printf("ahb_find: No answer from aha1742 board\n");
-#endif /*AHBDEBUG */
- return ENXIO;
- }
- i = bus_space_read_1(iot, ioh, MBOXIN0);
- if (i) {
- printf("self test failed, val = 0x%x\n", i);
- return EIO;
- }
-
- /* Set it again, just to be sure. */
- bus_space_write_1(iot, ioh, PORTADDR, PORTADDR_ENHANCED);
-#endif
-
- while (bus_space_read_1(iot, ioh, G2STAT) & G2STAT_INT_PEND) {
- printf(".");
- bus_space_write_1(iot, ioh, G2CNTRL, G2CNTRL_CLEAR_EISA_INT);
- delay(10000);
- }
-
- intdef = bus_space_read_1(iot, ioh, INTDEF);
- switch (intdef & 0x07) {
- 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("illegal int setting %x\n", intdef);
- return EIO;
- }
-
- /* make sure we can interrupt */
- bus_space_write_1(iot, ioh, INTDEF, (intdef | INTEN));
-
- /* who are we on the scsi bus? */
- busid = (bus_space_read_1(iot, ioh, SCSIDEF) & HSCSIID);
-
- /* if we want to fill in softc, do so now */
- if (sc != NULL) {
- sc->sc_irq = irq;
- sc->ahb_scsi_dev = busid;
- }
-
- /*
- * Note that we are going and return (to probe)
- */
- return 0;
-}
-
-void
-ahb_init(sc)
- struct ahb_softc *sc;
-{
-
-}
-
-void
-ahbminphys(struct buf *bp, struct scsi_link *sl)
-{
- if (bp->b_bcount > ((AHB_NSEG - 1) << PGSHIFT))
- bp->b_bcount = ((AHB_NSEG - 1) << PGSHIFT);
- minphys(bp);
-}
-
-/*
- * start a scsi operation given the command and the data address. Also needs
- * the unit, target and lu.
- */
-void
-ahb_scsi_cmd(xs)
- struct scsi_xfer *xs;
-{
- struct scsi_link *sc_link = xs->sc_link;
- struct ahb_softc *sc = sc_link->adapter_softc;
- struct ahb_ecb *ecb;
- struct ahb_dma_seg *sg;
- int seg; /* scatter gather seg being worked on */
- u_long thiskv, thisphys, nextphys;
- int bytes_this_seg, bytes_this_page, datalen, flags;
- int s;
-
- SC_DEBUG(sc_link, SDEV_DB2, ("ahb_scsi_cmd\n"));
- /*
- * get a ecb (mbox-out) to use. If the transfer
- * is from a buf (possibly from interrupt time)
- * then we can't allow it to sleep
- */
- flags = xs->flags;
- ecb = xs->io;
- ecb->flags = ECB_ACTIVE;
- ecb->xs = xs;
- timeout_set(&ecb->xs->stimeout, ahb_timeout, ecb);
-
- /*
- * If it's a reset, we need to do an 'immediate'
- * command, and store its ecb for later
- * if there is already an immediate waiting,
- * then WE must wait
- */
- if (flags & SCSI_RESET) {
- ecb->flags |= ECB_IMMED;
- if (sc->immed_ecb) {
- xs->error = XS_BUSY;
- scsi_done(xs);
- return;
- }
- sc->immed_ecb = ecb;
-
- s = splbio();
-
- ahb_send_immed(sc, sc_link->target, AHB_TARG_RESET);
-
- if ((flags & SCSI_POLL) == 0) {
- splx(s);
- timeout_add_msec(&ecb->xs->stimeout, xs->timeout);
- return;
- }
-
- splx(s);
-
- /*
- * If we can't use interrupts, poll on completion
- */
- if (ahb_poll(sc, xs, xs->timeout))
- ahb_timeout(ecb);
- return;
- }
-
- /*
- * Put all the arguments for the xfer in the ecb
- */
- ecb->opcode = ECB_SCSI_OP;
- ecb->opt1 = ECB_SES | ECB_DSB | ECB_ARS;
- if (xs->datalen)
- ecb->opt1 |= ECB_S_G;
- ecb->opt2 = sc_link->lun | ECB_NRB;
- ecb->scsi_cmd_length = xs->cmdlen;
- ecb->sense_ptr = KVTOPHYS(&ecb->ecb_sense);
- ecb->req_sense_length = sizeof(ecb->ecb_sense);
- ecb->status = KVTOPHYS(&ecb->ecb_status);
- ecb->ecb_status.host_stat = 0x00;
- ecb->ecb_status.target_stat = 0x00;
-
- if (xs->datalen && (flags & SCSI_RESET) == 0) {
- ecb->data_addr = KVTOPHYS(ecb->ahb_dma);
- sg = ecb->ahb_dma;
- seg = 0;
-
- /*
- * Set up the scatter gather block
- */
- SC_DEBUG(sc_link, SDEV_DB4,
- ("%d @0x%x:- ", xs->datalen, xs->data));
- datalen = xs->datalen;
- thiskv = (long) xs->data;
- thisphys = KVTOPHYS(thiskv);
-
- while (datalen && seg < AHB_NSEG) {
- bytes_this_seg = 0;
-
- /* put in the base address */
- sg->seg_addr = thisphys;
-
- SC_DEBUGN(sc_link, SDEV_DB4, ("0x%x", thisphys));
-
- /* do it at least once */
- nextphys = thisphys;
- while (datalen && thisphys == nextphys) {
- /*
- * This page is contiguous (physically)
- * with the last, just extend the
- * length
- */
- /* how far to the end of the page */
- nextphys = (thisphys & ~PGOFSET) + NBPG;
- bytes_this_page = nextphys - thisphys;
- /**** or the data ****/
- bytes_this_page = min(bytes_this_page,
- datalen);
- bytes_this_seg += bytes_this_page;
- datalen -= bytes_this_page;
-
- /* get more ready for the next page */
- thiskv = (thiskv & ~PGOFSET) + NBPG;
- if (datalen)
- thisphys = KVTOPHYS(thiskv);
- }
- /*
- * next page isn't contiguous, finish the seg
- */
- SC_DEBUGN(sc_link, SDEV_DB4,
- ("(0x%x)", bytes_this_seg));
- sg->seg_len = bytes_this_seg;
- sg++;
- seg++;
- }
-
- ecb->data_length = seg * sizeof(struct ahb_dma_seg);
- SC_DEBUGN(sc_link, SDEV_DB4, ("\n"));
- if (datalen) {
- /*
- * there's still data, must have run out of segs!
- */
- printf("%s: ahb_scsi_cmd, more than %d dma segs\n",
- sc->sc_dev.dv_xname, AHB_NSEG);
- xs->error = XS_DRIVER_STUFFUP;
- scsi_done(xs);
- return;
- }
- } else { /* No data xfer, use non S/G values */
- ecb->data_addr = (physaddr)0;
- ecb->data_length = 0;
- }
- ecb->link_addr = (physaddr)0;
-
- /*
- * Put the scsi command in the ecb and start it
- */
- if ((flags & SCSI_RESET) == 0)
- bcopy(xs->cmd, &ecb->scsi_cmd, ecb->scsi_cmd_length);
-
- s = splbio();
-
- ahb_send_mbox(sc, OP_START_ECB, ecb);
-
- /*
- * Usually return SUCCESSFULLY QUEUED
- */
- if ((flags & SCSI_POLL) == 0) {
- splx(s);
- timeout_add_msec(&ecb->xs->stimeout, xs->timeout);
- return;
- }
-
- splx(s);
-
- /*
- * If we can't use interrupts, poll on completion
- */
- if (ahb_poll(sc, xs, xs->timeout)) {
- ahb_timeout(ecb);
- if (ahb_poll(sc, xs, 2000))
- ahb_timeout(ecb);
- }
-}
-
-void
-ahb_timeout(arg)
- void *arg;
-{
- struct ahb_ecb *ecb = arg;
- struct scsi_xfer *xs = ecb->xs;
- struct scsi_link *sc_link = xs->sc_link;
- struct ahb_softc *sc = sc_link->adapter_softc;
- int s;
-
- sc_print_addr(sc_link);
- printf("timed out");
-
- s = splbio();
-
- if (ecb->flags & ECB_IMMED) {
- printf("\n");
- ecb->xs->retries = 0; /* I MEAN IT ! */
- ecb->flags |= ECB_IMMED_FAIL;
- ahb_done(sc, ecb);
- splx(s);
- return;
- }
-
- /*
- * If it has been through before, then
- * a previous abort has failed, don't
- * try abort again
- */
- if (ecb->flags == ECB_ABORTED) {
- /* abort timed out */
- printf(" AGAIN\n");
- ecb->xs->retries = 0; /* I MEAN IT ! */
- ahb_done(sc, ecb);
- } else {
- /* abort the operation that has timed out */
- printf("\n");
- ecb->xs->error = XS_TIMEOUT;
- ecb->flags = ECB_ABORTED;
- ahb_send_mbox(sc, OP_ABORT_ECB, ecb);
- /* 2 secs for the abort */
- if ((xs->flags & SCSI_POLL) == 0)
- timeout_add_sec(&ecb->xs->stimeout, 2);
- }
-
- splx(s);
-}
-
-#ifdef AHBDEBUG
-void
-ahb_print_ecb(ecb)
- struct ahb_ecb *ecb;
-{
- printf("ecb:%x op:%x cmdlen:%d senlen:%d\n",
- ecb, ecb->opcode, ecb->cdblen, ecb->senselen);
- printf(" datlen:%d hstat:%x tstat:%x flags:%x\n",
- ecb->datalen, ecb->ecb_status.host_stat,
- ecb->ecb_status.target_stat, ecb->flags);
- show_scsi_cmd(ecb->xs);
-}
-
-void
-ahb_print_active_ecb(sc)
- struct ahb_softc *sc;
-{
- struct ahb_ecb *ecb;
- int i = 0;
-
- while (i++ < ECB_HASH_SIZE) {
- ecb = sc->ecb_hash_list[i];
- while (ecb) {
- if (ecb->flags != ECB_FREE)
- ahb_print_ecb(ecb);
- ecb = ecb->hash_list;
- }
- }
-}
-#endif /* AHBDEBUG */
diff --git a/sys/dev/eisa/files.eisa b/sys/dev/eisa/files.eisa
index 4ab6dc1d8e0..6b466ef330e 100644
--- a/sys/dev/eisa/files.eisa
+++ b/sys/dev/eisa/files.eisa
@@ -1,4 +1,4 @@
-# $OpenBSD: files.eisa,v 1.11 2013/10/28 12:33:32 mpi Exp $
+# $OpenBSD: files.eisa,v 1.12 2016/09/03 21:37:29 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.
@@ -9,11 +9,6 @@ device eisa {[slot = -1]}
attach eisa at eisabus
file dev/eisa/eisa.c eisa needs-flag
-# Adaptec AHA-174x EISA SCSI Host Adapter family
-device ahb: scsi
-attach ahb at eisa
-file dev/eisa/aha1742.c ahb
-
# Adaptec AHA-274X and aic7770 motherboard SCSI controllers
# device declaration in sys/conf/files
attach ahc at eisa with ahc_eisa
diff --git a/sys/dev/isa/aha.c b/sys/dev/isa/aha.c
deleted file mode 100644
index 7546f98b525..00000000000
--- a/sys/dev/isa/aha.c
+++ /dev/null
@@ -1,1412 +0,0 @@
-/* $OpenBSD: aha.c,v 1.81 2016/03/14 23:08:06 krw Exp $ */
-/* $NetBSD: aha.c,v 1.11 1996/05/12 23:51:23 mycroft Exp $ */
-
-#undef AHADIAG
-
-/*
- * Copyright (c) 1994, 1996 Charles M. Hannum. 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. 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.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Charles M. Hannum.
- * 4. 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.
- */
-
-/*
- * 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 <sys/timeout.h>
-
-#include <uvm/uvm_extern.h>
-
-#include <machine/intr.h>
-#include <machine/bus.h>
-
-#include <scsi/scsi_all.h>
-#include <scsi/scsiconf.h>
-
-#include <dev/isa/isavar.h>
-#include <dev/isa/isadmavar.h>
-#include <dev/isa/ahareg.h>
-
-/* XXX fixme:
- * on i386 at least, xfers to/from user memory
- * cannot be serviced at interrupt time.
- */
-#ifdef __i386__
-#define VOLATILE_XS(xs) \
- ((xs)->datalen > 0 && (xs)->bp == NULL && \
- ((xs)->flags & SCSI_POLL) == 0)
-#else
-#define VOLATILE_XS(xs) 0
-#endif
-
-/*
- * Mail box defs etc.
- * these could be bigger but we need the aha_softc to fit on a single page..
- */
-#define AHA_MBX_SIZE 16 /* mail box size */
-
-#define AHA_CCB_MAX 16 /* store up to 32 CCBs at one time */
-#define CCB_HASH_SIZE 16 /* hash table size for phystokv */
-#define CCB_HASH_SHIFT 9
-#define CCB_HASH(x) ((((long)(x))>>CCB_HASH_SHIFT) & (CCB_HASH_SIZE - 1))
-
-#define aha_nextmbx(wmb, mbx, mbio) \
- if ((wmb) == &(mbx)->mbio[AHA_MBX_SIZE - 1]) \
- (wmb) = &(mbx)->mbio[0]; \
- else \
- (wmb)++;
-
-struct aha_mbx {
- struct aha_mbx_out mbo[AHA_MBX_SIZE];
- struct aha_mbx_in mbi[AHA_MBX_SIZE];
- struct aha_mbx_out *cmbo; /* Collection Mail Box out */
- struct aha_mbx_out *tmbo; /* Target Mail Box out */
- struct aha_mbx_in *tmbi; /* Target Mail Box in */
-};
-
-struct aha_softc {
- struct device sc_dev;
- struct isadev sc_id;
- void *sc_ih;
- bus_dma_tag_t sc_dmat;
-
- int sc_iobase;
- int sc_irq, sc_drq;
-
- char sc_model[18],
- sc_firmware[4];
-
- struct aha_mbx *sc_mbx; /* all the mailboxes */
-#define wmbx (sc->sc_mbx)
- struct aha_ccb *sc_ccbhash[CCB_HASH_SIZE];
- TAILQ_HEAD(, aha_ccb) sc_free_ccb, sc_waiting_ccb;
- int sc_numccbs, sc_mbofull;
- int sc_scsi_dev; /* our scsi id */
- struct scsi_link sc_link;
-
- struct mutex sc_ccb_mtx;
- struct scsi_iopool sc_iopool;
-};
-
-#ifdef AHADEBUG
-int aha_debug = 1;
-#endif /* AHADEBUG */
-
-int aha_cmd(int, struct aha_softc *, int, u_char *, int, u_char *);
-void aha_finish_ccbs(struct aha_softc *);
-int ahaintr(void *);
-void aha_reset_ccb(struct aha_softc *, struct aha_ccb *);
-void aha_ccb_free(void *, void *);
-int aha_init_ccb(struct aha_softc *, struct aha_ccb *, int);
-void *aha_ccb_alloc(void *);
-struct aha_ccb *aha_ccb_phys_kv(struct aha_softc *, u_long);
-void aha_queue_ccb(struct aha_softc *, struct aha_ccb *);
-void aha_collect_mbo(struct aha_softc *);
-void aha_start_ccbs(struct aha_softc *);
-void aha_done(struct aha_softc *, struct aha_ccb *);
-int aha_find(struct isa_attach_args *, struct aha_softc *, int);
-void aha_init(struct aha_softc *);
-void aha_inquire_setup_information(struct aha_softc *);
-void ahaminphys(struct buf *, struct scsi_link *);
-void aha_scsi_cmd(struct scsi_xfer *);
-int aha_poll(struct aha_softc *, struct scsi_xfer *, int);
-void aha_timeout(void *arg);
-
-struct scsi_adapter aha_switch = {
- aha_scsi_cmd,
- ahaminphys,
- 0,
- 0,
-};
-
-int aha_isapnp_probe(struct device *, void *, void *);
-int ahaprobe(struct device *, void *, void *);
-void ahaattach(struct device *, struct device *, void *);
-
-struct cfattach aha_isapnp_ca = {
- sizeof(struct aha_softc), aha_isapnp_probe, ahaattach
-};
-
-struct cfattach aha_isa_ca = {
- sizeof(struct aha_softc), ahaprobe, ahaattach
-};
-
-struct cfdriver aha_cd = {
- NULL, "aha", DV_DULL
-};
-
-#define AHA_RESET_TIMEOUT 2000 /* time to wait for reset (mSec) */
-#define AHA_ABORT_TIMEOUT 2000 /* time to wait for abort (mSec) */
-
-#include "bha.h"
-
-/*
- * aha_cmd(iobase, 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
-aha_cmd(iobase, sc, icnt, ibuf, ocnt, obuf)
- int iobase;
- struct aha_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 = "(aha probe)";
-
- /*
- * Calculate a reasonable timeout for the command.
- */
- switch (opcode) {
- case AHA_INQUIRE_DEVICES:
- wait = 15 * 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 != AHA_MBO_INTR_EN) {
- for (i = 20000; i; i--) { /* 1 sec? */
- sts = inb(iobase + AHA_STAT_PORT);
- if (sts & AHA_STAT_IDLE)
- break;
- delay(50);
- }
- if (!i) {
- printf("%s: aha_cmd, host not idle(0x%x)\n",
- name, sts);
- return (ENXIO);
- }
- }
- /*
- * Now that it is idle, if we expect output, preflush the
- * queue feeding to us.
- */
- if (ocnt) {
- while ((inb(iobase + AHA_STAT_PORT)) & AHA_STAT_DF)
- inb(iobase + AHA_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 = inb(iobase + AHA_STAT_PORT);
- if (!(sts & AHA_STAT_CDF))
- break;
- delay(50);
- }
- if (!i) {
- if (opcode != AHA_INQUIRE_REVISION)
- printf("%s: aha_cmd, cmd/data port full\n",
- name);
- outb(iobase + AHA_CTRL_PORT, AHA_CTRL_SRST);
- return (ENXIO);
- }
- outb(iobase + AHA_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 = inb(iobase + AHA_STAT_PORT);
- if (sts & AHA_STAT_DF)
- break;
- delay(50);
- }
- if (!i) {
- if (opcode != AHA_INQUIRE_REVISION)
- printf("%s: aha_cmd, cmd/data port empty %d\n",
- name, ocnt);
- outb(iobase + AHA_CTRL_PORT, AHA_CTRL_SRST);
- return (ENXIO);
- }
- *obuf++ = inb(iobase + AHA_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 != AHA_MBO_INTR_EN) {
- for (i = 20000; i; i--) { /* 1 sec? */
- sts = inb(iobase + AHA_INTR_PORT);
- /* XXX Need to save this in the interrupt handler? */
- if (sts & AHA_INTR_HACC)
- break;
- delay(50);
- }
- if (!i) {
- printf("%s: aha_cmd, host not finished(0x%x)\n",
- name, sts);
- return (ENXIO);
- }
- }
- outb(iobase + AHA_CTRL_PORT, AHA_CTRL_IRST);
- return (0);
-}
-
-int
-aha_isapnp_probe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
-{
- return (1);
-}
-
-
-/*
- * Check if the device can be found at the port given
- * and if so, set it up ready for further work
- * as an argument, takes the isa_device structure from
- * autoconf.c
- */
-int
-ahaprobe(parent, match, aux)
- struct device *parent;
- void *match, *aux;
-{
- register struct isa_attach_args *ia = aux;
-#if NBHA > 0
- extern int btports[], nbtports;
- int i;
-
- for (i = 0; i < nbtports; i++)
- if (btports[i] == ia->ia_iobase)
- return (0);
-#endif
-
- /* See if there is a unit at this location. */
- if (aha_find(ia, NULL, 0) != 0)
- return (0);
-
- ia->ia_msize = 0;
- ia->ia_iosize = 4;
- /* IRQ and DRQ set by aha_find(). */
- return (1);
-}
-
-/*
- * Attach all the sub-devices we can find
- */
-void
-ahaattach(parent, self, aux)
- struct device *parent, *self;
- void *aux;
-{
- struct isa_attach_args *ia = aux;
- struct aha_softc *sc = (void *)self;
- struct scsibus_attach_args saa;
- int isapnp = !strcmp(parent->dv_cfdata->cf_driver->cd_name, "isapnp");
-
- if (isapnp) {
- ia->ia_iobase = ia->ipa_io[0].base;
- isadma_cascade(ia->ia_drq);
- }
-
- if (aha_find(ia, sc, isapnp) != 0)
- panic("ahaattach: aha_find of %s failed", self->dv_xname);
- sc->sc_iobase = ia->ia_iobase;
- sc->sc_dmat = ia->ia_dmat;
-
- if (sc->sc_drq != DRQUNK && isapnp == 0)
- isadma_cascade(sc->sc_drq);
-
- aha_inquire_setup_information(sc);
- aha_init(sc);
- 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, aha_ccb_alloc, aha_ccb_free);
-
- /*
- * fill in the prototype scsi_link.
- */
- sc->sc_link.adapter_softc = sc;
- sc->sc_link.adapter_target = sc->sc_scsi_dev;
- sc->sc_link.adapter = &aha_switch;
- sc->sc_link.openings = 2;
- sc->sc_link.pool = &sc->sc_iopool;
-
- bzero(&saa, sizeof(saa));
- saa.saa_sc_link = &sc->sc_link;
-
- sc->sc_ih = isa_intr_establish(ia->ia_ic, sc->sc_irq, IST_EDGE,
- IPL_BIO, ahaintr, sc, sc->sc_dev.dv_xname);
-
- /*
- * ask the adapter what subunits are present
- */
- config_found(self, &saa, scsiprint);
-}
-
-void
-aha_finish_ccbs(sc)
- struct aha_softc *sc;
-{
- struct aha_mbx_in *wmbi;
- struct aha_ccb *ccb;
- int i;
-
- wmbi = wmbx->tmbi;
-
- if (wmbi->stat == AHA_MBI_FREE) {
- for (i = 0; i < AHA_MBX_SIZE; i++) {
- if (wmbi->stat != AHA_MBI_FREE) {
- printf("%s: mbi not in round-robin order\n",
- sc->sc_dev.dv_xname);
- goto AGAIN;
- }
- aha_nextmbx(wmbi, wmbx, mbi);
- }
-#ifdef AHADIAGnot
- printf("%s: mbi interrupt with no full mailboxes\n",
- sc->sc_dev.dv_xname);
-#endif
- return;
- }
-
-AGAIN:
- do {
- ccb = aha_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;
- }
-
-#ifdef AHADEBUG
- if (aha_debug) {
- u_char *cp = (u_char *)&ccb->scsi_cmd;
- printf("op=%x %x %x %x %x %x\n",
- cp[0], cp[1], cp[2], cp[3], cp[4], cp[5]);
- printf("stat %x for mbi addr = 0x%08x, ",
- wmbi->stat, wmbi);
- printf("ccb addr = 0x%x\n", ccb);
- }
-#endif /* AHADEBUG */
-
- switch (wmbi->stat) {
- case AHA_MBI_OK:
- case AHA_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 AHA_MBI_ABORT:
- case AHA_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->stat);
- goto next;
- }
-
- if ((ccb->xs->flags & SCSI_POLL) == 0)
- timeout_del(&ccb->xs->stimeout);
- bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmam, 0,
- ccb->ccb_dmam->dm_mapsize, BUS_DMASYNC_POSTREAD);
- aha_done(sc, ccb);
-
- next:
- wmbi->stat = AHA_MBI_FREE;
- aha_nextmbx(wmbi, wmbx, mbi);
- } while (wmbi->stat != AHA_MBI_FREE);
-
- wmbx->tmbi = wmbi;
-}
-
-/*
- * Catch an interrupt from the adaptor
- */
-int
-ahaintr(arg)
- void *arg;
-{
- struct aha_softc *sc = arg;
- int iobase = sc->sc_iobase;
- u_char sts;
-
-#ifdef AHADEBUG
- if (aha_debug)
- printf("%s: ahaintr ", sc->sc_dev.dv_xname);
-#endif /*AHADEBUG */
-
- /*
- * First acknowledge the interrupt, Then if it's not telling about
- * a completed operation just return.
- */
- sts = inb(iobase + AHA_INTR_PORT);
- if ((sts & AHA_INTR_ANYINTR) == 0)
- return (0);
- outb(iobase + AHA_CTRL_PORT, AHA_CTRL_IRST);
-
-#ifdef AHADIAG
- /* Make sure we clear CCB_SENDING before finishing a CCB. */
- aha_collect_mbo(sc);
-#endif
-
- /* Mail box out empty? */
- if (sts & AHA_INTR_MBOA) {
- struct aha_toggle toggle;
-
- toggle.cmd.opcode = AHA_MBO_INTR_EN;
- toggle.cmd.enable = 0;
- aha_cmd(iobase, sc, sizeof(toggle.cmd), (u_char *)&toggle.cmd,
- 0, NULL);
- aha_start_ccbs(sc);
- }
-
- /* Mail box in full? */
- if (sts & AHA_INTR_MBIF)
- aha_finish_ccbs(sc);
-
- return (1);
-}
-
-void
-aha_reset_ccb(sc, ccb)
- struct aha_softc *sc;
- struct aha_ccb *ccb;
-{
-
- ccb->flags = 0;
-}
-
-/*
- * A ccb is put onto the free list.
- */
-void
-aha_ccb_free(xsc, xccb)
- void *xsc, *xccb;
-{
- struct aha_softc *sc = xsc;
- struct aha_ccb *ccb = xccb;
- int s, hashnum;
- struct aha_ccb **hashccb;
-
- s = splbio();
-
- if (ccb->ccb_dmam->dm_segs[0].ds_addr != 0)
- bus_dmamap_unload(sc->sc_dmat, ccb->ccb_dmam);
-
- /* remove from hash table */
-
- hashnum = CCB_HASH(ccb->ccb_dmam->dm_segs[0].ds_addr);
- hashccb = &sc->sc_ccbhash[hashnum];
-
- while (*hashccb) {
- if ((*hashccb)->ccb_dmam->dm_segs[0].ds_addr ==
- ccb->ccb_dmam->dm_segs[0].ds_addr) {
- *hashccb = (*hashccb)->nexthash;
- break;
- }
- hashccb = &(*hashccb)->nexthash;
- }
-
- aha_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);
-
- splx(s);
-}
-
-int
-aha_init_ccb(sc, ccb, flags)
- struct aha_softc *sc;
- struct aha_ccb *ccb;
- int flags;
-{
- int error, wait, state = 0;
-
- bzero(ccb, sizeof(struct aha_ccb));
- aha_reset_ccb(sc, ccb);
-
- wait = (flags & SCSI_NOSLEEP) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK;
- /* Create a DMA map for the data area. */
- error = bus_dmamap_create(sc->sc_dmat, MAXPHYS, (MAXPHYS / NBPG) + 1,
- MAXPHYS, 0, wait | BUS_DMA_ALLOCNOW, &ccb->dmam);
- if (error)
- goto fail;
- state++;
-
- /* Create a DMA map for the command control block. */
- error = bus_dmamap_create(sc->sc_dmat, CCB_PHYS_SIZE, 1, CCB_PHYS_SIZE,
- 0, wait | BUS_DMA_ALLOCNOW, &ccb->ccb_dmam);
- if (error)
- goto fail;
-
- return (0);
-
- fail:
- if (state > 0)
- bus_dmamap_destroy(sc->sc_dmat, ccb->dmam);
- return (error);
-}
-
-/*
- * Get a free ccb
- *
- * If there are none, see if we can allocate a new one. If so, put it in
- * the hash table too otherwise either return an error or sleep.
- */
-void *
-aha_ccb_alloc(xsc)
- void *xsc;
-{
- struct aha_softc *sc = xsc;
- struct aha_ccb *ccb;
- int hashnum, s;
-
- s = splbio();
-
- 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;
- if (bus_dmamap_load(sc->sc_dmat, ccb->ccb_dmam, ccb, CCB_PHYS_SIZE,
- NULL, BUS_DMA_NOWAIT) != 0) {
- mtx_leave(&sc->sc_ccb_mtx);
- aha_ccb_free(sc, ccb);
- splx(s);
- return (NULL);
- } else {
- hashnum = CCB_HASH(ccb->ccb_dmam->dm_segs[0].ds_addr);
- ccb->nexthash = sc->sc_ccbhash[hashnum];
- sc->sc_ccbhash[hashnum] = ccb;
- }
- }
- mtx_leave(&sc->sc_ccb_mtx);
-
- splx(s);
- return (ccb);
-}
-
-/*
- * Given a physical address, find the ccb that it corresponds to.
- */
-struct aha_ccb *
-aha_ccb_phys_kv(sc, ccb_phys)
- struct aha_softc *sc;
- u_long ccb_phys;
-{
- int hashnum = CCB_HASH(ccb_phys);
- struct aha_ccb *ccb = sc->sc_ccbhash[hashnum];
-
- while (ccb) {
- if (ccb->ccb_dmam->dm_segs[0].ds_addr == ccb_phys)
- break;
- ccb = ccb->nexthash;
- }
- return (ccb);
-}
-
-/*
- * Queue a CCB to be sent to the controller, and send it if possible.
- */
-void
-aha_queue_ccb(sc, ccb)
- struct aha_softc *sc;
- struct aha_ccb *ccb;
-{
-
- TAILQ_INSERT_TAIL(&sc->sc_waiting_ccb, ccb, chain);
- aha_start_ccbs(sc);
-}
-
-/*
- * Garbage collect mailboxes that are no longer in use.
- */
-void
-aha_collect_mbo(sc)
- struct aha_softc *sc;
-{
- struct aha_mbx_out *wmbo; /* Mail Box Out pointer */
-#ifdef AHADIAG
- struct aha_ccb *ccb;
-#endif
-
- wmbo = wmbx->cmbo;
-
- while (sc->sc_mbofull > 0) {
- if (wmbo->cmd != AHA_MBO_FREE)
- break;
-
-#ifdef AHADIAG
- ccb = aha_ccb_phys_kv(sc, phystol(wmbo->ccb_addr));
- if (!ccb) {
- printf("%s: bad mbo ccb pointer; skipping\n",
- sc->sc_dev.dv_xname);
- } else
- ccb->flags &= ~CCB_SENDING;
-#endif
-
- --sc->sc_mbofull;
- aha_nextmbx(wmbo, wmbx, mbo);
- }
-
- wmbx->cmbo = wmbo;
-}
-
-/*
- * Send as many CCBs as we have empty mailboxes for.
- */
-void
-aha_start_ccbs(sc)
- struct aha_softc *sc;
-{
- int iobase = sc->sc_iobase;
- struct aha_mbx_out *wmbo; /* Mail Box Out pointer */
- struct aha_ccb *ccb;
-
- wmbo = wmbx->tmbo;
-
- while ((ccb = TAILQ_FIRST(&sc->sc_waiting_ccb)) != NULL) {
- if (sc->sc_mbofull >= AHA_MBX_SIZE) {
- aha_collect_mbo(sc);
- if (sc->sc_mbofull >= AHA_MBX_SIZE) {
- struct aha_toggle toggle;
-
- toggle.cmd.opcode = AHA_MBO_INTR_EN;
- toggle.cmd.enable = 1;
- aha_cmd(iobase, sc, sizeof(toggle.cmd),
- (u_char *)&toggle.cmd, 0, NULL);
- break;
- }
- }
-
- TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain);
-#ifdef AHADIAG
- ccb->flags |= CCB_SENDING;
-#endif
-
- /* Link ccb to mbo. */
- bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmam, 0,
- ccb->ccb_dmam->dm_mapsize, BUS_DMASYNC_PREWRITE);
- ltophys(ccb->ccb_dmam->dm_segs[0].ds_addr, wmbo->ccb_addr);
- if (ccb->flags & CCB_ABORT)
- wmbo->cmd = AHA_MBO_ABORT;
- else
- wmbo->cmd = AHA_MBO_START;
-
- /* Tell the card to poll immediately. */
- outb(iobase + AHA_CMD_PORT, AHA_START_SCSI);
-
- if ((ccb->xs->flags & SCSI_POLL) == 0) {
- timeout_set(&ccb->xs->stimeout, aha_timeout, ccb);
- timeout_add_msec(&ccb->xs->stimeout, ccb->timeout);
- }
-
- ++sc->sc_mbofull;
- aha_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
-aha_done(sc, ccb)
- struct aha_softc *sc;
- struct aha_ccb *ccb;
-{
- struct scsi_sense_data *s1, *s2;
- struct scsi_xfer *xs = ccb->xs;
-
- SC_DEBUG(xs->sc_link, SDEV_DB2, ("aha_done\n"));
- /*
- * Otherwise, put the results of the operation
- * into the xfer and call whoever started it
- */
-#ifdef AHADIAG
- if (ccb->flags & CCB_SENDING)
- panic("%s: exiting ccb still in transit!", sc->sc_dev.dv_xname);
-#endif
- if ((ccb->flags & CCB_ALLOC) == 0)
- panic("%s: exiting ccb not allocated!", sc->sc_dev.dv_xname);
-
- if (xs->error == XS_NOERROR) {
- if (ccb->host_stat != AHA_OK) {
- switch (ccb->host_stat) {
- case AHA_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 = (struct scsi_sense_data *)
- (((char *)(&ccb->scsi_cmd)) +
- ccb->scsi_cmd_length);
- 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;
- }
-
- if (VOLATILE_XS(xs)) {
- wakeup(ccb);
- return;
- }
-
- if (ccb->dmam->dm_nsegs > 0) {
- if (xs->flags & SCSI_DATA_IN)
- bus_dmamap_sync(sc->sc_dmat, ccb->dmam, 0,
- ccb->dmam->dm_mapsize, BUS_DMASYNC_POSTREAD);
- if (xs->flags & SCSI_DATA_OUT)
- bus_dmamap_sync(sc->sc_dmat, ccb->dmam, 0,
- ccb->dmam->dm_mapsize, BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(sc->sc_dmat, ccb->dmam);
- }
- scsi_done(xs);
-}
-
-/*
- * Find the board and find its irq/drq
- */
-int
-aha_find(ia, sc, isapnp)
- struct isa_attach_args *ia;
- struct aha_softc *sc;
- int isapnp;
-{
- int iobase = ia->ia_iobase;
- int i;
- u_char sts;
- struct aha_config config;
- int irq, drq;
-
- /*
- * reset board, If it doesn't respond, assume
- * that it's not there.. good for the probe
- */
-
- outb(iobase + AHA_CTRL_PORT, AHA_CTRL_HRST | AHA_CTRL_SRST);
-
- delay(100);
- for (i = AHA_RESET_TIMEOUT; i; i--) {
- sts = inb(iobase + AHA_STAT_PORT);
- if (sts == (AHA_STAT_IDLE | AHA_STAT_INIT))
- break;
- delay(1000); /* calibrated in msec */
- }
- if (!i) {
-#ifdef AHADEBUG
- if (aha_debug)
- printf("aha_find: No answer from adaptec board\n");
-#endif /* AHADEBUG */
- return (1);
- }
-
- /*
- * setup dma channel from jumpers and save int
- * level
- */
- delay(1000); /* for Bustek 545 */
- config.cmd.opcode = AHA_INQUIRE_CONFIG;
- aha_cmd(iobase, sc, sizeof(config.cmd), (u_char *)&config.cmd,
- sizeof(config.reply), (u_char *)&config.reply);
- switch (config.reply.chan) {
- case EISADMA:
- drq = DRQUNK; /* for EISA/VLB/PCI clones */
- break;
- case CHAN0:
- drq = 0;
- break;
- case CHAN5:
- drq = 5;
- break;
- case CHAN6:
- drq = 6;
- break;
- case CHAN7:
- drq = 7;
- break;
- default:
- printf("aha_find: illegal drq setting %x\n",
- config.reply.chan);
- return (1);
- }
- if (isapnp)
- irq = ia->ia_irq;
-
- 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("aha_find: illegal irq setting %x\n",
- config.reply.intr);
- return (EIO);
- }
- if (isapnp)
- drq = ia->ia_drq;
-
- if (sc != NULL) {
- /* who are we on the scsi bus? */
- sc->sc_scsi_dev = config.reply.scsi_dev;
-
- sc->sc_iobase = iobase;
- sc->sc_irq = irq;
- sc->sc_drq = drq;
- } else {
- if (isapnp)
- return (0);
- if (ia->ia_irq == IRQUNK)
- ia->ia_irq = irq;
- else if (ia->ia_irq != irq)
- return (1);
- if (ia->ia_drq == DRQUNK)
- ia->ia_drq = drq;
- else if (ia->ia_drq != drq)
- return (1);
- }
-
- return (0);
-}
-
-/*
- * Start the board, ready for normal operation
- */
-void
-aha_init(sc)
- struct aha_softc *sc;
-{
- int iobase = sc->sc_iobase;
- struct aha_devices devices;
- struct aha_setup setup;
- struct aha_mailbox mailbox;
- struct pglist pglist;
- struct vm_page *pg;
- vaddr_t va;
- vsize_t size;
- int i;
-
- /*
- * XXX
- * If we are a 1542C or later, disable the extended BIOS so that the
- * mailbox interface is unlocked.
- * No need to check the extended BIOS flags as some of the
- * extensions that cause us problems are not flagged in that byte.
- */
- if (!strncmp(sc->sc_model, "1542C", 5)) {
- struct aha_extbios extbios;
- struct aha_unlock unlock;
-
- printf("%s: unlocking mailbox interface\n",
- sc->sc_dev.dv_xname);
- extbios.cmd.opcode = AHA_EXT_BIOS;
- aha_cmd(iobase, sc, sizeof(extbios.cmd),
- (u_char *)&extbios.cmd, sizeof(extbios.reply),
- (u_char *)&extbios.reply);
-
-#ifdef AHADEBUG
- printf("%s: flags=%02x, mailboxlock=%02x\n",
- sc->sc_dev.dv_xname,
- extbios.reply.flags, extbios.reply.mailboxlock);
-#endif /* AHADEBUG */
-
- unlock.cmd.opcode = AHA_MBX_ENABLE;
- unlock.cmd.junk = 0;
- unlock.cmd.magic = extbios.reply.mailboxlock;
- aha_cmd(iobase, sc, sizeof(unlock.cmd), (u_char *)&unlock.cmd,
- 0, NULL);
- }
-
-#if 0
- /*
- * Change the bus on/off times to not clash with other dma users.
- */
- aha_cmd(sc, 1, 0, 0, 0, AHA_BUS_ON_TIME_SET, 7);
- aha_cmd(sc, 1, 0, 0, 0, AHA_BUS_OFF_TIME_SET, 4);
-#endif
-
- /* Inquire Installed Devices (to force synchronous negotiation). */
- devices.cmd.opcode = AHA_INQUIRE_DEVICES;
- aha_cmd(iobase, sc, sizeof(devices.cmd), (u_char *)&devices.cmd,
- sizeof(devices.reply), (u_char *)&devices.reply);
-
- /* Obtain setup information from. */
- setup.cmd.opcode = AHA_INQUIRE_SETUP;
- setup.cmd.len = sizeof(setup.reply);
- aha_cmd(iobase, sc, sizeof(setup.cmd), (u_char *)&setup.cmd,
- sizeof(setup.reply), (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++) {
- 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,
- setup.reply.sync[i].period * 50 + 200);
- }
-
- /*
- * Set up initial mail box for round-robin operation.
- */
-
- /*
- * XXX - this vm juggling is so wrong. use bus_dma instead!
- */
- size = round_page(sizeof(struct aha_mbx));
- TAILQ_INIT(&pglist);
- if (uvm_pglistalloc(size, 0, 0xffffff, PAGE_SIZE, 0, &pglist, 1,
- UVM_PLA_NOWAIT) || uvm_map(kernel_map, &va, size, NULL,
- UVM_UNKNOWN_OFFSET, 0, UVM_MAPFLAG(PROT_MASK, PROT_MASK,
- MAP_INHERIT_NONE, MADV_RANDOM, 0)))
- panic("aha_init: could not allocate mailbox");
-
- wmbx = (struct aha_mbx *)va;
- for (pg = TAILQ_FIRST(&pglist); pg != NULL;
- pg = TAILQ_NEXT(pg, pageq)) {
- pmap_kenter_pa(va, VM_PAGE_TO_PHYS(pg),
- PROT_READ | PROT_WRITE);
- va += PAGE_SIZE;
- }
- pmap_update(pmap_kernel());
- /*
- * XXXEND
- */
-
- for (i = 0; i < AHA_MBX_SIZE; i++) {
- wmbx->mbo[i].cmd = AHA_MBO_FREE;
- wmbx->mbi[i].stat = AHA_MBI_FREE;
- }
- wmbx->cmbo = wmbx->tmbo = &wmbx->mbo[0];
- wmbx->tmbi = &wmbx->mbi[0];
- sc->sc_mbofull = 0;
-
- /* Initialize mail box. */
- mailbox.cmd.opcode = AHA_MBX_INIT;
- mailbox.cmd.nmbx = AHA_MBX_SIZE;
- ltophys(vtophys((vaddr_t)wmbx), mailbox.cmd.addr);
- aha_cmd(iobase, sc, sizeof(mailbox.cmd), (u_char *)&mailbox.cmd,
- 0, NULL);
-}
-
-void
-aha_inquire_setup_information(sc)
- struct aha_softc *sc;
-{
- int iobase = sc->sc_iobase;
- struct aha_revision revision;
- u_char sts;
- int i;
- char *p;
-
- strlcpy(sc->sc_model, "unknown", sizeof sc->sc_model);
-
- /*
- * Assume we have a board at this stage, do an adapter inquire
- * to find out what type of controller it is. If the command
- * fails, we assume it's either a crusty board or an old 1542
- * clone, and skip the board-specific stuff.
- */
- revision.cmd.opcode = AHA_INQUIRE_REVISION;
- if (aha_cmd(iobase, sc, sizeof(revision.cmd), (u_char *)&revision.cmd,
- sizeof(revision.reply), (u_char *)&revision.reply)) {
- /*
- * aha_cmd() already started the reset. It's not clear we
- * even need to bother here.
- */
- for (i = AHA_RESET_TIMEOUT; i; i--) {
- sts = inb(iobase + AHA_STAT_PORT);
- if (sts == (AHA_STAT_IDLE | AHA_STAT_INIT))
- break;
- delay(1000);
- }
- if (!i) {
-#ifdef AHADEBUG
- printf("aha_init: soft reset failed\n");
-#endif /* AHADEBUG */
- return;
- }
-#ifdef AHADEBUG
- printf("aha_init: inquire command failed\n");
-#endif /* AHADEBUG */
- goto noinquire;
- }
-
-#ifdef AHADEBUG
- printf("%s: inquire %x, %x, %x, %x\n",
- sc->sc_dev.dv_xname,
- revision.reply.boardid, revision.reply.spec_opts,
- revision.reply.revision_1, revision.reply.revision_2);
-#endif /* AHADEBUG */
-
- switch (revision.reply.boardid) {
- case 0x31:
- strlcpy(sc->sc_model, "1540", sizeof sc->sc_model);
- break;
- case 0x41:
- strlcpy(sc->sc_model, "1540A/1542A/1542B", sizeof sc->sc_model);
- break;
- case 0x42:
- strlcpy(sc->sc_model, "1640", sizeof sc->sc_model);
- break;
- case 0x43:
- case 0x44: /* Is this 1542C or -CF? */
- strlcpy(sc->sc_model, "1542C", sizeof sc->sc_model);
- break;
- case 0x45:
- strlcpy(sc->sc_model, "1542CF", sizeof sc->sc_model);
- break;
- case 0x46:
- strlcpy(sc->sc_model, "1542CP", sizeof sc->sc_model);
- break;
- }
-
- p = sc->sc_firmware;
- *p++ = revision.reply.revision_1;
- *p++ = '.';
- *p++ = revision.reply.revision_2;
- *p = '\0';
-
-noinquire:
- printf(": model AHA-%s, firmware %s\n", sc->sc_model, sc->sc_firmware);
-}
-
-void
-ahaminphys(struct buf *bp, struct scsi_link *sl)
-{
- if (bp->b_bcount > ((AHA_NSEG - 1) << PGSHIFT))
- bp->b_bcount = ((AHA_NSEG - 1) << PGSHIFT);
- minphys(bp);
-}
-
-/*
- * start a scsi operation given the command and the data address. Also needs
- * the unit, target and lu.
- */
-void
-aha_scsi_cmd(xs)
- struct scsi_xfer *xs;
-{
- struct scsi_link *sc_link = xs->sc_link;
- struct aha_softc *sc = sc_link->adapter_softc;
- struct aha_ccb *ccb;
- struct aha_scat_gath *sg;
- int seg, flags;
- int s;
-
- SC_DEBUG(sc_link, SDEV_DB2, ("aha_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 = AHA_RESET_CCB;
- ccb->scsi_cmd_length = 0;
- } else {
- /* can't use S/G if zero length */
- ccb->opcode =
- (xs->datalen ? AHA_INIT_SCAT_GATH_CCB : AHA_INITIATOR_CCB);
- bcopy(xs->cmd, &ccb->scsi_cmd,
- ccb->scsi_cmd_length = xs->cmdlen);
- }
-
- if (xs->datalen) {
- sg = ccb->scat_gath;
- seg = 0;
-
- /*
- * Set up the scatter-gather block.
- */
- if (bus_dmamap_load(sc->sc_dmat, ccb->dmam, xs->data,
- xs->datalen, NULL, BUS_DMA_NOWAIT) != 0) {
- xs->error = XS_BUSY;
- scsi_done(xs);
- return;
- }
- for (seg = 0; seg < ccb->dmam->dm_nsegs; seg++) {
- ltophys(ccb->dmam->dm_segs[seg].ds_addr,
- sg[seg].seg_addr);
- ltophys(ccb->dmam->dm_segs[seg].ds_len,
- sg[seg].seg_len);
- }
- if (flags & SCSI_DATA_OUT)
- bus_dmamap_sync(sc->sc_dmat, ccb->dmam, 0,
- ccb->dmam->dm_mapsize, BUS_DMASYNC_PREWRITE);
- if (flags & SCSI_DATA_IN)
- bus_dmamap_sync(sc->sc_dmat, ccb->dmam, 0,
- ccb->dmam->dm_mapsize, BUS_DMASYNC_PREREAD);
- ltophys((unsigned)
- ((struct aha_ccb *)(ccb->ccb_dmam->dm_segs[0].ds_addr))->
- scat_gath,
- ccb->data_addr);
- ltophys(ccb->dmam->dm_nsegs * sizeof(struct aha_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;
- 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);
-
- s = splbio();
- aha_queue_ccb(sc, ccb);
-
- /*
- * Usually return SUCCESSFULLY QUEUED
- */
- SC_DEBUG(sc_link, SDEV_DB3, ("cmd_sent\n"));
-
- if (VOLATILE_XS(xs)) {
- while ((ccb->xs->flags & ITSDONE) == 0) {
- tsleep(ccb, PRIBIO, "ahawait", 0);
- }
- if (ccb->dmam->dm_nsegs > 0) {
- if (flags & SCSI_DATA_OUT)
- bus_dmamap_sync(sc->sc_dmat, ccb->dmam, 0,
- ccb->dmam->dm_mapsize,
- BUS_DMASYNC_POSTWRITE);
- if (flags & SCSI_DATA_IN)
- bus_dmamap_sync(sc->sc_dmat, ccb->dmam, 0,
- ccb->dmam->dm_mapsize,
- BUS_DMASYNC_POSTREAD);
- bus_dmamap_unload(sc->sc_dmat, ccb->dmam);
- }
- scsi_done(xs);
- splx(s);
- return;
- }
- splx(s);
-
- if ((flags & SCSI_POLL) == 0)
- return;
-
- /*
- * If we can't use interrupts, poll on completion
- */
- if (aha_poll(sc, xs, ccb->timeout)) {
- aha_timeout(ccb);
- if (aha_poll(sc, xs, ccb->timeout))
- aha_timeout(ccb);
- }
-}
-
-/*
- * Poll a particular unit, looking for a particular xs
- */
-int
-aha_poll(sc, xs, count)
- struct aha_softc *sc;
- struct scsi_xfer *xs;
- int count;
-{
- int iobase = sc->sc_iobase;
- 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 (inb(iobase + AHA_INTR_PORT) & AHA_INTR_ANYINTR) {
- s = splbio();
- ahaintr(sc);
- splx(s);
- }
- if (xs->flags & ITSDONE)
- return (0);
- delay(1000); /* only happens in boot so ok */
- count--;
- }
- return (1);
-}
-
-void
-aha_timeout(arg)
- void *arg;
-{
- struct aha_ccb *ccb = arg;
- struct scsi_xfer *xs;
- struct scsi_link *sc_link;
- struct aha_softc *sc;
- int s;
-
- s = splbio();
- xs = ccb->xs;
- sc_link = xs->sc_link;
- sc = sc_link->adapter_softc;
- bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmam, 0,
- ccb->ccb_dmam->dm_mapsize, BUS_DMASYNC_POSTREAD);
-
- sc_print_addr(sc_link);
- printf("timed out");
-
-#ifdef AHADIAG
- /*
- * If The ccb's mbx is not free, then the board has gone south?
- */
- aha_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 = AHA_ABORT_TIMEOUT;
- ccb->flags |= CCB_ABORT;
- aha_queue_ccb(sc, ccb);
- }
-
- splx(s);
-}
-
diff --git a/sys/dev/isa/ahareg.h b/sys/dev/isa/ahareg.h
deleted file mode 100644
index 80ec0795244..00000000000
--- a/sys/dev/isa/ahareg.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/* $OpenBSD: ahareg.h,v 1.4 2002/06/07 20:41:06 niklas Exp $ */
-typedef u_int8_t physaddr[3];
-typedef u_int8_t physlen[3];
-#define ltophys _lto3b
-#define phystol _3btol
-
-/*
- * I/O port offsets
- */
-#define AHA_CTRL_PORT 0 /* control (wo) */
-#define AHA_STAT_PORT 0 /* status (ro) */
-#define AHA_CMD_PORT 1 /* command (wo) */
-#define AHA_DATA_PORT 1 /* data (ro) */
-#define AHA_INTR_PORT 2 /* interrupt status (ro) */
-
-/*
- * AHA_CTRL bits
- */
-#define AHA_CTRL_HRST 0x80 /* Hardware reset */
-#define AHA_CTRL_SRST 0x40 /* Software reset */
-#define AHA_CTRL_IRST 0x20 /* Interrupt reset */
-#define AHA_CTRL_SCRST 0x10 /* SCSI bus reset */
-
-/*
- * AHA_STAT bits
- */
-#define AHA_STAT_STST 0x80 /* Self test in Progress */
-#define AHA_STAT_DIAGF 0x40 /* Diagnostic Failure */
-#define AHA_STAT_INIT 0x20 /* Mbx Init required */
-#define AHA_STAT_IDLE 0x10 /* Host Adapter Idle */
-#define AHA_STAT_CDF 0x08 /* cmd/data out port full */
-#define AHA_STAT_DF 0x04 /* Data in port full */
-#define AHA_STAT_INVDCMD 0x01 /* Invalid command */
-
-/*
- * AHA_CMD opcodes
- */
-#define AHA_NOP 0x00 /* No operation */
-#define AHA_MBX_INIT 0x01 /* Mbx initialization */
-#define AHA_START_SCSI 0x02 /* start scsi command */
-#define AHA_INQUIRE_REVISION 0x04 /* Adapter Inquiry */
-#define AHA_MBO_INTR_EN 0x05 /* Enable MBO available interrupt */
-#if 0
-#define AHA_SEL_TIMEOUT_SET 0x06 /* set selection time-out */
-#define AHA_BUS_ON_TIME_SET 0x07 /* set bus-on time */
-#define AHA_BUS_OFF_TIME_SET 0x08 /* set bus-off time */
-#define AHA_SPEED_SET 0x09 /* set transfer speed */
-#endif
-#define AHA_INQUIRE_DEVICES 0x0a /* return installed devices 0-7 */
-#define AHA_INQUIRE_CONFIG 0x0b /* return configuration data */
-#define AHA_TARGET_EN 0x0c /* enable target mode */
-#define AHA_INQUIRE_SETUP 0x0d /* return setup data */
-#define AHA_ECHO 0x1e /* Echo command data */
-#define AHA_INQUIRE_DEVICES_2 0x23 /* return installed devices 8-15 */
-#define AHA_EXT_BIOS 0x28 /* return extended bios info */
-#define AHA_MBX_ENABLE 0x29 /* enable mail box interface */
-
-/*
- * AHA_INTR bits
- */
-#define AHA_INTR_ANYINTR 0x80 /* Any interrupt */
-#define AHA_INTR_SCRD 0x08 /* SCSI reset detected */
-#define AHA_INTR_HACC 0x04 /* Command complete */
-#define AHA_INTR_MBOA 0x02 /* MBX out empty */
-#define AHA_INTR_MBIF 0x01 /* MBX in full */
-
-struct aha_mbx_out {
- u_char cmd;
- physaddr ccb_addr;
-};
-
-struct aha_mbx_in {
- u_char stat;
- physaddr ccb_addr;
-};
-
-/*
- * mbo.cmd values
- */
-#define AHA_MBO_FREE 0x0 /* MBO entry is free */
-#define AHA_MBO_START 0x1 /* MBO activate entry */
-#define AHA_MBO_ABORT 0x2 /* MBO abort entry */
-
-/*
- * mbi.stat values
- */
-#define AHA_MBI_FREE 0x0 /* MBI entry is free */
-#define AHA_MBI_OK 0x1 /* completed without error */
-#define AHA_MBI_ABORT 0x2 /* aborted ccb */
-#define AHA_MBI_UNKNOWN 0x3 /* Tried to abort invalid CCB */
-#define AHA_MBI_ERROR 0x4 /* Completed with error */
-
-/* FOR OLD VERSIONS OF THE !%$@ this may have to be 16 (yuk) */
-#define AHA_NSEG 17 /* Number of scatter gather segments <= 16 */
- /* allow 64 K i/o (min) */
-
-struct aha_scat_gath {
- physlen seg_len;
- physaddr seg_addr;
-};
-
-struct aha_ccb {
- u_char opcode;
- u_char lun:3;
- u_char data_in:1; /* must be 0 */
- u_char data_out:1; /* must be 0 */
- u_char target:3;
- u_char scsi_cmd_length;
- u_char req_sense_length;
- physlen data_length;
- physaddr data_addr;
- physaddr link_addr;
- u_char link_id;
- u_char host_stat;
- u_char target_stat;
- u_char reserved[2];
- struct scsi_generic scsi_cmd;
- struct scsi_sense_data scsi_sense;
- struct aha_scat_gath scat_gath[AHA_NSEG];
- /*----------------------------------------------------------------*/
-#define CCB_PHYS_SIZE ((int)&((struct aha_ccb *)0)->chain)
- TAILQ_ENTRY(aha_ccb) chain;
- struct aha_ccb *nexthash;
- struct scsi_xfer *xs; /* the scsi_xfer for this cmd */
- int flags;
-#define CCB_ALLOC 0x01
-#define CCB_ABORT 0x02
-#ifdef AHADIAG
-#define CCB_SENDING 0x04
-#endif
- int timeout;
- bus_dmamap_t dmam;
- bus_dmamap_t ccb_dmam;
-};
-
-/*
- * opcode fields
- */
-#define AHA_INITIATOR_CCB 0x00 /* SCSI Initiator CCB */
-#define AHA_TARGET_CCB 0x01 /* SCSI Target CCB */
-#define AHA_INIT_SCAT_GATH_CCB 0x02 /* SCSI Initiator with scatter gather */
-#define AHA_RESET_CCB 0x81 /* SCSI Bus reset */
-
-/*
- * aha_ccb.host_stat values
- */
-#define AHA_OK 0x00 /* cmd ok */
-#define AHA_LINK_OK 0x0a /* Link cmd ok */
-#define AHA_LINK_IT 0x0b /* Link cmd ok + int */
-#define AHA_SEL_TIMEOUT 0x11 /* Selection time out */
-#define AHA_OVER_UNDER 0x12 /* Data over/under run */
-#define AHA_BUS_FREE 0x13 /* Bus dropped at unexpected time */
-#define AHA_INV_BUS 0x14 /* Invalid bus phase/sequence */
-#define AHA_BAD_MBO 0x15 /* Incorrect MBO cmd */
-#define AHA_BAD_CCB 0x16 /* Incorrect ccb opcode */
-#define AHA_BAD_LINK 0x17 /* Not same values of LUN for links */
-#define AHA_INV_TARGET 0x18 /* Invalid target direction */
-#define AHA_CCB_DUP 0x19 /* Duplicate CCB received */
-#define AHA_INV_CCB 0x1a /* Invalid CCB or segment list */
-
-struct aha_revision {
- struct {
- u_char opcode;
- } cmd;
- struct {
- u_char boardid; /* type of board */
- /* 0x31 = AHA-1540 */
- /* 0x41 = AHA-1540A/1542A/1542B */
- /* 0x42 = AHA-1640 */
- /* 0x43 = AHA-1542C */
- /* 0x44 = AHA-1542CF */
- /* 0x45 = AHA-1542CF, BIOS v2.01 */
- /* 0x46 = AHA-1542CP */
- u_char spec_opts; /* special options ID */
- /* 0x41 = Board is standard model */
- u_char revision_1; /* firmware revision [0-9A-Z] */
- u_char revision_2; /* firmware revision [0-9A-Z] */
- } reply;
-};
-
-struct aha_extbios {
- struct {
- u_char opcode;
- } cmd;
- struct {
- u_char flags; /* Bit 3 == 1 extended bios enabled */
- u_char mailboxlock; /* mail box lock code to unlock it */
- } reply;
-};
-
-struct aha_toggle {
- struct {
- u_char opcode;
- u_char enable;
- } cmd;
-};
-
-struct aha_config {
- struct {
- u_char opcode;
- } cmd;
- struct {
- u_char chan;
- u_char intr;
- u_char scsi_dev:3;
- u_char :5;
- } reply;
-};
-
-struct aha_mailbox {
- struct {
- u_char opcode;
- u_char nmbx;
- physaddr addr;
- } cmd;
-};
-
-struct aha_unlock {
- struct {
- u_char opcode;
- u_char junk;
- u_char magic;
- } cmd;
-};
-
-struct aha_devices {
- struct {
- u_char opcode;
- } cmd;
- struct {
- u_char junk[8];
- } reply;
-};
-
-struct aha_setup {
- struct {
- u_char opcode;
- u_char len;
- } cmd;
- struct {
- u_char sync_neg:1;
- u_char parity:1;
- u_char :6;
- u_char speed;
- u_char bus_on;
- u_char bus_off;
- u_char num_mbx;
- u_char mbx[3];
- struct {
- u_char offset:4;
- u_char period:3;
- u_char valid:1;
- } sync[8];
- u_char disc_sts;
- } reply;
-};
-
-#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/isa/files.isa b/sys/dev/isa/files.isa
index 827bccff08b..fc08c9fa43a 100644
--- a/sys/dev/isa/files.isa
+++ b/sys/dev/isa/files.isa
@@ -1,4 +1,4 @@
-# $OpenBSD: files.isa,v 1.121 2016/08/31 15:53:06 tedu Exp $
+# $OpenBSD: files.isa,v 1.122 2016/09/03 21:37:29 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.
@@ -104,11 +104,6 @@ file dev/isa/bha_isa.c bha_isa
attach aic at isa with aic_isa: isa_dma
file dev/isa/aic_isa.c aic_isa
-# Adaptec AHA-154x family
-device aha: scsi, isa_dma
-attach aha at isa with aha_isa
-file dev/isa/aha.c aha needs-flag
-
# UltraStor UHA-[13]4f boards
# device declaration in sys/conf/files
attach uha at isa with uha_isa: isa_dma