Merge remote-tracking branch 'origin/master'
authorPeter Avalos <pavalos@dragonflybsd.org>
Tue, 10 Apr 2012 16:51:20 +0000 (09:51 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Tue, 10 Apr 2012 16:51:20 +0000 (09:51 -0700)
171 files changed:
Makefile_upgrade.inc
games/fortune/fortune/fortune.c
include/dlfcn.h
lib/libc/gen/Makefile.inc
lib/libc/gen/dlfcn.3
lib/libc/gen/dlfcn.c
lib/libc/gen/dlopen.3
lib/libc/gen/ualarm.c
lib/libm/man/Makefile.inc
lib/libpuffs/puffs_framebuf.3
lib/libpuffs/puffs_ops.3
libexec/rtld-elf/rtld.c
libexec/rtld-elf/rtld.h
sbin/ip6fw/ip6fw.c
share/examples/scsi_target/scsi_target.c
share/man/man4/Makefile
share/man/man4/ahci.4
share/man/man4/aic.4 [moved from share/man/man4/man4.i386/aic.4 with 68% similarity]
share/man/man4/arcmsr.4
share/man/man4/bce.4
share/man/man4/em.4
share/man/man4/isa.4
share/man/man4/isp.4
share/man/man4/jme.4
share/man/man4/man4.i386/Makefile
share/man/man4/mfi.4
share/man/man4/snd_hda.4
share/man/man9/dsched.9
share/man/man9/physio.9
share/misc/pci_vendors
share/zoneinfo/africa
share/zoneinfo/asia
share/zoneinfo/northamerica
sys/bus/cam/cam_periph.c
sys/bus/firewire/fwmem.c
sys/bus/pci/pci.c
sys/bus/usb/usb.c
sys/conf/files
sys/config/GENERIC
sys/config/LINT
sys/config/LINT64
sys/config/X86_64_GENERIC
sys/cpu/i386/include/param.h
sys/cpu/x86_64/include/param.h
sys/dev/acpica5/Osd/OsdSchedule.c
sys/dev/acpica5/acpi_asus/acpi_asus.c
sys/dev/acpica5/acpi_hp/acpi_hp.c
sys/dev/acpica5/acpi_thermal.c
sys/dev/acpica5/acpivar.h
sys/dev/disk/aic/Makefile
sys/dev/disk/aic/aic.c
sys/dev/disk/aic/aic6360reg.h
sys/dev/disk/aic/aic_isa.c [deleted file]
sys/dev/disk/aic/aic_pccard.c
sys/dev/disk/aic/aicvar.h
sys/dev/disk/isp/isp_freebsd.c
sys/dev/disk/md/md.c
sys/dev/disk/nata/ata-disk.c
sys/dev/disk/nata/atapi-cd.c
sys/dev/disk/nata/atapi-fd.c
sys/dev/disk/nata/atapi-tape.c
sys/dev/disk/sili/sili.c
sys/dev/misc/dcons/dcons_os.c
sys/dev/netif/e1000/if_igb.c
sys/dev/netif/en_pci/if_en_pci.c
sys/dev/netif/iwi/if_iwi.c
sys/dev/netif/lgue/if_lgue.c
sys/dev/netif/mxge/if_mxge.c
sys/dev/netif/pcn/if_pcn.c
sys/dev/raid/aac/aac_debug.c
sys/dev/raid/arcmsr/arcmsr.c
sys/dev/raid/arcmsr/arcmsr.h
sys/dev/raid/asr/asr.c
sys/dev/raid/hptiop/hptiop.c
sys/dev/raid/ida/ida_disk.c
sys/dev/raid/mfi/Makefile
sys/dev/raid/mfi/mfi.c
sys/dev/raid/mfi/mfi_cam.c
sys/dev/raid/mfi/mfi_debug.c
sys/dev/raid/mfi/mfi_disk.c
sys/dev/raid/mfi/mfi_ioctl.h
sys/dev/raid/mfi/mfi_pci.c
sys/dev/raid/mfi/mfi_syspd.c
sys/dev/raid/mfi/mfi_tbolt.c [new file with mode: 0644]
sys/dev/raid/mfi/mfireg.h
sys/dev/raid/mfi/mfivar.h
sys/dev/raid/mps/mps_sas.c
sys/dev/raid/mps/mps_sas_lsi.c
sys/dev/raid/pst/pst-iop.c
sys/dev/raid/twa/tw_cl_misc.c
sys/dev/serial/rp/rp.c
sys/dev/sound/pcm/feeder_fmt.c
sys/dev/video/bktr/msp34xx.c
sys/dev/virtual/vkernel/disk/vdisk.c
sys/kern/kern_clock.c
sys/kern/kern_kthread.c
sys/kern/kern_lock.c
sys/kern/kern_physio.c
sys/kern/link_elf_obj.c
sys/kern/subr_bus.c
sys/kern/subr_disk.c
sys/kern/vfs_bio.c
sys/kern/vfs_cluster.c
sys/kern/vfs_conf.c
sys/kern/vfs_mount.c
sys/kern/vfs_subr.c
sys/kern/vfs_syscalls.c
sys/kern/vfs_vopops.c
sys/net/altq/altq_hfsc.c
sys/net/if_ethersubr.c
sys/net/if_var.h
sys/net/pf/pf.c
sys/net/pf/pf_ioctl.c
sys/netgraph7/bluetooth/l2cap/ng_l2cap_evnt.c
sys/netgraph7/netflow/netflow.c
sys/netgraph7/netgraph/ng_base.c
sys/netgraph7/ng_device.c
sys/netgraph7/ng_tty.c
sys/netinet/if_ether.c
sys/netinet/ip_carp.c
sys/netinet/ip_carp.h
sys/netinet/ip_divert.c
sys/netinet/tcp_input.c
sys/netinet/tcp_output.c
sys/netinet/tcp_sack.c
sys/netinet/tcp_var.h
sys/netinet6/nd6_nbr.c
sys/opencrypto/cryptosoft.c
sys/opencrypto/deflate.c
sys/platform/pc32/conf/files
sys/platform/pc32/i386/dump_machdep.c
sys/platform/pc32/i386/minidump_machdep.c
sys/platform/pc32/i386/trap.c
sys/platform/pc32/i386/userconfig.c
sys/platform/pc64/x86_64/dump_machdep.c
sys/platform/pc64/x86_64/minidump_machdep.c
sys/platform/pc64/x86_64/trap.c
sys/platform/vkernel/i386/trap.c
sys/platform/vkernel64/x86_64/trap.c
sys/sys/buf.h
sys/sys/malloc.h
sys/sys/mount.h
sys/sys/resource.h
sys/vfs/devfs/devfs_vnops.c
sys/vfs/hammer/hammer_io.c
sys/vfs/hpfs/hpfs_vnops.c
sys/vfs/mfs/mfs_vfsops.c
sys/vfs/ufs/ffs_softdep.c
sys/vfs/ufs/ffs_vfsops.c
sys/vm/vm_zone.c
test/stress/fsstress/dotest.sample
usr.bin/fmt/fmt.c
usr.bin/netstat/inet.c
usr.bin/rlogin/rlogin.c
usr.bin/talk/ctl.c
usr.bin/whereis/whereis.c
usr.bin/yacc/output.c
usr.sbin/IPXrouted/output.c
usr.sbin/IPXrouted/sap_output.c
usr.sbin/keyserv/crypt_server.c
usr.sbin/mfiutil/Makefile
usr.sbin/mfiutil/mfi_config.c
usr.sbin/mfiutil/mfi_evt.c
usr.sbin/mfiutil/mfi_patrol.c
usr.sbin/mfiutil/mfi_show.c
usr.sbin/mfiutil/mfiutil.c
usr.sbin/ppp/Makefile
usr.sbin/ppp/ip.c
usr.sbin/ppp/mbuf.h
usr.sbin/ppp/mppe.c
usr.sbin/rwhod/rwhod.c

index 55ea141..871d5f7 100644 (file)
@@ -1984,6 +1984,10 @@ TO_REMOVE+=/usr/lib/profile/libtinfo.aa
 TO_REMOVE+=/usr/bin/kzip
 TO_REMOVE+=/usr/share/man/cat8/kzip.8.gz
 TO_REMOVE+=/usr/share/man/man8/kzip.8.gz
+TO_REMOVE+=/usr/share/man/cat4/i386/aic.4.gz
+TO_REMOVE+=/usr/share/man/man4/i386/aic.4.gz
+TO_REMOVE+=/usr/share/man/cat3/lintf.3.gz
+TO_REMOVE+=/usr/share/man/man3/lintf.3.gz
 TO_REMOVE+=/usr/include/openssl/e_os.h
 TO_REMOVE+=/usr/include/openssl/eng_int.h
 TO_REMOVE+=/usr/include/openssl/ui_locl.h
index c02b0ec..76b2427 100644 (file)
@@ -33,8 +33,6 @@
  * @(#)fortune.c   8.1 (Berkeley) 5/31/93
  * $FreeBSD: src/games/fortune/fortune/fortune.c,v 1.18.2.1 2001/07/02 00:35:27 dd Exp $
  */
-/* $FreeBSD: src/games/fortune/fortune/fortune.c,v 1.18.2.1 2001/07/02 00:35:27 dd Exp $ */
-/* $DragonFly: src/games/fortune/fortune/fortune.c,v 1.6 2006/08/08 16:58:59 pavalos Exp $ */
 
 #include <sys/param.h>
 #include <sys/stat.h>
@@ -951,9 +949,8 @@ get_fort(void)
                                            "    skip \"%s\", %d%% (choice = %d)\n",
                                            fp->name, fp->percent, choice));
                        }
-                       DPRINTF(1, (stderr,
-                                   "using \"%s\", %d%% (choice = %d)\n",
-                                   fp->name, fp->percent, choice));
+               DPRINTF(1, (stderr, "using \"%s\", %d%% (choice = %d)\n",
+                           fp->name, fp->percent, choice));
        }
        if (fp->percent != NO_PROB)
                get_tbl(fp);
index c2a88d6..908cc53 100644 (file)
@@ -117,6 +117,7 @@ void                *dlopen(const char *, int);
 void           *dlsym(void * __restrict, const char * __restrict);
 
 #if __BSD_VISIBLE
+void           *fdlopen(int, int);
 int             dladdr(const void * __restrict, Dl_info * __restrict);
 dlfunc_t        dlfunc(void * __restrict, const char * __restrict);
 int             dlinfo(void * __restrict, int, void * __restrict);
index 976fd20..3313c97 100644 (file)
@@ -87,6 +87,7 @@ MLINKS+=directory.3 closedir.3 directory.3 dirfd.3 directory.3 opendir.3 \
        directory.3 readdir.3 directory.3 readdir_r.3 directory.3 rewinddir.3 \
        directory.3 seekdir.3 directory.3 telldir.3 directory.3 fdopendir.3
 MLINKS+=dlsym.3 dlfunc.3
+MLINKS+=dlopen.3 fdlopen.3
 MLINKS+=devname.3 devname_r.3 devname.3 fdevname.3 devname.3 fdevname_r.3
 MLINKS+=endutxent.3 getutxent.3 endutxent.3 getutxid.3 \
        endutxent.3 getutxline.3 endutxent.3 pututxline.3 \
index fd263ce..249f0a9 100644 (file)
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd April 28, 2011
+.Dd April 6, 2012
 .Dt DLFCN 3
 .Os
 .Sh NAME
 .Nm dlopen ,
+.Nm fdlopen ,
 .Nm dlclose ,
 .Nm dlinfo ,
 .Nm dladdr ,
@@ -48,6 +49,8 @@ It is included in every dynamically linked program automatically.
 .In dlfcn.h
 .Ft "void *"
 .Fn dlopen "const char *name" "int mode"
+.Ft "void *"
+.Fn fdlopen "int fd" "int mode"
 .Ft int
 .Fn dlclose "void *handle"
 .Ft int
@@ -82,6 +85,7 @@ under program control.
 .Xr dlopen 3 ,
 .Xr dlsym 3 ,
 .Xr dlvsym 3 ,
+.Xr fdlopen 3 ,
 .Xr link 5
 .Sh HISTORY
 Some of the
index e5f0645..138a135 100644 (file)
@@ -174,6 +174,14 @@ dl_iterate_phdr(int (*callback)(struct dl_phdr_info *, size_t, void *),
        return callback(&phdr_info, sizeof(phdr_info), data);
 }
 
+#pragma weak fdlopen
+void *
+fdlopen(int fd, int mode)
+{
+        _rtld_error(sorry);
+        return NULL;
+}
+
 #pragma weak _rtld_addr_phdr
 int
 _rtld_addr_phdr(const void *addr, struct dl_phdr_info *phdr_info)
index 8261068..899bb66 100644 (file)
 .\" @(#) dlopen.3 1.6 90/01/31 SMI
 .\" $FreeBSD: head/lib/libc/gen/dlopen.3 211397 2010-08-16 15:18:30Z joel $
 .\"
-.Dd April 28, 2011
+.Dd April 6, 2012
 .Dt DLOPEN 3
 .Os
 .Sh NAME
-.Nm dlopen
+.Nm dlopen ,
+.Nm fdlopen
 .Nd returns handle to dynamically loaded shared object
 .Sh LIBRARY
 This function is not in a library.
@@ -45,12 +46,14 @@ It is included in every dynamically linked program automatically.
 .In dlfcn.h
 .Ft void *
 .Fn dlopen "const char *name" "int mode"
+.Ft void *
+.Fn fdlopen "int fd" "int mode"
 .Sh DESCRIPTION
 The
 .Fn dlopen
 function
 provides access to the shared object in
-.Fa path ,
+.Fa name ,
 returning a descriptor that can be used for later
 references to the object in calls to other dl functions.
 If
@@ -128,19 +131,52 @@ The same behaviour may be requested by
 option of the static linker
 .Xr ld 1 .
 .It Dv RTLD_NOLOAD
-Ony return valid handle for the object if it is already loaded in
+Only return valid handle for the object if it is already loaded in
 the process address space, otherwise
 .Dv NULL
 is returned.
 Other mode flags may be specified, which will be applied for promotion
 for the found object.
 .El
-.Sh RETURN VALUE
-The
+.Pp
+If
 .Fn dlopen
-function
-returns a null pointer in the event of an error.
+fails, it returns a null pointer, and sets an error condition which may
+be interrogated with
+.Fn dlerror .
+.Pp
 The
+.Fn fdlopen
+function is similar to
+.Fn dlopen ,
+but it takes the file descriptor argument
+.Fa fd ,
+which is used for the file operations needed to load an object
+into the address space.
+The file descriptor
+.Fa fd
+is not closed by the function regardless a result of execution,
+but a duplicate of the file descriptor is.
+This may be important if a
+.Xr lockf 3
+lock is held on the passed descriptor.
+The
+.Fa fd
+argument -1 is interpreted as a reference to the main
+executable of the process, similar to
+.Va NULL
+value for the
+.Fa name
+argument to
+.Fn dlopen .
+The
+.Fn fdlopen
+function can be used by the code that needs to perform
+additional checks on the loaded objects, to prevent races with
+symlinking or renames.
+.El
+.Sh RETURN VALUE
+The functions return a null pointer in the event of an error.
 Whenever an error has been detected, a message detailing it can be
 retrieved via a call to
 .Fn dlerror .
index 77e4615..881b922 100644 (file)
@@ -31,7 +31,6 @@
  * SUCH DAMAGE.
  *
  * @(#)ualarm.c        8.1 (Berkeley) 6/4/93
- * $DragonFly: src/lib/libc/gen/ualarm.c,v 1.4 2005/11/13 00:07:42 swildner Exp $
  */
 
 #include <sys/time.h>
@@ -57,6 +56,6 @@ ualarm(unsigned usecs, unsigned reload)
 
        if (setitimer(ITIMER_REAL, &new, &old) == 0)
                return (old.it_value.tv_sec * USPS + old.it_value.tv_usec);
-       /* else */
-               return (-1);
+
+       return (-1);
 }
index 2bd7033..3c279a7 100644 (file)
@@ -70,7 +70,7 @@ MLINKS+=remainder.3 remainderf.3 remainder.3 remainderl.3
 MLINKS+=remainder.3 remquo.3 remainder.3 remquof.3 remainder.3 remquol.3
 MLINKS+=finite.3 finitef.3
 MLINKS+=fma.3 fmaf.3 fma.3 fmal.3
-MLINKS+=lrint.3 lintf.3 lrint.3 lrintl.3
+MLINKS+=lrint.3 lrintf.3 lrint.3 lrintl.3
 MLINKS+=lrint.3 llrint.3 lrint.3 llrintf.3 lrint.3 llrintl.3
 MLINKS+=lround.3 lroundf.3 lround.3 lroundl.3
 MLINKS+=lround.3 llround.3 lround.3 llroundf.3 lround.3 llroundl.3
index b9f581f..80f30b5 100644 (file)
@@ -85,7 +85,7 @@
 .Ft void
 .Fo puffs_framev_enqueue_cb
 .Fa "struct puffs_usermount *pu" "int fd" "struct puffs_framebuf *pufbuf"
-.Fa "puffs_framebuf_cb fcb" "void *fcb_arg" "int flags"
+.Fa "puffs_framev_cb fcb" "void *fcb_arg" "int flags"
 .Fc
 .Ft void
 .Fo puffs_framev_enqueue_justsend
index 0e8bc13..af88c0c 100644 (file)
 .Ft int
 .Fo puffs_node_listextattr
 .Fa "struct puffs_usermount *pu" "puffs_cookie_t opc" "int attrnamespace"
-.Fa "size_t *attrssize" "uint8_t *attrs" "iint flag" "size_t *resid"
+.Fa "size_t *attrssize" "uint8_t *attrs" "int flag" "size_t *resid"
 .Fa "const struct puffs_cred *pcr"
 .Fc
 .Ft int
index 74752d8..17528fc 100644 (file)
@@ -86,7 +86,7 @@ static void digest_dynamic2(Obj_Entry *, const Elf_Dyn *, const Elf_Dyn *,
 static void digest_dynamic(Obj_Entry *, int);
 static Obj_Entry *digest_phdr(const Elf_Phdr *, int, caddr_t, const char *);
 static Obj_Entry *dlcheck(void *);
-static Obj_Entry *dlopen_object(const char *name, Obj_Entry *refobj,
+static Obj_Entry *dlopen_object(const char *name, int fd, Obj_Entry *refobj,
     int lo_flags, int mode);
 static Obj_Entry *do_load_object(int, const char *, char *, struct stat *, int);
 static int do_search_info(const Obj_Entry *obj, int, struct dl_serinfo *);
@@ -107,7 +107,7 @@ static void load_filtees(Obj_Entry *, int flags, RtldLockState *);
 static void unload_filtees(Obj_Entry *);
 static int load_needed_objects(Obj_Entry *, int);
 static int load_preload_objects(void);
-static Obj_Entry *load_object(const char *, const Obj_Entry *, int);
+static Obj_Entry *load_object(const char *, int fd, const Obj_Entry *, int);
 static void map_stacks_exec(RtldLockState *);
 static Obj_Entry *obj_from_addr(const void *);
 static void objlist_call_fini(Objlist *, Obj_Entry *, RtldLockState *);
@@ -126,6 +126,7 @@ static int resolve_objects_ifunc(Obj_Entry *first, bool bind_now,
     int flags, RtldLockState *lockstate);
 static int rtld_dirname(const char *, char *);
 static int rtld_dirname_abs(const char *, char *);
+static void *rtld_dlopen(const char *name, int fd, int mode);
 static void rtld_exit(void);
 static char *search_library_path(const char *, const char *);
 static const void **get_program_var_addr(const char *, RtldLockState *);
@@ -230,6 +231,7 @@ static func_ptr_type exports[] = {
     (func_ptr_type) &dlclose,
     (func_ptr_type) &dlerror,
     (func_ptr_type) &dlopen,
+    (func_ptr_type) &fdlopen,
     (func_ptr_type) &dlfunc,
     (func_ptr_type) &dlsym,
     (func_ptr_type) &dlvsym,
@@ -796,9 +798,10 @@ _rtld_bind(Obj_Entry *obj, Elf_Size reloff, void *stack)
        if (rtld_functrace(obj->path,
                           defobj->path,
                           defobj->strtab + def->st_name,
-                          stack))
-       lock_release(rtld_bind_lock, &lockstate);
-       return target;
+                          stack)) {
+           lock_release(rtld_bind_lock, &lockstate);
+           return target;
+       }
     }
 
     /*
@@ -1946,7 +1949,7 @@ load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags)
 {
 
     for (; needed != NULL; needed = needed->next) {
-       needed->obj = dlopen_object(obj->strtab + needed->name, obj,
+       needed->obj = dlopen_object(obj->strtab + needed->name, -1, obj,
          flags, ((ld_loadfltr || obj->z_loadfltr) ? RTLD_NOW : RTLD_LAZY) |
          RTLD_LOCAL);
     }
@@ -1970,7 +1973,7 @@ process_needed(Obj_Entry *obj, Needed_Entry *needed, int flags)
     Obj_Entry *obj1;
 
     for (; needed != NULL; needed = needed->next) {
-       obj1 = needed->obj = load_object(obj->strtab + needed->name, obj,
+       obj1 = needed->obj = load_object(obj->strtab + needed->name, -1, obj,
          flags & ~RTLD_LO_NOLOAD);
        if (obj1 == NULL && !ld_tracing && (flags & RTLD_LO_FILTEES) == 0)
            return (-1);
@@ -2020,7 +2023,7 @@ load_preload_objects(void)
 
        savech = p[len];
        p[len] = '\0';
-       obj = load_object(p, NULL, 0);
+       obj = load_object(p, -1, NULL, 0);
        if (obj == NULL)
            return -1;  /* XXX - cleanup */
        p[len] = savech;
@@ -2040,43 +2043,68 @@ load_preload_objects(void)
     return 0;
 }
 
+static const char *
+printable_path(const char *path)
+{
+
+       return (path == NULL ? "<unknown>" : path);
+}
+
 /*
- * Load a shared object into memory, if it is not already loaded.
+ * Load a shared object into memory, if it is not already loaded.  The
+ * object may be specified by name or by user-supplied file descriptor
+ * fd_u. In the later case, the fd_u descriptor is not closed, but its
+ * duplicate is.
  *
  * Returns a pointer to the Obj_Entry for the object.  Returns NULL
  * on failure.
  */
 static Obj_Entry *
