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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to