diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2013-11-04 14:07:17 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2013-11-04 14:07:17 +0000 |
commit | 00085f61a4aa40196fa3d6688d34cfbe25c235a9 (patch) | |
tree | caf982d5f425ed6d82671c82e4060050029f9814 /sys | |
parent | bc5c88ea41636668a7bea1a31e36afd2e87322fb (diff) |
remove iop(4) driver. it is entirely unmaintained and supports something
which basically doesn't exist at all.
reminded about it by brad
Diffstat (limited to 'sys')
34 files changed, 23 insertions, 5955 deletions
diff --git a/sys/arch/alpha/conf/files.alpha b/sys/arch/alpha/conf/files.alpha index 9cca3b3ec60..0f724285b02 100644 --- a/sys/arch/alpha/conf/files.alpha +++ b/sys/arch/alpha/conf/files.alpha @@ -1,4 +1,4 @@ -# $OpenBSD: files.alpha,v 1.96 2013/08/15 06:54:35 kettenis Exp $ +# $OpenBSD: files.alpha,v 1.97 2013/11/04 14:07:15 deraadt Exp $ # $NetBSD: files.alpha,v 1.32 1996/11/25 04:03:21 cgd Exp $ # # alpha-specific configuration info @@ -46,9 +46,6 @@ major {cd = 3} major {sd = 8} major {rd = 6} -# I2O -include "dev/i2o/files.i2o" - # Raster operations include "dev/rasops/files.rasops" include "dev/wsfont/files.wsfont" diff --git a/sys/arch/amd64/conf/GENERIC b/sys/arch/amd64/conf/GENERIC index a0f83dbf72a..15376392185 100644 --- a/sys/arch/amd64/conf/GENERIC +++ b/sys/arch/amd64/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.351 2013/10/29 22:37:25 deraadt Exp $ +# $OpenBSD: GENERIC,v 1.352 2013/11/04 14:07:15 deraadt Exp $ # # For further information on compiling OpenBSD kernels, see the config(8) # man page. @@ -585,11 +585,6 @@ nofn* at pci? # Hi/fn 7814/7851/7854 crypto card ubsec* at pci? # Bluesteel Networks 5xxx crypto card safe* at pci? # SafeNet SafeXcel 1141/1741 -# I2O -iop* at pci? # I2O processor -ioprbs* at iop? # I2O arrays -iopsp* at iop? # I2O SCSI pass-through - # 1-Wire devices option ONEWIREVERBOSE owid* at onewire? # ID diff --git a/sys/arch/amd64/conf/RAMDISK_CD b/sys/arch/amd64/conf/RAMDISK_CD index d945f50f7ed..4d3fbbc6c94 100644 --- a/sys/arch/amd64/conf/RAMDISK_CD +++ b/sys/arch/amd64/conf/RAMDISK_CD @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK_CD,v 1.130 2013/10/29 22:37:25 deraadt Exp $ +# $OpenBSD: RAMDISK_CD,v 1.131 2013/11/04 14:07:15 deraadt Exp $ machine amd64 # architecture, used by config; REQUIRED @@ -190,11 +190,6 @@ pcscp* at pci? # AMD 53c974 PCscsi-PCI SCSI vmwpvs* at pci? # VMware ParaVirtual SCSI softraid0 at root # Software RAID -# I2O -iop* at pci? # I2O processor -ioprbs* at iop? # I2O arrays -iopsp* at iop? # I2O SCSI pass-through - scsibus* at scsi? sd* at scsibus? # SCSI disk drives st* at scsibus? # SCSI tape drives diff --git a/sys/arch/amd64/conf/files.amd64 b/sys/arch/amd64/conf/files.amd64 index 77f8309e4f2..b0a3de77a4c 100644 --- a/sys/arch/amd64/conf/files.amd64 +++ b/sys/arch/amd64/conf/files.amd64 @@ -1,4 +1,4 @@ -# $OpenBSD: files.amd64,v 1.70 2013/08/15 06:54:35 kettenis Exp $ +# $OpenBSD: files.amd64,v 1.71 2013/11/04 14:07:15 deraadt Exp $ maxpartitions 16 maxusers 2 16 128 @@ -72,8 +72,6 @@ include "dev/mii/files.mii" include "scsi/files.scsi" -include "dev/i2o/files.i2o" - include "dev/atapiscsi/files.atapiscsi" include "dev/ata/files.ata" diff --git a/sys/arch/armish/conf/files.armish b/sys/arch/armish/conf/files.armish index 4dd04f795a9..186f47d5a31 100644 --- a/sys/arch/armish/conf/files.armish +++ b/sys/arch/armish/conf/files.armish @@ -1,4 +1,4 @@ -# $OpenBSD: files.armish,v 1.15 2011/11/15 22:27:52 deraadt Exp $ +# $OpenBSD: files.armish,v 1.16 2013/11/04 14:07:15 deraadt Exp $ maxpartitions 16 maxusers 2 8 64 @@ -26,9 +26,6 @@ file arch/arm/arm/irq_dispatch.S include "dev/i2c/files.i2c" -# Machine-independent I2O drivers. -include "dev/i2o/files.i2o" - # ARM i80321 files include "arch/arm/xscale/files.i80321" diff --git a/sys/arch/armv7/conf/files.armv7 b/sys/arch/armv7/conf/files.armv7 index d4169f5721e..7e3b969849d 100644 --- a/sys/arch/armv7/conf/files.armv7 +++ b/sys/arch/armv7/conf/files.armv7 @@ -1,4 +1,4 @@ -# $OpenBSD: files.armv7,v 1.7 2013/10/30 20:20:23 syl Exp $ +# $OpenBSD: files.armv7,v 1.8 2013/11/04 14:07:16 deraadt Exp $ maxpartitions 16 maxusers 2 8 64 @@ -40,9 +40,6 @@ include "dev/atapiscsi/files.atapiscsi" # Machine-independent ATA drivers include "dev/ata/files.ata" -# Machine-independent I2O drivers. -include "dev/i2o/files.i2o" - # Include WSCONS stuff include "dev/wscons/files.wscons" include "dev/rasops/files.rasops" diff --git a/sys/arch/hppa/conf/files.hppa b/sys/arch/hppa/conf/files.hppa index fd6ae5237a5..cf2f13bc9aa 100644 --- a/sys/arch/hppa/conf/files.hppa +++ b/sys/arch/hppa/conf/files.hppa @@ -1,4 +1,4 @@ -# $OpenBSD: files.hppa,v 1.90 2011/12/21 23:12:03 miod Exp $ +# $OpenBSD: files.hppa,v 1.91 2013/11/04 14:07:16 deraadt Exp $ # # hppa-specific configuration info @@ -29,9 +29,6 @@ major {sd = 4} major {st = 5} major {cd = 6} -# I2O -include "dev/i2o/files.i2o" - # # MI ATAPI drivers # diff --git a/sys/arch/hppa64/conf/files.hppa64 b/sys/arch/hppa64/conf/files.hppa64 index ebf70d44e9a..14093cb1a41 100644 --- a/sys/arch/hppa64/conf/files.hppa64 +++ b/sys/arch/hppa64/conf/files.hppa64 @@ -1,4 +1,4 @@ -# $OpenBSD: files.hppa64,v 1.16 2011/10/06 20:49:28 deraadt Exp $ +# $OpenBSD: files.hppa64,v 1.17 2013/11/04 14:07:16 deraadt Exp $ # # hppa64-specific configuration info @@ -26,9 +26,6 @@ major { sd = 4 } major { st = 5 } major { cd = 6 } -# I2O -include "dev/i2o/files.i2o" - # # MI ATAPI drivers # diff --git a/sys/arch/i386/conf/GENERIC b/sys/arch/i386/conf/GENERIC index f80f8d0901a..880964e76df 100644 --- a/sys/arch/i386/conf/GENERIC +++ b/sys/arch/i386/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.759 2013/10/31 09:57:02 pirofti Exp $ +# $OpenBSD: GENERIC,v 1.760 2013/11/04 14:07:16 deraadt Exp $ # # For further information on compiling OpenBSD kernels, see the config(8) # man page. @@ -761,11 +761,6 @@ ubsec* at pci? # Bluesteel Networks 5xxx crypto card safe* at pci? # SafeNet SafeXcel 1141/1741 glxsb* at pci? # AMD Geode LX series processor security block -# I2O -iop* at pci? # I2O processor -ioprbs* at iop? # I2O arrays -iopsp* at iop? # I2O SCSI pass-through - # GPIO ``pin bus'' drivers #gpioiic* at gpio? offset 0 mask 0x3 # I2C bus bit-banging gpioiic* at gpio? diff --git a/sys/arch/i386/conf/RAMDISK_CD b/sys/arch/i386/conf/RAMDISK_CD index 1af8c6e6626..09e82619c09 100644 --- a/sys/arch/i386/conf/RAMDISK_CD +++ b/sys/arch/i386/conf/RAMDISK_CD @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK_CD,v 1.204 2013/10/28 12:33:32 mpi Exp $ +# $OpenBSD: RAMDISK_CD,v 1.205 2013/11/04 14:07:16 deraadt Exp $ machine i386 # architecture, used by config; REQUIRED @@ -233,11 +233,6 @@ uha* at eisa? # UltraStor 24f SCSI controllers vmwpvs* at pci? # VMware ParaVirtual SCSI softraid0 at root # Software RAID -# I2O -iop* at pci? # I2O processor -ioprbs* at iop? # I2O arrays -iopsp* at iop? # I2O SCSI pass-through - scsibus* at scsi? sd* at scsibus? # SCSI disk drives st* at scsibus? # SCSI tape drives diff --git a/sys/arch/i386/conf/files.i386 b/sys/arch/i386/conf/files.i386 index d81f525b963..bddf9ca02e4 100644 --- a/sys/arch/i386/conf/files.i386 +++ b/sys/arch/i386/conf/files.i386 @@ -1,4 +1,4 @@ -# $OpenBSD: files.i386,v 1.213 2013/08/15 06:54:35 kettenis Exp $ +# $OpenBSD: files.i386,v 1.214 2013/11/04 14:07:16 deraadt Exp $ # # new style config file for i386 architecture # @@ -71,11 +71,6 @@ major {cd = 6} major {rd = 17} # -# I2O -# -include "dev/i2o/files.i2o" - -# # Machine-independent ATAPI drivers # diff --git a/sys/arch/landisk/conf/files.landisk b/sys/arch/landisk/conf/files.landisk index 369291095c0..39f7754d9b8 100644 --- a/sys/arch/landisk/conf/files.landisk +++ b/sys/arch/landisk/conf/files.landisk @@ -1,4 +1,4 @@ -# $OpenBSD: files.landisk,v 1.8 2011/03/03 09:36:25 jasper Exp $ +# $OpenBSD: files.landisk,v 1.9 2013/11/04 14:07:16 deraadt Exp $ # $NetBSD: files.landisk,v 1.2 2006/09/07 01:55:02 uwe Exp $ # maxpartitions must be first item in files.${MACHINE} @@ -46,11 +46,6 @@ include "dev/ata/files.ata" include "dev/atapiscsi/files.atapiscsi" # -# Machine-independent I2O drivers -# -include "dev/i2o/files.i2o" - -# # PCI bus # include "dev/mii/files.mii" diff --git a/sys/arch/loongson/conf/files.loongson b/sys/arch/loongson/conf/files.loongson index 82f74f98878..46b668181c5 100644 --- a/sys/arch/loongson/conf/files.loongson +++ b/sys/arch/loongson/conf/files.loongson @@ -1,4 +1,4 @@ -# $OpenBSD: files.loongson,v 1.16 2013/08/15 06:54:35 kettenis Exp $ +# $OpenBSD: files.loongson,v 1.17 2013/11/04 14:07:16 deraadt Exp $ # Standard stanzas config(8) can't run without maxpartitions 16 @@ -34,7 +34,6 @@ include "dev/ata/files.ata" include "dev/atapiscsi/files.atapiscsi" include "dev/i2c/files.i2c" include "dev/gpio/files.gpio" -include "dev/i2o/files.i2o" include "dev/isa/files.isa" include "dev/isa/files.isapnp" include "dev/mii/files.mii" diff --git a/sys/arch/macppc/conf/GENERIC b/sys/arch/macppc/conf/GENERIC index 3771695da23..dc160287e76 100644 --- a/sys/arch/macppc/conf/GENERIC +++ b/sys/arch/macppc/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.226 2013/09/05 19:42:07 sasano Exp $g +# $OpenBSD: GENERIC,v 1.227 2013/11/04 14:07:16 deraadt Exp $g # # For further information on compiling OpenBSD kernels, see the config(8) # man page. @@ -101,10 +101,6 @@ mbg* at pci? # Meinberg Funkuhren radio clocks malo* at pci? # Marvell Libertas acx* at pci? # TI ACX100/ACX111 (802.11b/g) -iop* at pci? # I2O processor -ioprbs* at iop? # I2O arrays -iopsp* at iop? # I2O SCSI pass-through - amphy* at mii? # AMD 79C873 PHYs dcphy* at mii? # Digital Clone PHYs exphy* at mii? # 3Com internal PHYs diff --git a/sys/arch/macppc/conf/RAMDISK b/sys/arch/macppc/conf/RAMDISK index f959c4d8317..8403781f7a6 100644 --- a/sys/arch/macppc/conf/RAMDISK +++ b/sys/arch/macppc/conf/RAMDISK @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK,v 1.96 2013/08/20 14:27:29 ajacoutot Exp $ +# $OpenBSD: RAMDISK,v 1.97 2013/11/04 14:07:16 deraadt Exp $ # # PPC GENERIC config file # @@ -87,10 +87,6 @@ vr* at pci? # VIA Rhine ethernet pcn* at pci? # AMD PCnet-PCI Ethernet xge* at pci? # Neterion Xframe-I/II 10Gb ethernet -iop* at pci? # I2O processor -ioprbs* at iop? # I2O arrays -iopsp* at iop? # I2O SCSI pass-through - # how many of these are needed? amphy* at mii? # AMD 79C873 PHYs dcphy* at mii? # Digital Clone PHYs diff --git a/sys/arch/macppc/conf/files.macppc b/sys/arch/macppc/conf/files.macppc index f2563d233ae..4cc93ec16e5 100644 --- a/sys/arch/macppc/conf/files.macppc +++ b/sys/arch/macppc/conf/files.macppc @@ -1,4 +1,4 @@ -# $OpenBSD: files.macppc,v 1.76 2013/08/28 07:03:02 mpi Exp $ +# $OpenBSD: files.macppc,v 1.77 2013/11/04 14:07:16 deraadt Exp $ # # macppc-specific configuration info @@ -58,11 +58,6 @@ major {cd = 3} include "scsi/files.scsi" -# -# I2O -# -include "dev/i2o/files.i2o" - include "dev/pci/files.pci" file arch/macppc/pci/pciide_machdep.c pciide diff --git a/sys/arch/octeon/conf/files.octeon b/sys/arch/octeon/conf/files.octeon index e2a0e666411..b3809e0f60c 100644 --- a/sys/arch/octeon/conf/files.octeon +++ b/sys/arch/octeon/conf/files.octeon @@ -1,4 +1,4 @@ -# $OpenBSD: files.octeon,v 1.15 2013/10/24 20:47:08 pirofti Exp $ +# $OpenBSD: files.octeon,v 1.16 2013/11/04 14:07:16 deraadt Exp $ # Standard stanzas config(8) can't run without maxpartitions 16 @@ -25,7 +25,6 @@ include "dev/ata/files.ata" include "dev/atapiscsi/files.atapiscsi" include "dev/i2c/files.i2c" include "dev/gpio/files.gpio" -include "dev/i2o/files.i2o" include "dev/isa/files.isa" include "dev/isa/files.isapnp" include "dev/mii/files.mii" diff --git a/sys/arch/sgi/conf/files.sgi b/sys/arch/sgi/conf/files.sgi index 767c2c94bca..68dd99ff8ba 100644 --- a/sys/arch/sgi/conf/files.sgi +++ b/sys/arch/sgi/conf/files.sgi @@ -1,4 +1,4 @@ -# $OpenBSD: files.sgi,v 1.51 2012/09/29 21:46:02 miod Exp $ +# $OpenBSD: files.sgi,v 1.52 2013/11/04 14:07:16 deraadt Exp $ # # maxpartitions must be first item in files.${ARCH} # @@ -113,8 +113,6 @@ include "scsi/files.scsi" major {sd = 0} major {cd = 3} -include "dev/i2o/files.i2o" - # # EISA Bus support # diff --git a/sys/arch/socppc/conf/files.socppc b/sys/arch/socppc/conf/files.socppc index 3f93aedb020..6b462634a1e 100644 --- a/sys/arch/socppc/conf/files.socppc +++ b/sys/arch/socppc/conf/files.socppc @@ -1,4 +1,4 @@ -# $OpenBSD: files.socppc,v 1.10 2010/03/31 16:33:30 deraadt Exp $ +# $OpenBSD: files.socppc,v 1.11 2013/11/04 14:07:16 deraadt Exp $ # # macppc-specific configuration info @@ -69,11 +69,6 @@ major {cd = 3} include "../../../scsi/files.scsi" -# -# I2O -# -include "../../../dev/i2o/files.i2o" - include "dev/pci/files.pci" file arch/socppc/dev/pciide_machdep.c pciide diff --git a/sys/arch/sparc64/conf/files.sparc64 b/sys/arch/sparc64/conf/files.sparc64 index 7e3d51d1aaf..94f61781f63 100644 --- a/sys/arch/sparc64/conf/files.sparc64 +++ b/sys/arch/sparc64/conf/files.sparc64 @@ -1,4 +1,4 @@ -# $OpenBSD: files.sparc64,v 1.143 2013/11/01 21:22:31 miod Exp $ +# $OpenBSD: files.sparc64,v 1.144 2013/11/04 14:07:16 deraadt Exp $ # $NetBSD: files.sparc64,v 1.50 2001/08/10 20:53:50 eeh Exp $ # maxpartitions must be first item in files.${ARCH} @@ -73,7 +73,6 @@ attach prtc at mainbus file arch/sparc64/dev/prtc.c prtc include "dev/sbus/files.sbus" -include "dev/i2o/files.i2o" include "dev/mii/files.mii" include "dev/atapiscsi/files.atapiscsi" include "dev/ata/files.ata" diff --git a/sys/arch/zaurus/conf/files.zaurus b/sys/arch/zaurus/conf/files.zaurus index 3ba067149f5..d77cf92ce11 100644 --- a/sys/arch/zaurus/conf/files.zaurus +++ b/sys/arch/zaurus/conf/files.zaurus @@ -1,4 +1,4 @@ -# $OpenBSD: files.zaurus,v 1.27 2011/05/15 08:52:48 matthieu Exp $ +# $OpenBSD: files.zaurus,v 1.28 2013/11/04 14:07:16 deraadt Exp $ # # First try for arm-specific configuration info # @@ -90,9 +90,6 @@ file arch/arm/fpe-arm/armfpe_glue.S armfpe file arch/arm/fpe-arm/armfpe_init.c armfpe file arch/arm/fpe-arm/armfpe.s armfpe -# Machine-independent I2O drivers. -include "dev/i2o/files.i2o" - # Include WSCONS stuff include "dev/wscons/files.wscons" include "dev/rasops/files.rasops" diff --git a/sys/dev/i2o/files.i2o b/sys/dev/i2o/files.i2o deleted file mode 100644 index 2f734b83d1b..00000000000 --- a/sys/dev/i2o/files.i2o +++ /dev/null @@ -1,14 +0,0 @@ -# $OpenBSD: files.i2o,v 1.8 2011/06/29 19:48:21 matthew Exp $ - -device iop {[tid = -1]} -file dev/i2o/iop.c iop & iop_pci needs-flag - -# SCSI peripheral -device iopsp: scsi -attach iopsp at iop -file dev/i2o/iopsp.c iopsp - -# Random block storage -device ioprbs: scsi -attach ioprbs at iop -file dev/i2o/ioprbs.c ioprbs diff --git a/sys/dev/i2o/i2o.h b/sys/dev/i2o/i2o.h deleted file mode 100644 index 81d7cb2ab62..00000000000 --- a/sys/dev/i2o/i2o.h +++ /dev/null @@ -1,1230 +0,0 @@ -/* $OpenBSD: i2o.h,v 1.9 2008/06/26 05:42:14 ray Exp $ */ -/* $NetBSD: i2o.h,v 1.3 2001/03/20 13:01:48 ad Exp $ */ - -/*- - * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Structures and constants, as presented by the I2O specification revision - * 1.5 (obtainable from http://www.intelligent-io.com/). Currently, only - * what's useful to us is defined in this file. - */ - -#ifndef _I2O_I2O_H_ -#define _I2O_I2O_H_ - -/* - * ================= Miscellaneous definitions ================= - */ - -/* Organisation IDs */ -#define I2O_ORG_DPT 0x001b -#define I2O_ORG_INTEL 0x0028 -#define I2O_ORG_AMI 0x1000 - -/* Macros to assist in building message headers */ -#define I2O_MSGFLAGS(s) (I2O_VERSION_11 | (sizeof(struct s) << 14)) -#define I2O_MSGFUNC(t, f) ((t) | (I2O_TID_HOST << 12) | ((f) << 24)) - -/* Common message function codes with no payload or an undefined payload */ -#define I2O_UTIL_NOP 0x00 -#define I2O_EXEC_IOP_CLEAR 0xbe -#define I2O_EXEC_SYS_QUIESCE 0xc3 -#define I2O_EXEC_SYS_ENABLE 0xd1 -#define I2O_PRIVATE_MESSAGE 0xff - -/* Device class codes */ -#define I2O_CLASS_EXECUTIVE 0x00 -#define I2O_CLASS_DDM 0x01 -#define I2O_CLASS_RANDOM_BLOCK_STORAGE 0x10 -#define I2O_CLASS_SEQUENTIAL_STORAGE 0x11 -#define I2O_CLASS_LAN 0x20 -#define I2O_CLASS_WAN 0x30 -#define I2O_CLASS_FIBRE_CHANNEL_PORT 0x40 -#define I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL 0x41 -#define I2O_CLASS_SCSI_PERIPHERAL 0x51 -#define I2O_CLASS_ATE_PORT 0x60 -#define I2O_CLASS_ATE_PERIPHERAL 0x61 -#define I2O_CLASS_FLOPPY_CONTROLLER 0x70 -#define I2O_CLASS_FLOPPY_DEVICE 0x71 -#define I2O_CLASS_BUS_ADAPTER_PORT 0x80 -#define I2O_CLASS_MASK 0xfff - -#define I2O_CLASS_ANY 0xffffffff - -/* Reply status codes */ -#define I2O_STATUS_SUCCESS 0x00 -#define I2O_STATUS_ABORT_DIRTY 0x01 -#define I2O_STATUS_ABORT_NO_DATA_XFER 0x02 -#define I2O_STATUS_ABORT_PARTIAL_XFER 0x03 -#define I2O_STATUS_ERROR_DIRTY 0x04 -#define I2O_STATUS_ERROR_NO_DATA_XFER 0x05 -#define I2O_STATUS_ERROR_PARTIAL_XFER 0x06 -#define I2O_STATUS_PROCESS_ABORT_DIRTY 0x08 -#define I2O_STATUS_PROCESS_ABORT_NO_DATA_XFER 0x09 -#define I2O_STATUS_PROCESS_ABORT_PARTIAL_XFER 0x0a -#define I2O_STATUS_TRANSACTION_ERROR 0x0b -#define I2O_STATUS_PROGRESS_REPORT 0x80 - -/* Detailed status codes */ -#define I2O_DSC_SUCCESS 0x00 -#define I2O_DSC_BAD_KEY 0x02 -#define I2O_DSC_TCL_ERROR 0x03 -#define I2O_DSC_REPLY_BUFFER_FULL 0x04 -#define I2O_DSC_NO_SUCH_PAGE 0x05 -#define I2O_DSC_INSUFFICIENT_RESOURCE_SOFT 0x06 -#define I2O_DSC_INSUFFICIENT_RESOURCE_HARD 0x07 -#define I2O_DSC_CHAIN_BUFFER_TOO_LARGE 0x09 -#define I2O_DSC_UNSUPPORTED_FUNCTION 0x0a -#define I2O_DSC_DEVICE_LOCKED 0x0b -#define I2O_DSC_DEVICE_RESET 0x0c -#define I2O_DSC_INAPPROPRIATE_FUNCTION 0x0d -#define I2O_DSC_INVALID_INITIATOR_ADDRESS 0x0e -#define I2O_DSC_INVALID_MESSAGE_FLAGS 0x0f -#define I2O_DSC_INVALID_OFFSET 0x10 -#define I2O_DSC_INVALID_PARAMETER 0x11 -#define I2O_DSC_INVALID_REQUEST 0x12 -#define I2O_DSC_INVALID_TARGET_ADDRESS 0x13 -#define I2O_DSC_MESSAGE_TOO_LARGE 0x14 -#define I2O_DSC_MESSAGE_TOO_SMALL 0x15 -#define I2O_DSC_MISSING_PARAMETER 0x16 -#define I2O_DSC_TIMEOUT 0x17 -#define I2O_DSC_UNKNOWN_ERROR 0x18 -#define I2O_DSC_UNKNOWN_FUNCTION 0x19 -#define I2O_DSC_UNSUPPORTED_VERSION 0x1a -#define I2O_DSC_DEVICE_BUSY 0x1b -#define I2O_DSC_DEVICE_NOT_AVAILABLE 0x1c - -/* Message versions */ -#define I2O_VERSION_10 0x00 -#define I2O_VERSION_11 0x01 -#define I2O_VERSION_20 0x02 - -/* Commonly used TIDs */ -#define I2O_TID_IOP 0 -#define I2O_TID_HOST 1 -#define I2O_TID_NONE 4095 - -/* SGL flags. This list covers only a fraction of the possibilities. */ -#define I2O_SGL_IGNORE 0x00000000 -#define I2O_SGL_SIMPLE 0x10000000 -#define I2O_SGL_PAGE_LIST 0x20000000 - -#define I2O_SGL_BC_32BIT 0x01000000 -#define I2O_SGL_BC_64BIT 0x02000000 -#define I2O_SGL_BC_96BIT 0x03000000 -#define I2O_SGL_DATA_OUT 0x04000000 -#define I2O_SGL_END_BUFFER 0x40000000 -#define I2O_SGL_END 0x80000000 - -/* Serial number formats */ -#define I2O_SNFMT_UNKNOWN 0 -#define I2O_SNFMT_BINARY 1 -#define I2O_SNFMT_ASCII 2 -#define I2O_SNFMT_UNICODE 3 -#define I2O_SNFMT_LAN_MAC 4 -#define I2O_SNFMT_WAN_MAC 5 - -/* - * ================= Common structures ================= - */ - -/* - * Standard I2O message frame. All message frames begin with this. - * - * Bits Field Meaning - * ---- ------------- ---------------------------------------------------- - * 0-2 msgflags Message header version. Must be 001 (little endian). - * 3 msgflags Reserved. - * 4-7 msgflags Offset to SGLs expressed as # of 32-bit words. - * 8-15 msgflags Control flags. - * 16-31 msgflags Message frame size expressed as # of 32-bit words. - * 0-11 msgfunc TID of target. - * 12-23 msgfunc TID of initiator. - * 24-31 msgfunc Function (i.e., type of message). - */ -struct i2o_msg { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; /* Initiator context */ - u_int32_t msgtctx; /* Transaction context */ - - /* Message payload */ - -} __packed; - -#define I2O_MSGFLAGS_STATICMF 0x0100 -#define I2O_MSGFLAGS_64BIT 0x0200 -#define I2O_MSGFLAGS_MULTI 0x1000 -#define I2O_MSGFLAGS_FAIL 0x2000 -#define I2O_MSGFLAGS_LAST_REPLY 0x4000 -#define I2O_MSGFLAGS_REPLY 0x8000 - -/* - * Standard reply frame. msgflags, msgfunc, msgictx and msgtctx have the - * same meaning as in `struct i2o_msg'. - */ -struct i2o_reply { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int16_t detail; /* Detailed status code */ - u_int8_t reserved; - u_int8_t reqstatus; /* Request status code */ - - /* Reply payload */ - -} __packed; - -/* - * Fault notification reply, returned when a message frame can not be - * processed (i.e I2O_MSGFLAGS_FAIL is set in the reply). - */ -struct i2o_fault_notify { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; /* Not valid! */ - u_int8_t lowestver; - u_int8_t highestver; - u_int8_t severity; - u_int8_t failurecode; - u_int16_t failingiop; /* Bits 0-12 only */ - u_int16_t failinghostunit; - u_int32_t agelimit; - u_int32_t lowmfa; - u_int32_t highmfa; -}; - -/* - * Hardware resource table. Not documented here. - */ -struct i2o_hrt_entry { - u_int32_t adapterid; - u_int16_t controllingtid; - u_int8_t busnumber; - u_int8_t bustype; - u_int8_t businfo[8]; -} __packed; - -struct i2o_hrt { - u_int16_t numentries; - u_int8_t entrysize; - u_int8_t hrtversion; - u_int32_t changeindicator; - struct i2o_hrt_entry entry[1]; -} __packed; - -/* - * Logical configuration table entry. Bitfields are broken down as follows: - * - * Bits Field Meaning - * ----- -------------- --------------------------------------------------- - * 0-11 classid Class ID. - * 12-15 classid Class version. - * 0-11 usertid User TID - * 12-23 usertid Parent TID. - * 24-31 usertid BIOS info. - */ -struct i2o_lct_entry { - u_int16_t entrysize; - u_int16_t localtid; /* Bits 0-12 only */ -#define I2O_LCT_ENTRY_TID_MASK 0xfff - u_int32_t changeindicator; - u_int32_t deviceflags; - u_int16_t classid; - u_int16_t orgid; - u_int32_t subclassinfo; - u_int32_t usertid; - u_int8_t identitytag[8]; - u_int32_t eventcaps; -} __packed; - -/* - * Logical configuration table header. - */ -struct i2o_lct { - u_int16_t tablesize; - u_int16_t flags; - u_int32_t iopflags; - u_int32_t changeindicator; - struct i2o_lct_entry entry[1]; -} __packed; - -/* - * IOP system table. Bitfields are broken down as follows: - * - * Bits Field Meaning - * ----- -------------- --------------------------------------------------- - * 0-11 iopid IOP ID. - * 12-31 iopid Reserved. - * 0-11 segnumber Segment number. - * 12-15 segnumber I2O version. - * 16-23 segnumber IOP state. - * 24-31 segnumber Messenger type. - */ -struct i2o_systab_entry { - u_int16_t orgid; - u_int16_t reserved0; - u_int32_t iopid; - u_int32_t segnumber; - u_int16_t inboundmsgframesize; - u_int16_t reserved1; - u_int32_t lastchanged; - u_int32_t iopcaps; - u_int32_t inboundmsgportaddresslow; - u_int32_t inboundmsgportaddresshigh; -} __packed; - -struct i2o_systab { - u_int8_t numentries; - u_int8_t version; - u_int16_t reserved0; - u_int32_t changeindicator; - u_int32_t reserved1[2]; - struct i2o_systab_entry entry[1]; -} __packed; - -/* - * IOP status record. Bitfields are broken down as follows: - * - * Bits Field Meaning - * ----- -------------- --------------------------------------------------- - * 0-11 iopid IOP ID. - * 12-15 iopid Reserved. - * 16-31 iopid Host unit ID. - * 0-11 segnumber Segment number. - * 12-15 segnumber I2O version. - * 16-23 segnumber IOP state. - * 24-31 segnumber Messenger type. - */ -struct i2o_status { - u_int16_t orgid; - u_int16_t reserved0; - u_int32_t iopid; - u_int32_t segnumber; - u_int16_t inboundmframesize; - u_int8_t initcode; - u_int8_t reserved1; - u_int32_t maxinboundmframes; - u_int32_t currentinboundmframes; - u_int32_t maxoutboundmframes; - u_int8_t productid[24]; - u_int32_t expectedlctsize; - u_int32_t iopcaps; - u_int32_t desiredprivmemsize; - u_int32_t currentprivmemsize; - u_int32_t currentprivmembase; - u_int32_t desiredpriviosize; - u_int32_t currentpriviosize; - u_int32_t currentpriviobase; - u_int8_t reserved2[3]; - u_int8_t syncbyte; -} __packed; - -#define I2O_IOP_STATE_INITIALIZING 0x01 -#define I2O_IOP_STATE_RESET 0x02 -#define I2O_IOP_STATE_HOLD 0x04 -#define I2O_IOP_STATE_READY 0x05 -#define I2O_IOP_STATE_OPERATIONAL 0x08 -#define I2O_IOP_STATE_FAILED 0x10 -#define I2O_IOP_STATE_FAULTED 0x11 - -/* - * ================= Executive class messages ================= - */ - -#define I2O_EXEC_STATUS_GET 0xa0 -struct i2o_exec_status_get { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t reserved[4]; - u_int32_t addrlow; - u_int32_t addrhigh; - u_int32_t length; -} __packed; - -#define I2O_EXEC_OUTBOUND_INIT 0xa1 -struct i2o_exec_outbound_init { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t pagesize; - u_int32_t flags; /* init code, outbound msg size */ -} __packed; - -#define I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS 1 -#define I2O_EXEC_OUTBOUND_INIT_REJECTED 2 -#define I2O_EXEC_OUTBOUND_INIT_FAILED 3 -#define I2O_EXEC_OUTBOUND_INIT_COMPLETE 4 - -#define I2O_EXEC_LCT_NOTIFY 0xa2 -struct i2o_exec_lct_notify { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t classid; - u_int32_t changeindicator; -} __packed; - -#define I2O_EXEC_SYS_TAB_SET 0xa3 -struct i2o_exec_sys_tab_set { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t iopid; - u_int32_t segnumber; -} __packed; - -#define I2O_EXEC_HRT_GET 0xa8 -struct i2o_exec_hrt_get { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; -} __packed; - -#define I2O_EXEC_IOP_RESET 0xbd -struct i2o_exec_iop_reset { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t reserved[4]; - u_int32_t statuslow; - u_int32_t statushigh; -} __packed; - -#define I2O_RESET_IN_PROGRESS 0x01 -#define I2O_RESET_REJECTED 0x02 - -/* - * ================= Executive class parameter groups ================= - */ - -#define I2O_PARAM_EXEC_LCT_SCALAR 0x0101 -#define I2O_PARAM_EXEC_LCT_TABLE 0x0102 - -/* - * ================= HBA class messages ================= - */ - -#define I2O_HBA_BUS_SCAN 0x89 -struct i2o_hba_bus_scan { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; -} __packed; - -/* - * ================= HBA class parameter groups ================= - */ - -#define I2O_PARAM_HBA_CTLR_INFO 0x0000 -struct i2o_param_hba_ctlr_info { - u_int8_t bustype; - u_int8_t busstate; - u_int16_t reserved; - u_int8_t busname[12]; -} __packed; - -#define I2O_HBA_BUS_GENERIC 0x00 -#define I2O_HBA_BUS_SCSI 0x01 -#define I2O_HBA_BUS_FCA 0x10 - -#define I2O_PARAM_HBA_SCSI_PORT_INFO 0x0001 -struct i2o_param_hba_scsi_port_info { - u_int8_t physicalif; -#define I2O_PARAM_HBA_SCSI_PORT_GENERIC 0x01 -#define I2O_PARAM_HBA_SCSI_PORT_UNKNOWN 0x02 -#define I2O_PARAM_HBA_SCSI_PORT_PARINTF 0x03 -#define I2O_PARAM_HBA_SCSI_PORT_FCL 0x04 -#define I2O_PARAM_HBA_SCSI_PORT_1394 0x05 -#define I2O_PARAM_HBA_SCSI_PORT_SSA 0x06 - u_int8_t electricalif; -#define I2O_PARAM_HBA_SCSI_PORT_SE 0x03 -#define I2O_PARAM_HBA_SCSI_PORT_DIFF 0x04 -#define I2O_PARAM_HBA_SCSI_PORT_LVD 0x05 -#define I2O_PARAM_HBA_SCSI_PORT_OPTCL 0x06 - u_int8_t isosynchonrous; - u_int8_t connectortype; -#define I2O_PARAM_HBA_SCSI_PORT_HDBS50 0x04 -#define I2O_PARAM_HBA_SCSI_PORT_HDBU50 0x05 -#define I2O_PARAM_HBA_SCSI_PORT_DBS50 0x06 -#define I2O_PARAM_HBA_SCSI_PORT_DBU50 0x07 -#define I2O_PARAM_HBA_SCSI_PORT_HDBS68 0x08 -#define I2O_PARAM_HBA_SCSI_PORT_HDBU68 0x09 -#define I2O_PARAM_HBA_SCSI_PORT_SCA1 0x0a -#define I2O_PARAM_HBA_SCSI_PORT_SCA2 0x0b -#define I2O_PARAM_HBA_SCSI_PORT_FCDB9 0x0c -#define I2O_PARAM_HBA_SCSI_PORT_FC 0x0d -#define I2O_PARAM_HBA_SCSI_PORT_FCSCA40 0x0e -#define I2O_PARAM_HBA_SCSI_PORT_FCSCA20 0x0f -#define I2O_PARAM_HBA_SCSI_PORT_FCBNC 0x10 - u_int8_t connectorgender; -#define I2O_PARAM_HBA_SCSI_PORT_FEMALE 0x03 -#define I2O_PARAM_HBA_SCSI_PORT_MALE 0x04 - u_int8_t reserved1; - u_int16_t reserved2; - u_int32_t maxnumberofdevices; -} __packed; - -#define I2O_PARAM_HBA_SCSI_CTLR_INFO 0x0200 -struct i2o_param_hba_scsi_ctlr_info { - u_int8_t scsitype; -#define I2O_PARAM_HBA_SCSI_CTRL_SCSI0 0x00 -#define I2O_PARAM_HBA_SCSI_CTRL_SCSI1 0x01 -#define I2O_PARAM_HBA_SCSI_CTRL_SCSI2 0x02 -#define I2O_PARAM_HBA_SCSI_CTRL_SCSI3 0x03 - u_int8_t protection; - u_int8_t settings; - u_int8_t reserved; - u_int32_t initiatorid; - u_int64_t scanlun0only; - u_int16_t disabledevice; - u_int8_t maxoffset; - u_int8_t maxdatawidth; - u_int64_t maxsyncrate; -} __packed; - - -/* - * ================= Utility messages ================= - */ - -#define I2O_UTIL_ABORT 0x01 -struct i2o_util_abort { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; /* abort type and function type */ - u_int32_t tctxabort; -} __packed; - -#define I2O_UTIL_ABORT_EXACT 0x00000000 -#define I2O_UTIL_ABORT_FUNCTION 0x00010000 -#define I2O_UTIL_ABORT_TRANSACTION 0x00020000 -#define I2O_UTIL_ABORT_WILD 0x00030000 - -#define I2O_UTIL_ABORT_CLEAN 0x00040000 - -struct i2o_util_abort_reply { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t count; -} __packed; - -#define I2O_UTIL_PARAMS_SET 0x05 -#define I2O_UTIL_PARAMS_GET 0x06 -struct i2o_util_params_op { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; -} __packed; - -#define I2O_PARAMS_OP_FIELD_GET 1 -#define I2O_PARAMS_OP_LIST_GET 2 -#define I2O_PARAMS_OP_MORE_GET 3 -#define I2O_PARAMS_OP_SIZE_GET 4 -#define I2O_PARAMS_OP_TABLE_GET 5 -#define I2O_PARAMS_OP_FIELD_SET 6 -#define I2O_PARAMS_OP_LIST_SET 7 -#define I2O_PARAMS_OP_ROW_ADD 8 -#define I2O_PARAMS_OP_ROW_DELETE 9 -#define I2O_PARAMS_OP_TABLE_CLEAR 10 - -struct i2o_param_op_list_header { - u_int16_t count; - u_int16_t reserved; -} __packed; - -struct i2o_param_op_all_template { - u_int16_t operation; - u_int16_t group; - u_int16_t fieldcount; - u_int16_t fields[1]; -} __packed; - -struct i2o_param_op_results { - u_int16_t count; - u_int16_t reserved; -} __packed; - -struct i2o_param_read_results { - u_int16_t blocksize; - u_int8_t blockstatus; - u_int8_t errorinfosize; -} __packed; - -struct i2o_param_table_results { - u_int16_t blocksize; - u_int8_t blockstatus; - u_int8_t errorinfosize; - u_int16_t rowcount; - u_int16_t moreflag; -} __packed; - -#define I2O_UTIL_CLAIM 0x09 -struct i2o_util_claim { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; -} __packed; - -#define I2O_UTIL_CLAIM_RESET_SENSITIVE 0x00000002 -#define I2O_UTIL_CLAIM_STATE_SENSITIVE 0x00000004 -#define I2O_UTIL_CLAIM_CAPACITY_SENSITIVE 0x00000008 -#define I2O_UTIL_CLAIM_NO_PEER_SERVICE 0x00000010 -#define I2O_UTIL_CLAIM_NO_MANAGEMENT_SERVICE 0x00000020 - -#define I2O_UTIL_CLAIM_PRIMARY_USER 0x01000000 -#define I2O_UTIL_CLAIM_AUTHORIZED_USER 0x02000000 -#define I2O_UTIL_CLAIM_SECONDARY_USER 0x03000000 -#define I2O_UTIL_CLAIM_MANAGEMENT_USER 0x04000000 - -#define I2O_UTIL_CLAIM_RELEASE 0x0b -struct i2o_util_claim_release { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; /* User flags as per I2O_UTIL_CLAIM */ -} __packed; - -#define I2O_UTIL_CLAIM_RELEASE_CONDITIONAL 0x00000001 - -#define I2O_UTIL_CONFIG_DIALOG 0x10 -struct i2o_util_config_dialog { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t pageno; -} __packed; - -#define I2O_UTIL_EVENT_REGISTER 0x13 -struct i2o_util_event_register { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t eventmask; -} __packed; - -struct i2o_util_event_register_reply { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t event; - u_int32_t eventdata[1]; -} __packed; - -/* Generic events. */ -#define I2O_EVENT_GEN_DEVICE_STATE 0x00400000 -#define I2O_EVENT_GEN_VENDOR_EVENT 0x00800000 -#define I2O_EVENT_GEN_FIELD_MODIFIED 0x01000000 -#define I2O_EVENT_GEN_EVENT_MASK_MODIFIED 0x02000000 -#define I2O_EVENT_GEN_DEVICE_RESET 0x04000000 -#define I2O_EVENT_GEN_CAPABILITY_CHANGE 0x08000000 -#define I2O_EVENT_GEN_LOCK_RELEASE 0x10000000 -#define I2O_EVENT_GEN_NEED_CONFIGURATION 0x20000000 -#define I2O_EVENT_GEN_GENERAL_WARNING 0x40000000 -#define I2O_EVENT_GEN_STATE_CHANGE 0x80000000 - -/* Executive class events. */ -#define I2O_EVENT_EXEC_RESOURCE_LIMITS 0x00000001 -#define I2O_EVENT_EXEC_CONNECTION_FAIL 0x00000002 -#define I2O_EVENT_EXEC_ADAPTER_FAULT 0x00000004 -#define I2O_EVENT_EXEC_POWER_FAIL 0x00000008 -#define I2O_EVENT_EXEC_RESET_PENDING 0x00000010 -#define I2O_EVENT_EXEC_RESET_IMMINENT 0x00000020 -#define I2O_EVENT_EXEC_HARDWARE_FAIL 0x00000040 -#define I2O_EVENT_EXEC_XCT_CHANGE 0x00000080 -#define I2O_EVENT_EXEC_NEW_LCT_ENTRY 0x00000100 -#define I2O_EVENT_EXEC_MODIFIED_LCT 0x00000200 -#define I2O_EVENT_EXEC_DDM_AVAILIBILITY 0x00000400 - -/* LAN class events. */ -#define I2O_EVENT_LAN_LINK_DOWN 0x00000001 -#define I2O_EVENT_LAN_LINK_UP 0x00000002 -#define I2O_EVENT_LAN_MEDIA_CHANGE 0x00000004 - -/* - * ================= Utility parameter groups ================= - */ - -#define I2O_PARAM_DEVICE_IDENTITY 0xf100 -struct i2o_param_device_identity { - u_int32_t classid; - u_int16_t ownertid; - u_int16_t parenttid; - u_int8_t vendorinfo[16]; - u_int8_t productinfo[16]; - u_int8_t description[16]; - u_int8_t revlevel[8]; - u_int8_t snformat; - u_int8_t serialnumber[1]; -} __packed; - -#define I2O_PARAM_DDM_IDENTITY 0xf101 -struct i2o_param_ddm_identity { - u_int16_t ddmtid; - u_int8_t name[24]; - u_int8_t revlevel[8]; - u_int8_t snformat; - u_int8_t serialnumber[12]; -} __packed; - -/* - * ================= Block storage class messages ================= - */ - -#define I2O_RBS_BLOCK_READ 0x30 -struct i2o_rbs_block_read { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; /* flags, time multipler, read ahead */ - u_int32_t datasize; - u_int32_t lowoffset; - u_int32_t highoffset; -} __packed; - -#define I2O_RBS_BLOCK_READ_NO_RETRY 0x01 -#define I2O_RBS_BLOCK_READ_SOLO 0x02 -#define I2O_RBS_BLOCK_READ_CACHE_READ 0x04 -#define I2O_RBS_BLOCK_READ_PREFETCH 0x08 -#define I2O_RBS_BLOCK_READ_CACHE_ONLY 0x10 - -#define I2O_RBS_BLOCK_WRITE 0x31 -struct i2o_rbs_block_write { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; /* flags, time multipler */ - u_int32_t datasize; - u_int32_t lowoffset; - u_int32_t highoffset; -} __packed; - -#define I2O_RBS_BLOCK_WRITE_NO_RETRY 0x01 -#define I2O_RBS_BLOCK_WRITE_SOLO 0x02 -#define I2O_RBS_BLOCK_WRITE_CACHE_NONE 0x04 -#define I2O_RBS_BLOCK_WRITE_CACHE_WT 0x08 -#define I2O_RBS_BLOCK_WRITE_CACHE_WB 0x10 - -#define I2O_RBS_CACHE_FLUSH 0x37 -struct i2o_rbs_cache_flush { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; /* flags, time multipler */ -} __packed; - -#define I2O_RBS_MEDIA_MOUNT 0x41 -struct i2o_rbs_media_mount { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t mediaid; - u_int32_t loadflags; -} __packed; - -#define I2O_RBS_MEDIA_EJECT 0x43 -struct i2o_rbs_media_eject { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t mediaid; -} __packed; - -#define I2O_RBS_MEDIA_LOCK 0x49 -struct i2o_rbs_media_lock { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t mediaid; -} __packed; - -#define I2O_RBS_MEDIA_UNLOCK 0x4b -struct i2o_rbs_media_unlock { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t mediaid; -} __packed; - -/* Standard RBS reply frame. */ -struct i2o_rbs_reply { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int16_t detail; - u_int8_t retrycount; - u_int8_t reqstatus; - u_int32_t transfercount; - u_int64_t offset; /* Error replies only */ -} __packed; - -/* - * ================= Block storage class parameter groups ================= - */ - -#define I2O_PARAM_RBS_DEVICE_INFO 0x0000 -struct i2o_param_rbs_device_info { - u_int8_t type; - u_int8_t npaths; - u_int16_t powerstate; - u_int32_t blocksize; - u_int64_t capacity; - u_int32_t capabilities; - u_int32_t state; -} __packed; - -#define I2O_RBS_TYPE_DIRECT 0x00 -#define I2O_RBS_TYPE_WORM 0x04 -#define I2O_RBS_TYPE_CDROM 0x05 -#define I2O_RBS_TYPE_OPTICAL 0x07 - -#define I2O_RBS_CAP_CACHING 0x00000001 -#define I2O_RBS_CAP_MULTI_PATH 0x00000002 -#define I2O_RBS_CAP_DYNAMIC_CAPACITY 0x00000004 -#define I2O_RBS_CAP_REMOVABLE_MEDIA 0x00000008 -#define I2O_RBS_CAP_REMOVABLE_DEVICE 0x00000010 -#define I2O_RBS_CAP_READ_ONLY 0x00000020 -#define I2O_RBS_CAP_LOCKOUT 0x00000040 -#define I2O_RBS_CAP_BOOT_BYPASS 0x00000080 -#define I2O_RBS_CAP_COMPRESSION 0x00000100 -#define I2O_RBS_CAP_DATA_SECURITY 0x00000200 -#define I2O_RBS_CAP_RAID 0x00000400 - -#define I2O_RBS_STATE_CACHING 0x00000001 -#define I2O_RBS_STATE_POWERED_ON 0x00000002 -#define I2O_RBS_STATE_READY 0x00000004 -#define I2O_RBS_STATE_MEDIA_LOADED 0x00000008 -#define I2O_RBS_STATE_DEVICE_LOADED 0x00000010 -#define I2O_RBS_STATE_READ_ONLY 0x00000020 -#define I2O_RBS_STATE_LOCKOUT 0x00000040 -#define I2O_RBS_STATE_BOOT_BYPASS 0x00000080 -#define I2O_RBS_STATE_COMPRESSION 0x00000100 -#define I2O_RBS_STATE_DATA_SECURITY 0x00000200 -#define I2O_RBS_STATE_RAID 0x00000400 - -#define I2O_PARAM_RBS_OPERATION 0x0001 -struct i2o_param_rbs_operation { - u_int8_t autoreass; - u_int8_t reasstolerance; - u_int8_t numretries; - u_int8_t reserved0; - u_int32_t reasssize; - u_int32_t expectedtimeout; - u_int32_t rwvtimeout; - u_int32_t rwvtimeoutbase; - u_int32_t timeoutbase; - u_int32_t orderedreqdepth; - u_int32_t atomicwritesize; -} __packed; - -#define I2O_PARAM_RBS_CACHE_CONTROL 0x0003 -struct i2o_param_rbs_cache_control { - u_int32_t totalcachesize; - u_int32_t readcachesize; - u_int32_t writecachesize; - u_int8_t writepolicy; - u_int8_t readpolicy; - u_int8_t errorcorrection; - u_int8_t reserved; -} __packed; - -/* - * ================= SCSI peripheral class messages ================= - */ - -#define I2O_SCSI_DEVICE_RESET 0x27 -struct i2o_scsi_device_reset { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; -} __packed; - -#define I2O_SCSI_SCB_EXEC 0x81 -struct i2o_scsi_scb_exec { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t flags; /* CDB length and flags */ - u_int8_t cdb[16]; - u_int32_t datalen; -} __packed; - -#define I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE 0x00200000 -#define I2O_SCB_FLAG_SENSE_DATA_IN_BUFFER 0x00600000 -#define I2O_SCB_FLAG_SIMPLE_QUEUE_TAG 0x00800000 -#define I2O_SCB_FLAG_HEAD_QUEUE_TAG 0x01000000 -#define I2O_SCB_FLAG_ORDERED_QUEUE_TAG 0x01800000 -#define I2O_SCB_FLAG_ACA_QUEUE_TAG 0x02000000 -#define I2O_SCB_FLAG_ENABLE_DISCONNECT 0x20000000 -#define I2O_SCB_FLAG_XFER_FROM_DEVICE 0x40000000 -#define I2O_SCB_FLAG_XFER_TO_DEVICE 0x80000000 - -#define I2O_SCSI_SCB_ABORT 0x83 -struct i2o_scsi_scb_abort { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int32_t tctxabort; -} __packed; - -struct i2o_scsi_reply { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t msgtctx; - u_int8_t scsistatus; - u_int8_t hbastatus; - u_int8_t reserved; - u_int8_t reqstatus; - u_int32_t datalen; - u_int32_t senselen; - u_int8_t sense[40]; -} __packed; - -#define I2O_SCSI_DSC_SUCCESS 0x00 -#define I2O_SCSI_DSC_REQUEST_ABORTED 0x02 -#define I2O_SCSI_DSC_UNABLE_TO_ABORT 0x03 -#define I2O_SCSI_DSC_COMPLETE_WITH_ERROR 0x04 -#define I2O_SCSI_DSC_ADAPTER_BUSY 0x05 -#define I2O_SCSI_DSC_REQUEST_INVALID 0x06 -#define I2O_SCSI_DSC_PATH_INVALID 0x07 -#define I2O_SCSI_DSC_DEVICE_NOT_PRESENT 0x08 -#define I2O_SCSI_DSC_UNABLE_TO_TERMINATE 0x09 -#define I2O_SCSI_DSC_SELECTION_TIMEOUT 0x0a -#define I2O_SCSI_DSC_COMMAND_TIMEOUT 0x0b -#define I2O_SCSI_DSC_MR_MESSAGE_RECEIVED 0x0d -#define I2O_SCSI_DSC_SCSI_BUS_RESET 0x0e -#define I2O_SCSI_DSC_PARITY_ERROR_FAILURE 0x0f -#define I2O_SCSI_DSC_AUTOSENSE_FAILED 0x10 -#define I2O_SCSI_DSC_NO_ADAPTER 0x11 -#define I2O_SCSI_DSC_DATA_OVERRUN 0x12 -#define I2O_SCSI_DSC_UNEXPECTED_BUS_FREE 0x13 -#define I2O_SCSI_DSC_SEQUENCE_FAILURE 0x14 -#define I2O_SCSI_DSC_REQUEST_LENGTH_ERROR 0x15 -#define I2O_SCSI_DSC_PROVIDE_FAILURE 0x16 -#define I2O_SCSI_DSC_BDR_MESSAGE_SENT 0x17 -#define I2O_SCSI_DSC_REQUEST_TERMINATED 0x18 -#define I2O_SCSI_DSC_IDE_MESSAGE_SENT 0x33 -#define I2O_SCSI_DSC_RESOURCE_UNAVAILABLE 0x34 -#define I2O_SCSI_DSC_UNACKNOWLEDGED_EVENT 0x35 -#define I2O_SCSI_DSC_MESSAGE_RECEIVED 0x36 -#define I2O_SCSI_DSC_INVALID_CDB 0x37 -#define I2O_SCSI_DSC_LUN_INVALID 0x38 -#define I2O_SCSI_DSC_SCSI_TID_INVALID 0x39 -#define I2O_SCSI_DSC_FUNCTION_UNAVAILABLE 0x3a -#define I2O_SCSI_DSC_NO_NEXUS 0x3b -#define I2O_SCSI_DSC_SCSI_IID_INVALID 0x3c -#define I2O_SCSI_DSC_CDB_RECEIVED 0x3d -#define I2O_SCSI_DSC_LUN_ALREADY_ENABLED 0x3e -#define I2O_SCSI_DSC_BUS_BUSY 0x3f -#define I2O_SCSI_DSC_QUEUE_FROZEN 0x40 - -/* - * ================= SCSI peripheral class parameter groups ================= - */ - -#define I2O_PARAM_SCSI_DEVICE_INFO 0x0000 -struct i2o_param_scsi_device_info { - u_int8_t devicetype; - u_int8_t flags; - u_int16_t reserved0; - u_int32_t identifier; - u_int8_t luninfo[8]; - u_int32_t queuedepth; - u_int8_t reserved1; - u_int8_t negoffset; - u_int8_t negdatawidth; - u_int8_t reserved2; - u_int64_t negsyncrate; -} __packed; - -/* - * ================= LAN class messages ================= - */ - -#define I2O_LAN_PACKET_SEND 0x3b -struct i2o_lan_packet_send { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t tcw; - - /* SGL follows */ -}; - -#define I2O_LAN_TCW_ACCESS_PRI_MASK 0x00000007 -#define I2O_LAN_TCW_SUPPRESS_CRC 0x00000008 -#define I2O_LAN_TCW_SUPPRESS_LOOPBACK 0x00000010 -#define I2O_LAN_TCW_CKSUM_NETWORK 0x00000020 -#define I2O_LAN_TCW_CKSUM_TRANSPORT 0x00000040 -#define I2O_LAN_TCW_REPLY_BATCH 0x00000000 -#define I2O_LAN_TCW_REPLY_IMMEDIATELY 0x40000000 -#define I2O_LAN_TCW_REPLY_UNSUCCESSFUL 0x80000000 -#define I2O_LAN_TCW_REPLY_NONE 0xc0000000 - -#define I2O_LAN_SDU_SEND 0x3d -struct i2o_lan_sdu_send { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t tcw; /* As per PACKET_SEND. */ - - /* SGL follows */ -}; - -struct i2o_lan_send_reply { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t trl; - u_int16_t detail; - u_int8_t reserved; - u_int8_t reqstatus; - u_int32_t tctx[1]; -}; - -#define I2O_LAN_RECEIVE_POST 0x3e -struct i2o_lan_receive_post { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int32_t bktcnt; - - /* SGL follows */ -}; - -struct i2o_lan_pdb { - u_int32_t bctx; - u_int32_t pktoff; - u_int32_t pktlen; -}; - -#define I2O_LAN_FRAG_VALID 0x00 -#define I2O_LAN_FRAG_VALID_MASK foo - -struct i2o_lan_receive_reply { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int8_t trlcount; - u_int8_t trlesize; - u_int8_t reserved; - u_int8_t trlflags; - u_int32_t bucketsleft; - struct i2o_lan_pdb pdb[1]; -}; - -#define I2O_LAN_RESET 0x35 -struct i2o_lan_reset { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int16_t reserved; - u_int16_t resrcflags; -}; - -#define I2O_LAN_RESRC_RETURN_BUCKETS 0x0001 -#define I2O_LAN_RESRC_RETURN_XMITS 0x0002 - -#define I2O_LAN_SUSPEND 0x37 -struct i2o_lan_suspend { - u_int32_t msgflags; - u_int32_t msgfunc; - u_int32_t msgictx; - u_int16_t reserved; - u_int16_t resrcflags; /* As per RESET. */ -}; - -#define I2O_LAN_DSC_SUCCESS 0x00 -#define I2O_LAN_DSC_DEVICE_FAILURE 0x01 -#define I2O_LAN_DSC_DESTINATION_NOT_FOUND 0x02 -#define I2O_LAN_DSC_TRANSMIT_ERROR 0x03 -#define I2O_LAN_DSC_TRANSMIT_ABORTED 0x04 -#define I2O_LAN_DSC_RECEIVE_ERROR 0x05 -#define I2O_LAN_DSC_RECEIVE_ABORTED 0x06 -#define I2O_LAN_DSC_DMA_ERROR 0x07 -#define I2O_LAN_DSC_BAD_PACKET_DETECTED 0x08 -#define I2O_LAN_DSC_OUT_OF_MEMORY 0x09 -#define I2O_LAN_DSC_BUCKET_OVERRUN 0x0a -#define I2O_LAN_DSC_IOP_INTERNAL_ERROR 0x0b -#define I2O_LAN_DSC_CANCELED 0x0c -#define I2O_LAN_DSC_INVALID_TRANSACTION_CONTEXT 0x0d -#define I2O_LAN_DSC_DEST_ADDRESS_DETECTED 0x0e -#define I2O_LAN_DSC_DEST_ADDRESS_OMITTED 0x0f -#define I2O_LAN_DSC_PARTIAL_PACKET_RETURNED 0x10 -#define I2O_LAN_DSC_TEMP_SUSPENDED_STATE 0x11 - -/* - * ================= LAN class parameter groups ================= - */ - -#define I2O_PARAM_LAN_DEVICE_INFO 0x0000 -struct i2o_param_lan_device_info { - u_int16_t lantype; - u_int16_t flags; - u_int8_t addrfmt; - u_int8_t reserved1; - u_int16_t reserved2; - u_int32_t minpktsize; - u_int32_t maxpktsize; - u_int8_t hwaddr[8]; - u_int64_t maxtxbps; - u_int64_t maxrxbps; -}; - -#define I2O_LAN_TYPE_ETHERNET 0x0030 -#define I2O_LAN_TYPE_100BASEVG 0x0040 -#define I2O_LAN_TYPE_TOKEN_RING 0x0050 -#define I2O_LAN_TYPE_FDDI 0x0060 -#define I2O_LAN_TYPE_FIBRECHANNEL 0x0070 - -#define I2O_PARAM_LAN_MAC_ADDRESS 0x0001 -struct i2o_param_lan_mac_address { - u_int8_t activeaddr[8]; - u_int8_t localaddr[8]; - u_int8_t addrmask[8]; - u_int8_t filtermask[4]; - u_int8_t hwfiltermask[4]; - u_int32_t maxmcastaddr; - u_int32_t maxfilterperfect; - u_int32_t maxfilterimperfect; -}; - -#define I2O_PARAM_LAN_MCAST_MAC_ADDRESS 0x0002 -/* - * This one's a table, not a scalar. - */ - -#define I2O_PARAM_LAN_BATCH_CONTROL 0x0003 -struct i2o_param_lan_batch_control { - u_int32_t batchflags; - u_int32_t risingloaddly; - u_int32_t risingloadthresh; - u_int32_t fallingloaddly; - u_int32_t fallingloadthresh; - u_int32_t maxbatchcount; - u_int32_t maxbatchdelay; - u_int32_t transcompdelay; -}; - -#define I2O_PARAM_LAN_OPERATION 0x0004 -struct i2o_param_lan_operation { - u_int32_t pktprepad; - u_int32_t userflags; - u_int32_t pktorphanlimit; -}; - -#define I2O_PARAM_LAN_MEDIA_OPERATION 0x0005 -struct i2o_param_lan_media_operation { - u_int32_t connectortype; - u_int32_t connectiontype; - u_int32_t curtxbps; - u_int32_t currxbps; - u_int8_t fullduplex; - u_int8_t linkstatus; - u_int8_t badpkthandling; -}; - -#define I2O_LAN_CONNECTOR_OTHER 0x00 -#define I2O_LAN_CONNECTOR_UNKNOWN 0x01 -#define I2O_LAN_CONNECTOR_AUI 0x02 -#define I2O_LAN_CONNECTOR_UTP 0x03 -#define I2O_LAN_CONNECTOR_BNC 0x04 -#define I2O_LAN_CONNECTOR_RJ45 0x05 -#define I2O_LAN_CONNECTOR_STP_DB9 0x06 -#define I2O_LAN_CONNECTOR_FIBER_MIC 0x07 -#define I2O_LAN_CONNECTOR_APPLE_AUI 0x08 -#define I2O_LAN_CONNECTOR_MII 0x09 -#define I2O_LAN_CONNECTOR_COPPER_DB9 0x0a -#define I2O_LAN_CONNECTOR_COPPER_AW 0x0b -#define I2O_LAN_CONNECTOR_OPTICAL_LW 0x0c -#define I2O_LAN_CONNECTOR_SIP 0x0d -#define I2O_LAN_CONNECTOR_OPTICAL_SW 0x0e - -#define I2O_LAN_CONNECTION_UNKNOWN 0x0000 - -#define I2O_LAN_CONNECTION_ETHERNET_AUI 0x0301 -#define I2O_LAN_CONNECTION_ETHERNET_10BASE5 0x0302 -#define I2O_LAN_CONNECTION_ETHERNET_FOIRL 0x0303 -#define I2O_LAN_CONNECTION_ETHERNET_10BASE2 0x0304 -#define I2O_LAN_CONNECTION_ETHERNET_10BROAD36 0x0305 -#define I2O_LAN_CONNECTION_ETHERNET_10BASET 0x0306 -#define I2O_LAN_CONNECTION_ETHERNET_10BASEFP 0x0307 -#define I2O_LAN_CONNECTION_ETHERNET_10BASEFB 0x0308 -#define I2O_LAN_CONNECTION_ETHERNET_10BASEFL 0x0309 -#define I2O_LAN_CONNECTION_ETHERNET_100BASETX 0x030a -#define I2O_LAN_CONNECTION_ETHERNET_100BASEFX 0x030b -#define I2O_LAN_CONNECTION_ETHERNET_100BASET4 0x030c - -#define I2O_LAN_CONNECTION_100BASEVG_100BASEVG 0x0401 - -#define I2O_LAN_CONNECTION_TOKEN_RING_4MBIT 0x0501 -#define I2O_LAN_CONNECTION_TOKEN_RING_16MBIT 0x0502 - -#define I2O_LAN_CONNECTION_FDDI_125MBIT 0x0601 - -#define I2O_LAN_CONNECTION_FIBRECHANNEL_P2P 0x0701 -#define I2O_LAN_CONNECTION_FIBRECHANNEL_AL 0x0702 -#define I2O_LAN_CONNECTION_FIBRECHANNEL_PL 0x0703 -#define I2O_LAN_CONNECTION_FIBRECHANNEL_F 0x0704 - -#define I2O_LAN_CONNECTION_OTHER_EMULATED 0x0f00 -#define I2O_LAN_CONNECTION_OTHER_OTHER 0x0f01 - -#endif /* !defined _I2O_I2O_H_ */ diff --git a/sys/dev/i2o/iop.c b/sys/dev/i2o/iop.c deleted file mode 100644 index 1b00a6720a7..00000000000 --- a/sys/dev/i2o/iop.c +++ /dev/null @@ -1,2475 +0,0 @@ -/* $OpenBSD: iop.c,v 1.38 2013/05/30 16:15:02 deraadt Exp $ */ -/* $NetBSD: iop.c,v 1.12 2001/03/21 14:27:05 ad Exp $ */ - -/*- - * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Support for I2O IOPs (intelligent I/O processors). - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/device.h> -#include <sys/queue.h> -#include <sys/proc.h> -#include <sys/malloc.h> -#include <sys/ioctl.h> -#include <sys/endian.h> -#include <sys/conf.h> -#include <sys/kthread.h> - -#include <uvm/uvm_extern.h> - -#include <machine/bus.h> - -#include <dev/i2o/i2o.h> -#include <dev/i2o/iopio.h> -#include <dev/i2o/iopreg.h> -#include <dev/i2o/iopvar.h> - -#define POLL(ms, cond) \ -do { \ - int i; \ - for (i = (ms) * 10; i; i--) { \ - if (cond) \ - break; \ - DELAY(100); \ - } \ -} while (/* CONSTCOND */0); - -#ifdef I2ODEBUG -#define DPRINTF(x) printf x -#else -#define DPRINTF(x) -#endif - -#ifdef I2OVERBOSE -#define IFVERBOSE(x) x -#define COMMENT(x) NULL -#else -#define IFVERBOSE(x) -#define COMMENT(x) -#endif - -#define IOP_ICTXHASH_NBUCKETS 16 -#define IOP_ICTXHASH(ictx) (&iop_ictxhashtbl[(ictx) & iop_ictxhash]) - -#define IOP_MAX_SEGS (((IOP_MAX_XFER + PAGE_SIZE - 1) / PAGE_SIZE) + 1) - -#define IOP_TCTX_SHIFT 12 -#define IOP_TCTX_MASK ((1 << IOP_TCTX_SHIFT) - 1) - -LIST_HEAD(, iop_initiator) *iop_ictxhashtbl; -u_long iop_ictxhash; -void *iop_sdh; -struct i2o_systab *iop_systab; -int iop_systab_size; - -struct cfdriver iop_cd = { - NULL, "iop", DV_DULL -}; - -#define IC_CONFIGURE 0x01 -#define IC_PRIORITY 0x02 - -struct iop_class { - u_short ic_class; - u_short ic_flags; -#ifdef I2OVERBOSE - const char *ic_caption; -#endif -} static const iop_class[] = { - { - I2O_CLASS_EXECUTIVE, - 0, - COMMENT("executive") - }, - { - I2O_CLASS_DDM, - 0, - COMMENT("device driver module") - }, - { - I2O_CLASS_RANDOM_BLOCK_STORAGE, - IC_CONFIGURE | IC_PRIORITY, - IFVERBOSE("random block storage") - }, - { - I2O_CLASS_SEQUENTIAL_STORAGE, - IC_CONFIGURE | IC_PRIORITY, - IFVERBOSE("sequential storage") - }, - { - I2O_CLASS_LAN, - IC_CONFIGURE | IC_PRIORITY, - IFVERBOSE("LAN port") - }, - { - I2O_CLASS_WAN, - IC_CONFIGURE | IC_PRIORITY, - IFVERBOSE("WAN port") - }, - { - I2O_CLASS_FIBRE_CHANNEL_PORT, - IC_CONFIGURE, - IFVERBOSE("fibrechannel port") - }, - { - I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL, - 0, - COMMENT("fibrechannel peripheral") - }, - { - I2O_CLASS_SCSI_PERIPHERAL, - 0, - COMMENT("SCSI peripheral") - }, - { - I2O_CLASS_ATE_PORT, - IC_CONFIGURE, - IFVERBOSE("ATE port") - }, - { - I2O_CLASS_ATE_PERIPHERAL, - 0, - COMMENT("ATE peripheral") - }, - { - I2O_CLASS_FLOPPY_CONTROLLER, - IC_CONFIGURE, - IFVERBOSE("floppy controller") - }, - { - I2O_CLASS_FLOPPY_DEVICE, - 0, - COMMENT("floppy device") - }, - { - I2O_CLASS_BUS_ADAPTER_PORT, - IC_CONFIGURE, - IFVERBOSE("bus adapter port" ) - }, -}; - -#if defined(I2ODEBUG) && defined(I2OVERBOSE) -static const char * const iop_status[] = { - "success", - "abort (dirty)", - "abort (no data transfer)", - "abort (partial transfer)", - "error (dirty)", - "error (no data transfer)", - "error (partial transfer)", - "undefined error code", - "process abort (dirty)", - "process abort (no data transfer)", - "process abort (partial transfer)", - "transaction error", -}; -#endif - -static inline u_int32_t iop_inl(struct iop_softc *, int); -static inline void iop_outl(struct iop_softc *, int, u_int32_t); - -void iop_config_interrupts(struct device *); -void iop_configure_devices(struct iop_softc *, int, int); -void iop_devinfo(int, char *, size_t); -int iop_print(void *, const char *); -int iop_reconfigure(struct iop_softc *, u_int); -int iop_submatch(struct device *, void *, void *); -#ifdef notyet -int iop_vendor_print(void *, const char *); -#endif - -void iop_adjqparam(struct iop_softc *, int); -void iop_create_reconf_thread(void *); -int iop_handle_reply(struct iop_softc *, u_int32_t); -int iop_hrt_get(struct iop_softc *); -int iop_hrt_get0(struct iop_softc *, struct i2o_hrt *, size_t); -void iop_intr_event(struct device *, struct iop_msg *, void *); -int iop_lct_get0(struct iop_softc *, struct i2o_lct *, size_t, u_int32_t); -void iop_msg_poll(struct iop_softc *, struct iop_msg *, int); -void iop_msg_wait(struct iop_softc *, struct iop_msg *, int); -int iop_ofifo_init(struct iop_softc *); -int iop_passthrough(struct iop_softc *, struct ioppt *); -int iop_post(struct iop_softc *, u_int32_t *); -void iop_reconf_thread(void *); -void iop_release_mfa(struct iop_softc *, u_int32_t); -int iop_reset(struct iop_softc *); -int iop_status_get(struct iop_softc *, int); -int iop_systab_set(struct iop_softc *); -void iop_tfn_print(struct iop_softc *, struct i2o_fault_notify *); - -#ifdef I2ODEBUG -void iop_reply_print(struct iop_softc *, struct i2o_reply *); -#endif - -cdev_decl(iop); - -static inline u_int32_t -iop_inl(struct iop_softc *sc, int off) -{ - - bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4, - BUS_SPACE_BARRIER_WRITE | BUS_SPACE_BARRIER_READ); - return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, off)); -} - -static inline void -iop_outl(struct iop_softc *sc, int off, u_int32_t val) -{ - - bus_space_write_4(sc->sc_iot, sc->sc_ioh, off, val); - bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4, - BUS_SPACE_BARRIER_WRITE); -} - -/* - * Initialise the IOP and our interface. - */ -void -iop_init(struct iop_softc *sc, const char *intrstr) -{ - struct iop_msg *im; - u_int32_t mask; - char ident[64]; - int rv, i, nsegs; - int state = 0; - - if (iop_ictxhashtbl == NULL) { - iop_ictxhashtbl = hashinit(IOP_ICTXHASH_NBUCKETS, M_DEVBUF, - M_NOWAIT, &iop_ictxhash); - if (iop_ictxhashtbl == NULL) { - printf(": cannot allocate hashtable\n"); - return; - } - } - - /* Reset the IOP and request status. */ - - /* Allocate a scratch DMA map for small miscellaneous shared data. */ - if (bus_dmamap_create(sc->sc_dmat, PAGE_SIZE, 1, PAGE_SIZE, 0, - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->sc_scr_dmamap) != 0) { - printf(": cannot create scratch dmamap\n"); - return; - } - state++; - - if (bus_dmamem_alloc(sc->sc_dmat, PAGE_SIZE, PAGE_SIZE, 0, - sc->sc_scr_seg, 1, &nsegs, BUS_DMA_NOWAIT) != 0) { - printf(": cannot alloc scratch dmamem\n"); - goto bail_out; - } - state++; - - if (bus_dmamem_map(sc->sc_dmat, sc->sc_scr_seg, nsegs, PAGE_SIZE, - &sc->sc_scr, 0)) { - printf(": cannot map scratch dmamem\n"); - goto bail_out; - } - state++; - - if (bus_dmamap_load(sc->sc_dmat, sc->sc_scr_dmamap, sc->sc_scr, - PAGE_SIZE, NULL, BUS_DMA_NOWAIT)) { - printf(": cannot load scratch dmamap\n"); - goto bail_out; - } - state++; - - if ((rv = iop_reset(sc)) != 0) { - printf(": not responding (reset)\n"); - goto bail_out; - } - if ((rv = iop_status_get(sc, 1)) != 0) { - printf(": not responding (get status)\n"); - goto bail_out; - } - sc->sc_flags |= IOP_HAVESTATUS; - iop_strvis(sc, sc->sc_status.productid, - sizeof(sc->sc_status.productid), ident, sizeof(ident)); - printf(": <%s>", ident); - if (intrstr != NULL) - printf(", %s", intrstr); - printf("\n"); - -#ifdef I2ODEBUG - printf("%s: orgid=0x%04x version=%d\n", sc->sc_dv.dv_xname, - letoh16(sc->sc_status.orgid), - (letoh32(sc->sc_status.segnumber) >> 12) & 15); - printf("%s: type want have cbase\n", sc->sc_dv.dv_xname); - printf("%s: mem %04x %04x %08x\n", sc->sc_dv.dv_xname, - letoh32(sc->sc_status.desiredprivmemsize), - letoh32(sc->sc_status.currentprivmemsize), - letoh32(sc->sc_status.currentprivmembase)); - printf("%s: i/o %04x %04x %08x\n", sc->sc_dv.dv_xname, - letoh32(sc->sc_status.desiredpriviosize), - letoh32(sc->sc_status.currentpriviosize), - letoh32(sc->sc_status.currentpriviobase)); -#endif - - sc->sc_maxob = letoh32(sc->sc_status.maxoutboundmframes); - if (sc->sc_maxob > IOP_MAX_OUTBOUND) - sc->sc_maxob = IOP_MAX_OUTBOUND; - sc->sc_maxib = letoh32(sc->sc_status.maxinboundmframes); - if (sc->sc_maxib > IOP_MAX_INBOUND) - sc->sc_maxib = IOP_MAX_INBOUND; - - /* Allocate message wrappers. */ - im = malloc(sizeof(*im) * sc->sc_maxib, M_DEVBUF, M_NOWAIT | M_ZERO); - if (!im) { - printf("%s: couldn't allocate message", sc->sc_dv.dv_xname); - goto bail_out; - } - state++; - - sc->sc_ims = im; - SLIST_INIT(&sc->sc_im_freelist); - - for (i = 0; i < sc->sc_maxib; i++, im++) { - rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER, - IOP_MAX_SEGS, IOP_MAX_XFER, 0, - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, - &im->im_xfer[0].ix_map); - if (rv != 0) { - printf("%s: couldn't create dmamap (%d)", - sc->sc_dv.dv_xname, rv); - goto bail_out; - } - - im->im_tctx = i; - SLIST_INSERT_HEAD(&sc->sc_im_freelist, im, im_chain); - } - - /* Initialize the IOP's outbound FIFO. */ - if (iop_ofifo_init(sc) != 0) { - printf("%s: unable to init outbound FIFO\n", - sc->sc_dv.dv_xname); - goto bail_out; - } - - /* Ensure interrupts are enabled at the IOP. */ - mask = iop_inl(sc, IOP_REG_INTR_MASK); - iop_outl(sc, IOP_REG_INTR_MASK, mask & ~IOP_INTR_OFIFO); - -#ifdef I2ODEBUG - printf("%s: queue depths: inbound %d/%d, outbound %d/%d\n", - sc->sc_dv.dv_xname, sc->sc_maxib, - letoh32(sc->sc_status.maxinboundmframes), - sc->sc_maxob, letoh32(sc->sc_status.maxoutboundmframes)); -#endif - - rw_init(&sc->sc_conflock, "iopconf"); - - startuphook_establish((void (*)(void *))iop_config_interrupts, sc); - return; - - bail_out: - if (state > 4) - free(im, M_DEVBUF); - if (state > 3) - bus_dmamap_unload(sc->sc_dmat, sc->sc_scr_dmamap); - if (state > 2) - bus_dmamem_unmap(sc->sc_dmat, sc->sc_scr, PAGE_SIZE); - if (state > 1) - bus_dmamem_free(sc->sc_dmat, sc->sc_scr_seg, nsegs); - if (state > 0) - bus_dmamap_destroy(sc->sc_dmat, sc->sc_scr_dmamap); -} - -/* - * Perform autoconfiguration tasks. - */ -void -iop_config_interrupts(struct device *self) -{ - struct iop_softc *sc, *iop; - struct i2o_systab_entry *ste; - int rv, i, niop; - - sc = (struct iop_softc *)self; - LIST_INIT(&sc->sc_iilist); - - printf("%s: configuring...\n", sc->sc_dv.dv_xname); - - if (iop_hrt_get(sc) != 0) { - printf("%s: unable to retrieve HRT\n", sc->sc_dv.dv_xname); - return; - } - - /* - * Build the system table. - */ - if (iop_systab == NULL) { - for (i = 0, niop = 0; i < iop_cd.cd_ndevs; i++) { - iop = (struct iop_softc *)device_lookup(&iop_cd, i); - if (iop == NULL) - continue; - if ((iop->sc_flags & IOP_HAVESTATUS) == 0) - continue; - if (iop_status_get(iop, 1) != 0) { - printf("%s: unable to retrieve status\n", - sc->sc_dv.dv_xname); - iop->sc_flags &= ~IOP_HAVESTATUS; - continue; - } - niop++; - } - if (niop == 0) - return; - - i = sizeof(struct i2o_systab_entry) * (niop - 1) + - sizeof(struct i2o_systab); - iop_systab_size = i; - iop_systab = malloc(i, M_DEVBUF, M_NOWAIT | M_ZERO); - if (!iop_systab) - return; - - iop_systab->numentries = niop; - iop_systab->version = I2O_VERSION_11; - - for (i = 0, ste = iop_systab->entry; i < iop_cd.cd_ndevs; i++) - { - iop = (struct iop_softc *)device_lookup(&iop_cd, i); - if (iop == NULL) - continue; - if ((iop->sc_flags & IOP_HAVESTATUS) == 0) - continue; - - ste->orgid = iop->sc_status.orgid; - ste->iopid = iop->sc_dv.dv_unit + 2; - ste->segnumber = - htole32(letoh32(iop->sc_status.segnumber) & ~4095); - ste->iopcaps = iop->sc_status.iopcaps; - ste->inboundmsgframesize = - iop->sc_status.inboundmframesize; - ste->inboundmsgportaddresslow = - htole32(iop->sc_memaddr + IOP_REG_IFIFO); - ste++; - } - } - - /* - * Post the system table to the IOP and bring it to the OPERATIONAL - * state. - */ - if (iop_systab_set(sc) != 0) { - printf("%s: unable to set system table\n", sc->sc_dv.dv_xname); - return; - } - if (iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_SYS_ENABLE, IOP_ICTX, 1, - 30000) != 0) { - printf("%s: unable to enable system\n", sc->sc_dv.dv_xname); - return; - } - - /* - * Set up an event handler for this IOP. - */ - sc->sc_eventii.ii_dv = self; - sc->sc_eventii.ii_intr = iop_intr_event; - sc->sc_eventii.ii_flags = II_DISCARD | II_UTILITY; - sc->sc_eventii.ii_tid = I2O_TID_IOP; - iop_initiator_register(sc, &sc->sc_eventii); - - rv = iop_util_eventreg(sc, &sc->sc_eventii, - I2O_EVENT_EXEC_RESOURCE_LIMITS | - I2O_EVENT_EXEC_CONNECTION_FAIL | - I2O_EVENT_EXEC_ADAPTER_FAULT | - I2O_EVENT_EXEC_POWER_FAIL | - I2O_EVENT_EXEC_RESET_PENDING | - I2O_EVENT_EXEC_RESET_IMMINENT | - I2O_EVENT_EXEC_HARDWARE_FAIL | - I2O_EVENT_EXEC_XCT_CHANGE | - I2O_EVENT_EXEC_DDM_AVAILIBILITY | - I2O_EVENT_GEN_DEVICE_RESET | - I2O_EVENT_GEN_STATE_CHANGE | - I2O_EVENT_GEN_GENERAL_WARNING); - if (rv != 0) { - printf("%s: unable to register for events", - sc->sc_dv.dv_xname); - return; - } - -#ifdef notyet - /* Attempt to match and attach a product-specific extension. */ - ia.ia_class = I2O_CLASS_ANY; - ia.ia_tid = I2O_TID_IOP; - config_found_sm(self, &ia, iop_vendor_print, iop_submatch); -#endif - - rw_enter_write(&sc->sc_conflock); - rv = iop_reconfigure(sc, 0); - rw_exit_write(&sc->sc_conflock); - if (rv == -1) { - printf("%s: configure failed (%d)\n", sc->sc_dv.dv_xname, rv); - return; - } - kthread_create_deferred(iop_create_reconf_thread, sc); -} - -/* - * Create the reconfiguration thread. Called after the standard kernel - * threads have been created. - */ -void -iop_create_reconf_thread(void *cookie) -{ - struct iop_softc *sc; - int rv; - - sc = cookie; - sc->sc_flags |= IOP_ONLINE; - - rv = kthread_create(iop_reconf_thread, sc, &sc->sc_reconf_proc, - "%s", sc->sc_dv.dv_xname); - if (rv != 0) { - printf("%s: unable to create reconfiguration thread (%d)", - sc->sc_dv.dv_xname, rv); - return; - } -} - -/* - * Reconfiguration thread; listens for LCT change notification, and - * initiates re-configuration if received. - */ -void -iop_reconf_thread(void *cookie) -{ - struct iop_softc *sc = cookie; - struct i2o_lct lct; - u_int32_t chgind; - int rv; - - chgind = sc->sc_chgind + 1; - - for (;;) { - DPRINTF(("%s: async reconfig: requested 0x%08x\n", - sc->sc_dv.dv_xname, chgind)); - - rv = iop_lct_get0(sc, &lct, sizeof(lct), chgind); - - DPRINTF(("%s: async reconfig: notified (0x%08x, %d)\n", - sc->sc_dv.dv_xname, letoh32(lct.changeindicator), rv)); - - if (rv == 0) { - rw_enter_write(&sc->sc_conflock); - iop_reconfigure(sc, letoh32(lct.changeindicator)); - chgind = sc->sc_chgind + 1; - rw_exit_write(&sc->sc_conflock); - } - - tsleep(iop_reconf_thread, PWAIT, "iopzzz", hz * 5); - } -} - -/* - * Reconfigure: find new and removed devices. - */ -int -iop_reconfigure(struct iop_softc *sc, u_int chgind) -{ - struct iop_msg *im; - struct i2o_hba_bus_scan mf; - struct i2o_lct_entry *le; - struct iop_initiator *ii, *nextii; - int rv, tid, i; - - /* - * If the reconfiguration request isn't the result of LCT change - * notification, then be more thorough: ask all bus ports to scan - * their busses. Wait up to 5 minutes for each bus port to complete - * the request. - */ - if (chgind == 0) { - if ((rv = iop_lct_get(sc)) != 0) { - DPRINTF(("iop_reconfigure: unable to read LCT\n")); - return (rv); - } - - le = sc->sc_lct->entry; - for (i = 0; i < sc->sc_nlctent; i++, le++) { - if ((letoh16(le->classid) & I2O_CLASS_MASK) != - I2O_CLASS_BUS_ADAPTER_PORT) - continue; - tid = letoh16(le->localtid) & I2O_CLASS_MASK; - - im = iop_msg_alloc(sc, NULL, IM_WAIT); - - mf.msgflags = I2O_MSGFLAGS(i2o_hba_bus_scan); - mf.msgfunc = I2O_MSGFUNC(tid, I2O_HBA_BUS_SCAN); - mf.msgictx = IOP_ICTX; - mf.msgtctx = im->im_tctx; - - DPRINTF(("%s: scanning bus %d\n", sc->sc_dv.dv_xname, - tid)); - - rv = iop_msg_post(sc, im, &mf, 5*60*1000); - iop_msg_free(sc, im); -#ifdef I2ODEBUG - if (rv != 0) - printf("%s: bus scan failed, status =%d\n", - sc->sc_dv.dv_xname, rv); -#endif - } - } else if (chgind <= sc->sc_chgind) { - DPRINTF(("%s: LCT unchanged (async)\n", sc->sc_dv.dv_xname)); - return (0); - } - - /* Re-read the LCT and determine if it has changed. */ - if ((rv = iop_lct_get(sc)) != 0) { - DPRINTF(("iop_reconfigure: unable to re-read LCT\n")); - return (rv); - } - DPRINTF(("%s: %d LCT entries\n", sc->sc_dv.dv_xname, sc->sc_nlctent)); - - chgind = letoh32(sc->sc_lct->changeindicator); - if (chgind == sc->sc_chgind) { - DPRINTF(("%s: LCT unchanged\n", sc->sc_dv.dv_xname)); - return (0); - } - DPRINTF(("%s: LCT changed\n", sc->sc_dv.dv_xname)); - sc->sc_chgind = chgind; - - if (sc->sc_tidmap != NULL) - free(sc->sc_tidmap, M_DEVBUF); - sc->sc_tidmap = malloc(sc->sc_nlctent * sizeof(struct iop_tidmap), - M_DEVBUF, M_NOWAIT | M_ZERO); - if (!sc->sc_tidmap) { - DPRINTF(("iop_reconfigure: out of memory\n")); - return (ENOMEM); - } - - /* Allow 1 queued command per device while we're configuring. */ - iop_adjqparam(sc, 1); - - /* - * Match and attach child devices. We configure high-level devices - * first so that any claims will propagate throughout the LCT, - * hopefully masking off aliased devices as a result. - * - * Re-reading the LCT at this point is a little dangerous, but we'll - * trust the IOP (and the operator) to behave itself... - */ - iop_configure_devices(sc, IC_CONFIGURE | IC_PRIORITY, - IC_CONFIGURE | IC_PRIORITY); - if ((rv = iop_lct_get(sc)) != 0) - DPRINTF(("iop_reconfigure: unable to re-read LCT\n")); - iop_configure_devices(sc, IC_CONFIGURE | IC_PRIORITY, - IC_CONFIGURE); - - for (ii = LIST_FIRST(&sc->sc_iilist); ii != NULL; ii = nextii) { - nextii = LIST_NEXT(ii, ii_list); - - /* Detach devices that were configured, but are now gone. */ - for (i = 0; i < sc->sc_nlctent; i++) - if (ii->ii_tid == sc->sc_tidmap[i].it_tid) - break; - if (i == sc->sc_nlctent || - (sc->sc_tidmap[i].it_flags & IT_CONFIGURED) == 0) - config_detach(ii->ii_dv, DETACH_FORCE); - - /* - * Tell initiators that existed before the re-configuration - * to re-configure. - */ - if (ii->ii_reconfig == NULL) - continue; - if ((rv = (*ii->ii_reconfig)(ii->ii_dv)) != 0) - printf("%s: %s failed reconfigure (%d)\n", - sc->sc_dv.dv_xname, ii->ii_dv->dv_xname, rv); - } - - /* Re-adjust queue parameters and return. */ - if (sc->sc_nii != 0) - iop_adjqparam(sc, (sc->sc_maxib - sc->sc_nuii - IOP_MF_RESERVE) - / sc->sc_nii); - - return (0); -} - -/* - * Configure I2O devices into the system. - */ -void -iop_configure_devices(struct iop_softc *sc, int mask, int maskval) -{ - struct iop_attach_args ia; - struct iop_initiator *ii; - const struct i2o_lct_entry *le; - struct device *dv; - int i, j, nent; - u_int usertid; - - nent = sc->sc_nlctent; - for (i = 0, le = sc->sc_lct->entry; i < nent; i++, le++) { - sc->sc_tidmap[i].it_tid = - letoh16(le->localtid) & I2O_LCT_ENTRY_TID_MASK; - - /* Ignore the device if it's in use. */ - usertid = letoh32(le->usertid) & I2O_LCT_ENTRY_TID_MASK; - if (usertid != I2O_TID_NONE && usertid != I2O_TID_HOST) - continue; - - ia.ia_class = letoh16(le->classid) & I2O_CLASS_MASK; - ia.ia_tid = sc->sc_tidmap[i].it_tid; - - /* Ignore uninteresting devices. */ - for (j = 0; j < sizeof(iop_class) / sizeof(iop_class[0]); j++) - if (iop_class[j].ic_class == ia.ia_class) - break; - if (j < sizeof(iop_class) / sizeof(iop_class[0]) && - (iop_class[j].ic_flags & mask) != maskval) - continue; - - /* - * Try to configure the device only if it's not already - * configured. - */ - LIST_FOREACH(ii, &sc->sc_iilist, ii_list) { - if (ia.ia_tid == ii->ii_tid) { - sc->sc_tidmap[i].it_flags |= IT_CONFIGURED; - strlcpy(sc->sc_tidmap[i].it_dvname, - ii->ii_dv->dv_xname, - sizeof sc->sc_tidmap[i].it_dvname); - break; - } - } - if (ii != NULL) - continue; - dv = config_found_sm(&sc->sc_dv, &ia, iop_print, iop_submatch); - if (dv != NULL) { - sc->sc_tidmap[i].it_flags |= IT_CONFIGURED; - strlcpy(sc->sc_tidmap[i].it_dvname, dv->dv_xname, - sizeof sc->sc_tidmap[i].it_dvname); - } - } -} - -/* - * Adjust queue parameters for all child devices. - */ -void -iop_adjqparam(struct iop_softc *sc, int mpi) -{ - struct iop_initiator *ii; - - LIST_FOREACH(ii, &sc->sc_iilist, ii_list) - if (ii->ii_adjqparam != NULL) - (*ii->ii_adjqparam)(ii->ii_dv, mpi); -} - -void -iop_devinfo(int class, char *devinfo, size_t di_len) -{ -#ifdef I2OVERBOSE - int i; - - for (i = 0; i < sizeof(iop_class) / sizeof(iop_class[0]); i++) - if (class == iop_class[i].ic_class) - break; - - if (i == sizeof(iop_class) / sizeof(iop_class[0])) - snprintf(devinfo, di_len, "device (class 0x%x)", class); - else - strlcpy(devinfo, iop_class[i].ic_caption, di_len); -#else - - snprintf(devinfo, di_len, "device (class 0x%x)", class); -#endif -} - -int -iop_print(void *aux, const char *pnp) -{ - struct iop_attach_args *ia; - char devinfo[256]; - - ia = aux; - - if (pnp != NULL) { - iop_devinfo(ia->ia_class, devinfo, sizeof devinfo); - printf("%s at %s", devinfo, pnp); - } - printf(" tid %d", ia->ia_tid); - return (UNCONF); -} - -#ifdef notyet -int -iop_vendor_print(void *aux, const char *pnp) -{ - - if (pnp != NULL) - printf("vendor specific extension at %s", pnp); - return (UNCONF); -} -#endif - -int -iop_submatch(struct device *parent, void *vcf, void *aux) -{ - struct cfdata *cf = vcf; - struct iop_attach_args *ia; - - ia = aux; - - if (cf->iopcf_tid != IOPCF_TID_DEFAULT && cf->iopcf_tid != ia->ia_tid) - return (0); - - return ((*cf->cf_attach->ca_match)(parent, cf, aux)); -} - -/* - * Shut down all configured IOPs. - */ -void -iop_shutdown(void *v) -{ - struct iop_softc *sc = v; - - if ((sc->sc_flags & IOP_ONLINE) == 0) - return; - - iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_SYS_QUIESCE, IOP_ICTX, - 0, 5000); - - if (letoh16(sc->sc_status.orgid) != I2O_ORG_AMI) { - /* - * Some AMI firmware revisions will go to sleep and - * never come back after this. - */ - iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_IOP_CLEAR, - IOP_ICTX, 0, 1000); - } - - /* Wait. Some boards could still be flushing, stupidly enough. */ - delay(5000*1000); -} - -/* - * Retrieve IOP status. - */ -int -iop_status_get(struct iop_softc *sc, int nosleep) -{ - struct i2o_exec_status_get mf; - paddr_t pa = sc->sc_scr_seg->ds_addr; - struct i2o_status *st = (struct i2o_status *)sc->sc_scr; - int rv; - - mf.msgflags = I2O_MSGFLAGS(i2o_exec_status_get); - mf.msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_STATUS_GET); - mf.reserved[0] = 0; - mf.reserved[1] = 0; - mf.reserved[2] = 0; - mf.reserved[3] = 0; - mf.addrlow = pa & ~(u_int32_t)0; - mf.addrhigh = sizeof pa > sizeof mf.addrlow ? pa >> 32 : 0; - mf.length = sizeof(*st); - - bzero(st, sizeof(*st)); - bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*st), - BUS_DMASYNC_PREREAD); - - if ((rv = iop_post(sc, (u_int32_t *)&mf))) - return (rv); - - /* XXX */ - POLL(2500, - (bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, - sizeof(*st), BUS_DMASYNC_POSTREAD), st->syncbyte == 0xff)); - - if (st->syncbyte != 0xff) - return (EIO); - - bcopy(st, &sc->sc_status, sizeof(sc->sc_status)); - return (0); -} - -/* - * Initialize and populate the IOP's outbound FIFO. - */ -int -iop_ofifo_init(struct iop_softc *sc) -{ - bus_addr_t addr; - bus_dma_segment_t seg; - struct i2o_exec_outbound_init *mf; - u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)]; - u_int32_t *sw = (u_int32_t *)sc->sc_scr; - int i, rseg, rv; - - mf = (struct i2o_exec_outbound_init *)mb; - mf->msgflags = I2O_MSGFLAGS(i2o_exec_outbound_init); - mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_OUTBOUND_INIT); - mf->msgictx = IOP_ICTX; - mf->msgtctx = 0; - mf->pagesize = PAGE_SIZE; - mf->flags = IOP_INIT_CODE | ((IOP_MAX_MSG_SIZE >> 2) << 16); - mb[sizeof(*mf) / sizeof(u_int32_t) + 0] = sizeof(*sw) | - I2O_SGL_SIMPLE | I2O_SGL_END_BUFFER | I2O_SGL_END; - mb[sizeof(*mf) / sizeof(u_int32_t) + 1] = sc->sc_scr_seg->ds_addr; - mb[0] += 2 << 16; - - *sw = 0; - bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), - BUS_DMASYNC_PREREAD); - - /* - * The I2O spec says that there are two SGLs: one for the status - * word, and one for a list of discarded MFAs. It continues to say - * that if you don't want to get the list of MFAs, an IGNORE SGL is - * necessary; this isn't the case (and is in fact a bad thing). - */ - if ((rv = iop_post(sc, mb))) - return (rv); - - /* XXX */ - POLL(5000, - (bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), - BUS_DMASYNC_POSTREAD), - *sw == htole32(I2O_EXEC_OUTBOUND_INIT_COMPLETE))); - if (*sw != htole32(I2O_EXEC_OUTBOUND_INIT_COMPLETE)) { - printf("%s: outbound FIFO init failed (%d)\n", - sc->sc_dv.dv_xname, letoh32(*sw)); - return (EIO); - } - - /* Allocate DMA safe memory for the reply frames. */ - if (sc->sc_rep_phys == 0) { - sc->sc_rep_size = sc->sc_maxob * IOP_MAX_MSG_SIZE; - - rv = bus_dmamem_alloc(sc->sc_dmat, sc->sc_rep_size, PAGE_SIZE, - 0, &seg, 1, &rseg, BUS_DMA_NOWAIT); - if (rv != 0) { - printf("%s: dma alloc = %d\n", sc->sc_dv.dv_xname, - rv); - return (rv); - } - - rv = bus_dmamem_map(sc->sc_dmat, &seg, rseg, sc->sc_rep_size, - &sc->sc_rep, BUS_DMA_NOWAIT | BUS_DMA_COHERENT); - if (rv != 0) { - printf("%s: dma map = %d\n", sc->sc_dv.dv_xname, rv); - return (rv); - } - - rv = bus_dmamap_create(sc->sc_dmat, sc->sc_rep_size, 1, - sc->sc_rep_size, 0, BUS_DMA_NOWAIT, &sc->sc_rep_dmamap); - if (rv != 0) { - printf("%s: dma create = %d\n", sc->sc_dv.dv_xname, - rv); - return (rv); - } - - rv = bus_dmamap_load(sc->sc_dmat, sc->sc_rep_dmamap, - sc->sc_rep, sc->sc_rep_size, NULL, BUS_DMA_NOWAIT); - if (rv != 0) { - printf("%s: dma load = %d\n", sc->sc_dv.dv_xname, rv); - return (rv); - } - - sc->sc_rep_phys = sc->sc_rep_dmamap->dm_segs[0].ds_addr; - } - - /* Populate the outbound FIFO. */ - for (i = sc->sc_maxob, addr = sc->sc_rep_phys; i != 0; i--) { - iop_outl(sc, IOP_REG_OFIFO, (u_int32_t)addr); - addr += IOP_MAX_MSG_SIZE; - } - - return (0); -} - -/* - * Read the specified number of bytes from the IOP's hardware resource table. - */ -int -iop_hrt_get0(struct iop_softc *sc, struct i2o_hrt *hrt, size_t size) -{ - struct iop_msg *im; - struct i2o_exec_hrt_get *mf; - u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)]; - int rv; - - im = iop_msg_alloc(sc, NULL, IM_WAIT); - mf = (struct i2o_exec_hrt_get *)mb; - mf->msgflags = I2O_MSGFLAGS(i2o_exec_hrt_get); - mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_HRT_GET); - mf->msgictx = IOP_ICTX; - mf->msgtctx = im->im_tctx; - - iop_msg_map(sc, im, mb, hrt, size, 0); - rv = iop_msg_post(sc, im, mb, 30000); - iop_msg_unmap(sc, im); - iop_msg_free(sc, im); - return (rv); -} - -/* - * Read the IOP's hardware resource table. - */ -int -iop_hrt_get(struct iop_softc *sc) -{ - struct i2o_hrt hrthdr, *hrt; - size_t size; - int rv; - - rv = iop_hrt_get0(sc, &hrthdr, sizeof(hrthdr)); - if (rv != 0) - return (rv); - - DPRINTF(("%s: %d hrt entries\n", sc->sc_dv.dv_xname, - letoh16(hrthdr.numentries))); - - size = sizeof(struct i2o_hrt) + - (letoh16(hrthdr.numentries) - 1) * sizeof(struct i2o_hrt_entry); - hrt = (struct i2o_hrt *)malloc(size, M_DEVBUF, M_NOWAIT); - if (!hrt) - return (ENOMEM); - - if ((rv = iop_hrt_get0(sc, hrt, size)) != 0) { - free(hrt, M_DEVBUF); - return (rv); - } - - if (sc->sc_hrt != NULL) - free(sc->sc_hrt, M_DEVBUF); - sc->sc_hrt = hrt; - return (0); -} - -/* - * Request the specified number of bytes from the IOP's logical - * configuration table. If a change indicator is specified, this - * is a verbatim notification request, so the caller is prepared - * to wait indefinitely. - */ -int -iop_lct_get0(struct iop_softc *sc, struct i2o_lct *lct, size_t size, - u_int32_t chgind) -{ - struct iop_msg *im; - struct i2o_exec_lct_notify *mf; - int rv; - u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)]; - - im = iop_msg_alloc(sc, NULL, IM_WAIT); - memset(lct, 0, size); - - mf = (struct i2o_exec_lct_notify *)mb; - mf->msgflags = I2O_MSGFLAGS(i2o_exec_lct_notify); - mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_LCT_NOTIFY); - mf->msgictx = IOP_ICTX; - mf->msgtctx = im->im_tctx; - mf->classid = I2O_CLASS_ANY; - mf->changeindicator = chgind; - -#ifdef I2ODEBUG - printf("iop_lct_get0: reading LCT"); - if (chgind != 0) - printf(" (async)"); - printf("\n"); -#endif - - iop_msg_map(sc, im, mb, lct, size, 0); - rv = iop_msg_post(sc, im, mb, (chgind == 0 ? 120*1000 : 0)); - iop_msg_unmap(sc, im); - iop_msg_free(sc, im); - return (rv); -} - -/* - * Read the IOP's logical configuration table. - */ -int -iop_lct_get(struct iop_softc *sc) -{ - size_t esize, size; - int rv; - struct i2o_lct *lct; - - esize = letoh32(sc->sc_status.expectedlctsize); - lct = malloc(esize, M_DEVBUF, M_WAITOK | M_CANFAIL); - if (lct == NULL) - return (ENOMEM); - - if ((rv = iop_lct_get0(sc, lct, esize, 0)) != 0) { - free(lct, M_DEVBUF); - return (rv); - } - - size = letoh16(lct->tablesize) << 2; - if (esize != size) { - free(lct, M_DEVBUF); - lct = malloc(size, M_DEVBUF, M_WAITOK | M_CANFAIL); - if (lct == NULL) - return (ENOMEM); - - if ((rv = iop_lct_get0(sc, lct, size, 0)) != 0) { - free(lct, M_DEVBUF); - return (rv); - } - } - - /* Swap in the new LCT. */ - if (sc->sc_lct != NULL) - free(sc->sc_lct, M_DEVBUF); - sc->sc_lct = lct; - sc->sc_nlctent = ((letoh16(sc->sc_lct->tablesize) << 2) - - sizeof(struct i2o_lct) + sizeof(struct i2o_lct_entry)) / - sizeof(struct i2o_lct_entry); - return (0); -} - -/* - * Request the specified parameter group from the target. If an initiator - * is specified (a) don't wait for the operation to complete, but instead - * let the initiator's interrupt handler deal with the reply and (b) place a - * pointer to the parameter group op in the wrapper's `im_dvcontext' field. - */ -int -iop_param_op(struct iop_softc *sc, int tid, struct iop_initiator *ii, - int write, int group, void *buf, size_t size) -{ - struct iop_msg *im; - struct i2o_util_params_op *mf; - struct i2o_reply *rf; - int rv, func, op; - struct iop_pgop *pgop; - u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)]; - - im = iop_msg_alloc(sc, ii, (ii == NULL ? IM_WAIT : 0) | IM_NOSTATUS); - pgop = malloc(sizeof(*pgop), M_DEVBUF, M_WAITOK | M_CANFAIL); - if (pgop == NULL) { - iop_msg_free(sc, im); - return (ENOMEM); - } - rf = malloc(sizeof(*rf), M_DEVBUF, M_WAITOK | M_CANFAIL); - if (rf == NULL) { - iop_msg_free(sc, im); - free(pgop, M_DEVBUF); - return (ENOMEM); - } - im->im_dvcontext = pgop; - im->im_rb = rf; - - if (write) { - func = I2O_UTIL_PARAMS_SET; - op = I2O_PARAMS_OP_FIELD_SET; - } else { - func = I2O_UTIL_PARAMS_GET; - op = I2O_PARAMS_OP_FIELD_GET; - } - - mf = (struct i2o_util_params_op *)mb; - mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op); - mf->msgfunc = I2O_MSGFUNC(tid, func); - mf->msgictx = IOP_ICTX; - mf->msgtctx = im->im_tctx; - mf->flags = 0; - - pgop->olh.count = htole16(1); - pgop->olh.reserved = htole16(0); - pgop->oat.operation = htole16(op); - pgop->oat.fieldcount = htole16(0xffff); - pgop->oat.group = htole16(group); - - memset(buf, 0, size); - iop_msg_map(sc, im, mb, pgop, sizeof(*pgop), 1); - iop_msg_map(sc, im, mb, buf, size, write); - rv = iop_msg_post(sc, im, mb, (ii == NULL ? 30000 : 0)); - - /* Detect errors; let partial transfers to count as success. */ - if (ii == NULL && rv == 0) { - if (rf->reqstatus == I2O_STATUS_ERROR_PARTIAL_XFER && - rf->detail == htole16(I2O_DSC_UNKNOWN_ERROR)) - rv = 0; - else - rv = (rf->reqstatus != 0 ? EIO : 0); - } - - if (ii == NULL || rv != 0) { - iop_msg_unmap(sc, im); - iop_msg_free(sc, im); - free(pgop, M_DEVBUF); - free(rf, M_DEVBUF); - } - - return (rv); -} - -/* - * Execute a simple command (no parameters). - */ -int -iop_simple_cmd(struct iop_softc *sc, int tid, int function, int ictx, - int async, int timo) -{ - struct iop_msg *im; - struct i2o_msg mf; - int rv, fl; - - fl = (async != 0 ? IM_WAIT : IM_POLL); - im = iop_msg_alloc(sc, NULL, fl); - - mf.msgflags = I2O_MSGFLAGS(i2o_msg); - mf.msgfunc = I2O_MSGFUNC(tid, function); - mf.msgictx = ictx; - mf.msgtctx = im->im_tctx; - - rv = iop_msg_post(sc, im, &mf, timo); - iop_msg_free(sc, im); - return (rv); -} - -/* - * Post the system table to the IOP. - */ -int -iop_systab_set(struct iop_softc *sc) -{ - struct i2o_exec_sys_tab_set *mf; - struct iop_msg *im; - bus_space_handle_t bsh; - bus_addr_t boo; - u_int32_t mema[2], ioa[2]; - int rv; - u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)]; - - im = iop_msg_alloc(sc, NULL, IM_WAIT); - - mf = (struct i2o_exec_sys_tab_set *)mb; - mf->msgflags = I2O_MSGFLAGS(i2o_exec_sys_tab_set); - mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_SYS_TAB_SET); - mf->msgictx = IOP_ICTX; - mf->msgtctx = im->im_tctx; - mf->iopid = (sc->sc_dv.dv_unit + 2) << 12; - mf->segnumber = 0; - - mema[1] = sc->sc_status.desiredprivmemsize; - ioa[1] = sc->sc_status.desiredpriviosize; - - if (mema[1] != 0) { - /* - * XXX This will waste virtual memory. We need a flag to tell - * bus_space_alloc to just reserve, not actually map the area. - */ - rv = bus_space_alloc(sc->sc_bus_memt, 0, 0xffffffff, - letoh32(mema[1]), PAGE_SIZE, 0, 0, &boo, &bsh); - mema[0] = htole32(boo); - if (rv != 0) { - printf("%s: can't alloc priv mem space, err = %d\n", - sc->sc_dv.dv_xname, rv); - mema[0] = 0; - mema[1] = 0; - } - } - - if (ioa[1] != 0) { - /* - * XXX This will potentially waste virtual memory. We - * need a flag to tell bus_space_alloc to just - * reserve, not actually map the area. - */ - rv = bus_space_alloc(sc->sc_bus_iot, 0, 0xffff, - letoh32(ioa[1]), 0, 0, 0, &boo, &bsh); - ioa[0] = htole32(boo); - if (rv != 0) { - printf("%s: can't alloc priv i/o space, err = %d\n", - sc->sc_dv.dv_xname, rv); - ioa[0] = 0; - ioa[1] = 0; - } - } - - iop_msg_map(sc, im, mb, iop_systab, iop_systab_size, 1); - iop_msg_map(sc, im, mb, mema, sizeof(mema), 1); - iop_msg_map(sc, im, mb, ioa, sizeof(ioa), 1); - rv = iop_msg_post(sc, im, mb, 5000); - iop_msg_unmap(sc, im); - iop_msg_free(sc, im); - return (rv); -} - -/* - * Reset the IOP. Must be called with interrupts disabled. - */ -int -iop_reset(struct iop_softc *sc) -{ - struct i2o_exec_iop_reset mf; - paddr_t pa = sc->sc_scr_seg->ds_addr; - u_int32_t *sw = (u_int32_t *)sc->sc_scr; - u_int32_t mfa; - int rv = 0; - - mf.msgflags = I2O_MSGFLAGS(i2o_exec_iop_reset); - mf.msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_IOP_RESET); - mf.reserved[0] = 0; - mf.reserved[1] = 0; - mf.reserved[2] = 0; - mf.reserved[3] = 0; - mf.statuslow = pa & ~(u_int32_t)0; - mf.statushigh = sizeof pa > sizeof mf.statuslow ? pa >> 32 : 0; - - *sw = htole32(0); - bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), - BUS_DMASYNC_PREREAD); - - if ((rv = iop_post(sc, (u_int32_t *)&mf))) - return (rv); - - /* XXX */ - POLL(2500, - (bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), - BUS_DMASYNC_POSTREAD), *sw != htole32(0))); - if (*sw != htole32(I2O_RESET_IN_PROGRESS)) { - printf("%s: reset rejected, status 0x%x\n", - sc->sc_dv.dv_xname, letoh32(*sw)); - return (EIO); - } - - /* - * IOP is now in the INIT state. Wait no more than 10 seconds for - * the inbound queue to become responsive. - */ - POLL(10000, (mfa = iop_inl(sc, IOP_REG_IFIFO)) != IOP_MFA_EMPTY); - if (mfa == IOP_MFA_EMPTY) { - printf("%s: reset failed\n", sc->sc_dv.dv_xname); - return (EIO); - } - - iop_release_mfa(sc, mfa); - - return (0); -} - -/* - * Register a new initiator. Must be called with the configuration lock - * held. - */ -void -iop_initiator_register(struct iop_softc *sc, struct iop_initiator *ii) -{ - static int ictxgen; - int s; - - /* 0 is reserved (by us) for system messages. */ - ii->ii_ictx = ++ictxgen; - - /* - * `Utility initiators' don't make it onto the per-IOP initiator list - * (which is used only for configuration), but do get one slot on - * the inbound queue. - */ - if ((ii->ii_flags & II_UTILITY) == 0) { - LIST_INSERT_HEAD(&sc->sc_iilist, ii, ii_list); - sc->sc_nii++; - } else - sc->sc_nuii++; - - s = splbio(); - LIST_INSERT_HEAD(IOP_ICTXHASH(ii->ii_ictx), ii, ii_hash); - splx(s); -} - -/* - * Unregister an initiator. Must be called with the configuration lock - * held. - */ -void -iop_initiator_unregister(struct iop_softc *sc, struct iop_initiator *ii) -{ - int s; - - if ((ii->ii_flags & II_UTILITY) == 0) { - LIST_REMOVE(ii, ii_list); - sc->sc_nii--; - } else - sc->sc_nuii--; - - s = splbio(); - LIST_REMOVE(ii, ii_hash); - splx(s); -} - -/* - * Handle a reply frame from the IOP. - */ -int -iop_handle_reply(struct iop_softc *sc, u_int32_t rmfa) -{ - struct iop_msg *im; - struct i2o_reply *rb; - struct i2o_fault_notify *fn; - struct iop_initiator *ii; - u_int off, ictx, tctx, status, size; - - off = (int)(rmfa - sc->sc_rep_phys); - rb = (struct i2o_reply *)(sc->sc_rep + off); - - /* Perform reply queue DMA synchronisation. XXX This is rubbish. */ - bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, off, - sc->sc_rep_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); - if (--sc->sc_curib != 0) - bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, 0, - sc->sc_rep_size, BUS_DMASYNC_PREREAD); - -#ifdef I2ODEBUG - if ((letoh32(rb->msgflags) & I2O_MSGFLAGS_64BIT) != 0) - panic("iop_handle_reply: 64-bit reply"); -#endif - /* - * Find the initiator. - */ - ictx = letoh32(rb->msgictx); - if (ictx == IOP_ICTX) - ii = NULL; - else { - ii = LIST_FIRST(IOP_ICTXHASH(ictx)); - for (; ii != NULL; ii = LIST_NEXT(ii, ii_hash)) - if (ii->ii_ictx == ictx) - break; - if (ii == NULL) { -#ifdef I2ODEBUG - iop_reply_print(sc, rb); -#endif - printf("%s: WARNING: bad ictx returned (%x)\n", - sc->sc_dv.dv_xname, ictx); - return (-1); - } - } - - /* - * If we received a transport failure notice, we've got to dig the - * transaction context (if any) out of the original message frame, - * and then release the original MFA back to the inbound FIFO. - */ - if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0) { - status = I2O_STATUS_SUCCESS; - - fn = (struct i2o_fault_notify *)rb; - tctx = iop_inl(sc, fn->lowmfa + 12); /* XXX */ - iop_release_mfa(sc, fn->lowmfa); - iop_tfn_print(sc, fn); - } else { - status = rb->reqstatus; - tctx = letoh32(rb->msgtctx); - } - - if (ii == NULL || (ii->ii_flags & II_DISCARD) == 0) { - /* - * This initiator tracks state using message wrappers. - * - * Find the originating message wrapper, and if requested - * notify the initiator. - */ - im = sc->sc_ims + (tctx & IOP_TCTX_MASK); - if ((tctx & IOP_TCTX_MASK) > sc->sc_maxib || - (im->im_flags & IM_ALLOCED) == 0 || - tctx != im->im_tctx) { - printf("%s: WARNING: bad tctx returned (0x%08x, %p)\n", - sc->sc_dv.dv_xname, tctx, im); - if (im != NULL) - printf("%s: flags=0x%08x tctx=0x%08x\n", - sc->sc_dv.dv_xname, im->im_flags, - im->im_tctx); -#ifdef I2ODEBUG - if ((rb->msgflags & I2O_MSGFLAGS_FAIL) == 0) - iop_reply_print(sc, rb); -#endif - return (-1); - } - - if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0) - im->im_flags |= IM_FAIL; - -#ifdef I2ODEBUG - if ((im->im_flags & IM_REPLIED) != 0) - panic("%s: dup reply", sc->sc_dv.dv_xname); -#endif - im->im_flags |= IM_REPLIED; - -#ifdef I2ODEBUG - if (status != I2O_STATUS_SUCCESS) - iop_reply_print(sc, rb); -#endif - im->im_reqstatus = status; - - /* Copy the reply frame, if requested. */ - if (im->im_rb != NULL) { - size = (letoh32(rb->msgflags) >> 14) & ~3; -#ifdef I2ODEBUG - if (size > IOP_MAX_MSG_SIZE) - panic("iop_handle_reply: reply too large"); -#endif - memcpy(im->im_rb, rb, size); - } - - /* Notify the initiator. */ - if ((im->im_flags & IM_WAIT) != 0) - wakeup(im); - else if ((im->im_flags & (IM_POLL | IM_POLL_INTR)) != IM_POLL) - (*ii->ii_intr)(ii->ii_dv, im, rb); - } else { - /* - * This initiator discards message wrappers. - * - * Simply pass the reply frame to the initiator. - */ - (*ii->ii_intr)(ii->ii_dv, NULL, rb); - } - - return (status); -} - -/* - * Handle an interrupt from the IOP. - */ -int -iop_intr(void *arg) -{ - struct iop_softc *sc; - u_int32_t rmfa; - - sc = arg; - - if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) == 0) - return (0); - - for (;;) { - /* Double read to account for IOP bug. */ - if ((rmfa = iop_inl(sc, IOP_REG_OFIFO)) == IOP_MFA_EMPTY) { - rmfa = iop_inl(sc, IOP_REG_OFIFO); - if (rmfa == IOP_MFA_EMPTY) - break; - } - iop_handle_reply(sc, rmfa); - iop_outl(sc, IOP_REG_OFIFO, rmfa); - } - - return (1); -} - -/* - * Handle an event signalled by the executive. - */ -void -iop_intr_event(struct device *dv, struct iop_msg *im, void *reply) -{ - struct i2o_util_event_register_reply *rb; - u_int event; - - rb = reply; - - if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0) - return; - - event = letoh32(rb->event); - printf("%s: event 0x%08x received\n", dv->dv_xname, event); -} - -/* - * Allocate a message wrapper. - */ -struct iop_msg * -iop_msg_alloc(struct iop_softc *sc, struct iop_initiator *ii, int flags) -{ - struct iop_msg *im; - static u_int tctxgen; - int s, i; - -#ifdef I2ODEBUG - if ((flags & IM_SYSMASK) != 0) - panic("iop_msg_alloc: system flags specified"); -#endif - - s = splbio(); /* XXX */ - im = SLIST_FIRST(&sc->sc_im_freelist); -#if defined(DIAGNOSTIC) || defined(I2ODEBUG) - if (im == NULL) - panic("iop_msg_alloc: no free wrappers"); -#endif - SLIST_REMOVE_HEAD(&sc->sc_im_freelist, im_chain); - splx(s); - - if (ii != NULL && (ii->ii_flags & II_DISCARD) != 0) - flags |= IM_DISCARD; - - im->im_tctx = (im->im_tctx & IOP_TCTX_MASK) | tctxgen; - tctxgen += (1 << IOP_TCTX_SHIFT); - im->im_flags = flags | IM_ALLOCED; - im->im_rb = NULL; - i = 0; - do { - im->im_xfer[i++].ix_size = 0; - } while (i < IOP_MAX_MSG_XFERS); - - return (im); -} - -/* - * Free a message wrapper. - */ -void -iop_msg_free(struct iop_softc *sc, struct iop_msg *im) -{ - int s; - -#ifdef I2ODEBUG - if ((im->im_flags & IM_ALLOCED) == 0) - panic("iop_msg_free: wrapper not allocated"); -#endif - - im->im_flags = 0; - s = splbio(); - SLIST_INSERT_HEAD(&sc->sc_im_freelist, im, im_chain); - splx(s); -} - -/* - * Map a data transfer. Write a scatter-gather list into the message frame. - */ -int -iop_msg_map(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb, - void *xferaddr, size_t xfersize, int out) -{ - bus_dmamap_t dm; - bus_dma_segment_t *ds; - struct iop_xfer *ix; - u_int rv, i, nsegs, flg, off, xn; - u_int32_t *p; - - for (xn = 0, ix = im->im_xfer; xn < IOP_MAX_MSG_XFERS; xn++, ix++) - if (ix->ix_size == 0) - break; - -#ifdef I2ODEBUG - if (xfersize == 0) - panic("iop_msg_map: null transfer"); - if (xfersize > IOP_MAX_XFER) - panic("iop_msg_map: transfer too large"); - if (xn == IOP_MAX_MSG_XFERS) - panic("iop_msg_map: too many xfers"); -#endif - - /* - * Only the first DMA map is static. - */ - if (xn != 0) { - rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER, - IOP_MAX_SEGS, IOP_MAX_XFER, 0, - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ix->ix_map); - if (rv != 0) - return (rv); - } - - dm = ix->ix_map; - rv = bus_dmamap_load(sc->sc_dmat, dm, xferaddr, xfersize, NULL, 0); - if (rv != 0) - goto bad; - - /* - * How many SIMPLE SG elements can we fit in this message? - */ - off = mb[0] >> 16; - p = mb + off; - nsegs = ((IOP_MAX_MSG_SIZE / sizeof *mb) - off) >> 1; - - if (dm->dm_nsegs > nsegs) { - bus_dmamap_unload(sc->sc_dmat, ix->ix_map); - rv = EFBIG; - DPRINTF(("iop_msg_map: too many segs\n")); - goto bad; - } - - nsegs = dm->dm_nsegs; - xfersize = 0; - - /* - * Write out the SG list. - */ - if (out) - flg = I2O_SGL_SIMPLE | I2O_SGL_DATA_OUT; - else - flg = I2O_SGL_SIMPLE; - - for (i = nsegs, ds = dm->dm_segs; i > 1; i--, p += 2, ds++) { - p[0] = (u_int32_t)ds->ds_len | flg; - p[1] = (u_int32_t)ds->ds_addr; - xfersize += ds->ds_len; - } - - p[0] = (u_int32_t)ds->ds_len | flg | I2O_SGL_END_BUFFER; - p[1] = (u_int32_t)ds->ds_addr; - xfersize += ds->ds_len; - - /* Fix up the transfer record, and sync the map. */ - ix->ix_flags = (out ? IX_OUT : IX_IN); - ix->ix_size = xfersize; - bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize, - out ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD); - - /* - * If this is the first xfer we've mapped for this message, adjust - * the SGL offset field in the message header. - */ - if ((im->im_flags & IM_SGLOFFADJ) == 0) { - mb[0] += (mb[0] >> 12) & 0xf0; - im->im_flags |= IM_SGLOFFADJ; - } - mb[0] += (nsegs << 17); - return (0); - - bad: - if (xn != 0) - bus_dmamap_destroy(sc->sc_dmat, ix->ix_map); - return (rv); -} - -/* - * Map a block I/O data transfer (different in that there's only one per - * message maximum, and PAGE addressing may be used). Write a scatter - * gather list into the message frame. - */ -int -iop_msg_map_bio(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb, - void *xferaddr, int xfersize, int out) -{ - bus_dma_segment_t *ds; - bus_dmamap_t dm; - struct iop_xfer *ix; - u_int rv, i, nsegs, off, slen, tlen, flg; - paddr_t saddr, eaddr; - u_int32_t *p; - -#ifdef I2ODEBUG - if (xfersize == 0) - panic("iop_msg_map_bio: null transfer"); - if (xfersize > IOP_MAX_XFER) - panic("iop_msg_map_bio: transfer too large"); - if ((im->im_flags & IM_SGLOFFADJ) != 0) - panic("iop_msg_map_bio: SGLOFFADJ"); -#endif - - ix = im->im_xfer; - dm = ix->ix_map; - rv = bus_dmamap_load(sc->sc_dmat, dm, xferaddr, xfersize, NULL, 0); - if (rv != 0) - return (rv); - - off = mb[0] >> 16; - nsegs = ((IOP_MAX_MSG_SIZE / 4) - off) >> 1; - - /* - * If the transfer is highly fragmented and won't fit using SIMPLE - * elements, use PAGE_LIST elements instead. SIMPLE elements are - * potentially more efficient, both for us and the IOP. - */ - if (dm->dm_nsegs > nsegs) { - nsegs = 1; - p = mb + off + 1; - - /* XXX This should be done with a bus_space flag. */ - for (i = dm->dm_nsegs, ds = dm->dm_segs; i > 0; i--, ds++) { - slen = ds->ds_len; - saddr = ds->ds_addr; - - while (slen > 0) { - eaddr = (saddr + PAGE_SIZE) & ~(PAGE_SIZE - 1); - tlen = min(eaddr - saddr, slen); - slen -= tlen; - *p++ = letoh32(saddr); - saddr = eaddr; - nsegs++; - } - } - - mb[off] = xfersize | I2O_SGL_PAGE_LIST | I2O_SGL_END_BUFFER | - I2O_SGL_END; - if (out) - mb[off] |= I2O_SGL_DATA_OUT; - } else { - p = mb + off; - nsegs = dm->dm_nsegs; - - if (out) - flg = I2O_SGL_SIMPLE | I2O_SGL_DATA_OUT; - else - flg = I2O_SGL_SIMPLE; - - for (i = nsegs, ds = dm->dm_segs; i > 1; i--, p += 2, ds++) { - p[0] = (u_int32_t)ds->ds_len | flg; - p[1] = (u_int32_t)ds->ds_addr; - } - - p[0] = (u_int32_t)ds->ds_len | flg | I2O_SGL_END_BUFFER | - I2O_SGL_END; - p[1] = (u_int32_t)ds->ds_addr; - nsegs <<= 1; - } - - /* Fix up the transfer record, and sync the map. */ - ix->ix_flags = (out ? IX_OUT : IX_IN); - ix->ix_size = xfersize; - bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, - ix->ix_map->dm_mapsize, - out ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD); - - /* - * Adjust the SGL offset and total message size fields. We don't - * set IM_SGLOFFADJ, since it's used only for SIMPLE elements. - */ - mb[0] += ((off << 4) + (nsegs << 16)); - return (0); -} - -/* - * Unmap all data transfers associated with a message wrapper. - */ -void -iop_msg_unmap(struct iop_softc *sc, struct iop_msg *im) -{ - struct iop_xfer *ix; - int i; - -#ifdef I2ODEBUG - if (im->im_xfer[0].ix_size == 0) - panic("iop_msg_unmap: no transfers mapped"); -#endif - - for (ix = im->im_xfer, i = 0;;) { - bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, ix->ix_size, - ix->ix_flags & IX_OUT ? BUS_DMASYNC_POSTWRITE : - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(sc->sc_dmat, ix->ix_map); - - /* Only the first DMA map is static. */ - if (i != 0) - bus_dmamap_destroy(sc->sc_dmat, ix->ix_map); - if ((++ix)->ix_size == 0) - break; - if (++i >= IOP_MAX_MSG_XFERS) - break; - } -} - -/* - * Post a message frame to the IOP's inbound queue. - */ -int -iop_post(struct iop_softc *sc, u_int32_t *mb) -{ - u_int32_t mfa; - int s; - size_t size = mb[0] >> 14 & ~3; - - /* ZZZ */ - if (size > IOP_MAX_MSG_SIZE) - panic("iop_post: frame too large"); - -#ifdef I2ODEBUG - { - int i; - - printf("\niop_post\n"); - for (i = 0; i < size / sizeof *mb; i++) - printf("%4d %08x\n", i, mb[i]); - } -#endif - - s = splbio(); /* XXX */ - - /* Allocate a slot with the IOP. */ - if ((mfa = iop_inl(sc, IOP_REG_IFIFO)) == IOP_MFA_EMPTY) - if ((mfa = iop_inl(sc, IOP_REG_IFIFO)) == IOP_MFA_EMPTY) { - splx(s); - printf("%s: mfa not forthcoming\n", - sc->sc_dv.dv_xname); - return (EAGAIN); - } - -#ifdef I2ODEBUG - printf("mfa = %u\n", mfa); -#endif - - /* Copy out the message frame. */ - bus_space_write_region_4(sc->sc_iot, sc->sc_ioh, mfa, mb, - size / sizeof *mb); - bus_space_barrier(sc->sc_iot, sc->sc_ioh, mfa, size, - BUS_SPACE_BARRIER_WRITE); - - /* Post the MFA back to the IOP. */ - iop_outl(sc, IOP_REG_IFIFO, mfa); - - splx(s); - return (0); -} - -/* - * Post a message to the IOP and deal with completion. - */ -int -iop_msg_post(struct iop_softc *sc, struct iop_msg *im, void *xmb, int timo) -{ - u_int32_t *mb = xmb; - int rv, s; - size_t size = mb[0] >> 14 & 3; - - /* Terminate the scatter/gather list chain. */ - if ((im->im_flags & IM_SGLOFFADJ) != 0) - mb[size - 2] |= I2O_SGL_END; - - /* Perform reply buffer DMA synchronisation. */ - if (sc->sc_curib++ == 0) - bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, 0, - sc->sc_rep_size, BUS_DMASYNC_PREREAD); - - if ((rv = iop_post(sc, mb)) != 0) - return (rv); - - if ((im->im_flags & IM_DISCARD) != 0) - iop_msg_free(sc, im); - else if ((im->im_flags & IM_POLL) != 0 && timo == 0) { - /* XXX For ofifo_init(). */ - rv = 0; - } else if ((im->im_flags & (IM_POLL | IM_WAIT)) != 0) { - if ((im->im_flags & IM_POLL) != 0) - iop_msg_poll(sc, im, timo); - else - iop_msg_wait(sc, im, timo); - - s = splbio(); - if ((im->im_flags & IM_REPLIED) != 0) { - if ((im->im_flags & IM_NOSTATUS) != 0) - rv = 0; - else if ((im->im_flags & IM_FAIL) != 0) - rv = ENXIO; - else if (im->im_reqstatus != I2O_STATUS_SUCCESS) - rv = EIO; - else - rv = 0; - } else - rv = EBUSY; - splx(s); - } else - rv = 0; - - return (rv); -} - -/* - * Spin until the specified message is replied to. - */ -void -iop_msg_poll(struct iop_softc *sc, struct iop_msg *im, int timo) -{ - u_int32_t rmfa; - int s, status; - - s = splbio(); /* XXX */ - - /* Wait for completion. */ - for (timo *= 10; timo != 0; timo--) { - if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) != 0) { - /* Double read to account for IOP bug. */ - rmfa = iop_inl(sc, IOP_REG_OFIFO); - if (rmfa == IOP_MFA_EMPTY) - rmfa = iop_inl(sc, IOP_REG_OFIFO); - if (rmfa != IOP_MFA_EMPTY) { - status = iop_handle_reply(sc, rmfa); - - /* - * Return the reply frame to the IOP's - * outbound FIFO. - */ - iop_outl(sc, IOP_REG_OFIFO, rmfa); - } - } - if ((im->im_flags & IM_REPLIED) != 0) - break; - DELAY(100); - } - - if (timo == 0) { -#ifdef I2ODEBUG - printf("%s: poll - no reply\n", sc->sc_dv.dv_xname); - if (iop_status_get(sc, 1) != 0) - printf("iop_msg_poll: unable to retrieve status\n"); - else - printf("iop_msg_poll: IOP state = %d\n", - (letoh32(sc->sc_status.segnumber) >> 16) & 0xff); -#endif - } - - splx(s); -} - -/* - * Sleep until the specified message is replied to. - */ -void -iop_msg_wait(struct iop_softc *sc, struct iop_msg *im, int timo) -{ - int s, rv; - - s = splbio(); - if ((im->im_flags & IM_REPLIED) != 0) { - splx(s); - return; - } - rv = tsleep(im, PRIBIO, "iopmsg", timo * hz / 1000); - splx(s); - -#ifdef I2ODEBUG - if (rv != 0) { - printf("iop_msg_wait: tsleep() == %d\n", rv); - if (iop_status_get(sc, 0) != 0) - printf("iop_msg_wait: unable to retrieve status\n"); - else - printf("iop_msg_wait: IOP state = %d\n", - (letoh32(sc->sc_status.segnumber) >> 16) & 0xff); - } -#endif -} - -/* - * Release an unused message frame back to the IOP's inbound fifo. - */ -void -iop_release_mfa(struct iop_softc *sc, u_int32_t mfa) -{ - - /* Use the frame to issue a no-op. */ - iop_outl(sc, mfa, I2O_VERSION_11 | (4 << 16)); - iop_outl(sc, mfa + 4, I2O_MSGFUNC(I2O_TID_IOP, I2O_UTIL_NOP)); - iop_outl(sc, mfa + 8, 0); - iop_outl(sc, mfa + 12, 0); - - iop_outl(sc, IOP_REG_IFIFO, mfa); -} - -#ifdef I2ODEBUG -/* - * Dump a reply frame header. - */ -void -iop_reply_print(struct iop_softc *sc, struct i2o_reply *rb) -{ - u_int function, detail; -#ifdef I2OVERBOSE - const char *statusstr; -#endif - - function = (letoh32(rb->msgfunc) >> 24) & 0xff; - detail = letoh16(rb->detail); - - printf("%s: reply:\n", sc->sc_dv.dv_xname); - -#ifdef I2OVERBOSE - if (rb->reqstatus < sizeof(iop_status) / sizeof(iop_status[0])) - statusstr = iop_status[rb->reqstatus]; - else - statusstr = "undefined error code"; - - printf("%s: function=0x%02x status=0x%02x (%s)\n", - sc->sc_dv.dv_xname, function, rb->reqstatus, statusstr); -#else - printf("%s: function=0x%02x status=0x%02x\n", - sc->sc_dv.dv_xname, function, rb->reqstatus); -#endif - printf("%s: detail=0x%04x ictx=0x%08x tctx=0x%08x\n", - sc->sc_dv.dv_xname, detail, letoh32(rb->msgictx), - letoh32(rb->msgtctx)); - printf("%s: tidi=%d tidt=%d flags=0x%02x\n", sc->sc_dv.dv_xname, - (letoh32(rb->msgfunc) >> 12) & 4095, letoh32(rb->msgfunc) & 4095, - (letoh32(rb->msgflags) >> 8) & 0xff); -} -#endif - -/* - * Dump a transport failure reply. - */ -void -iop_tfn_print(struct iop_softc *sc, struct i2o_fault_notify *fn) -{ - - printf("%s: WARNING: transport failure:\n", sc->sc_dv.dv_xname); - - printf("%s: ictx=0x%08x tctx=0x%08x\n", sc->sc_dv.dv_xname, - letoh32(fn->msgictx), letoh32(fn->msgtctx)); - printf("%s: failurecode=0x%02x severity=0x%02x\n", - sc->sc_dv.dv_xname, fn->failurecode, fn->severity); - printf("%s: highestver=0x%02x lowestver=0x%02x\n", - sc->sc_dv.dv_xname, fn->highestver, fn->lowestver); -} - -/* - * Translate an I2O ASCII field into a C string. - */ -void -iop_strvis(struct iop_softc *sc, const char *src, int slen, char *dst, int dlen) -{ - int hc, lc, i, nit; - - dlen--; - lc = 0; - hc = 0; - i = 0; - - /* - * DPT use NUL as a space, whereas AMI use it as a terminator. The - * spec has nothing to say about it. Since AMI fields are usually - * filled with junk after the terminator, ... - */ - nit = (letoh16(sc->sc_status.orgid) != I2O_ORG_DPT); - - while (slen-- != 0 && dlen-- != 0) { - if (nit && *src == '\0') - break; - else if (*src <= 0x20 || *src >= 0x7f) { - if (hc) - dst[i++] = ' '; - } else { - hc = 1; - dst[i++] = *src; - lc = i; - } - src++; - } - - dst[lc] = '\0'; -} - -/* - * Retrieve the DEVICE_IDENTITY parameter group from the target and dump it. - */ -int -iop_print_ident(struct iop_softc *sc, int tid) -{ - struct { - struct i2o_param_op_results pr; - struct i2o_param_read_results prr; - struct i2o_param_device_identity di; - } __packed p; - char buf[32]; - int rv; - - rv = iop_param_op(sc, tid, NULL, 0, I2O_PARAM_DEVICE_IDENTITY, &p, - sizeof(p)); - if (rv != 0) - return (rv); - - iop_strvis(sc, p.di.vendorinfo, sizeof(p.di.vendorinfo), buf, - sizeof(buf)); - printf(" <%s, ", buf); - iop_strvis(sc, p.di.productinfo, sizeof(p.di.productinfo), buf, - sizeof(buf)); - printf("%s, ", buf); - iop_strvis(sc, p.di.revlevel, sizeof(p.di.revlevel), buf, sizeof(buf)); - printf("%s>", buf); - - return (0); -} - -/* - * Claim or unclaim the specified TID. - */ -int -iop_util_claim(struct iop_softc *sc, struct iop_initiator *ii, int release, - int flags) -{ - struct iop_msg *im; - struct i2o_util_claim mf; - int rv, func; - - func = release ? I2O_UTIL_CLAIM_RELEASE : I2O_UTIL_CLAIM; - im = iop_msg_alloc(sc, ii, IM_WAIT); - - /* We can use the same structure, as they're identical. */ - mf.msgflags = I2O_MSGFLAGS(i2o_util_claim); - mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, func); - mf.msgictx = ii->ii_ictx; - mf.msgtctx = im->im_tctx; - mf.flags = flags; - - rv = iop_msg_post(sc, im, &mf, 5000); - iop_msg_free(sc, im); - return (rv); -} - -/* - * Perform an abort. - */ -int iop_util_abort(struct iop_softc *sc, struct iop_initiator *ii, int func, - int tctxabort, int flags) -{ - struct iop_msg *im; - struct i2o_util_abort mf; - int rv; - - im = iop_msg_alloc(sc, ii, IM_WAIT); - - mf.msgflags = I2O_MSGFLAGS(i2o_util_abort); - mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_ABORT); - mf.msgictx = ii->ii_ictx; - mf.msgtctx = im->im_tctx; - mf.flags = (func << 24) | flags; - mf.tctxabort = tctxabort; - - rv = iop_msg_post(sc, im, &mf, 5000); - iop_msg_free(sc, im); - return (rv); -} - -/* - * Enable or disable reception of events for the specified device. - */ -int iop_util_eventreg(struct iop_softc *sc, struct iop_initiator *ii, int mask) -{ - struct iop_msg *im; - struct i2o_util_event_register mf; - - im = iop_msg_alloc(sc, ii, 0); - - mf.msgflags = I2O_MSGFLAGS(i2o_util_event_register); - mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_EVENT_REGISTER); - mf.msgictx = ii->ii_ictx; - mf.msgtctx = im->im_tctx; - mf.eventmask = mask; - - /* This message is replied to only when events are signalled. */ - return (iop_msg_post(sc, im, &mf, 0)); -} - -int -iopopen(dev_t dev, int flag, int mode, struct proc *p) -{ - struct iop_softc *sc; - - if (!(sc = (struct iop_softc *)device_lookup(&iop_cd, minor(dev)))) - return (ENXIO); - if ((sc->sc_flags & IOP_ONLINE) == 0) - return (ENXIO); - if ((sc->sc_flags & IOP_OPEN) != 0) - return (EBUSY); - sc->sc_flags |= IOP_OPEN; - - sc->sc_ptb = malloc(IOP_MAX_XFER * IOP_MAX_MSG_XFERS, M_DEVBUF, - M_WAITOK | M_CANFAIL); - if (sc->sc_ptb == NULL) { - sc->sc_flags ^= IOP_OPEN; - return (ENOMEM); - } - - return (0); -} - -int -iopclose(dev_t dev, int flag, int mode, struct proc *p) -{ - struct iop_softc *sc; - - sc = (struct iop_softc *)device_lookup(&iop_cd, minor(dev)); /* XXX */ - free(sc->sc_ptb, M_DEVBUF); - sc->sc_flags &= ~IOP_OPEN; - return (0); -} - -int -iopioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) -{ - struct iop_softc *sc; - struct iovec *iov; - int rv, i; - - if (securelevel >= 2) - return (EPERM); - - sc = (struct iop_softc *)device_lookup(&iop_cd, minor(dev)); /* XXX */ - - switch (cmd) { - case IOPIOCPT: - return (iop_passthrough(sc, (struct ioppt *)data)); - - case IOPIOCGSTATUS: - iov = (struct iovec *)data; - i = sizeof(struct i2o_status); - if (i > iov->iov_len) - i = iov->iov_len; - else - iov->iov_len = i; - if ((rv = iop_status_get(sc, 0)) == 0) - rv = copyout(&sc->sc_status, iov->iov_base, i); - return (rv); - - case IOPIOCGLCT: - case IOPIOCGTIDMAP: - case IOPIOCRECONFIG: - break; - - default: -#if defined(DIAGNOSTIC) || defined(I2ODEBUG) - printf("%s: unknown ioctl %lx\n", sc->sc_dv.dv_xname, cmd); -#endif - return (ENOTTY); - } - - rw_enter_read(&sc->sc_conflock); - - switch (cmd) { - case IOPIOCGLCT: - iov = (struct iovec *)data; - i = letoh16(sc->sc_lct->tablesize) << 2; - if (i > iov->iov_len) - i = iov->iov_len; - else - iov->iov_len = i; - rv = copyout(sc->sc_lct, iov->iov_base, i); - break; - - case IOPIOCRECONFIG: - rv = iop_reconfigure(sc, 0); - break; - - case IOPIOCGTIDMAP: - iov = (struct iovec *)data; - i = sizeof(struct iop_tidmap) * sc->sc_nlctent; - if (i > iov->iov_len) - i = iov->iov_len; - else - iov->iov_len = i; - rv = copyout(sc->sc_tidmap, iov->iov_base, i); - break; - } - - rw_exit_read(&sc->sc_conflock); - return (rv); -} - -int -iop_passthrough(struct iop_softc *sc, struct ioppt *pt) -{ - struct iop_msg *im; - struct i2o_msg *mf; - struct ioppt_buf *ptb; - int rv, i, mapped; - void *buf; - - mf = NULL; - im = NULL; - mapped = 1; - - if (pt->pt_msglen > IOP_MAX_MSG_SIZE || - pt->pt_msglen > (letoh16(sc->sc_status.inboundmframesize) << 2) || - pt->pt_msglen < sizeof(struct i2o_msg) || - pt->pt_nbufs > IOP_MAX_MSG_XFERS || - pt->pt_nbufs < 0 || pt->pt_replylen < 0 || - pt->pt_timo < 1000 || pt->pt_timo > 5*60*1000) - return (EINVAL); - - for (i = 0; i < pt->pt_nbufs; i++) - if (pt->pt_bufs[i].ptb_datalen > IOP_MAX_XFER) { - rv = ENOMEM; - goto bad; - } - - mf = malloc(IOP_MAX_MSG_SIZE, M_DEVBUF, M_WAITOK | M_CANFAIL); - if (mf == NULL) - return (ENOMEM); - - if ((rv = copyin(pt->pt_msg, mf, pt->pt_msglen)) != 0) - goto bad; - - im = iop_msg_alloc(sc, NULL, IM_WAIT | IM_NOSTATUS); - im->im_rb = (struct i2o_reply *)mf; - mf->msgictx = IOP_ICTX; - mf->msgtctx = im->im_tctx; - - for (i = 0; i < pt->pt_nbufs; i++) { - ptb = &pt->pt_bufs[i]; - buf = sc->sc_ptb + i * IOP_MAX_XFER; - - if ((u_int)ptb->ptb_datalen > IOP_MAX_XFER) { - rv = EINVAL; - goto bad; - } - - if (ptb->ptb_out != 0) { - rv = copyin(ptb->ptb_data, buf, ptb->ptb_datalen); - if (rv != 0) - goto bad; - } - - rv = iop_msg_map(sc, im, (u_int32_t *)mf, buf, - ptb->ptb_datalen, ptb->ptb_out != 0); - if (rv != 0) - goto bad; - mapped = 1; - } - - if ((rv = iop_msg_post(sc, im, mf, pt->pt_timo)) != 0) - goto bad; - - i = (letoh32(im->im_rb->msgflags) >> 14) & ~3; - if (i > IOP_MAX_MSG_SIZE) - i = IOP_MAX_MSG_SIZE; - if (i > pt->pt_replylen) - i = pt->pt_replylen; - if ((rv = copyout(im->im_rb, pt->pt_reply, i)) != 0) - goto bad; - - iop_msg_unmap(sc, im); - mapped = 0; - - for (i = 0; i < pt->pt_nbufs; i++) { - ptb = &pt->pt_bufs[i]; - if (ptb->ptb_out != 0) - continue; - buf = sc->sc_ptb + i * IOP_MAX_XFER; - rv = copyout(buf, ptb->ptb_data, ptb->ptb_datalen); - if (rv != 0) - break; - } - - bad: - if (mapped != 0) - iop_msg_unmap(sc, im); - if (im != NULL) - iop_msg_free(sc, im); - if (mf != NULL) - free(mf, M_DEVBUF); - return (rv); -} diff --git a/sys/dev/i2o/iopio.h b/sys/dev/i2o/iopio.h deleted file mode 100644 index 5aa12ad54c1..00000000000 --- a/sys/dev/i2o/iopio.h +++ /dev/null @@ -1,72 +0,0 @@ -/* $OpenBSD: iopio.h,v 1.2 2008/06/26 05:42:15 ray Exp $ */ -/* $NetBSD$ */ - -/*- - * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _I2O_IOPIO_H_ -#define _I2O_IOPIO_H_ - -#define IOP_MAX_MSG_XFERS 3 /* Maximum transfer count per msg */ -#define IOP_MAX_OUTBOUND 256 /* Maximum outbound queue depth */ -#define IOP_MAX_INBOUND 256 /* Maximum inbound queue depth */ -#define IOP_MF_RESERVE 4 /* Frames to reserve for ctl ops */ -#define IOP_MAX_XFER 64*1024 /* Maximum transfer size */ -#define IOP_MAX_MSG_SIZE 128 /* Maximum message frame size */ - -struct iop_tidmap { - u_short it_tid; - u_short it_flags; - char it_dvname[sizeof(((struct device *)NULL)->dv_xname)]; -}; -#define IT_CONFIGURED 0x02 /* target configured */ - -struct ioppt_buf { - void *ptb_data; /* pointer to buffer */ - size_t ptb_datalen; /* buffer size in bytes */ - int ptb_out; /* non-zero if transfer is to IOP */ -}; - -struct ioppt { - void *pt_msg; /* pointer to message buffer */ - size_t pt_msglen; /* message buffer size in bytes */ - void *pt_reply; /* pointer to reply buffer */ - size_t pt_replylen; /* reply buffer size in bytes */ - int pt_timo; /* completion timeout in ms */ - int pt_nbufs; /* number of transfers */ - struct ioppt_buf pt_bufs[IOP_MAX_MSG_XFERS]; /* transfers */ -}; - -#define IOPIOCPT _IOWR('u', 0, struct ioppt) -#define IOPIOCGLCT _IOWR('u', 1, struct iovec) -#define IOPIOCGSTATUS _IOWR('u', 2, struct iovec) -#define IOPIOCRECONFIG _IO('u', 3) -#define IOPIOCGTIDMAP _IOWR('u', 4, struct iovec) - -#endif /* !_I2O_IOPIO_H_ */ diff --git a/sys/dev/i2o/ioprbs.c b/sys/dev/i2o/ioprbs.c deleted file mode 100644 index a4cdd6b2b89..00000000000 --- a/sys/dev/i2o/ioprbs.c +++ /dev/null @@ -1,853 +0,0 @@ -/* $OpenBSD: ioprbs.c,v 1.31 2011/05/02 22:15:11 chl Exp $ */ - -/* - * Copyright (c) 2001 Niklas Hallqvist - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/*- - * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * A driver for I2O "Random block storage" devices, like RAID. - */ - -/* - * This driver would not have been written if it was not for the hardware - * donation from pi.se. I want to thank them for their support. It also - * had been much harder without Andrew Doran's work in NetBSD's ld_iop.c - * driver, from which I have both gotten inspiration and actual code. - * - Niklas Hallqvist - */ - -#include <sys/param.h> -#include <sys/buf.h> -#include <sys/device.h> -#include <sys/kernel.h> -#include <sys/proc.h> -#include <sys/systm.h> - -#include <machine/bus.h> - -#include <scsi/scsi_all.h> -#include <scsi/scsi_disk.h> -#include <scsi/scsiconf.h> - -#include <dev/i2o/i2o.h> -#include <dev/i2o/iopio.h> -#include <dev/i2o/iopvar.h> -#include <dev/i2o/ioprbsvar.h> - -#ifdef I2ODEBUG -#define DPRINTF(x) printf x -#else -#define DPRINTF(x) -#endif - -void ioprbs_adjqparam(struct device *, int); -void ioprbs_attach(struct device *, struct device *, void *); -void ioprbs_copy_internal_data(struct scsi_xfer *, u_int8_t *, - size_t); -void ioprbs_enqueue_ccb(struct ioprbs_softc *, struct ioprbs_ccb *); -int ioprbs_exec_ccb(struct ioprbs_ccb *); -void ioprbs_free_ccb(void *, void *); -void *ioprbs_get_ccb(void *); -void ioprbs_internal_cache_cmd(struct scsi_xfer *); -void ioprbs_intr(struct device *, struct iop_msg *, void *); -void ioprbs_intr_event(struct device *, struct iop_msg *, void *); -int ioprbs_match(struct device *, void *, void *); -void ioprbs_scsi_cmd(struct scsi_xfer *); -int ioprbs_start(struct ioprbs_ccb *); -void ioprbs_start_ccbs(struct ioprbs_softc *); -void ioprbs_timeout(void *); -void ioprbs_unconfig(struct ioprbs_softc *, int); -void ioprbs_watchdog(void *); - -struct cfdriver ioprbs_cd = { - NULL, "ioprbs", DV_DULL -}; - -struct cfattach ioprbs_ca = { - sizeof(struct ioprbs_softc), ioprbs_match, ioprbs_attach -}; - -struct scsi_adapter ioprbs_switch = { - ioprbs_scsi_cmd, scsi_minphys, 0, 0, -}; - -#ifdef I2OVERBOSE -static const char *const ioprbs_errors[] = { - "success", - "media error", - "access error", - "device failure", - "device not ready", - "media not present", - "media locked", - "media failure", - "protocol failure", - "bus failure", - "access violation", - "media write protected", - "device reset", - "volume changed, waiting for acknowledgement", - "timeout", -}; -#endif - -/* - * Match a supported device. - */ -int -ioprbs_match(parent, match, aux) - struct device *parent; - void *match; - void *aux; -{ - struct iop_attach_args *ia = aux; - - return (ia->ia_class == I2O_CLASS_RANDOM_BLOCK_STORAGE); -} - -/* - * Attach a supported device. - */ -void -ioprbs_attach(struct device *parent, struct device *self, void *aux) -{ - struct iop_attach_args *ia = aux; - struct ioprbs_softc *sc = (struct ioprbs_softc *)self; - struct iop_softc *iop = (struct iop_softc *)parent; - struct scsibus_attach_args saa; - int rv, state = 0; - int enable; - u_int32_t cachesz; - char *typestr, *fixedstr; - struct { - struct i2o_param_op_results pr; - struct i2o_param_read_results prr; - union { - struct i2o_param_rbs_cache_control cc; - struct i2o_param_rbs_device_info bdi; - struct i2o_param_rbs_operation op; - } p; - } __packed param; - int i; - - TAILQ_INIT(&sc->sc_free_ccb); - TAILQ_INIT(&sc->sc_ccbq); - mtx_init(&sc->sc_ccb_mtx, IPL_BIO); - scsi_iopool_init(&sc->sc_iopool, sc, ioprbs_get_ccb, ioprbs_free_ccb); - - /* Initialize the ccbs */ - for (i = 0; i < IOPRBS_MAX_CCBS; i++) - TAILQ_INSERT_TAIL(&sc->sc_free_ccb, &sc->sc_ccbs[i], - ic_chain); - - /* Register us as an initiator. */ - sc->sc_ii.ii_dv = self; - sc->sc_ii.ii_intr = ioprbs_intr; - sc->sc_ii.ii_adjqparam = ioprbs_adjqparam; - sc->sc_ii.ii_flags = 0; - sc->sc_ii.ii_tid = ia->ia_tid; - iop_initiator_register(iop, &sc->sc_ii); - - /* Register another initiator to handle events from the device. */ - sc->sc_eventii.ii_dv = self; - sc->sc_eventii.ii_intr = ioprbs_intr_event; - sc->sc_eventii.ii_flags = II_DISCARD | II_UTILITY; - sc->sc_eventii.ii_tid = ia->ia_tid; - iop_initiator_register(iop, &sc->sc_eventii); - - rv = iop_util_eventreg(iop, &sc->sc_eventii, - I2O_EVENT_GEN_EVENT_MASK_MODIFIED | I2O_EVENT_GEN_DEVICE_RESET | - I2O_EVENT_GEN_STATE_CHANGE | I2O_EVENT_GEN_GENERAL_WARNING); - if (rv != 0) { - printf("%s: unable to register for events", self->dv_xname); - goto bad; - } - state++; - - /* - * Start out with one queued command. The `iop' driver will adjust - * the queue parameters once we're up and running. - */ - sc->sc_maxqueuecnt = 1; - - sc->sc_maxxfer = IOP_MAX_XFER; - - /* Say what the device is. */ - printf(":"); - iop_print_ident(iop, ia->ia_tid); - - /* - * Claim the device so that we don't get any nasty surprises. Allow - * failure. - */ - rv = iop_util_claim(iop, &sc->sc_ii, 0, - I2O_UTIL_CLAIM_CAPACITY_SENSITIVE | - I2O_UTIL_CLAIM_NO_PEER_SERVICE | - I2O_UTIL_CLAIM_NO_MANAGEMENT_SERVICE | - I2O_UTIL_CLAIM_PRIMARY_USER); - sc->sc_flags = rv ? 0 : IOPRBS_CLAIMED; - - rv = iop_param_op(iop, ia->ia_tid, NULL, 0, I2O_PARAM_RBS_DEVICE_INFO, - ¶m, sizeof param); - if (rv != 0) { - printf("%s: unable to get parameters (0x%04x; %d)\n", - sc->sc_dv.dv_xname, I2O_PARAM_RBS_DEVICE_INFO, rv); - goto bad; - } - - sc->sc_secsize = letoh32(param.p.bdi.blocksize); - sc->sc_secperunit = (int) - (letoh64(param.p.bdi.capacity) / sc->sc_secsize); - - switch (param.p.bdi.type) { - case I2O_RBS_TYPE_DIRECT: - typestr = "direct access"; - enable = 1; - break; - case I2O_RBS_TYPE_WORM: - typestr = "WORM"; - enable = 0; - break; - case I2O_RBS_TYPE_CDROM: - typestr = "CD-ROM"; - enable = 0; - break; - case I2O_RBS_TYPE_OPTICAL: - typestr = "optical"; - enable = 0; - break; - default: - typestr = "unknown"; - enable = 0; - break; - } - - if ((letoh32(param.p.bdi.capabilities) & I2O_RBS_CAP_REMOVABLE_MEDIA) - != 0) { - /* sc->sc_flags = IOPRBS_REMOVABLE; */ - fixedstr = "removable"; - enable = 0; - } else - fixedstr = "fixed"; - - printf(" %s, %s", typestr, fixedstr); - - /* - * Determine if the device has an private cache. If so, print the - * cache size. Even if the device doesn't appear to have a cache, - * we perform a flush at shutdown. - */ - rv = iop_param_op(iop, ia->ia_tid, NULL, 0, - I2O_PARAM_RBS_CACHE_CONTROL, ¶m, sizeof(param)); - if (rv != 0) { - printf("%s: unable to get parameters (0x%04x; %d)\n", - sc->sc_dv.dv_xname, I2O_PARAM_RBS_CACHE_CONTROL, rv); - goto bad; - } - - if ((cachesz = letoh32(param.p.cc.totalcachesize)) != 0) - printf(", %dkB cache", cachesz >> 10); - - printf("\n"); - - /* - * Configure the DDM's timeout functions to time out all commands - * after 30 seconds. - */ - rv = iop_param_op(iop, ia->ia_tid, NULL, 0, I2O_PARAM_RBS_OPERATION, - ¶m, sizeof(param)); - if (rv != 0) { - printf("%s: unable to get parameters (0x%04x; %d)\n", - sc->sc_dv.dv_xname, I2O_PARAM_RBS_OPERATION, rv); - goto bad; - } - - param.p.op.timeoutbase = htole32(IOPRBS_TIMEOUT * 1000); - param.p.op.rwvtimeoutbase = htole32(IOPRBS_TIMEOUT * 1000); - param.p.op.rwvtimeout = 0; - - rv = iop_param_op(iop, ia->ia_tid, NULL, 1, I2O_PARAM_RBS_OPERATION, - ¶m, sizeof(param)); -#ifdef notdef - /* - * Intel RAID adapters don't like the above, but do post a - * `parameter changed' event. Perhaps we're doing something - * wrong... - */ - if (rv != 0) { - printf("%s: unable to set parameters (0x%04x; %d)\n", - sc->sc_dv.dv_xname, I2O_PARAM_RBS_OPERATION, rv); - goto bad; - } -#endif - - if (enable) - sc->sc_flags |= IOPRBS_ENABLED; - else - printf("%s: device not yet supported\n", self->dv_xname); - - /* Fill in the prototype scsi_link. */ - sc->sc_link.adapter_softc = sc; - sc->sc_link.adapter = &ioprbs_switch; - sc->sc_link.openings = 1; - sc->sc_link.adapter_buswidth = 1; - sc->sc_link.adapter_target = 1; - sc->sc_link.pool = &sc->sc_iopool; - - bzero(&saa, sizeof(saa)); - saa.saa_sc_link = &sc->sc_link; - - config_found(&sc->sc_dv, &saa, scsiprint); - - return; - - bad: - ioprbs_unconfig(sc, state > 0); -} - -void -ioprbs_unconfig(struct ioprbs_softc *sc, int evreg) -{ - struct iop_softc *iop; - int s; - - iop = (struct iop_softc *)sc->sc_dv.dv_parent; - - if ((sc->sc_flags & IOPRBS_CLAIMED) != 0) - iop_util_claim(iop, &sc->sc_ii, 1, - I2O_UTIL_CLAIM_PRIMARY_USER); - - if (evreg) { - /* - * Mask off events, and wait up to 5 seconds for a reply. - * Note that some adapters won't reply to this (XXX We - * should check the event capabilities). - */ - sc->sc_flags &= ~IOPRBS_NEW_EVTMASK; - iop_util_eventreg(iop, &sc->sc_eventii, - I2O_EVENT_GEN_EVENT_MASK_MODIFIED); - s = splbio(); - if ((sc->sc_flags & IOPRBS_NEW_EVTMASK) == 0) - tsleep(&sc->sc_eventii, PRIBIO, "ioprbsevt", hz * 5); - splx(s); -#ifdef I2ODEBUG - if ((sc->sc_flags & IOPRBS_NEW_EVTMASK) == 0) - printf("%s: didn't reply to event unregister", - sc->sc_dv.dv_xname); -#endif - } - - iop_initiator_unregister(iop, &sc->sc_eventii); - iop_initiator_unregister(iop, &sc->sc_ii); -} - -void -ioprbs_scsi_cmd(struct scsi_xfer *xs) -{ - struct scsi_link *link = xs->sc_link; - struct ioprbs_softc *sc = link->adapter_softc; - struct ioprbs_ccb *ccb = xs->io; - u_int64_t blockno; - u_int32_t blockcnt; - int s; - - xs->error = XS_NOERROR; - - switch (xs->cmd->opcode) { - case TEST_UNIT_READY: - case REQUEST_SENSE: - case INQUIRY: - case MODE_SENSE: - case START_STOP: - case READ_CAPACITY: -#if 0 - case VERIFY: -#endif - ioprbs_internal_cache_cmd(xs); - scsi_done(xs); - return; - - case PREVENT_ALLOW: - DPRINTF(("PREVENT/ALLOW ")); - /* XXX Not yet implemented */ - xs->error = XS_NOERROR; - scsi_done(xs); - return; - - case SYNCHRONIZE_CACHE: - DPRINTF(("SYNCHRONIZE_CACHE ")); - /* XXX Not yet implemented */ - xs->error = XS_NOERROR; - scsi_done(xs); - return; - - default: - DPRINTF(("unknown opc %d ", xs->cmd->opcode)); - /* XXX Not yet implemented */ - xs->error = XS_DRIVER_STUFFUP; - scsi_done(xs); - return; - - case READ_COMMAND: - case READ_BIG: - case WRITE_COMMAND: - case WRITE_BIG: - DPRINTF(("rw opc %d ", xs->cmd->opcode)); - - scsi_cmd_rw_decode(xs->cmd, &blockno, &blockcnt); - if (blockno >= sc->sc_secperunit || - blockcnt > sc->sc_secperunit - blockno) { - printf("%s: out of bounds %llu-%u >= %u\n", - sc->sc_dv.dv_xname, blockno, blockcnt, - sc->sc_secperunit); - /* - * XXX Should be XS_SENSE but that - * would require setting up a faked - * sense too. - */ - xs->error = XS_DRIVER_STUFFUP; - scsi_done(xs); - return; - } - - ccb->ic_blockno = blockno; - ccb->ic_blockcnt = blockcnt; - ccb->ic_xs = xs; - ccb->ic_timeout = xs->timeout; - - s = splbio(); - ioprbs_enqueue_ccb(sc, ccb); - splx(s); - - if (xs->flags & SCSI_POLL) { - /* XXX Should actually poll... */ - } - } -} - -void -ioprbs_intr(struct device *dv, struct iop_msg *im, void *reply) -{ - struct i2o_rbs_reply *rb = reply; - struct ioprbs_ccb *ccb = im->im_dvcontext; - struct scsi_xfer *xs = ccb->ic_xs; - struct iop_softc *iop = (struct iop_softc *)dv->dv_parent; - int err, detail; -#ifdef I2OVERBOSE - const char *errstr; -#endif - - DPRINTF(("ioprbs_intr(%p, %p, %p) ", dv, im, reply)); - - timeout_del(&xs->stimeout); - - err = ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0); - - if (!err && rb->reqstatus != I2O_STATUS_SUCCESS) { - detail = letoh16(rb->detail); -#ifdef I2OVERBOSE - if (detail >= sizeof(ioprbs_errors) / sizeof(ioprbs_errors[0])) - errstr = "<unknown>"; - else - errstr = ioprbs_errors[detail]; - printf("%s: error 0x%04x: %s\n", dv->dv_xname, detail, errstr); -#else - printf("%s: error 0x%04x\n", dv->dv_xname, detail); -#endif - err = 1; - } - - if (err) - xs->error = XS_DRIVER_STUFFUP; - else - xs->resid = xs->datalen - letoh32(rb->transfercount); - - iop_msg_unmap(iop, im); - iop_msg_free(iop, im); - scsi_done(xs); -} - -void -ioprbs_intr_event(struct device *dv, struct iop_msg *im, void *reply) -{ - struct i2o_util_event_register_reply *rb; - struct ioprbs_softc *sc; - u_int event; - - rb = reply; - - if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0) - return; - - event = letoh32(rb->event); - sc = (struct ioprbs_softc *)dv; - - if (event == I2O_EVENT_GEN_EVENT_MASK_MODIFIED) { - sc->sc_flags |= IOPRBS_NEW_EVTMASK; - wakeup(&sc->sc_eventii); -#ifndef I2ODEBUG - return; -#endif - } - - printf("%s: event 0x%08x received\n", dv->dv_xname, event); -} - -void -ioprbs_adjqparam(struct device *dv, int mpi) -{ -#if 0 - struct iop_softc *iop; - - /* - * AMI controllers seem to lose the plot if you hand off lots of - * queued commands. - */ - iop = (struct iop_softc *)dv->dv_parent; - if (letoh16(I2O_ORG_AMI) == iop->sc_status.orgid && mpi > 64) - mpi = 64; - - ldadjqparam((struct ld_softc *)dv, mpi); -#endif -} - -void -ioprbs_copy_internal_data(xs, data, size) - struct scsi_xfer *xs; - u_int8_t *data; - size_t size; -{ - size_t copy_cnt; - - DPRINTF(("ioprbs_copy_internal_data ")); - - if (!xs->datalen) - printf("uio move not yet supported\n"); - else { - copy_cnt = MIN(size, xs->datalen); - bcopy(data, xs->data, copy_cnt); - } -} - -/* Emulated SCSI operation on cache device */ -void -ioprbs_internal_cache_cmd(xs) - struct scsi_xfer *xs; -{ - struct scsi_link *link = xs->sc_link; - struct ioprbs_softc *sc = link->adapter_softc; - u_int8_t target = link->target; - struct scsi_inquiry_data inq; - struct scsi_sense_data sd; - struct scsi_read_cap_data rcd; - - DPRINTF(("ioprbs_internal_cache_cmd ")); - - xs->error = XS_NOERROR; - - if (target > 0 || link->lun != 0) { - xs->error = XS_DRIVER_STUFFUP; - return; - } - - switch (xs->cmd->opcode) { - case TEST_UNIT_READY: - case START_STOP: -#if 0 - case VERIFY: -#endif - DPRINTF(("opc %d tgt %d ", xs->cmd->opcode, target)); - break; - - case REQUEST_SENSE: - DPRINTF(("REQUEST SENSE tgt %d ", target)); - bzero(&sd, sizeof sd); - sd.error_code = SSD_ERRCODE_CURRENT; - sd.segment = 0; - sd.flags = SKEY_NO_SENSE; - bzero(sd.info, sizeof sd.info); - sd.extra_len = 0; - ioprbs_copy_internal_data(xs, (u_int8_t *)&sd, sizeof sd); - break; - - case INQUIRY: - DPRINTF(("INQUIRY tgt %d", target)); - bzero(&inq, sizeof inq); - /* XXX How do we detect removable/CD-ROM devices? */ - inq.device = T_DIRECT; - inq.dev_qual2 = 0; - inq.version = 2; - inq.response_format = 2; - inq.additional_length = 32; - inq.flags |= SID_CmdQue; - strlcpy(inq.vendor, "I2O", sizeof inq.vendor); - snprintf(inq.product, sizeof inq.product, "Container #%02d", - target); - strlcpy(inq.revision, " ", sizeof inq.revision); - ioprbs_copy_internal_data(xs, (u_int8_t *)&inq, sizeof inq); - break; - - case READ_CAPACITY: - DPRINTF(("READ CAPACITY tgt %d ", target)); - bzero(&rcd, sizeof rcd); - _lto4b(sc->sc_secperunit - 1, rcd.addr); - _lto4b(IOPRBS_BLOCK_SIZE, rcd.length); - ioprbs_copy_internal_data(xs, (u_int8_t *)&rcd, sizeof rcd); - break; - - default: - DPRINTF(("unsupported scsi command %#x tgt %d ", - xs->cmd->opcode, target)); - xs->error = XS_DRIVER_STUFFUP; - return; - } - - xs->error = XS_NOERROR; -} - -void * -ioprbs_get_ccb(void *cookie) -{ - struct ioprbs_softc *sc = cookie; - struct ioprbs_ccb *ccb; - - mtx_enter(&sc->sc_ccb_mtx); - ccb = TAILQ_FIRST(&sc->sc_free_ccb); - if (ccb) - TAILQ_REMOVE(&sc->sc_free_ccb, ccb, ic_chain); - mtx_leave(&sc->sc_ccb_mtx); - - /* initialise the command */ - if (ccb) - ccb->ic_flags = 0; - - return (ccb); -} - -void -ioprbs_free_ccb(void *cookie, void *io) -{ - struct ioprbs_softc *sc = cookie; - struct ioprbs_ccb *ccb = io; - - mtx_enter(&sc->sc_ccb_mtx); - TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, ic_chain); - mtx_leave(&sc->sc_ccb_mtx); -} - -void -ioprbs_enqueue_ccb(sc, ccb) - struct ioprbs_softc *sc; - struct ioprbs_ccb *ccb; -{ - DPRINTF(("ioprbs_enqueue_ccb(%p, %p) ", sc, ccb)); - - timeout_set(&ccb->ic_xs->stimeout, ioprbs_timeout, ccb); - TAILQ_INSERT_TAIL(&sc->sc_ccbq, ccb, ic_chain); - ioprbs_start_ccbs(sc); -} - -void -ioprbs_start_ccbs(sc) - struct ioprbs_softc *sc; -{ - struct ioprbs_ccb *ccb; - struct scsi_xfer *xs; - - DPRINTF(("ioprbs_start_ccbs(%p) ", sc)); - - while ((ccb = TAILQ_FIRST(&sc->sc_ccbq)) != NULL) { - - xs = ccb->ic_xs; - if (ccb->ic_flags & IOPRBS_ICF_WATCHDOG) - timeout_del(&xs->stimeout); - - if (ioprbs_exec_ccb(ccb) == 0) { - ccb->ic_flags |= IOPRBS_ICF_WATCHDOG; - timeout_set(&ccb->ic_xs->stimeout, ioprbs_watchdog, - ccb); - timeout_add_msec(&xs->stimeout, IOPRBS_WATCH_TIMEOUT); - break; - } - TAILQ_REMOVE(&sc->sc_ccbq, ccb, ic_chain); - - if ((xs->flags & SCSI_POLL) == 0) { - timeout_set(&ccb->ic_xs->stimeout, ioprbs_timeout, - ccb); - timeout_add_msec(&xs->stimeout, ccb->ic_timeout); - } - } -} - -int -ioprbs_exec_ccb(ccb) - struct ioprbs_ccb *ccb; -{ - struct scsi_xfer *xs = ccb->ic_xs; - - DPRINTF(("ioprbs_exec_ccb(%p, %p) ", xs, ccb)); - - ioprbs_start(ccb); - - xs->error = XS_NOERROR; - xs->resid = 0; - return (1); -} - -/* - * Deliver a command to the controller; allocate controller resources at the - * last moment when possible. - */ -int -ioprbs_start(struct ioprbs_ccb *ccb) -{ - struct scsi_xfer *xs = ccb->ic_xs; - struct scsi_link *link = xs->sc_link; - struct ioprbs_softc *sc = link->adapter_softc; -#ifdef I2ODEBUG - u_int8_t target = link->target; -#endif - struct iop_msg *im; - struct iop_softc *iop = (struct iop_softc *)sc->sc_dv.dv_parent; - struct i2o_rbs_block_read *mf; - u_int rv, flags = 0, mode = I2O_RBS_BLOCK_READ; - u_int64_t ba; - u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)]; - - im = iop_msg_alloc(iop, &sc->sc_ii, 0); - im->im_dvcontext = ccb; - - switch (xs->cmd->opcode) { - case PREVENT_ALLOW: - case SYNCHRONIZE_CACHE: - if (xs->cmd->opcode == PREVENT_ALLOW) { - /* XXX PREVENT_ALLOW support goes here */ - } else { - DPRINTF(("SYNCHRONIZE CACHE tgt %d ", target)); - } - break; - - case WRITE_COMMAND: - case WRITE_BIG: - flags = I2O_RBS_BLOCK_WRITE_CACHE_WB; - mode = I2O_RBS_BLOCK_WRITE; - /* FALLTHROUGH */ - - case READ_COMMAND: - case READ_BIG: - ba = (u_int64_t)ccb->ic_blockno * DEV_BSIZE; - - /* - * Fill the message frame. We can use the block_read - * structure for both reads and writes, as it's almost - * identical to the * block_write structure. - */ - mf = (struct i2o_rbs_block_read *)mb; - mf->msgflags = I2O_MSGFLAGS(i2o_rbs_block_read); - mf->msgfunc = I2O_MSGFUNC(sc->sc_ii.ii_tid, mode); - mf->msgictx = sc->sc_ii.ii_ictx; - mf->msgtctx = im->im_tctx; - mf->flags = flags | (1 << 16); /* flags & time multiplier */ - mf->datasize = ccb->ic_blockcnt * DEV_BSIZE; - mf->lowoffset = (u_int32_t)ba; - mf->highoffset = (u_int32_t)(ba >> 32); - - /* Map the data transfer and enqueue the command. */ - rv = iop_msg_map_bio(iop, im, mb, xs->data, - ccb->ic_blockcnt * DEV_BSIZE, mode == I2O_RBS_BLOCK_WRITE); - if (rv == 0) { - if ((rv = iop_msg_post(iop, im, mb, 0)) != 0) { - iop_msg_unmap(iop, im); - iop_msg_free(iop, im); - } - } - break; - } - return (0); -} - -void -ioprbs_timeout(arg) - void *arg; -{ - struct ioprbs_ccb *ccb = arg; - struct scsi_link *link = ccb->ic_xs->sc_link; - struct ioprbs_softc *sc = link->adapter_softc; - int s; - - sc_print_addr(link); - printf("timed out\n"); - - /* XXX Test for multiple timeouts */ - - ccb->ic_xs->error = XS_TIMEOUT; - s = splbio(); - ioprbs_enqueue_ccb(sc, ccb); - splx(s); -} - -void -ioprbs_watchdog(arg) - void *arg; -{ - struct ioprbs_ccb *ccb = arg; - struct scsi_link *link = ccb->ic_xs->sc_link; - struct ioprbs_softc *sc = link->adapter_softc; - int s; - - s = splbio(); - ccb->ic_flags &= ~IOPRBS_ICF_WATCHDOG; - ioprbs_start_ccbs(sc); - splx(s); -} diff --git a/sys/dev/i2o/ioprbsvar.h b/sys/dev/i2o/ioprbsvar.h deleted file mode 100644 index a12fb959175..00000000000 --- a/sys/dev/i2o/ioprbsvar.h +++ /dev/null @@ -1,90 +0,0 @@ -/* $OpenBSD: ioprbsvar.h,v 1.7 2011/04/27 18:54:19 matthew Exp $ */ - -/* - * Copyright (c) 2001 Niklas Hallqvist - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef _I2O_IOPRBSVAR_H_ -#define _I2O_IOPRBSVAR_H_ - -/* - * A command contol block, one for each corresponding command index of the - * controller. - */ -struct ioprbs_ccb { - TAILQ_ENTRY(ioprbs_ccb) ic_chain; - struct scsi_xfer *ic_xs; -#if 0 - struct aac_fib *ac_fib; /* FIB associated with this command */ - bus_addr_t ac_fibphys; /* bus address of the FIB */ - bus_dmamap_t ac_dmamap_xfer; - struct aac_sg_table *ac_sgtable;/* pointer to s/g table in command */ -#endif - int ic_timeout; - u_int32_t ic_blockno; - u_int32_t ic_blockcnt; - u_int8_t ic_flags; -#define IOPRBS_ICF_WATCHDOG 0x1 -#define IOPRBS_ICF_COMPLETED 0x2 -}; - -/* XXX What is correct? */ -#define IOPRBS_MAX_CCBS 256 - -struct ioprbs_softc { - struct device sc_dv; /* Generic device data */ - struct scsi_link sc_link; /* Virtual SCSI bus for cache devs */ - struct iop_initiator sc_ii; - struct iop_initiator sc_eventii; - - int sc_flags; - int sc_secperunit; /* # sectors in total */ - int sc_secsize; /* sector size in bytes */ - int sc_maxxfer; /* max xfer size in bytes */ - int sc_maxqueuecnt; /* maximum h/w queue depth */ - int sc_queuecnt; /* current h/w queue depth */ - - struct ioprbs_ccb sc_ccbs[IOPRBS_MAX_CCBS]; - TAILQ_HEAD(, ioprbs_ccb) sc_free_ccb, sc_ccbq; - /* commands on hold for controller resources */ - TAILQ_HEAD(, ioprbs_ccb) sc_ready; - /* commands which have been returned by the controller */ - struct scsi_iopool sc_iopool; - struct mutex sc_ccb_mtx; -}; - -#define IOPRBS_CLAIMED 0x01 -#define IOPRBS_NEW_EVTMASK 0x02 -#define IOPRBS_ENABLED 0x04 - -#define IOPRBS_TIMEOUT (30 * 1000) -#define IOPRBS_BLOCK_SIZE 512 - -/* - * Wait this long for a lost interrupt to get detected. - */ -#define IOPRBS_WATCH_TIMEOUT 10000 /* 10000 * 1ms = 10s */ - -#endif /* !_I2O_IOPRMSVAR_H_ */ diff --git a/sys/dev/i2o/iopreg.h b/sys/dev/i2o/iopreg.h deleted file mode 100644 index 0b82120a39c..00000000000 --- a/sys/dev/i2o/iopreg.h +++ /dev/null @@ -1,44 +0,0 @@ -/* $OpenBSD: iopreg.h,v 1.2 2008/06/26 05:42:15 ray Exp $ */ -/* $NetBSD$ */ - -/*- - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _I2O_IOPREG_H_ -#define _I2O_IOPREG_H_ - -#define IOP_REG_INTR_STATUS 0x30 /* Interrupt status */ -#define IOP_REG_INTR_MASK 0x34 /* Interrupt mask */ -#define IOP_REG_IFIFO 0x40 /* Inbound FIFO (to IOP) */ -#define IOP_REG_OFIFO 0x44 /* Outbound FIFO (from IOP) */ - -#define IOP_MFA_EMPTY 0xffffffffU -#define IOP_INTR_OFIFO 0x08 - -#endif /* !_I2O_IOPREG_H_ */ diff --git a/sys/dev/i2o/iopsp.c b/sys/dev/i2o/iopsp.c deleted file mode 100644 index d5357df493b..00000000000 --- a/sys/dev/i2o/iopsp.c +++ /dev/null @@ -1,629 +0,0 @@ -/* $OpenBSD: iopsp.c,v 1.18 2010/06/28 18:31:01 krw Exp $ */ -/* $NetBSD$ */ - -/*- - * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Raw SCSI device support for I2O. IOPs present SCSI devices individually; - * we group them by controlling port. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/device.h> -#include <sys/queue.h> -#include <sys/proc.h> -#include <sys/buf.h> -#include <sys/endian.h> -#include <sys/malloc.h> -#include <sys/scsiio.h> -#include <sys/rwlock.h> - -#include <machine/bus.h> - -#include <scsi/scsi_all.h> -#include <scsi/scsi_disk.h> -#include <scsi/scsi_all.h> -#include <scsi/scsiconf.h> -#include <scsi/scsi_message.h> - -#include <dev/i2o/i2o.h> -#include <dev/i2o/iopio.h> -#include <dev/i2o/iopvar.h> -#include <dev/i2o/iopspvar.h> - -struct cfdriver iopsp_cd = { - NULL, "iopsp", DV_DULL -}; - -int iopsp_match(struct device *, void *, void *); -void iopsp_attach(struct device *, struct device *, void *); - -struct cfattach iopsp_ca = { - sizeof(struct iopsp_softc), iopsp_match, iopsp_attach -}; - -void iopsp_scsi_cmd(struct scsi_xfer *); -void iopspminphys(struct buf *bp, struct scsi_link *sl); - -struct scsi_adapter iopsp_switch = { - iopsp_scsi_cmd, iopspminphys, 0, 0, -}; - -void iopsp_adjqparam(struct device *, int); -void iopsp_intr(struct device *, struct iop_msg *, void *); -int iopsp_rescan(struct iopsp_softc *); -int iopsp_reconfig(struct device *); - -/* - * Match a supported device. - */ -int -iopsp_match(struct device *parent, void *match, void *aux) -{ - struct iop_attach_args *ia = aux; - struct { - struct i2o_param_op_results pr; - struct i2o_param_read_results prr; - struct i2o_param_hba_ctlr_info ci; - } __packed param; - int rv; - - if (ia->ia_class != I2O_CLASS_BUS_ADAPTER_PORT) - return (0); - - if ((rv = iop_param_op((struct iop_softc *)parent, ia->ia_tid, NULL, 0, - I2O_PARAM_HBA_CTLR_INFO, ¶m, sizeof(param)))) { -#ifdef I2ODEBUG - printf("iopsp_match: iop_param_op failed, status = %d\n", rv); -#endif - return (0); - } - -#ifdef I2ODEBUG - printf("iopsp_match: bustype = %d\n", param.ci.bustype); -#endif - - return (param.ci.bustype == I2O_HBA_BUS_SCSI || - param.ci.bustype == I2O_HBA_BUS_FCA); -} - -/* - * Attach a supported device. - */ -void -iopsp_attach(struct device *parent, struct device *self, void *aux) -{ - struct iop_softc *iop = (struct iop_softc *)parent; - struct iopsp_softc *sc = (struct iopsp_softc *)self; - struct iop_attach_args *ia = (struct iop_attach_args *)aux; - struct scsibus_attach_args saa; - struct { - struct i2o_param_op_results pr; - struct i2o_param_read_results prr; - union { - struct i2o_param_hba_ctlr_info ci; - struct i2o_param_hba_scsi_ctlr_info sci; - struct i2o_param_hba_scsi_port_info spi; - } p; - } __packed param; - int fcal, rv; -#ifdef I2OVERBOSE - int size; -#endif - - /* Register us as an initiator. */ - sc->sc_ii.ii_dv = self; - sc->sc_ii.ii_intr = iopsp_intr; - sc->sc_ii.ii_flags = 0; - sc->sc_ii.ii_tid = ia->ia_tid; - sc->sc_ii.ii_reconfig = iopsp_reconfig; - sc->sc_ii.ii_adjqparam = iopsp_adjqparam; - iop_initiator_register(iop, &sc->sc_ii); - - rv = iop_param_op(iop, ia->ia_tid, NULL, 0, I2O_PARAM_HBA_CTLR_INFO, - ¶m, sizeof(param)); - if (rv != 0) { - printf("%s: unable to get parameters (0x%04x; %d)\n", - sc->sc_dv.dv_xname, I2O_PARAM_HBA_CTLR_INFO, rv); - goto bad; - } - - fcal = (param.p.ci.bustype == I2O_HBA_BUS_FCA); /* XXX */ - - /* - * Say what the device is. If we can find out what the controling - * device is, say what that is too. - */ - printf(": SCSI port"); - iop_print_ident(iop, ia->ia_tid); - printf("\n"); - - rv = iop_param_op(iop, ia->ia_tid, NULL, 0, - I2O_PARAM_HBA_SCSI_CTLR_INFO, ¶m, sizeof(param)); - if (rv != 0) { - printf("%s: unable to get parameters (0x%04x; %d)\n", - sc->sc_dv.dv_xname, I2O_PARAM_HBA_SCSI_CTLR_INFO, rv); - goto bad; - } - -#ifdef I2OVERBOSE - printf("%s: %d-bit, max sync rate %dMHz, initiator ID %d\n", - sc->sc_dv.dv_xname, param.p.sci.maxdatawidth, - (u_int32_t)letoh64(param.p.sci.maxsyncrate) / 1000, - letoh32(param.p.sci.initiatorid)); -#endif - - sc->sc_link.adapter_softc = sc; - sc->sc_link.adapter = &iopsp_switch; - sc->sc_link.adapter_target = letoh32(param.p.sci.initiatorid); - sc->sc_link.openings = 1; - sc->sc_link.adapter_buswidth = fcal? - IOPSP_MAX_FCAL_TARGET : param.p.sci.maxdatawidth; - sc->sc_link.luns = IOPSP_MAX_LUN; - -#ifdef I2OVERBOSE - /* - * Allocate the target map. Currently used for informational - * purposes only. - */ - size = sc->sc_link.adapter_buswidth * sizeof(struct iopsp_target); - sc->sc_targetmap = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO); -#endif - - /* Build the two maps, and attach to scsi. */ - if (iopsp_reconfig(self) != 0) { - printf("%s: configure failed\n", sc->sc_dv.dv_xname); - goto bad; - } - - bzero(&saa, sizeof(saa)); - saa.saa_sc_link = &sc->sc_link; - - config_found(&sc->sc_dv, &saa, scsiprint); - return; - - bad: - iop_initiator_unregister(iop, &sc->sc_ii); -} - -/* - * Scan the LCT to determine which devices we control, and enter them into - * the maps. - */ -int -iopsp_reconfig(struct device *dv) -{ - struct iopsp_softc *sc = (struct iopsp_softc *)dv; - struct iop_softc *iop = (struct iop_softc *)sc->sc_dv.dv_parent; - struct i2o_lct_entry *le; - struct { - struct i2o_param_op_results pr; - struct i2o_param_read_results prr; - struct i2o_param_scsi_device_info sdi; - } __packed param; - u_int tid, nent, i, targ, lun, size, s, rv, bptid; - u_short *tidmap; -#ifdef I2OVERBOSE - struct iopsp_target *it; - int syncrate; -#endif - - /* Anything to do? */ - if (iop->sc_chgind == sc->sc_chgind) - return (0); - - /* - * Allocate memory for the target/LUN -> TID map. Use zero to - * denote absent targets (zero is the TID of the I2O executive, - * and we never address that here). - */ - size = sc->sc_link.adapter_buswidth * IOPSP_MAX_LUN * sizeof(u_short); - if (!(tidmap = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO))) - return (ENOMEM); - -#ifdef I2OVERBOSE - for (i = 0; i < sc->sc_link.adapter_buswidth; i++) - sc->sc_targetmap[i].it_flags &= ~IT_PRESENT; -#endif - - /* - * A quick hack to handle Intel's stacked bus port arrangement. - */ - bptid = sc->sc_ii.ii_tid; - nent = iop->sc_nlctent; - for (le = iop->sc_lct->entry; nent != 0; nent--, le++) - if ((letoh16(le->classid) & 4095) == - I2O_CLASS_BUS_ADAPTER_PORT && - (letoh32(le->usertid) & 4095) == bptid) { - bptid = letoh16(le->localtid) & 4095; - break; - } - - nent = iop->sc_nlctent; - for (i = 0, le = iop->sc_lct->entry; i < nent; i++, le++) { - if ((letoh16(le->classid) & I2O_CLASS_MASK) != - I2O_CLASS_SCSI_PERIPHERAL || - ((letoh32(le->usertid) >> 12) & 4095) != bptid) - continue; - tid = letoh16(le->localtid) & I2O_LCT_ENTRY_TID_MASK; - - rv = iop_param_op(iop, tid, NULL, 0, I2O_PARAM_SCSI_DEVICE_INFO, - ¶m, sizeof(param)); - if (rv != 0) { - printf("%s: unable to get parameters (0x%04x; %d)\n", - sc->sc_dv.dv_xname, I2O_PARAM_SCSI_DEVICE_INFO, - rv); - continue; - } - targ = letoh32(param.sdi.identifier); - lun = param.sdi.luninfo[1]; -#if defined(DIAGNOSTIC) || defined(I2ODEBUG) - if (targ >= sc->sc_link.adapter_buswidth || - lun >= sc->sc_link.adapter_buswidth) { - printf("%s: target %d,%d (tid %d): bad target/LUN\n", - sc->sc_dv.dv_xname, targ, lun, tid); - continue; - } -#endif - -#ifdef I2OVERBOSE - /* - * If we've already described this target, and nothing has - * changed, then don't describe it again. - */ - it = &sc->sc_targetmap[targ]; - it->it_flags |= IT_PRESENT; - syncrate = (int)((letoh64(param.sdi.negsyncrate) + 500) / 1000); - if (it->it_width == param.sdi.negdatawidth && - it->it_offset == param.sdi.negoffset && - it->it_syncrate == syncrate) - continue; - - it->it_width = param.sdi.negdatawidth; - it->it_offset = param.sdi.negoffset; - it->it_syncrate = syncrate; - - printf("%s: target %d (tid %d): %d-bit, ", sc->sc_dv.dv_xname, - targ, tid, it->it_width); - if (it->it_syncrate == 0) - printf("asynchronous\n"); - else - printf("synchronous at %dMHz, offset 0x%x\n", - it->it_syncrate, it->it_offset); -#endif - - /* Ignore the device if it's in use by somebody else. */ - if ((letoh32(le->usertid) & 4095) != I2O_TID_NONE) { -#ifdef I2OVERBOSE - if (sc->sc_tidmap == NULL || - IOPSP_TIDMAP(sc->sc_tidmap, targ, lun) != - IOPSP_TID_INUSE) - printf("%s: target %d,%d (tid %d): in use by" - " tid %d\n", sc->sc_dv.dv_xname, - targ, lun, tid, - letoh32(le->usertid) & 4095); -#endif - IOPSP_TIDMAP(tidmap, targ, lun) = IOPSP_TID_INUSE; - } else - IOPSP_TIDMAP(tidmap, targ, lun) = (u_short)tid; - } - -#ifdef I2OVERBOSE - for (i = 0; i < sc->sc_link.adapter_buswidth; i++) - if ((sc->sc_targetmap[i].it_flags & IT_PRESENT) == 0) - sc->sc_targetmap[i].it_width = 0; -#endif - - /* Swap in the new map and return. */ - s = splbio(); - if (sc->sc_tidmap != NULL) - free(sc->sc_tidmap, M_DEVBUF); - sc->sc_tidmap = tidmap; - splx(s); - sc->sc_chgind = iop->sc_chgind; - return (0); -} - -/* - * Re-scan the bus; to be called from a higher level (e.g. scsi). - */ -int -iopsp_rescan(struct iopsp_softc *sc) -{ - struct iop_softc *iop; - struct iop_msg *im; - struct i2o_hba_bus_scan mf; - int rv; - - iop = (struct iop_softc *)sc->sc_dv.dv_parent; - - rw_enter_write(&iop->sc_conflock); - - im = iop_msg_alloc(iop, &sc->sc_ii, IM_WAIT); - - mf.msgflags = I2O_MSGFLAGS(i2o_hba_bus_scan); - mf.msgfunc = I2O_MSGFUNC(sc->sc_ii.ii_tid, I2O_HBA_BUS_SCAN); - mf.msgictx = sc->sc_ii.ii_ictx; - mf.msgtctx = im->im_tctx; - - rv = iop_msg_post(iop, im, &mf, 5*60*1000); - iop_msg_free(iop, im); - if (rv != 0) - printf("%s: bus rescan failed (error %d)\n", - sc->sc_dv.dv_xname, rv); - - if ((rv = iop_lct_get(iop)) == 0) - rv = iopsp_reconfig(&sc->sc_dv); - - rw_exit_write(&iop->sc_conflock); - return (rv); -} - -void -iopspminphys(struct buf *bp, struct scsi_link *sl) -{ - if (bp->b_bcount > IOP_MAX_XFER) - bp->b_bcount = IOP_MAX_XFER; - minphys(bp); -} - -/* - * Start a SCSI command. - */ -void -iopsp_scsi_cmd(xs) - struct scsi_xfer *xs; -{ - struct scsi_link *link = xs->sc_link; - struct iopsp_softc *sc = (struct iopsp_softc *)link->adapter_softc; - struct iop_softc *iop = (struct iop_softc *)sc->sc_dv.dv_parent; - struct iop_msg *im; - struct i2o_scsi_scb_exec *mf; - int error, tid, s; - u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)]; - - tid = IOPSP_TIDMAP(sc->sc_tidmap, link->target, link->lun); - if (tid == IOPSP_TID_ABSENT || tid == IOPSP_TID_INUSE) { - xs->error = XS_SELTIMEOUT; - scsi_done(xs); - return; - } - - SC_DEBUG(xs->sc_link, SDEV_DB2, ("iopsp_scsi_cmd: run_xfer\n")); - - /* Need to reset the target? */ - if ((xs->flags & XS_RESET) != 0) { - if (iop_simple_cmd(iop, tid, I2O_SCSI_DEVICE_RESET, - sc->sc_ii.ii_ictx, 1, 30*1000) != 0) { -#ifdef I2ODEBUG - printf("%s: reset failed\n", - sc->sc_dv.dv_xname); -#endif - xs->error = XS_DRIVER_STUFFUP; - } else - xs->error = XS_NOERROR; - - scsi_done(xs); - return; - } - -#if defined(I2ODEBUG) || defined(SCSIDEBUG) - if (xs->cmdlen > sizeof(mf->cdb)) - panic("%s: CDB too large", sc->sc_dv.dv_xname); -#endif - - im = iop_msg_alloc(iop, &sc->sc_ii, IM_POLL_INTR | - IM_NOSTATUS | ((xs->flags & SCSI_POLL) != 0 ? IM_POLL : 0)); - im->im_dvcontext = xs; - - mf = (struct i2o_scsi_scb_exec *)mb; - mf->msgflags = I2O_MSGFLAGS(i2o_scsi_scb_exec); - mf->msgfunc = I2O_MSGFUNC(tid, I2O_SCSI_SCB_EXEC); - mf->msgictx = sc->sc_ii.ii_ictx; - mf->msgtctx = im->im_tctx; - mf->flags = xs->cmdlen | I2O_SCB_FLAG_ENABLE_DISCONNECT | - I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE; - mf->datalen = xs->datalen; - memcpy(mf->cdb, xs->cmd, xs->cmdlen); - -#if 0 - switch (xs->xs_tag_type) { - case MSG_ORDERED_Q_TAG: - mf->flags |= I2O_SCB_FLAG_ORDERED_QUEUE_TAG; - break; - case MSG_SIMPLE_Q_TAG: - mf->flags |= I2O_SCB_FLAG_SIMPLE_QUEUE_TAG; - break; - case MSG_HEAD_OF_Q_TAG: - mf->flags |= I2O_SCB_FLAG_HEAD_QUEUE_TAG; - break; - default: - break; - } -#endif - - if (xs->datalen != 0) { - error = iop_msg_map_bio(iop, im, mb, xs->data, - xs->datalen, (xs->flags & SCSI_DATA_OUT) == 0); - if (error) { - xs->error = XS_DRIVER_STUFFUP; - iop_msg_free(iop, im); - scsi_done(xs); - return; - } - if ((xs->flags & SCSI_DATA_IN) == 0) - mf->flags |= I2O_SCB_FLAG_XFER_TO_DEVICE; - else - mf->flags |= I2O_SCB_FLAG_XFER_FROM_DEVICE; - } - - s = splbio(); - sc->sc_curqd++; - splx(s); - - if (iop_msg_post(iop, im, mb, xs->timeout)) { - s = splbio(); - sc->sc_curqd--; - splx(s); - if (xs->datalen != 0) - iop_msg_unmap(iop, im); - iop_msg_free(iop, im); - xs->error = XS_DRIVER_STUFFUP; - scsi_done(xs); - } -} - -#ifdef notyet -/* - * Abort the specified I2O_SCSI_SCB_EXEC message and its associated SCB. - */ -int -iopsp_scsi_abort(struct iopsp_softc *sc, int atid, struct iop_msg *aim) -{ - struct iop_msg *im; - struct i2o_scsi_scb_abort mf; - struct iop_softc *iop; - int rv, s; - - iop = (struct iop_softc *)sc->sc_dv.dv_parent; - im = iop_msg_alloc(iop, &sc->sc_ii, IM_POLL); - - mf.msgflags = I2O_MSGFLAGS(i2o_scsi_scb_abort); - mf.msgfunc = I2O_MSGFUNC(atid, I2O_SCSI_SCB_ABORT); - mf.msgictx = sc->sc_ii.ii_ictx; - mf.msgtctx = im->im_tctx; - mf.tctxabort = aim->im_tctx; - - s = splbio(); - rv = iop_msg_post(iop, im, &mf, 30000); - splx(s); - iop_msg_free(iop, im); - return (rv); -} -#endif - -/* - * We have a message which has been processed and replied to by the IOP - - * deal with it. - */ -void -iopsp_intr(struct device *dv, struct iop_msg *im, void *reply) -{ - struct scsi_xfer *xs; - struct iopsp_softc *sc; - struct i2o_scsi_reply *rb; - struct iop_softc *iop; - u_int sl; - - sc = (struct iopsp_softc *)dv; - xs = (struct scsi_xfer *)im->im_dvcontext; - iop = (struct iop_softc *)dv->dv_parent; - rb = reply; - - SC_DEBUG(xs->sc_link, SDEV_DB2, ("iopsp_intr\n")); - - if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0) { - xs->error = XS_DRIVER_STUFFUP; - xs->resid = xs->datalen; - } else { - if (rb->hbastatus != I2O_SCSI_DSC_SUCCESS) { - switch (rb->hbastatus) { - case I2O_SCSI_DSC_ADAPTER_BUSY: - case I2O_SCSI_DSC_SCSI_BUS_RESET: - case I2O_SCSI_DSC_BUS_BUSY: - xs->error = XS_BUSY; - break; - case I2O_SCSI_DSC_SELECTION_TIMEOUT: - xs->error = XS_SELTIMEOUT; - break; - case I2O_SCSI_DSC_COMMAND_TIMEOUT: - case I2O_SCSI_DSC_DEVICE_NOT_PRESENT: - case I2O_SCSI_DSC_LUN_INVALID: - case I2O_SCSI_DSC_SCSI_TID_INVALID: - xs->error = XS_TIMEOUT; - break; - default: - xs->error = XS_DRIVER_STUFFUP; - break; - } - printf("%s: HBA status 0x%02x\n", sc->sc_dv.dv_xname, - rb->hbastatus); - } else if (rb->scsistatus != SCSI_OK) { - switch (rb->scsistatus) { - case SCSI_CHECK: - xs->error = XS_SENSE; - sl = letoh32(rb->senselen); - if (sl > sizeof(xs->sense)) - sl = sizeof(xs->sense); - bcopy(rb->sense, &xs->sense, sl); - break; - case SCSI_QUEUE_FULL: - case SCSI_BUSY: - xs->error = XS_BUSY; - break; - default: - xs->error = XS_DRIVER_STUFFUP; - break; - } - } else - xs->error = XS_NOERROR; - - xs->resid = xs->datalen - letoh32(rb->datalen); - xs->status = rb->scsistatus; - } - - /* Free the message wrapper and pass the news to scsi. */ - if (xs->datalen != 0) - iop_msg_unmap(iop, im); - iop_msg_free(iop, im); - - if (--sc->sc_curqd == sc->sc_link.openings) - wakeup(&sc->sc_curqd); - - scsi_done(xs); -} - -/* - * The number of openings available to us has changed, so inform scsi. - */ -void -iopsp_adjqparam(struct device *dv, int mpi) -{ - struct iopsp_softc *sc = (struct iopsp_softc *)dv; - int s; - - s = splbio(); - sc->sc_link.openings = mpi; - if (mpi < sc->sc_curqd) - tsleep(&sc->sc_curqd, PWAIT, "iopspdrn", 0); - splx(s); -} diff --git a/sys/dev/i2o/iopspvar.h b/sys/dev/i2o/iopspvar.h deleted file mode 100644 index b1f146a2e45..00000000000 --- a/sys/dev/i2o/iopspvar.h +++ /dev/null @@ -1,67 +0,0 @@ -/* $OpenBSD: iopspvar.h,v 1.3 2008/06/26 05:42:15 ray Exp $ */ -/* $NetBSD$ */ - -/*- - * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _I2O_IOPSPVAR_H_ -#define _I2O_IOPSPVAR_H_ - -#define IOPSP_MAX_LUN 8 -#define IOPSP_MAX_SCSI_TARGET 15 -#define IOPSP_MAX_FCAL_TARGET 127 - -#define IOPSP_TIDMAP(map, t, l) (map[(t) * IOPSP_MAX_LUN + (l)]) -#define IOPSP_TID_ABSENT 0x0000 /* Device is absent */ -#define IOPSP_TID_INUSE 0xffff /* Device in use by another module */ - -#ifdef I2OVERBOSE -struct iopsp_target { - u_int8_t it_width; - u_int8_t it_syncrate; - u_int8_t it_offset; - u_int8_t it_flags; -}; -#define IT_PRESENT 0x01 /* Target is present */ -#endif - -struct iopsp_softc { - struct device sc_dv; - struct scsi_link sc_link; - struct iop_initiator sc_ii; - - u_short *sc_tidmap; /* Target/LUN -> TID map */ - u_int sc_chgind; /* Last LCT change # */ - u_int sc_curqd; /* Current queue depth */ -#ifdef I2OVERBOSE - struct iopsp_target *sc_targetmap; /* Target information */ -#endif -}; - -#endif /* !_I2O_IOPSPVAR_H_ */ diff --git a/sys/dev/i2o/iopvar.h b/sys/dev/i2o/iopvar.h deleted file mode 100644 index 13ebdc51320..00000000000 --- a/sys/dev/i2o/iopvar.h +++ /dev/null @@ -1,190 +0,0 @@ -/* $OpenBSD: iopvar.h,v 1.11 2013/05/30 16:15:02 deraadt Exp $ */ -/* $NetBSD: iopvar.h,v 1.5 2001/03/20 13:01:49 ad Exp $ */ - -/*- - * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _I2O_IOPVAR_H_ -#define _I2O_IOPVAR_H_ - -#include <sys/rwlock.h> - -/* - * Transfer descriptor. - */ -struct iop_xfer { - bus_dmamap_t ix_map; - u_int ix_size; - u_int ix_flags; -}; -#define IX_IN 0x0001 /* Data transfer from IOP */ -#define IX_OUT 0x0002 /* Data transfer to IOP */ - -/* - * Message wrapper. - */ -struct iop_msg { - SLIST_ENTRY(iop_msg) im_chain; /* Next free message */ - u_int im_flags; /* Control flags */ - u_int im_tctx; /* Transaction context */ - void *im_dvcontext; /* Un*x device context */ - struct i2o_reply *im_rb; /* Reply buffer */ - u_int im_reqstatus; /* Status from reply */ - struct iop_xfer im_xfer[IOP_MAX_MSG_XFERS]; -}; -#define IM_SYSMASK 0x00ff -#define IM_REPLIED 0x0001 /* Message has been replied to */ -#define IM_ALLOCED 0x0002 /* This message wrapper is allocated */ -#define IM_SGLOFFADJ 0x0004 /* S/G list offset adjusted */ -#define IM_DISCARD 0x0008 /* Discard message wrapper once sent */ -#define IM_FAIL 0x0010 /* Transaction error returned */ - -#define IM_USERMASK 0xff00 -#define IM_WAIT 0x0100 /* Wait (sleep) for completion */ -#define IM_POLL 0x0200 /* Wait (poll) for completion */ -#define IM_NOSTATUS 0x0400 /* Don't check status if waiting */ -#define IM_POLL_INTR 0x0800 /* Do send interrupt when polling */ - -struct iop_initiator { - LIST_ENTRY(iop_initiator) ii_list; - LIST_ENTRY(iop_initiator) ii_hash; - - void (*ii_intr)(struct device *, struct iop_msg *, void *); - int (*ii_reconfig)(struct device *); - void (*ii_adjqparam)(struct device *, int); - - struct device *ii_dv; - int ii_flags; - int ii_ictx; /* Initiator context */ - int ii_tid; -}; -#define II_DISCARD 0x0001 /* Don't track state; discard msg wrappers */ -#define II_CONFIGURED 0x0002 /* Already configured */ -#define II_UTILITY 0x0004 /* Utility initiator (not a real device) */ - -#define IOP_ICTX 0 -#define IOP_INIT_CODE 0x80 - -/* - * Parameter group op (for async parameter retrievals). - */ -struct iop_pgop { - struct i2o_param_op_list_header olh; - struct i2o_param_op_all_template oat; -} __packed; - -/* - * Per-IOP context. - */ -struct iop_softc { - struct device sc_dv; /* generic device data */ - bus_space_handle_t sc_ioh; /* bus space handle */ - bus_space_tag_t sc_iot; /* bus space tag */ - bus_dma_tag_t sc_dmat; /* bus DMA tag */ - void *sc_ih; /* interrupt handler cookie */ - struct rwlock sc_conflock; /* autoconfiguration lock */ - bus_addr_t sc_memaddr; /* register window address */ - bus_size_t sc_memsize; /* register window size */ - - struct i2o_hrt *sc_hrt; /* hardware resource table */ - struct iop_tidmap *sc_tidmap; /* tid map (per-lct-entry flags) */ - struct i2o_lct *sc_lct; /* logical configuration table */ - int sc_nlctent; /* number of LCT entries */ - int sc_flags; /* IOP-wide flags */ - int sc_maxib; - int sc_maxob; - int sc_curib; - u_int32_t sc_chgind; /* autoconfig vs. LCT change ind. */ - LIST_HEAD(, iop_initiator) sc_iilist;/* initiator list */ - int sc_nii; - int sc_nuii; - struct iop_initiator sc_eventii;/* IOP event handler */ - struct proc *sc_reconf_proc;/* reconfiguration process */ - struct iop_msg *sc_ims; - SLIST_HEAD(, iop_msg) sc_im_freelist; - caddr_t sc_ptb; - bus_dmamap_t sc_scr_dmamap; /* Scratch DMA map */ - bus_dma_segment_t sc_scr_seg[1];/* Scratch DMA segment */ - caddr_t sc_scr; /* Scratch memory va */ - - /* - * Reply queue. - */ - bus_dmamap_t sc_rep_dmamap; - int sc_rep_size; - bus_addr_t sc_rep_phys; - caddr_t sc_rep; - - bus_space_tag_t sc_bus_memt; - bus_space_tag_t sc_bus_iot; - - struct i2o_status sc_status; /* status */ -}; -#define IOP_OPEN 0x01 /* Device interface open */ -#define IOP_HAVESTATUS 0x02 /* Successfully retrieved status */ -#define IOP_ONLINE 0x04 /* Can use ioctl interface */ - -#define IOPCF_TID 0 -#define IOPCF_TID_DEFAULT -1 - -struct iop_attach_args { - int ia_class; /* device class */ - int ia_tid; /* target ID */ -}; -#define iopcf_tid cf_loc[IOPCF_TID] /* TID */ - -void iop_init(struct iop_softc *, const char *); -int iop_intr(void *); -int iop_lct_get(struct iop_softc *); -int iop_param_op(struct iop_softc *, int, struct iop_initiator *, int, - int, void *, size_t); -int iop_print_ident(struct iop_softc *, int); -int iop_simple_cmd(struct iop_softc *, int, int, int, int, int); -void iop_strvis(struct iop_softc *, const char *, int, char *, int); -void iop_shutdown(void *); - -void iop_initiator_register(struct iop_softc *, struct iop_initiator *); -void iop_initiator_unregister(struct iop_softc *, struct iop_initiator *); - -struct iop_msg *iop_msg_alloc(struct iop_softc *, struct iop_initiator *, - int); -void iop_msg_free(struct iop_softc *, struct iop_msg *); -int iop_msg_map(struct iop_softc *, struct iop_msg *, u_int32_t *, void *, - size_t, int); -int iop_msg_map_bio(struct iop_softc *, struct iop_msg *, u_int32_t *, - void *, int, int); -int iop_msg_post(struct iop_softc *, struct iop_msg *, void *, int); -void iop_msg_unmap(struct iop_softc *, struct iop_msg *); - -int iop_util_abort(struct iop_softc *, struct iop_initiator *, int, int, - int); -int iop_util_claim(struct iop_softc *, struct iop_initiator *, int, int); -int iop_util_eventreg(struct iop_softc *, struct iop_initiator *, int); - -#endif /* !_I2O_IOPVAR_H_ */ diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci index 3709413caaf..2a1847ca64a 100644 --- a/sys/dev/pci/files.pci +++ b/sys/dev/pci/files.pci @@ -1,4 +1,4 @@ -# $OpenBSD: files.pci,v 1.298 2013/10/28 12:33:32 mpi Exp $ +# $OpenBSD: files.pci,v 1.299 2013/11/04 14:07:14 deraadt Exp $ # $NetBSD: files.pci,v 1.20 1996/09/24 17:47:15 christos Exp $ # # Config file and device description for machine-independent PCI code. @@ -107,10 +107,6 @@ device ips: scsi attach ips at pci file dev/pci/ips.c ips -# I2O -attach iop at pci with iop_pci -file dev/pci/iop_pci.c iop_pci - # Ensoniq AudioPCI S5016, 1371 device eap: audio, auconv, mulaw, ac97, midibus attach eap at pci diff --git a/sys/dev/pci/iop_pci.c b/sys/dev/pci/iop_pci.c deleted file mode 100644 index a92ca464b87..00000000000 --- a/sys/dev/pci/iop_pci.c +++ /dev/null @@ -1,171 +0,0 @@ -/* $OpenBSD: iop_pci.c,v 1.9 2013/05/30 16:15:02 deraadt Exp $ */ -/* $NetBSD: iop_pci.c,v 1.4 2001/03/20 13:21:00 ad Exp $ */ - -/*- - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Andrew Doran. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * PCI front-end for `iop' driver. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/device.h> -#include <sys/queue.h> - -#include <machine/endian.h> -#include <machine/bus.h> - -#include <dev/pci/pcidevs.h> -#include <dev/pci/pcivar.h> - -#include <dev/i2o/i2o.h> -#include <dev/i2o/iopreg.h> -#include <dev/i2o/iopio.h> -#include <dev/i2o/iopvar.h> - -#define PCI_INTERFACE_I2O_POLLED 0x00 -#define PCI_INTERFACE_I2O_INTRDRIVEN 0x01 - -void iop_pci_attach(struct device *, struct device *, void *); -int iop_pci_match(struct device *, void *, void *); -int iop_activate(struct device *, int); - -struct cfattach iop_pci_ca = { - sizeof(struct iop_softc), iop_pci_match, iop_pci_attach, - NULL, iop_activate -}; - -int -iop_pci_match(parent, match, aux) - struct device *parent; - void *match; - void *aux; -{ - struct pci_attach_args *pa; - - pa = aux; - - /* - * Look for an "intelligent I/O processor" that adheres to the I2O - * specification. Ignore the device if it doesn't support interrupt - * driven operation. - */ - if (PCI_CLASS(pa->pa_class) == PCI_CLASS_I2O && - PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_I2O_STANDARD && - PCI_INTERFACE(pa->pa_class) == PCI_INTERFACE_I2O_INTRDRIVEN) - return (1); - - return (0); -} - -void -iop_pci_attach(struct device *parent, struct device *self, void *aux) -{ - struct pci_attach_args *pa; - struct iop_softc *sc; - pci_chipset_tag_t pc; - pci_intr_handle_t ih; - const char *intrstr; - pcireg_t reg; - int i; - - sc = (struct iop_softc *)self; - pa = (struct pci_attach_args *)aux; - pc = pa->pa_pc; - - /* - * The kernel always uses the first memory mapping to communicate - * with the IOP. - */ - for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) { - reg = pci_conf_read(pc, pa->pa_tag, i); - if (PCI_MAPREG_TYPE(reg) == PCI_MAPREG_TYPE_MEM) - break; - } - if (i == PCI_MAPREG_END) { - printf(": can't find mapping\n"); - return; - } - - /* Map the register window. */ - if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_MEM, 0, &sc->sc_iot, - &sc->sc_ioh, NULL, NULL, 0x40000)) { - printf(": can't map register window\n"); - return; - } - - sc->sc_dmat = pa->pa_dmat; - sc->sc_bus_memt = pa->pa_memt; - sc->sc_bus_iot = pa->pa_iot; - - /* Map and establish the interrupt. XXX IPL_BIO. */ - if (pci_intr_map(pa, &ih)) { - printf(": can't map interrupt\n"); - return; - } - intrstr = pci_intr_string(pc, ih); - sc->sc_ih = pci_intr_establish(pc, ih, IPL_BIO, iop_intr, sc, - sc->sc_dv.dv_xname); - if (sc->sc_ih == NULL) { - printf(": can't establish interrupt"); - if (intrstr != NULL) - printf(" at %s", intrstr); - printf("\n"); - return; - } - - /* Attach to the bus-independent code. */ - iop_init(sc, intrstr); -} - -int -iop_activate(struct device *self, int act) -{ - int ret = 0; - - switch (act) { - case DVACT_QUIESCE: - ret = config_activate_children(self, act); - break; - case DVACT_SUSPEND: - ret = config_activate_children(self, act); - break; - case DVACT_POWERDOWN: - ret = config_activate_children(self, act); - iop_shutdown(self); - break; - case DVACT_RESUME: - ret = config_activate_children(self, act); - break; - } - - return (ret); -} diff --git a/sys/sys/conf.h b/sys/sys/conf.h index 13794b1a16a..4ee9cd73529 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: conf.h,v 1.125 2013/08/20 14:27:32 ajacoutot Exp $ */ +/* $OpenBSD: conf.h,v 1.126 2013/11/04 14:07:15 deraadt Exp $ */ /* $NetBSD: conf.h,v 1.33 1996/05/03 20:03:32 christos Exp $ */ /*- @@ -418,13 +418,6 @@ extern struct cdevsw cdevsw[]; (dev_type_stop((*))) enodev, 0, selfalse, \ (dev_type_mmap((*))) enodev } -/* open, close, init */ -#define cdev_iop_init(c,n) { \ - dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ - (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ - (dev_type_stop((*))) enodev, 0, selfalse, \ - (dev_type_mmap((*))) enodev } - /* open, close, ioctl */ #define cdev_radio_init(c,n) { \ dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ @@ -481,13 +474,6 @@ extern struct cdevsw cdevsw[]; (dev_type_stop((*))) enodev, 0, selfalse, \ (dev_type_mmap((*))) enodev } -/* open, close, ioctl */ -#define cdev_bthub_init(c,n) { \ - dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ - (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ - (dev_type_stop((*))) enodev, 0, selfalse, \ - (dev_type_mmap((*))) enodev } - /* open, close, ioctl, mmap */ #define cdev_agp_init(c,n) { \ dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ @@ -598,11 +584,6 @@ bdev_decl(sw); bdev_decl(vnd); cdev_decl(vnd); -bdev_decl(raid); -cdev_decl(raid); - -cdev_decl(iop); - cdev_decl(ch); bdev_decl(sd); @@ -646,7 +627,6 @@ cdev_decl(systrace); cdev_decl(bio); cdev_decl(vscsi); -cdev_decl(bthub); cdev_decl(gpr); cdev_decl(bktr); |