git: 60de2867c9fc - main - amr: remove

From: Warner Losh <imp_at_FreeBSD.org>
Date: Thu, 25 Nov 2021 07:46:55 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=60de2867c9fccac5ee3782fcc64fea6f0ae3ef06

commit 60de2867c9fccac5ee3782fcc64fea6f0ae3ef06
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2021-11-25 07:20:51 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2021-11-25 07:45:12 +0000

    amr: remove
    
    Belatedly remove amr(4). It was slated to depart before 13.0 but was
    overlooked until now.
    
    Sponsored by:           Netflix
    Relnotes:               yes
    Reviewed by:            scottl
    Differential Revision:  https://reviews.freebsd.org/D33113
---
 share/man/man4/amr.4                    |  246 ----
 sys/amd64/conf/GENERIC                  |    1 -
 sys/conf/NOTES                          |    2 -
 sys/conf/files                          |    4 -
 sys/dev/amr/amr.c                       | 2446 -------------------------------
 sys/dev/amr/amr_cam.c                   |  627 --------
 sys/dev/amr/amr_disk.c                  |  267 ----
 sys/dev/amr/amr_linux.c                 |   87 --
 sys/dev/amr/amr_pci.c                   |  705 ---------
 sys/dev/amr/amr_tables.h                |  141 --
 sys/dev/amr/amrio.h                     |  124 --
 sys/dev/amr/amrreg.h                    |  657 ---------
 sys/dev/amr/amrvar.h                    |  384 -----
 sys/i386/conf/GENERIC                   |    1 -
 sys/modules/Makefile                    |    1 -
 sys/modules/amr/Makefile                |   21 -
 sys/modules/amr/amr_cam/Makefile        |    9 -
 sys/modules/amr/amr_linux/Makefile      |    8 -
 tools/kerneldoc/subsys/Doxyfile-dev_amr |   21 -
 19 files changed, 5752 deletions(-)