-load_object(const char *name, const Obj_Entry *refobj, int flags)
+load_object(const char *name, int fd_u, const Obj_Entry *refobj, int flags)
 {
     Obj_Entry *obj;
-    int fd = -1;
+    int fd;
     struct stat sb;
     char *path;
 
-    for (obj = obj_list->next;  obj != NULL;  obj = obj->next)
-       if (object_match_name(obj, name))
-           return obj;
+    if (name != NULL) {
+       for (obj = obj_list->next;  obj != NULL;  obj = obj->next) {
+           if (object_match_name(obj, name))
+               return (obj);
+       }
 
-    path = find_library(name, refobj);
-    if (path == NULL)
-       return NULL;
+       path = find_library(name, refobj);
+       if (path == NULL)
+           return (NULL);
+    } else
+       path = NULL;
 
     /*
-     * If we didn't find a match by pathname, open the file and check
-     * again by device and inode.  This avoids false mismatches caused
-     * by multiple links or ".." in pathnames.
+     * If we didn't find a match by pathname, or the name is not
+     * supplied, open the file and check again by device and inode.
+     * This avoids false mismatches caused by multiple links or ".."
+     * in pathnames.
      *
      * To avoid a race, we open the file and use fstat() rather than
      * using stat().
      */
-    if ((fd = open(path, O_RDONLY)) == -1) {
-       _rtld_error("Cannot open \"%s\"", path);
-       free(path);
-       return NULL;
+    fd = -1;
+    if (fd_u == -1) {
+       if ((fd = open(path, O_RDONLY)) == -1) {
+           _rtld_error("Cannot open \"%s\"", path);
+           free(path);
+           return (NULL);
+       }
+    } else {
+       fd = dup(fd_u);
+       if (fd == -1) {
+           _rtld_error("Cannot dup fd");
+           free(path);
+           return (NULL);
+       }
     }
     if (fstat(fd, &sb) == -1) {
-       _rtld_error("Cannot fstat \"%s\"", path);
+       _rtld_error("Cannot fstat \"%s\"", printable_path(path));
        close(fd);
        free(path);
        return NULL;
@@ -2084,7 +2112,7 @@ load_object(const char *name, const Obj_Entry *refobj, int flags)
     for (obj = obj_list->next;  obj != NULL;  obj = obj->next)
        if (obj->ino == sb.st_ino && obj->dev == sb.st_dev)
            break;
-    if (obj != NULL) {
+    if (obj != NULL && name != NULL) {
        object_add_name(obj, name);
        free(path);
        close(fd);
@@ -2118,7 +2146,7 @@ do_load_object(int fd, const char *name, char *path, struct stat *sbp,
      */
     if (dangerous_ld_env) {
        if (fstatfs(fd, &fs) != 0) {
-           _rtld_error("Cannot fstatfs \"%s\"", path);
+           _rtld_error("Cannot fstatfs \"%s\"", printable_path(path));
                return NULL;
        }
        if (fs.f_flags & MNT_NOEXEC) {
@@ -2126,12 +2154,17 @@ do_load_object(int fd, const char *name, char *path, struct stat *sbp,
            return NULL;
        }
     }
-    dbg("loading \"%s\"", path);
-    obj = map_object(fd, path, sbp);
+    dbg("loading \"%s\"", printable_path(path));
+    obj = map_object(fd, printable_path(path), sbp);
     if (obj == NULL)
         return NULL;
 
-    object_add_name(obj, name);
+    /*
+     * If DT_SONAME is present in the object, digest_dynamic2 already
+     * added it to the object names.
+     */
+    if (name != NULL)
+       object_add_name(obj, name);
     obj->path = path;
     digest_dynamic(obj, 0);
     if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) ==
@@ -2703,6 +2736,20 @@ dlerror(void)
 
 void *
 dlopen(const char *name, int mode)
+{
+
+       return (rtld_dlopen(name, -1, mode));
+}
+
+void *
+fdlopen(int fd, int mode)
+{
+
+       return (rtld_dlopen(NULL, fd, mode));
+}
+
+static void *
+rtld_dlopen(const char *name, int fd, int mode)
 {
     RtldLockState lockstate;
     int lo_flags;
@@ -2724,7 +2771,7 @@ dlopen(const char *name, int mode)
     if (ld_tracing != NULL)
            lo_flags |= RTLD_LO_TRACE;
 
-    return (dlopen_object(name, obj_main, lo_flags,
+    return (dlopen_object(name, fd, obj_main, lo_flags,
       mode & (RTLD_MODEMASK | RTLD_GLOBAL)));
 }
 
@@ -2739,7 +2786,8 @@ dlopen_cleanup(Obj_Entry *obj)
 }
 
 static Obj_Entry *
-dlopen_object(const char *name, Obj_Entry *refobj, int lo_flags, int mode)
+dlopen_object(const char *name, int fd, Obj_Entry *refobj, int lo_flags,
+    int mode)
 {
     Obj_Entry **old_obj_tail;
     Obj_Entry *obj;
@@ -2754,11 +2802,11 @@ dlopen_object(const char *name, Obj_Entry *refobj, int lo_flags, int mode)
 
     old_obj_tail = obj_tail;
     obj = NULL;
-    if (name == NULL) {
+    if (name == NULL && fd == -1) {
        obj = obj_main;
        obj->refcount++;
     } else {
-       obj = load_object(name, refobj, lo_flags);
+       obj = load_object(name, fd, refobj, lo_flags);
     }
 
     if (obj) {
@@ -4377,6 +4425,10 @@ rtld_verify_object_versions(Obj_Entry *obj)
     const Obj_Entry *depobj;
     int maxvernum, vernum;
 
+    if (obj->ver_checked)
+       return (0);
+    obj->ver_checked = true;
+
     maxvernum = 0;
     /*
      * Walk over defined and required version records and figure out
index 3870177..718cf0e 100644 (file)
@@ -228,6 +228,7 @@ typedef struct Struct_Obj_Entry {
     bool mainprog : 1;         /* True if this is the main program */
     bool rtld : 1;             /* True if this is the dynamic linker */
     bool relocated : 1;                /* True if processed by relocate_objects() */
+    bool ver_checked : 1;      /* True if processed by rtld_verify_object_versions */
     bool textrel : 1;          /* True if there are relocations to text seg */
     bool symbolic : 1;         /* True if generated with "-Bsymbolic" */
     bool bind_now : 1;         /* True if all relocations should be made first */
index 0d0ddf3..751aade 100644 (file)
@@ -1176,7 +1176,7 @@ ip6fw_main(int ac, char **av)
        do_force = !isatty(STDIN_FILENO);
 
        while ((ch = getopt(ac, av ,"afqtN")) != -1)
-       switch(ch) {
+               switch(ch) {
                case 'a':
                        do_acct=1;
                        break;
@@ -1194,7 +1194,7 @@ ip6fw_main(int ac, char **av)
                        break;
                default:
                        show_usage(NULL);
-       }
+               }
 
        ac -= optind;
        if (*(av+=optind)==NULL) {
index d59ceda..5867fc0 100644 (file)
@@ -110,7 +110,7 @@ main(int argc, char *argv[])
        targ_fd = file_fd = kq_fd = -1;
        num_ctios = 0;
        sector_size = SECTOR_SIZE;
-       buf_size = DFLTPHYS;
+       buf_size = MAXPHYS;
 
        /* Prepare resource pools */
        TAILQ_INIT(&pending_queue);
index 096f38c..e559054 100644 (file)
@@ -23,6 +23,7 @@ MAN=  aac.4 \
        ahci.4 \
        ahd.4 \
        aibs.4 \
+       aic.4 \
        alc.4 \
        ale.4 \
        alpm.4 \
index 9f9aa60..32a0c2f 100644 (file)
@@ -14,7 +14,7 @@
 .\" TORTIOUS ACTION, ARISING OUT OF
 .\" PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd August 3, 2009
+.Dd April 7, 2012
 .Dt AHCI 4
 .Os
 .Sh NAME
@@ -91,6 +91,12 @@ some devices might not properly implement.
 hint.ahci.force150=1
 hint.ahci.nofeatures=1
 .Ed
+.Pp
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting the following tunable:
+.Bd -literal -offset indent
+hw.ahci.msi.enable=0
+.Ed
 .Sh SYSCTL VARIABLES
 Link power management can be set with the sysctl
 .Va hw.ahci%d.%d.link_pwr_mgmt
similarity index 68%
rename from share/man/man4/man4.i386/aic.4
rename to share/man/man4/aic.4
index eff9df3..a6892e4 100644 (file)
 .\" (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: src/share/man/man4/man4.i386/aic.4,v 1.6.2.3 2001/07/21 09:16:51 schweikh Exp $
+.\" $FreeBSD: src/share/man/man4/man4.i386/aic.4,v 1.16 2005/01/21 08:36:38 ru Exp $
 .\"
-.Dd November 8, 2003
-.Dt AIC 4 i386
+.Dd March 31, 2012
+.Dt AIC 4
 .Os
 .Sh NAME
 .Nm aic
 .Nd Adaptec AIC-6260 and AIC-6360 SCSI driver
 .Sh SYNOPSIS
-.Cd "device aic0 at isa? port 0x340 irq 11"
+.Cd "device aic"
 .Sh DESCRIPTION
 The
 .Nm
-driver provides support for the Adaptec AIC-6260 and AIC-6360 SCSI
+driver provides support for the Adaptec AHA-1460, AHA-1460B, AHA-1460C, and
+AHA-1460D PC Card adapters based on the Adaptec AIC-6260 and AIC-6360 SCSI
 controller chips.
 Many systems that use these controller chips do not have a boot ROM
 and therefore cannot be booted from.
-.Sh HARDWARE
-The adapters supported by the
-.Nm
-driver include:
-.Pp
-.Bl -bullet -compact
-.It
-Adaptec AHA-1505 (ISA)
-.It
-Adaptec AHA-1510A, AHA-1510B (ISA)
-.It
-Adaptec AHA-1520A, AHA-1520B (ISA)
-.It
-Adaptec AHA-1522A, AHA-1522B (ISA)
-.It
-Adaptec AHA-1535 (ISA)
-.It
-Creative Labs SoundBlaster SCSI host adapter (ISA)
-.It
-Adaptec AHA-1460, AHA-1460B, AHA-1460C, AHA-1460D (PC Card)
-.It
-Adaptec AHA-1030B, AHA-1030P (PC98)
-.It
-NEC PC-9801-100 (PC98)
-.El
 .Sh SEE ALSO
 .Xr ahc 4 ,
 .Xr cd 4 ,
@@ -74,5 +50,3 @@ NEC PC-9801-100 (PC98)
 The driver does not work well with multiple devices on the SCSI bus.
 The driver works well with devices like CDROMs and Tape drives.
 The driver works not so well with disk drives.
-The PC Card version appears to work better than the ISA version, but
-that may be due to differing levels of testing of the devices.
index 3c498ee..3711495 100644 (file)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man4/arcmsr.4,v 1.6 2008/03/28 23:25:58 brueffer Exp $
 .\"
-.Dd September 6, 2010
+.Dd April 7, 2012
 .Dt ARCMSR 4
 .Os
 .Sh NAME
@@ -65,6 +65,12 @@ A management interface is also present via the
 .Pa /dev/arcmsr?
 device node.
 Management tools for i386 and amd64 are available from Areca.
+.Sh LOADER TUNABLES
+.Bl -tag -width indent
+.It Va hw.arcmsr.msi.enable
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting this tunable to 0.
+.El
 .Sh HARDWARE
 The
 .Nm
index 61363ad..570edf6 100644 (file)
@@ -27,9 +27,8 @@
 .\" THE POSSIBILITY OF SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/share/man/man4/bce.4,v 1.7 2007/02/09 18:26:13 brueffer Exp $
-.\" $DragonFly: src/share/man/man4/bce.4,v 1.5 2008/07/22 11:49:22 sephe Exp $
 .\"
-.Dd May 29, 2008
+.Dd April 7, 2012
 .Dt BCE 4
 .Os
 .Sh NAME
@@ -185,6 +184,9 @@ How often status block should be updated by the device
 during host interrupt processing,
 due to receiving packets.
 Default value is 18 (microseconds).
+.It Va hw.bce.msi.enable
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting this tunable to 0.
 .El
 .Sh HARDWARE
 The
index 2f99fb5..1321499 100644 (file)
@@ -30,9 +30,8 @@
 .\" * Other names and brands may be claimed as the property of others.
 .\"
 .\" $FreeBSD: src/share/man/man4/em.4,v 1.30 2008/10/06 21:55:53 simon Exp $
-.\" $DragonFly: src/share/man/man4/em.4,v 1.12 2008/07/11 10:38:50 thomas Exp $
 .\"
-.Dd February 27, 2009
+.Dd April 7, 2012
 .Dt EM 4
 .Os
 .Sh NAME
@@ -221,6 +220,9 @@ If
 is not used on the hardware and
 the major part of the transmitted data are bulk data,
 this value could safely be set to 1/2 of the number of transmit descriptors.
+.It Va hw.em.msi.enable
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting this tunable to 0.
 .El
 .Sh DIAGNOSTICS
 .Bl -diag
index 9a72df0..751b88d 100644 (file)
@@ -60,8 +60,6 @@ Note that not all architectures support all devices.
 .Bl -tag -width 12n -offset indent -compact
 .It Xr adv 4
 Advansys SCSI host adapter driver
-.It Xr aic 4
-Adaptec AIC-6260 and AIC-6360 SCSI driver
 .It Xr bt 4
 Buslogic/Mylex MultiMaster SCSI host adapter driver
 .It Xr stg 4
index 6ca5130..93349e5 100644 (file)
@@ -29,7 +29,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man4/isp.4,v 1.29 2010/10/08 12:40:16 uqs Exp $
 .\"
-.Dd January 3, 2012
+.Dd April 7, 2012
 .Dt ISP 4
 .Os
 .Sh NAME
@@ -198,6 +198,12 @@ A hint value for a driver debug level (see the file
 .Pa /usr/src/sys/dev/isp/ispvar.h
 for the values.
 .El
+.Pp
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting the following tunable:
+.Bd -literal -offset indent
+hw.isp.msi.enable=0
+.Ed
 .Sh SYSCTL OPTIONS
 .Bl -tag -width indent
 .It Va dev.isp.N.loop_down_limit
index ca3bc29..b2c0c0f 100644 (file)
@@ -23,9 +23,8 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/share/man/man4/jme.4,v 1.1 2008/05/27 01:59:17 yongari Exp $
-.\" $DragonFly: src/share/man/man4/jme.4,v 1.3 2008/07/27 19:38:58 swildner Exp $
 .\"
-.Dd July 26, 2008
+.Dd April 7, 2012
 .Dt JME 4
 .Os
 .Sh NAME
@@ -101,6 +100,12 @@ The
 .Nm
 driver supports
 .Xr polling 4 .
+.Ss Loader Tunables
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting the following tunable:
+.Bd -literal -offset indent
+hw.jme.msi.enable=0
+.Ed
 .Ss MIB Variables
 A number of per-interface variables are implemented in the
 .Va hw.jme Ns Em X
index 92cfe35..b24cb7c 100644 (file)
@@ -1,6 +1,6 @@
 # $FreeBSD: src/share/man/man4/man4.i386/Makefile,v 1.122.2.12 2003/04/15 17:23:32 fjoe Exp $
 
-MAN=   aic.4 apm.4 ar.4 \
+MAN=   apm.4 ar.4 \
        cs.4 cy.4 \
        digi.4 en.4 ep.4 ex.4 fe.4 glxsb.4 \
        io.4 linux.4 lnc.4 longrun.4 \
index ffad85e..6d0e796 100644 (file)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man4/mfi.4,v 1.13 2010/05/12 17:12:38 brueffer Exp $
 .\"
-.Dd August 11, 2011
+.Dd April 7, 2012
 .Dt MFI 4
 .Os
 .Sh NAME
@@ -86,6 +86,12 @@ If the sysctl
 .Va dev.mfi.%d.delete_busy_volumes
 is set to 1,
 then the driver will allow mounted volumes to be removed.
+.Sh LOADER TUNABLES
+.Bl -tag -width indent
+.It Va hw.mfi.msi.enable
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting this tunable to 0.
+.El
 .Sh HARDWARE
 The
 .Nm
@@ -127,6 +133,22 @@ Dell PERC5
 .It
 Dell PERC6
 .It
+Dell PERC H710 Embedded
+.It
+Dell PERC H710 Adapter
+.It
+Dell PERC H710 Mini (blades)
+.It
+Dell PERC H710 Mini (monolithics)
+.It
+Dell PERC H710P Adapter
+.It
+Dell PERC H710P Mini (blades)
+.It
+Dell PERC H710P Mini (monolithics)
+.It
+Dell PERC H810 Adapter
+.It
 IBM ServeRAID M1015 SAS/SATA
 .It
 IBM ServeRAID M5015 SAS/SATA
@@ -134,6 +156,10 @@ IBM ServeRAID M5015 SAS/SATA
 IBM ServeRAID-MR10i
 .It
 Intel RAID Controller SROMBSAS18E
+.It
+Intel RAID Controller RS25DB080
+.It
+Intel RAID Controller RS25NB008
 .El
 .Sh FILES
 .Bl -tag -width ".Pa /dev/mfisyspd?" -compact
index 5f0970d..6ce4e60 100644 (file)
@@ -23,9 +23,8 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/share/man/man4/snd_hda.4,v 1.10.2.1 2007/05/15 18:40:22 joel Exp $
-.\" $DragonFly: src/share/man/man4/snd_hda.4,v 1.2 2007/06/16 17:44:33 hasso Exp $
 .\"
-.Dd May 5, 2007
+.Dd April 7, 2012
 .Dt SND_HDA 4
 .Os
 .Sh NAME
@@ -89,6 +88,12 @@ Polling is disabled by default.
 Do not enable it unless you are facing weird interrupt problems or if the
 device cannot generate interrupts at all.
 .El
+.Sh LOADER TUNABLES
+.Bl -tag -width indent
+.It Va hw.snd.hdac.msi.enable
+By default, the driver will use MSI if it is supported.
+This behavior can be turned off by setting this tunable to 0.
+.El
 .Sh HARDWARE
 The
 .Nm
index 1597a8e..5d61aa9 100644 (file)
@@ -338,8 +338,8 @@ the
 .Fa done
 routine can also calculate the time passed from dispatch to completion
 by getting the current time again (via
-.Fn getmicrotime ) and
-calculating the timeval difference to the value stored in
+.Fn getmicrotime )
+and calculating the timeval difference to the value stored in
 .Fa bio->bio_caller_info3.tv .
 At the end of the
 .Fa done
index 3a08a86..4cc6b51 100644 (file)
@@ -104,7 +104,7 @@ and
 functions is determined by the maximum I/O size supported by the device
 .Fa dev ,
 otherwise the value of
-.Dv DFLTPHYS
+.Dv MAXPHYS
 is used.
 Until the I/O operation is complete, the calling process or thread is
 put to sleep with the wait message set to
index f2a8ba7..27618a6 100644 (file)
@@ -1,8 +1,8 @@
 #
 #      List of PCI ID's
 #
-#      Version: 2012.02.27
-#      Date:    2012-02-27 03:15:01
+#      Version: 2012.04.04
+#      Date:    2012-04-04 03:15:01
 #
 #      Maintained by Martin Mares <mj@ucw.cz> and other volunteers from the
 #      PCI ID Project at http://pci-ids.ucw.cz/.
                1028 1f35  PERC H710 Adapter
                1028 1f37  PERC H710 Mini (for blades)
                1028 1f38  PERC H710 Mini (for monolithics)
+               8086 3513  RMS25PB080 RAID Controller
        005c  SAS1064A PCI-X Fusion-MPT SAS
        005d  MegaRAID SAS-3 3108 [Invader]
        005e  SAS1066 PCI-X Fusion-MPT SAS
        0085  SAS2208 PCI-Express Fusion-MPT SAS-2
        0086  SAS2308 PCI-Express Fusion-MPT SAS-2
        0087  SAS2308 PCI-Express Fusion-MPT SAS-2
+               1590 0044  H220i
        008f  53c875J
                1092 8000  FirePort 40 SCSI Controller
                1092 8760  FirePort 40 Dual SCSI Host Adapter
        5e6d  RV410 [Radeon X700 (PCIE)] (Secondary)
                148c 2117  PowerColor Bravo X700
        5f57  R423 [Radeon X800XT (PCIE)]
+       6707  Cayman LE GL [FirePro V5900]
        6718  Cayman XT [Radeon HD 6970]
        6719  Cayman PRO [Radeon HD 6950]
        671d  Antilles [AMD Radeon HD 6990]
        6741  Whistler [AMD Radeon HD 6600M Series]
        6742  Whistler LE [AMD Radeon HD 6625M Graphics]
        6743  Whistler [Radeon E6760]
+       6749  Turks [FirePro V4900]
        6750  Turks [AMD Radeon HD 6570]
        6751  Turks [Radeon HD 7600A Series]
        6758  Turks [Radeon HD 6670]
        6798  Tahiti XT [Radeon HD 7970]
        6799  New Zealand [Radeon HD 7990]
        679a  Tahiti PRO [Radeon HD 7950]
+       6800  WIMBLEDON XT [Radeon HD 7970M]
+       6818  PITCAIRN [Radeon HD 7800]
+       6819  PITCAIRN PRO [Radeon HD 7800 Series]
        6840  Thames XT/GL [Radeon HD 7600M Series]
        6841  Thames [Radeon 7500M/7600M Series]
        6843  Thames [Radeon HD 7670M]
                1014 033b  PCIe2 6Gb SAS RAID Adapter Quad-port (57B4)
                1014 0355  PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57B1)
                1014 0357  PCIe2 6Gb SAS Adapter Quad-port (57C6)
-               1014 035d  PCIe2 3.6GB Cache 6Gb SAS RAID & SSD Adapter (575D)
+               1014 035d  PCIe3 1.8GB Cache RAID SAS Adapter Quad-port 6GB (57C8)
                1014 035e  PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57CE)
        3022  QLA3022 Network Adapter
        4022  QLA3022 Network Adapter
        00cf  AIC-7899P U160/m
                1028 0106  PowerEdge 4600
                1028 0121  PowerEdge 2650
-102b  Matrox Graphics, Inc.
+102b  Matrox Electronics Systems Ltd.
 # DJ: I've a suspicion that 0010 is a duplicate of 0d10.
        0010  MGA-I [Impression?]
        0100  MGA 1064SG [Mystique]
                102b 0101  Millenium P690 PCI
                102b 0140  Millenium P690 LP PCIe x1
                102b 0180  Display Wall IP Decode 128 MB
+       4164  Morphis QxT frame grabber
+       43b4  Morphis Qxt encoding engine
+       4510  Morphis COM port
        4536  VIA Framegrabber
-       4cdc  Morphis Vision System Jpeg2000
-       4fc5  Morphis Vision System
-       5e10  Morphis Vision System Aux/IO
+       4686  Concord GX (customized Intel 82541)
+       475b  Solios eCL/XCL-B frame grabber
+       475d  Vio frame grabber family
+               102b 4b90  Vio Duo frame grabber (single channel)
+               102b 4b91  Vio Duo frame grabber
+               102b 4b92  Vio Analog frame grabber
+               102b 4b93  Vio SDI Frame Grabber
+               102b 4b94  Vio DVI-A frame grabber
+       475f  Solios (single-Full) CL frame grabber
+               102b 475f  Solios eCL/XCL-F frame grabber
+               102b 4d5f  Solios eV-CL (single-Full) frame grabber
+               102b 4e5f  Solios eM-CL (single-Full) frame grabber
+       47a1  Solios eA/XA frame grabber
+               102b 4be0  Solios eA/XA (single) frame grabber
+               102b 4be1  Solios eA/XA (dual) frame grabber
+               102b 4be2  Solios eA/XA (quad) frame grabber
+       47a2  Solios COM port
+       47c1  Solios (dual-Base/single-Medium) CL frame grabber
+               102b 0000  Solios frame grabber
+               102b 4b80  Solios eCL/XCL (single-Medium) frame grabber
+               102b 4b81  Solios eCL/XCL (dual-Base) frame grabber
+               102b 4d80  Solios eV-CL (single-Medium) frame grabber
+               102b 4d81  Solios eV-CL (dual-Base) frame grabber
+               102b 4e80  Solios eM-CL (single-Medium) frame grabber
+               102b 4e81  Solios eM-CL (dual-Base) frame grabber
+       47c2  Solios COM port
+       4949  Radient frame grabber family
+               102b 0010  Radient eCL (Single-full) frame grabber
+               102b 0020  Radient eCL (Dual-base) frame grabber
+               102b 0030  Radient eCL (Dual-full) frame grabber
+               102b 0040  Radient eCL (Quad-base) frame grabber
+               102b 0050  Radient eCL (Golden) frame grabber
+       4cdc  Morphis JPEG2000 accelerator
+       4f54  Morphis (e)Quad frame grabber
+       4fc5  Morphis (e)Dual frame grabber
+       5e10  Morphis aux I/O
        6573  Shark 10/100 Multiport SwitchNIC
 102c  Chips and Technologies
        00b8  F64310
        8664  PEX 8664 64-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch
        8680  PEX 8680 80-lane, 20-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
        8696  PEX 8696 96-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
+       8732  PEX 8732 32-lane, 8-Port PCI Express Gen 3 (8.0 GT/s) Switch
+# This is the Non-Transparent-Bridge Virtualized Port as presented by the PLX PEX 8732 chip, the physical bridges show up at 10b5:8732
+       87b0  PEX 8732 32-lane, 8-Port PCI Express Gen 3 (8.0 GT/s) Switch
        9016  PLX 9016 8-port serial controller
        9030  PCI9030 32-bit 33MHz PCI <-> IOBus Bridge
                10b5 2695  Hilscher CIF50-PB Profibus Master Board
                19da a123  IONITX-F-E
        087e  ION LE VGA
        087f  ION LE VGA
-       08a4  GT216 [GeForce 320M]
+       08a3  MCP89 [GeForce 320M]
+       08a4  MCP89 [GeForce 320M]
        0a20  GT216 [GeForce GT 220]
                1043 8311  ENGT220/DI/1GD3(LP)/V2
        0a23  GT218 [GeForce 210]
        0df2  GF108 [GeForce GT 435M]
        0df4  GF108 [GeForce GT 540M]
        0df5  GF108 [GeForce GT 540M]
+       0df7  GF108 [GeForce GT 520M]
        0df8  GF108 [Quadro 600]
        0dfa  GF108 [Quadro 1000M]
        0e08  HDMI Audio stub
        0e09  GF110 High Definition Audio Controller
+       0e0a  GK104 [Geforce GTX680]
        0e0c  GF110 High Definition Audio Controller
        0e22  GF104 [GeForce GTX 460]
                1462 2322  N460GTX Cyclone 1GD5/OC
        0e3a  GF104 [Quadro 3000M]
        0e3b  GF104 [Quadro 4000M]
+       0fd2  GK107 [GeForce GT 640M]
        1040  GF119 [GeForce GT 520]
        1050  GF119 [GeForce GT 520M]
        1051  GF119 [GeForce GT 520MX]
                10de 066d  G98 [GeForce 8400GS]
        10c5  Dell M116N [GeForce 405]
        10d8  GT218 [NVS 300]
+       1180  GK104 [GeForce GTX 680]
        1200  GF110 [GeForce GTX 560 Ti]
        1201  GF114 [GeForce GTX 560]
        1205  GF114 [GeForce GTX 460 v2]
        0885  Realtek 885 High Definition Audio
        0888  Realtek 888 High Definition Audio
                1028 020d  Inspiron 530
-       5209  RTS5116 PCI Express Card Reader
-       5288  PCI Express Card Reader
+       5209  RTS5209 PCI Express Card Reader
+       5229  RTS5229 PCI Express Card Reader
+       5288  Barossa PCI Express Card Reader
        8029  RTL-8029(AS)
                10b8 2011  EZ-Card (SMC1208)
                10ec 8029  RTL-8029(AS)
        0007  Default PCIe endpoint ID
        0205  Wildcard TE205P
        0210  Wildcard TE210P
-       0300  Active Silicon Phoenix Frame Grabbers
+       0300  Spartan 3 Designs (Xilinx IP)
        0314  Wildcard TE405P/TE410P (1st Gen)
        0405  Wildcard TE405P (2nd Gen)
        0410  Wildcard TE410P (2nd Gen)
-       0600  Active Silicon Firebird Frame Grabbers
+       0600  Xilinx 6 Designs (Xilinx IP)
        2b00  Zomojo Zcard
        3fc0  RME Digi96
        3fc1  RME Digi96/8
        2340  RocketRAID 2340 16 Port SATA-II Controller
        2640  RocketRAID 2640 SAS/SATA Controller
        2722  RocketRAID 2722
+# SFF-8087 Mini-SAS 16 port internal
+       2740  RocketRAID 2740
+# SFF-8088 Mini-SAS 16 port external
+       2744  RocketRaid 2744
+# SFF-8088 8 port external / SFF-8087 24 port internal
+       2782  RocketRAID 2782
        3120  RocketRAID 3120
        3220  RocketRAID 3220
        3320  RocketRAID 3320
                1028 040b  Latitude E6510
        e832  R5C832 PCIe IEEE 1394 Controller
                1028 040b  Latitude E6510
+       e852  PCIe xD-Picture Card Controller
 1181  Telmatics International
 1183  Fujikura Ltd
 1184  Forks Inc
        4368  88EC034 Ethernet Controller
        4369  88EC042 Ethernet Controller
        436a  88E8058 PCI-E Gigabit Ethernet Controller
+               11ab 00ba  Imac 8,1 Wired Ethernet Adapter
        436b  88E8071 PCI-E Gigabit Ethernet Controller
        436c  88E8072 PCI-E Gigabit Ethernet Controller
        436d  88E8055 PCI-E Gigabit Ethernet Controller
 1217  O2 Micro, Inc.
        00f7  Firewire (IEEE 1394)
                1179 ff50  Satellite P305D-S8995E
+       10f7  1394 OHCI Compliant Host Controller
        11f7  OZ600 1394a-2000 Controller
        13f7  1394 OHCI Compliant Host Controller
        6729  OZ6729
                103c 0890  NC6000 laptop
                10cf 11c4  Lifebook P5020D Laptop
        7233  OZ711MP3/MS3 4-in-1 MemoryCardBus Controller
+       8120  Integrated MMC/SD Controller
+       8130  Integrated MS/MSPRO/xD Controller
        8321  Integrated MMC/SD controller
        8331  O2 Flash Memory Card
 1218  Hybricon Corp.
        0057  Voodoo 3/3000 [Avenger]
 121b  Advanced Telecommunications Modules
 121c  Nippon Texaco., Ltd
-121d  Lippert Automationstechnik GmbH
+121d  LiPPERT ADLINK Technology GmbH
 121e  CSPI
        0201  Myrinet 2000 Scalable Cluster Interconnect
 121f  Arcus Technology, Inc.
        167f  NetLink BCM5787F Fast Ethernet PCI Express
        1680  NetXtreme BCM5761e Gigabit Ethernet PCIe
        1681  NetXtreme BCM5761 Gigabit Ethernet PCIe
+       1682  NetXtreme BCM57762 Gigabit Ethernet PCIe
        1684  NetXtreme BCM5764M Gigabit Ethernet PCIe
        1685  NetXtreme II BCM57500S Gigabit Ethernet
-       168a  NetXtreme II BCM57800 10 Gigabit Ethernet
+       1686  NetXtreme BCM57766 Gigabit Ethernet PCIe
+# The Broadcom 57800 device has two 1Gig ports and two 10Gig ports. The subsystem information can be used to differentiate.
+       168a  NetXtreme II BCM57800 1/10 Gigabit Ethernet
+               1028 1f5c  BCM57800 10-Gigabit Ethernet
+               1028 1f5d  BCM57800 10-Gigabit Ethernet
+               1028 1f67  BCM57800 1-Gigabit Ethernet
+               1028 1f68  BCM57800 1-Gigabit Ethernet
        168d  NetXtreme II BCM57840 10/20 Gigabit Ethernet
        168e  NetXtreme II BCM57810 10 Gigabit Ethernet
        1690  NetXtreme BCM57760 Gigabit Ethernet PCIe
                1462 590c  KT6 Delta-FIS2R (MS-6590)
        169d  NetLink BCM5789 Gigabit Ethernet PCI Express
        16a0  NetLink BCM5785 Fast Ethernet
-       16a5  NetXtreme II BCM57800 10 Gigabit Ethernet Multi Function
+# The Broadcom 57800 device has two 1Gig ports and two 10Gig ports. The subsystem information can be used to differentiate.
+       16a5  NetXtreme II BCM57800 1/10 Gigabit Ethernet Multi Function
+               1028 1f5c  NetXtreme II BCM57800 10-Gigabit Ethernet Multi Function
+               1028 1f5d  NetXtreme II BCM57800 10-Gigabit Ethernet Multi Function
+               1028 1f67  NetXtreme II BCM57800 1-Gigabit Ethernet Multi Function
+               1028 1f68  NetXtreme II BCM57800 1-Gigabit Ethernet Multi Function
        16a6  NetXtreme BCM5702X Gigabit Ethernet
                0e11 00bb  NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
                1028 0126  BCM5702 1000Base-T
                10a9 8014  Dual Port Gigabit Ethernet (PCI-X,Fiber)
                10a9 801c  Quad Port Gigabit Ethernet (PCI-E,Fiber)
                10b7 2001  3C998-SX Dual Port 1000-SX PCI-X
-       16a9  NetXtreme II BCM57800 10 Gigabit Ethernet Virtual Function
+# The Broadcom 57800 device has two 1Gig ports and two 10Gig ports. The subsystem information can be used to differentiate.
+       16a9  NetXtreme II BCM57800 1/10 Gigabit Ethernet Virtual Function
+               1028 1f5c  NetXtreme II BCM57800 10-Gigabit Ethernet Virtual Function
+               1028 1f5d  NetXtreme II BCM57800 10-Gigabit Ethernet Virtual Function
+               1028 1f67  NetXtreme II BCM57800 1-Gigabit Ethernet Virtual Function
+               1028 1f68  NetXtreme II BCM57800 1-Gigabit Ethernet Virtual Function
        16aa  NetXtreme II BCM5706S Gigabit Ethernet
                103c 3102  NC370F MultifuNCtion Gigabit Server Adapter
                103c 310c  NC370i Multifunction Gigabit Server Adapter
        16b0  NetXtreme BCM57761 Gigabit Ethernet PCIe
        16b1  NetLink BCM57781 Gigabit Ethernet PCIe
        16b2  NetLink BCM57791 Gigabit Ethernet PCIe
+       16b3  NetXtreme BCM57786 Gigabit Ethernet PCIe
        16b4  NetXtreme BCM57765 Gigabit Ethernet PCIe
        16b5  NetLink BCM57785 Gigabit Ethernet PCIe
        16b6  NetLink BCM57795 Gigabit Ethernet PCIe
+       16b7  NetXtreme BCM57782 Gigabit Ethernet PCIe
        16bc  NetXtreme BCM57765 Memory Card Reader
        16c6  NetXtreme BCM5702A3 Gigabit Ethernet
                10b7 1100  3C1000B-T 10/100/1000 PCI
        5702  PMC-SLX150-1M: Reconfigurable Spartan-6 FPGA with plug-in I/O
        5801  XMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O
        5802  XMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O
+       5803  XMC-VSX95 Reconfigurable Virtex-5 FPGA with plug-in I/O
        5804  XMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O
        5807  XMC-SLX150: Reconfigurable Spartan-6 FPGA with plug-in I/O
        5808  XMC-SLX150-1M: Reconfigurable Spartan-6 FPGA with plug-in I/O
        0200  RT2500 802.11g PCI [PC54G2]
        0201  RT2500 Wireless 802.11bg
                1043 130f  WL-130g
+               1186 3c00  DWL-G650X Wireless 11g CardBus Adapter
                1371 001e  CWC-854 Wireless-G CardBus Adapter
                1371 001f  CWM-854 Wireless-G Mini PCI Adapter
                1371 0020  CWP-854 Wireless-G PCI Adapter
                1814 2560  RT2500 Wireless 802.11bg
                182d 9073  WL-115 Wireless Network PCI Adapter
                185f 22a0  CN-WF513 Wireless Cardbus Adapter
+               18eb 5312  Tornado 122 IEEE 802.11g PCI Card-EU
                1948 3c00  C54RC v1 Wireless 11g CardBus Adapter
                1948 3c01  C54Ri v1 Wireless 11g PCI Adapter
        0300  Wireless Adapter Canyon CN-WF511
        0601  RT2800 802.11n PCI
                1799 801c  F5D8011 v3 802.11n N1 Wireless Notebook Card
                187e 3412  NWD-310N 802.11n Wireless PCI Adapter
-       0681  RT2860 Wireless 802.11n PCIe
+       0681  RT2890 Wireless 802.11n PCIe
                1458 e939  GN-WS30N-RH 802.11bgn Mini PCIe Card
        0701  RT2760 Wireless 802.11n 1T/2R
                1737 0074  WMP110 v2 802.11n RangePlus Wireless PCI Adapter
                13bd 1057  GN-WS32L-RH Half-size Mini PCIe Card
        3091  RT3091 Wireless 802.11n 1T/2R PCIe
        3092  RT3092 Wireless 802.11n 2T/2R PCIe
+       5360  RT5360
        5390  RT5390 Wireless 802.11n 1T/1R PCIe
                103c 1636  U98Z077.00 Half-size Mini PCIe Card
        539f  RT5390 [802.11 b/g/n 1T1R G-band PCI Express Single Chip]
        0111  P1022
        0118  P1013E
        0119  P1013
+       0128  P1010
        0400  P4080E
        0401  P4080
        0408  P4040E
        8001  RapidFile
 198a  Nallatech Ltd.
 1993  Innominate Security Technologies AG
+1999  A-Logics
+       a900  AM-7209 Video Processor
 199a  Pulse-LINK, Inc.
 199d  Xsigo Systems
        8209  Virtual NIC Device
 1a76  Wavesat
 1a77  Lightfleet Corporation
 1a78  Virident Systems Inc.
-       0031  Virident tachIOn Drive
-               1a78 0034  tachIOn PCIe SSD [rev 3]
-               1a78 0037  tachIOn PCIe SSD [rev 3D]
-               1a78 0038  tachIOn PCIe SSD [rev 4]
-               1a78 0039  tachIOn PCIe SSD [rev 4D]
+       0031  Virident FlashMAX Drive
+               1a78 0034  FlashMAX PCIe SSD [rev 3]
+               1a78 0037  FlashMAX PCIe SSD [rev 3D]
+               1a78 0038  FlashMAX PCIe SSD [rev 4]
+               1a78 0039  FlashMAX PCIe SSD [rev 4D]
                1a78 0040  FlashMAX PCIe SSD [LP Z1]
 1a84  Commex Technologies
        0001  Vulcan SP HT6210 10-Gigabit Ethernet (rev 02)
 1ab6  CalDigit, Inc.
        6201  RAID Card
 1ab9  Espia Srl
+1acc  Point of View B.V
 1ad7  Spectracom Corporation
        8000  TSync-PCIe Time Code Processor
        9100  TPRO-PCI-66U Timecode Reader/Generator
        5308  BC-H08240A 8 port H.264 video and audio encoder / decoder
        5310  BC-H16480A 16 port H.264 video and audio encoder / decoder
 1bb5  Quantenna Communications, Inc.
+1bbf  Maxeler Technologies Ltd.
+       0003  MAX3
 1bf4  VTI Instruments Corporation
 1c1c  Symphony
        0001  82C101
                1092 5a55  Viper II Z200
                1092 5a57  Viper II Z200
        ca00  SonicVibes
+53c1  SC1-ALLEGRO
+       0cd1  CD1-OPERA
 5431  AuzenTech, Inc.
 544c  Teralogic Inc
        0350  TL880-based HDTV/ATSC tuner
                8086 0001  Gigabit CT2 Desktop Adapter
                8086 a01f  Gigabit CT Desktop Adapter
                e4bf 50c1  PC1-GROOVE
+               e4bf 50c2  PC2-LIMBO
+       10d4  Matrox Concord GE (customized Intel 82574)
        10d5  82571PT Gigabit PT Quad Port Server ExpressModule
        10d6  82575GB Gigabit Network Connection
                8086 10d6  Gigabit VT Quad Port Server Adapter
        1511  82580 Gigabit SFP Connection
        1514  82599EB 10 Gigabit KX4 Network Connection
                8086 000b  Ethernet X520 10GbE Dual Port KX4 Mezz
+       1515  X540 Ethernet Controller Virtual Function
        1516  82580 Gigabit Network Connection
                8086 12b1  Ethernet Server Adapter I340-T2
                8086 12b2  Ethernet Server Adapter I340-T2
        1518  82576NS SerDes Gigabit Network Connection
        151c  82599EB 10 Gigabit TN Network Connection
                108e 7b13  Dual 10GBASE-T LP
+       1520  I350 Ethernet Controller Virtual Function
        1521  I350 Gigabit Network Connection
                1028 1f60  Intel GbE 4P I350crNDC
                1028 1f62  Intel GbE 2P I350crNDC
        1527  82580 Gigabit Fiber Network Connection
                8086 0001  Ethernet Server Adapter I340-F4
                8086 0002  Ethernet Server Adapter I340-F4
-       1528  Ethernet Controller 10 Gigabit X540-AT2
+       1528  Ethernet Controller 10-Gigabit X540-AT2
                108e 7b14  Sun Dual Port 10 GbE PCIe 2.0 ExpressModule, Base-T
                108e 7b15  Sun Dual Port 10 GbE PCIe 2.0 Low Profile Adapter, Base-T
                8086 0001  Ethernet Converged Network Adapter X540-T2
        1c5d  6 Series/C200 Series Chipset Family LPC Controller
        1c5e  6 Series/C200 Series Chipset Family LPC Controller
        1c5f  6 Series/C200 Series Chipset Family LPC Controller
-       1d00  X79 series chipset 4-Port SATA IDE Controller
-       1d02  X79 series chipset 6-Port SATA AHCI Controller
-       1d04  X79 series chipset SATA RAID Controller
-       1d06  Patsburg SATA Premium RAID Controller
-       1d08  X79 series chipset 2-Port SATA IDE Controller
-       1d10  X79 series chipset PCI Express Root Port 1
-       1d11  X79 series chipset PCI Express Root Port 1
-       1d12  X79 series chipset PCI Express Root Port 2
-       1d13  X79 series chipset PCI Express Root Port 2
-       1d14  X79 series chipset PCI Express Root Port 3
-       1d15  X79 series chipset PCI Express Root Port 3
-       1d16  X79 series chipset PCI Express Root Port 4
-       1d17  X79 series chipset PCI Express Root Port 4
-       1d18  X79 series chipset PCI Express Root Port 5
-       1d19  X79 series chipset PCI Express Root Port 5
-       1d1a  X79 series chipset PCI Express Root Port 6
-       1d1b  X79 series chipset PCI Express Root Port 6
-       1d1c  X79 series chipset PCI Express Root Port 7
-       1d1d  X79 series chipset PCI Express Root Port 7
-       1d1e  X79 series chipset PCI Express Root Port 8
-       1d1f  X79 series chipset PCI Express Root Port 8
-       1d20  X79 series chipset High Definition Audio Controller
-       1d22  X79 series chipset SMBus Host Controller
-       1d24  X79 series chipset Thermal Management Controller
-       1d25  X79 series chipset DMI to PCI Bridge
-       1d26  X79 series chipset USB2 Enhanced Host Controller #1
-       1d2d  X79 series chipset USB2 Enhanced Host Controller #2
-       1d33  X79 series chipset LAN Controller
-       1d35  Patsburg VECI Controller
-       1d3a  X79 series chipset HECI Controller #2
-       1d3b  X79 series chipset IDE-r Controller
-       1d3d  X79 series chipset KT Controller
-       1d3e  Patsburg PCI Express Virtual Root Port
-       1d3f  Patsburg PCI Express Virtual Switch Port
-       1d40  X79 series chipset LPC Controller
-       1d41  X79 series chipset LPC Controller
-       1d50  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d54  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d55  X79 series chipset 4-Port SATA/SAS Storage Control Unit
-       1d58  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d59  X79 series chipset 4-Port SATA/SAS Storage Control Unit
-       1d5a  Patsburg Dual 4-Port SATA Storage Control Unit
-       1d5b  Patsburg 4-Port SATA Storage Control Unit
-       1d5c  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d5d  Patsburg 4-Port SATA/SAS Storage Control Unit
-       1d5e  Patsburg Dual 4-Port SATA Storage Control Unit
-       1d5f  Patsburg 4-Port SATA Storage Control Unit
-       1d60  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d64  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d65  X79 series chipset 4-Port SATA/SAS Storage Control Unit
-       1d68  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d69  X79 series chipset 4-Port SATA/SAS Storage Control Unit
-       1d6a  Patsburg Dual 4-Port SATA Storage Control Unit
-       1d6b  Patsburg 4-Port SATA Storage Control Unit
-       1d6c  Patsburg Dual 4-Port SATA/SAS Storage Control Unit
-       1d6d  Patsburg 4-Port SATA/SAS Storage Control Unit
-       1d6e  Patsburg Dual 4-Port SATA Storage Control Unit
-       1d6f  Patsburg 4-Port SATA Storage Control Unit
-       1d70  X79 series chipset SMBus Controller 0
-       1d71  Patsburg SMBus Controller 1
-       1d72  Patsburg SMBus Controller 2
-       1d73  Patsburg Integrated NVSRAM Controller
-       1d74  Patsburg PCI Express Upstream Port
-       1d76  Patsburg Multi-Function Glue
+       1d00  C600/X79 series chipset 4-Port SATA IDE Controller
+       1d02  C600/X79 series chipset 6-Port SATA AHCI Controller
+       1d04  C600/X79 series chipset SATA RAID Controller
+       1d06  C600/X79 series chipset SATA Premium RAID Controller
+       1d08  C600/X79 series chipset 2-Port SATA IDE Controller
+       1d10  C600/X79 series chipset PCI Express Root Port 1
+       1d11  C600/X79 series chipset PCI Express Root Port 1
+       1d12  C600/X79 series chipset PCI Express Root Port 2
+       1d13  C600/X79 series chipset PCI Express Root Port 2
+       1d14  C600/X79 series chipset PCI Express Root Port 3
+       1d15  C600/X79 series chipset PCI Express Root Port 3
+       1d16  C600/X79 series chipset PCI Express Root Port 4
+       1d17  C600/X79 series chipset PCI Express Root Port 4
+       1d18  C600/X79 series chipset PCI Express Root Port 5
+       1d19  C600/X79 series chipset PCI Express Root Port 5
+       1d1a  C600/X79 series chipset PCI Express Root Port 6
+       1d1b  C600/X79 series chipset PCI Express Root Port 6
+       1d1c  C600/X79 series chipset PCI Express Root Port 7
+       1d1d  C600/X79 series chipset PCI Express Root Port 7
+       1d1e  C600/X79 series chipset PCI Express Root Port 8
+       1d1f  C600/X79 series chipset PCI Express Root Port 8
+       1d20  C600/X79 series chipset High Definition Audio Controller
+       1d22  C600/X79 series chipset SMBus Host Controller
+       1d24  C600/X79 series chipset Thermal Management Controller
+       1d25  C600/X79 series chipset DMI to PCI Bridge
+       1d26  C600/X79 series chipset USB2 Enhanced Host Controller #1
+       1d2d  C600/X79 series chipset USB2 Enhanced Host Controller #2
+       1d33  C600/X79 series chipset LAN Controller
+       1d35  C600/X79 series chipset VECI Controller
+       1d3a  C600/X79 series chipset MEI Controller #1
+       1d3b  C600/X79 series chipset MEI Controller #2
+       1d3c  C600/X79 series chipset IDE-r Controller
+       1d3d  C600/X79 series chipset KT Controller
+       1d3e  C600/X79 series chipset PCI Express Virtual Root Port
+       1d3f  C608/C606/X79 series chipset PCI Express Virtual Switch Port
+       1d40  C600/X79 series chipset LPC Controller
+       1d41  C600/X79 series chipset LPC Controller
+       1d50  C608 chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d54  C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d55  C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit
+       1d58  C606 chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d59  C604/X79 series chipset 4-Port SATA/SAS Storage Control Unit
+       1d5a  C600/X79 series chipset Dual 4-Port SATA Storage Control Unit
+       1d5b  C602 chipset 4-Port SATA Storage Control Unit
+       1d5c  C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d5d  C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit
+       1d5e  C600/X79 series chipset Dual 4-Port SATA Storage Control Unit
+       1d5f  C600/X79 series chipset 4-Port SATA Storage Control Unit
+       1d60  C608 chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d64  C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d65  C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit
+       1d68  C606 chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d69  C604/X79 series chipset 4-Port SATA/SAS Storage Control Unit
+       1d6a  C600/X79 series chipset Dual 4-Port SATA Storage Control Unit
+       1d6b  C602 chipset 4-Port SATA Storage Control Unit
+       1d6c  C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit
+       1d6d  C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit
+       1d6e  C600/X79 series chipset Dual 4-Port SATA Storage Control Unit
+       1d6f  C600/X79 series chipset 4-Port SATA Storage Control Unit
+       1d70  C600/X79 series chipset SMBus Controller 0
+       1d71  C608/C606/X79 series chipset SMBus Controller 1
+       1d72  C608 chipset SMBus Controller 2
+       1d74  C608/C606/X79 series chipset PCI Express Upstream Port
+       1d76  C600/X79 series chipset Multi-Function Glue
        1e00  Panther Point 4 port SATA Controller [IDE mode]
        1e01  Panther Point 4 port SATA Controller [IDE mode]
        1e02  Panther Point 6 port SATA Controller [AHCI mode]
                15d9 8680  X7DVL-E-O motherboard
                8086 3476  Intel S5000PSLSATA Server Board
        2682  631xESB/632xESB SATA RAID Controller
+               103c 31fe  Adaptec Serial ATA HostRAID
        2683  631xESB/632xESB SATA RAID Controller
        2688  631xESB/632xESB/3100 Chipset UHCI USB Controller #1
                1028 01bb  PowerEdge 1955 onboard USB
        2825  82801HR/HO/HH (ICH8R/DO/DH) 2 port SATA Controller [IDE mode]
                1028 01da  OptiPlex 745
                1462 7235  P965 Neo MS-7235 mainboard
-       2826  Patsburg SATA RAID Controller
+       2826  C600/X79 series chipset SATA RAID Controller
        2828  82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode]
                1028 01f3  Inspiron 1420
                103c 30c0  Compaq 6710b
        3515  6310ESB PCI Express Downstream Port E2
        3518  6311ESB/6321ESB PCI Express Downstream Port E3
        3519  6310ESB PCI Express Downstream Port E3
-       3575  82830 830 Chipset Host Bridge
+       3575  82830M/MG/MP Host Bridge
                0e11 0030  Evo N600c
                1014 021d  ThinkPad A/T/X Series
                104d 80e7  VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
-       3576  82830 830 Chipset AGP Bridge
-       3577  82830 CGC [Chipset Graphics Controller]
+       3576  82830M/MP AGP Bridge
+       3577  82830M/MG Integrated Graphics Controller
                1014 0513  ThinkPad A/T/X Series
-       3578  82830 830 Chipset Host Bridge
+       3578  82830M/MG/MP Host Bridge
        3580  82852/82855 GM/GME/PM/GMV Processor to I/O Controller
                1014 055c  ThinkPad R50e
                1028 0139  Latitude D400
        3b66  5 Series/3400 Series Chipset PT IDER Controller
        3b67  5 Series/3400 Series Chipset KT Controller
                e4bf 50c1  PC1-GROOVE
-       3c00  Sandy Bridge DMI2
-       3c01  Sandy Bridge DMI2 in PCI Express Mode
-       3c02  Sandy Bridge IIO PCI Express Root Port 1a
-       3c03  Sandy Bridge IIO PCI Express Root Port 1b
-       3c04  Sandy Bridge IIO PCI Express Root Port 2a
-       3c05  Sandy Bridge IIO PCI Express Root Port 2b
-       3c06  Sandy Bridge IIO PCI Express Root Port 2c
-       3c07  Sandy Bridge IIO PCI Express Root Port 2d
-       3c08  Sandy Bridge IIO PCI Express Root Port 3a in PCI Express Mode
-       3c09  Sandy Bridge IIO PCI Express Root Port 3b
-       3c0a  Sandy Bridge IIO PCI Express Root Port 3c
-       3c0b  Sandy Bridge IIO PCI Express Root Port 3d
-       3c0d  Sandy Bridge Non-Transparent Bridge
-       3c0e  Sandy Bridge Non-Transparent Bridge
-       3c0f  Sandy Bridge Non-Transparent Bridge
-       3c20  Sandy Bridge DMA Channel 0
-       3c21  Sandy Bridge DMA Channel 1
-       3c22  Sandy Bridge DMA Channel 2
-       3c23  Sandy Bridge DMA Channel 3
-       3c24  Sandy Bridge DMA Channel 4
-       3c25  Sandy Bridge DMA Channel 5
-       3c26  Sandy Bridge DMA Channel 6
-       3c27  Sandy Bridge DMA Channel 7
-       3c28  Sandy Bridge Address Map, VTd_Misc, System Management
-       3c2a  Sandy Bridge Control Status and Global Errors
-       3c2c  Sandy Bridge I/O APIC
-       3c2e  Sandy Bridge DMA
-       3c2f  Sandy Bridge DMA
-       3c40  Sandy Bridge IIO Switch and IRP Performance Monitor
-       3c41  Sandy Bridge QPI Port 0 Performance Monitor
-       3c42  Sandy Bridge QPI Port 1 Performance Monitor
-       3c43  Sandy Bridge Ring to PCI Express Performance Monitor
-       3c44  Sandy Bridge Ring to QuickPath Interconnect Link 0 Performance Monitor
-       3c45  Sandy Bridge Ring to QuickPath Interconnect Link 1 Performance Monitor
-       3c46  Sandy Bridge Processor Home Agent Performance Monitoring
-       3c71  Sandy Bridge Integrated Memory Controller RAS Registers
-       3c80  Sandy Bridge QPI Link 0
-       3c83  Sandy Bridge QPI Link Reut 0
-       3c84  Sandy Bridge QPI Link Reut 0
-       3c86  Sandy Bridge QPI Port 0 DFX Link
-       3c90  Sandy Bridge QPI Link 1
-       3c93  Sandy Bridge QPI Link Reut 1
-       3c94  Sandy Bridge QPI Link Reut 1
-       3c96  Sandy Bridge QPI Port 1 DFX Link
-       3ca0  Sandy Bridge Processor Home Agent
-       3ca8  Sandy Bridge Integrated Memory Controller Registers
-       3caa  Sandy Bridge Integrated Memory Controller Target Address Decoder 0
-       3cab  Sandy Bridge Integrated Memory Controller Target Address Decoder 1
-       3cac  Sandy Bridge Integrated Memory Controller Target Address Decoder 2
-       3cad  Sandy Bridge Integrated Memory Controller Target Address Decoder 3
-       3cae  Sandy Bridge Integrated Memory Controller Target Address Decoder 4
-       3cb0  Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 0
-       3cb1  Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 1
-       3cb2  Sandy Bridge Integrated Memory Controller ERROR Registers 0
-       3cb3  Sandy Bridge Integrated Memory Controller ERROR Registers 1
-       3cb4  Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 2
-       3cb5  Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 3
-       3cb6  Sandy Bridge Integrated Memory Controller ERROR Registers 2
-       3cb7  Sandy Bridge Integrated Memory Controller ERROR Registers 3
-       3cb8  Sandy Bridge DDRIO
-       3cc0  Sandy Bridge Power Control Unit 0
-       3cc1  Sandy Bridge Power Control Unit 1
-       3cc2  Sandy Bridge Power Control Unit 2
-       3cd0  Sandy Bridge Power Control Unit 3
-       3ce0  Sandy Bridge Interrupt Control Registers
-       3ce3  Sandy Bridge Semaphore and Scratchpad Configuration Registers
-       3ce4  Sandy Bridge R2PCIe
-       3ce6  Sandy Bridge QuickPath Interconnect Agent Ring Registers
-       3ce8  Sandy Bridge Unicast Register 0
-       3ce9  Sandy Bridge Unicast Register 5
-       3cea  Sandy Bridge Unicast Register 1
-       3ceb  Sandy Bridge Unicast Register 6
-       3cec  Sandy Bridge Unicast Register 3
-       3ced  Sandy Bridge Unicast Register 7
-       3cee  Sandy Bridge Unicast Register 4
-       3cef  Sandy Bridge Unicast Register 8
-       3cf4  Sandy Bridge Integrated Memory Controller System Address Decoder 0
-       3cf5  Sandy Bridge Integrated Memory Controller System Address Decoder 1
-       3cf6  Sandy Bridge System Address Decoder
+       3c00  Xeon E5/Core i7 DMI2
+       3c01  Xeon E5/Core i7 DMI2 in PCI Express Mode
+       3c02  Xeon E5/Core i7 IIO PCI Express Root Port 1a
+       3c03  Xeon E5/Core i7 IIO PCI Express Root Port 1b
+       3c04  Xeon E5/Core i7 IIO PCI Express Root Port 2a
+       3c05  Xeon E5/Core i7 IIO PCI Express Root Port 2b
+       3c06  Xeon E5/Core i7 IIO PCI Express Root Port 2c
+       3c07  Xeon E5/Core i7 IIO PCI Express Root Port 2d
+       3c08  Xeon E5/Core i7 IIO PCI Express Root Port 3a in PCI Express Mode
+       3c09  Xeon E5/Core i7 IIO PCI Express Root Port 3b
+       3c0a  Xeon E5/Core i7 IIO PCI Express Root Port 3c
+       3c0b  Xeon E5/Core i7 IIO PCI Express Root Port 3d
+       3c0d  Xeon E5/Core i7 Non-Transparent Bridge
+       3c0e  Xeon E5/Core i7 Non-Transparent Bridge
+       3c0f  Xeon E5/Core i7 Non-Transparent Bridge
+       3c20  Xeon E5/Core i7 DMA Channel 0
+       3c21  Xeon E5/Core i7 DMA Channel 1
+       3c22  Xeon E5/Core i7 DMA Channel 2
+       3c23  Xeon E5/Core i7 DMA Channel 3
+       3c24  Xeon E5/Core i7 DMA Channel 4
+       3c25  Xeon E5/Core i7 DMA Channel 5
+       3c26  Xeon E5/Core i7 DMA Channel 6
+       3c27  Xeon E5/Core i7 DMA Channel 7
+       3c28  Xeon E5/Core i7 Address Map, VTd_Misc, System Management
+       3c2a  Xeon E5/Core i7 Control Status and Global Errors
+       3c2c  Xeon E5/Core i7 I/O APIC
+       3c2e  Xeon E5/Core i7 DMA
+       3c2f  Xeon E5/Core i7 DMA
+       3c40  Xeon E5/Core i7 IIO Switch and IRP Performance Monitor
+       3c43  Xeon E5/Core i7 Ring to PCI Express Performance Monitor
+       3c44  Xeon E5/Core i7 Ring to QuickPath Interconnect Link 0 Performance Monitor
+       3c45  Xeon E5/Core i7 Ring to QuickPath Interconnect Link 1 Performance Monitor
+       3c46  Xeon E5/Core i7 Processor Home Agent Performance Monitoring
+       3c71  Xeon E5/Core i7 Integrated Memory Controller RAS Registers
+       3c80  Xeon E5/Core i7 QPI Link 0
+       3c83  Xeon E5/Core i7 QPI Link Reut 0
+       3c84  Xeon E5/Core i7 QPI Link Reut 0
+       3c90  Xeon E5/Core i7 QPI Link 1
+       3c93  Xeon E5/Core i7 QPI Link Reut 1
+       3c94  Xeon E5/Core i7 QPI Link Reut 1
+       3ca0  Xeon E5/Core i7 Processor Home Agent
+       3ca8  Xeon E5/Core i7 Integrated Memory Controller Registers
+       3caa  Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 0
+       3cab  Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 1
+       3cac  Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 2
+       3cad  Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 3
+       3cae  Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 4
+       3cb0  Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 0
+       3cb1  Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 1
+       3cb2  Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 0
+       3cb3  Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 1
+       3cb4  Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 2
+       3cb5  Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 3
+       3cb6  Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 2
+       3cb7  Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 3
+       3cb8  Xeon E5/Core i7 DDRIO
+       3cc0  Xeon E5/Core i7 Power Control Unit 0
+       3cc1  Xeon E5/Core i7 Power Control Unit 1
+       3cc2  Xeon E5/Core i7 Power Control Unit 2
+       3cd0  Xeon E5/Core i7 Power Control Unit 3
+       3ce0  Xeon E5/Core i7 Interrupt Control Registers
+       3ce3  Xeon E5/Core i7 Semaphore and Scratchpad Configuration Registers
+       3ce4  Xeon E5/Core i7 R2PCIe
+       3ce6  Xeon E5/Core i7 QuickPath Interconnect Agent Ring Registers
+       3ce8  Xeon E5/Core i7 Unicast Register 0
+       3ce9  Xeon E5/Core i7 Unicast Register 5
+       3cea  Xeon E5/Core i7 Unicast Register 1
+       3ceb  Xeon E5/Core i7 Unicast Register 6
+       3cec  Xeon E5/Core i7 Unicast Register 3
+       3ced  Xeon E5/Core i7 Unicast Register 7
+       3cee  Xeon E5/Core i7 Unicast Register 4
+       3cef  Xeon E5/Core i7 Unicast Register 8
+       3cf4  Xeon E5/Core i7 Integrated Memory Controller System Address Decoder 0
+       3cf5  Xeon E5/Core i7 Integrated Memory Controller System Address Decoder 1
+       3cf6  Xeon E5/Core i7 System Address Decoder
        4000  5400 Chipset Memory Controller Hub
        4001  5400 Chipset Memory Controller Hub
        4003  5400 Chipset Memory Controller Hub
@@ -20341,6 +20436,15 @@ e159  Tiger Jet Network Inc.
        0002  Tiger100APC ISDN chipset
 e1c5  Elcus
 e4bf  EKF Elektronik GmbH
+       0ccd  CCD-CALYPSO
+       0cd1  CD1-OPERA
+       0cd2  CD2-BEBOP
+       0cd3  CD3-JIVE
+       50c1  PC1-GROOVE
+       50c2  PC2-LIMBO
+       53c1  SC1-ALLEGRO
+       cc47  CCG-RUMBA
+       cc4d  CCM-BOOGIE
 e55e  Essence Technology, Inc.
 ea01  Eagle Technology
        000a  PCI-773 Temperature Card
index 5a8b172..dd7e771 100644 (file)
@@ -1,5 +1,5 @@
 # <pre>
-# @(#)africa   8.33
+# @(#)africa   8.35
 # This file is in the public domain, so clarified as of
 # 2009-05-17 by Arthur David Olson.
 
@@ -768,6 +768,37 @@ Zone       Indian/Mayotte  3:00:56 -       LMT     1911 Jul        # Mamoutzou
 # wall clock time (i.e. 11pm UTC), but that's what I would assume. It has
 # also been like that in the past.
 
+# From Alexander Krivenyshev (2012-03-09):
+# According to Infom&eacute;diaire web site from Morocco (infomediaire.ma),
+# on March 9, 2012, (in French) Heure l&eacute;gale:
+# Le Maroc adopte officiellement l'heure d'&eacute;t&eacute;
+# <a href="http://www.infomediaire.ma/news/maroc/heure-l%C3%A9gale-le-maroc-adopte-officiellement-lheure-d%C3%A9t%C3%A9">
+# http://www.infomediaire.ma/news/maroc/heure-l%C3%A9gale-le-maroc-adopte-officiellement-lheure-d%C3%A9t%C3%A9
+# </a>
+# Governing Council adopted draft decree, that Morocco DST starts on
+# the last Sunday of March (March 25, 2012) and ends on
+# last Sunday of September (September 30, 2012)
+# except the month of Ramadan.
+# or (brief)
+# <a href="http://www.worldtimezone.com/dst_news/dst_news_morocco06.html">
+# http://www.worldtimezone.com/dst_news/dst_news_morocco06.html
+# </a>
+
+# From Arthur David Olson (2012-03-10):
+# The infomediaire.ma source indicates that the system is to be in
+# effect every year. It gives 03H00 as the "fall back" time of day;
+# it lacks a "spring forward" time of day; assume 2:00 XXX.
+# Wait on specifying the Ramadan exception for details about
+# start date, start time of day, end date, and end time of day XXX.
+
+# From Christophe Tropamer (2012-03-16):
+# Seen Morocco change again:
+# <a href="http://www.le2uminutes.com/actualite.php">
+# http://www.le2uminutes.com/actualite.php
+# </a>
+# "...&agrave; partir du dernier dimance d'avril et non fins mars,
+# comme annonc&eacute; pr&eacute;c&eacute;demment."
+
 # RULE NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 
 Rule   Morocco 1939    only    -       Sep     12       0:00   1:00    S
@@ -793,6 +824,9 @@ Rule        Morocco 2010    only    -       May      2       0:00   1:00    S
 Rule   Morocco 2010    only    -       Aug      8       0:00   0       -
 Rule   Morocco 2011    only    -       Apr      3       0:00   1:00    S
 Rule   Morocco 2011    only    -       Jul      31      0      0       -
+Rule   Morocco 2012    max     -       Apr      lastSun 2:00   1:00    S
+Rule   Morocco 2012    max     -       Sep      lastSun 3:00   0       -
+
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
 Zone Africa/Casablanca -0:30:20 -      LMT     1913 Oct 26
                         0:00   Morocco WE%sT   1984 Mar 16
index 1e6b4b1..e844971 100644 (file)
@@ -1,4 +1,5 @@
-# @(#)asia     8.70
+# <pre>
+# @(#)asia     8.73
 # This file is in the public domain, so clarified as of
 # 2009-05-17 by Arthur David Olson.
 
@@ -2247,6 +2248,29 @@ Zone     Asia/Karachi    4:28:12 -       LMT     1907
 # http://www.maannews.net/eng/ViewDetails.aspx?ID=424808
 # </a>
 
+# From Steffen Thorsen (2012-03-26):
+# Palestinian news sources tell that both Gaza and West Bank will start DST
+# on Friday (Thursday midnight, 2012-03-29 24:00).
+# Some of many sources in Arabic:
+# <a href="http://www.samanews.com/index.php?act=Show&id=122638">
+# http://www.samanews.com/index.php?act=Show&id=122638
+# </a>
+#
+# <a href="http://safa.ps/details/news/74352/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%AA%D9%88%D9%82%D9%8A%D8%AA-%D8%A7%D9%84%D8%B5%D9%8A%D9%81%D9%8A-%D8%A8%D8%A7%D9%84%D8%B6%D9%81%D8%A9-%D9%88%D8%BA%D8%B2%D8%A9-%D9%84%D9%8A%D9%84%D8%A9-%D8%A7%D9%84%D8%AC%D9%85%D8%B9%D8%A9.html">
+# http://safa.ps/details/news/74352/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%AA%D9%88%D9%82%D9%8A%D8%AA-%D8%A7%D9%84%D8%B5%D9%8A%D9%81%D9%8A-%D8%A8%D8%A7%D9%84%D8%B6%D9%81%D8%A9-%D9%88%D8%BA%D8%B2%D8%A9-%D9%84%D9%8A%D9%84%D8%A9-%D8%A7%D9%84%D8%AC%D9%85%D8%B9%D8%A9.html
+# </a>
+#
+# Our brief summary:
+# <a href="http://www.timeanddate.com/news/time/gaza-west-bank-dst-2012.html">
+# http://www.timeanddate.com/news/time/gaza-west-bank-dst-2012.html
+# </a>
+
+# From Arthur David Olson (2012-03-27):
+# The timeanddate article for 2012 says that "the end date has not yet been
+# announced" and that "Last year, both...paused daylight saving time during...
+# Ramadan. It is not yet known [for] 2012."
+# For now, assume both switch back on the last Friday in September. XXX
+
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule EgyptAsia 1957    only    -       May     10      0:00    1:00    S
 Rule EgyptAsia 1957    1958    -       Oct      1      0:00    0       -
@@ -2279,6 +2303,8 @@ Zone      Asia/Gaza       2:17:52 -       LMT     1900 Oct
                        2:00    Jordan  EE%sT   1999
                        2:00 Palestine  EE%sT   2011 Apr  2 12:01
                        2:00    1:00    EEST    2011 Aug  1
+                       2:00    -       EET     2012 Mar 30
+                       2:00    1:00    EEST    2012 Sep 28
                        2:00    -       EET
 
 Zone   Asia/Hebron     2:20:23 -       LMT     1900 Oct
@@ -2292,6 +2318,8 @@ Zone      Asia/Hebron     2:20:23 -       LMT     1900 Oct
                        2:00    1:00    EEST    2011 Aug  1
                        2:00    -       EET     2011 Aug 30
                        2:00    1:00    EEST    2011 Sep 30 3:00
+                       2:00    -       EET     2012 Mar 30
+                       2:00    1:00    EEST    2012 Sep 28 3:00
                        2:00    -       EET
 
 # Paracel Is
@@ -2583,10 +2611,28 @@ Rule    Syria   2007    only    -       Nov      Fri>=1 0:00    0       -
 # http://sns.sy/sns/?path=news/read/11421 (Arabic)
 # </a>
 
+# From Steffen Thorsen (2012-03-26):
+# Today, Syria's government announced that they will start DST early on Friday
+# (00:00). This is a bit earlier than the past two years.
+#
+# From Syrian Arab News Agency, in Arabic:
+# <a href="http://www.sana.sy/ara/2/2012/03/26/408215.htm">
+# http://www.sana.sy/ara/2/2012/03/26/408215.htm
+# </a>
+#
+# Our brief summary:
+# <a href="http://www.timeanddate.com/news/time/syria-dst-2012.html">
+# http://www.timeanddate.com/news/time/syria-dst-2012.html
+# </a>
+
+# From Arthur David Olson (2012-03-27):
+# Assume last Friday in March going forward XXX.
+
 Rule   Syria   2008    only    -       Apr     Fri>=1  0:00    1:00    S
 Rule   Syria   2008    only    -       Nov     1       0:00    0       -
 Rule   Syria   2009    only    -       Mar     lastFri 0:00    1:00    S
-Rule   Syria   2010    max     -       Apr     Fri>=1  0:00    1:00    S
+Rule   Syria   2010    2011    -       Apr     Fri>=1  0:00    1:00    S
+Rule   Syria   2012    max     -       Mar     lastFri 0:00    1:00    S
 Rule   Syria   2009    max     -       Oct     lastFri 0:00    0       -
 
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
index e60c728..0096d59 100644 (file)
@@ -1,5 +1,5 @@
 # <pre>
-# @(#)northamerica     8.53
+# @(#)northamerica     8.54
 # This file is in the public domain, so clarified as of
 # 2009-05-17 by Arthur David Olson.
 
@@ -2970,6 +2970,29 @@ Zone America/Guatemala   -6:02:04 -      LMT     1918 Oct 5
 # From Stephen Colebourne (2007-02-22):
 # Some IATA info: Haiti won't be having DST in 2007.
 
+# From Steffen Thorsen (2012-03-11):
+# According to several news sources, Haiti will observe DST this year,
+# apparently using the same start and end date as USA/Canada.
+# So this means they have already changed their time.
+#
+# (Sources in French):
+# <a href="http://www.alterpresse.org/spip.php?article12510">
+# http://www.alterpresse.org/spip.php?article12510
+# </a>
+# <a href="http://radiovision2000haiti.net/home/?p=13253">
+# http://radiovision2000haiti.net/home/?p=13253
+# </a>
+#
+# Our coverage:
+# <a href="http://www.timeanddate.com/news/time/haiti-dst-2012.html">
+# http://www.timeanddate.com/news/time/haiti-dst-2012.html
+# </a>
+
+# From Arthur David Olson (2012-03-11):
+# The alterpresse.org source seems to show a US-style leap from 2:00 a.m. to
+# 3:00 a.m. rather than the traditional Haitian jump at midnight.
+# Assume a US-style fall back as well XXX.
+# Do not yet assume that the change carries forward past 2012 XXX.
 
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule   Haiti   1983    only    -       May     8       0:00    1:00    D
@@ -2981,6 +3004,8 @@ Rule      Haiti   1988    1997    -       Apr     Sun>=1  1:00s   1:00    D
 Rule   Haiti   1988    1997    -       Oct     lastSun 1:00s   0       S
 Rule   Haiti   2005    2006    -       Apr     Sun>=1  0:00    1:00    D
 Rule   Haiti   2005    2006    -       Oct     lastSun 0:00    0       S
+Rule   Haiti   2012    only    -       Mar     Sun>=8  2:00    1:00    D
+Rule   Haiti   2012    only    -       Nov     Sun>=1  2:00    0       S
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
 Zone America/Port-au-Prince -4:49:20 - LMT     1890
                        -4:49   -       PPMT    1917 Jan 24 12:00 # P-a-P MT
index 49cdf45..4f8b069 100644 (file)
@@ -664,12 +664,12 @@ cam_periph_mapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo)
                 * boundary.
                 */
                if ((lengths[i] +
-                   (((vm_offset_t)(*data_ptrs[i])) & PAGE_MASK)) > DFLTPHYS){
+                   (((vm_offset_t)(*data_ptrs[i])) & PAGE_MASK)) > MAXPHYS){
                        kprintf("cam_periph_mapmem: attempt to map %lu bytes, "
-                              "which is greater than DFLTPHYS(%d)\n",
+                              "which is greater than MAXPHYS(%d)\n",
                               (long)(lengths[i] +
                               (((vm_offset_t)(*data_ptrs[i])) & PAGE_MASK)),
-                              DFLTPHYS);
+                              MAXPHYS);
                        return(E2BIG);
                }
 
index e945a42..2aa5757 100644 (file)
@@ -283,7 +283,7 @@ fwmem_open (struct dev_open_args *ap)
                                                        M_FWMEM, M_WAITOK);
                bcopy(&fwmem_eui64, &fms->eui, sizeof(struct fw_eui64));
                dev->si_drv1 = (void *)fms;
-               dev->si_iosize_max = DFLTPHYS;
+               dev->si_iosize_max = min(MAXPHYS,64*1024);
                fms->refcount = 1;
        }
        if (fwmem_debug)
index 3091e10..125ec84 100644 (file)
@@ -1919,8 +1919,8 @@ pci_alloc_msi_method(device_t dev, device_t child, int *rid, int count,
 
        if (bootverbose) {
                device_printf(child,
-                   "attempting to allocate %d MSI vectors (%d supported)\n",
-                   count, cfg->msi.msi_msgnum);
+                   "attempting to allocate %d MSI vector%s (%d supported)\n",
+                   count, count > 1 ? "s" : "", cfg->msi.msi_msgnum);
        }
 
        if (start_cpuid < 0)
index 5669c20..49b0530 100644 (file)
@@ -358,7 +358,7 @@ usb_create_event_thread(device_t self)
                        taskq->name = taskq_names[i];
                        TAILQ_INIT(&taskq->tasks);
                        if (kthread_create(usb_task_thread, taskq,
-                           &taskq->task_thread_proc, taskq->name)) {
+                           &taskq->task_thread_proc, "%s", taskq->name)) {
                                kprintf("unable to create task thread\n");
                                panic("usb_create_event_thread task");
                        }
index e9f2474..ceff746 100644 (file)
@@ -578,6 +578,7 @@ dev/raid/mfi/mfi_debug.c    optional mfi
 dev/raid/mfi/mfi_pci.c         optional mfi pci
 dev/raid/mfi/mfi_disk.c                optional mfi
 dev/raid/mfi/mfi_syspd.c       optional mfi
+dev/raid/mfi/mfi_tbolt.c       optional mfi
 dev/raid/mfi/mfi_linux.c       optional mfi compat_linux
 dev/raid/mfi/mfi_cam.c         optional mfip scbus
 dev/netif/mii_layer/mii.c              optional miibus
index d9fadbd..c4e3ed3 100644 (file)
@@ -126,7 +126,7 @@ options     SYM_SETUP_LP_PROBE_MAP=0x40
 device         adv0    at isa?
 device         adw
 device         bt0     at isa?
-device         aic0    at isa?
+device         aic
 
 device         ncv             # NCR 53C500
 device         nsp             # Workbit Ninja SCSI-3
index 6f0280e..29fcc26 100644 (file)
@@ -1177,16 +1177,12 @@ device          npx0    at nexus? port IO_NPX flags 0x0 irq 13
 #
 
 #
-# Optional ISA devices:
-#
-
-#
-# SCSI host adapters: `aic' and `bt'
+# SCSI host adapters: `bt'
 #
 # adv: All Narrow SCSI bus AdvanSys controllers.
 # adw: Second Generation AdvanSys controllers including the ADV940UW.
 # ahc: Adaptec 274x/284x/294x
-# aic: Adaptec 152x
+# aic: Adaptec 1460
 # bt: Most Buslogic controllers
 # ncv: NCR 53C500 based SCSI host adapters.
 # nsp: Workbit Ninja SCSI-3 based PC Card SCSI host adapters.
@@ -1199,7 +1195,7 @@ device            npx0    at nexus? port IO_NPX flags 0x0 irq 13
 device         bt0     at isa? port IO_BT0
 device         adv0    at isa?
 device         adw
-device         aic0    at isa?
+device         aic
 device         ncv
 device         nsp
 device         stg0    at isa? port 0x140 irq 11
index bcc60df..b355517 100644 (file)
@@ -995,16 +995,12 @@ options   SC_TWOBUTTON_MOUSE
 #options       SC_NO_SYSMOUSE
 
 #
-# Optional ISA devices:
-#
-
-#
-# SCSI host adapters: `aic' and `bt'
+# SCSI host adapters: `bt'
 #
 # adv: All Narrow SCSI bus AdvanSys controllers.
 # adw: Second Generation AdvanSys controllers including the ADV940UW.
 # ahc: Adaptec 274x/284x/294x
-# aic: Adaptec 152x
+# aic: Adaptec 1460
 # bt: Most Buslogic controllers
 # ncv: NCR 53C500 based SCSI host adapters.
 # nsp: Workbit Ninja SCSI-3 based PC Card SCSI host adapters.
@@ -1017,7 +1013,7 @@ options   SC_TWOBUTTON_MOUSE
 device         bt0     at isa? port IO_BT0
 device         adv0    at isa?
 device         adw
-device         aic0    at isa?
+device         aic
 device         ncv
 device         nsp
 device         stg0    at isa? port 0x140 irq 11
index cdb8332..7c2228a 100644 (file)
@@ -112,7 +112,7 @@ options     SYM_SETUP_LP_PROBE_MAP=0x40
 device         adv0    at isa?
 device         adw
 device         bt0     at isa?
-device         aic0    at isa?
+device         aic
 
 device         ncv             # NCR 53C500
 device         nsp             # Workbit Ninja SCSI-3
index cb90e4b..d792843 100644 (file)
 #endif
 #define DFLTPHYS       (64 * 1024)     /* default max raw I/O transfer size */
 #define MAXPHYS                (128 * 1024)    /* max raw I/O transfer size */
-#define MAXDUMPPGS     (DFLTPHYS/PAGE_SIZE)
+#define MAXDUMPPGS     (MAXPHYS/PAGE_SIZE)
 
 #define IOPAGES        2               /* pages of i/o permission bitmap */
 #define UPAGES 4               /* pages of u-area */
index d23ae69..0c50625 100644 (file)
 #endif
 #define DFLTPHYS       (64 * 1024)     /* default max raw I/O transfer size */
 #define MAXPHYS                (128 * 1024)    /* max raw I/O transfer size */
-#define MAXDUMPPGS     (DFLTPHYS/PAGE_SIZE)
+#define MAXDUMPPGS     (MAXPHYS/PAGE_SIZE)
 
 #define IOPAGES        2               /* pages of i/o permission bitmap */
 #define UPAGES 4               /* pages of u-area */
index 3a43c79..087e689 100644 (file)
@@ -25,7 +25,6 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/acpica/Osd/OsdSchedule.c,v 1.28 2004/05/06 02:18:58 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdSchedule.c,v 1.10 2008/06/05 18:06:31 swildner Exp $
  */
 
 /*
@@ -83,8 +82,7 @@ int
 acpi_task_thread_init(void)
 {
     lwkt_initport_replyonly(&acpi_afree_rport, acpi_autofree_reply);
-    kthread_create(acpi_task_thread, NULL, &acpi_task_td,
-                       0, 0, "acpi_task");
+    kthread_create(acpi_task_thread, NULL, &acpi_task_td, "acpi_task");
     return (0);
 }
 
index d301616..14101a2 100644 (file)
@@ -715,7 +715,7 @@ good:
        sbuf_printf(sb, "Unsupported Asus laptop: %s\n", Obj->String.Pointer);
        sbuf_finish(sb);
 
-       device_printf(dev, sbuf_data(sb));
+       device_printf(dev, "%s", sbuf_data(sb));
 
        sbuf_delete(sb);
        AcpiOsFree(Buf.Pointer);
index 0c6bffe..0ba8948 100644 (file)
@@ -821,7 +821,7 @@ acpi_hp_notify(ACPI_HANDLE h, UINT32 notify, void *context)
        ACPI_OBJECT *obj;
        ACPI_WMI_GET_EVENT_DATA(sc->wmi_dev, notify, &response);
        obj = (ACPI_OBJECT*) response.Pointer;
-       if (!obj || obj->Type != ACPI_TYPE_PACKAGE) {
+       if (obj && obj->Type == ACPI_TYPE_BUFFER && obj->Buffer.Length == 8) {
                if (*((UINT8 *) obj->Buffer.Pointer) == 0x5) {
                        acpi_hp_evaluate_auto_on_off(sc);
                }
@@ -920,7 +920,7 @@ acpi_hp_get_cmi_block(device_t wmi_dev, const char* guid, UINT8 instance,
                return (-EINVAL);
        }
        obj = out.Pointer;
-       if (!obj && obj->Type != ACPI_TYPE_PACKAGE) {
+       if (!obj || obj->Type != ACPI_TYPE_PACKAGE) {
                acpi_hp_free_buffer(&out);
                return (-EINVAL);
        }
index a51b287..f331996 100644 (file)
@@ -317,7 +317,7 @@ acpi_tz_attach(device_t dev)
        acpi_tz_power_profile, sc, 0);
     if (acpi_tz_td == NULL) {
        error = kthread_create(acpi_tz_thread, NULL, &acpi_tz_td,
-           RFHIGHPID, 0, "acpi_thermal");
+           "acpi_thermal");
        if (error != 0) {
            device_printf(sc->tz_dev, "could not create thread - %d", error);
            goto out;
@@ -1200,7 +1200,6 @@ static int
 acpi_tz_cooling_thread_start(struct acpi_tz_softc *sc)
 {
     int error;
-    char name[16];
 
     ACPI_LOCK(thermal);
     if (sc->tz_cooling_proc_running) {
@@ -1211,10 +1210,9 @@ acpi_tz_cooling_thread_start(struct acpi_tz_softc *sc)
     ACPI_UNLOCK(thermal);
     error = 0;
     if (sc->tz_cooling_proc == NULL) {
-       ksnprintf(name, sizeof(name), "acpi_cooling%d",
-           device_get_unit(sc->tz_dev));
        error = kthread_create(acpi_tz_cooling_thread, sc,
-           &sc->tz_cooling_proc, RFHIGHPID, 0, name);
+           &sc->tz_cooling_proc,
+           "acpi_cooling%d", device_get_unit(sc->tz_dev));
        if (error != 0) {
            device_printf(sc->tz_dev, "could not create thread - %d", error);
            ACPI_LOCK(thermal);
index 8647497..4673118 100644 (file)
@@ -346,7 +346,6 @@ void                acpi_UserNotify(const char *subsystem, ACPI_HANDLE h,
 int            acpi_bus_alloc_gas(device_t dev, int *type, int *rid,
                    ACPI_GENERIC_ADDRESS *gas, struct resource **res,
                    u_int flags);
-# define kthread_create(a, b, c, d, e, f) kthread_create(a, b, c, f)
 
 struct acpi_parse_resource_set {
     void       (*set_init)(device_t dev, void *arg, void **context);
index 105fbba..aebe2da 100644 (file)
@@ -1,8 +1,8 @@
 # $FreeBSD: src/sys/modules/aic/Makefile,v 1.6 2004/05/26 00:53:00 imp Exp $
 
 KMOD=  aic
-SRCS=  aic.c aic_isa.c aic_pccard.c
-SRCS+= device_if.h bus_if.h pci_if.h isa_if.h card_if.h
+SRCS=  aic.c aic_pccard.c
+SRCS+= device_if.h bus_if.h pci_if.h card_if.h
 SRCS+= opt_cam.h opt_scsi.h
 
 .include <bsd.kmod.mk>
index 0bb02f5..bcaaf26 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/aic/aic.c,v 1.8 2000/01/14 23:42:35 imp Exp $
+ * $FreeBSD: src/sys/dev/aic/aic.c,v 1.28 2009/05/13 22:31:25 des Exp $
  */
 
 #include <sys/param.h>
 #include "aic6360reg.h"
 #include "aicvar.h"
 
-static void aic_action (struct cam_sim *sim, union ccb *ccb);
-static void aic_execute_scb (void *arg, bus_dma_segment_t *dm_segs,
+static void aic_action(struct cam_sim *sim, union ccb *ccb);
+static void aic_execute_scb(void *arg, bus_dma_segment_t *dm_segs,
                                int nseg, int error);
-static void aic_start (struct aic_softc *aic);
-static void aic_select (struct aic_softc *aic);
-static void aic_selected (struct aic_softc *aic);
-static void aic_reselected (struct aic_softc *aic);
-static void aic_reconnect (struct aic_softc *aic, int tag);
-static void aic_cmd (struct aic_softc *aic);
-static void aic_msgin (struct aic_softc *aic);
-static void aic_handle_msgin (struct aic_softc *aic);
-static void aic_msgout (struct aic_softc *aic);
-static void aic_datain (struct aic_softc *aic);
-static void aic_dataout (struct aic_softc *aic);
-static void aic_done (struct aic_softc *aic, struct aic_scb *scb);
-static void aic_poll (struct cam_sim *sim);
-static void aic_timeout (void *arg);
-static void aic_scsi_reset (struct aic_softc *aic);
-static void aic_chip_reset (struct aic_softc *aic);
-static void aic_reset (struct aic_softc *aic, int initiate_reset);
+static void aic_start(struct aic_softc *aic);
+static void aic_select(struct aic_softc *aic);
+static void aic_selected(struct aic_softc *aic);
+static void aic_reselected(struct aic_softc *aic);
+static void aic_reconnect(struct aic_softc *aic, int tag);
+static void aic_cmd(struct aic_softc *aic);
+static void aic_msgin(struct aic_softc *aic);
+static void aic_handle_msgin(struct aic_softc *aic);
+static void aic_msgout(struct aic_softc *aic);
+static void aic_datain(struct aic_softc *aic);
+static void aic_dataout(struct aic_softc *aic);
+static void aic_done(struct aic_softc *aic, struct aic_scb *scb);
+static void aic_poll(struct cam_sim *sim);
+static void aic_timeout(void *arg);
+static void aic_scsi_reset(struct aic_softc *aic);
+static void aic_chip_reset(struct aic_softc *aic);
+static void aic_reset(struct aic_softc *aic, int initiate_reset);
 
 devclass_t aic_devclass;
 
@@ -167,7 +167,7 @@ aic_action(struct cam_sim *sim, union ccb *ccb)
        }
        case XPT_SET_TRAN_SETTINGS:
        {
-               struct ccb_trans_settings *cts = cts = &ccb->cts;
+               struct ccb_trans_settings *cts = &ccb->cts;
                struct aic_tinfo *ti = &aic->tinfo[ccb->ccb_h.target_id];
                struct ccb_trans_settings_scsi *scsi =
                    &cts->proto_specific.scsi;
index 6a8a553..84a7bca 100644 (file)
@@ -29,8 +29,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/aic/aic6360reg.h,v 1.1 1999/10/21 08:56:52 luoqi Exp $
- * $DragonFly: src/sys/dev/disk/aic/aic6360reg.h,v 1.3 2008/01/05 07:27:09 pavalos Exp $
+ * $FreeBSD: src/sys/dev/aic/aic6360reg.h,v 1.4 2005/01/06 01:42:25 imp Exp $
  */
 
 #define SCSISEQ                0x00    /* SCSI sequence control */
diff --git a/sys/dev/disk/aic/aic_isa.c b/sys/dev/disk/aic/aic_isa.c
deleted file mode 100644 (file)
index 521b7b6..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen.
- * 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: src/sys/dev/aic/aic_isa.c,v 1.3 2000/01/14 23:42:35 imp Exp $
- */
-
-#include <sys/param.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/rman.h>
-#include <sys/machintr.h>
-
-#include <bus/isa/isavar.h>
-#include "aic6360reg.h"
-#include "aicvar.h"
-  
-struct aic_isa_softc {
-       struct  aic_softc sc_aic;
-       struct  resource *sc_port;
-       struct  resource *sc_irq;
-       struct  resource *sc_drq;
-       void    *sc_ih;
-};
-
-static int aic_isa_alloc_resources (device_t);
-static void aic_isa_release_resources (device_t);
-static int aic_isa_probe (device_t);
-static int aic_isa_attach (device_t);
-
-static u_int aic_isa_ports[] = { 0x340, 0x140 };
-#define        AIC_ISA_NUMPORTS NELEM(aic_isa_ports)
-#define        AIC_ISA_PORTSIZE 0x20
-
-static struct isa_pnp_id aic_ids[] = {
-       { 0x15309004, "Adaptec AHA-1530P" },
-       { 0x15209004, "Adaptec AHA-1520P" },
-       { 0 }
-};
-
-static int
-aic_isa_alloc_resources(device_t dev)
-{
-       struct aic_isa_softc *sc = device_get_softc(dev);
-       int rid;
-
-       sc->sc_port = sc->sc_irq = sc->sc_drq = NULL;
-
-       rid = 0;
-       sc->sc_port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
-                                       0ul, ~0ul, AIC_ISA_PORTSIZE, RF_ACTIVE);
-       if (!sc->sc_port) {
-               device_printf(dev, "I/O port allocation failed\n");
-               return (ENOMEM);
-       }
-
-       if (isa_get_irq(dev) != -1) {
-               rid = 0;
-               sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
-                                                   RF_ACTIVE);
-               if (!sc->sc_irq) {
-                       device_printf(dev, "IRQ allocation failed\n");
-                       aic_isa_release_resources(dev);
-                       return (ENOMEM);
-               }
-       }
-
-       if (isa_get_drq(dev) != -1) {
-               rid = 0;
-               sc->sc_drq = bus_alloc_resource_any(dev, SYS_RES_DRQ, &rid,
-                                                   RF_ACTIVE);
-               if (!sc->sc_drq) {
-                       device_printf(dev, "DRQ allocation failed\n");
-                       aic_isa_release_resources(dev);
-                       return (ENOMEM);
-               }
-       }
-
-       sc->sc_aic.unit = device_get_unit(dev);
-       sc->sc_aic.tag = rman_get_bustag(sc->sc_port);
-       sc->sc_aic.bsh = rman_get_bushandle(sc->sc_port);
-       return (0);
-}
-
-static void
-aic_isa_release_resources(device_t dev)
-{
-       struct aic_isa_softc *sc = device_get_softc(dev);
-
-       if (sc->sc_port)
-               bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->sc_port);
-       if (sc->sc_irq)
-               bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq);
-       if (sc->sc_drq)
-               bus_release_resource(dev, SYS_RES_DRQ, 0, sc->sc_drq);
-       sc->sc_port = sc->sc_irq = sc->sc_drq = NULL;
-}
-
-static int
-aic_isa_probe(device_t dev)
-{
-       struct aic_isa_softc *sc = device_get_softc(dev);
-       struct aic_softc *aic = &sc->sc_aic;
-       int numports, i;
-       u_int port, *ports;
-       u_int8_t porta;
-
-       if (ISA_PNP_PROBE(device_get_parent(dev), dev, aic_ids) == ENXIO)
-               return (ENXIO);
-
-       port = isa_get_port(dev);
-       if (port != -1) {
-               ports = &port;
-               numports = 1;
-       } else {
-               ports = aic_isa_ports;
-               numports = AIC_ISA_NUMPORTS;
-       }
-
-       for (i = 0; i < numports; i++) {
-               if (bus_set_resource(dev, SYS_RES_IOPORT, 0, ports[i],
-                                    AIC_ISA_PORTSIZE, -1))
-                       continue;
-               if (aic_isa_alloc_resources(dev))
-                       continue;
-               if (!aic_probe(aic)) {
-                       aic_isa_release_resources(dev);
-                       break;
-               }
-               aic_isa_release_resources(dev);
-       }
-
-       if (i == numports)
-               return (ENXIO);
-
-       porta = aic_inb(aic, PORTA);
-       if (isa_get_irq(dev) == -1) {
-               int irq = PORTA_IRQ(porta);
-
-               bus_set_resource(dev, SYS_RES_IRQ, 0, irq, 1,
-                   machintr_legacy_intr_cpuid(irq));
-       }
-       if ((aic->flags & AIC_DMA_ENABLE) && isa_get_drq(dev) == -1)
-               bus_set_resource(dev, SYS_RES_DRQ, 0, PORTA_DRQ(porta), 1, -1);
-       device_set_desc(dev, "Adaptec 6260/6360 SCSI controller");
-       return (0);
-}
-
-static int
-aic_isa_attach(device_t dev)
-{
-       struct aic_isa_softc *sc = device_get_softc(dev);
-       struct aic_softc *aic = &sc->sc_aic;
-       int error;
-
-       error = aic_isa_alloc_resources(dev);
-       if (error) {
-               device_printf(dev, "resource allocation failed\n");
-               return (error);
-       }
-
-       error = aic_attach(aic);
-       if (error) {
-               device_printf(dev, "attach failed\n");
-               aic_isa_release_resources(dev);
-               return (error);
-       }
-
-       error = bus_setup_intr(dev, sc->sc_irq, 0, aic_intr,
-                               aic, &sc->sc_ih, NULL);
-       if (error) {
-               device_printf(dev, "failed to register interrupt handler\n");
-               aic_isa_release_resources(dev);
-               return (error);
-       }
-       return (0);
-}
-
-static int
-aic_isa_detach(device_t dev)
-{
-       struct aic_isa_softc *sc = device_get_softc(dev);
-       struct aic_softc *aic = &sc->sc_aic;
-       int error;
-
-       error = aic_detach(aic);
-       if (error) {
-               device_printf(dev, "detach failed\n");
-               return (error);
-       }
-
-       error = bus_teardown_intr(dev, sc->sc_irq, sc->sc_ih);
-       if (error) {
-               device_printf(dev, "failed to unregister interrupt handler\n");
-       }
-
-       aic_isa_release_resources(dev);
-       return (0);
-}
-
-static device_method_t aic_isa_methods[] = {
-       /* Device interface */
-       DEVMETHOD(device_probe,         aic_isa_probe),
-       DEVMETHOD(device_attach,        aic_isa_attach),
-       DEVMETHOD(device_detach,        aic_isa_detach),
-       { 0, 0 }
-};
-
-static driver_t aic_isa_driver = {
-       "aic",
-       aic_isa_methods, sizeof(struct aic_isa_softc),
-};
-
-extern devclass_t aic_devclass;
-
-MODULE_DEPEND(aic, cam, 1,1,1);
-DRIVER_MODULE(aic, isa, aic_isa_driver, aic_devclass, NULL, NULL);
index 2f7e861..0c9032d 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/aic/aic_pccard.c,v 1.1 2000/01/14 23:42:36 imp Exp $
+ * $FreeBSD: src/sys/dev/aic/aic_pccard.c,v 1.20 2007/06/17 05:55:46 scottl Exp $
  */
 
 #include <sys/param.h>
