Author: slm
Date: Thu May 28 18:24:22 2015
New Revision: 283661
URL: https://svnweb.freebsd.org/changeset/base/283661

Log:
  The wrong commit message was given with r283632.  This is the correct message.
  
  - Updated all files with 2015 Avago copyright, and updated LSI's copyright
    dates.
  
  - Changed all of the PCI device strings from LSI to Avago Technologies (LSI).
  
  - Added a sysctl variable to control how StartStopUnit behavior works. User 
can
    select to spin down disks based on if disk is SSD or HDD.
  
  - Inquiry data is required to tell if a disk will support SSU at shutdown or
    not. Due to the addition of mpssas_async, which gets Advanced Info but not
    Inquiry data, the setting of supports_SSU was moved to the
    mpssas_scsiio_complete function, which snoops for any Inquiry commands. And,
    since disks are shutdown as a target and not a LUN, this process was
    simplified by basing it on targets and not LUNs.
  
  - Added a sysctl variable that sets the amount of time to retry after sending 
a
    failed SATA ID command. This helps with some bad disks and large disks that
    require a lot of time to spin up. Part of this change was to add a callout 
to
    handle timeouts with the SATA ID command. The callout function is called
    mpssas_ata_id_timeout(). (Fixes PR 191348)
  
  - Changed the way resets work by allowing I/O to continue to devices that are
    not currently under a reset condition. This uses devq's instead of simq's 
and
    makes use of the MPSSAS_TARGET_INRESET flag. This change also adds a 
function
    called mpssas_prepare_tm().
  
  - Some changes were made to reduce code duplication when getting a SAS address
    for a SATA disk.
  
  - Fixed some formatting and whitespace.
  
  - Bump version of mps driver to 9.255.01.00-fbsd
  
  PR:           191348
  Reviewed by:  ken, scottl
  Approved by:  ken, scottl
  MFC after:    1 week

Modified:
  head/sys/dev/mpr/mpi/mpi2.h
  head/sys/dev/mpr/mpi/mpi2_cnfg.h
  head/sys/dev/mpr/mpi/mpi2_hbd.h
  head/sys/dev/mpr/mpi/mpi2_history.txt
  head/sys/dev/mpr/mpi/mpi2_init.h
  head/sys/dev/mpr/mpi/mpi2_ioc.h
  head/sys/dev/mpr/mpi/mpi2_ra.h
  head/sys/dev/mpr/mpi/mpi2_raid.h
  head/sys/dev/mpr/mpi/mpi2_sas.h
  head/sys/dev/mpr/mpi/mpi2_targ.h
  head/sys/dev/mpr/mpi/mpi2_tool.h
  head/sys/dev/mpr/mpi/mpi2_type.h
  head/sys/dev/mpr/mpr.c
  head/sys/dev/mpr/mpr_config.c
  head/sys/dev/mpr/mpr_ioctl.h
  head/sys/dev/mpr/mpr_mapping.c
  head/sys/dev/mpr/mpr_mapping.h
  head/sys/dev/mpr/mpr_pci.c
  head/sys/dev/mpr/mpr_sas.c
  head/sys/dev/mpr/mpr_sas.h
  head/sys/dev/mpr/mpr_sas_lsi.c
  head/sys/dev/mpr/mpr_user.c
  head/sys/dev/mpr/mprvar.h

