git: a9620045a5b9 - main - mly: Remove.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 25 Nov 2021 07:46:52 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=a9620045a5b91f2b86e7ab0f3d27c1030d1ecafc commit a9620045a5b91f2b86e7ab0f3d27c1030d1ecafc Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2021-11-25 07:20:10 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2021-11-25 07:45:12 +0000 mly: Remove. We'd said this was going away in 13, but was overlooked. Belatedly remove. Sponsored by: Netflix Relnotes: yes Reviewed by: scottl Differential Revision: https://reviews.freebsd.org/D33111 --- share/man/man4/Makefile | 1 - share/man/man4/mly.4 | 275 --- sys/amd64/conf/GENERIC | 1 - sys/conf/NOTES | 7 - sys/conf/files | 1 - sys/dev/mly/mly.c | 3003 ------------------------------- sys/dev/mly/mly_tables.h | 325 ---- sys/dev/mly/mlyio.h | 72 - sys/dev/mly/mlyreg.h | 1272 ------------- sys/dev/mly/mlyvar.h | 370 ---- sys/i386/conf/GENERIC | 1 - sys/modules/Makefile | 2 - sys/modules/mly/Makefile | 13 - tools/kerneldoc/subsys/Doxyfile-dev_mly | 21 - 14 files changed, 5364 deletions(-) diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index dfef254bff56..6bb519b36e1e 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -305,7 +305,6 @@ MAN= aac.4 \ mlx.4 \ mlx4en.4 \ mlx5en.4 \ - mly.4 \ mmc.4 \ mmcsd.4 \ mod_cc.4 \ diff --git a/share/man/man4/mly.4 b/share/man/man4/mly.4 deleted file mode 100644 index 1a59903dfb2c..000000000000 --- a/share/man/man4/mly.4 +++ /dev/null @@ -1,275 +0,0 @@ -.\" -.\" Copyright (c) 2000 Michael Smith -.\" Copyright (c) 2000 BSDi -.\" 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 August 10, 2004 -.Dt MLY 4 -.Os -.Sh NAME -.Nm mly -.Nd Mylex AcceleRAID/eXtremeRAID family 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 da" -.Cd "device mly" -.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 -mly_load="YES" -.Ed -.Sh DEPRECATION NOTICE -The -.Nm -driver is not present in -.Fx 13.0 . -.Sh DESCRIPTION -The -.Nm -driver provides support for Mylex AcceleRAID and eXtremeRAID-family -PCI to SCSI RAID controllers with version 6.00 and later -firmware. -.Pp -Logical devices (array drives) attached to the controller are presented -to the SCSI subsystem as though they were direct-access devices on a -virtual SCSI bus. -Physical devices which are not claimed by a logical -device are presented on SCSI channels which match the physical channels -on the controller. -.Sh HARDWARE -Controllers supported by the -.Nm -driver include: -.Pp -.Bl -bullet -compact -.It -Mylex AcceleRAID 160 -.It -Mylex AcceleRAID 170 -.It -Mylex AcceleRAID 352 -.It -Mylex eXtremeRAID 2000 -.It -Mylex eXtremeRAID 3000 -.El -.Pp -Compatible Mylex controllers not listed should work, but have not been -verified. -.Sh DIAGNOSTICS -.Ss Controller initialisation phase -.Bl -diag -.It "mly%d: controller initialisation started" -.It "mly%d: initialisation complete" -.Pp -The controller firmware has started initialisation. -Normally this process is performed by the controller BIOS, -but the driver may need -to do this in cases where the BIOS has failed, or is not compatible -(e.g.\& on non-x86 systems). -.It "mly%d: drive spinup in progress" -.Pp -Drive startup is in progress; this may take several minutes. -.It "mly%d: mirror race recovery failed, one or more drives offline" -.It "mly%d: mirror race recovery in progress" -.It "mly%d: mirror race recovery on a critical drive" -.Pp -These error codes are undocumented. -.It "mly%d: FATAL MEMORY PARITY ERROR" -.Pp -Firmware detected a fatal memory error; the driver will not attempt to -attach to this controller. -.It "mly%d: unknown initialisation code %x" -.Pp -An unknown error occurred during initialisation; it will be ignored. -.El -.Ss Driver initialisation/shutdown phase -.Bl -diag -.It "mly%d: can't enable busmaster feature" -.It "mly%d: memory window not available" -.It "mly%d: can't allocate register window" -.It "mly%d: can't allocate interrupt" -.It "mly%d: can't set up interrupt" -.Pp -The system's PCI BIOS has not correctly configured the controller's -PCI interface; initialisation has failed and the driver will not -attach to this controller. -.It "mly%d: can't allocate parent DMA tag" -.It "mly%d: can't allocate buffer DMA tag" -.It "mly%d: can't allocate command packet DMA tag" -.It "mly%d: can't allocate scatter/gather DMA tag" -.It "mly%d: can't allocate s/g table" -.It "mly%d: can't allocate memory mailbox DMA tag" -.It "mly%d: can't allocate memory mailbox" -.Pp -A resource allocation error occurred while initialising the driver; -initialisation has failed and the driver will not attach to this -controller. -.It "mly%d: BTL rescan result corrupted" -.Pp -The results of a scan for an attached device were corrupted. -One or more devices may not be correctly reported. -.It "mly%d: flushing cache..." -.Pp -The controller cache is being flushed prior to detach or shutdown. -.El -.Ss Operational diagnostics -.Bl -diag -.It "mly%d: physical device %d:%d online" -.It "mly%d: physical device %d:%d standby" -.It "mly%d: physical device %d:%d automatic rebuild started" -.It "mly%d: physical device %d:%d manual rebuild started" -.It "mly%d: physical device %d:%d rebuild completed" -.It "mly%d: physical device %d:%d rebuild cancelled" -.It "mly%d: physical device %d:%d rebuild failed for unknown reasons" -.It "mly%d: physical device %d:%d rebuild failed due to new physical device" -.It "mly%d: physical device %d:%d rebuild failed due to logical drive failure" -.It "mly%d: physical device %d:%d found" -.It "mly%d: physical device %d:%d gone" -.It "mly%d: physical device %d:%d unconfigured" -.It "mly%d: physical device %d:%d expand capacity started" -.It "mly%d: physical device %d:%d expand capacity completed" -.It "mly%d: physical device %d:%d expand capacity failed" -.It "mly%d: physical device %d:%d parity error" -.It "mly%d: physical device %d:%d soft error" -.It "mly%d: physical device %d:%d miscellaneous error" -.It "mly%d: physical device %d:%d reset" -.It "mly%d: physical device %d:%d active spare found" -.It "mly%d: physical device %d:%d warm spare found" -.It "mly%d: physical device %d:%d initialization started" -.It "mly%d: physical device %d:%d initialization completed" -.It "mly%d: physical device %d:%d initialization failed" -.It "mly%d: physical device %d:%d initialization cancelled" -.It "mly%d: physical device %d:%d write recovery failed" -.It "mly%d: physical device %d:%d scsi bus reset failed" -.It "mly%d: physical device %d:%d double check condition" -.It "mly%d: physical device %d:%d device cannot be accessed" -.It "mly%d: physical device %d:%d gross error on scsi processor" -.It "mly%d: physical device %d:%d bad tag from device" -.It "mly%d: physical device %d:%d command timeout" -.It "mly%d: physical device %d:%d system reset" -.It "mly%d: physical device %d:%d busy status or parity error" -.It "mly%d: physical device %d:%d host set device to failed state" -.It "mly%d: physical device %d:%d selection timeout" -.It "mly%d: physical device %d:%d scsi bus phase error" -.It "mly%d: physical device %d:%d device returned unknown status" -.It "mly%d: physical device %d:%d device not ready" -.It "mly%d: physical device %d:%d device not found at startup" -.It "mly%d: physical device %d:%d COD write operation failed" -.It "mly%d: physical device %d:%d BDT write operation failed" -.It "mly%d: physical device %d:%d missing at startup" -.It "mly%d: physical device %d:%d start rebuild failed due to physical drive too small" -.It "mly%d: physical device %d:%d sense data received" -.It "mly%d: sense key %d asc %02x ascq %02x" -.It "mly%d: info %4D csi %4D" -.It "mly%d: physical device %d:%d offline" -.It "mly%d: sense key %d asc %02x ascq %02x" -.It "mly%d: info %4D csi %4D" -.Pp -The reported event refers to the physical device at the given channel:target -address. -.It "mly%d: logical device %d (%s) consistency check started" -.It "mly%d: logical device %d (%s) consistency check completed" -.It "mly%d: logical device %d (%s) consistency check cancelled" -.It "mly%d: logical device %d (%s) consistency check completed with errors" -.It "mly%d: logical device %d (%s) consistency check failed due to logical drive failure" -.It "mly%d: logical device %d (%s) consistency check failed due to physical device failure" -.It "mly%d: logical device %d (%s) automatic rebuild started" -.It "mly%d: logical device %d (%s) manual rebuild started" -.It "mly%d: logical device %d (%s) rebuild completed" -.It "mly%d: logical device %d (%s) rebuild cancelled" -.It "mly%d: logical device %d (%s) rebuild failed for unknown reasons" -.It "mly%d: logical device %d (%s) rebuild failed due to new physical device" -.It "mly%d: logical device %d (%s) rebuild failed due to logical drive failure" -.It "mly%d: logical device %d (%s) offline" -.It "mly%d: logical device %d (%s) critical" -.It "mly%d: logical device %d (%s) online" -.It "mly%d: logical device %d (%s) initialization started" -.It "mly%d: logical device %d (%s) initialization completed" -.It "mly%d: logical device %d (%s) initialization cancelled" -.It "mly%d: logical device %d (%s) initialization failed" -.It "mly%d: logical device %d (%s) found" -.It "mly%d: logical device %d (%s) gone" -.It "mly%d: logical device %d (%s) expand capacity started" -.It "mly%d: logical device %d (%s) expand capacity completed" -.It "mly%d: logical device %d (%s) expand capacity failed" -.It "mly%d: logical device %d (%s) bad block found" -.It "mly%d: logical device %d (%s) size changed" -.It "mly%d: logical device %d (%s) type changed" -.It "mly%d: logical device %d (%s) bad data block found" -.It "mly%d: logical device %d (%s) read of data block in bdt" -.It "mly%d: logical device %d (%s) write back data for disk block lost" -.Pp -The event report will include the name of the SCSI device which has -attached to the device if possible. -.It "mly%d: enclosure %d fan %d failed" -.It "mly%d: enclosure %d fan %d ok" -.It "mly%d: enclosure %d fan %d not present" -.It "mly%d: enclosure %d power supply %d failed" -.It "mly%d: enclosure %d power supply %d ok" -.It "mly%d: enclosure %d power supply %d not present" -.It "mly%d: enclosure %d temperature sensor %d failed" -.It "mly%d: enclosure %d temperature sensor %d critical" -.It "mly%d: enclosure %d temperature sensor %d ok" -.It "mly%d: enclosure %d temperature sensor %d not present" -.It "mly%d: enclosure %d unit %d access critical" -.It "mly%d: enclosure %d unit %d access ok" -.It "mly%d: enclosure %d unit %d access offline" -.Pp -These events refer to external enclosures by number. -The driver does not attempt to name the enclosures. -.It "mly%d: controller cache write back error" -.It "mly%d: controller battery backup unit found" -.It "mly%d: controller battery backup unit charge level low" -.It "mly%d: controller battery backup unit charge level ok" -.It "mly%d: controller installation aborted" -.It "mly%d: controller mirror race recovery in progress" -.It "mly%d: controller mirror race on critical drive" -.It "mly%d: controller memory soft ecc error" -.It "mly%d: controller memory hard ecc error" -.It "mly%d: controller battery backup unit failed" -.Pp -These events report controller status changes. -.El -.Sh AUTHORS -.An -nosplit -The -.Nm -driver was written by -.An Michael Smith Aq Mt msmith@FreeBSD.org . -.Pp -This manual page was written by -.An Michael Smith Aq Mt msmith@FreeBSD.org . -.Sh BUGS -The driver does not yet provide an external management interface. -.Pp -Enclosures are not named or otherwise identified in event messages. diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index 589d81e06dde..7b3a5f91e936 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -185,7 +185,6 @@ device arcmsr # Areca SATA II RAID device ciss # Compaq Smart RAID 5* device iir # Intel Integrated RAID device ips # IBM (Adaptec) ServeRAID -device mly # Mylex AcceleRAID/eXtremeRAID device twa # 3ware 9000 series PATA/SATA RAID device smartpqi # Microsemi smartpqi driver device tws # LSI 3ware 9750 SATA+SAS 6Gb/s RAID controller diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 79fa149ad33f..d0749fe23b87 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -1644,13 +1644,6 @@ device ciss # device iir -# -# Mylex AcceleRAID and eXtremeRAID controllers with v6 and later -# firmware. These controllers have a SCSI-like interface, and require -# the CAM infrastructure. -# -device mly - # # Compaq Smart RAID, Mylex DAC960 and AMI MegaRAID controllers. Only # one entry is needed; the code will find and configure all supported diff --git a/sys/conf/files b/sys/conf/files index 8936cdaf5bd3..e65c318d1514 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -2459,7 +2459,6 @@ dev/mlxfw/mlxfw_mfa2_tlv_multi.c optional mlxfw \ dev/mlx/mlx.c optional mlx dev/mlx/mlx_disk.c optional mlx dev/mlx/mlx_pci.c optional mlx pci -dev/mly/mly.c optional mly dev/mmc/mmc_subr.c optional mmc | mmcsd !mmccam dev/mmc/mmc.c optional mmc !mmccam dev/mmc/mmcbr_if.m standard diff --git a/sys/dev/mly/mly.c b/sys/dev/mly/mly.c deleted file mode 100644 index 1bdcdbb87443..000000000000 --- a/sys/dev/mly/mly.c +++ /dev/null @@ -1,3003 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 2000, 2001 Michael Smith - * Copyright (c) 2000 BSDi - * 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. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/kernel.h> -#include <sys/bus.h> -#include <sys/conf.h> -#include <sys/ctype.h> -#include <sys/ioccom.h> -#include <sys/stat.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <cam/cam.h> -#include <cam/cam_ccb.h> -#include <cam/cam_periph.h> -#include <cam/cam_sim.h> -#include <cam/cam_xpt_sim.h> -#include <cam/scsi/scsi_all.h> -#include <cam/scsi/scsi_message.h> - -#include <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> - -#include <dev/mly/mlyreg.h> -#include <dev/mly/mlyio.h> -#include <dev/mly/mlyvar.h> -#include <dev/mly/mly_tables.h> - -static int mly_probe(device_t dev); -static int mly_attach(device_t dev); -static int mly_pci_attach(struct mly_softc *sc); -static int mly_detach(device_t dev); -static int mly_shutdown(device_t dev); -static void mly_intr(void *arg); - -static int mly_sg_map(struct mly_softc *sc); -static void mly_sg_map_helper(void *arg, bus_dma_segment_t *segs, int nseg, int error); -static int mly_mmbox_map(struct mly_softc *sc); -static void mly_mmbox_map_helper(void *arg, bus_dma_segment_t *segs, int nseg, int error); -static void mly_free(struct mly_softc *sc); - -static int mly_get_controllerinfo(struct mly_softc *sc); -static void mly_scan_devices(struct mly_softc *sc); -static void mly_rescan_btl(struct mly_softc *sc, int bus, int target); -static void mly_complete_rescan(struct mly_command *mc); -static int mly_get_eventstatus(struct mly_softc *sc); -static int mly_enable_mmbox(struct mly_softc *sc); -static int mly_flush(struct mly_softc *sc); -static int mly_ioctl(struct mly_softc *sc, struct mly_command_ioctl *ioctl, void **data, - size_t datasize, u_int8_t *status, void *sense_buffer, size_t *sense_length); -static void mly_check_event(struct mly_softc *sc); -static void mly_fetch_event(struct mly_softc *sc); -static void mly_complete_event(struct mly_command *mc); -static void mly_process_event(struct mly_softc *sc, struct mly_event *me); -static void mly_periodic(void *data); - -static int mly_immediate_command(struct mly_command *mc); -static int mly_start(struct mly_command *mc); -static void mly_done(struct mly_softc *sc); -static void mly_complete(struct mly_softc *sc); -static void mly_complete_handler(void *context, int pending); - -static int mly_alloc_command(struct mly_softc *sc, struct mly_command **mcp); -static void mly_release_command(struct mly_command *mc); -static void mly_alloc_commands_map(void *arg, bus_dma_segment_t *segs, int nseg, int error); -static int mly_alloc_commands(struct mly_softc *sc); -static void mly_release_commands(struct mly_softc *sc); -static void mly_map_command(struct mly_command *mc); -static void mly_unmap_command(struct mly_command *mc); - -static int mly_cam_attach(struct mly_softc *sc); -static void mly_cam_detach(struct mly_softc *sc); -static void mly_cam_rescan_btl(struct mly_softc *sc, int bus, int target); -static void mly_cam_action(struct cam_sim *sim, union ccb *ccb); -static int mly_cam_action_io(struct cam_sim *sim, struct ccb_scsiio *csio); -static void mly_cam_poll(struct cam_sim *sim); -static void mly_cam_complete(struct mly_command *mc); -static struct cam_periph *mly_find_periph(struct mly_softc *sc, int bus, int target); -static int mly_name_device(struct mly_softc *sc, int bus, int target); - -static int mly_fwhandshake(struct mly_softc *sc); - -static void mly_describe_controller(struct mly_softc *sc); -#ifdef MLY_DEBUG -static void mly_printstate(struct mly_softc *sc); -static void mly_print_command(struct mly_command *mc); -static void mly_print_packet(struct mly_command *mc); -static void mly_panic(struct mly_softc *sc, char *reason); -static void mly_timeout(void *arg); -#endif -void mly_print_controller(int controller); - -static d_open_t mly_user_open; -static d_close_t mly_user_close; -static d_ioctl_t mly_user_ioctl; -static int mly_user_command(struct mly_softc *sc, struct mly_user_command *uc); -static int mly_user_health(struct mly_softc *sc, struct mly_user_health *uh); - -#define MLY_CMD_TIMEOUT 20 - -static device_method_t mly_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, mly_probe), - DEVMETHOD(device_attach, mly_attach), - DEVMETHOD(device_detach, mly_detach), - DEVMETHOD(device_shutdown, mly_shutdown), - { 0, 0 } -}; - -static driver_t mly_pci_driver = { - "mly", - mly_methods, - sizeof(struct mly_softc) -}; - -static devclass_t mly_devclass; -DRIVER_MODULE(mly, pci, mly_pci_driver, mly_devclass, 0, 0); -MODULE_DEPEND(mly, pci, 1, 1, 1); -MODULE_DEPEND(mly, cam, 1, 1, 1); - -static struct cdevsw mly_cdevsw = { - .d_version = D_VERSION, - .d_open = mly_user_open, - .d_close = mly_user_close, - .d_ioctl = mly_user_ioctl, - .d_name = "mly", -}; - -/******************************************************************************** - ******************************************************************************** - Device Interface - ******************************************************************************** - ********************************************************************************/ - -static struct mly_ident -{ - u_int16_t vendor; - u_int16_t device; - u_int16_t subvendor; - u_int16_t subdevice; - int hwif; - char *desc; -} mly_identifiers[] = { - {0x1069, 0xba56, 0x1069, 0x0040, MLY_HWIF_STRONGARM, "Mylex eXtremeRAID 2000"}, - {0x1069, 0xba56, 0x1069, 0x0030, MLY_HWIF_STRONGARM, "Mylex eXtremeRAID 3000"}, - {0x1069, 0x0050, 0x1069, 0x0050, MLY_HWIF_I960RX, "Mylex AcceleRAID 352"}, - {0x1069, 0x0050, 0x1069, 0x0052, MLY_HWIF_I960RX, "Mylex AcceleRAID 170"}, - {0x1069, 0x0050, 0x1069, 0x0054, MLY_HWIF_I960RX, "Mylex AcceleRAID 160"}, - {0, 0, 0, 0, 0, 0} -}; - -/******************************************************************************** - * Compare the provided PCI device with the list we support. - */ -static int -mly_probe(device_t dev) -{ - struct mly_ident *m; - - debug_called(1); - - for (m = mly_identifiers; m->vendor != 0; m++) { - if ((m->vendor == pci_get_vendor(dev)) && - (m->device == pci_get_device(dev)) && - ((m->subvendor == 0) || ((m->subvendor == pci_get_subvendor(dev)) && - (m->subdevice == pci_get_subdevice(dev))))) { - - device_set_desc(dev, m->desc); - return(BUS_PROBE_DEFAULT); /* allow room to be overridden */ - } - } - return(ENXIO); -} - -/******************************************************************************** - * Initialise the controller and softc - */ -static int -mly_attach(device_t dev) -{ - struct mly_softc *sc = device_get_softc(dev); - int error; - - debug_called(1); - - sc->mly_dev = dev; - mtx_init(&sc->mly_lock, "mly", NULL, MTX_DEF); - callout_init_mtx(&sc->mly_periodic, &sc->mly_lock, 0); - -#ifdef MLY_DEBUG - callout_init_mtx(&sc->mly_timeout, &sc->mly_lock, 0); - if (device_get_unit(sc->mly_dev) == 0) - mly_softc0 = sc; -#endif - - /* - * Do PCI-specific initialisation. - */ - if ((error = mly_pci_attach(sc)) != 0) - goto out; - - /* - * Initialise per-controller queues. - */ - mly_initq_free(sc); - mly_initq_busy(sc); - mly_initq_complete(sc); - - /* - * Initialise command-completion task. - */ - TASK_INIT(&sc->mly_task_complete, 0, mly_complete_handler, sc); - - /* disable interrupts before we start talking to the controller */ - MLY_MASK_INTERRUPTS(sc); - - /* - * Wait for the controller to come ready, handshake with the firmware if required. - * This is typically only necessary on platforms where the controller BIOS does not - * run. - */ - if ((error = mly_fwhandshake(sc))) - goto out; - - /* - * Allocate initial command buffers. - */ - if ((error = mly_alloc_commands(sc))) - goto out; - - /* - * Obtain controller feature information - */ - MLY_LOCK(sc); - error = mly_get_controllerinfo(sc); - MLY_UNLOCK(sc); - if (error) - goto out; - - /* - * Reallocate command buffers now we know how many we want. - */ - mly_release_commands(sc); - if ((error = mly_alloc_commands(sc))) - goto out; - - /* - * Get the current event counter for health purposes, populate the initial - * health status buffer. - */ - MLY_LOCK(sc); - error = mly_get_eventstatus(sc); - - /* - * Enable memory-mailbox mode. - */ - if (error == 0) - error = mly_enable_mmbox(sc); - MLY_UNLOCK(sc); - if (error) - goto out; - - /* - * Attach to CAM. - */ - if ((error = mly_cam_attach(sc))) - goto out; - - /* - * Print a little information about the controller - */ - mly_describe_controller(sc); - - /* - * Mark all attached devices for rescan. - */ - MLY_LOCK(sc); - mly_scan_devices(sc); - - /* - * Instigate the first status poll immediately. Rescan completions won't - * happen until interrupts are enabled, which should still be before - * the SCSI subsystem gets to us, courtesy of the "SCSI settling delay". - */ - mly_periodic((void *)sc); - MLY_UNLOCK(sc); - - /* - * Create the control device. - */ - sc->mly_dev_t = make_dev(&mly_cdevsw, 0, UID_ROOT, GID_OPERATOR, - S_IRUSR | S_IWUSR, "mly%d", device_get_unit(sc->mly_dev)); - sc->mly_dev_t->si_drv1 = sc; - - /* enable interrupts now */ - MLY_UNMASK_INTERRUPTS(sc); - -#ifdef MLY_DEBUG - callout_reset(&sc->mly_timeout, MLY_CMD_TIMEOUT * hz, mly_timeout, sc); -#endif - - out: - if (error != 0) - mly_free(sc); - else - gone_in_dev(dev, 13, "mly(4) removed"); - return(error); -} - -/******************************************************************************** - * Perform PCI-specific initialisation. - */ -static int -mly_pci_attach(struct mly_softc *sc) -{ - int i, error; - - debug_called(1); - - /* assume failure is 'not configured' */ - error = ENXIO; - - /* - * Verify that the adapter is correctly set up in PCI space. - */ - pci_enable_busmaster(sc->mly_dev); - - /* - * Allocate the PCI register window. - */ - sc->mly_regs_rid = PCIR_BAR(0); /* first base address register */ - if ((sc->mly_regs_resource = bus_alloc_resource_any(sc->mly_dev, - SYS_RES_MEMORY, &sc->mly_regs_rid, RF_ACTIVE)) == NULL) { - mly_printf(sc, "can't allocate register window\n"); - goto fail; - } - - /* - * Allocate and connect our interrupt. - */ - sc->mly_irq_rid = 0; - if ((sc->mly_irq = bus_alloc_resource_any(sc->mly_dev, SYS_RES_IRQ, - &sc->mly_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - mly_printf(sc, "can't allocate interrupt\n"); - goto fail; - } - if (bus_setup_intr(sc->mly_dev, sc->mly_irq, INTR_TYPE_CAM | INTR_ENTROPY | INTR_MPSAFE, NULL, mly_intr, sc, &sc->mly_intr)) { - mly_printf(sc, "can't set up interrupt\n"); - goto fail; - } - - /* assume failure is 'out of memory' */ - error = ENOMEM; - - /* - * Allocate the parent bus DMA tag appropriate for our PCI interface. - * - * Note that all of these controllers are 64-bit capable. - */ - if (bus_dma_tag_create(bus_get_dma_tag(sc->mly_dev),/* PCI parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ - BUS_SPACE_UNRESTRICTED, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - BUS_DMA_ALLOCNOW, /* flags */ - NULL, /* lockfunc */ - NULL, /* lockarg */ - &sc->mly_parent_dmat)) { - mly_printf(sc, "can't allocate parent DMA tag\n"); - goto fail; - } - - /* - * Create DMA tag for mapping buffers into controller-addressable space. - */ - if (bus_dma_tag_create(sc->mly_parent_dmat, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - DFLTPHYS, /* maxsize */ - MLY_MAX_SGENTRIES, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - busdma_lock_mutex, /* lockfunc */ - &sc->mly_lock, /* lockarg */ - &sc->mly_buffer_dmat)) { - mly_printf(sc, "can't allocate buffer DMA tag\n"); - goto fail; - } - - /* - * Initialise the DMA tag for command packets. - */ - if (bus_dma_tag_create(sc->mly_parent_dmat, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - sizeof(union mly_command_packet) * MLY_MAX_COMMANDS, 1, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - BUS_DMA_ALLOCNOW, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &sc->mly_packet_dmat)) { - mly_printf(sc, "can't allocate command packet DMA tag\n"); - goto fail; - } - - /* - * Detect the hardware interface version - */ - for (i = 0; mly_identifiers[i].vendor != 0; i++) { - if ((mly_identifiers[i].vendor == pci_get_vendor(sc->mly_dev)) && - (mly_identifiers[i].device == pci_get_device(sc->mly_dev))) { - sc->mly_hwif = mly_identifiers[i].hwif; - switch(sc->mly_hwif) { - case MLY_HWIF_I960RX: - debug(1, "set hardware up for i960RX"); - sc->mly_doorbell_true = 0x00; - sc->mly_command_mailbox = MLY_I960RX_COMMAND_MAILBOX; - sc->mly_status_mailbox = MLY_I960RX_STATUS_MAILBOX; - sc->mly_idbr = MLY_I960RX_IDBR; - sc->mly_odbr = MLY_I960RX_ODBR; - sc->mly_error_status = MLY_I960RX_ERROR_STATUS; - sc->mly_interrupt_status = MLY_I960RX_INTERRUPT_STATUS; - sc->mly_interrupt_mask = MLY_I960RX_INTERRUPT_MASK; - break; - case MLY_HWIF_STRONGARM: - debug(1, "set hardware up for StrongARM"); - sc->mly_doorbell_true = 0xff; /* doorbell 'true' is 0 */ - sc->mly_command_mailbox = MLY_STRONGARM_COMMAND_MAILBOX; - sc->mly_status_mailbox = MLY_STRONGARM_STATUS_MAILBOX; - sc->mly_idbr = MLY_STRONGARM_IDBR; - sc->mly_odbr = MLY_STRONGARM_ODBR; - sc->mly_error_status = MLY_STRONGARM_ERROR_STATUS; - sc->mly_interrupt_status = MLY_STRONGARM_INTERRUPT_STATUS; - sc->mly_interrupt_mask = MLY_STRONGARM_INTERRUPT_MASK; - break; - } - break; - } - } - - /* - * Create the scatter/gather mappings. - */ - if ((error = mly_sg_map(sc))) - goto fail; - - /* - * Allocate and map the memory mailbox - */ - if ((error = mly_mmbox_map(sc))) - goto fail; - - error = 0; - -fail: - return(error); -} - -/******************************************************************************** - * Shut the controller down and detach all our resources. - */ -static int -mly_detach(device_t dev) -{ - int error; - - if ((error = mly_shutdown(dev)) != 0) - return(error); - - mly_free(device_get_softc(dev)); - return(0); -} - -/******************************************************************************** - * Bring the controller to a state where it can be safely left alone. - * - * Note that it should not be necessary to wait for any outstanding commands, - * as they should be completed prior to calling here. - * - * XXX this applies for I/O, but not status polls; we should beware of - * the case where a status command is running while we detach. - */ -static int -mly_shutdown(device_t dev) -{ - struct mly_softc *sc = device_get_softc(dev); - - debug_called(1); - - MLY_LOCK(sc); - if (sc->mly_state & MLY_STATE_OPEN) { - MLY_UNLOCK(sc); - return(EBUSY); - } - - /* kill the periodic event */ - callout_stop(&sc->mly_periodic); -#ifdef MLY_DEBUG - callout_stop(&sc->mly_timeout); -#endif - - /* flush controller */ - mly_printf(sc, "flushing cache..."); - printf("%s\n", mly_flush(sc) ? "failed" : "done"); - - MLY_MASK_INTERRUPTS(sc); - MLY_UNLOCK(sc); - - return(0); -} - -/******************************************************************************* - * Take an interrupt, or be poked by other code to look for interrupt-worthy - * status. - */ -static void -mly_intr(void *arg) -{ - struct mly_softc *sc = (struct mly_softc *)arg; - - debug_called(2); - - MLY_LOCK(sc); - mly_done(sc); - MLY_UNLOCK(sc); -}; - -/******************************************************************************** - ******************************************************************************** - Bus-dependant Resource Management - ******************************************************************************** - ********************************************************************************/ - -/******************************************************************************** - * Allocate memory for the scatter/gather tables - */ -static int -mly_sg_map(struct mly_softc *sc) -{ - size_t segsize; - - debug_called(1); - - /* - * Create a single tag describing a region large enough to hold all of - * the s/g lists we will need. - */ - segsize = sizeof(struct mly_sg_entry) * MLY_MAX_COMMANDS *MLY_MAX_SGENTRIES; - if (bus_dma_tag_create(sc->mly_parent_dmat, /* parent */ - 1, 0, /* alignment,boundary */ - BUS_SPACE_MAXADDR, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - segsize, 1, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - BUS_DMA_ALLOCNOW, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &sc->mly_sg_dmat)) { - mly_printf(sc, "can't allocate scatter/gather DMA tag\n"); - return(ENOMEM); - } - - /* - * Allocate enough s/g maps for all commands and permanently map them into - * controller-visible space. - * - * XXX this assumes we can get enough space for all the s/g maps in one - * contiguous slab. - */ - if (bus_dmamem_alloc(sc->mly_sg_dmat, (void **)&sc->mly_sg_table, - BUS_DMA_NOWAIT, &sc->mly_sg_dmamap)) { *** 4534 LINES SKIPPED ***