@@ -46,10 +46,10 @@ struct aic_pccard_softc {
        void    *sc_ih;
 };
 
-static int aic_pccard_alloc_resources (device_t);
-static void aic_pccard_release_resources (device_t);
-static int aic_pccard_probe (device_t);
-static int aic_pccard_attach (device_t);
+static int aic_pccard_alloc_resources(device_t);
+static void aic_pccard_release_resources(device_t);
+static int aic_pccard_probe(device_t);
+static int aic_pccard_attach(device_t);
 
 static const struct pccard_product aic_pccard_products[] = {
        PCMCIA_CARD(ADAPTEC, APA1460, 0),
@@ -83,6 +83,7 @@ aic_pccard_alloc_resources(device_t dev)
                return (ENOMEM);
        }
 
+       sc->sc_aic.dev = dev;
        sc->sc_aic.unit = device_get_unit(dev);
        sc->sc_aic.tag = rman_get_bustag(sc->sc_port);
        sc->sc_aic.bsh = rman_get_bushandle(sc->sc_port);
@@ -112,7 +113,7 @@ aic_pccard_probe(device_t dev)
                        device_set_desc(dev, pp->pp_name);
                return 0;
        }
-       return ENXIO;
+       return EIO;
 }
 
 static int
@@ -188,3 +189,4 @@ extern devclass_t aic_devclass;
 
 MODULE_DEPEND(aic, cam, 1,1,1);
 DRIVER_MODULE(aic, pccard, aic_pccard_driver, aic_devclass, NULL, NULL);