Modified: head/sys/dev/mpr/mpi/mpi2.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2.h Thu May 28 18:14:55 2015        (r283660)
+++ head/sys/dev/mpr/mpi/mpi2.h Thu May 28 18:24:22 2015        (r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2013 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2.h

Modified: head/sys/dev/mpr/mpi/mpi2_cnfg.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_cnfg.h    Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_cnfg.h    Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2013 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_cnfg.h

Modified: head/sys/dev/mpr/mpi/mpi2_hbd.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_hbd.h     Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_hbd.h     Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2009-2011 LSI Corporation.
+ *  Copyright (c) 2009-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_hbd.h

Modified: head/sys/dev/mpr/mpi/mpi2_history.txt
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_history.txt       Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_history.txt       Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,7 +27,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
@@ -35,7 +36,8 @@
  Fusion-MPT MPI 2.0 / 2.5 Header File Change History
  ==============================
 
- Copyright (c) 2000-2013 LSI Corporation.
+ Copyright (c) 2000-2015 LSI Corporation.
+ Copyright (c) 2013-2015 Avago Technologies
 
  ---------------------------------------
  Header Set Release Version:    02.00.33

Modified: head/sys/dev/mpr/mpi/mpi2_init.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_init.h    Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_init.h    Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2013 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_init.h

Modified: head/sys/dev/mpr/mpi/mpi2_ioc.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_ioc.h     Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_ioc.h     Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2013 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_ioc.h

Modified: head/sys/dev/mpr/mpi/mpi2_ra.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_ra.h      Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_ra.h      Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2009 LSI Corporation.
+ *  Copyright (c) 2012-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_ra.h

Modified: head/sys/dev/mpr/mpi/mpi2_raid.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_raid.h    Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_raid.h    Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2013 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_raid.h

Modified: head/sys/dev/mpr/mpi/mpi2_sas.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_sas.h     Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_sas.h     Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2013 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_sas.h

Modified: head/sys/dev/mpr/mpi/mpi2_targ.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_targ.h    Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_targ.h    Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2012 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_targ.h

Modified: head/sys/dev/mpr/mpi/mpi2_tool.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_tool.h    Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_tool.h    Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2013 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_tool.h

Modified: head/sys/dev/mpr/mpi/mpi2_type.h
==============================================================================
--- head/sys/dev/mpr/mpi/mpi2_type.h    Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpi/mpi2_type.h    Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2013 LSI Corp.
+ * Copyright (c) 2012-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +27,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
 
 /*
- *  Copyright (c) 2000-2007 LSI Corporation.
+ *  Copyright (c) 2000-2015 LSI Corporation.
+ *  Copyright (c) 2013-2015 Avago Technologies
  *
  *
  *           Name:  mpi2_type.h

Modified: head/sys/dev/mpr/mpr.c
==============================================================================
--- head/sys/dev/mpr/mpr.c      Thu May 28 18:14:55 2015        (r283660)
+++ head/sys/dev/mpr/mpr.c      Thu May 28 18:24:22 2015        (r283661)
@@ -1,6 +1,7 @@
 /*-
  * Copyright (c) 2009 Yahoo! Inc.
- * Copyright (c) 2012-2014 LSI Corp.
+ * Copyright (c) 2011-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -24,12 +25,14 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ *
  */
 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-/* Communications core for LSI MPT2 */
+/* Communications core for Avago Technologies (LSI) MPT3 */
 
 /* TODO Move headers to mprvar */
 #include <sys/types.h>
@@ -72,7 +75,6 @@ __FBSDID("$FreeBSD$");
 #include <dev/mpr/mpr_ioctl.h>
 #include <dev/mpr/mprvar.h>
 #include <dev/mpr/mpr_table.h>
-#include <dev/mpr/mpr_sas.h>
 
 static int mpr_diag_reset(struct mpr_softc *sc, int sleep_flag);
 static int mpr_init_queues(struct mpr_softc *sc);
@@ -352,11 +354,9 @@ mpr_transition_operational(struct mpr_so
 static int
 mpr_iocfacts_allocate(struct mpr_softc *sc, uint8_t attaching)
 {
-       int error, i;
+       int error;
        Mpi2IOCFactsReply_t saved_facts;
        uint8_t saved_mode, reallocating;
-       struct mprsas_lun *lun, *lun_tmp;
-       struct mprsas_target *targ;
 
        mpr_dprint(sc, MPR_TRACE, "%s\n", __func__);
 
@@ -513,27 +513,7 @@ mpr_iocfacts_allocate(struct mpr_softc *
         */
        if (reallocating) {
                mpr_iocfacts_free(sc);
-
-               /*
-                * The number of targets is based on IOC Facts, so free all of
-                * the allocated LUNs for each target and then the target buffer
-                * itself.
-                */
-               for (i=0; i< saved_facts.MaxTargets; i++) {
-                       targ = &sc->sassc->targets[i];
-                       SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link,
-                           lun_tmp) {
-                               free(lun, M_MPR);
-                       }
-               }
-               free(sc->sassc->targets, M_MPR);
-
-               sc->sassc->targets = malloc(sizeof(struct mprsas_target) *
-                   sc->facts->MaxTargets, M_MPR, M_WAITOK|M_ZERO);
-               if (!sc->sassc->targets) {
-                       panic("%s failed to alloc targets with error %d\n",
-                           __func__, ENOMEM);
-               }
+               mprsas_realloc_targets(sc, saved_facts.MaxTargets);
        }
 
        /*
@@ -775,7 +755,7 @@ mpr_reinit(struct mpr_softc *sc)
        /* the end of discovery will release the simq, so we're done. */
        mpr_dprint(sc, MPR_INFO, "%s finished sc %p post %u free %u\n", 
            __func__, sc, sc->replypostindex, sc->replyfreeindex);
-       mprsas_release_simq_reinit(sassc);      
+       mprsas_release_simq_reinit(sassc);
 
        return 0;
 }
@@ -816,7 +796,8 @@ mpr_wait_db_ack(struct mpr_softc *sc, in
                 * 0.5 milisecond
                 */
                if (mtx_owned(&sc->mpr_mtx) && sleep_flag == CAN_SLEEP)
-                       msleep(&sc->msleep_fake_chan, &sc->mpr_mtx, 0, 
"mprdba",                            hz/1000);
+                       msleep(&sc->msleep_fake_chan, &sc->mpr_mtx, 0, "mprdba",
+                           hz/1000);
                else if (sleep_flag == CAN_SLEEP)
                        pause("mprdba", hz/1000);
                else
@@ -982,7 +963,7 @@ mpr_enqueue_request(struct mpr_softc *sc
        reply_descriptor rd;
 
        MPR_FUNCTRACE(sc);
-       mpr_dprint(sc, MPR_TRACE, "%s SMID %u cm %p ccb %p\n", __func__,
+       mpr_dprint(sc, MPR_TRACE, "SMID %u cm %p ccb %p\n",
            cm->cm_desc.Default.SMID, cm, cm->cm_ccb);
 
        if (sc->mpr_flags & MPR_FLAGS_ATTACH_DONE && !(sc->mpr_flags &
@@ -1372,6 +1353,8 @@ mpr_get_tunables(struct mpr_softc *sc)
        sc->disable_msix = 0;
        sc->disable_msi = 0;
        sc->max_chains = MPR_CHAIN_FRAMES;
+       sc->enable_ssu = MPR_SSU_ENABLE_SSD_DISABLE_HDD;
+       sc->spinup_wait_time = DEFAULT_SPINUP_WAIT;
 
        /*
         * Grab the global variables.
@@ -1380,6 +1363,8 @@ mpr_get_tunables(struct mpr_softc *sc)
        TUNABLE_INT_FETCH("hw.mpr.disable_msix", &sc->disable_msix);
        TUNABLE_INT_FETCH("hw.mpr.disable_msi", &sc->disable_msi);
        TUNABLE_INT_FETCH("hw.mpr.max_chains", &sc->max_chains);
+       TUNABLE_INT_FETCH("hw.mpr.enable_ssu", &sc->enable_ssu);
+       TUNABLE_INT_FETCH("hw.mpr.spinup_wait_time", &sc->spinup_wait_time);
 
        /* Grab the unit-instance variables */
        snprintf(tmpstr, sizeof(tmpstr), "dev.mpr.%d.debug_level",
@@ -1402,6 +1387,14 @@ mpr_get_tunables(struct mpr_softc *sc)
        snprintf(tmpstr, sizeof(tmpstr), "dev.mpr.%d.exclude_ids",
            device_get_unit(sc->mpr_dev));
        TUNABLE_STR_FETCH(tmpstr, sc->exclude_ids, sizeof(sc->exclude_ids));
+
+       snprintf(tmpstr, sizeof(tmpstr), "dev.mpr.%d.enable_ssu",
+           device_get_unit(sc->mpr_dev));
+       TUNABLE_INT_FETCH(tmpstr, &sc->enable_ssu);
+
+       snprintf(tmpstr, sizeof(tmpstr), "dev.mpr.%d.spinup_wait_time",
+           device_get_unit(sc->mpr_dev));
+       TUNABLE_INT_FETCH(tmpstr, &sc->spinup_wait_time);
 }
 
 static void
@@ -1474,11 +1467,20 @@ mpr_setup_sysctl(struct mpr_softc *sc)
            OID_AUTO, "max_chains", CTLFLAG_RD,
            &sc->max_chains, 0,"maximum chain frames that will be allocated");
 
+       SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
+           OID_AUTO, "enable_ssu", CTLFLAG_RW, &sc->enable_ssu, 0,
+           "enable SSU to SATA SSD/HDD at shutdown");
+
 #if __FreeBSD_version >= 900030
        SYSCTL_ADD_UQUAD(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
            OID_AUTO, "chain_alloc_fail", CTLFLAG_RD,
            &sc->chain_alloc_fail, "chain allocation failures");
 #endif //FreeBSD_version >= 900030
+
+       SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
+           OID_AUTO, "spinup_wait_time", CTLFLAG_RD,
+           &sc->spinup_wait_time, DEFAULT_SPINUP_WAIT, "seconds to wait for "
+           "spinup after SATA ID error");
 }
 
 int
@@ -2096,7 +2098,7 @@ mpr_update_events(struct mpr_softc *sc, 
            (reply->IOCStatus & MPI2_IOCSTATUS_MASK) != MPI2_IOCSTATUS_SUCCESS)
                error = ENXIO;
        
-       if(reply)
+       if (reply)
                mpr_print_event(sc, reply);
 
        mpr_dprint(sc, MPR_TRACE, "%s finished error %d\n", __func__, error);
@@ -2163,8 +2165,8 @@ mpr_deregister_events(struct mpr_softc *
  * Add a chain element as the next SGE for the specified command.
  * Reset cm_sge and cm_sgesize to indicate all the available space. Chains are
  * only required for IEEE commands.  Therefore there is no code for commands
- * that have the MPR_CM_FLAGS_SGE_SIMPLE flag set (and those commands shouldn't
- * be requesting chains).
+ * that have the MPR_CM_FLAGS_SGE_SIMPLE flag set (and those commands
+ * shouldn't be requesting chains).
  */
 static int
 mpr_add_chain(struct mpr_command *cm, int segsleft)
@@ -2246,9 +2248,9 @@ mpr_add_chain(struct mpr_command *cm, in
 
 /*
  * Add one scatter-gather element to the scatter-gather list for a command.
- * Maintain cm_sglsize and cm_sge as the remaining size and pointer to the next
- * SGE to fill in, respectively.  In Gen3, the MPI SGL does not have a chain,
- * so don't consider any chain additions.
+ * Maintain cm_sglsize and cm_sge as the remaining size and pointer to the
+ * next SGE to fill in, respectively.  In Gen3, the MPI SGL does not have a
+ * chain, so don't consider any chain additions.
  */
 int
 mpr_push_sge(struct mpr_command *cm, MPI2_SGE_SIMPLE64 *sge, size_t len,
@@ -2660,7 +2662,7 @@ mpr_request_polled(struct mpr_softc *sc,
                }
        }
 
-       if(error) {
+       if (error) {
                mpr_dprint(sc, MPR_FAULT, "Calling Reinit from %s\n", __func__);
                rc = mpr_reinit(sc);
                mpr_dprint(sc, MPR_FAULT, "Reinit %s\n", (rc == 0) ?
@@ -2717,9 +2719,12 @@ mpr_read_config_page(struct mpr_softc *s
 
        cm->cm_data = params->buffer;
        cm->cm_length = params->length;
-       cm->cm_sge = &req->PageBufferSGE;
-       cm->cm_sglsize = sizeof(MPI2_SGE_IO_UNION);
-       cm->cm_flags = MPR_CM_FLAGS_SGE_SIMPLE | MPR_CM_FLAGS_DATAIN;
+       if (cm->cm_data != NULL) {
+               cm->cm_sge = &req->PageBufferSGE;
+               cm->cm_sglsize = sizeof(MPI2_SGE_IO_UNION);
+               cm->cm_flags = MPR_CM_FLAGS_SGE_SIMPLE | MPR_CM_FLAGS_DATAIN;
+       } else
+               cm->cm_sge = NULL;
        cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
 
        cm->cm_complete_data = params;
@@ -2776,9 +2781,12 @@ mpr_config_complete(struct mpr_softc *sc
                goto done;
        }
        params->status = reply->IOCStatus;
-       if (params->hdr.Ext.ExtPageType != 0) {
+       if (params->hdr.Struct.PageType == MPI2_CONFIG_PAGETYPE_EXTENDED) {
                params->hdr.Ext.ExtPageType = reply->ExtPageType;
                params->hdr.Ext.ExtPageLength = reply->ExtPageLength;
+               params->hdr.Ext.PageType = reply->Header.PageType;
+               params->hdr.Ext.PageNumber = reply->Header.PageNumber;
+               params->hdr.Ext.PageVersion = reply->Header.PageVersion;
        } else {
                params->hdr.Struct.PageType = reply->Header.PageType;
                params->hdr.Struct.PageNumber = reply->Header.PageNumber;

Modified: head/sys/dev/mpr/mpr_config.c
==============================================================================
--- head/sys/dev/mpr/mpr_config.c       Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpr_config.c       Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2011-2014 LSI Corp.
+ * Copyright (c) 2011-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -23,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  */
 
 #include <sys/cdefs.h>

Modified: head/sys/dev/mpr/mpr_ioctl.h
==============================================================================
--- head/sys/dev/mpr/mpr_ioctl.h        Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpr_ioctl.h        Thu May 28 18:24:22 2015        
(r283661)
@@ -27,12 +27,13 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD userland interface
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD userland interface
  *
  * $FreeBSD$
  */
 /*-
- * Copyright (c) 2011-2014 LSI Corp.
+ * Copyright (c) 2011-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,7 +57,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */

Modified: head/sys/dev/mpr/mpr_mapping.c
==============================================================================
--- head/sys/dev/mpr/mpr_mapping.c      Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpr_mapping.c      Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2011-2014 LSI Corp.
+ * Copyright (c) 2011-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -23,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  */
 
 #include <sys/cdefs.h>
@@ -326,11 +327,13 @@ _mapping_get_high_missing_mt_idx(struct 
 {
        u32 map_idx, high_idx = MPR_ENCTABLE_BAD_IDX;
        u8 high_missing_count = 0;
-       u32 start_idx, end_idx, start_idx_ir = 0, end_idx_ir;
+       u32 start_idx, end_idx, start_idx_ir, end_idx_ir;
        struct dev_mapping_table *mt_entry;
        u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags);
 
        start_idx = 0;
+       start_idx_ir = 0;
+       end_idx_ir = 0;
        end_idx = sc->max_devices;
        if (ioc_pg8_flags & MPI2_IOCPAGE8_FLAGS_RESERVED_TARGETID_0)
                start_idx = 1;
@@ -887,14 +890,14 @@ _mapping_get_dev_info(struct mpr_softc *
        u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags);
        Mpi2ConfigReply_t mpi_reply;
        Mpi2SasDevicePage0_t sas_device_pg0;
-       u8 entry, enc_idx, phy_idx;
+       u8 entry, enc_idx, phy_idx, sata_end_device;
        u32 map_idx, index, device_info;
        struct _map_phy_change *phy_change, *tmp_phy_change;
        uint64_t sas_address;
        struct enc_mapping_table *et_entry;
        struct dev_mapping_table *mt_entry;
        u8 add_code = MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED;
-       int rc;
+       int rc = 1;
 
        for (entry = 0; entry < topo_change->num_entries; entry++) {
                phy_change = &topo_change->phy_details[entry];
@@ -908,41 +911,36 @@ _mapping_get_dev_info(struct mpr_softc *
                        continue;
                }
 
+               /*
+                * Always get SATA Identify information because this is used
+                * to determine if Start/Stop Unit should be sent to the drive
+                * when the system is shutdown.
+                */
                device_info = le32toh(sas_device_pg0.DeviceInfo);
-               if ((ioc_pg8_flags & MPI2_IOCPAGE8_FLAGS_MASK_MAPPING_MODE) ==
-                   MPI2_IOCPAGE8_FLAGS_DEVICE_PERSISTENCE_MAPPING) {
-                       if ((device_info & MPI2_SAS_DEVICE_INFO_END_DEVICE) &&
-                           (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE)) {
-                               rc = mprsas_get_sas_address_for_sata_disk(sc,
-                                   &sas_address, phy_change->dev_handle,
-                                   device_info);
-                               if (rc) {
-                                       printf("%s: failed to compute the "
-                                           "hashed SAS Address for SATA "
-                                           "device with handle 0x%04x\n",
-                                           __func__, phy_change->dev_handle);
-                                       sas_address =
-                                           sas_device_pg0.SASAddress.High;
-                                       sas_address = (sas_address << 32) |
-                                           sas_device_pg0.SASAddress.Low;
-                               }
+               sas_address = sas_device_pg0.SASAddress.High;
+               sas_address = (sas_address << 32) |
+                   sas_device_pg0.SASAddress.Low;
+               sata_end_device = 0;
+               if ((device_info & MPI2_SAS_DEVICE_INFO_END_DEVICE) &&
+                   (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE)) {
+                       sata_end_device = 1;
+                       rc = mprsas_get_sas_address_for_sata_disk(sc,
+                           &sas_address, phy_change->dev_handle, device_info,
+                           &phy_change->is_SATA_SSD);
+                       if (rc) {
+                               mpr_dprint(sc, MPR_ERROR, "%s: failed to get "
+                                   "disk type (SSD or HDD) and SAS Address "
+                                   "for SATA device with handle 0x%04x\n",
+                                   __func__, phy_change->dev_handle);
+                       } else {
                                mpr_dprint(sc, MPR_INFO, "SAS Address for SATA "
                                    "device = %jx\n", sas_address);
-                       } else {
-                               sas_address =
-                                       sas_device_pg0.SASAddress.High;
-                               sas_address = (sas_address << 32) |
-                                       sas_device_pg0.SASAddress.Low;
                        }
-               } else {
-                       sas_address = sas_device_pg0.SASAddress.High;
-                       sas_address = (sas_address << 32) |
-                          sas_device_pg0.SASAddress.Low;
                }
+
                phy_change->physical_id = sas_address;
                phy_change->slot = le16toh(sas_device_pg0.Slot);
-               phy_change->device_info =
-                   le32toh(sas_device_pg0.DeviceInfo);
+               phy_change->device_info = le32toh(sas_device_pg0.DeviceInfo);
 
                if ((ioc_pg8_flags & MPI2_IOCPAGE8_FLAGS_MASK_MAPPING_MODE) ==
                    MPI2_IOCPAGE8_FLAGS_ENCLOSURE_SLOT_MAPPING) {
@@ -950,10 +948,10 @@ _mapping_get_dev_info(struct mpr_softc *
                            topo_change->enc_handle);
                        if (enc_idx == MPR_ENCTABLE_BAD_IDX) {
                                phy_change->is_processed = 1;
-                               printf("%s: failed to add the device with "
-                                   "handle 0x%04x because the enclosure is "
-                                   "not in the mapping table\n", __func__,
-                                   phy_change->dev_handle);
+                               mpr_dprint(sc, MPR_MAPPING, "%s: failed to add "
+                                   "the device with handle 0x%04x because the "
+                                   "enclosure is not in the mapping table\n",
+                                   __func__, phy_change->dev_handle);
                                continue;
                        }
                        if (!((phy_change->device_info &

Modified: head/sys/dev/mpr/mpr_mapping.h
==============================================================================
--- head/sys/dev/mpr/mpr_mapping.h      Thu May 28 18:14:55 2015        
(r283660)
+++ head/sys/dev/mpr/mpr_mapping.h      Thu May 28 18:24:22 2015        
(r283661)
@@ -1,5 +1,6 @@
 /*-
- * Copyright (c) 2011-2014 LSI Corp.
+ * Copyright (c) 2011-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -23,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * LSI MPT-Fusion Host Adapter FreeBSD
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
  *
  * $FreeBSD$
  */
@@ -38,6 +39,7 @@
  * @dev_handle: device handle for the device pointed by this entry
  * @slot: slot ID
  * @is_processed: Flag to indicate whether this entry is processed or not
+ * @is_SATA_SSD: 1 if this is a SATA device AND an SSD, 0 otherwise
  */
 struct _map_phy_change {
        uint64_t        physical_id;
@@ -46,6 +48,8 @@ struct _map_phy_change {
        uint16_t        slot;
        uint8_t reason;
        uint8_t is_processed;
+       uint8_t is_SATA_SSD;
+       uint8_t reserved;
 };
 
 /**
@@ -66,6 +70,6 @@ struct _map_topology_change {
 
 extern int
 mprsas_get_sas_address_for_sata_disk(struct mpr_softc *ioc,
-    u64 *sas_address, u16 handle, u32 device_info);
+    u64 *sas_address, u16 handle, u32 device_info, u8 *is_SATA_SSD);
 
 #endif

Modified: head/sys/dev/mpr/mpr_pci.c
==============================================================================
--- head/sys/dev/mpr/mpr_pci.c  Thu May 28 18:14:55 2015        (r283660)
+++ head/sys/dev/mpr/mpr_pci.c  Thu May 28 18:24:22 2015        (r283661)
@@ -27,7 +27,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-/* PCI/PCI-X/PCIe bus interface for the LSI MPT2 controllers */
+/* PCI/PCI-X/PCIe bus interface for the Avago Tech (LSI) MPT3 controllers */
 
 /* TODO Move headers to mprvar */
 #include <sys/types.h>
@@ -99,17 +99,17 @@ struct mpr_ident {
        const char      *desc;
 } mpr_identifiers[] = {
        { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3004,
-           0xffff, 0xffff, 0, "LSI SAS3004" },
+           0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3004" },
        { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3008,
-           0xffff, 0xffff, 0, "LSI SAS3008" },
+           0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3008" },
        { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_1,
-           0xffff, 0xffff, 0, "LSI SAS3108_1" },
+           0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_1" },
        { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_2,
-           0xffff, 0xffff, 0, "LSI SAS3108_2" },
+           0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_2" },
        { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_5,
-           0xffff, 0xffff, 0, "LSI SAS3108_5" },
+           0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_5" },
        { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_6,
-           0xffff, 0xffff, 0, "LSI SAS3108_6" },
+           0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_6" },
        { 0, 0, 0, 0, 0, NULL }
 };
 

Modified: head/sys/dev/mpr/mpr_sas.c
==============================================================================
--- head/sys/dev/mpr/mpr_sas.c  Thu May 28 18:14:55 2015        (r283660)
+++ head/sys/dev/mpr/mpr_sas.c  Thu May 28 18:24:22 2015        (r283661)
@@ -1,6 +1,7 @@
 /*-
  * Copyright (c) 2009 Yahoo! Inc.
- * Copyright (c) 2011-2014 LSI Corp.
+ * Copyright (c) 2011-2015 LSI Corp.
+ * Copyright (c) 2013-2015 Avago Technologies
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -23,12 +24,15 @@
  * 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.
+ *
+ * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ *
  */
 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-/* Communications core for LSI MPT2 */
+/* Communications core for Avago Technologies (LSI) MPT3 */
 
 /* TODO Move headers to mprvar */
 #include <sys/types.h>
@@ -122,14 +126,10 @@ static void mprsas_scsiio_complete(struc
 static void mprsas_action_resetdev(struct mprsas_softc *, union ccb *);
 static void mprsas_resetdev_complete(struct mpr_softc *,
     struct mpr_command *);
-static int  mprsas_send_abort(struct mpr_softc *sc, struct mpr_command *tm,
+static int mprsas_send_abort(struct mpr_softc *sc, struct mpr_command *tm,
     struct mpr_command *cm);
-static int  mprsas_send_reset(struct mpr_softc *sc, struct mpr_command *tm,
-    uint8_t type);
 static void mprsas_async(void *callback_arg, uint32_t code,
     struct cam_path *path, void *arg);
-static void mprsas_prepare_ssu(struct mpr_softc *sc, struct cam_path *path,
-    struct ccb_getdev *cgd);
 #if (__FreeBSD_version < 901503) || \
     ((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006))
 static void mprsas_check_eedp(struct mpr_softc *sc, struct cam_path *path,
@@ -142,13 +142,12 @@ static void mprsas_portenable_complete(s
     struct mpr_command *cm);
 
 #if __FreeBSD_version >= 900026
-static void
-mprsas_smpio_complete(struct mpr_softc *sc, struct mpr_command *cm);
+static void mprsas_smpio_complete(struct mpr_softc *sc,
+    struct mpr_command *cm);
 static void mprsas_send_smpcmd(struct mprsas_softc *sassc,
-               union ccb *ccb, uint64_t sasaddr);
-static void
-mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb);
-#endif
+    union ccb *ccb, uint64_t sasaddr);
+static void mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb);
+#endif //FreeBSD_version >= 900026
 
 struct mprsas_target *
 mprsas_find_target_by_handle(struct mprsas_softc *sassc, int start,
@@ -230,7 +229,7 @@ mprsas_startup_decrement(struct mprsas_s
        }
 }
 
-/* LSI's firmware requires us to stop sending commands when we're doing task
+/* The firmware requires us to stop sending commands when we're doing task
  * management, so refcount the TMs and keep the simq frozen when any are in
  * use.
  */
@@ -241,35 +240,31 @@ mprsas_alloc_tm(struct mpr_softc *sc)
 
        MPR_FUNCTRACE(sc);
        tm = mpr_alloc_high_priority_command(sc);
-       if (tm != NULL) {
-               if (sc->sassc->tm_count++ == 0) {
-                       mpr_dprint(sc, MPR_RECOVERY,
-                           "%s freezing simq\n", __func__);
-                       xpt_freeze_simq(sc->sassc->sim, 1);
-               }
-               mpr_dprint(sc, MPR_RECOVERY, "%s tm_count %u\n", __func__,
-                   sc->sassc->tm_count);
-       }
        return tm;
 }
 
 void
 mprsas_free_tm(struct mpr_softc *sc, struct mpr_command *tm)
 {
-       mpr_dprint(sc, MPR_TRACE, "%s", __func__);
+       MPR_FUNCTRACE(sc);
        if (tm == NULL)
                return;
 
-       /* if there are no TMs in use, we can release the simq.  We use our
-        * own refcount so that it's easier for a diag reset to cleanup and
-        * release the simq.
-        */
-       if (--sc->sassc->tm_count == 0) {
-               mpr_dprint(sc, MPR_RECOVERY, "%s releasing simq\n", __func__);
-               xpt_release_simq(sc->sassc->sim, 1);
+       /*
+        * For TM's the devq is frozen for the device.  Unfreeze it here and
+        * free the resources used for freezing the devq.  Must clear the
+        * INRESET flag as well or scsi I/O will not work.
+        */
+       if (tm->cm_targ != NULL) {
+               tm->cm_targ->flags &= ~MPRSAS_TARGET_INRESET;
+       }
+       if (tm->cm_ccb) {
+               mpr_dprint(sc, MPR_INFO, "Unfreezing devq for target ID %d\n",
+                   tm->cm_targ->tid);
+               xpt_release_devq(tm->cm_ccb->ccb_h.path, 1, TRUE);
+               xpt_free_path(tm->cm_ccb->ccb_h.path);
+               xpt_free_ccb(tm->cm_ccb);
        }
-       mpr_dprint(sc, MPR_RECOVERY, "%s tm_count %u\n", __func__,
-           sc->sassc->tm_count);
 
        mpr_free_high_priority_command(sc, tm);
 }
@@ -298,8 +293,8 @@ mprsas_rescan_target(struct mpr_softc *s
                return;
        }
 
-       if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid,
-           targetid, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
+       if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid, targetid,
+           CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
                mpr_dprint(sc, MPR_ERROR, "unable to create path for rescan\n");
                xpt_free_ccb(ccb);
                return;
@@ -473,11 +468,16 @@ mprsas_prepare_volume_remove(struct mprs
            MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
        cm->cm_complete = mprsas_remove_volume;
        cm->cm_complete_data = (void *)(uintptr_t)handle;
+
+       mpr_dprint(sc, MPR_INFO, "%s: Sending reset for target ID %d\n",
+           __func__, targ->tid);
+       mprsas_prepare_for_tm(sc, cm, targ, CAM_LUN_WILDCARD);
+
        mpr_map_command(sc, cm);
 }
 
 /*
- * The MPT2 firmware performs debounce on the link to avoid transient link
+ * The MPT3 firmware performs debounce on the link to avoid transient link
  * errors and false removals.  When it does decide that link has been lost
  * and a device needs to go away, it expects that the host will perform a
  * target reset and then an op remove.  The reset has the side-effect of
@@ -532,6 +532,11 @@ mprsas_prepare_remove(struct mprsas_soft
            MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
        cm->cm_complete = mprsas_remove_device;
        cm->cm_complete_data = (void *)(uintptr_t)handle;
+
+       mpr_dprint(sc, MPR_INFO, "%s: Sending reset for target ID %d\n",
+           __func__, targ->tid);
+       mprsas_prepare_for_tm(sc, cm, targ, CAM_LUN_WILDCARD);
+
        mpr_map_command(sc, cm);
 }
 
@@ -596,10 +601,10 @@ mprsas_remove_device(struct mpr_softc *s
 
        mpr_map_command(sc, tm);
 
-       mpr_dprint(sc, MPR_XINFO, "clearing target %u handle 0x%04x\n",
+       mpr_dprint(sc, MPR_INFO, "clearing target %u handle 0x%04x\n",
            targ->tid, handle);
        if (targ->encl_level_valid) {
-               mpr_dprint(sc, MPR_XINFO, "At enclosure level %d, slot %d, "
+               mpr_dprint(sc, MPR_INFO, "At enclosure level %d, slot %d, "
                    "connector name (%4s)\n", targ->encl_level, targ->encl_slot,
                    targ->connector_name);
        }
@@ -608,7 +613,7 @@ mprsas_remove_device(struct mpr_softc *s
 
                mpr_dprint(sc, MPR_XINFO, "Completing missed command %p\n", tm);
                ccb = tm->cm_complete_data;
-               ccb->ccb_h.status = CAM_DEV_NOT_THERE;
+               mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
                mprsas_scsiio_complete(sc, tm);
        }
 }
@@ -726,7 +731,7 @@ mpr_attach_sas(struct mpr_softc *sc)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to