diff --git a/share/man/man4/amr.4 b/share/man/man4/amr.4
deleted file mode 100644
index 8ef14dfd1d9b..000000000000
--- a/share/man/man4/amr.4
+++ /dev/null
@@ -1,246 +0,0 @@
-.\"
-.\" Copyright (c) 2000 Jeroen Ruigrok van der Werven
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. The name of the author may not be used to endorse or promote products
-.\"    derived from this software without specific prior written permission
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd March 29, 2006
-.Dt AMR 4
-.Os
-.Sh NAME
-.Nm amr
-.Nd MegaRAID SCSI/ATA/SATA RAID driver
-.Sh SYNOPSIS
-To compile this driver into the kernel,
-place the following lines in your
-kernel configuration file:
-.Bd -ragged -offset indent
-.Cd "device pci"
-.Cd "device scbus"
-.Cd "device amr"
-.Ed
-.Pp
-Alternatively, to load the driver as a
-module at boot time, place the following line in
-.Xr loader.conf 5 :
-.Bd -literal -offset indent
-amr_load="YES"
-.Ed
-.Sh DEPRECATION NOTICE
-The
-.Nm
-driver is not present in
-.Fx 13.0 .
-.Sh DESCRIPTION
-The
-.Nm
-driver provides support for LSI Logic MegaRAID SCSI, ATA and SATA
-RAID controllers and legacy American Megatrends MegaRAID
-SCSI RAID controllers, including models relabeled
-and sold by Dell and Hewlett-Packard.
-.Pp
-LSI MegaRAID SAS controllers are supported by
-.Xr mfi 4
-and will not work with this driver.
-.Sh HARDWARE
-Controllers supported by the
-.Nm
-driver include:
-.Pp
-.Bl -bullet -compact
-.It
-MegaRAID SATA 150-4
-.It
-MegaRAID SATA 150-6
-.It
-MegaRAID SATA 300-4X
-.It
-MegaRAID SATA 300-8X
-.It
-MegaRAID SCSI 320-1E
-.It
-MegaRAID SCSI 320-2E
-.It
-MegaRAID SCSI 320-4E
-.It
-MegaRAID SCSI 320-0X
-.It
-MegaRAID SCSI 320-2X
-.It
-MegaRAID SCSI 320-4X
-.It
-MegaRAID SCSI 320-0
-.It
-MegaRAID SCSI 320-1
-.It
-MegaRAID SCSI 320-2
-.It
-MegaRAID SCSI 320-4
-.It
-MegaRAID Series 418
-.It
-MegaRAID i4 133 RAID
-.It
-MegaRAID Elite 1500 (Series 467)
-.It
-MegaRAID Elite 1600 (Series 493)
-.It
-MegaRAID Elite 1650 (Series 4xx)
-.It
-MegaRAID Enterprise 1200 (Series 428)
-.It
-MegaRAID Enterprise 1300 (Series 434)
-.It
-MegaRAID Enterprise 1400 (Series 438)
-.It
-MegaRAID Enterprise 1500 (Series 467)
-.It
-MegaRAID Enterprise 1600 (Series 471)
-.It
-MegaRAID Express 100 (Series 466WS)
-.It
-MegaRAID Express 200 (Series 466)
-.It
-MegaRAID Express 300 (Series 490)
-.It
-MegaRAID Express 500 (Series 475)
-.It
-Dell PERC
-.It
-Dell PERC 2/SC
-.It
-Dell PERC 2/DC
-.It
-Dell PERC 3/DCL
-.It
-Dell PERC 3/QC
-.It
-Dell PERC 4/DC
-.It
-Dell PERC 4/IM
-.It
-Dell PERC 4/SC
-.It
-Dell PERC 4/Di
-.It
-Dell PERC 4e/DC
-.It
-Dell PERC 4e/Di
-.It
-Dell PERC 4e/Si
-.It
-Dell PERC 4ei
-.It
-HP NetRAID-1/Si
-.It
-HP NetRAID-3/Si (D4943A)
-.It
-HP Embedded NetRAID
-.It
-Intel RAID Controller SRCS16
-.It
-Intel RAID Controller SRCU42X
-.El
-.Sh DIAGNOSTICS
-.Ss Driver initialisation/shutdown phase
-.Bl -diag
-.It amr%d: memory window not available
-.It amr%d: I/O window not available
-.Pp
-The PCI BIOS did not allocate resources necessary for the correct operation of
-the controller.
-The driver cannot attach to this controller.
-.It amr%d: busmaster bit not set, enabling
-.Pp
-The PCI BIOS did not enable busmaster DMA,
-which is required for the correct operation of the controller.
-The driver has enabled this bit and initialisation will proceed.
-.It amr%d: can't allocate register window
-.It amr%d: can't allocate interrupt
-.It amr%d: can't set up interrupt
-.It amr%d: can't allocate parent DMA tag
-.It amr%d: can't allocate buffer DMA tag
-.It amr%d: can't allocate scatter/gather DMA tag
-.It amr%d: can't allocate s/g table
-.It amr%d: can't allocate mailbox tag
-.It amr%d: can't allocate mailbox memory
-.Pp
-A resource allocation error occurred while initialising the driver;
-initialisation has failed and the driver will not attach to this controller.
-.It amr%d: can't obtain configuration data from controller
-.It amr%d: can't obtain product data from controller
-.Pp
-The driver was unable to obtain vital configuration data from the controller.
-Initialisation has failed and the driver will not attach to this controller.
-.It amr%d: can't establish configuration hook
-.It amr%d: can't scan controller for drives
-.Pp
-The scan for logical drives managed by the controller failed.
-No drives will be attached.
-.It amr%d: device_add_child failed
-.It amr%d: bus_generic_attach returned %d
-.Pp
-Creation of the logical drive instances failed;
-attachment of one or more logical drives may have been aborted.
-.It amr%d: flushing cache...
-.Pp
-The controller cache is being flushed prior to shutdown or detach.
-.El
-.Ss Operational diagnostics
-.Bl -diag
-.It amr%d: I/O beyond end of unit (%u,%d > %u)
-.Pp
-A partitioning error or disk corruption has caused an I/O request
-beyond the end of the logical drive.
-This may also occur if FlexRAID Virtual Sizing is enabled and
-an I/O operation is attempted on a portion of the virtual drive
-beyond the actual capacity available.
-.It amr%d: polled command timeout
-.Pp
-An initialisation command timed out.
-The initialisation process may fail as a result.
-.It amr%d: bad slot %d completed
-.Pp
-The controller reported completion of a command that the driver did not issue.
-This may result in data corruption,
-and suggests a hardware or firmware problem with the system or controller.
-.It amr%d: I/O error - %x
-.Pp
-An I/O error has occurred.
-.El
-.Sh SEE ALSO
-.Xr cd 4 ,
-.Xr da 4 ,
-.Xr mfi 4 ,
-.Xr sa 4 ,
-.Xr scsi 4
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-driver was written by
-.An Mike Smith Aq Mt msmith@FreeBSD.org .
-.Pp
-This manual page was written by
-.An Mike Smith Aq Mt msmith@FreeBSD.org
-and
-.An Jeroen Ruigrok van der Werven Aq Mt asmodai@FreeBSD.org .
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC
index afd386f5913e..9d15833e472a 100644
--- a/sys/amd64/conf/GENERIC
+++ b/sys/amd64/conf/GENERIC
@@ -180,7 +180,6 @@ device		ses			# Enclosure Services (SES and SAF-TE)
 #device		ctl			# CAM Target Layer
 
 # RAID controllers interfaced to the SCSI subsystem