+MODULE_VERSION(aic, 1);
index 5e045ab..2faa1b7 100644 (file)
@@ -23,8 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/aic/aicvar.h,v 1.2.2.1 2000/08/08 23:51:23 peter Exp $
- * $DragonFly: src/sys/dev/disk/aic/aicvar.h,v 1.4 2008/01/05 07:27:09 pavalos Exp $
+ * $FreeBSD: src/sys/dev/aic/aicvar.h,v 1.9 2007/06/17 05:55:46 scottl Exp $
  */
 
 struct aic_transinfo {
@@ -70,6 +69,7 @@ struct aic_scb {
 enum { AIC6260, AIC6360, AIC6370, GM82C700 };
 
 struct aic_softc {
+       device_t                dev;
        int                     unit;
        bus_space_tag_t         tag;
        bus_space_handle_t      bsh;
@@ -154,7 +154,7 @@ struct aic_softc {
        bus_space_write_multi_4((aic)->tag, (aic)->bsh, (port), \
                (u_int32_t *)(addr), (count))
 
-extern int aic_probe (struct aic_softc *);
-extern int aic_attach (struct aic_softc *);
-extern int aic_detach (struct aic_softc *);
-extern void aic_intr (void *);
+extern int aic_probe(struct aic_softc *);
+extern int aic_attach(struct aic_softc *);
+extern int aic_detach(struct aic_softc *);
+extern void aic_intr(void *);
index ad59b93..1d34355 100644 (file)
@@ -3518,24 +3518,12 @@ isp_target_thread(ispsoftc_t *isp, int chan)
                        disk_size = 50 << 20;
                }
                disk_data = kmalloc(disk_size, M_ISPTARG, M_WAITOK | M_ZERO);
-               if (disk_data == NULL) {
-                       isp_prt(isp, ISP_LOGERR, "%s: could not allocate disk data", __func__);
-                       goto out;
-               }
                isp_prt(isp, ISP_LOGINFO, "allocated a %ju MiB disk", (uintmax_t) (disk_size >> 20));
        }
        junk_data = kmalloc(JUNK_SIZE, M_ISPTARG, M_WAITOK | M_ZERO);
-       if (junk_data == NULL) {
-               isp_prt(isp, ISP_LOGERR, "%s: could not allocate junk", __func__);
-               goto out;
-       }
 
 
        softc = kmalloc(sizeof (*softc), M_ISPTARG, M_WAITOK | M_ZERO);
-       if (softc == NULL) {
-               isp_prt(isp, ISP_LOGERR, "%s: could not allocate softc", __func__);
-               goto out;
-       }
        TAILQ_INIT(&softc->work_queue);
        TAILQ_INIT(&softc->rework_queue);
        TAILQ_INIT(&softc->running_queue);
index c3f6598..b81ad2a 100644 (file)
@@ -404,7 +404,7 @@ mdcreate(unsigned length)
                DEVSTAT_PRIORITY_OTHER);
        sc->dev = disk_create(sc->unit, &sc->disk, &md_ops);
        sc->dev->si_drv1 = sc;
-       sc->dev->si_iosize_max = DFLTPHYS;
+       sc->dev->si_iosize_max = MAXPHYS;
        disk_setdisktype(&sc->disk, "memory");
 
        bzero(&info, sizeof(info));
index 6d42920..fe48d3e 100644 (file)
@@ -154,7 +154,7 @@ ad_attach(device_t dev)
     if (ch->dma)
         cdev->si_iosize_max = ch->dma->max_iosize;
     else
-        cdev->si_iosize_max = DFLTPHYS;
+        cdev->si_iosize_max = min(MAXPHYS,64*1024);
     adp->cdev = cdev;
 
     bzero(&info, sizeof(info));
index c9b8162..7001b2b 100644 (file)
@@ -958,7 +958,7 @@ acd_set_ioparm(device_t dev)
     if (ch->dma)
        cdp->iomax = min(ch->dma->max_iosize, 65534);
     else
-       cdp->iomax = min(DFLTPHYS, 65534);
+       cdp->iomax = min(MAXPHYS, 65534);
 
     cdp->cdev->si_iosize_max = (cdp->iomax / cdp->block_size) * cdp->block_size;
     cdp->cdev->si_bsize_phys = cdp->block_size;
index 1145768..2f11753 100644 (file)
@@ -113,7 +113,7 @@ afd_attach(device_t dev)
     if (ch->dma)
        cdev->si_iosize_max = ch->dma->max_iosize;
     else
-       cdev->si_iosize_max = DFLTPHYS;
+       cdev->si_iosize_max = min(MAXPHYS,64*1024);
     fdp->cdev = cdev;
 
     /* announce we are here */
index 705ae77..614f1ce 100644 (file)
@@ -142,7 +142,7 @@ ast_attach(device_t dev)
     if (ch->dma)
        cdev->si_iosize_max = ch->dma->max_iosize;
     else
-       cdev->si_iosize_max = DFLTPHYS;
+       cdev->si_iosize_max = min(MAXPHYS,64*1024);
     stp->cdev1 = cdev;
     cdev = make_dev(&ast_ops, 2 * device_get_unit(dev) + 1, UID_ROOT,
                    GID_OPERATOR, 0640, "nast%d", device_get_unit(dev));
@@ -151,7 +151,7 @@ ast_attach(device_t dev)
     if (ch->dma)
        cdev->si_iosize_max = ch->dma->max_iosize;
     else
-       cdev->si_iosize_max = DFLTPHYS;
+       cdev->si_iosize_max = min(MAXPHYS,64*1024);
     stp->cdev2 = cdev;
 
     /* announce we are here and ready */
index 6809bf5..23cc996 100644 (file)
@@ -210,12 +210,6 @@ sili_port_alloc(struct sili_softc *sc, u_int port)
         */
        ap->ap_ccbs = kmalloc(sizeof(struct sili_ccb) * sc->sc_ncmds, M_DEVBUF,
                              M_WAITOK | M_ZERO);
-       if (ap->ap_ccbs == NULL) {
-               device_printf(sc->sc_dev,
-                             "unable to allocate command list for port %d\n",
-                             port);
-               goto freeport;
-       }
 
        /*
         * Most structures are in the port BAR.  Assign convenient
index 8fcd3af..95c7362 100644 (file)
@@ -570,8 +570,8 @@ dcons_attach_port(int port, char *name, int flags)
        ASSERT_LWKT_TOKEN_HELD(&tty_token);
        dc = &sc[port];
        dc->flags = flags;
-       dev = make_dev(&dcons_ops, port,
-                       UID_ROOT, GID_WHEEL, 0600, name);
+       dev = make_dev(&dcons_ops, port, UID_ROOT, GID_WHEEL, 0600, "%s",
+           name);
        dc->dev = (void *)dev;
        tp = ttymalloc(NULL);
 
index 4d2329e..91bf9e4 100644 (file)
@@ -636,12 +636,6 @@ igb_detach(device_t dev)
 
        INIT_DEBUGOUT("igb_detach: begin");
 
-       /* Make sure VLANS are not using driver */
-       if (adapter->ifp->if_vlantrunks != NULL) {
-               device_printf(dev,"Vlan in use, detach first\n");
-               return (EBUSY);
-       }
-
        IGB_CORE_LOCK(adapter);
        adapter->in_detach = 1;
        igb_stop(adapter);
@@ -3918,9 +3912,9 @@ igb_initialize_receive_units(struct adapter *adapter)
 
                /* Set maximum packet len */
                psize = adapter->max_frame_size;
-               /* are we on a vlan? */
-               if (adapter->ifp->if_vlantrunks != NULL)
-                       psize += VLAN_TAG_SIZE;
+
+               /* Prepare for VLAN */
+               psize += VLAN_TAG_SIZE;
                E1000_WRITE_REG(&adapter->hw, E1000_RLPML, psize);
        } else {
                rctl &= ~E1000_RCTL_LPE;
index 35a61d0..a7693ea 100644 (file)
@@ -32,7 +32,6 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_en_pci.c,v 1.12 1999/08/21 22:10:49 msmith Exp $
- * $DragonFly: src/sys/dev/netif/en_pci/if_en_pci.c,v 1.16 2007/07/11 23:46:58 dillon Exp $
  */
 
 /*
@@ -236,7 +235,8 @@ en_pci_attach(pcici_t config_id, int unit)
   en_cd.cd_devs[unit] = sc;            /* fake a cfdriver structure */
   en_cd.cd_ndevs = NEN;
   if_initname(&(sc->enif), "en", unit);
-  ksnprintf(sc->sc_dev.dv_xname, sizeof(sc->sc_dev.dv_xname), sc->enif.if_xname);
+  ksnprintf(sc->sc_dev.dv_xname, sizeof(sc->sc_dev.dv_xname), "%s",
+      sc->enif.if_xname);
   scp->en_confid = config_id;
 
   /*
index 1342879..8876bf7 100644 (file)
@@ -660,11 +660,6 @@ iwi_alloc_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring, int count,
 
        ring->data = kmalloc(count * sizeof (struct iwi_tx_data), M_DEVBUF,
            M_WAITOK | M_ZERO);
-       if (ring->data == NULL) {
-               device_printf(sc->sc_dev, "could not allocate soft data\n");
-               error = ENOMEM;
-               goto fail;
-       }
 
        error = bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT,
            BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, IWI_MAX_NSEG,
@@ -768,11 +763,6 @@ iwi_alloc_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring, int count)
 
        ring->data = kmalloc(count * sizeof (struct iwi_rx_data), M_DEVBUF,
            M_WAITOK | M_ZERO);
-       if (ring->data == NULL) {
-               device_printf(sc->sc_dev, "could not allocate soft data\n");
-               error = ENOMEM;
-               goto fail;
-       }
 
        error = bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT,
            BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, 1, MCLBYTES,
index ccebe83..6e1a211 100644 (file)
@@ -379,12 +379,14 @@ lgue_intreof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status
        ifp = &sc->lgue_arpcom.ac_if;
        lwkt_serialize_enter(ifp->if_serializer);
        if (status != USBD_NORMAL_COMPLETION) {
-               if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
+               if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
                        lwkt_serialize_exit(ifp->if_serializer);
                        return;
+               }
+               if_printf(ifp, "usb error on intr: %s\n", usbd_errstr(status));
                if (status == USBD_STALLED)
                        usbd_clear_endpoint_stall(sc->lgue_ep[LGUE_ENDPT_INTR]);
-                       lwkt_serialize_exit(ifp->if_serializer);
+               lwkt_serialize_exit(ifp->if_serializer);
                return;
        }
        lgue_intrstart(ifp);
@@ -675,10 +677,6 @@ lgue_init(void *xsc)
                }
        }
        sc->lgue_tx_buf = kmalloc(LGUE_BUFSZ, M_USBDEV, M_WAITOK);
-       if (sc->lgue_tx_buf == NULL) {
-               if_printf(ifp, "tx internal buffer allocate failed\n");
-               return;
-       }
 
        if (sc->lgue_rx_xfer == NULL) {
                sc->lgue_rx_xfer = usbd_alloc_xfer(sc->lgue_udev);
@@ -688,10 +686,6 @@ lgue_init(void *xsc)
                }
        }
        sc->lgue_rx_buf = kmalloc(LGUE_BUFSZ, M_USBDEV, M_WAITOK);
-       if (sc->lgue_rx_buf == NULL) {
-               if_printf(ifp, "rx internal buffer allocate failed\n");
-               return;
-       }
 
        /* Create INTR buf */
        if (sc->lgue_intr_xfer == NULL) {
index b444890..c80a6b4 100644 (file)
@@ -3186,24 +3186,16 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries,
        /* allocate the rx shadow rings */
        bytes = rx_ring_entries * sizeof (*ss->rx_small.shadow);
        ss->rx_small.shadow = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
-       if (ss->rx_small.shadow == NULL)
-               return err;;
 
        bytes = rx_ring_entries * sizeof (*ss->rx_big.shadow);
        ss->rx_big.shadow = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
-       if (ss->rx_big.shadow == NULL)
-               return err;;
 
        /* allocate the rx host info rings */
        bytes = rx_ring_entries * sizeof (*ss->rx_small.info);
        ss->rx_small.info = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
-       if (ss->rx_small.info == NULL)
-               return err;;
 
        bytes = rx_ring_entries * sizeof (*ss->rx_big.info);
        ss->rx_big.info = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
-       if (ss->rx_big.info == NULL)
-               return err;;
 
        /* allocate the rx busdma resources */
        err = bus_dma_tag_create(sc->parent_dmat,       /* parent */
@@ -3298,8 +3290,6 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries,
        bytes = 8 + 
                sizeof (*ss->tx.req_list) * (ss->tx.max_desc + 4);
        ss->tx.req_bytes = kmalloc(bytes, M_DEVBUF, M_WAITOK);
-       if (ss->tx.req_bytes == NULL)
-               return err;;
        /* ensure req_list entries are aligned to 8 bytes */
        ss->tx.req_list = (mcp_kreq_ether_send_t *)
                ((unsigned long)(ss->tx.req_bytes + 7) & ~7UL);
@@ -3314,8 +3304,6 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries,
        /* allocate the tx host info ring */
        bytes = tx_ring_entries * sizeof (*ss->tx.info);
        ss->tx.info = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
-       if (ss->tx.info == NULL)
-               return err;;
        
        /* allocate the tx busdma resources */
        err = bus_dma_tag_create(sc->parent_dmat,       /* parent */
index ccfe9f2..503b4b6 100644 (file)
@@ -888,10 +888,11 @@ pcn_tick(void *xsc)
        if (!sc->pcn_link) {
                mii_pollstat(mii);
                if (mii->mii_media_status & IFM_ACTIVE &&
-                   IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
+                   IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                        sc->pcn_link++;
                        if (!ifq_is_empty(&ifp->if_snd))
                                if_devstart(ifp);
+               }
        }
        callout_reset(&sc->pcn_stat_timer, hz, pcn_tick, sc);
 
index 7165419..e1168b7 100644 (file)
@@ -156,7 +156,7 @@ void
 aac_panic(struct aac_softc *sc, char *reason)
 {
        aac_print_queues(sc);
-       panic(reason);
+       panic("%s", reason);
 }
 
 /*
index eea4f51..ea6533b 100644 (file)
@@ -196,6 +196,7 @@ static driver_t arcmsr_driver={
 
 static devclass_t arcmsr_devclass;
 DRIVER_MODULE(arcmsr, pci, arcmsr_driver, arcmsr_devclass, NULL, NULL);
+MODULE_VERSION(arcmsr, 1);
 MODULE_DEPEND(arcmsr, pci, 1, 1, 1);
 MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
 #ifndef BUS_DMA_COHERENT
@@ -209,6 +210,10 @@ static struct dev_ops arcmsr_ops = {
        .d_ioctl =      arcmsr_ioctl,                   /* ioctl    */
 };
 
+static int     arcmsr_msi_enable = 1;
+TUNABLE_INT("hw.arcmsr.msi.enable", &arcmsr_msi_enable);
+
+
 /*
 **************************************************************************
 **************************************************************************
@@ -3510,6 +3515,7 @@ static int arcmsr_attach(device_t dev)
        struct cam_devq *devq;  /* Device Queue to use for this SIM */
        struct resource *irqres;
        int     rid;
+       u_int irq_flags;
 
        if(acb == NULL) {
                kprintf("arcmsr%d: cannot allocate softc\n", unit);
@@ -3523,7 +3529,10 @@ static int arcmsr_attach(device_t dev)
        }
        /* After setting up the adapter, map our interrupt */
        rid=0;
-       irqres=bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, RF_SHAREABLE | RF_ACTIVE);
+       acb->irq_type = pci_alloc_1intr(dev, arcmsr_msi_enable, &rid,
+           &irq_flags);
+       irqres=bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1,
+           irq_flags);
        if(irqres == NULL ||
                bus_setup_intr(dev, irqres, INTR_MPSAFE, arcmsr_intr_handler, acb, &acb->ih, NULL)) {
                arcmsr_free_resource(acb);
@@ -3544,6 +3553,8 @@ static int arcmsr_attach(device_t dev)
        if(devq == NULL) {
            arcmsr_free_resource(acb);
                bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
+               if (acb->irq_type == PCI_INTR_TYPE_MSI)
+                       pci_release_msi(dev);
                ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
                kprintf("arcmsr%d: cam_simq_alloc failure!\n", unit);
                return ENXIO;
@@ -3552,6 +3563,8 @@ static int arcmsr_attach(device_t dev)
        if(acb->psim == NULL) {
                arcmsr_free_resource(acb);
                bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
+               if (acb->irq_type == PCI_INTR_TYPE_MSI)
+                       pci_release_msi(dev);
                cam_simq_release(devq);
                ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
                kprintf("arcmsr%d: cam_sim_alloc failure!\n", unit);
@@ -3561,6 +3574,8 @@ static int arcmsr_attach(device_t dev)
        if(xpt_bus_register(acb->psim, 0) != CAM_SUCCESS) {
                arcmsr_free_resource(acb);
                bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
+               if (acb->irq_type == PCI_INTR_TYPE_MSI)
+                       pci_release_msi(dev);
                cam_sim_free(acb->psim);
                ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
                kprintf("arcmsr%d: xpt_bus_register failure!\n", unit);
@@ -3569,6 +3584,8 @@ static int arcmsr_attach(device_t dev)
        if(xpt_create_path(&acb->ppath, /* periph */ NULL, cam_sim_path(acb->psim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
                arcmsr_free_resource(acb);
                bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
+               if (acb->irq_type == PCI_INTR_TYPE_MSI)
+                       pci_release_msi(dev);
                xpt_bus_deregister(cam_sim_path(acb->psim));
                cam_sim_free(acb->psim);
                ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
@@ -3707,6 +3724,8 @@ static int arcmsr_detach(device_t dev)
                bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(i), acb->sys_res_arcmsr[i]);
        }
        bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
+       if (acb->irq_type == PCI_INTR_TYPE_MSI)
+               pci_release_msi(dev);
        ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
        xpt_async(AC_LOST_DEVICE, acb->ppath, NULL);
        xpt_free_path(acb->ppath);
index 2544069..6b99853 100644 (file)
@@ -781,6 +781,7 @@ struct AdapterControlBlock {
        struct resource *                               sys_res_arcmsr[2];
        struct resource *                               irqres;
        void *                                          ih;                                    /* interrupt handle */
+       int                                             irq_type;
 
        /* Hooks into the CAM XPT */
        struct                                          cam_sim *psim;
index 6666464..154f4cd 100644 (file)
@@ -3620,9 +3620,10 @@ asr_ioctl(struct dev_ioctl_args *ap)
        int             j;
 #endif /* ASR_IOCTL_COMPAT */
 
-       if (sc != NULL)
-       switch(cmd) {
+       if (sc == NULL)
+               return (EINVAL);
 
+       switch(cmd) {
        case DPT_SIGNATURE:
 #ifdef ASR_IOCTL_COMPAT
 #if (dsDescription_size != 50)
index ffbd4a2..dd6de20 100644 (file)
@@ -1155,10 +1155,11 @@ static int hptiop_internal_memalloc_mv(struct hpt_iop_hba *hba)
                        MVIOP_IOCTLCFG_SIZE,
                        hptiop_mv_map_ctlcfg, hba, 0)) {
                device_printf(hba->pcidev, "bus_dmamap_load failed!\n");
-               if (hba->ctlcfg_dmat)
+               if (hba->ctlcfg_dmat) {
                        bus_dmamem_free(hba->ctlcfg_dmat,
                                hba->ctlcfg_ptr, hba->ctlcfg_dmamap);
                        bus_dma_tag_destroy(hba->ctlcfg_dmat);
+               }
                return -1;
        }
 
index e067a6f..7caf0ad 100644 (file)
@@ -278,7 +278,7 @@ idad_attach(device_t dev)
        dsk = disk_create(drv->unit, &drv->disk, &id_ops);
 
        dsk->si_drv1 = drv;
-       dsk->si_iosize_max = DFLTPHYS;          /* XXX guess? */
+       dsk->si_iosize_max = min(MAXPHYS,64*1024);              /* XXX guess? */
 
        /*
         * Set disk info, as it appears that all needed data is available already.
index 809eac3..62557da 100644 (file)
@@ -8,7 +8,7 @@ SUBDIR+= mfi_linux
 .endif
 
 KMOD=  mfi
-SRCS=  mfi.c mfi_pci.c mfi_disk.c mfi_debug.c mfi_syspd.c
+SRCS=  mfi.c mfi_pci.c mfi_disk.c mfi_debug.c mfi_syspd.c mfi_tbolt.c
 SRCS+= opt_mfi.h opt_cam.h
 SRCS+= device_if.h bus_if.h pci_if.h
 
index 843f6d7..ad3bbaa 100644 (file)
  * 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.
- */
-/*-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *            Copyright 1994-2009 The FreeBSD Project.
- *            All rights reserved.
- *
- * 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 FREEBSD PROJECT``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 FREEBSD PROJECT 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.
- *
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as representing
- * official policies,either expressed or implied, of the FreeBSD Project.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi.c,v 1.62 2011/11/09 21:53:49 delphij Exp $
+ * FreeBSD projects/head_mfi/ r233016
  */
 
 #include "opt_mfi.h"
@@ -99,6 +70,7 @@
 #include <sys/signalvar.h>
 #include <sys/device.h>
 #include <sys/mplock2.h>
+#include <sys/taskqueue.h>
 
 #include <bus/cam/scsi/scsi_all.h>
 
 
 static int     mfi_alloc_commands(struct mfi_softc *);
 static int     mfi_comms_init(struct mfi_softc *);
-static int     mfi_wait_command(struct mfi_softc *, struct mfi_command *);
 static int     mfi_get_controller_info(struct mfi_softc *);
 static int     mfi_get_log_state(struct mfi_softc *,
                    struct mfi_evt_log_state **);
@@ -122,33 +93,39 @@ static void        mfi_startup(void *arg);
 static void    mfi_intr(void *arg);
 static void    mfi_ldprobe(struct mfi_softc *sc);
 static void    mfi_syspdprobe(struct mfi_softc *sc);
+static void    mfi_handle_evt(void *context, int pending);
 static int     mfi_aen_register(struct mfi_softc *sc, int seq, int locale);
 static void    mfi_aen_complete(struct mfi_command *);
-static int     mfi_aen_setup(struct mfi_softc *, uint32_t);
 static int     mfi_add_ld(struct mfi_softc *sc, int);
 static void    mfi_add_ld_complete(struct mfi_command *);
 static int     mfi_add_sys_pd(struct mfi_softc *sc, int);
 static void    mfi_add_sys_pd_complete(struct mfi_command *);
-static struct mfi_command * mfi_bio_command(struct mfi_softc *);
+static struct mfi_command *mfi_bio_command(struct mfi_softc *);
 static void    mfi_bio_complete(struct mfi_command *);
-static struct mfi_command * mfi_build_ldio(struct mfi_softc *,struct bio*);
-static struct mfi_command * mfi_build_syspdio(struct mfi_softc *,struct bio*);
-static int     mfi_mapcmd(struct mfi_softc *, struct mfi_command *);
+static struct mfi_command *mfi_build_ldio(struct mfi_softc *,struct bio*);
+static struct mfi_command *mfi_build_syspdio(struct mfi_softc *,struct bio*);
 static int     mfi_send_frame(struct mfi_softc *, struct mfi_command *);
-static void    mfi_complete(struct mfi_softc *, struct mfi_command *);
 static int     mfi_abort(struct mfi_softc *, struct mfi_command *);
 static int     mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int);
 static void    mfi_timeout(void *);
 static int     mfi_user_command(struct mfi_softc *,
                    struct mfi_ioc_passthru *);
-static void    mfi_enable_intr_xscale(struct mfi_softc *sc);
-static void    mfi_enable_intr_ppc(struct mfi_softc *sc);
-static int32_t         mfi_read_fw_status_xscale(struct mfi_softc *sc);
-static int32_t         mfi_read_fw_status_ppc(struct mfi_softc *sc);
-static int     mfi_check_clear_intr_xscale(struct mfi_softc *sc);
-static int     mfi_check_clear_intr_ppc(struct mfi_softc *sc);
-static void    mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt);
-static void    mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt);
+static void    mfi_enable_intr_xscale(struct mfi_softc *sc);
+static void    mfi_enable_intr_ppc(struct mfi_softc *sc);
+static int32_t mfi_read_fw_status_xscale(struct mfi_softc *sc);
+static int32_t mfi_read_fw_status_ppc(struct mfi_softc *sc);
+static int     mfi_check_clear_intr_xscale(struct mfi_softc *sc);
+static int     mfi_check_clear_intr_ppc(struct mfi_softc *sc);
+static void    mfi_issue_cmd_xscale(struct mfi_softc *sc, bus_addr_t bus_add,
+                   uint32_t frame_cnt);
+static void    mfi_issue_cmd_ppc(struct mfi_softc *sc, bus_addr_t bus_add,
+                   uint32_t frame_cnt);
+static int mfi_config_lock(struct mfi_softc *sc, uint32_t opcode);
+static void mfi_config_unlock(struct mfi_softc *sc, int locked);
+static int mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm);
+static void mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm);
+static int mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm);
+
 static void    mfi_filter_detach(struct knote *);
 static int     mfi_filter_read(struct knote *, long);
 static int     mfi_filter_write(struct knote *, long);
@@ -169,8 +146,10 @@ TUNABLE_INT("hw.mfi.max_cmds", &mfi_max_cmds);
 SYSCTL_INT(_hw_mfi, OID_AUTO, max_cmds, CTLFLAG_RD, &mfi_max_cmds,
           0, "Max commands");
 
-static int     mfi_msi_enable = 1;
-TUNABLE_INT("hw.mfi.msi.enable", &mfi_msi_enable);
+static int     mfi_detect_jbod_change = 1;
+TUNABLE_INT("hw.mfi.detect_jbod_change", &mfi_detect_jbod_change);
+SYSCTL_INT(_hw_mfi, OID_AUTO, detect_jbod_change, CTLFLAG_RW,
+          &mfi_detect_jbod_change, 0, "Detect a change to a JBOD");
 
 /* Management interface */
 static d_open_t                mfi_open;
@@ -180,7 +159,7 @@ static d_kqfilter_t mfi_kqfilter;
 
 static struct dev_ops mfi_ops = {
        { "mfi", 0, 0 },
-       .d_open =       mfi_open,
+       .d_open =       mfi_open,
        .d_close =      mfi_close,
        .d_ioctl =      mfi_ioctl,
        .d_kqfilter =   mfi_kqfilter,
@@ -194,6 +173,7 @@ static struct filterops mfi_write_filterops =
 MALLOC_DEFINE(M_MFIBUF, "mfibuf", "Buffers for the MFI driver");
 
 #define MFI_INQ_LENGTH SHORT_INQUIRY_LENGTH
+struct mfi_skinny_dma_info mfi_skinny;
 
 static void
 mfi_enable_intr_xscale(struct mfi_softc *sc)
@@ -261,13 +241,13 @@ mfi_check_clear_intr_ppc(struct mfi_softc *sc)
 }
 
 static void
-mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt)
+mfi_issue_cmd_xscale(struct mfi_softc *sc, bus_addr_t bus_add, uint32_t frame_cnt)
 {
        MFI_WRITE4(sc, MFI_IQP,(bus_add >>3) | frame_cnt);
 }
 
 static void
-mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt)
+mfi_issue_cmd_ppc(struct mfi_softc *sc, bus_addr_t bus_add, uint32_t frame_cnt)
 {
        if (sc->mfi_flags & MFI_FLAGS_SKINNY) {
                MFI_WRITE4(sc, MFI_IQPL, (bus_add | frame_cnt << 1) | 1);
@@ -277,18 +257,16 @@ mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt)
        }
 }
 
-static int
+int
 mfi_transition_firmware(struct mfi_softc *sc)
 {
        uint32_t fw_state, cur_state;
        int max_wait, i;
        uint32_t cur_abs_reg_val = 0;
        uint32_t prev_abs_reg_val = 0;
-       bus_space_handle_t idb;
 
        cur_abs_reg_val = sc->mfi_read_fw_status(sc);
        fw_state = cur_abs_reg_val & MFI_FWSTATE_MASK;
-       idb = sc->mfi_flags & MFI_FLAGS_SKINNY ? MFI_SKINNY_IDB : MFI_IDB;
        while (fw_state != MFI_FWSTATE_READY) {
                if (bootverbose)
                        device_printf(sc->mfi_dev, "Waiting for firmware to "
@@ -299,31 +277,43 @@ mfi_transition_firmware(struct mfi_softc *sc)
                        device_printf(sc->mfi_dev, "Firmware fault\n");
                        return (ENXIO);
                case MFI_FWSTATE_WAIT_HANDSHAKE:
-                       MFI_WRITE4(sc, idb, MFI_FWINIT_CLEAR_HANDSHAKE);
-                       max_wait = 2;
+                       if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags & MFI_FLAGS_TBOLT)
+                           MFI_WRITE4(sc, MFI_SKINNY_IDB, MFI_FWINIT_CLEAR_HANDSHAKE);
+                       else
+                           MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_CLEAR_HANDSHAKE);
+                       max_wait = MFI_RESET_WAIT_TIME;
                        break;
                case MFI_FWSTATE_OPERATIONAL:
-                       MFI_WRITE4(sc, idb, MFI_FWINIT_READY);
-                       max_wait = 10;
+                       if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags & MFI_FLAGS_TBOLT)
+                           MFI_WRITE4(sc, MFI_SKINNY_IDB, 7);
+                       else
+                           MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_READY);
+                       max_wait = MFI_RESET_WAIT_TIME;
                        break;
                case MFI_FWSTATE_UNDEFINED:
                case MFI_FWSTATE_BB_INIT:
-                       max_wait = 2;
+                       max_wait = MFI_RESET_WAIT_TIME;
+                       break;
+               case MFI_FWSTATE_FW_INIT_2:
+                       max_wait = MFI_RESET_WAIT_TIME;
                        break;
                case MFI_FWSTATE_FW_INIT:
                case MFI_FWSTATE_FLUSH_CACHE:
-                       max_wait = 20;
+                       max_wait = MFI_RESET_WAIT_TIME;
                        break;
                case MFI_FWSTATE_DEVICE_SCAN:
-                       max_wait = 180; /* wait for 180 seconds */
+                       max_wait = MFI_RESET_WAIT_TIME; /* wait for 180 seconds */
                        prev_abs_reg_val = cur_abs_reg_val;
                        break;
                case MFI_FWSTATE_BOOT_MESSAGE_PENDING:
-                       MFI_WRITE4(sc, idb, MFI_FWINIT_HOTPLUG);
-                       max_wait = 10;
+                       if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags & MFI_FLAGS_TBOLT)
+                           MFI_WRITE4(sc, MFI_SKINNY_IDB, MFI_FWINIT_HOTPLUG);
+                       else
+                           MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG);
+                       max_wait = MFI_RESET_WAIT_TIME;
                        break;
                default:
-                       device_printf(sc->mfi_dev,"Unknown firmware state %#x\n",
+                       device_printf(sc->mfi_dev, "Unknown firmware state %#x\n",
                            fw_state);
                        return (ENXIO);
                }
@@ -349,25 +339,14 @@ mfi_transition_firmware(struct mfi_softc *sc)
        return (0);
 }
 
-#if defined(__x86_64__)
 static void
-mfi_addr64_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
+mfi_addr_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
 {
-       uint64_t *addr;
+       bus_addr_t *addr;
 
        addr = arg;
        *addr = segs[0].ds_addr;
 }
-#else
-static void
-mfi_addr32_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
-{
-       uint32_t *addr;
-
-       addr = arg;
-       *addr = segs[0].ds_addr;
-}
-#endif
 
 int
 mfi_attach(struct mfi_softc *sc)
@@ -375,14 +354,20 @@ mfi_attach(struct mfi_softc *sc)
        uint32_t status;
        int error, commsz, framessz, sensesz;
        int frames, unit, max_fw_sge;
-       u_int irq_flags;
+       uint32_t tb_mem_size = 0;
 
-       device_printf(sc->mfi_dev, "Megaraid SAS driver Ver 3.981\n");
+       if (sc == NULL)
+               return EINVAL;
+
+       device_printf(sc->mfi_dev, "Megaraid SAS driver Ver %s \n",
+           MEGASAS_VERSION);
 
        lockinit(&sc->mfi_io_lock, "MFI I/O lock", 0, LK_CANRECURSE);
        lockinit(&sc->mfi_config_lock, "MFI config", 0, LK_CANRECURSE);
        TAILQ_INIT(&sc->mfi_ld_tqh);
        TAILQ_INIT(&sc->mfi_syspd_tqh);
+       TAILQ_INIT(&sc->mfi_evt_queue);
+       TASK_INIT(&sc->mfi_evt_task, 0, mfi_handle_evt, sc);
        TAILQ_INIT(&sc->mfi_aen_pids);
        TAILQ_INIT(&sc->mfi_cam_ccbq);
 
@@ -391,11 +376,26 @@ mfi_attach(struct mfi_softc *sc)
        mfi_initq_busy(sc);
        mfi_initq_bio(sc);
 
+       sc->adpreset = 0;
+       sc->last_seq_num = 0;
+       sc->disableOnlineCtrlReset = 1;
+       sc->issuepend_done = 1;
+       sc->hw_crit_error = 0;
+
        if (sc->mfi_flags & MFI_FLAGS_1064R) {
                sc->mfi_enable_intr = mfi_enable_intr_xscale;
                sc->mfi_read_fw_status = mfi_read_fw_status_xscale;
                sc->mfi_check_clear_intr = mfi_check_clear_intr_xscale;
                sc->mfi_issue_cmd = mfi_issue_cmd_xscale;
+       } else if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
+               sc->mfi_enable_intr = mfi_tbolt_enable_intr_ppc;
+               sc->mfi_disable_intr = mfi_tbolt_disable_intr_ppc;
+               sc->mfi_read_fw_status = mfi_tbolt_read_fw_status_ppc;
+               sc->mfi_check_clear_intr = mfi_tbolt_check_clear_intr_ppc;
+               sc->mfi_issue_cmd = mfi_tbolt_issue_cmd_ppc;
+               sc->mfi_adp_reset = mfi_tbolt_adp_reset;
+               sc->mfi_tbolt = 1;
+               TAILQ_INIT(&sc->mfi_cmd_tbolt_tqh);
        } else {
                sc->mfi_enable_intr =  mfi_enable_intr_ppc;
                sc->mfi_read_fw_status = mfi_read_fw_status_ppc;
@@ -411,6 +411,31 @@ mfi_attach(struct mfi_softc *sc)
                return (ENXIO);
        }
 
