diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2016-09-03 21:37:30 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2016-09-03 21:37:30 +0000 |
commit | d429d7b806bb0b5f43c45e3ff2b0f504d68d3fb0 (patch) | |
tree | cef1ba8acd4875464fdd7b032dd323131a6f3b21 | |
parent | 549864ea258c6c04b713005cc6b0535bc4fc0542 (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/Makefile | 4 | ||||
-rw-r--r-- | share/man/man4/aha.4 | 61 | ||||
-rw-r--r-- | share/man/man4/ahb.4 | 45 | ||||
-rw-r--r-- | share/man/man4/eisa.4 | 6 | ||||
-rw-r--r-- | share/man/man4/isa.4 | 6 | ||||
-rw-r--r-- | share/man/man4/isapnp.4 | 6 | ||||
-rw-r--r-- | sys/arch/hppa/conf/GENERIC | 3 | ||||
-rw-r--r-- | sys/arch/i386/conf/GENERIC | 6 | ||||
-rw-r--r-- | sys/arch/i386/conf/RAMDISK_CD | 6 | ||||
-rw-r--r-- | sys/dev/eisa/aha1742.c | 1131 | ||||
-rw-r--r-- | sys/dev/eisa/files.eisa | 7 | ||||
-rw-r--r-- | sys/dev/isa/aha.c | 1412 | ||||
-rw-r--r-- | sys/dev/isa/ahareg.h | 269 | ||||
-rw-r--r-- | sys/dev/isa/files.isa | 7 |
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 |