-device		amr			# AMI MegaRAID
 device		arcmsr			# Areca SATA II RAID
 device		ciss			# Compaq Smart RAID 5*
 device		ips			# IBM (Adaptec) ServeRAID
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index 2221f8feb7dd..f0546dfca101 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -1642,8 +1642,6 @@ device		ciss
 #
 device		ida		# Compaq Smart RAID
 device		mlx		# Mylex DAC960
-device		amr		# AMI MegaRAID
-device		amrp		# SCSI Passthrough interface (optional, CAM req.)
 device		mfi		# LSI MegaRAID SAS
 device		mfip		# LSI MegaRAID SAS passthrough, requires CAM
 options 	MFI_DEBUG
diff --git a/sys/conf/files b/sys/conf/files
index 637aed6bfb9c..650887cf54e6 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -890,10 +890,6 @@ dev/altera/pio/pio.c		optional altera_pio
 dev/altera/pio/pio_if.m		optional altera_pio
 dev/amdpm/amdpm.c		optional amdpm pci | nfpm pci
 dev/amdsmb/amdsmb.c		optional amdsmb pci
-dev/amr/amr.c			optional amr
-dev/amr/amr_cam.c		optional amrp amr
-dev/amr/amr_disk.c		optional amr
-dev/amr/amr_pci.c		optional amr pci
 #
 dev/ata/ata_if.m		optional ata | atacore
 dev/ata/ata-all.c		optional ata | atacore