+       /* Start: LSIP200113393 */
+       if (bus_dma_tag_create( sc->mfi_parent_dmat,    /* parent */
+                               1, 0,                   /* algnmnt, boundary */
+                               BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
+                               BUS_SPACE_MAXADDR,      /* highaddr */
+                               NULL, NULL,             /* filter, filterarg */
+                               MEGASAS_MAX_NAME*sizeof(bus_addr_t),                    /* maxsize */
+                               1,                      /* msegments */
+                               MEGASAS_MAX_NAME*sizeof(bus_addr_t),                    /* maxsegsize */
+                               0,                      /* flags */
+                               &sc->verbuf_h_dmat)) {
+               device_printf(sc->mfi_dev, "Cannot allocate verbuf_h_dmat DMA tag\n");
+               return (ENOMEM);
+       }
+       if (bus_dmamem_alloc(sc->verbuf_h_dmat, (void **)&sc->verbuf,
+           BUS_DMA_NOWAIT, &sc->verbuf_h_dmamap)) {
+               device_printf(sc->mfi_dev, "Cannot allocate verbuf_h_dmamap memory\n");
+               return (ENOMEM);
+       }
+       bzero(sc->verbuf, MEGASAS_MAX_NAME*sizeof(bus_addr_t));
+       bus_dmamap_load(sc->verbuf_h_dmat, sc->verbuf_h_dmamap,
+           sc->verbuf, MEGASAS_MAX_NAME*sizeof(bus_addr_t),
+           mfi_addr_cb, &sc->verbuf_h_busaddr, 0);
+       /* End: LSIP200113393 */
+
        /*
         * Get information needed for sizing the contiguous memory for the
         * frame pool.  Size down the sgl parameter since we know that
@@ -423,6 +448,97 @@ mfi_attach(struct mfi_softc *sc)
        max_fw_sge = (status & MFI_FWSTATE_MAXSGL_MASK) >> 16;
        sc->mfi_max_sge = min(max_fw_sge, ((MFI_MAXPHYS / PAGE_SIZE) + 1));
 
+       /* ThunderBolt Support get the contiguous memory */
+
+       if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
+               mfi_tbolt_init_globals(sc);
+               device_printf(sc->mfi_dev, "MaxCmd = %x MaxSgl = %x state = %x \n",
+                   sc->mfi_max_fw_cmds, sc->mfi_max_sge, status);
+               tb_mem_size = mfi_tbolt_get_memory_requirement(sc);
+
+               if (bus_dma_tag_create( sc->mfi_parent_dmat,    /* parent */
+                               1, 0,                   /* algnmnt, boundary */
+                               BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
+                               BUS_SPACE_MAXADDR,      /* highaddr */
+                               NULL, NULL,             /* filter, filterarg */
+                               tb_mem_size,            /* maxsize */
+                               1,                      /* msegments */
+                               tb_mem_size,            /* maxsegsize */
+                               0,                      /* flags */
+                               &sc->mfi_tb_dmat)) {
+                       device_printf(sc->mfi_dev, "Cannot allocate comms DMA tag\n");
+                       return (ENOMEM);
+               }
+               if (bus_dmamem_alloc(sc->mfi_tb_dmat, (void **)&sc->request_message_pool,
+               BUS_DMA_NOWAIT, &sc->mfi_tb_dmamap)) {
+                       device_printf(sc->mfi_dev, "Cannot allocate comms memory\n");
+                       return (ENOMEM);
+               }
+               bzero(sc->request_message_pool, tb_mem_size);
+               bus_dmamap_load(sc->mfi_tb_dmat, sc->mfi_tb_dmamap,
+               sc->request_message_pool, tb_mem_size, mfi_addr_cb, &sc->mfi_tb_busaddr, 0);
+
+               /* For ThunderBolt memory init */
+               if (bus_dma_tag_create( sc->mfi_parent_dmat,    /* parent */
+                               0x100, 0,               /* alignmnt, boundary */
+                               BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
+                               BUS_SPACE_MAXADDR,      /* highaddr */
+                               NULL, NULL,             /* filter, filterarg */
+                               MFI_FRAME_SIZE,         /* maxsize */
+                               1,                      /* msegments */
+                               MFI_FRAME_SIZE,         /* maxsegsize */
+                               0,                      /* flags */
+                               &sc->mfi_tb_init_dmat)) {
+               device_printf(sc->mfi_dev, "Cannot allocate init DMA tag\n");
+               return (ENOMEM);
+               }
+               if (bus_dmamem_alloc(sc->mfi_tb_init_dmat, (void **)&sc->mfi_tb_init,
+                   BUS_DMA_NOWAIT, &sc->mfi_tb_init_dmamap)) {
+                       device_printf(sc->mfi_dev, "Cannot allocate init memory\n");
+                       return (ENOMEM);
+               }
+               bzero(sc->mfi_tb_init, MFI_FRAME_SIZE);
+               bus_dmamap_load(sc->mfi_tb_init_dmat, sc->mfi_tb_init_dmamap,
+               sc->mfi_tb_init, MFI_FRAME_SIZE, mfi_addr_cb,
+                   &sc->mfi_tb_init_busaddr, 0);
+               if (mfi_tbolt_init_desc_pool(sc, sc->request_message_pool,
+                   tb_mem_size)) {
+                       device_printf(sc->mfi_dev,
+                           "Thunderbolt pool preparation error\n");
+                       return 0;
+               }
+
+               /*
+                 Allocate DMA memory mapping for MPI2 IOC Init descriptor,
+                 we are taking it diffrent from what we have allocated for Request
+                 and reply descriptors to avoid confusion later
+               */
+               tb_mem_size = sizeof(struct MPI2_IOC_INIT_REQUEST);
+               if (bus_dma_tag_create( sc->mfi_parent_dmat,    /* parent */
+                               1, 0,                   /* algnmnt, boundary */
+                               BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
+                               BUS_SPACE_MAXADDR,      /* highaddr */
+                               NULL, NULL,             /* filter, filterarg */
+                               tb_mem_size,            /* maxsize */
+                               1,                      /* msegments */
+                               tb_mem_size,            /* maxsegsize */
+                               0,                      /* flags */
+                               &sc->mfi_tb_ioc_init_dmat)) {
+                       device_printf(sc->mfi_dev,
+                           "Cannot allocate comms DMA tag\n");
+                       return (ENOMEM);
+               }
+               if (bus_dmamem_alloc(sc->mfi_tb_ioc_init_dmat,
+                   (void **)&sc->mfi_tb_ioc_init_desc,
+                   BUS_DMA_NOWAIT, &sc->mfi_tb_ioc_init_dmamap)) {
+                       device_printf(sc->mfi_dev, "Cannot allocate comms memory\n");
+                       return (ENOMEM);
+               }
+               bzero(sc->mfi_tb_ioc_init_desc, tb_mem_size);
+               bus_dmamap_load(sc->mfi_tb_ioc_init_dmat, sc->mfi_tb_ioc_init_dmamap,
+               sc->mfi_tb_ioc_init_desc, tb_mem_size, mfi_addr_cb,
+                   &sc->mfi_tb_ioc_init_busaddr, 0);
+       }
        /*
         * Create the dma tag for data buffers.  Used both for block I/O
         * and for various internal data queries.
@@ -468,14 +584,8 @@ mfi_attach(struct mfi_softc *sc)
                return (ENOMEM);
        }
        bzero(sc->mfi_comms, commsz);
-#if defined(__x86_64__)
-       bus_dmamap_load(sc->mfi_comms_dmat, sc->mfi_comms_dmamap,
-           sc->mfi_comms, commsz, mfi_addr64_cb, &sc->mfi_comms_busaddr, 0);
-#else
        bus_dmamap_load(sc->mfi_comms_dmat, sc->mfi_comms_dmamap,
-           sc->mfi_comms, commsz, mfi_addr32_cb, &sc->mfi_comms_busaddr, 0);
-#endif
-
+           sc->mfi_comms, commsz, mfi_addr_cb, &sc->mfi_comms_busaddr, 0);
        /*
         * Allocate DMA memory for the command frames.  Keep them in the
         * lower 4GB for efficiency.  Calculate the size of the commands at
@@ -516,14 +626,8 @@ mfi_attach(struct mfi_softc *sc)
                return (ENOMEM);
        }
        bzero(sc->mfi_frames, framessz);
-#if defined(__x86_64__)
-       bus_dmamap_load(sc->mfi_frames_dmat, sc->mfi_frames_dmamap,
-           sc->mfi_frames, framessz, mfi_addr64_cb, &sc->mfi_frames_busaddr,0);
-#else
        bus_dmamap_load(sc->mfi_frames_dmat, sc->mfi_frames_dmamap,
-           sc->mfi_frames, framessz, mfi_addr32_cb, &sc->mfi_frames_busaddr,0);
-#endif
-
+           sc->mfi_frames, framessz, mfi_addr_cb, &sc->mfi_frames_busaddr,0);
        /*
         * Allocate DMA memory for the frame sense data.  Keep them in the
         * lower 4GB for efficiency
@@ -547,47 +651,48 @@ mfi_attach(struct mfi_softc *sc)
                device_printf(sc->mfi_dev, "Cannot allocate sense memory\n");
                return (ENOMEM);
        }
-#if defined(__x86_64__)
        bus_dmamap_load(sc->mfi_sense_dmat, sc->mfi_sense_dmamap,
-           sc->mfi_sense, sensesz, mfi_addr64_cb, &sc->mfi_sense_busaddr, 0);
-#else
-       bus_dmamap_load(sc->mfi_sense_dmat, sc->mfi_sense_dmamap,
-           sc->mfi_sense, sensesz, mfi_addr32_cb, &sc->mfi_sense_busaddr, 0);
-#endif
-
+           sc->mfi_sense, sensesz, mfi_addr_cb, &sc->mfi_sense_busaddr, 0);
        if ((error = mfi_alloc_commands(sc)) != 0)
                return (error);
 
-       if ((error = mfi_comms_init(sc)) != 0)
-               return (error);
+       /*
+        * Before moving the FW to operational state, check whether
+        * hostmemory is required by the FW or not
+        */
 
-       if ((error = mfi_get_controller_info(sc)) != 0)
-               return (error);
+       /* ThunderBolt MFI_IOC2 INIT */
+       if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
+               sc->mfi_disable_intr(sc);
+               if ((error = mfi_tbolt_init_MFI_queue(sc)) != 0) {
+                       device_printf(sc->mfi_dev,
+                           "TB Init has failed with error %d\n",error);
+                       return error;
+               }
 
-       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
-       if ((error = mfi_aen_setup(sc, 0), 0) != 0) {
-               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
-               return (error);
-       }
-       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
+               if ((error = mfi_tbolt_alloc_cmd(sc)) != 0)
+                       return error;
+               if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE,
+                       mfi_intr_tbolt, sc, &sc->mfi_intr, NULL)) {
+                       device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
+                       return (EINVAL);
+               }
+               sc->mfi_enable_intr(sc);
+               sc->map_id = 0;
+       } else {
+               if ((error = mfi_comms_init(sc)) != 0)
+                       return (error);
 
-       /*
-        * Set up the interrupt handler.  XXX This should happen in
-        * mfi_pci.c
-        */
-       sc->mfi_irq_rid = 0;
-       sc->mfi_irq_type = pci_alloc_1intr(sc->mfi_dev, mfi_msi_enable,
-           &sc->mfi_irq_rid, &irq_flags);
-       if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ,
-           &sc->mfi_irq_rid, irq_flags)) == NULL) {
-               device_printf(sc->mfi_dev, "Cannot allocate interrupt\n");
-               return (EINVAL);
-       }
-       if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE,
-           mfi_intr, sc, &sc->mfi_intr, NULL)) {
-               device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
-               return (EINVAL);
+               if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE,
+                       mfi_intr, sc, &sc->mfi_intr, NULL)) {
+                       device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
+                       return (EINVAL);
+               }
+               sc->mfi_enable_intr(sc);
        }
+       if ((error = mfi_get_controller_info(sc)) != 0)
+               return (error);
+       sc->disableOnlineCtrlReset = 0;
 
        /* Register a config hook to probe the bus for arrays */
        sc->mfi_ich.ich_func = mfi_startup;
@@ -597,6 +702,10 @@ mfi_attach(struct mfi_softc *sc)
                    "hook\n");
                return (EINVAL);
        }
+       if ((error = mfi_aen_setup(sc, 0), 0) != 0) {
+               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
+               return (error);
+       }
 
        /*
         * Register a shutdown handler.
@@ -676,8 +785,11 @@ mfi_alloc_commands(struct mfi_softc *sc)
                cm->cm_sc = sc;
                cm->cm_index = i;
                if (bus_dmamap_create(sc->mfi_buffer_dmat, 0,
-                   &cm->cm_dmamap) == 0)
+                   &cm->cm_dmamap) == 0) {
+                       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                        mfi_release_command(cm);
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
+               }
                else
                        break;
                sc->mfi_total_cmds++;
@@ -692,6 +804,8 @@ mfi_release_command(struct mfi_command *cm)
        struct mfi_frame_header *hdr;
        uint32_t *hdr_data;
 
+       KKASSERT(lockstatus(&cm->cm_sc->mfi_io_lock, curthread) != 0);
+
        /*
         * Zero out the important fields of the frame, but make sure the
         * context field is preserved.  For efficiency, handle the fields
@@ -716,13 +830,14 @@ mfi_release_command(struct mfi_command *cm)
        cm->cm_data = NULL;
        cm->cm_sg = 0;
        cm->cm_total_frame_size = 0;
+       cm->retry_for_fw_reset = 0;
 
        mfi_enqueue_free(cm);
 }
 
 static int
-mfi_dcmd_command(struct mfi_softc *sc, struct mfi_command **cmp, uint32_t opcode,
-    void **bufp, size_t bufsize)
+mfi_dcmd_command(struct mfi_softc *sc, struct mfi_command **cmp,
+    uint32_t opcode, void **bufp, size_t bufsize)
 {
        struct mfi_command *cm;
        struct mfi_dcmd_frame *dcmd;
@@ -852,9 +967,11 @@ mfi_get_controller_info(struct mfi_softc *sc)
            BUS_DMASYNC_POSTREAD);
        bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
 
-       max_sectors_1 = (1 << ci->stripe_sz_ops.min) * ci->max_strips_per_io;
+       max_sectors_1 = (1 << ci->stripe_sz_ops.max) * ci->max_strips_per_io;
        max_sectors_2 = ci->max_request_size;
        sc->mfi_max_io = min(max_sectors_1, max_sectors_2);
+       sc->disableOnlineCtrlReset =
+           ci->properties.OnOffProperties.disableOnlineCtrlReset;
 
 out:
        if (ci)
@@ -871,6 +988,7 @@ mfi_get_log_state(struct mfi_softc *sc, struct mfi_evt_log_state **log_state)
        struct mfi_command *cm = NULL;
        int error;
 
+       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
        error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_GETINFO,
            (void **)log_state, sizeof(**log_state));
        if (error)
@@ -889,11 +1007,12 @@ mfi_get_log_state(struct mfi_softc *sc, struct mfi_evt_log_state **log_state)
 out:
        if (cm)
                mfi_release_command(cm);
+       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
 
        return (error);
 }
 
-static int
+int
 mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start)
 {
        struct mfi_evt_log_state *log_state = NULL;
@@ -907,6 +1026,7 @@ mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start)
 
        if (seq_start == 0) {
                error = mfi_get_log_state(sc, &log_state);
+               sc->mfi_boot_seq_num = log_state->boot_seq_num;
                if (error) {
                        if (log_state)
                                kfree(log_state, M_MFIBUF);
@@ -929,7 +1049,7 @@ mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start)
        return 0;
 }
 
-static int
+int
 mfi_wait_command(struct mfi_softc *sc, struct mfi_command *cm)
 {
 
@@ -978,8 +1098,7 @@ mfi_free(struct mfi_softc *sc)
        if (sc->mfi_irq != NULL)
                bus_release_resource(sc->mfi_dev, SYS_RES_IRQ, sc->mfi_irq_rid,
                    sc->mfi_irq);
-       if (sc->mfi_irq_type == PCI_INTR_TYPE_MSI)
-               pci_release_msi(sc->mfi_dev);
+
        if (sc->mfi_sense_busaddr != 0)
                bus_dmamap_unload(sc->mfi_sense_dmat, sc->mfi_sense_dmamap);
        if (sc->mfi_sense != NULL)
@@ -1004,6 +1123,64 @@ mfi_free(struct mfi_softc *sc)
        if (sc->mfi_comms_dmat != NULL)
                bus_dma_tag_destroy(sc->mfi_comms_dmat);
 
+       /* ThunderBolt contiguous memory free here */
+       if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
+               if (sc->mfi_tb_busaddr != 0)
+                       bus_dmamap_unload(sc->mfi_tb_dmat, sc->mfi_tb_dmamap);
+               if (sc->request_message_pool != NULL)
+                       bus_dmamem_free(sc->mfi_tb_dmat, sc->request_message_pool,
+                           sc->mfi_tb_dmamap);
+               if (sc->mfi_tb_dmat != NULL)
+                       bus_dma_tag_destroy(sc->mfi_tb_dmat);
+
+               /* Version buffer memory free */
+               /* Start LSIP200113393 */
+               if (sc->verbuf_h_busaddr != 0)
+                       bus_dmamap_unload(sc->verbuf_h_dmat, sc->verbuf_h_dmamap);
+               if (sc->verbuf != NULL)
+                       bus_dmamem_free(sc->verbuf_h_dmat, sc->verbuf,
+                           sc->verbuf_h_dmamap);
+               if (sc->verbuf_h_dmat != NULL)
+                       bus_dma_tag_destroy(sc->verbuf_h_dmat);
+
+               /* End LSIP200113393 */
+               /* ThunderBolt INIT packet memory Free */
+               if (sc->mfi_tb_init_busaddr != 0)
+                       bus_dmamap_unload(sc->mfi_tb_init_dmat, sc->mfi_tb_init_dmamap);
+               if (sc->mfi_tb_init != NULL)
+                       bus_dmamem_free(sc->mfi_tb_init_dmat, sc->mfi_tb_init,
+                           sc->mfi_tb_init_dmamap);
+               if (sc->mfi_tb_init_dmat != NULL)
+                       bus_dma_tag_destroy(sc->mfi_tb_init_dmat);
+
+               /* ThunderBolt IOC Init Desc memory free here */
+               if (sc->mfi_tb_ioc_init_busaddr != 0)
+                       bus_dmamap_unload(sc->mfi_tb_ioc_init_dmat,
+                           sc->mfi_tb_ioc_init_dmamap);
+               if (sc->mfi_tb_ioc_init_desc != NULL)
+                       bus_dmamem_free(sc->mfi_tb_ioc_init_dmat,
+                           sc->mfi_tb_ioc_init_desc,
+                           sc->mfi_tb_ioc_init_dmamap);
+               if (sc->mfi_tb_ioc_init_dmat != NULL)
+                       bus_dma_tag_destroy(sc->mfi_tb_ioc_init_dmat);
+               for (int i = 0; i < sc->mfi_max_fw_cmds; i++) {
+                       if (sc->mfi_cmd_pool_tbolt != NULL) {
+                               if (sc->mfi_cmd_pool_tbolt[i] != NULL) {
+                                       kfree(sc->mfi_cmd_pool_tbolt[i],
+                                           M_MFIBUF);
+                                       sc->mfi_cmd_pool_tbolt[i] = NULL;
+                               }
+                       }
+               }
+               if (sc->mfi_cmd_pool_tbolt != NULL) {
+                       kfree(sc->mfi_cmd_pool_tbolt, M_MFIBUF);
+                       sc->mfi_cmd_pool_tbolt = NULL;
+               }
+               if (sc->request_desc_pool != NULL) {
+                       kfree(sc->request_desc_pool, M_MFIBUF);
+                       sc->request_desc_pool = NULL;
+               }
+       }
        if (sc->mfi_buffer_dmat != NULL)
                bus_dma_tag_destroy(sc->mfi_buffer_dmat);
        if (sc->mfi_parent_dmat != NULL)
@@ -1054,12 +1231,7 @@ mfi_intr(void *arg)
        if (sc->mfi_check_clear_intr(sc))
                return;
 
-       /*
-        * Do a dummy read to flush the interrupt ACK that we just performed,
-        * ensuring that everything is really, truly consistent.
-        */
-       (void)sc->mfi_read_fw_status(sc);
-
+restart:
        pi = sc->mfi_comms->hw_pi;
        ci = sc->mfi_comms->hw_ci;
        lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
@@ -1084,6 +1256,14 @@ mfi_intr(void *arg)
        mfi_startio(sc);
        lockmgr(&sc->mfi_io_lock, LK_RELEASE);
 
+       /*
+        * Dummy read to flush the bus; this ensures that the indexes are up
+        * to date.  Restart processing if more commands have come it.
+        */
+       (void)sc->mfi_read_fw_status(sc);
+       if (pi != sc->mfi_comms->hw_pi)
+               goto restart;
+
        return;
 }
 
@@ -1104,6 +1284,9 @@ mfi_shutdown(struct mfi_softc *sc)
        if (sc->mfi_aen_cm != NULL)
                mfi_abort(sc, sc->mfi_aen_cm);
 
+       if (sc->map_update_cmd != NULL)
+               mfi_abort(sc, sc->map_update_cmd);
+
        dcmd = &cm->cm_frame->dcmd;
        dcmd->header.flags = MFI_FRAME_DIR_NONE;
        cm->cm_flags = MFI_CMD_POLLED;
@@ -1117,14 +1300,15 @@ mfi_shutdown(struct mfi_softc *sc)
        lockmgr(&sc->mfi_io_lock, LK_RELEASE);
        return (error);
 }
+
 static void
 mfi_syspdprobe(struct mfi_softc *sc)
 {
        struct mfi_frame_header *hdr;
        struct mfi_command *cm = NULL;
        struct mfi_pd_list *pdlist = NULL;
-       struct mfi_system_pd *syspd;
-       int error, i;
+       struct mfi_system_pd *syspd, *tmp;
+       int error, i, found;
 
        KKASSERT(lockstatus(&sc->mfi_config_lock, curthread) != 0);
        KKASSERT(lockstatus(&sc->mfi_io_lock, curthread) != 0);
@@ -1132,7 +1316,8 @@ mfi_syspdprobe(struct mfi_softc *sc)
        error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_LIST_QUERY,
            (void **)&pdlist, sizeof(*pdlist));
        if (error) {
-               device_printf(sc->mfi_dev,"Error while forming syspd list\n");
+               device_printf(sc->mfi_dev,
+                   "Error while forming SYSTEM PD list\n");
                goto out;
        }
 
@@ -1140,7 +1325,8 @@ mfi_syspdprobe(struct mfi_softc *sc)
        cm->cm_frame->dcmd.mbox[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST;
        cm->cm_frame->dcmd.mbox[1] = 0;
        if (mfi_mapcmd(sc, cm) != 0) {
-               device_printf(sc->mfi_dev, "Failed to get syspd device list\n");
+               device_printf(sc->mfi_dev,
+                   "Failed to get syspd device listing\n");
                goto out;
        }
        bus_dmamap_sync(sc->mfi_buffer_dmat,cm->cm_dmamap,
@@ -1148,36 +1334,37 @@ mfi_syspdprobe(struct mfi_softc *sc)
        bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
        hdr = &cm->cm_frame->header;
        if (hdr->cmd_status != MFI_STAT_OK) {
-               device_printf(sc->mfi_dev, "MFI_DCMD_PD_LIST_QUERY failed %x\n",
-                   hdr->cmd_status);
+               device_printf(sc->mfi_dev,
+                   "MFI_DCMD_PD_LIST_QUERY failed %x\n", hdr->cmd_status);
                goto out;
        }
+       /* Get each PD and add it to the system */
        for (i = 0; i < pdlist->count; i++) {
-               if (pdlist->addr[i].device_id == pdlist->addr[i].encl_device_id)
-                       goto skip_sys_pd_add;
-               /* Get each PD and add it to the system */
-               if (!TAILQ_EMPTY(&sc->mfi_syspd_tqh)) {
-                       TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,pd_link) {
-                               if (syspd->pd_id == pdlist->addr[i].device_id)
-                                       goto skip_sys_pd_add;
-                       }
+               if (pdlist->addr[i].device_id ==
+                   pdlist->addr[i].encl_device_id)
+                       continue;
+               found = 0;
+               TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh, pd_link) {
+                       if (syspd->pd_id == pdlist->addr[i].device_id)
+                               found = 1;
                }
-               mfi_add_sys_pd(sc,pdlist->addr[i].device_id);
-skip_sys_pd_add:
-               ;
+               if (found == 0)
+                       mfi_add_sys_pd(sc, pdlist->addr[i].device_id);
        }
        /* Delete SYSPD's whose state has been changed */
-       if (!TAILQ_EMPTY(&sc->mfi_syspd_tqh)) {
-               TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,pd_link) {
-                       for (i=0;i<pdlist->count;i++) {
-                               if (syspd->pd_id == pdlist->addr[i].device_id)
-                                       goto skip_sys_pd_delete;
-                       }
+       TAILQ_FOREACH_MUTABLE(syspd, &sc->mfi_syspd_tqh, pd_link, tmp) {
+               found = 0;
+               for (i = 0; i < pdlist->count; i++) {
+                       if (syspd->pd_id == pdlist->addr[i].device_id)
+                               found = 1;
+               }
+               if (found == 0) {
+                       kprintf("DELETE\n");
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                        get_mplock();
-                       device_delete_child(sc->mfi_dev,syspd->pd_dev);
+                       device_delete_child(sc->mfi_dev, syspd->pd_dev);
                        rel_mplock();
-skip_sys_pd_delete:
-                       ;
+                       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                }
        }
 out:
@@ -1281,10 +1468,125 @@ format_class(int8_t class)
 static void
 mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
 {
+       struct mfi_system_pd *syspd = NULL;
 
        device_printf(sc->mfi_dev, "%d (%s/0x%04x/%s) - %s\n", detail->seq,
            format_timestamp(detail->time), detail->evt_class.members.locale,
-           format_class(detail->evt_class.members.evt_class), detail->description);
+           format_class(detail->evt_class.members.evt_class),
+           detail->description);
+
+       /* Don't act on old AEN's or while shutting down */
+       if (detail->seq < sc->mfi_boot_seq_num || sc->mfi_detaching)
+               return;
+
+       switch (detail->arg_type) {
+       case MR_EVT_ARGS_NONE:
+               if (detail->code == MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED) {
+                   device_printf(sc->mfi_dev, "HostBus scan raised\n");
+                       if (mfi_detect_jbod_change) {
+                               /*
+                                * Probe for new SYSPD's and Delete
+                                * invalid SYSPD's
+                                */
+                               lockmgr(&sc->mfi_config_lock, LK_EXCLUSIVE);
+                               lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
+                               mfi_syspdprobe(sc);
+                               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
+                               lockmgr(&sc->mfi_config_lock, LK_RELEASE);
+                       }
+               }
+               break;
+       case MR_EVT_ARGS_LD_STATE:
+               /*
+                * During load time driver reads all the events starting
+                * from the one that has been logged after shutdown. Avoid
+                * these old events.
+                */
+               if (detail->args.ld_state.new_state == MFI_LD_STATE_OFFLINE ) {
+                       /* Remove the LD */
+                       struct mfi_disk *ld;
+                       TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
+                               if (ld->ld_id ==
+                                   detail->args.ld_state.ld.target_id)
+                                       break;
+                       }
+                       /*
+                       Fix: for kernel panics when SSCD is removed
+                       KASSERT(ld != NULL, ("volume dissappeared"));
+                       */
+                       if (ld != NULL) {
+                               get_mplock();
+                               device_delete_child(sc->mfi_dev, ld->ld_dev);
+                               rel_mplock();
+                       }
+               }
+               break;
+       case MR_EVT_ARGS_PD:
+               if (detail->code == MR_EVT_PD_REMOVED) {
+                       if (mfi_detect_jbod_change) {
+                               /*
+                                * If the removed device is a SYSPD then
+                                * delete it
+                                */
+                               TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,
+                                   pd_link) {
+                                       if (syspd->pd_id ==
+                                           detail->args.pd.device_id) {
+                                               get_mplock();
+                                               device_delete_child(
+                                                   sc->mfi_dev,
+                                                   syspd->pd_dev);
+                                               rel_mplock();
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               if (detail->code == MR_EVT_PD_INSERTED) {
+                       if (mfi_detect_jbod_change) {
+                               /* Probe for new SYSPD's */
+                               lockmgr(&sc->mfi_config_lock, LK_EXCLUSIVE);
+                               lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
+                               mfi_syspdprobe(sc);
+                               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
+                               lockmgr(&sc->mfi_config_lock, LK_RELEASE);
+                       }
+               }
+               break;
+       }
+}
+
+static void
+mfi_queue_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
+{
+       struct mfi_evt_queue_elm *elm;
+
+       KKASSERT(lockstatus(&sc->mfi_io_lock, curthread) != 0);
+       elm = kmalloc(sizeof(*elm), M_MFIBUF, M_NOWAIT | M_ZERO);
+       if (elm == NULL)
+               return;
+       memcpy(&elm->detail, detail, sizeof(*detail));
+       TAILQ_INSERT_TAIL(&sc->mfi_evt_queue, elm, link);
+       taskqueue_enqueue(taskqueue_swi, &sc->mfi_evt_task);
+}
+
+static void
+mfi_handle_evt(void *context, int pending)
+{
+       TAILQ_HEAD(,mfi_evt_queue_elm) queue;
+       struct mfi_softc *sc;
+       struct mfi_evt_queue_elm *elm;
+
+       sc = context;
+       TAILQ_INIT(&queue);
+       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
+       TAILQ_CONCAT(&queue, &sc->mfi_evt_queue, link);
+       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
+       while ((elm = TAILQ_FIRST(&queue)) != NULL) {
+               TAILQ_REMOVE(&queue, elm, link);
+               mfi_decode_evt(sc, &elm->detail);
+               kfree(elm, M_MFIBUF);
+       }
 }
 
 static int
@@ -1310,12 +1612,16 @@ mfi_aen_register(struct mfi_softc *sc, int seq, int locale)
                            < current_aen.members.evt_class)
                                current_aen.members.evt_class =
                                    prior_aen.members.evt_class;
+                       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                        mfi_abort(sc, sc->mfi_aen_cm);
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                }
        }
 
+       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
        error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_WAIT,
            (void **)&ed, sizeof(*ed));
+       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
        if (error) {
                goto out;
        }
@@ -1326,10 +1632,13 @@ mfi_aen_register(struct mfi_softc *sc, int seq, int locale)
        cm->cm_flags = MFI_CMD_DATAIN;
        cm->cm_complete = mfi_aen_complete;
 
+       sc->last_seq_num = seq;
        sc->mfi_aen_cm = cm;
 
+       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
        mfi_enqueue_ready(cm);
        mfi_startio(sc);
+       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
 
 out:
        return (error);
@@ -1345,6 +1654,8 @@ mfi_aen_complete(struct mfi_command *cm)
        int seq = 0, aborted = 0;
 
        sc = cm->cm_sc;
+       KKASSERT(lockstatus(&sc->mfi_io_lock, curthread) != 0);
+
        hdr = &cm->cm_frame->header;
 
        if (sc->mfi_aen_cm == NULL)
@@ -1361,13 +1672,10 @@ mfi_aen_complete(struct mfi_command *cm)
                        KNOTE(&sc->mfi_kq.ki_note, 0);
                }
                detail = cm->cm_data;
-               /*
-                * XXX If this function is too expensive or is recursive, then
-                * events should be put onto a queue and processed later.
-                */
-               mfi_decode_evt(sc, detail);
+               mfi_queue_evt(sc, detail);
                seq = detail->seq + 1;
