Date: Mon, 3 Nov 2008 00:53:54 +0000 (UTC) From: Scott Long <scottl@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r184573 - in head/sys: conf dev/amr i386/conf modules/amr Message-ID: <200811030053.mA30rsdg052353@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: scottl Date: Mon Nov 3 00:53:54 2008 New Revision: 184573 URL: http://svn.freebsd.org/changeset/base/184573 Log: Move the CAM passthrough code into a true module so that it doesn't have to be compiled into the main AMR driver. It's code that is nice to have but not required for normal operation, and it is reported to cause problems for some people. Modified: head/sys/conf/NOTES head/sys/conf/files head/sys/dev/amr/amr.c head/sys/dev/amr/amr_cam.c head/sys/dev/amr/amrvar.h head/sys/i386/conf/XEN head/sys/modules/amr/Makefile Modified: head/sys/conf/NOTES ============================================================================== --- head/sys/conf/NOTES Sun Nov 2 23:20:27 2008 (r184572) +++ head/sys/conf/NOTES Mon Nov 3 00:53:54 2008 (r184573) @@ -1579,6 +1579,7 @@ device mly 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 Modified: head/sys/conf/files ============================================================================== --- head/sys/conf/files Sun Nov 2 23:20:27 2008 (r184572) +++ head/sys/conf/files Mon Nov 3 00:53:54 2008 (r184573) @@ -450,7 +450,7 @@ dev/aic7xxx/aic7xxx_osm.c optional ahc dev/aic7xxx/aic7xxx_pci.c optional ahc pci dev/amd/amd.c optional amd dev/amr/amr.c optional amr -dev/amr/amr_cam.c optional amr +dev/amr/amr_cam.c optional amrp amr dev/amr/amr_disk.c optional amr dev/amr/amr_linux.c optional amr compat_linux dev/amr/amr_pci.c optional amr pci Modified: head/sys/dev/amr/amr.c ============================================================================== --- head/sys/dev/amr/amr.c Sun Nov 2 23:20:27 2008 (r184572) +++ head/sys/dev/amr/amr.c Mon Nov 3 00:53:54 2008 (r184573) @@ -88,13 +88,6 @@ __FBSDID("$FreeBSD$"); #define AMR_DEFINE_TABLES #include <dev/amr/amr_tables.h> -/* - * The CAM interface appears to be completely broken. Disable it. - */ -#ifndef AMR_ENABLE_CAM -#define AMR_ENABLE_CAM 1 -#endif - SYSCTL_NODE(_hw, OID_AUTO, amr, CTLFLAG_RD, 0, "AMR driver parameters"); static d_open_t amr_open; @@ -202,6 +195,7 @@ MALLOC_DEFINE(M_AMR, "amr", "AMR memory" int amr_attach(struct amr_softc *sc) { + device_t child; debug_called(1); @@ -259,14 +253,16 @@ amr_attach(struct amr_softc *sc) */ amr_init_sysctl(sc); -#if AMR_ENABLE_CAM != 0 /* * Attach our 'real' SCSI channels to CAM. */ - if (amr_cam_attach(sc)) - return(ENXIO); - debug(2, "CAM attach done"); -#endif + 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. @@ -391,10 +387,9 @@ amr_free(struct amr_softc *sc) { struct amr_command_cluster *acc; -#if AMR_ENABLE_CAM != 0 /* detach from CAM */ - amr_cam_detach(sc); -#endif + if (sc->amr_pass != NULL) + device_delete_child(sc->amr_dev, sc->amr_pass); /* cancel status timeout */ untimeout(amr_periodic, sc, sc->amr_timeout); @@ -1240,11 +1235,9 @@ amr_startio(struct amr_softc *sc) if (ac == NULL) (void)amr_bio_command(sc, &ac); -#if AMR_ENABLE_CAM != 0 /* if that failed, build a command from a ccb */ - if (ac == NULL) - (void)amr_cam_command(sc, &ac); -#endif + if ((ac == NULL) && (sc->amr_cam_command != NULL)) + sc->amr_cam_command(sc, &ac); /* if we don't have anything to do, give up */ if (ac == NULL) Modified: head/sys/dev/amr/amr_cam.c ============================================================================== --- head/sys/dev/amr/amr_cam.c Sun Nov 2 23:20:27 2008 (r184572) +++ head/sys/dev/amr/amr_cam.c Mon Nov 3 00:53:54 2008 (r184573) @@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.h> #include <sys/malloc.h> #include <sys/kernel.h> +#include <sys/module.h> #include <sys/bio.h> #include <sys/bus.h> @@ -82,9 +83,31 @@ __FBSDID("$FreeBSD$"); #include <dev/amr/amrreg.h> #include <dev/amr/amrvar.h> +static int amr_cam_probe(device_t dev); +static int amr_cam_attach(device_t dev); +static int amr_cam_detach(device_t dev); static void amr_cam_action(struct cam_sim *sim, union ccb *ccb); static void amr_cam_poll(struct cam_sim *sim); static void amr_cam_complete(struct amr_command *ac); +static int amr_cam_command(struct amr_softc *sc, struct amr_command **acp); + +static devclass_t amr_pass_devclass; + +static device_method_t amr_pass_methods[] = { + DEVMETHOD(device_probe, amr_cam_probe), + DEVMETHOD(device_attach, amr_cam_attach), + DEVMETHOD(device_detach, amr_cam_detach), + { 0, 0 } +}; + +static driver_t amr_pass_driver = { + "amrp", + amr_pass_methods, + 0 +}; + +DRIVER_MODULE(amrp, amr, amr_pass_driver, amr_pass_devclass, 0, 0); +MODULE_DEPEND(amrp, cam, 1, 1, 1); MALLOC_DEFINE(M_AMRCAM, "amrcam", "AMR CAM memory"); @@ -115,14 +138,23 @@ amr_dequeue_ccb(struct amr_softc *sc) return(ccb); } +static int +amr_cam_probe(device_t dev) +{ + return (0); +} + /******************************************************************************** * Attach our 'real' SCSI channels to CAM */ -int -amr_cam_attach(struct amr_softc *sc) +static int +amr_cam_attach(device_t dev) { + struct amr_softc *sc; struct cam_devq *devq; - int chn, error; + int chn, error; + + sc = device_get_softc(dev); /* initialise the ccb queue */ TAILQ_INIT(&sc->amr_cam_ccbq); @@ -134,7 +166,7 @@ amr_cam_attach(struct amr_softc *sc) * during detach. */ if ((devq = cam_simq_alloc(AMR_MAX_SCSI_CMDS)) == NULL) - return(ENOMEM); + return(ENOMEM); sc->amr_cam_devq = devq; /* @@ -165,17 +197,20 @@ amr_cam_attach(struct amr_softc *sc) * XXX we should scan the config and work out which devices are * actually protected. */ + sc->amr_cam_command = amr_cam_command; return(0); } /******************************************************************************** * Disconnect ourselves from CAM */ -void -amr_cam_detach(struct amr_softc *sc) +static int +amr_cam_detach(device_t dev) { + struct amr_softc *sc; int chn; + sc = device_get_softc(dev); mtx_lock(&sc->amr_list_lock); for (chn = 0; chn < sc->amr_maxchan; chn++) { /* @@ -191,6 +226,8 @@ amr_cam_detach(struct amr_softc *sc) /* Now free the devq */ if (sc->amr_cam_devq != NULL) cam_simq_free(sc->amr_cam_devq); + + return (0); } /*********************************************************************** @@ -379,7 +416,7 @@ amr_cam_action(struct cam_sim *sim, unio * Convert a CAM CCB off the top of the CCB queue to a passthrough SCSI * command. */ -int +static int amr_cam_command(struct amr_softc *sc, struct amr_command **acp) { struct amr_command *ac; Modified: head/sys/dev/amr/amrvar.h ============================================================================== --- head/sys/dev/amr/amrvar.h Sun Nov 2 23:20:27 2008 (r184572) +++ head/sys/dev/amr/amrvar.h Mon Nov 3 00:53:54 2008 (r184573) @@ -253,6 +253,8 @@ struct amr_softc int support_ext_cdb; /* greater than 10 byte cdb support */ /* misc glue */ + device_t amr_pass; + int (*amr_cam_command)(struct amr_softc *sc, struct amr_command **acp); struct intr_config_hook amr_ich; /* wait-for-interrupts probe hook */ struct callout_handle amr_timeout; /* periodic status check */ int amr_allow_vol_config; @@ -277,13 +279,6 @@ extern struct amr_command *amr_alloccmd( extern void amr_releasecmd(struct amr_command *ac); /* - * CAM interface - */ -extern int amr_cam_attach(struct amr_softc *sc); -extern void amr_cam_detach(struct amr_softc *sc); -extern int amr_cam_command(struct amr_softc *sc, struct amr_command **acp); - -/* * MegaRAID logical disk driver */ struct amrd_softc Modified: head/sys/i386/conf/XEN ============================================================================== --- head/sys/i386/conf/XEN Sun Nov 2 23:20:27 2008 (r184572) +++ head/sys/i386/conf/XEN Mon Nov 3 00:53:54 2008 (r184573) @@ -1,28 +1,10 @@ # -# GENERIC -- Generic kernel configuration file for FreeBSD/i386 -# -# For more information on this file, please read the handbook section on -# Kernel Configuration Files: -# -# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html -# -# The handbook is also available locally in /usr/share/doc/handbook -# if you've installed the doc distribution, otherwise always see the -# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the -# latest information. -# -# An exhaustive list of options and more detailed explanations of the -# device lines is also present in the ../../conf/NOTES and NOTES files. -# If you are in doubt as to the purpose or necessity of a line, check first -# in NOTES. +# XEN -- Kernel configuration for i386 XEN DomU # # $FreeBSD$ cpu I686_CPU -ident GENERIC - -# To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" # Default places to look for devices. +ident XEN makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols makeoptions MODULES_OVERRIDE="" @@ -39,7 +21,6 @@ options SOFTUPDATES # Enable FFS soft options UFS_ACL # Support for access control lists options UFS_DIRHASH # Improve performance on big directories options UFS_GJOURNAL # Enable gjournal-based UFS journaling -options MD_ROOT # MD is a potential root device options NFSCLIENT # Network Filesystem Client options NFSSERVER # Network Filesystem Server options NFSLOCKD # Network Lock Manager @@ -55,7 +36,6 @@ options COMPAT_FREEBSD4 # Compatible w options COMPAT_FREEBSD5 # Compatible with FreeBSD5 options COMPAT_FREEBSD6 # Compatible with FreeBSD6 options COMPAT_FREEBSD7 # Compatible with FreeBSD7 -options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI options KTRACE # ktrace(1) support options STACK # stack(9) support options SYSVSHM # SYSV-style shared memory @@ -63,7 +43,6 @@ options SYSVMSG # SYSV-style message options SYSVSEM # SYSV-style semaphores options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions options KBD_INSTALL_CDEV # install a CDEV entry in /dev -options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) options AUDIT # Security event auditing # Debugging for use in -current @@ -86,53 +65,8 @@ options MCLSHIFT=12 options SMP # Symmetric MultiProcessor Kernel device apic # I/O APIC -# CPU frequency control -#device cpufreq - -# atkbdc0 controls both the keyboard and the PS/2 mouse -device atkbdc # AT keyboard controller -device atkbd # AT keyboard -device psm # PS/2 mouse - device kbdmux # keyboard multiplexer -#device vga # VGA video card driver - -device splash # Splash screen and screen saver support - -# syscons is the default console driver, resembling an SCO console -#device sc - -# Power management support (see NOTES for more options) -#device apm -# Add suspend/resume support for the i8254. -device pmtimer - - -device pci - -# PCCARD (PCMCIA) support -# PCMCIA and cardbus bridge support -#device cbb # cardbus (yenta) bridge -#device pccard # PC Card (16-bit) bus -#device cardbus # CardBus (32-bit) bus - -# Serial (COM) ports -device uart # Generic UART driver - -# Parallel port -device ppc -device ppbus # Parallel port bus (required) -device lpt # Printer -device plip # TCP/IP over parallel -device ppi # Parallel port interface device -#device vpo # Requires scbus and da - -# If you've got a "dumb" serial or parallel PCI card that is -# supported by the puc(4) glue driver, uncomment the following -# line to enable it (connects to sio, uart and/or ppc drivers): -#device puc - # Pseudo devices. device loop # Network loopback device random # Entropy device @@ -142,7 +76,6 @@ device pty # Pseudo-ttys (telnet etc) device md # Memory "disks" device gif # IPv6 and IPv4 tunneling device faith # IPv6-to-IPv4 relaying (translation) -device firmware # firmware assist module # The `bpf' device enables the Berkeley Packet Filter. # Be aware of the administrative consequences of enabling this! Modified: head/sys/modules/amr/Makefile ============================================================================== --- head/sys/modules/amr/Makefile Sun Nov 2 23:20:27 2008 (r184572) +++ head/sys/modules/amr/Makefile Mon Nov 3 00:53:54 2008 (r184573) @@ -2,15 +2,16 @@ .PATH: ${.CURDIR}/../../dev/amr +SUBDIR= amr_cam .if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64" -SUBDIR= amr_linux +SUBDIR+= amr_linux .endif KMOD= amr SRCS= amr.c amr_pci.c amr_disk.c device_if.h bus_if.h pci_if.h # SCSI passthrough support for non-disk devices -SRCS+= amr_cam.c opt_cam.h opt_scsi.h +#SRCS+= amr_cam.c opt_cam.h opt_scsi.h # Enable a questionable optimisation for newer adapters #CFLAGS+= -DAMR_QUARTZ_GOFASTER
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811030053.mA30rsdg052353>