diff --git a/sys/dev/amr/amr.c b/sys/dev/amr/amr.c
deleted file mode 100644
index 1c4f252345e9..000000000000
--- a/sys/dev/amr/amr.c
+++ /dev/null
@@ -1,2446 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 1999,2000 Michael Smith
- * Copyright (c) 2000 BSDi
- * Copyright (c) 2005 Scott Long
- * 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) 2002 Eric Moore
- * Copyright (c) 2002, 2004 LSI Logic Corporation
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The party using or redistributing the source code and binary forms
- *    agrees to the disclaimer below and the terms and conditions set forth
- *    herein.
- *
- * 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.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Driver for the AMI MegaRaid family of controllers.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/proc.h>
-#include <sys/sysctl.h>
-
-#include <sys/bio.h>
-#include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/stat.h>
-
-#include <machine/bus.h>
-#include <machine/cpu.h>
-#include <machine/resource.h>
-#include <sys/rman.h>
-
-#include <dev/pci/pcireg.h>
-#include <dev/pci/pcivar.h>
-
-#include <dev/amr/amrio.h>
-#include <dev/amr/amrreg.h>
-#include <dev/amr/amrvar.h>
-#define AMR_DEFINE_TABLES
-#include <dev/amr/amr_tables.h>
-
-SYSCTL_NODE(_hw, OID_AUTO, amr, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
-    "AMR driver parameters");
-
-static d_open_t         amr_open;
-static d_close_t        amr_close;
-static d_ioctl_t        amr_ioctl;
-
-static struct cdevsw amr_cdevsw = {
-	.d_version =	D_VERSION,
-	.d_flags =	D_NEEDGIANT,
-	.d_open =	amr_open,
-	.d_close =	amr_close,
-	.d_ioctl =	amr_ioctl,
-	.d_name =	"amr",
-};
-
-int linux_no_adapter = 0;
-/*
- * Initialisation, bus interface.
- */
-static void	amr_startup(void *arg);
-
-/*
- * Command wrappers
- */
-static int	amr_query_controller(struct amr_softc *sc);
-static void	*amr_enquiry(struct amr_softc *sc, size_t bufsize, 
-			     u_int8_t cmd, u_int8_t cmdsub, u_int8_t cmdqual, int *status);
-static void	amr_completeio(struct amr_command *ac);
-static int	amr_support_ext_cdb(struct amr_softc *sc);
-
-/*
- * Command buffer allocation.
- */
-static void	amr_alloccmd_cluster(struct amr_softc *sc);
-static void	amr_freecmd_cluster(struct amr_command_cluster *acc);
-
-/*
- * Command processing.
- */
-static int	amr_bio_command(struct amr_softc *sc, struct amr_command **acp);
-static int	amr_wait_command(struct amr_command *ac) __unused;
-static int	amr_mapcmd(struct amr_command *ac);
-static void	amr_unmapcmd(struct amr_command *ac);
-static int	amr_start(struct amr_command *ac);
-static void	amr_complete(void *context, ac_qhead_t *head);
-static void	amr_setup_sg(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
-static void	amr_setup_data(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
-static void	amr_setup_ccb(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
-static void	amr_abort_load(struct amr_command *ac);
-
-/*
- * Interface-specific shims
- */
-static int	amr_quartz_submit_command(struct amr_command *ac);
-static int	amr_quartz_get_work(struct amr_softc *sc, struct amr_mailbox *mbsave);
-static int	amr_quartz_poll_command(struct amr_command *ac);
-static int	amr_quartz_poll_command1(struct amr_softc *sc, struct amr_command *ac);
-
-static int	amr_std_submit_command(struct amr_command *ac);
-static int	amr_std_get_work(struct amr_softc *sc, struct amr_mailbox *mbsave);
-static int	amr_std_poll_command(struct amr_command *ac);
-static void	amr_std_attach_mailbox(struct amr_softc *sc);
-
-#ifdef AMR_BOARD_INIT
-static int	amr_quartz_init(struct amr_softc *sc);
-static int	amr_std_init(struct amr_softc *sc);
-#endif
-
-/*
- * Debugging
- */
-static void	amr_describe_controller(struct amr_softc *sc);
-#ifdef AMR_DEBUG
-#if 0
-static void	amr_printcommand(struct amr_command *ac);
-#endif
-#endif
-
-static void	amr_init_sysctl(struct amr_softc *sc);
-static int	amr_linux_ioctl_int(struct cdev *dev, u_long cmd, caddr_t addr,
-		    int32_t flag, struct thread *td);
-
-static MALLOC_DEFINE(M_AMR, "amr", "AMR memory");
-
-/********************************************************************************
- ********************************************************************************
-                                                                      Inline Glue
- ********************************************************************************
- ********************************************************************************/
-
-/********************************************************************************
- ********************************************************************************
-                                                                Public Interfaces
- ********************************************************************************
- ********************************************************************************/
-
-/********************************************************************************
- * Initialise the controller and softc.
- */
-int
-amr_attach(struct amr_softc *sc)
-{
-    device_t child;
-
-    debug_called(1);
-
-    /*
-     * Initialise per-controller queues.
-     */
-    amr_init_qhead(&sc->amr_freecmds);
-    amr_init_qhead(&sc->amr_ready);
-    TAILQ_INIT(&sc->amr_cmd_clusters);
-    bioq_init(&sc->amr_bioq);
-
-    debug(2, "queue init done");
-
-    /*
-     * Configure for this controller type.
-     */
-    if (AMR_IS_QUARTZ(sc)) {
-	sc->amr_submit_command = amr_quartz_submit_command;
-	sc->amr_get_work       = amr_quartz_get_work;
-	sc->amr_poll_command   = amr_quartz_poll_command;
-	sc->amr_poll_command1  = amr_quartz_poll_command1;
-    } else {
-	sc->amr_submit_command = amr_std_submit_command;
-	sc->amr_get_work       = amr_std_get_work;
-	sc->amr_poll_command   = amr_std_poll_command;
-	amr_std_attach_mailbox(sc);
-    }
-
-#ifdef AMR_BOARD_INIT
-    if ((AMR_IS_QUARTZ(sc) ? amr_quartz_init(sc) : amr_std_init(sc)))
-	return(ENXIO);
-#endif
-
-    /*
-     * Allocate initial commands.
-     */
-    amr_alloccmd_cluster(sc);
-
-    /*
-     * Quiz controller for features and limits.
-     */
-    if (amr_query_controller(sc))
-	return(ENXIO);
-
-    debug(2, "controller query complete");
-
-    /*
-     * preallocate the remaining commands.
-     */
-    while (sc->amr_nextslot < sc->amr_maxio)
-	amr_alloccmd_cluster(sc);
-
-    /*
-     * Setup sysctls.
-     */
-    amr_init_sysctl(sc);
-
-    /*
-     * Attach our 'real' SCSI channels to CAM.
-     */
-    child = device_add_child(sc->amr_dev, "amrp", -1);
-    sc->amr_pass = child;
-    if (child != NULL) {
-	device_set_softc(child, sc);
-	device_set_desc(child, "SCSI Passthrough Bus");
-	bus_generic_attach(sc->amr_dev);
-    }
-
-    /*
-     * Create the control device.
-     */
-    sc->amr_dev_t = make_dev(&amr_cdevsw, device_get_unit(sc->amr_dev), UID_ROOT, GID_OPERATOR,
-			     S_IRUSR | S_IWUSR, "amr%d", device_get_unit(sc->amr_dev));
-    sc->amr_dev_t->si_drv1 = sc;
-    linux_no_adapter++;
-    if (device_get_unit(sc->amr_dev) == 0)
-	make_dev_alias(sc->amr_dev_t, "megadev0");
-
-    /*
-     * Schedule ourselves to bring the controller up once interrupts are
-     * available.
-     */
-    bzero(&sc->amr_ich, sizeof(struct intr_config_hook));
-    sc->amr_ich.ich_func = amr_startup;
-    sc->amr_ich.ich_arg = sc;
-    if (config_intrhook_establish(&sc->amr_ich) != 0) {
-	device_printf(sc->amr_dev, "can't establish configuration hook\n");
-	return(ENOMEM);
-    }
-
-    /*
-     * Print a little information about the controller.
-     */
-    amr_describe_controller(sc);
-
-    debug(2, "attach complete");
-    return(0);
-}
-
-/********************************************************************************
- * Locate disk resources and attach children to them.
- */
-static void
-amr_startup(void *arg)
-{
-    struct amr_softc	*sc = (struct amr_softc *)arg;
-    struct amr_logdrive	*dr;
-    int			i, error;
-    
-    debug_called(1);
-
-    /* get up-to-date drive information */
-    if (amr_query_controller(sc)) {
-	device_printf(sc->amr_dev, "can't scan controller for drives\n");
-	return;
-    }
-
-    /* iterate over available drives */
-    for (i = 0, dr = &sc->amr_drive[0]; (i < AMR_MAXLD) && (dr->al_size != 0xffffffff); i++, dr++) {
-	/* are we already attached to this drive? */
-	if (dr->al_disk == 0) {
-	    /* generate geometry information */
-	    if (dr->al_size > 0x200000) {	/* extended translation? */
-		dr->al_heads = 255;
-		dr->al_sectors = 63;
-	    } else {
-		dr->al_heads = 64;
-		dr->al_sectors = 32;
-	    }
-	    dr->al_cylinders = dr->al_size / (dr->al_heads * dr->al_sectors);
-	    
-	    dr->al_disk = device_add_child(sc->amr_dev, NULL, -1);
-	    if (dr->al_disk == 0)
-		device_printf(sc->amr_dev, "device_add_child failed\n");
-	    device_set_ivars(dr->al_disk, dr);
-	}
-    }
-    
-    if ((error = bus_generic_attach(sc->amr_dev)) != 0)
-	device_printf(sc->amr_dev, "bus_generic_attach returned %d\n", error);
-    
-    /* mark controller back up */
-    sc->amr_state &= ~AMR_STATE_SHUTDOWN;
-
-    /* interrupts will be enabled before we do anything more */
-    sc->amr_state |= AMR_STATE_INTEN;
-
-    /* pull ourselves off the intrhook chain */
-    if (sc->amr_ich.ich_func)
-	config_intrhook_disestablish(&sc->amr_ich);
-    sc->amr_ich.ich_func = NULL;
-
-    return;
-}
-
-static void
-amr_init_sysctl(struct amr_softc *sc)
-{
-
-    SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->amr_dev),
-	SYSCTL_CHILDREN(device_get_sysctl_tree(sc->amr_dev)),
-	OID_AUTO, "allow_volume_configure", CTLFLAG_RW, &sc->amr_allow_vol_config, 0,
-	"");
-    SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->amr_dev),
-	SYSCTL_CHILDREN(device_get_sysctl_tree(sc->amr_dev)),
-	OID_AUTO, "nextslot", CTLFLAG_RD, &sc->amr_nextslot, 0,
-	"");
-    SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->amr_dev),
-	SYSCTL_CHILDREN(device_get_sysctl_tree(sc->amr_dev)),
-	OID_AUTO, "busyslots", CTLFLAG_RD, &sc->amr_busyslots, 0,
-	"");
-    SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->amr_dev),
-	SYSCTL_CHILDREN(device_get_sysctl_tree(sc->amr_dev)),
-	OID_AUTO, "maxio", CTLFLAG_RD, &sc->amr_maxio, 0,
-	"");
-}
-
-/*******************************************************************************
- * Free resources associated with a controller instance
- */
-void
-amr_free(struct amr_softc *sc)
-{
-    struct amr_command_cluster	*acc;
-
-    /* detach from CAM */
-    if (sc->amr_pass != NULL)
-	device_delete_child(sc->amr_dev, sc->amr_pass);
-
-    /* throw away any command buffers */
-    while ((acc = TAILQ_FIRST(&sc->amr_cmd_clusters)) != NULL) {
-	TAILQ_REMOVE(&sc->amr_cmd_clusters, acc, acc_link);
-	amr_freecmd_cluster(acc);
-    }
-
-    /* destroy control device */
-    if( sc->amr_dev_t != (struct cdev *)NULL)
-	    destroy_dev(sc->amr_dev_t);
-
-    if (mtx_initialized(&sc->amr_hw_lock))
-	mtx_destroy(&sc->amr_hw_lock);
-
-    if (mtx_initialized(&sc->amr_list_lock))
-	mtx_destroy(&sc->amr_list_lock);
-}
-
-/*******************************************************************************
- * Receive a bio structure from a child device and queue it on a particular
- * disk resource, then poke the disk resource to start as much work as it can.
- */
-int
-amr_submit_bio(struct amr_softc *sc, struct bio *bio)
-{
-    debug_called(2);
-
-    mtx_lock(&sc->amr_list_lock);
-    amr_enqueue_bio(sc, bio);
-    amr_startio(sc);
-    mtx_unlock(&sc->amr_list_lock);
-    return(0);
-}
-
-/********************************************************************************
- * Accept an open operation on the control device.
- */
-static int
-amr_open(struct cdev *dev, int flags, int fmt, struct thread *td)
-{
-    int			unit = dev2unit(dev);
-    struct amr_softc	*sc = devclass_get_softc(devclass_find("amr"), unit);
-
-    debug_called(1);
-
-    sc->amr_state |= AMR_STATE_OPEN;
-    return(0);
-}
-
-#ifdef LSI
-static int
-amr_del_ld(struct amr_softc *sc, int drv_no, int status)
-{
-
-    debug_called(1);
-
-    sc->amr_state &= ~AMR_STATE_QUEUE_FRZN;
-    sc->amr_state &= ~AMR_STATE_LD_DELETE;
-    sc->amr_state |= AMR_STATE_REMAP_LD;
-    debug(1, "State Set");
-
-    if (!status) {
-	debug(1, "disk begin destroyed %d",drv_no);
-	if (--amr_disks_registered == 0)
-	    cdevsw_remove(&amrddisk_cdevsw);
-	debug(1, "disk begin destroyed success");
-    }
-    return 0;
-}
-
-static int
-amr_prepare_ld_delete(struct amr_softc *sc)
-{
-    
-    debug_called(1);
-    if (sc->ld_del_supported == 0) 
-	return(ENOIOCTL);
-
-    sc->amr_state |= AMR_STATE_QUEUE_FRZN;
-    sc->amr_state |= AMR_STATE_LD_DELETE;
-
-    /* 5 minutes for the all the commands to be flushed.*/
-    tsleep((void *)&sc->ld_del_supported, PCATCH | PRIBIO,"delete_logical_drv",hz * 60 * 1);
-    if ( sc->amr_busyslots )	
-	return(ENOIOCTL);
-
-    return 0;
-}
-#endif
-
-/********************************************************************************
- * Accept the last close on the control device.
- */
-static int
-amr_close(struct cdev *dev, int flags, int fmt, struct thread *td)
-{
-    int			unit = dev2unit(dev);
-    struct amr_softc	*sc = devclass_get_softc(devclass_find("amr"), unit);
-
-    debug_called(1);
-
-    sc->amr_state &= ~AMR_STATE_OPEN;
-    return (0);
-}
-
-/********************************************************************************
- * Handle controller-specific control operations.
- */
-static void
-amr_rescan_drives(struct cdev *dev)
-{
-    struct amr_softc	*sc = (struct amr_softc *)dev->si_drv1;
-    int			i, error = 0;
-
-    sc->amr_state |= AMR_STATE_REMAP_LD;
-    while (sc->amr_busyslots) {
-	device_printf(sc->amr_dev, "idle controller\n");
-	amr_done(sc);
-    }
-
-    /* mark ourselves as in-shutdown */
-    sc->amr_state |= AMR_STATE_SHUTDOWN;
-
-    /* flush controller */
-    device_printf(sc->amr_dev, "flushing cache...");
-    printf("%s\n", amr_flush(sc) ? "failed" : "done");
-
-    /* delete all our child devices */
-    for(i = 0 ; i < AMR_MAXLD; i++) {
-	if(sc->amr_drive[i].al_disk != 0) {
-	    if((error = device_delete_child(sc->amr_dev,
-		sc->amr_drive[i].al_disk)) != 0)
-		goto shutdown_out;
-
-	     sc->amr_drive[i].al_disk = 0;
-	}
-    }
-
-shutdown_out:
-    amr_startup(sc);
-}
-
-/*
- * Bug-for-bug compatibility with Linux!
- * Some apps will send commands with inlen and outlen set to 0,
- * even though they expect data to be transferred to them from the
- * card.  Linux accidentally allows this by allocating a 4KB
- * buffer for the transfer anyways, but it then throws it away
- * without copying it back to the app.
- * 
- * The amr(4) firmware relies on this feature.  In fact, it assumes
- * the buffer is always a power of 2 up to a max of 64k.  There is
- * also at least one case where it assumes a buffer less than 16k is
- * greater than 16k.  However, forcing all buffers to a size of 32k
- * causes stalls in the firmware.  Force each command smaller than
- * 64k up to the next power of two except that commands between 8k
- * and 16k are rounded up to 32k instead of 16k.
- */
-static unsigned long
-amr_ioctl_buffer_length(unsigned long len)
-{
-
-    if (len <= 4 * 1024)
-	return (4 * 1024);
-    if (len <= 8 * 1024)
-	return (8 * 1024);
-    if (len <= 32 * 1024)
-	return (32 * 1024);
-    if (len <= 64 * 1024)
-	return (64 * 1024);
-    return (len);
-}
-
-int
-amr_linux_ioctl_int(struct cdev *dev, u_long cmd, caddr_t addr, int32_t flag,
-    struct thread *td)
-{
-    struct amr_softc		*sc = (struct amr_softc *)dev->si_drv1;
-    struct amr_command		*ac;
-    struct amr_mailbox		*mb;
-    struct amr_linux_ioctl	ali;
-    void			*dp, *temp;
-    int				error;
-    int				len, ac_flags = 0;
-    int				logical_drives_changed = 0;
-    u_int32_t			linux_version = 0x02100000;
-    u_int8_t			status;
-    struct amr_passthrough	*ap;	/* 60 bytes */
-
-    error = 0;
-    dp = NULL;
-    ac = NULL;
-    ap = NULL;
-
-    if ((error = copyin(addr, &ali, sizeof(ali))) != 0)
-	return (error);
-    switch (ali.ui.fcs.opcode) {
-    case 0x82:
-	switch(ali.ui.fcs.subopcode) {
-	case 'e':
-	    copyout(&linux_version, (void *)(uintptr_t)ali.data,
-		sizeof(linux_version));
-	    error = 0;
-	    break;
-
-	case 'm':
-	    copyout(&linux_no_adapter, (void *)(uintptr_t)ali.data,
-		sizeof(linux_no_adapter));
-	    td->td_retval[0] = linux_no_adapter;
-	    error = 0;
-	    break;
-
-	default:
-	    printf("Unknown subopcode\n");
-	    error = ENOIOCTL;
-	    break;
-	}
-    break;
-
-    case 0x80:
-    case 0x81:
-	if (ali.ui.fcs.opcode == 0x80)
-	    len = max(ali.outlen, ali.inlen);
-	else
-	    len = ali.ui.fcs.length;
-
-	mb = (void *)&ali.mbox[0];
-
-	if ((ali.mbox[0] == FC_DEL_LOGDRV  && ali.mbox[2] == OP_DEL_LOGDRV) ||	/* delete */
-	    (ali.mbox[0] == AMR_CMD_CONFIG && ali.mbox[2] == 0x0d)) {		/* create */
-	    if (sc->amr_allow_vol_config == 0) {
-		error = EPERM;
-		break;
-	    }
-	    logical_drives_changed = 1;
-	}
-
-	if (ali.mbox[0] == AMR_CMD_PASS) {
-	    mtx_lock(&sc->amr_list_lock); 
-	    while ((ac = amr_alloccmd(sc)) == NULL)
-		msleep(sc, &sc->amr_list_lock, PPAUSE, "amrioc", hz);
-	    mtx_unlock(&sc->amr_list_lock);
-	    ap = &ac->ac_ccb->ccb_pthru;
-
-	    error = copyin((void *)(uintptr_t)mb->mb_physaddr, ap,
-		sizeof(struct amr_passthrough));
-	    if (error)
-		break;
-
-	    if (ap->ap_data_transfer_length)
-		dp = malloc(ap->ap_data_transfer_length, M_AMR,
-		    M_WAITOK | M_ZERO);
-
-	    if (ali.inlen) {
-		error = copyin((void *)(uintptr_t)ap->ap_data_transfer_address,
-		    dp, ap->ap_data_transfer_length);
-		if (error)
-		    break;
-	    }
-
-	    ac_flags = AMR_CMD_DATAIN|AMR_CMD_DATAOUT|AMR_CMD_CCB;
-	    bzero(&ac->ac_mailbox, sizeof(ac->ac_mailbox));
-	    ac->ac_mailbox.mb_command = AMR_CMD_PASS;
-	    ac->ac_flags = ac_flags;
*** 4945 LINES SKIPPED ***