-               TAILQ_FOREACH_MUTABLE(mfi_aen_entry, &sc->mfi_aen_pids, aen_link, tmp) {
+               TAILQ_FOREACH_MUTABLE(mfi_aen_entry, &sc->mfi_aen_pids,
+                   aen_link, tmp) {
                        TAILQ_REMOVE(&sc->mfi_aen_pids, mfi_aen_entry,
                            aen_link);
                        lwkt_gettoken(&proc_token);
@@ -1384,7 +1692,9 @@ mfi_aen_complete(struct mfi_command *cm)
 
        /* set it up again so the driver can catch more events */
        if (!aborted) {
+               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                mfi_aen_setup(sc, seq);
+               lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
        }
 }
 
@@ -1398,7 +1708,6 @@ mfi_parse_entries(struct mfi_softc *sc, int start_seq, int stop_seq)
        struct mfi_evt_list *el;
        union mfi_evt class_locale;
        int error, i, seq, size;
-       uint32_t context = 0;
 
        class_locale.members.reserved = 0;
        class_locale.members.locale = mfi_event_locale;
@@ -1411,22 +1720,20 @@ mfi_parse_entries(struct mfi_softc *sc, int start_seq, int stop_seq)
                return (ENOMEM);
 
        for (seq = start_seq;;) {
+               lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                if ((cm = mfi_dequeue_free(sc)) == NULL) {
                        kfree(el, M_MFIBUF);
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                        return (EBUSY);
                }
 
-               /* Zero out the MFI frame */
-               context = cm->cm_frame->header.context;
-               bzero(cm->cm_frame, sizeof(union mfi_frame));
-               cm->cm_frame->header.context = context;
+               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
 
                dcmd = &cm->cm_frame->dcmd;
                bzero(dcmd->mbox, MFI_MBOX_SIZE);
                dcmd->header.cmd = MFI_CMD_DCMD;
                dcmd->header.timeout = 0;
                dcmd->header.data_len = size;
-               dcmd->header.scsi_status = 0;
                dcmd->opcode = MFI_DCMD_CTRL_EVENT_GET;
                ((uint32_t *)&dcmd->mbox)[0] = seq;
                ((uint32_t *)&dcmd->mbox)[1] = class_locale.word;
@@ -1436,29 +1743,38 @@ mfi_parse_entries(struct mfi_softc *sc, int start_seq, int stop_seq)
                cm->cm_data = el;
                cm->cm_len = size;
 
+               lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                if ((error = mfi_mapcmd(sc, cm)) != 0) {
                        device_printf(sc->mfi_dev,
                            "Failed to get controller entries\n");
                        mfi_release_command(cm);
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                        break;
                }
 
+               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
                    BUS_DMASYNC_POSTREAD);
                bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
 
                if (dcmd->header.cmd_status == MFI_STAT_NOT_FOUND) {
+                       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                        mfi_release_command(cm);
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                        break;
                }
                if (dcmd->header.cmd_status != MFI_STAT_OK) {
                        device_printf(sc->mfi_dev,
                            "Error %d fetching controller entries\n",
                            dcmd->header.cmd_status);
+                       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                        mfi_release_command(cm);
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                        break;
                }
+               lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                mfi_release_command(cm);
+               lockmgr(&sc->mfi_io_lock, LK_RELEASE);
 
                for (i = 0; i < el->count; i++) {
                        /*
@@ -1474,7 +1790,9 @@ mfi_parse_entries(struct mfi_softc *sc, int start_seq, int stop_seq)
                                else if (el->event[i].seq < start_seq)
                                        break;
                        }
-                       mfi_decode_evt(sc, &el->event[i]);
+                       lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
+                       mfi_queue_evt(sc, &el->event[i]);
+                       lockmgr(&sc->mfi_io_lock, LK_RELEASE);
                }
                seq = el->event[el->count - 1].seq + 1;
        }
@@ -1515,7 +1833,7 @@ mfi_add_ld(struct mfi_softc *sc, int id)
                mfi_add_ld_complete(cm);
        } else {
                mfi_release_command(cm);
-               if(ld_info)             /* SSCD drives ld_info free here */
+               if (ld_info)            /* SSCD drives ld_info free here */
                        kfree(ld_info, M_MFIBUF);
        }
        return (0);
@@ -1558,7 +1876,7 @@ mfi_add_ld_complete(struct mfi_command *cm)
 }
 
 static int
-mfi_add_sys_pd(struct mfi_softc *sc,int id)
+mfi_add_sys_pd(struct mfi_softc *sc, int id)
 {
        struct mfi_command *cm;
        struct mfi_dcmd_frame *dcmd = NULL;
@@ -1567,13 +1885,14 @@ mfi_add_sys_pd(struct mfi_softc *sc,int id)
 
        KKASSERT(lockstatus(&sc->mfi_io_lock, curthread) != 0);
 
-       error = mfi_dcmd_command(sc,&cm,MFI_DCMD_PD_GET_INFO,
+       error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_GET_INFO,
            (void **)&pd_info, sizeof(*pd_info));
        if (error) {
                device_printf(sc->mfi_dev,
-                   "Failed to allocated for MFI_DCMD_PD_GET_INFO %d\n", error);
+                   "Failed to allocated for MFI_DCMD_PD_GET_INFO %d\n",
+                   error);
                if (pd_info)
-                       kfree(pd_info,M_MFIBUF);
+                       kfree(pd_info, M_MFIBUF);
                return (error);
        }
        cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED;
@@ -1584,12 +1903,12 @@ mfi_add_sys_pd(struct mfi_softc *sc,int id)
        if (mfi_mapcmd(sc, cm) != 0) {
                device_printf(sc->mfi_dev,
                    "Failed to get physical drive info %d\n", id);
-               kfree(pd_info,M_MFIBUF);
+               kfree(pd_info, M_MFIBUF);
                return (0);
        }
        bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
            BUS_DMASYNC_POSTREAD);
-       bus_dmamap_unload(sc->mfi_buffer_dmat,cm->cm_dmamap);
+       bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
        mfi_add_sys_pd_complete(cm);
        return (0);
 }
@@ -1612,7 +1931,7 @@ mfi_add_sys_pd_complete(struct mfi_command *cm)
                return;
        }
        if (pd_info->fw_state != MFI_PD_STATE_SYSTEM) {
-               device_printf(sc->mfi_dev,"PD=%x is not SYSTEM PD\n",
+               device_printf(sc->mfi_dev, "PD=%x is not SYSTEM PD\n",
                    pd_info->ref.v.device_id);
                kfree(pd_info, M_MFIBUF);
                mfi_release_command(cm);
@@ -1655,7 +1974,7 @@ mfi_bio_command(struct mfi_softc *sc)
        else
                cm = mfi_build_ldio(sc, bio);
        if (!cm)
-               mfi_enqueue_bio(sc,bio);
+               mfi_enqueue_bio(sc, bio);
        return cm;
 }
 
@@ -1666,7 +1985,7 @@ mfi_build_syspdio(struct mfi_softc *sc, struct bio *bio)
        struct buf *bp;
        struct mfi_system_pd *disk;
        struct mfi_pass_frame *pass;
-       int flags = 0,blkcount = 0;
+       int flags = 0, blkcount = 0;
        uint32_t context = 0;
 
        if ((cm = mfi_dequeue_free(sc)) == NULL)
@@ -1710,13 +2029,8 @@ mfi_build_syspdio(struct mfi_softc *sc, struct bio *bio)
        pass->header.sense_len = MFI_SENSE_LEN;
        pass->header.data_len = bp->b_bcount;
        pass->header.cdb_len = 10;
-#if defined(__x86_64__)
-       pass->sense_addr_lo = (cm->cm_sense_busaddr & 0xFFFFFFFF);
-       pass->sense_addr_hi = (cm->cm_sense_busaddr & 0xFFFFFFFF00000000) >> 32;
-#else
-       pass->sense_addr_lo = cm->cm_sense_busaddr;
-       pass->sense_addr_hi = 0;
-#endif
+       pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr;
+       pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
        cm->cm_complete = mfi_bio_complete;
        cm->cm_private = bio;
        cm->cm_data = bp->b_data;
@@ -1728,7 +2042,7 @@ mfi_build_syspdio(struct mfi_softc *sc, struct bio *bio)
 }
 
 static struct mfi_command *
-mfi_build_ldio(struct mfi_softc *sc,struct bio *bio)
+mfi_build_ldio(struct mfi_softc *sc, struct bio *bio)
 {
        struct mfi_io_frame *io;
        struct buf *bp;
@@ -1742,7 +2056,7 @@ mfi_build_ldio(struct mfi_softc *sc,struct bio *bio)
 
        /* Zero out the MFI frame */
        context = cm->cm_frame->header.context;
-       bzero(cm->cm_frame,sizeof(union mfi_frame));
+       bzero(cm->cm_frame, sizeof(union mfi_frame));
        cm->cm_frame->header.context = context;
        bp = bio->bio_buf;
        io = &cm->cm_frame->io;
@@ -1768,13 +2082,8 @@ mfi_build_ldio(struct mfi_softc *sc,struct bio *bio)
        io->header.scsi_status = 0;
        io->header.sense_len = MFI_SENSE_LEN;
        io->header.data_len = blkcount;
-#if defined(__x86_64__)
-       io->sense_addr_lo = (cm->cm_sense_busaddr & 0xFFFFFFFF);
-       io->sense_addr_hi = (cm->cm_sense_busaddr & 0xFFFFFFFF00000000) >> 32;
-#else
-       io->sense_addr_lo = cm->cm_sense_busaddr;
-       io->sense_addr_hi = 0;
-#endif
+       io->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr;
+       io->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
        io->lba_hi = ((bio->bio_offset / MFI_SECTOR_LEN) & 0xffffffff00000000) >> 32;
        io->lba_lo = (bio->bio_offset / MFI_SECTOR_LEN) & 0xffffffff;
        cm->cm_complete = mfi_bio_complete;
@@ -1849,14 +2158,14 @@ mfi_startio(struct mfi_softc *sc)
        }
 }
 
-static int
+int
 mfi_mapcmd(struct mfi_softc *sc, struct mfi_command *cm)
 {
        int error, polled;
 
        KKASSERT(lockstatus(&sc->mfi_io_lock, curthread) != 0);
 
-       if (cm->cm_data != NULL) {
+       if ((cm->cm_data != NULL) && (cm->cm_frame->header.cmd != MFI_CMD_STP)) {
                polled = (cm->cm_flags & MFI_CMD_POLLED) ? BUS_DMA_NOWAIT : 0;
                error = bus_dmamap_load(sc->mfi_buffer_dmat, cm->cm_dmamap,
                    cm->cm_data, cm->cm_len, mfi_data_cb, cm, polled);
@@ -1865,7 +2174,10 @@ mfi_mapcmd(struct mfi_softc *sc, struct mfi_command *cm)
                        return (0);
                }
        } else {
-               error = mfi_send_frame(sc, cm);
+               if (sc->MFA_enabled)
+                       error = mfi_tbolt_send_frame(sc, cm);
+               else
+                       error = mfi_send_frame(sc, cm);
        }
 
        return (error);
@@ -1879,8 +2191,7 @@ mfi_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
        union mfi_sgl *sgl;
        struct mfi_softc *sc;
        int i, j, first, dir;
-       int sgl_mapped = 0;
-       int sge_size = 0;
+       int sge_size;
 
        cm = (struct mfi_command *)arg;
        sc = cm->cm_sc;
@@ -1910,10 +2221,9 @@ mfi_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
                        sgl->sg_skinny[i].flag = 0;
                }
                hdr->flags |= MFI_FRAME_IEEE_SGL | MFI_FRAME_SGL64;
-               sgl_mapped = 1;
                sge_size = sizeof(struct mfi_sg_skinny);
-       }
-       if (!sgl_mapped) {
+               hdr->sg_count = nsegs;
+       } else {
                j = 0;
                if (cm->cm_frame->header.cmd == MFI_CMD_STP) {
                        first = cm->cm_stp_len;
@@ -1932,7 +2242,6 @@ mfi_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
                                sgl->sg32[j++].len = segs[i].ds_len - first;
                                first = 0;
                        }
-                       sge_size = sizeof(struct mfi_sg32);
                } else {
                        for (i = 0; i < nsegs; i++) {
                                sgl->sg64[j].addr = segs[i].ds_addr + first;
@@ -1940,11 +2249,10 @@ mfi_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
                                first = 0;
                        }
                        hdr->flags |= MFI_FRAME_SGL64;
-                       sge_size = sizeof(struct mfi_sg64);
                }
                hdr->sg_count = j;
-       } else
-               hdr->sg_count = nsegs;
+               sge_size = sc->mfi_sge_size;
+       }
 
        dir = 0;
        if (cm->cm_flags & MFI_CMD_DATAIN) {
@@ -1955,8 +2263,6 @@ mfi_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
                dir |= BUS_DMASYNC_PREWRITE;
                hdr->flags |= MFI_FRAME_DIR_WRITE;
        }
-       if (cm->cm_frame->header.cmd == MFI_CMD_STP)
-               dir |= BUS_DMASYNC_PREWRITE;
        bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, dir);
        cm->cm_flags |= MFI_CMD_MAPPED;
 
@@ -1966,10 +2272,13 @@ mfi_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
         * least 1 frame, so don't compensate for the modulo of the
         * following division.
         */
-       cm->cm_total_frame_size += (sge_size * nsegs);
+       cm->cm_total_frame_size += (sc->mfi_sge_size * nsegs);
        cm->cm_extra_frames = (cm->cm_total_frame_size - 1) / MFI_FRAME_SIZE;
 
-       mfi_send_frame(sc, cm);
+       if (sc->MFA_enabled)
+               mfi_tbolt_send_frame(sc, cm);
+       else
+               mfi_send_frame(sc, cm);
 }
 
 static int
@@ -2003,7 +2312,7 @@ mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm)
        if (cm->cm_extra_frames > 7)
                cm->cm_extra_frames = 7;
 
-       sc->mfi_issue_cmd(sc,cm->cm_frame_busaddr,cm->cm_extra_frames);
+       sc->mfi_issue_cmd(sc, cm->cm_frame_busaddr, cm->cm_extra_frames);
 
        if ((cm->cm_flags & MFI_CMD_POLLED) == 0)
                return (0);
@@ -2018,14 +2327,14 @@ mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm)
 
        if (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
                device_printf(sc->mfi_dev, "Frame %p timed out "
-                             "command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode);
+                   "command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode);
                return (ETIMEDOUT);
        }
 
        return (0);
 }
 
-static void
+void
 mfi_complete(struct mfi_softc *sc, struct mfi_command *cm)
 {
        int dir;
@@ -2075,22 +2384,20 @@ mfi_abort(struct mfi_softc *sc, struct mfi_command *cm_abort)
        abort->header.flags = 0;
        abort->header.scsi_status = 0;
        abort->abort_context = cm_abort->cm_frame->header.context;
-#if defined(__x86_64__)
-       abort->abort_mfi_addr_lo = cm_abort->cm_frame_busaddr & 0xFFFFFFFF;
-       abort->abort_mfi_addr_hi = (cm_abort->cm_frame_busaddr & 0xFFFFFFFF00000000 ) >> 32  ;
-#else
-       abort->abort_mfi_addr_lo = cm_abort->cm_frame_busaddr;
-       abort->abort_mfi_addr_hi = 0;
-#endif
+       abort->abort_mfi_addr_lo = (uint32_t)cm_abort->cm_frame_busaddr;
+       abort->abort_mfi_addr_hi =
+           (uint32_t)((uint64_t)cm_abort->cm_frame_busaddr >> 32);
        cm->cm_data = NULL;
        cm->cm_flags = MFI_CMD_POLLED;
 
-       sc->mfi_aen_cm->cm_aen_abort = 1;
+       if (sc->mfi_aen_cm)
+               sc->mfi_aen_cm->cm_aen_abort = 1;
        mfi_mapcmd(sc, cm);
        mfi_release_command(cm);
 
        while (i < 5 && sc->mfi_aen_cm != NULL) {
-               lksleep(&sc->mfi_aen_cm, &sc->mfi_io_lock, 0, "mfiabort", 5 * hz);
+               lksleep(&sc->mfi_aen_cm, &sc->mfi_io_lock, 0, "mfiabort",
+                   5 * hz);
                i++;
        }
 
@@ -2098,7 +2405,8 @@ mfi_abort(struct mfi_softc *sc, struct mfi_command *cm_abort)
 }
 
 int
-mfi_dump_blocks(struct mfi_softc *sc, int id, uint64_t lba, void *virt, int len)
+mfi_dump_blocks(struct mfi_softc *sc, int id, uint64_t lba, void *virt,
+    int len)
 {
        struct mfi_command *cm;
        struct mfi_io_frame *io;
@@ -2121,13 +2429,8 @@ mfi_dump_blocks(struct mfi_softc *sc, int id, uint64_t lba, void *virt, int len)
        io->header.scsi_status = 0;
        io->header.sense_len = MFI_SENSE_LEN;
        io->header.data_len = (len + MFI_SECTOR_LEN - 1) / MFI_SECTOR_LEN;
-#if defined(__x86_64__)
-       io->sense_addr_lo = (cm->cm_sense_busaddr & 0xFFFFFFFF);
-       io->sense_addr_hi = (cm->cm_sense_busaddr & 0xFFFFFFFF00000000 ) >> 32;
-#else
-       io->sense_addr_lo = cm->cm_sense_busaddr;
-       io->sense_addr_hi = 0;
-#endif
+       io->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr;
+       io->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
        io->lba_hi = (lba & 0xffffffff00000000) >> 32;
        io->lba_lo = lba & 0xffffffff;
        cm->cm_data = virt;
@@ -2175,13 +2478,8 @@ mfi_dump_syspd_blocks(struct mfi_softc *sc, int id, uint64_t lba, void *virt,
        pass->header.sense_len = MFI_SENSE_LEN;
        pass->header.data_len = len;
        pass->header.cdb_len = 10;
-#if defined(__x86_64__)
-       pass->sense_addr_lo = (cm->cm_sense_busaddr & 0xFFFFFFFF);
-       pass->sense_addr_hi = (cm->cm_sense_busaddr & 0xFFFFFFFF00000000 ) >> 32;
-#else
-       pass->sense_addr_lo = cm->cm_sense_busaddr;
-       pass->sense_addr_hi = 0;
-#endif
+       pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr;
+       pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
        cm->cm_data = virt;
        cm->cm_len = len;
        cm->cm_sg = &pass->sgl;
@@ -2264,7 +2562,10 @@ mfi_config_unlock(struct mfi_softc *sc, int locked)
                lockmgr(&sc->mfi_config_lock, LK_RELEASE);
 }
 
-/* Perform pre-issue checks on commands from userland and possibly veto them. */
+/*
+ * Perform pre-issue checks on commands from userland and possibly veto
+ * them.
+ */
 static int
 mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm)
 {
@@ -2305,16 +2606,14 @@ mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm)
                mbox = (uint16_t *)cm->cm_frame->dcmd.mbox;
                syspd_id = mbox[0];
                if (mbox[2] == MFI_PD_STATE_UNCONFIGURED_GOOD) {
-                       if (!TAILQ_EMPTY(&sc->mfi_syspd_tqh)) {
-                               TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh, pd_link) {
-                                       if (syspd->pd_id == syspd_id)
-                                               break;
-                               }
+                       TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh, pd_link) {
+                               if (syspd->pd_id == syspd_id)
+                                       break;
                        }
                } else {
                        break;
                }
-               if(syspd)
+               if (syspd)
                        error = mfi_syspd_disable(syspd);
                break;
        default:
@@ -2372,22 +2671,153 @@ mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm)
                mbox = (uint16_t *)cm->cm_frame->dcmd.mbox;
                syspd_id = mbox[0];
                if (mbox[2] == MFI_PD_STATE_UNCONFIGURED_GOOD) {
-                       if (!TAILQ_EMPTY(&sc->mfi_syspd_tqh)) {
-                               TAILQ_FOREACH(syspd,&sc->mfi_syspd_tqh,pd_link) {
-                                       if (syspd->pd_id == syspd_id)
-                                               break;
-                               }
+                       TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh, pd_link) {
+                               if (syspd->pd_id == syspd_id)
+                                       break;
                        }
                } else {
                        break;
                }
                /* If the transition fails then enable the syspd again */
-               if(syspd && cm->cm_frame->header.cmd_status != MFI_STAT_OK)
+               if (syspd && cm->cm_frame->header.cmd_status != MFI_STAT_OK)
                        mfi_syspd_enable(syspd);
                break;
        }
 }
 
+static int
+mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm)
+{
+       struct mfi_config_data *conf_data = cm->cm_data;
+       struct mfi_command *ld_cm = NULL;
+       struct mfi_ld_info *ld_info = NULL;
+       int error = 0;
+
+       if ((cm->cm_frame->dcmd.opcode == MFI_DCMD_CFG_ADD) &&
+           (conf_data->ld[0].params.isSSCD == 1)) {
+               error = 1;
+       } else if (cm->cm_frame->dcmd.opcode == MFI_DCMD_LD_DELETE) {
+               error = mfi_dcmd_command(sc, &ld_cm, MFI_DCMD_LD_GET_INFO,
+                   (void **)&ld_info, sizeof(*ld_info));
+               if (error) {
+                       device_printf(sc->mfi_dev, "Failed to allocate"
+                           "MFI_DCMD_LD_GET_INFO %d", error);
+                       if (ld_info)
+                               kfree(ld_info, M_MFIBUF);
+                       return 0;
+               }
+               ld_cm->cm_flags = MFI_CMD_DATAIN;
+               ld_cm->cm_frame->dcmd.mbox[0]= cm->cm_frame->dcmd.mbox[0];
+               ld_cm->cm_frame->header.target_id = cm->cm_frame->dcmd.mbox[0];
+               if (mfi_wait_command(sc, ld_cm) != 0) {
+                       device_printf(sc->mfi_dev, "failed to get log drv\n");
+                       mfi_release_command(ld_cm);
+                       kfree(ld_info, M_MFIBUF);
+                       return 0;
+               }
+
+               if (ld_cm->cm_frame->header.cmd_status != MFI_STAT_OK) {
+                       kfree(ld_info, M_MFIBUF);
+                       mfi_release_command(ld_cm);
+                       return 0;
+               } else {
+                       ld_info = (struct mfi_ld_info *)ld_cm->cm_private;
+               }
+
+               if (ld_info->ld_config.params.isSSCD == 1)
+                       error = 1;
+
+               mfi_release_command(ld_cm);
+               kfree(ld_info, M_MFIBUF);
+       }
+       return error;
+}
+
+static int
+mfi_stp_cmd(struct mfi_softc *sc, struct mfi_command *cm,caddr_t arg)
+{
+       uint8_t i;
+       struct mfi_ioc_packet *ioc;
+       ioc = (struct mfi_ioc_packet *)arg;
+       int sge_size, error;
+       struct megasas_sge *kern_sge;
+
+       memset(sc->kbuff_arr, 0, sizeof(sc->kbuff_arr));
+       kern_sge =(struct megasas_sge *) ((uintptr_t)cm->cm_frame + ioc->mfi_sgl_off);
+       cm->cm_frame->header.sg_count = ioc->mfi_sge_count;
+
+       if (sizeof(bus_addr_t) == 8) {
+               cm->cm_frame->header.flags |= MFI_FRAME_SGL64;
+               cm->cm_extra_frames = 2;
+               sge_size = sizeof(struct mfi_sg64);
+       } else {
+               cm->cm_extra_frames =  (cm->cm_total_frame_size - 1) / MFI_FRAME_SIZE;
+               sge_size = sizeof(struct mfi_sg32);
+       }
+
+       cm->cm_total_frame_size += (sge_size * ioc->mfi_sge_count);
+       for (i = 0; i < ioc->mfi_sge_count; i++) {
+                       if (bus_dma_tag_create( sc->mfi_parent_dmat,    /* parent */
+                       1, 0,                   /* algnmnt, boundary */
+                       BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
+                       BUS_SPACE_MAXADDR,      /* highaddr */
+                       NULL, NULL,             /* filter, filterarg */
+                       ioc->mfi_sgl[i].iov_len,/* maxsize */
+                       2,                      /* nsegments */
+                       ioc->mfi_sgl[i].iov_len,/* maxsegsize */
+                       BUS_DMA_ALLOCNOW,       /* flags */
+                       &sc->mfi_kbuff_arr_dmat[i])) {
+                       device_printf(sc->mfi_dev,
+                           "Cannot allocate mfi_kbuff_arr_dmat tag\n");
+                       return (ENOMEM);
+               }
+
+               if (bus_dmamem_alloc(sc->mfi_kbuff_arr_dmat[i],
+                   (void **)&sc->kbuff_arr[i], BUS_DMA_NOWAIT,
+                   &sc->mfi_kbuff_arr_dmamap[i])) {
+                       device_printf(sc->mfi_dev,
+                           "Cannot allocate mfi_kbuff_arr_dmamap memory\n");
+                       return (ENOMEM);
+               }
+
+               bus_dmamap_load(sc->mfi_kbuff_arr_dmat[i],
+                   sc->mfi_kbuff_arr_dmamap[i], sc->kbuff_arr[i],
+                   ioc->mfi_sgl[i].iov_len, mfi_addr_cb,
+                   &sc->mfi_kbuff_arr_busaddr[i], 0);
+
+               if (!sc->kbuff_arr[i]) {
+                       device_printf(sc->mfi_dev,
+                           "Could not allocate memory for kbuff_arr info\n");
+                       return -1;
+               }
+               kern_sge[i].phys_addr = sc->mfi_kbuff_arr_busaddr[i];
+               kern_sge[i].length = ioc->mfi_sgl[i].iov_len;
+
+               if (sizeof(bus_addr_t) == 8) {
+                       cm->cm_frame->stp.sgl.sg64[i].addr =
+                           kern_sge[i].phys_addr;
+                       cm->cm_frame->stp.sgl.sg64[i].len =
+                           ioc->mfi_sgl[i].iov_len;
+               } else {
+                       cm->cm_frame->stp.sgl.sg32[i].len =
+                           kern_sge[i].phys_addr;
+                       cm->cm_frame->stp.sgl.sg32[i].len =
+                           ioc->mfi_sgl[i].iov_len;
+               }
+
+               error = copyin(ioc->mfi_sgl[i].iov_base,
+                   sc->kbuff_arr[i],
+                   ioc->mfi_sgl[i].iov_len);
+               if (error != 0) {
+                       device_printf(sc->mfi_dev, "Copy in failed\n");
+                       return error;
+               }
+       }
+
+       cm->cm_flags |=MFI_CMD_MAPPED;
+       return 0;
+}
+
 static int
 mfi_user_command(struct mfi_softc *sc, struct mfi_ioc_passthru *ioc)
 {
@@ -2453,59 +2883,7 @@ out:
        return (error);
 }
 
-#ifdef __x86_64__
 #define        PTRIN(p)                ((void *)(uintptr_t)(p))
-#else
-#define        PTRIN(p)                (p)
-#endif
-
-static int
-mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm)
-{
-       struct mfi_config_data *conf_data = cm->cm_data;
-       struct mfi_command *ld_cm = NULL;
-       struct mfi_ld_info *ld_info = NULL;
-       int error = 0;
-
-       if ((cm->cm_frame->dcmd.opcode == MFI_DCMD_CFG_ADD) &&
-           (conf_data->ld[0].params.isSSCD == 1)) {
-               error = 1;
-       } else if (cm->cm_frame->dcmd.opcode == MFI_DCMD_LD_DELETE) {
-               error = mfi_dcmd_command(sc, &ld_cm, MFI_DCMD_LD_GET_INFO,
-                   (void **)&ld_info, sizeof(*ld_info));
-               if (error) {
-                       device_printf(sc->mfi_dev,"Failed to allocate "
-                           "MFI_DCMD_LD_GET_INFO %d", error);
-                       if (ld_info)
-                               kfree(ld_info, M_MFIBUF);
-                       return 0;
-               }
-               ld_cm->cm_flags = MFI_CMD_DATAIN;
-               ld_cm->cm_frame->dcmd.mbox[0]= cm->cm_frame->dcmd.mbox[0];
-               ld_cm->cm_frame->header.target_id = cm->cm_frame->dcmd.mbox[0];
-               if (mfi_wait_command(sc, ld_cm) != 0) {
-                       device_printf(sc->mfi_dev, "failed to get log drv\n");
-                       mfi_release_command(ld_cm);
-                       kfree(ld_info, M_MFIBUF);
-                       return 0;
-               }
-
-               if (ld_cm->cm_frame->header.cmd_status != MFI_STAT_OK) {
-                       kfree(ld_info, M_MFIBUF);
-                       mfi_release_command(ld_cm);
-                       return 0;
-               } else {
-                       ld_info = (struct mfi_ld_info *)ld_cm->cm_private;
-               }
-
-               if (ld_info->ld_config.params.isSSCD == 1)
-                       error = 1;
-
-               mfi_release_command(ld_cm);
-               kfree(ld_info, M_MFIBUF);
-       }
-       return error;
-}
 
 static int
 mfi_ioctl(struct dev_ioctl_args *ap)
@@ -2517,26 +2895,29 @@ mfi_ioctl(struct dev_ioctl_args *ap)
        struct mfi_softc *sc;
        union mfi_statrequest *ms;
        struct mfi_ioc_packet *ioc;
-#ifdef __x86_64__
-       struct mfi_ioc_packet32 *ioc32;
-#endif
        struct mfi_ioc_aen *aen;
        struct mfi_command *cm = NULL;
        uint32_t context;
        union mfi_sense_ptr sense_ptr;
        uint8_t *data = NULL, *temp, *addr, skip_pre_post = 0;
        size_t len;
-       int i;
+       int i, res;
        struct mfi_ioc_passthru *iop = (struct mfi_ioc_passthru *)arg;
-#ifdef __x86_64__
-       struct mfi_ioc_passthru32 *iop32 = (struct mfi_ioc_passthru32 *)arg;
-       struct mfi_ioc_passthru iop_swab;
-#endif
        int error, locked;
+       union mfi_sgl *sgl;
 
        sc = dev->si_drv1;
        error = 0;
 
+       if (sc->adpreset)
+               return EBUSY;
+
+       if (sc->hw_crit_error)
+               return EBUSY;
+
+       if (sc->issuepend_done == 0)
+               return EBUSY;
+
        switch (cmd) {
        case MFIIO_STATS:
                ms = (union mfi_statrequest *)arg;
@@ -2578,9 +2959,6 @@ mfi_ioctl(struct dev_ioctl_args *ap)
                break;
        }
        case MFI_CMD:
-#ifdef __x86_64__
-       case MFI_CMD32:
-#endif
                {
                devclass_t devclass;
                ioc = (struct mfi_ioc_packet *)arg;
@@ -2604,9 +2982,10 @@ mfi_ioctl(struct dev_ioctl_args *ap)
                 * will clobber some data
                 */
                context = cm->cm_frame->header.context;
+               cm->cm_frame->header.context = cm->cm_index;
 
                bcopy(ioc->mfi_frame.raw, cm->cm_frame,
-                   2 * MFI_DCMD_FRAME_SIZE);  /* this isn't quite right */
+                   2 * MEGAMFI_FRAME_SIZE);
                cm->cm_total_frame_size = (sizeof(union mfi_sgl)
                    * ioc->mfi_sge_count) + ioc->mfi_sgl_off;
                cm->cm_frame->header.scsi_status = 0;
@@ -2615,6 +2994,7 @@ mfi_ioctl(struct dev_ioctl_args *ap)
                        cm->cm_sg =
                            (union mfi_sgl *)&cm->cm_frame->bytes[ioc->mfi_sgl_off];
                }
+               sgl = cm->cm_sg;
                cm->cm_flags = 0;
                if (cm->cm_frame->header.flags & MFI_FRAME_DATAIN)
                        cm->cm_flags |= MFI_CMD_DATAIN;
@@ -2625,18 +3005,7 @@ mfi_ioctl(struct dev_ioctl_args *ap)
                        cm->cm_flags |= MFI_CMD_DATAIN | MFI_CMD_DATAOUT;
                cm->cm_len = cm->cm_frame->header.data_len;
                if (cm->cm_frame->header.cmd == MFI_CMD_STP) {
-#ifdef __x86_64__
-                       if (cmd == MFI_CMD) {
-#endif
-                               /* Native */
-                               cm->cm_stp_len = ioc->mfi_sgl[0].iov_len;
-#ifdef __x86_64__
-                       } else {
-                               /* 32bit on 64bit */
-                               ioc32 = (struct mfi_ioc_packet32 *)ioc;
-                               cm->cm_stp_len = ioc32->mfi_sgl[0].iov_len;
-                       }
-#endif
+                       cm->cm_stp_len = ioc->mfi_sgl[0].iov_len;
                        cm->cm_len += cm->cm_stp_len;
                }
                if (cm->cm_len &&
@@ -2650,49 +3019,38 @@ mfi_ioctl(struct dev_ioctl_args *ap)
                /* restore header context */
                cm->cm_frame->header.context = context;
 
-               temp = data;
-               if ((cm->cm_flags & MFI_CMD_DATAOUT) ||
-                   (cm->cm_frame->header.cmd == MFI_CMD_STP)) {
-                       for (i = 0; i < ioc->mfi_sge_count; i++) {
-#ifdef __x86_64__
-                               if (cmd == MFI_CMD) {
-#endif
-                                       /* Native */
+               if (cm->cm_frame->header.cmd == MFI_CMD_STP) {
+                       res = mfi_stp_cmd(sc, cm, arg);
+                       if (res != 0)
+                               goto out;
+               } else {
+                       temp = data;
+                       if ((cm->cm_flags & MFI_CMD_DATAOUT) ||
+                           (cm->cm_frame->header.cmd == MFI_CMD_STP)) {
+                               for (i = 0; i < ioc->mfi_sge_count; i++) {
                                        addr = ioc->mfi_sgl[i].iov_base;
                                        len = ioc->mfi_sgl[i].iov_len;
-#ifdef __x86_64__
-                               } else {
-                                       /* 32bit on 64bit */
-                                       ioc32 = (struct mfi_ioc_packet32 *)ioc;
-                                       addr = PTRIN(ioc32->mfi_sgl[i].iov_base);
-                                       len = ioc32->mfi_sgl[i].iov_len;
+                                       error = copyin(addr, temp, len);
+                                       if (error != 0) {
+                                               device_printf(sc->mfi_dev,
+                                                   "Copy in failed\n");
+                                               goto out;
+                                       }
+                                       temp = &temp[len];
                                }
-#endif
-                               error = copyin(addr, temp, len);
-                               if (error != 0) {
-                                       device_printf(sc->mfi_dev,
-                                           "Copy in failed\n");
-                                       goto out;
-                               }
-                               temp = &temp[len];
                        }
                }
 
                if (cm->cm_frame->header.cmd == MFI_CMD_DCMD)
-                       locked = mfi_config_lock(sc, cm->cm_frame->dcmd.opcode);
+                       locked = mfi_config_lock(sc,
+                            cm->cm_frame->dcmd.opcode);
 
                if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) {
-#if defined(__x86_64__)
                        cm->cm_frame->pass.sense_addr_lo =
-                           (cm->cm_sense_busaddr & 0xFFFFFFFF);
+                           (uint32_t)cm->cm_sense_busaddr;
                        cm->cm_frame->pass.sense_addr_hi =
-                           (cm->cm_sense_busaddr& 0xFFFFFFFF00000000) >> 32;
-#else
-                       cm->cm_frame->pass.sense_addr_lo = cm->cm_sense_busaddr;
-                       cm->cm_frame->pass.sense_addr_hi = 0;
-#endif
+                           (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
                }
-
                lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                skip_pre_post = mfi_check_for_sscd(sc, cm);
                if (!skip_pre_post) {
@@ -2714,31 +3072,21 @@ mfi_ioctl(struct dev_ioctl_args *ap)
                        mfi_check_command_post(sc, cm);
                lockmgr(&sc->mfi_io_lock, LK_RELEASE);
 
-               temp = data;
-               if ((cm->cm_flags & MFI_CMD_DATAIN) ||
-                   (cm->cm_frame->header.cmd == MFI_CMD_STP)) {
-                       for (i = 0; i < ioc->mfi_sge_count; i++) {
-#ifdef __x86_64__
-                               if (cmd == MFI_CMD) {
-#endif
-                                       /* Native */
+               if (cm->cm_frame->header.cmd != MFI_CMD_STP) {
+                       temp = data;
+                       if ((cm->cm_flags & MFI_CMD_DATAIN) ||
+                           (cm->cm_frame->header.cmd == MFI_CMD_STP)) {
+                               for (i = 0; i < ioc->mfi_sge_count; i++) {
                                        addr = ioc->mfi_sgl[i].iov_base;
                                        len = ioc->mfi_sgl[i].iov_len;
-#ifdef __x86_64__
-                               } else {
-                                       /* 32bit on 64bit */
-                                       ioc32 = (struct mfi_ioc_packet32 *)ioc;
-                                       addr = PTRIN(ioc32->mfi_sgl[i].iov_base);
-                                       len = ioc32->mfi_sgl[i].iov_len;
+                                       error = copyout(temp, addr, len);
+                                       if (error != 0) {
+                                               device_printf(sc->mfi_dev,
+                                                   "Copy out failed\n");
+                                               goto out;
+                                       }
+                                       temp = &temp[len];
                                }
-#endif
-                               error = copyout(temp, addr, len);
-                               if (error != 0) {
-                                       device_printf(sc->mfi_dev,
-                                           "Copy out failed\n");
-                                       goto out;
-                               }
-                               temp = &temp[len];
                        }
                }
 
@@ -2747,14 +3095,6 @@ mfi_ioctl(struct dev_ioctl_args *ap)
                        bcopy(&ioc->mfi_frame.raw[ioc->mfi_sense_off],
                            &sense_ptr.sense_ptr_data[0],
                            sizeof(sense_ptr.sense_ptr_data));
-#ifdef __x86_64__
-                       if (cmd != MFI_CMD) {
-                               /*
-                                * not 64bit native so zero out any address
-                                * over 32bit */
-                               sense_ptr.addr.high = 0;
-                       }
-#endif
                        error = copyout(cm->cm_sense, sense_ptr.user_space,
                            ioc->mfi_sense_len);
                        if (error != 0) {
@@ -2769,6 +3109,26 @@ out:
                mfi_config_unlock(sc, locked);
                if (data)
                        kfree(data, M_MFIBUF);
+               if (cm->cm_frame->header.cmd == MFI_CMD_STP) {
+                       for (i = 0; i < 2; i++) {
+                               if (sc->kbuff_arr[i]) {
+                                       if (sc->mfi_kbuff_arr_busaddr != 0)
+                                               bus_dmamap_unload(
+                                                   sc->mfi_kbuff_arr_dmat[i],
+                                                   sc->mfi_kbuff_arr_dmamap[i]
+                                                   );
+                                       if (sc->kbuff_arr[i] != NULL)
+                                               bus_dmamem_free(
+                                                   sc->mfi_kbuff_arr_dmat[i],
+                                                   sc->kbuff_arr[i],
+                                                   sc->mfi_kbuff_arr_dmamap[i]
+                                                   );
+                                       if (sc->mfi_kbuff_arr_dmat[i] != NULL)
+                                               bus_dma_tag_destroy(
+                                                   sc->mfi_kbuff_arr_dmat[i]);
+                               }
+                       }
+               }
                if (cm) {
                        lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
                        mfi_release_command(cm);
@@ -2825,20 +3185,8 @@ out:
                            cmd, arg, flag));
                        break;
                }
-#ifdef __x86_64__
-       case MFIIO_PASSTHRU32:
-               iop_swab.ioc_frame      = iop32->ioc_frame;
-               iop_swab.buf_size       = iop32->buf_size;
-               iop_swab.buf            = PTRIN(iop32->buf);
-               iop                     = &iop_swab;
-               /* FALLTHROUGH */
-#endif
        case MFIIO_PASSTHRU:
                error = mfi_user_command(sc, iop);
-#ifdef __x86_64__
-               if (cmd == MFIIO_PASSTHRU32)
-                       iop32->ioc_frame = iop_swab.ioc_frame;
-#endif
                break;
        default:
                device_printf(sc->mfi_dev, "IOCTL 0x%lx not handled\n", cmd);
@@ -2934,15 +3282,10 @@ mfi_linux_ioctl_int(struct cdev *dev, u_long cmd, caddr_t arg, int flag)
                        locked = mfi_config_lock(sc, cm->cm_frame->dcmd.opcode);
 
                if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) {
-#if defined(__x86_64__)
                        cm->cm_frame->pass.sense_addr_lo =
-                           (cm->cm_sense_busaddr & 0xFFFFFFFF);
+                           (uint32_t)cm->cm_sense_busaddr;
                        cm->cm_frame->pass.sense_addr_hi =
-                           (cm->cm_sense_busaddr & 0xFFFFFFFF00000000) >> 32;
-#else
-                       cm->cm_frame->pass.sense_addr_lo = cm->cm_sense_busaddr;
-                       cm->cm_frame->pass.sense_addr_hi = 0;
-#endif
+                           (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
                }
 
                lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
@@ -3145,8 +3488,8 @@ mfi_dump_all(void)
                TAILQ_FOREACH(cm, &sc->mfi_busy, cm_link) {
                        if (cm->cm_timestamp < deadline) {
                                device_printf(sc->mfi_dev,
-                                   "COMMAND %p TIMEOUT AFTER %d SECONDS\n", cm,
-                                   (int)(time_second - cm->cm_timestamp));
+                                   "COMMAND %p TIMEOUT AFTER %d SECONDS\n",
+                                   cm, (int)(time_second - cm->cm_timestamp));
                                MFI_PRINT_CMD(cm);
                                timedout++;
                        }
@@ -3172,17 +3515,28 @@ mfi_timeout(void *data)
        int timedout = 0;
 
        deadline = time_second - MFI_CMD_TIMEOUT;
+       if (sc->adpreset == 0) {
+               if (!mfi_tbolt_reset(sc)) {
+                       callout_reset(&sc->mfi_watchdog_callout,
+                           MFI_CMD_TIMEOUT * hz, mfi_timeout, sc);
+                       return;
+               }
+       }
        lockmgr(&sc->mfi_io_lock, LK_EXCLUSIVE);
        TAILQ_FOREACH(cm, &sc->mfi_busy, cm_link) {
                if (sc->mfi_aen_cm == cm)
                        continue;
                if ((sc->mfi_aen_cm != cm) && (cm->cm_timestamp < deadline)) {
-                       device_printf(sc->mfi_dev,
-                           "COMMAND %p TIMEOUT AFTER %d SECONDS\n", cm,
-                           (int)(time_second - cm->cm_timestamp));
-                       MFI_PRINT_CMD(cm);
-                       MFI_VALIDATE_CMD(sc, cm);
-                       timedout++;
+                       if (sc->adpreset != 0 && sc->issuepend_done == 0) {
+                               cm->cm_timestamp = time_second;
+                       } else {
+                               device_printf(sc->mfi_dev,
+                                   "COMMAND %p TIMEOUT AFTER %d SECONDS\n",
+                                    cm, (int)(time_second - cm->cm_timestamp));
+                               MFI_PRINT_CMD(cm);
+                               MFI_VALIDATE_CMD(sc, cm);
+                               timedout++;
+                       }
                }
        }
 
index d4fc2c0..b7a8ca2 100644 (file)
  * 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.
- */
-/*-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *            Copyright 1994-2009 The FreeBSD Project.
- *            All rights reserved.
- *
- * 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 FREEBSD PROJECT``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 FREEBSD PROJECT 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.
- *
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as representing
- * official policies,either expressed or implied, of the FreeBSD Project.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi_cam.c,v 1.7 2011/10/13 20:06:19 marius Exp $
+ * FreeBSD projects/head_mfi/ r232949
  */
 
 #include "opt_mfi.h"
@@ -151,6 +122,7 @@ mfip_attach(device_t dev)
                                device_get_unit(dev), &mfisc->mfi_io_lock, 1,
                                MFI_SCSI_MAX_CMDS, sc->devq);
        if (sc->sim == NULL) {
+               cam_simq_release(sc->devq);
                device_printf(dev, "CAM SIM attach failed\n");
                return (EINVAL);
        }
@@ -159,6 +131,7 @@ mfip_attach(device_t dev)
        if (xpt_bus_register(sc->sim, 0) != 0) {
                device_printf(dev, "XPT bus registration failed\n");
                cam_sim_free(sc->sim);
+               cam_simq_release(sc->devq);
                lockmgr(&mfisc->mfi_io_lock, LK_RELEASE);
                return (EINVAL);
        }
@@ -183,6 +156,9 @@ mfip_detach(device_t dev)
                lockmgr(&sc->mfi_sc->mfi_io_lock, LK_RELEASE);
        }
 
+       if (sc->devq != NULL)
+               cam_simq_release(sc->devq);
+
        return (0);
 }
 
index e3b5e74..648f855 100644 (file)
@@ -24,6 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi_debug.c,v 1.3 2006/10/16 04:18:38 scottl Exp $
+ * FreeBSD projects/head_mfi/ r228320
  */
 
 #include "opt_mfi.h"
@@ -58,7 +59,8 @@ mfi_print_frame_flags(device_t dev, uint32_t flags)
            "\2SGL64"
            "\3SENSE64"
            "\4WRITE"
-           "\5READ");
+           "\5READ"
+           "\6IEEESGL");
 }
 
 static void
@@ -68,7 +70,15 @@ mfi_print_sgl(struct mfi_frame_header *hdr, union mfi_sgl *sgl, int count)
 
        kprintf("SG List:\n");
        for (i = 0; i < count; i++) {
-               if (hdr->flags & MFI_FRAME_SGL64) {
+               if (hdr->flags & MFI_FRAME_IEEE_SGL) {
+                       kprintf("0x%lx:%06d ", (u_long)sgl->sg_skinny[i].addr,
+                           sgl->sg_skinny[i].len);
+                       columns += 26;
+                       if (columns > 77) {
+                               kprintf("\n");
+                               columns = 0;
+                       }
+               } else if (hdr->flags & MFI_FRAME_SGL64) {
                        kprintf("0x%lx:%06d ", (u_long)sgl->sg64[i].addr,
                            sgl->sg64[i].len);
                        columns += 26;
@@ -235,7 +245,12 @@ mfi_validate_sg(struct mfi_softc *sc, struct mfi_command *cm,
        hdr = &cm->cm_frame->header;
        count = 0;
        for (i = 0; i < hdr->sg_count; i++) {
-               count += cm->cm_sg->sg32[i].len;
+               if (hdr->flags & MFI_FRAME_IEEE_SGL)
+                       count += cm->cm_sg->sg_skinny[i].len;
+               else if (hdr->flags & MFI_FRAME_SGL64)
+                       count += cm->cm_sg->sg64[i].len;
+               else
+                       count += cm->cm_sg->sg32[i].len;
        }
        /*
        count++;
index 53534b1..eeef124 100644 (file)
  * 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.
- */
-/*-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *            Copyright 1994-2009 The FreeBSD Project.
- *            All rights reserved.
- *
- * 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 FREEBSD PROJECT``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 FREEBSD PROJECT 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.
- *
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as representing
- * official policies,either expressed or implied, of the FreeBSD Project.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi_disk.c,v 1.8 2008/11/17 23:30:19 jhb Exp $
+ * FreeBSD projects/head_mfi/ r232888
  */
 
 #include "opt_mfi.h"
@@ -281,7 +252,7 @@ mfi_disk_strategy(struct dev_strategy_args *ap)
        struct bio *bio = ap->a_bio;
        struct buf *bp = bio->bio_buf;
        struct mfi_disk *sc = ap->a_head.a_dev->si_drv1;
-       struct mfi_softc *controller;
+       struct mfi_softc *controller = sc->ld_controller;
 
        if (sc == NULL) {
                bp->b_error = EINVAL;
@@ -291,6 +262,16 @@ mfi_disk_strategy(struct dev_strategy_args *ap)
                return (0);
        }
 
+       if (controller->hw_crit_error) {
+               bp->b_error = EBUSY;
+               return (0);
+       }
+
+       if (controller->issuepend_done == 0) {
+               bp->b_error = EBUSY;
+               return (0);
+       }
+
        /*
         * XXX swildner
         *
@@ -310,7 +291,6 @@ mfi_disk_strategy(struct dev_strategy_args *ap)
                return (0);
        }
 
-       controller = sc->ld_controller;
        bio->bio_driver_info = sc;
        lockmgr(&controller->mfi_io_lock, LK_EXCLUSIVE);
        mfi_enqueue_bio(controller, bio);
index 8450495..15eea40 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi_ioctl.h,v 1.9 2009/08/13 23:18:45 scottl Exp $
+ * FreeBSD projects/head_mfi/ r227612
  */
 
 #include <sys/conf.h>
 
+#include <sys/bus_dma.h>
+
 #include <dev/raid/mfi/mfireg.h>
 
-#if defined(__x86_64__) /* Assume amd64 wants 32 bit Linux */
 struct iovec32 {
        u_int32_t       iov_base;
        int             iov_len;
 };
-#endif
+
+struct megasas_sge
+{
+       bus_addr_t phys_addr;
+       uint32_t length;
+};
 
 #define MFIQ_FREE      0
 #define MFIQ_BIO       1
@@ -80,23 +87,6 @@ struct mfi_ioc_packet {
        struct iovec mfi_sgl[MAX_IOCTL_SGE];
 } __packed;
 
-#ifdef __x86_64__
-struct mfi_ioc_packet32 {
-       uint16_t        mfi_adapter_no;
-       uint16_t        mfi_pad1;
-       uint32_t        mfi_sgl_off;
-       uint32_t        mfi_sge_count;
-       uint32_t        mfi_sense_off;
-       uint32_t        mfi_sense_len;
-       union {
-               uint8_t raw[128];
-               struct mfi_frame_header hdr;
-       } mfi_frame;
-
-       struct iovec32 mfi_sgl[MAX_IOCTL_SGE];
-} __packed;
-#endif
-
 struct mfi_ioc_aen {
        uint16_t        aen_adapter_no;
        uint16_t        aen_pad1;
@@ -105,9 +95,6 @@ struct mfi_ioc_aen {
 } __packed;
 
 #define MFI_CMD                _IOWR('M', 1, struct mfi_ioc_packet)
-#ifdef __x86_64__
-#define MFI_CMD32      _IOWR('M', 1, struct mfi_ioc_packet32)
-#endif
 #define MFI_SET_AEN    _IOW('M', 3, struct mfi_ioc_aen)
 
 #define MAX_LINUX_IOCTL_SGE    16
@@ -137,19 +124,8 @@ struct mfi_ioc_passthru {
        uint8_t                 *buf;
 } __packed;
 
-#ifdef __x86_64__
-struct mfi_ioc_passthru32 {
-       struct mfi_dcmd_frame   ioc_frame;
-       uint32_t                buf_size;
-       uint32_t                buf;
-} __packed;
-#endif
-
 #define MFIIO_STATS    _IOWR('Q', 101, union mfi_statrequest)
 #define MFIIO_PASSTHRU _IOWR('C', 102, struct mfi_ioc_passthru)
-#ifdef __x86_64__
-#define MFIIO_PASSTHRU32       _IOWR('C', 102, struct mfi_ioc_passthru32)
-#endif
 
 struct mfi_linux_ioc_aen {
        uint16_t        laen_adapter_no;
index cb3163d..629537e 100644 (file)
  * 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.
- */
-/*-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *            Copyright 1994-2009 The FreeBSD Project.
- *            All rights reserved.
- *
- * 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 FREEBSD PROJECT``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 FREEBSD PROJECT 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.
- *
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as representing
- * official policies,either expressed or implied, of the FreeBSD Project.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi_pci.c,v 1.16 2010/03/02 17:34:11 kib Exp $
+ * FreeBSD projects/head_mfi/ r232888
  */
 
 /* PCI/PCI-X/PCIe bus interface for the LSI MegaSAS controllers */
@@ -96,7 +67,6 @@
 #include <sys/malloc.h>
 #include <sys/uio.h>
 #include <sys/eventhandler.h>
-
 #include <sys/rman.h>
 
 #include <bus/pci/pcireg.h>
@@ -134,6 +104,9 @@ static devclass_t   mfi_devclass;
 DRIVER_MODULE(mfi, pci, mfi_pci_driver, mfi_devclass, NULL, NULL);
 MODULE_VERSION(mfi, 1);
 
+static int     mfi_msi_enable = 1;
+TUNABLE_INT("hw.mfi.msi.enable", &mfi_msi_enable);
+
 struct mfi_ident {
        uint16_t        vendor;
        uint16_t        device;
@@ -142,6 +115,17 @@ struct mfi_ident {
        int             flags;
        const char      *desc;
 } mfi_identifiers[] = {
+       {0x1000, 0x005b, 0x1028, 0x1f2d, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H810 Adapter"},
+       {0x1000, 0x005b, 0x1028, 0x1f30, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710 Embedded"},
+       {0x1000, 0x005b, 0x1028, 0x1f31, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710P Adapter"},
+       {0x1000, 0x005b, 0x1028, 0x1f33, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710P Mini (blades)"},
+       {0x1000, 0x005b, 0x1028, 0x1f34, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710P Mini (monolithics)"},
+       {0x1000, 0x005b, 0x1028, 0x1f35, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710 Adapter"},
+       {0x1000, 0x005b, 0x1028, 0x1f37, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710 Mini (blades)"},
+       {0x1000, 0x005b, 0x1028, 0x1f38, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710 Mini (monolithics)"},
+       {0x1000, 0x005b, 0x8086, 0x9265, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Intel (R) RAID Controller RS25DB080"},
+       {0x1000, 0x005b, 0x8086, 0x9285, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Intel (R) RAID Controller RS25NB008"},
+       {0x1000, 0x005b, 0xffff, 0xffff, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "ThunderBolt"},
        {0x1000, 0x0060, 0x1028, 0xffff, MFI_FLAGS_1078,  "Dell PERC 6"},
        {0x1000, 0x0060, 0xffff, 0xffff, MFI_FLAGS_1078,  "LSI MegaSAS 1078"},
        {0x1000, 0x0071, 0xffff, 0xffff, MFI_FLAGS_SKINNY, "Drake Skinny"},
@@ -200,6 +184,7 @@ mfi_pci_attach(device_t dev)
        struct mfi_ident *m;
        uint32_t command;
        int error;
+       u_int irq_flags;
 
        sc = device_get_softc(dev);
        bzero(sc, sizeof(*sc));
@@ -227,7 +212,8 @@ mfi_pci_attach(device_t dev)
                /* 1068/1078: Memory mapped BAR is at offset 0x10 */
                sc->mfi_regs_rid = PCIR_BAR(0);
        } else if ((sc->mfi_flags & MFI_FLAGS_GEN2) ||
-                  (sc->mfi_flags & MFI_FLAGS_SKINNY)) {
+                  (sc->mfi_flags & MFI_FLAGS_SKINNY) ||
+                  (sc->mfi_flags & MFI_FLAGS_TBOLT)) {
                /* GEN2/Skinny: Memory mapped BAR is at offset 0x14 */
                sc->mfi_regs_rid = PCIR_BAR(1);
        }
@@ -256,6 +242,16 @@ mfi_pci_attach(device_t dev)
                goto out;
        }
 
+       /* Allocate IRQ resource. */
+       sc->mfi_irq_rid = 0;
+       sc->mfi_irq_type = pci_alloc_1intr(sc->mfi_dev, mfi_msi_enable,
+           &sc->mfi_irq_rid, &irq_flags);
+       if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ,
+           &sc->mfi_irq_rid, irq_flags)) == NULL) {
+               device_printf(sc->mfi_dev, "Cannot allocate interrupt\n");
+               return (EINVAL);
+       }
+
        error = mfi_attach(sc);
 out:
        if (error) {
@@ -270,9 +266,8 @@ static int
 mfi_pci_detach(device_t dev)
 {
        struct mfi_softc *sc;
-       struct mfi_disk *ld;
-       struct mfi_system_pd *syspd = NULL;
-       int error;
+       device_t *devlist;
+       int error, devcount, i;
 
        sc = device_get_softc(dev);
 
@@ -286,20 +281,13 @@ mfi_pci_detach(device_t dev)
        sc->mfi_detaching = 1;
        lockmgr(&sc->mfi_io_lock, LK_RELEASE);
 
-       while ((ld = TAILQ_FIRST(&sc->mfi_ld_tqh)) != NULL) {
-               if ((error = device_delete_child(dev, ld->ld_dev)) != 0) {
-                       sc->mfi_detaching = 0;
-                       lockmgr(&sc->mfi_config_lock, LK_RELEASE);
-                       return (error);
-               }
-       }
-       while ((syspd = TAILQ_FIRST(&sc->mfi_syspd_tqh)) != NULL) {
-               if ((error = device_delete_child(dev,syspd->pd_dev)) != 0) {
-                       sc->mfi_detaching = 0;
-                       lockmgr(&sc->mfi_config_lock, LK_RELEASE);
-                       return (error);
-               }
+       if ((error = device_get_children(sc->mfi_dev, &devlist, &devcount)) != 0) {
+               lockmgr(&sc->mfi_config_lock, LK_RELEASE);
+               return error;
        }
+       for (i = 0; i < devcount; i++)
+               device_delete_child(sc->mfi_dev, devlist[i]);
+       kfree(devlist, M_TEMP);
        lockmgr(&sc->mfi_config_lock, LK_RELEASE);
 
        EVENTHANDLER_DEREGISTER(shutdown_final, sc->mfi_eh);
@@ -318,8 +306,8 @@ mfi_pci_free(struct mfi_softc *sc)
                bus_release_resource(sc->mfi_dev, SYS_RES_MEMORY,
                    sc->mfi_regs_rid, sc->mfi_regs_resource);
        }
-
-       return;
+       if (sc->mfi_irq_type == PCI_INTR_TYPE_MSI)
+               pci_release_msi(sc->mfi_dev);
 }
 
 static int
index b929de1..f56a803 100644 (file)
@@ -29,6 +29,7 @@
  * official policies,either expressed or implied, of the FreeBSD Project.
  *
  * $FreeBSD: src/sys/dev/mfi/mfi_pddisk.c,v 1.2.2.6 2007/08/24 17:29:18 jhb Exp $
+ * FreeBSD projects/head_mfi/ r232888
  */
 
 #include "opt_mfi.h"
@@ -212,7 +213,8 @@ mfi_syspd_disable(struct mfi_system_pd *sc)
        if (sc->pd_flags & MFI_DISK_FLAGS_OPEN) {
                if (sc->pd_controller->mfi_delete_busy_volumes)
                        return (0);
-               device_printf(sc->pd_dev, "Unable to delete busy syspd device\n");
+               device_printf(sc->pd_dev,
+                   "Unable to delete busy syspd device\n");
                return (EBUSY);
        }
        sc->pd_flags |= MFI_DISK_FLAGS_DISABLED;
@@ -233,7 +235,7 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
        struct bio *bio = ap->a_bio;
        struct buf *bp = bio->bio_buf;
        struct mfi_system_pd *sc = ap->a_head.a_dev->si_drv1;
-       struct mfi_softc *controller;
+       struct mfi_softc *controller = sc->pd_controller;
 
        if (sc == NULL) {
                bp->b_error = EINVAL;
@@ -243,6 +245,16 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
                return (0);
        }
 
+       if (controller->hw_crit_error) {
+               bp->b_error = EBUSY;
+               return (0);
+       }
+
+       if (controller->issuepend_done == 0) {
+               bp->b_error = EBUSY;
+               return (0);
+       }
+
        /*
         * XXX swildner
         *
@@ -262,7 +274,6 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
                return (0);
        }
 
-       controller = sc->pd_controller;
        bio->bio_driver_info = sc;
        lockmgr(&controller->mfi_io_lock, LK_EXCLUSIVE);
        mfi_enqueue_bio(controller, bio);
@@ -272,26 +283,6 @@ mfi_syspd_strategy(struct dev_strategy_args *ap)
        return (0);
 }
 
-#if 0
-void
-mfi_disk_complete(struct bio *bio)
-{
-       struct mfi_system_pd *sc = bio->bio_driver_info;
-       struct buf *bp = bio->bio_buf;
-
-       devstat_end_transaction_buf(&sc->pd_devstat, bp);
-       if (bio->b_flags & B_ERROR) {
-               if (bp->b_error == 0)
-                       bp->b_error = EIO;
-               diskerr(bio, sc->pd_disk.d_cdev, "hard error", -1, 1);
-               kprintf("\n");
-       } else {
-               bp->b_resid = 0;
-       }
-       biodone(bio);
-}
-#endif
-
 static int
 mfi_syspd_dump(struct dev_dump_args *ap)
 {
@@ -307,8 +298,8 @@ mfi_syspd_dump(struct dev_dump_args *ap)
        parent_sc = sc->pd_controller;
 
        if (len > 0) {
-               if ((error = mfi_dump_syspd_blocks(parent_sc, sc->pd_id, offset /
-                   MFI_SECTOR_LEN, virt, len)) != 0)
+               if ((error = mfi_dump_syspd_blocks(parent_sc,
+                   sc->pd_id, offset / MFI_SECTOR_LEN, virt, len)) != 0)
                        return (error);
        } else {
                /* mfi_sync_cache(parent_sc, sc->ld_id); */
diff --git a/sys/dev/raid/mfi/mfi_tbolt.c b/sys/dev/raid/mfi/mfi_tbolt.c
new file mode 100644 (file)
index 0000000..b1e317b
--- /dev/null
@@ -0,0 +1,1340 @@
+/*-
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *            Copyright 1994-2009 The FreeBSD Project.
+ *            All rights reserved.
+ *
+ * 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 FREEBSD PROJECT``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 FREEBSD PROJECT 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.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * official policies,either expressed or implied, of the FreeBSD Project.
+ *
+ * $FreeBSD: src/sys/dev/mfi/mfi_tbolt.c,v 1.00 2010/06/30 16:00:00 Bharat Gusain Exp