summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslm <slm@FreeBSD.org>2015-05-28 18:14:55 +0000
committerslm <slm@FreeBSD.org>2015-05-28 18:14:55 +0000
commite30be399be1d292717acb645781b1ca75dbb525f (patch)
tree41f99d21d07d43eef0b96e45e1d3fe5a5ed15f38
parentec768a1460601dc29457cd73121acbb33b43840b (diff)
downloadFreeBSD-src-e30be399be1d292717acb645781b1ca75dbb525f.zip
FreeBSD-src-e30be399be1d292717acb645781b1ca75dbb525f.tar.gz
The wrong commit message was given with r283632. To get the correct commit
message synced to the changes in r283632, those changes are now backed out. Another commit will be done that is exactly the same as r283632 except it will have to correct commit message. Approved by: ken, scottl, asomers, gibbs
-rw-r--r--sys/dev/mpr/mpi/mpi2.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_cnfg.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_hbd.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_history.txt8
-rw-r--r--sys/dev/mpr/mpi/mpi2_init.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_ioc.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_ra.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_raid.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_sas.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_targ.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_tool.h8
-rw-r--r--sys/dev/mpr/mpi/mpi2_type.h8
-rw-r--r--sys/dev/mpr/mpr.c90
-rw-r--r--sys/dev/mpr/mpr_config.c5
-rw-r--r--sys/dev/mpr/mpr_ioctl.h7
-rw-r--r--sys/dev/mpr/mpr_mapping.c72
-rw-r--r--sys/dev/mpr/mpr_mapping.h10
-rw-r--r--sys/dev/mpr/mpr_pci.c14
-rw-r--r--sys/dev/mpr/mpr_sas.c476
-rw-r--r--sys/dev/mpr/mpr_sas.h31
-rw-r--r--sys/dev/mpr/mpr_sas_lsi.c362
-rw-r--r--sys/dev/mpr/mpr_user.c41
-rw-r--r--sys/dev/mpr/mprvar.h38
23 files changed, 474 insertions, 768 deletions
diff --git a/sys/dev/mpr/mpi/mpi2.h b/sys/dev/mpr/mpi/mpi2.h
index 42fdec2..10f17ab 100644
--- a/sys/dev/mpr/mpi/mpi2.h
+++ b/sys/dev/mpr/mpi/mpi2.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2013 LSI Corporation.
*
*
* Name: mpi2.h
diff --git a/sys/dev/mpr/mpi/mpi2_cnfg.h b/sys/dev/mpr/mpi/mpi2_cnfg.h
index 3b0eb63..d82750f 100644
--- a/sys/dev/mpr/mpi/mpi2_cnfg.h
+++ b/sys/dev/mpr/mpi/mpi2_cnfg.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2013 LSI Corporation.
*
*
* Name: mpi2_cnfg.h
diff --git a/sys/dev/mpr/mpi/mpi2_hbd.h b/sys/dev/mpr/mpi/mpi2_hbd.h
index 520407b..d0cc09f 100644
--- a/sys/dev/mpr/mpi/mpi2_hbd.h
+++ b/sys/dev/mpr/mpi/mpi2_hbd.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2009-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2009-2011 LSI Corporation.
*
*
* Name: mpi2_hbd.h
diff --git a/sys/dev/mpr/mpi/mpi2_history.txt b/sys/dev/mpr/mpi/mpi2_history.txt
index 9fca796..296b75b 100644
--- a/sys/dev/mpr/mpi/mpi2_history.txt
+++ b/sys/dev/mpr/mpi/mpi2_history.txt
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
@@ -36,8 +35,7 @@
Fusion-MPT MPI 2.0 / 2.5 Header File Change History
==============================
- Copyright (c) 2000-2015 LSI Corporation.
- Copyright (c) 2013-2015 Avago Technologies
+ Copyright (c) 2000-2013 LSI Corporation.
---------------------------------------
Header Set Release Version: 02.00.33
diff --git a/sys/dev/mpr/mpi/mpi2_init.h b/sys/dev/mpr/mpi/mpi2_init.h
index 5f475c0..62b0cfe 100644
--- a/sys/dev/mpr/mpi/mpi2_init.h
+++ b/sys/dev/mpr/mpi/mpi2_init.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2013 LSI Corporation.
*
*
* Name: mpi2_init.h
diff --git a/sys/dev/mpr/mpi/mpi2_ioc.h b/sys/dev/mpr/mpi/mpi2_ioc.h
index 54f39a5..38a46f5 100644
--- a/sys/dev/mpr/mpi/mpi2_ioc.h
+++ b/sys/dev/mpr/mpi/mpi2_ioc.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2013 LSI Corporation.
*
*
* Name: mpi2_ioc.h
diff --git a/sys/dev/mpr/mpi/mpi2_ra.h b/sys/dev/mpr/mpi/mpi2_ra.h
index 02304aa..76db06b 100644
--- a/sys/dev/mpr/mpi/mpi2_ra.h
+++ b/sys/dev/mpr/mpi/mpi2_ra.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2012-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2009 LSI Corporation.
*
*
* Name: mpi2_ra.h
diff --git a/sys/dev/mpr/mpi/mpi2_raid.h b/sys/dev/mpr/mpi/mpi2_raid.h
index 52ebf07..c6bb598 100644
--- a/sys/dev/mpr/mpi/mpi2_raid.h
+++ b/sys/dev/mpr/mpi/mpi2_raid.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2013 LSI Corporation.
*
*
* Name: mpi2_raid.h
diff --git a/sys/dev/mpr/mpi/mpi2_sas.h b/sys/dev/mpr/mpi/mpi2_sas.h
index 7cae2c3..2a107f1 100644
--- a/sys/dev/mpr/mpi/mpi2_sas.h
+++ b/sys/dev/mpr/mpi/mpi2_sas.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2013 LSI Corporation.
*
*
* Name: mpi2_sas.h
diff --git a/sys/dev/mpr/mpi/mpi2_targ.h b/sys/dev/mpr/mpi/mpi2_targ.h
index 85b5ac5..506e64f 100644
--- a/sys/dev/mpr/mpi/mpi2_targ.h
+++ b/sys/dev/mpr/mpi/mpi2_targ.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2012 LSI Corporation.
*
*
* Name: mpi2_targ.h
diff --git a/sys/dev/mpr/mpi/mpi2_tool.h b/sys/dev/mpr/mpi/mpi2_tool.h
index 59917c0..94542cc 100644
--- a/sys/dev/mpr/mpi/mpi2_tool.h
+++ b/sys/dev/mpr/mpi/mpi2_tool.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2013 LSI Corporation.
*
*
* Name: mpi2_tool.h
diff --git a/sys/dev/mpr/mpi/mpi2_type.h b/sys/dev/mpr/mpi/mpi2_type.h
index b063683..da3aefb 100644
--- a/sys/dev/mpr/mpi/mpi2_type.h
+++ b/sys/dev/mpr/mpi/mpi2_type.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2012-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2013 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,14 +26,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
/*
- * Copyright (c) 2000-2015 LSI Corporation.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2000-2007 LSI Corporation.
*
*
* Name: mpi2_type.h
diff --git a/sys/dev/mpr/mpr.c b/sys/dev/mpr/mpr.c
index 07e73c5..d3fb9a0 100644
--- a/sys/dev/mpr/mpr.c
+++ b/sys/dev/mpr/mpr.c
@@ -1,7 +1,6 @@
/*-
* Copyright (c) 2009 Yahoo! Inc.
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2012-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -25,14 +24,12 @@
* 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 Avago Technologies (LSI) MPT3 */
+/* Communications core for LSI MPT2 */
/* TODO Move headers to mprvar */
#include <sys/types.h>
@@ -75,6 +72,7 @@ __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);
@@ -354,9 +352,11 @@ mpr_transition_operational(struct mpr_softc *sc)
static int
mpr_iocfacts_allocate(struct mpr_softc *sc, uint8_t attaching)
{
- int error;
+ int error, i;
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,7 +513,27 @@ mpr_iocfacts_allocate(struct mpr_softc *sc, uint8_t attaching)
*/
if (reallocating) {
mpr_iocfacts_free(sc);
- mprsas_realloc_targets(sc, saved_facts.MaxTargets);
+
+ /*
+ * 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);
+ }
}
/*
@@ -755,7 +775,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;
}
@@ -796,8 +816,7 @@ mpr_wait_db_ack(struct mpr_softc *sc, int timeout, int sleep_flag)
* 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
@@ -963,7 +982,7 @@ mpr_enqueue_request(struct mpr_softc *sc, struct mpr_command *cm)
reply_descriptor rd;
MPR_FUNCTRACE(sc);
- mpr_dprint(sc, MPR_TRACE, "SMID %u cm %p ccb %p\n",
+ mpr_dprint(sc, MPR_TRACE, "%s SMID %u cm %p ccb %p\n", __func__,
cm->cm_desc.Default.SMID, cm, cm->cm_ccb);
if (sc->mpr_flags & MPR_FLAGS_ATTACH_DONE && !(sc->mpr_flags &
@@ -1353,8 +1372,6 @@ 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.
@@ -1363,8 +1380,6 @@ 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",
@@ -1387,14 +1402,6 @@ 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
@@ -1467,20 +1474,11 @@ 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
@@ -2098,7 +2096,7 @@ mpr_update_events(struct mpr_softc *sc, struct mpr_event_handle *handle,
(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);
@@ -2165,8 +2163,8 @@ mpr_deregister_events(struct mpr_softc *sc, struct mpr_event_handle *handle)
* 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)
@@ -2248,9 +2246,9 @@ mpr_add_chain(struct mpr_command *cm, int segsleft)
/*
* 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,
@@ -2662,7 +2660,7 @@ mpr_request_polled(struct mpr_softc *sc, struct mpr_command *cm)
}
}
- 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) ?
@@ -2719,12 +2717,9 @@ mpr_read_config_page(struct mpr_softc *sc, struct mpr_config_params *params)
cm->cm_data = params->buffer;
cm->cm_length = params->length;
- 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_sge = &req->PageBufferSGE;
+ cm->cm_sglsize = sizeof(MPI2_SGE_IO_UNION);
+ cm->cm_flags = MPR_CM_FLAGS_SGE_SIMPLE | MPR_CM_FLAGS_DATAIN;
cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
cm->cm_complete_data = params;
@@ -2781,12 +2776,9 @@ mpr_config_complete(struct mpr_softc *sc, struct mpr_command *cm)
goto done;
}
params->status = reply->IOCStatus;
- if (params->hdr.Struct.PageType == MPI2_CONFIG_PAGETYPE_EXTENDED) {
+ if (params->hdr.Ext.ExtPageType != 0) {
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;
diff --git a/sys/dev/mpr/mpr_config.c b/sys/dev/mpr/mpr_config.c
index c0ea3d5..1254516 100644
--- a/sys/dev/mpr/mpr_config.c
+++ b/sys/dev/mpr/mpr_config.c
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*/
#include <sys/cdefs.h>
diff --git a/sys/dev/mpr/mpr_ioctl.h b/sys/dev/mpr/mpr_ioctl.h
index aa1a4cb..5ec482f 100644
--- a/sys/dev/mpr/mpr_ioctl.h
+++ b/sys/dev/mpr/mpr_ioctl.h
@@ -27,13 +27,12 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD userland interface
+ * LSI MPT-Fusion Host Adapter FreeBSD userland interface
*
* $FreeBSD$
*/
/*-
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -57,7 +56,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
diff --git a/sys/dev/mpr/mpr_mapping.c b/sys/dev/mpr/mpr_mapping.c
index 110e6a3..7f0fc00 100644
--- a/sys/dev/mpr/mpr_mapping.c
+++ b/sys/dev/mpr/mpr_mapping.c
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*/
#include <sys/cdefs.h>
@@ -327,13 +326,11 @@ _mapping_get_high_missing_mt_idx(struct mpr_softc *sc)
{
u32 map_idx, high_idx = MPR_ENCTABLE_BAD_IDX;
u8 high_missing_count = 0;
- u32 start_idx, end_idx, start_idx_ir, end_idx_ir;
+ u32 start_idx, end_idx, start_idx_ir = 0, 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;
@@ -890,14 +887,14 @@ _mapping_get_dev_info(struct mpr_softc *sc,
u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags);
Mpi2ConfigReply_t mpi_reply;
Mpi2SasDevicePage0_t sas_device_pg0;
- u8 entry, enc_idx, phy_idx, sata_end_device;
+ u8 entry, enc_idx, phy_idx;
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 = 1;
+ int rc;
for (entry = 0; entry < topo_change->num_entries; entry++) {
phy_change = &topo_change->phy_details[entry];
@@ -911,36 +908,41 @@ _mapping_get_dev_info(struct mpr_softc *sc,
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);
- 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 {
+ 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;
+ }
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) {
@@ -948,10 +950,10 @@ _mapping_get_dev_info(struct mpr_softc *sc,
topo_change->enc_handle);
if (enc_idx == MPR_ENCTABLE_BAD_IDX) {
phy_change->is_processed = 1;
- 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);
+ 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);
continue;
}
if (!((phy_change->device_info &
diff --git a/sys/dev/mpr/mpr_mapping.h b/sys/dev/mpr/mpr_mapping.h
index c00a3b7..3250c42 100644
--- a/sys/dev/mpr/mpr_mapping.h
+++ b/sys/dev/mpr/mpr_mapping.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
@@ -39,7 +38,6 @@
* @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;
@@ -48,8 +46,6 @@ struct _map_phy_change {
uint16_t slot;
uint8_t reason;
uint8_t is_processed;
- uint8_t is_SATA_SSD;
- uint8_t reserved;
};
/**
@@ -70,6 +66,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, u8 *is_SATA_SSD);
+ u64 *sas_address, u16 handle, u32 device_info);
#endif
diff --git a/sys/dev/mpr/mpr_pci.c b/sys/dev/mpr/mpr_pci.c
index 7430eac..e19f33a 100644
--- a/sys/dev/mpr/mpr_pci.c
+++ b/sys/dev/mpr/mpr_pci.c
@@ -27,7 +27,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-/* PCI/PCI-X/PCIe bus interface for the Avago Tech (LSI) MPT3 controllers */
+/* PCI/PCI-X/PCIe bus interface for the LSI MPT2 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, "Avago Technologies (LSI) SAS3004" },
+ 0xffff, 0xffff, 0, "LSI SAS3004" },
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3008,
- 0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3008" },
+ 0xffff, 0xffff, 0, "LSI SAS3008" },
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_1,
- 0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_1" },
+ 0xffff, 0xffff, 0, "LSI SAS3108_1" },
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_2,
- 0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_2" },
+ 0xffff, 0xffff, 0, "LSI SAS3108_2" },
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_5,
- 0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_5" },
+ 0xffff, 0xffff, 0, "LSI SAS3108_5" },
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_6,
- 0xffff, 0xffff, 0, "Avago Technologies (LSI) SAS3108_6" },
+ 0xffff, 0xffff, 0, "LSI SAS3108_6" },
{ 0, 0, 0, 0, 0, NULL }
};
diff --git a/sys/dev/mpr/mpr_sas.c b/sys/dev/mpr/mpr_sas.c
index eac3360..32c3a46 100644
--- a/sys/dev/mpr/mpr_sas.c
+++ b/sys/dev/mpr/mpr_sas.c
@@ -1,7 +1,6 @@
/*-
* Copyright (c) 2009 Yahoo! Inc.
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,15 +23,12 @@
* 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 Avago Technologies (LSI) MPT3 */
+/* Communications core for LSI MPT2 */
/* TODO Move headers to mprvar */
#include <sys/types.h>
@@ -126,10 +122,14 @@ static void mprsas_scsiio_complete(struct mpr_softc *, struct mpr_command *);
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,12 +142,13 @@ static void mprsas_portenable_complete(struct mpr_softc *sc,
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 //FreeBSD_version >= 900026
+ union ccb *ccb, uint64_t sasaddr);
+static void
+mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb);
+#endif
struct mprsas_target *
mprsas_find_target_by_handle(struct mprsas_softc *sassc, int start,
@@ -229,7 +230,7 @@ mprsas_startup_decrement(struct mprsas_softc *sassc)
}
}
-/* The firmware requires us to stop sending commands when we're doing task
+/* LSI's 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.
*/
@@ -240,31 +241,35 @@ 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_FUNCTRACE(sc);
+ mpr_dprint(sc, MPR_TRACE, "%s", __func__);
if (tm == NULL)
return;
- /*
- * 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 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 (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);
+ if (--sc->sassc->tm_count == 0) {
+ mpr_dprint(sc, MPR_RECOVERY, "%s releasing simq\n", __func__);
+ xpt_release_simq(sc->sassc->sim, 1);
}
+ mpr_dprint(sc, MPR_RECOVERY, "%s tm_count %u\n", __func__,
+ sc->sassc->tm_count);
mpr_free_high_priority_command(sc, tm);
}
@@ -293,8 +298,8 @@ mprsas_rescan_target(struct mpr_softc *sc, struct mprsas_target *targ)
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;
@@ -468,16 +473,11 @@ mprsas_prepare_volume_remove(struct mprsas_softc *sassc, uint16_t handle)
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 MPT3 firmware performs debounce on the link to avoid transient link
+ * The MPT2 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,11 +532,6 @@ mprsas_prepare_remove(struct mprsas_softc *sassc, uint16_t handle)
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);
}
@@ -601,10 +596,10 @@ mprsas_remove_device(struct mpr_softc *sc, struct mpr_command *tm)
mpr_map_command(sc, tm);
- mpr_dprint(sc, MPR_INFO, "clearing target %u handle 0x%04x\n",
+ mpr_dprint(sc, MPR_XINFO, "clearing target %u handle 0x%04x\n",
targ->tid, handle);
if (targ->encl_level_valid) {
- mpr_dprint(sc, MPR_INFO, "At enclosure level %d, slot %d, "
+ mpr_dprint(sc, MPR_XINFO, "At enclosure level %d, slot %d, "
"connector name (%4s)\n", targ->encl_level, targ->encl_slot,
targ->connector_name);
}
@@ -613,7 +608,7 @@ mprsas_remove_device(struct mpr_softc *sc, struct mpr_command *tm)
mpr_dprint(sc, MPR_XINFO, "Completing missed command %p\n", tm);
ccb = tm->cm_complete_data;
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
mprsas_scsiio_complete(sc, tm);
}
}
@@ -731,7 +726,7 @@ mpr_attach_sas(struct mpr_softc *sc)
}
/*
- * XXX MaxTargets could change during a reinit. Since we don't
+ * XXX MaxTargets could change during a reinit. since we don't
* resize the targets[] array during such an event, cache the value
* of MaxTargets here so that we don't get into trouble later. This
* should move into the reinit logic.
@@ -787,7 +782,7 @@ mpr_attach_sas(struct mpr_softc *sc)
}
/*
- * Assume that discovery events will start right away.
+ * Assume that discovery events will start right away. Freezing
*
* Hold off boot until discovery is complete.
*/
@@ -795,7 +790,9 @@ mpr_attach_sas(struct mpr_softc *sc)
sc->sassc->startup_refcount = 0;
mprsas_startup_increment(sassc);
- callout_init(&sassc->discovery_callout, 1 /*mpsafe*/);
+ callout_init(&sassc->discovery_callout, 1 /*mprafe*/);
+
+ sassc->tm_count = 0;
/*
* Register for async events so we can determine the EEDP
@@ -965,7 +962,7 @@ mprsas_action(struct cam_sim *sim, union ccb *ccb)
sassc = cam_sim_softc(sim);
MPR_FUNCTRACE(sassc->sc);
- mpr_dprint(sassc->sc, MPR_TRACE, "ccb func_code 0x%x\n",
+ mpr_dprint(sassc->sc, MPR_TRACE, "%s func 0x%x\n", __func__,
ccb->ccb_h.func_code);
mtx_assert(&sassc->sc->mpr_mtx, MA_OWNED);
@@ -988,7 +985,7 @@ mprsas_action(struct cam_sim *sim, union ccb *ccb)
cpi->max_lun = 255;
cpi->initiator_id = sassc->maxtargets - 1;
strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
- strncpy(cpi->hba_vid, "Avago Tech (LSI)", HBA_IDLEN);
+ strncpy(cpi->hba_vid, "LSILogic", HBA_IDLEN);
strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
cpi->unit_number = cam_sim_unit(sim);
cpi->bus_id = cam_sim_bus(sim);
@@ -1008,7 +1005,7 @@ mprsas_action(struct cam_sim *sim, union ccb *ccb)
*/
cpi->maxio = 256 * 1024;
#endif
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ cpi->ccb_h.status = CAM_REQ_CMP;
break;
}
case XPT_GET_TRAN_SETTINGS:
@@ -1027,7 +1024,7 @@ mprsas_action(struct cam_sim *sim, union ccb *ccb)
cts->ccb_h.target_id));
targ = &sassc->targets[cts->ccb_h.target_id];
if (targ->handle == 0x0) {
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ cts->ccb_h.status = CAM_DEV_NOT_THERE;
break;
}
@@ -1057,12 +1054,12 @@ mprsas_action(struct cam_sim *sim, union ccb *ccb)
scsi->valid = CTS_SCSI_VALID_TQ;
scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ cts->ccb_h.status = CAM_REQ_CMP;
break;
}
case XPT_CALC_GEOMETRY:
cam_calc_geometry(&ccb->ccg, /*extended*/1);
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ ccb->ccb_h.status = CAM_REQ_CMP;
break;
case XPT_RESET_DEV:
mpr_dprint(sassc->sc, MPR_XINFO,
@@ -1074,7 +1071,7 @@ mprsas_action(struct cam_sim *sim, union ccb *ccb)
case XPT_TERM_IO:
mpr_dprint(sassc->sc, MPR_XINFO,
"mprsas_action faking success for abort or reset\n");
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ ccb->ccb_h.status = CAM_REQ_CMP;
break;
case XPT_SCSI_IO:
mprsas_action_scsiio(sassc, ccb);
@@ -1085,7 +1082,7 @@ mprsas_action(struct cam_sim *sim, union ccb *ccb)
return;
#endif
default:
- mprsas_set_ccbstatus(ccb, CAM_FUNC_NOTAVAIL);
+ ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
break;
}
xpt_done(ccb);
@@ -1105,7 +1102,7 @@ mprsas_announce_reset(struct mpr_softc *sc, uint32_t ac_code,
if (xpt_create_path(&path, NULL,
path_id, target_id, lun_id) != CAM_REQ_CMP) {
mpr_dprint(sc, MPR_ERROR, "unable to create path for reset "
- "notification\n");
+ "notification\n");
return;
}
@@ -1134,8 +1131,8 @@ mprsas_complete_all_commands(struct mpr_softc *sc)
if (cm->cm_complete != NULL) {
mprsas_log_command(cm, MPR_RECOVERY,
- "completing cm %p state %x ccb %p for diag "
- "reset\n", cm, cm->cm_state, cm->cm_ccb);
+ "completing cm %p state %x ccb %p for diag reset\n",
+ cm, cm->cm_state, cm->cm_ccb);
cm->cm_complete(sc, cm);
completed = 1;
}
@@ -1148,14 +1145,6 @@ mprsas_complete_all_commands(struct mpr_softc *sc)
completed = 1;
}
- if (cm->cm_sc->io_cmds_active != 0) {
- cm->cm_sc->io_cmds_active--;
- } else {
- mpr_dprint(cm->cm_sc, MPR_INFO, "Warning: "
- "io_cmds_active is out of sync - resynching to "
- "0\n");
- }
-
if ((completed == 0) && (cm->cm_state != MPR_CM_STATE_FREE)) {
/* this should never happen, but if it does, log */
mprsas_log_command(cm, MPR_RECOVERY,
@@ -1191,8 +1180,9 @@ mprsas_handle_reinit(struct mpr_softc *sc)
/* complete and cleanup after all outstanding commands */
mprsas_complete_all_commands(sc);
- mpr_dprint(sc, MPR_INIT, "%s startup %u after command completion\n",
- __func__, sc->sassc->startup_refcount);
+ mpr_dprint(sc, MPR_INIT, "%s startup %u tm %u after command "
+ "completion\n", __func__, sc->sassc->startup_refcount,
+ sc->sassc->tm_count);
/* zero all the target handles, since they may change after the
* reset, and we have to rediscover all the targets and use the new
@@ -1254,6 +1244,7 @@ mprsas_logical_unit_reset_complete(struct mpr_softc *sc,
"NULL reset reply for tm %p\n", tm);
if ((sc->mpr_flags & MPR_FLAGS_DIAGRESET) != 0) {
/* this completion was due to a reset, just cleanup */
+ targ->flags &= ~MPRSAS_TARGET_INRESET;
targ->tm = NULL;
mprsas_free_tm(sc, tm);
}
@@ -1331,8 +1322,8 @@ mprsas_target_reset_complete(struct mpr_softc *sc, struct mpr_command *tm)
* task management commands don't have S/G lists.
*/
if ((tm->cm_flags & MPR_CM_FLAGS_ERROR_MASK) != 0) {
- mpr_dprint(sc, MPR_ERROR, "%s: cm_flags = %#x for target "
- "reset! This should not happen!\n", __func__, tm->cm_flags);
+ mpr_dprint(sc, MPR_ERROR,"%s: cm_flags = %#x for target reset! "
+ "This should not happen!\n", __func__, tm->cm_flags);
mprsas_free_tm(sc, tm);
return;
}
@@ -1342,6 +1333,7 @@ mprsas_target_reset_complete(struct mpr_softc *sc, struct mpr_command *tm)
"NULL reset reply for tm %p\n", tm);
if ((sc->mpr_flags & MPR_FLAGS_DIAGRESET) != 0) {
/* this completion was due to a reset, just cleanup */
+ targ->flags &= ~MPRSAS_TARGET_INRESET;
targ->tm = NULL;
mprsas_free_tm(sc, tm);
}
@@ -1357,6 +1349,8 @@ mprsas_target_reset_complete(struct mpr_softc *sc, struct mpr_command *tm)
le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
le32toh(reply->TerminationCount));
+ targ->flags &= ~MPRSAS_TARGET_INRESET;
+
if (targ->outstanding == 0) {
/* we've finished recovery for this target and all
* of its logical units.
@@ -1384,7 +1378,7 @@ mprsas_target_reset_complete(struct mpr_softc *sc, struct mpr_command *tm)
#define MPR_RESET_TIMEOUT 30
-int
+static int
mprsas_send_reset(struct mpr_softc *sc, struct mpr_command *tm, uint8_t type)
{
MPI2_SCSI_TASK_MANAGE_REQUEST *req;
@@ -1393,8 +1387,8 @@ mprsas_send_reset(struct mpr_softc *sc, struct mpr_command *tm, uint8_t type)
target = tm->cm_targ;
if (target->handle == 0) {
- mpr_dprint(sc, MPR_ERROR, "%s null devhandle for target_id "
- "%d\n", __func__, target->tid);
+ mpr_dprint(sc, MPR_ERROR,"%s null devhandle for target_id %d\n",
+ __func__, target->tid);
return -1;
}
@@ -1410,7 +1404,6 @@ mprsas_send_reset(struct mpr_softc *sc, struct mpr_command *tm, uint8_t type)
mprsas_log_command(tm, MPR_RECOVERY|MPR_INFO,
"sending logical unit reset\n");
tm->cm_complete = mprsas_logical_unit_reset_complete;
- mprsas_prepare_for_tm(sc, tm, target, tm->cm_lun);
}
else if (type == MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET) {
/*
@@ -1419,20 +1412,20 @@ mprsas_send_reset(struct mpr_softc *sc, struct mpr_command *tm, uint8_t type)
*/
req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
tm->cm_targ->target_resets++;
+ tm->cm_targ->flags |= MPRSAS_TARGET_INRESET;
mprsas_log_command(tm, MPR_RECOVERY|MPR_INFO,
"sending target reset\n");
tm->cm_complete = mprsas_target_reset_complete;
- mprsas_prepare_for_tm(sc, tm, target, CAM_LUN_WILDCARD);
}
else {
mpr_dprint(sc, MPR_ERROR, "unexpected reset type 0x%x\n", type);
return -1;
}
- mpr_dprint(sc, MPR_INFO, "to target %u handle 0x%04x\n", target->tid,
+ mpr_dprint(sc, MPR_XINFO, "to target %u handle 0x%04x\n", target->tid,
target->handle);
if (target->encl_level_valid) {
- mpr_dprint(sc, MPR_INFO, "At enclosure level %d, slot %d, "
+ mpr_dprint(sc, MPR_XINFO, "At enclosure level %d, slot %d, "
"connector name (%4s)\n", target->encl_level,
target->encl_slot, target->connector_name);
}
@@ -1448,7 +1441,8 @@ mprsas_send_reset(struct mpr_softc *sc, struct mpr_command *tm, uint8_t type)
err = mpr_map_command(sc, tm);
if (err)
mprsas_log_command(tm, MPR_RECOVERY,
- "error %d sending reset type %u\n", err, type);
+ "error %d sending reset type %u\n",
+ err, type);
return err;
}
@@ -1579,10 +1573,6 @@ mprsas_send_abort(struct mpr_softc *sc, struct mpr_command *tm,
targ->aborts++;
- mpr_dprint(sc, MPR_INFO, "Sending reset from %s for target ID %d\n",
- __func__, targ->tid);
- mprsas_prepare_for_tm(sc, tm, targ, tm->cm_lun);
-
err = mpr_map_command(sc, tm);
if (err)
mprsas_log_command(tm, MPR_RECOVERY,
@@ -1591,6 +1581,7 @@ mprsas_send_abort(struct mpr_softc *sc, struct mpr_command *tm,
return err;
}
+
static void
mprsas_scsiio_timeout(void *data)
{
@@ -1626,11 +1617,11 @@ mprsas_scsiio_timeout(void *data)
targ = cm->cm_targ;
targ->timeouts++;
- mprsas_log_command(cm, MPR_ERROR, "command timeout cm %p ccb %p "
+ mprsas_log_command(cm, MPR_XINFO, "command timeout cm %p ccb %p "
"target %u, handle(0x%04x)\n", cm, cm->cm_ccb, targ->tid,
targ->handle);
if (targ->encl_level_valid) {
- mpr_dprint(sc, MPR_ERROR, "At enclosure level %d, slot %d, "
+ mpr_dprint(sc, MPR_XINFO, "At enclosure level %d, slot %d, "
"connector name (%4s)\n", targ->encl_level, targ->encl_slot,
targ->connector_name);
}
@@ -1638,7 +1629,8 @@ mprsas_scsiio_timeout(void *data)
/* XXX first, check the firmware state, to see if it's still
* operational. if not, do a diag reset.
*/
- mprsas_set_ccbstatus(cm->cm_ccb, CAM_CMD_TIMEOUT);
+
+ cm->cm_ccb->ccb_h.status = CAM_CMD_TIMEOUT;
cm->cm_state = MPR_CM_STATE_TIMEDOUT;
TAILQ_INSERT_TAIL(&targ->timedout_commands, cm, cm_recovery);
@@ -1689,22 +1681,19 @@ mprsas_action_scsiio(struct mprsas_softc *sassc, union ccb *ccb)
mtx_assert(&sc->mpr_mtx, MA_OWNED);
csio = &ccb->csio;
- KASSERT(csio->ccb_h.target_id < sassc->maxtargets,
- ("Target %d out of bounds in XPT_SCSI_IO\n",
- csio->ccb_h.target_id));
targ = &sassc->targets[csio->ccb_h.target_id];
mpr_dprint(sc, MPR_TRACE, "ccb %p target flag %x\n", ccb, targ->flags);
if (targ->handle == 0x0) {
mpr_dprint(sc, MPR_ERROR, "%s NULL handle for target %u\n",
__func__, csio->ccb_h.target_id);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ csio->ccb_h.status = CAM_DEV_NOT_THERE;
xpt_done(ccb);
return;
}
if (targ->flags & MPR_TARGET_FLAGS_RAID_COMPONENT) {
- mpr_dprint(sc, MPR_ERROR, "%s Raid component no SCSI IO "
+ mpr_dprint(sc, MPR_TRACE, "%s Raid component no SCSI IO "
"supported %u\n", __func__, csio->ccb_h.target_id);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ csio->ccb_h.status = CAM_DEV_NOT_THERE;
xpt_done(ccb);
return;
}
@@ -1713,7 +1702,7 @@ mprsas_action_scsiio(struct mprsas_softc *sassc, union ccb *ccb)
* Progress" and was actually aborted by the upper layer. Check for
* this here and complete the command without error.
*/
- if (mprsas_get_ccbstatus(ccb) != CAM_REQ_INPROG) {
+ if (ccb->ccb_h.status != CAM_REQ_INPROG) {
mpr_dprint(sc, MPR_TRACE, "%s Command is not in progress for "
"target %u\n", __func__, csio->ccb_h.target_id);
xpt_done(ccb);
@@ -1726,29 +1715,16 @@ mprsas_action_scsiio(struct mprsas_softc *sassc, union ccb *ccb)
*/
if (targ->flags & MPRSAS_TARGET_INREMOVAL) {
if (targ->devinfo == 0)
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ csio->ccb_h.status = CAM_REQ_CMP;
else
- mprsas_set_ccbstatus(ccb, CAM_SEL_TIMEOUT);
+ csio->ccb_h.status = CAM_SEL_TIMEOUT;
xpt_done(ccb);
return;
}
if ((sc->mpr_flags & MPR_FLAGS_SHUTDOWN) != 0) {
- mpr_dprint(sc, MPR_INFO, "%s shutting down\n", __func__);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
- xpt_done(ccb);
- return;
- }
-
- /*
- * If target has a reset in progress, freeze the devq and return. The
- * devq will be released when the TM reset is finished.
- */
- if (targ->flags & MPRSAS_TARGET_INRESET) {
- ccb->ccb_h.status = CAM_BUSY | CAM_DEV_QFRZN;
- mpr_dprint(sc, MPR_INFO, "%s: Freezing devq for target ID %d\n",
- __func__, targ->tid);
- xpt_freeze_devq(ccb->ccb_h.path, 1);
+ mpr_dprint(sc, MPR_TRACE, "%s shutting down\n", __func__);
+ csio->ccb_h.status = CAM_DEV_NOT_THERE;
xpt_done(ccb);
return;
}
@@ -1831,7 +1807,7 @@ mprsas_action_scsiio(struct mprsas_softc *sassc, union ccb *ccb)
if (MPR_SET_LUN(req->LUN, csio->ccb_h.target_lun) != 0) {
mpr_free_command(sc, cm);
- mprsas_set_ccbstatus(ccb, CAM_LUN_INVALID);
+ ccb->ccb_h.status = CAM_LUN_INVALID;
xpt_done(ccb);
return;
}
@@ -1928,7 +1904,7 @@ mprsas_action_scsiio(struct mprsas_softc *sassc, union ccb *ccb)
}
callout_reset_sbt(&cm->cm_callout, SBT_1MS * ccb->ccb_h.timeout, 0,
- mprsas_scsiio_timeout, cm, 0);
+ mprsas_scsiio_timeout, cm, 0);
targ->issued++;
targ->outstanding++;
@@ -2126,7 +2102,7 @@ mpr_sc_failed_io_info(struct mpr_softc *sc, struct ccb_scsiio *csio,
desc_scsi_state, scsi_state);
if (sc->mpr_debug & MPR_XINFO &&
- scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
+ scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
mpr_dprint(sc, MPR_XINFO, "-> Sense Buffer Data : Start :\n");
scsi_sense_print(csio);
mpr_dprint(sc, MPR_XINFO, "-> Sense Buffer Data : End :\n");
@@ -2150,8 +2126,6 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
u8 *TLR_bits, TLR_on;
int dir = 0, i;
u16 alloc_len;
- struct mprsas_target *target;
- target_id_t target_id;
MPR_FUNCTRACE(sc);
mpr_dprint(sc, MPR_TRACE,
@@ -2165,7 +2139,6 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
sassc = sc->sassc;
ccb = cm->cm_complete_data;
csio = &ccb->csio;
- target_id = csio->ccb_h.target_id;
rep = (MPI2_SCSI_IO_REPLY *)cm->cm_reply;
/*
* XXX KDM if the chain allocation fails, does it matter if we do
@@ -2224,7 +2197,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* because there can be no reply when we haven't actually
* gone out to the hardware.
*/
- mprsas_set_ccbstatus(ccb, CAM_REQUEUE_REQ);
+ ccb->ccb_h.status = CAM_REQUEUE_REQ;
/*
* Currently the only error included in the mask is
@@ -2241,7 +2214,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
xpt_freeze_simq(sassc->sim, 1);
sassc->flags |= MPRSAS_QUEUE_FROZEN;
mpr_dprint(sc, MPR_INFO, "Error sending command, "
- "freezing SIM queue\n");
+ "freezing SIM queue\n");
}
}
@@ -2251,7 +2224,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* commands that were sent. All SSU commands should be completed before
* shutdown completes, meaning SSU_refcount will be 0 after SSU_started
* is TRUE.
- */
+ */
if (sc->SSU_started && (csio->cdb_io.cdb_bytes[0] == START_STOP_UNIT)) {
mpr_dprint(sc, MPR_INFO, "Decrementing SSU count.\n");
sc->SSU_refcount--;
@@ -2259,12 +2232,12 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
/* Take the fast path to completion */
if (cm->cm_reply == NULL) {
- if (mprsas_get_ccbstatus(ccb) == CAM_REQ_INPROG) {
+ if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG) {
if ((sc->mpr_flags & MPR_FLAGS_DIAGRESET) != 0)
- mprsas_set_ccbstatus(ccb, CAM_SCSI_BUS_RESET);
+ ccb->ccb_h.status = CAM_SCSI_BUS_RESET;
else {
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
- csio->scsi_status = SCSI_STATUS_OK;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ ccb->csio.scsi_status = SCSI_STATUS_OK;
}
if (sassc->flags & MPRSAS_QUEUE_FROZEN) {
ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
@@ -2279,10 +2252,10 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* CAM_REQ_CMP. The first is if MPR_CM_FLAGS_ERROR_MASK is
* set, the second is in the MPR_FLAGS_DIAGRESET above.
*/
- if (mprsas_get_ccbstatus(ccb) != CAM_REQ_CMP) {
+ if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
/*
* Freeze the dev queue so that commands are
- * executed in the correct order after error
+ * executed in the correct order with after error
* recovery.
*/
ccb->ccb_h.status |= CAM_DEV_QFRZN;
@@ -2312,7 +2285,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
/* Completion failed at the transport level. */
if (rep->SCSIState & (MPI2_SCSI_STATE_NO_SCSI_STATUS |
MPI2_SCSI_STATE_TERMINATED)) {
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
break;
}
@@ -2321,7 +2294,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* recover the command.
*/
if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_FAILED) {
- mprsas_set_ccbstatus(ccb, CAM_AUTOSENSE_FAIL);
+ ccb->ccb_h.status = CAM_AUTOSENSE_FAIL;
break;
}
@@ -2333,7 +2306,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
if ((rep->SCSIState & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) &&
((le32toh(rep->ResponseInfo) & MPI2_SCSI_RI_MASK_REASONCODE)
== MPR_SCSI_RI_INVALID_FRAME)) {
- sc->mapping_table[target_id].TLR_bits =
+ sc->mapping_table[csio->ccb_h.target_id].TLR_bits =
(u8)MPI2_SCSIIO_CONTROL_NO_TLR;
}
@@ -2345,16 +2318,16 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
*/
if ((rep->SCSIStatus == MPI2_SCSI_STATUS_COMMAND_TERMINATED) ||
(rep->SCSIStatus == MPI2_SCSI_STATUS_TASK_ABORTED)) {
- mprsas_set_ccbstatus(ccb, CAM_REQ_ABORTED);
+ ccb->ccb_h.status = CAM_REQ_ABORTED;
break;
}
/* Handle normal status and sense */
csio->scsi_status = rep->SCSIStatus;
if (rep->SCSIStatus == MPI2_SCSI_STATUS_GOOD)
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ ccb->ccb_h.status = CAM_REQ_CMP;
else
- mprsas_set_ccbstatus(ccb, CAM_SCSI_STATUS_ERROR);
+ ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;
if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
int sense_len, returned_sense_len;
@@ -2389,11 +2362,12 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
(csio->data_ptr != NULL) &&
((csio->data_ptr[0] & 0x1f) == T_SEQUENTIAL) &&
(sc->control_TLR) &&
- (sc->mapping_table[target_id].device_info &
+ (sc->mapping_table[csio->ccb_h.target_id].device_info &
MPI2_SAS_DEVICE_INFO_SSP_TARGET)) {
vpd_list = (struct scsi_vpd_supported_page_list *)
csio->data_ptr;
- TLR_bits = &sc->mapping_table[target_id].TLR_bits;
+ TLR_bits = &sc->mapping_table[csio->ccb_h.target_id].
+ TLR_bits;
*TLR_bits = (u8)MPI2_SCSIIO_CONTROL_NO_TLR;
TLR_on = (u8)MPI2_SCSIIO_CONTROL_TLR_ON;
alloc_len = ((u16)csio->cdb_io.cdb_bytes[3] << 8) +
@@ -2406,24 +2380,6 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
}
}
}
-
- /*
- * If this is a SATA direct-access end device, mark it so that
- * a SCSI StartStopUnit command will be sent to it when the
- * driver is being shutdown.
- */
- if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) &&
- ((csio->data_ptr[0] & 0x1f) == T_DIRECT) &&
- (sc->mapping_table[target_id].device_info &
- MPI2_SAS_DEVICE_INFO_SATA_DEVICE) &&
- ((sc->mapping_table[target_id].device_info &
- MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) ==
- MPI2_SAS_DEVICE_INFO_END_DEVICE)) {
- target = &sassc->targets[target_id];
- target->supports_SSU = TRUE;
- mpr_dprint(sc, MPR_XINFO, "Target %d supports SSU\n",
- target_id);
- }
break;
case MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE:
case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
@@ -2434,13 +2390,13 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* failed.
*/
if (cm->cm_targ->devinfo == 0)
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ ccb->ccb_h.status = CAM_REQ_CMP;
else
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
break;
case MPI2_IOCSTATUS_INVALID_SGL:
mpr_print_scsiio_cmd(sc, cm);
- mprsas_set_ccbstatus(ccb, CAM_UNREC_HBA_ERROR);
+ ccb->ccb_h.status = CAM_UNREC_HBA_ERROR;
break;
case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED:
/*
@@ -2453,14 +2409,14 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* on the console.
*/
if (cm->cm_state == MPR_CM_STATE_TIMEDOUT)
- mprsas_set_ccbstatus(ccb, CAM_CMD_TIMEOUT);
+ ccb->ccb_h.status = CAM_CMD_TIMEOUT;
else
- mprsas_set_ccbstatus(ccb, CAM_REQ_ABORTED);
+ ccb->ccb_h.status = CAM_REQ_ABORTED;
break;
case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN:
/* resid is ignored for this condition */
csio->resid = 0;
- mprsas_set_ccbstatus(ccb, CAM_DATA_RUN_ERR);
+ ccb->ccb_h.status = CAM_DATA_RUN_ERR;
break;
case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED:
case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED:
@@ -2469,7 +2425,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* transient transport-related) errors, retry these without
* decrementing the retry count.
*/
- mprsas_set_ccbstatus(ccb, CAM_REQUEUE_REQ);
+ ccb->ccb_h.status = CAM_REQUEUE_REQ;
mprsas_log_command(cm, MPR_INFO,
"terminated ioc %x scsi %x state %x xfer %u\n",
le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
@@ -2491,7 +2447,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
le32toh(rep->TransferCount));
csio->resid = cm->cm_length;
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
break;
}
@@ -2504,7 +2460,7 @@ mprsas_scsiio_complete(struct mpr_softc *sc, struct mpr_command *cm)
"queue\n");
}
- if (mprsas_get_ccbstatus(ccb) != CAM_REQ_CMP) {
+ if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
ccb->ccb_h.status |= CAM_DEV_QFRZN;
xpt_freeze_devq(ccb->ccb_h.path, /*count*/ 1);
}
@@ -2531,16 +2487,16 @@ mprsas_smpio_complete(struct mpr_softc *sc, struct mpr_command *cm)
* in the standard request size.
*/
if ((cm->cm_flags & MPR_CM_FLAGS_ERROR_MASK) != 0) {
- mpr_dprint(sc, MPR_ERROR, "%s: cm_flags = %#x on SMP "
- "request!\n", __func__, cm->cm_flags);
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
+ mpr_dprint(sc, MPR_ERROR,"%s: cm_flags = %#x on SMP request!\n",
+ __func__, cm->cm_flags);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
}
rpl = (MPI2_SMP_PASSTHROUGH_REPLY *)cm->cm_reply;
if (rpl == NULL) {
mpr_dprint(sc, MPR_ERROR, "%s: NULL cm_reply!\n", __func__);
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
}
@@ -2553,17 +2509,17 @@ mprsas_smpio_complete(struct mpr_softc *sc, struct mpr_command *cm)
rpl->SASStatus != MPI2_SASSTATUS_SUCCESS) {
mpr_dprint(sc, MPR_XINFO, "%s: IOCStatus %04x SASStatus %02x\n",
__func__, le16toh(rpl->IOCStatus), rpl->SASStatus);
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
}
- mpr_dprint(sc, MPR_XINFO, "%s: SMP request to SAS address %#jx "
- "completed successfully\n", __func__, (uintmax_t)sasaddr);
+ mpr_dprint(sc, MPR_XINFO, "%s: SMP request to SAS address "
+ "%#jx completed successfully\n", __func__, (uintmax_t)sasaddr);
if (ccb->smpio.smp_response[2] == SMP_FR_ACCEPTED)
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ ccb->ccb_h.status = CAM_REQ_CMP;
else
- mprsas_set_ccbstatus(ccb, CAM_SMP_STATUS_ERROR);
+ ccb->ccb_h.status = CAM_SMP_STATUS_ERROR;
bailout:
/*
@@ -2602,7 +2558,7 @@ mprsas_send_smpcmd(struct mprsas_softc *sassc, union ccb *ccb,
*/
mpr_dprint(sc, MPR_ERROR, "%s: physical addresses not "
"supported\n", __func__);
- mprsas_set_ccbstatus(ccb, CAM_REQ_INVALID);
+ ccb->ccb_h.status = CAM_REQ_INVALID;
xpt_done(ccb);
return;
case CAM_DATA_SG:
@@ -2615,7 +2571,7 @@ mprsas_send_smpcmd(struct mprsas_softc *sassc, union ccb *ccb,
mpr_dprint(sc, MPR_ERROR,
"%s: multiple request or response buffer segments "
"not supported for SMP\n", __func__);
- mprsas_set_ccbstatus(ccb, CAM_REQ_INVALID);
+ ccb->ccb_h.status = CAM_REQ_INVALID;
xpt_done(ccb);
return;
}
@@ -2649,7 +2605,7 @@ mprsas_send_smpcmd(struct mprsas_softc *sassc, union ccb *ccb,
response = ccb->smpio.smp_response;
break;
default:
- mprsas_set_ccbstatus(ccb, CAM_REQ_INVALID);
+ ccb->ccb_h.status = CAM_REQ_INVALID;
xpt_done(ccb);
return;
}
@@ -2658,9 +2614,9 @@ mprsas_send_smpcmd(struct mprsas_softc *sassc, union ccb *ccb,
* XXX We don't yet support physical addresses here.
*/
if (ccb->ccb_h.flags & (CAM_DATA_PHYS|CAM_SG_LIST_PHYS)) {
- mpr_dprint(sc, MPR_ERROR, "%s: physical addresses not "
- "supported\n", __func__);
- mprsas_set_ccbstatus(ccb, CAM_REQ_INVALID);
+ mpr_printf(sc, "%s: physical addresses not supported\n",
+ __func__);
+ ccb->ccb_h.status = CAM_REQ_INVALID;
xpt_done(ccb);
return;
}
@@ -2679,7 +2635,7 @@ mprsas_send_smpcmd(struct mprsas_softc *sassc, union ccb *ccb,
mpr_dprint(sc, MPR_ERROR, "%s: multiple request or "
"response buffer segments not supported for SMP\n",
__func__);
- mprsas_set_ccbstatus(ccb, CAM_REQ_INVALID);
+ ccb->ccb_h.status = CAM_REQ_INVALID;
xpt_done(ccb);
return;
}
@@ -2717,7 +2673,7 @@ mprsas_send_smpcmd(struct mprsas_softc *sassc, union ccb *ccb,
if (cm == NULL) {
mpr_dprint(sc, MPR_ERROR,
"%s: cannot allocate command\n", __func__);
- mprsas_set_ccbstatus(ccb, CAM_RESRC_UNAVAIL);
+ ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
xpt_done(ccb);
return;
}
@@ -2804,7 +2760,7 @@ mprsas_send_smpcmd(struct mprsas_softc *sassc, union ccb *ccb,
bailout_error:
mpr_free_command(sc, cm);
- mprsas_set_ccbstatus(ccb, CAM_RESRC_UNAVAIL);
+ ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
xpt_done(ccb);
return;
}
@@ -2827,7 +2783,7 @@ mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb)
if (targ->handle == 0x0) {
mpr_dprint(sc, MPR_ERROR, "%s: target %d does not exist!\n",
__func__, ccb->ccb_h.target_id);
- mprsas_set_ccbstatus(ccb, CAM_SEL_TIMEOUT);
+ ccb->ccb_h.status = CAM_SEL_TIMEOUT;
xpt_done(ccb);
return;
}
@@ -2875,7 +2831,7 @@ mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb)
if (targ->parent_handle == 0x0) {
mpr_dprint(sc, MPR_ERROR, "%s: handle %d does not have "
"a valid parent handle!\n", __func__, targ->handle);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
goto bailout;
}
#ifdef OLD_MPR_PROBE
@@ -2885,7 +2841,7 @@ mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb)
if (parent_target == NULL) {
mpr_dprint(sc, MPR_ERROR, "%s: handle %d does not have "
"a valid parent target!\n", __func__, targ->handle);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
goto bailout;
}
@@ -2894,8 +2850,9 @@ mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb)
mpr_dprint(sc, MPR_ERROR, "%s: handle %d parent %d "
"does not have an SMP target!\n", __func__,
targ->handle, parent_target->handle);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
goto bailout;
+
}
sasaddr = parent_target->sasaddr;
@@ -2905,7 +2862,7 @@ mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb)
mpr_dprint(sc, MPR_ERROR, "%s: handle %d parent %d "
"does not have an SMP target!\n", __func__,
targ->handle, targ->parent_handle);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
goto bailout;
}
@@ -2913,7 +2870,7 @@ mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb)
mpr_dprint(sc, MPR_ERROR, "%s: handle %d parent handle "
"%d does not have a valid SAS address!\n", __func__,
targ->handle, targ->parent_handle);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
goto bailout;
}
@@ -2925,7 +2882,7 @@ mprsas_action_smpio(struct mprsas_softc *sassc, union ccb *ccb)
if (sasaddr == 0) {
mpr_dprint(sc, MPR_INFO, "%s: unable to find SAS address for "
"handle %d\n", __func__, targ->handle);
- mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
+ ccb->ccb_h.status = CAM_DEV_NOT_THERE;
goto bailout;
}
mprsas_send_smpcmd(sassc, ccb, sasaddr);
@@ -2957,7 +2914,7 @@ mprsas_action_resetdev(struct mprsas_softc *sassc, union ccb *ccb)
if (tm == NULL) {
mpr_dprint(sc, MPR_ERROR,
"command alloc failure in mprsas_action_resetdev\n");
- mprsas_set_ccbstatus(ccb, CAM_RESRC_UNAVAIL);
+ ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
xpt_done(ccb);
return;
}
@@ -2976,12 +2933,7 @@ mprsas_action_resetdev(struct mprsas_softc *sassc, union ccb *ccb)
MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
tm->cm_complete = mprsas_resetdev_complete;
tm->cm_complete_data = ccb;
-
- mpr_dprint(sc, MPR_INFO, "%s: Sending reset for target ID %d\n",
- __func__, targ->tid);
tm->cm_targ = targ;
- targ->flags |= MPRSAS_TARGET_INRESET;
-
mpr_map_command(sc, tm);
}
@@ -3010,7 +2962,7 @@ mprsas_resetdev_complete(struct mpr_softc *sc, struct mpr_command *tm)
mpr_dprint(sc, MPR_ERROR, "%s: cm_flags = %#x for reset of "
"handle %#04x! This should not happen!\n", __func__,
tm->cm_flags, req->DevHandle);
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
goto bailout;
}
@@ -3019,12 +2971,12 @@ mprsas_resetdev_complete(struct mpr_softc *sc, struct mpr_command *tm)
le16toh(resp->IOCStatus), le32toh(resp->ResponseCode));
if (le32toh(resp->ResponseCode) == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) {
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP);
+ ccb->ccb_h.status = CAM_REQ_CMP;
mprsas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid,
CAM_LUN_WILDCARD);
}
else
- mprsas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
bailout:
@@ -3043,8 +2995,7 @@ mprsas_poll(struct cam_sim *sim)
/* frequent debug messages during a panic just slow
* everything down too much.
*/
- mpr_dprint(sassc->sc, MPR_XINFO, "%s clearing MPR_TRACE\n",
- __func__);
+ mpr_printf(sassc->sc, "%s clearing MPR_TRACE\n", __func__);
sassc->sc->mpr_debug &= ~MPR_TRACE;
}
@@ -3143,7 +3094,7 @@ mprsas_async(void *callback_arg, uint32_t code, struct cam_path *path,
if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0)
cam_release_devq(cdai.ccb_h.path, 0, 0, 0, FALSE);
- if ((mprsas_get_ccbstatus((union ccb *)&cdai) == CAM_REQ_CMP)
+ if (((cdai.ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP)
&& (rcap_buf.prot & SRC16_PROT_EN)) {
lun->eedp_formatted = TRUE;
lun->eedp_block_size = scsi_4btoul(rcap_buf.length);
@@ -3170,6 +3121,8 @@ mprsas_async(void *callback_arg, uint32_t code, struct cam_path *path,
#endif
cgd = arg;
+ mprsas_prepare_ssu(sc, path, cgd);
+
#if (__FreeBSD_version < 901503) || \
((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006))
mprsas_check_eedp(sc, path, cgd);
@@ -3181,6 +3134,64 @@ mprsas_async(void *callback_arg, uint32_t code, struct cam_path *path,
}
}
+static void
+mprsas_prepare_ssu(struct mpr_softc *sc, struct cam_path *path,
+ struct ccb_getdev *cgd)
+{
+ struct mprsas_softc *sassc = sc->sassc;
+ path_id_t pathid;
+ target_id_t targetid;
+ lun_id_t lunid;
+ struct mprsas_target *target;
+ struct mprsas_lun *lun;
+ uint8_t found_lun;
+
+ sassc = sc->sassc;
+ pathid = cam_sim_path(sassc->sim);
+ targetid = xpt_path_target_id(path);
+ lunid = xpt_path_lun_id(path);
+
+ KASSERT(targetid < sassc->maxtargets,
+ ("Target %d out of bounds in mprsas_prepare_ssu\n", targetid));
+ target = &sassc->targets[targetid];
+ if (target->handle == 0x0)
+ return;
+
+ /*
+ * If LUN is already in list, don't create a new one.
+ */
+ found_lun = FALSE;
+ SLIST_FOREACH(lun, &target->luns, lun_link) {
+ if (lun->lun_id == lunid) {
+ found_lun = TRUE;
+ break;
+ }
+ }
+ if (!found_lun) {
+ lun = malloc(sizeof(struct mprsas_lun), M_MPR,
+ M_NOWAIT | M_ZERO);
+ if (lun == NULL) {
+ mpr_dprint(sc, MPR_ERROR, "Unable to alloc LUN for "
+ "preparing SSU.\n");
+ return;
+ }
+ lun->lun_id = lunid;
+ SLIST_INSERT_HEAD(&target->luns, lun, lun_link);
+ }
+
+ /*
+ * If this is a SATA direct-access end device, mark it so that a SCSI
+ * StartStopUnit command will be sent to it when the driver is being
+ * shutdown.
+ */
+ if (((cgd->inq_data.device & 0x1F) == T_DIRECT) &&
+ (target->devinfo & MPI2_SAS_DEVICE_INFO_SATA_DEVICE) &&
+ ((target->devinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) ==
+ MPI2_SAS_DEVICE_INFO_END_DEVICE)) {
+ lun->stop_at_shutdown = TRUE;
+ }
+}
+
#if (__FreeBSD_version < 901503) || \
((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006))
static void
@@ -3201,6 +3212,7 @@ mprsas_check_eedp(struct mpr_softc *sc, struct cam_path *path,
uint8_t found_lun;
char path_str[64];
+ sassc = sc->sassc;
pathid = cam_sim_path(sassc->sim);
targetid = xpt_path_target_id(path);
lunid = xpt_path_lun_id(path);
@@ -3276,7 +3288,7 @@ mprsas_check_eedp(struct mpr_softc *sc, struct cam_path *path,
rcap_buf = malloc(sizeof(struct scsi_read_capacity_eedp), M_MPR,
M_NOWAIT | M_ZERO);
if (rcap_buf == NULL) {
- mpr_dprint(sc, MPR_ERROR, "Unable to alloc read capacity "
+ mpr_dprint(sc, MPR_FAULT, "Unable to alloc read capacity "
"buffer for EEDP support.\n");
xpt_free_path(ccb->ccb_h.path);
xpt_free_ccb(ccb);
@@ -3329,7 +3341,7 @@ mprsas_read_cap_done(struct cam_periph *periph, union ccb *done_ccb)
xpt_release_devq(done_ccb->ccb_h.path,
/*count*/ 1, /*run_queue*/TRUE);
}
-
+
rcap_buf = (struct scsi_read_capacity_eedp *)done_ccb->csio.data_ptr;
/*
@@ -3347,21 +3359,21 @@ mprsas_read_cap_done(struct cam_periph *periph, union ccb *done_ccb)
/*
* Got the LUN in the target's LUN list. Fill it in with EEDP
- * info. If the READ CAP 16 command had some SCSI error (common
+ * info. If the READ CAP 16 command had some SCSI error (common
* if command is not supported), mark the lun as not supporting
* EEDP and set the block size to 0.
*/
- if ((mprsas_get_ccbstatus(done_ccb) != CAM_REQ_CMP) ||
- (done_ccb->csio.scsi_status != SCSI_STATUS_OK)) {
+ if (((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
+ || (done_ccb->csio.scsi_status != SCSI_STATUS_OK)) {
lun->eedp_formatted = FALSE;
lun->eedp_block_size = 0;
break;
}
if (rcap_buf->protect & 0x01) {
- mpr_dprint(sassc->sc, MPR_INFO, "LUN %d for target ID "
- "%d is formatted for EEDP support.\n",
- done_ccb->ccb_h.target_lun,
+ mpr_dprint(sassc->sc, MPR_INFO, "LUN %d for "
+ "target ID %d is formatted for EEDP "
+ "support.\n", done_ccb->ccb_h.target_lun,
done_ccb->ccb_h.target_id);
lun->eedp_formatted = TRUE;
lun->eedp_block_size = scsi_4btoul(rcap_buf->length);
@@ -3377,34 +3389,6 @@ mprsas_read_cap_done(struct cam_periph *periph, union ccb *done_ccb)
#endif /* (__FreeBSD_version < 901503) || \
((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006)) */
-void
-mprsas_prepare_for_tm(struct mpr_softc *sc, struct mpr_command *tm,
- struct mprsas_target *target, lun_id_t lun_id)
-{
- union ccb *ccb;
- path_id_t path_id;
-
- /*
- * Set the INRESET flag for this target so that no I/O will be sent to
- * the target until the reset has completed. If an I/O request does
- * happen, the devq will be frozen. The CCB holds the path which is
- * used to release the devq. The devq is released and the CCB is freed
- * when the TM completes.
- */
- ccb = xpt_alloc_ccb_nowait();
- if (ccb) {
- path_id = cam_sim_path(sc->sassc->sim);
- if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, path_id,
- target->tid, lun_id) != CAM_REQ_CMP) {
- xpt_free_ccb(ccb);
- } else {
- tm->cm_ccb = ccb;
- tm->cm_targ = target;
- target->flags |= MPRSAS_TARGET_INRESET;
- }
- }
-}
-
int
mprsas_startup(struct mpr_softc *sc)
{
@@ -3505,33 +3489,3 @@ mprsas_check_id(struct mprsas_softc *sassc, int id)
return (0);
}
-
-void
-mprsas_realloc_targets(struct mpr_softc *sc, int maxtargets)
-{
- struct mprsas_softc *sassc;
- struct mprsas_lun *lun, *lun_tmp;
- struct mprsas_target *targ;
- int i;
-
- sassc = sc->sassc;
- /*
- * 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< maxtargets; i++) {
- targ = &sassc->targets[i];
- SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) {
- free(lun, M_MPR);
- }
- }
- free(sassc->targets, M_MPR);
-
- sassc->targets = malloc(sizeof(struct mprsas_target) * maxtargets,
- M_MPR, M_WAITOK|M_ZERO);
- if (!sassc->targets) {
- panic("%s failed to alloc targets with error %d\n",
- __func__, ENOMEM);
- }
-}
diff --git a/sys/dev/mpr/mpr_sas.h b/sys/dev/mpr/mpr_sas.h
index ebeed30..9d3116a 100644
--- a/sys/dev/mpr/mpr_sas.h
+++ b/sys/dev/mpr/mpr_sas.h
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
@@ -36,6 +35,7 @@ struct mprsas_lun {
lun_id_t lun_id;
uint8_t eedp_formatted;
uint32_t eedp_block_size;
+ uint8_t stop_at_shutdown;
};
struct mprsas_target {
@@ -55,10 +55,11 @@ struct mprsas_target {
#define MPRSAS_TARGET_INREMOVAL (1 << 3)
#define MPR_TARGET_FLAGS_RAID_COMPONENT (1 << 4)
#define MPR_TARGET_FLAGS_VOLUME (1 << 5)
-#define MPR_TARGET_IS_SATA_SSD (1 << 6)
#define MPRSAS_TARGET_INRECOVERY (MPRSAS_TARGET_INABORT | \
MPRSAS_TARGET_INRESET | MPRSAS_TARGET_INCHIPRESET)
+#define MPRSAS_TARGET_ADD (1 << 29)
+#define MPRSAS_TARGET_REMOVE (1 << 30)
uint16_t tid;
SLIST_HEAD(, mprsas_lun) luns;
TAILQ_HEAD(, mpr_command) commands;
@@ -81,8 +82,6 @@ struct mprsas_target {
unsigned int logical_unit_resets;
unsigned int target_resets;
uint8_t scsi_req_desc_type;
- uint8_t stop_at_shutdown;
- uint8_t supports_SSU;
};
struct mprsas_softc {
@@ -93,6 +92,7 @@ struct mprsas_softc {
#define MPRSAS_DISCOVERY_TIMEOUT_PENDING (1 << 2)
#define MPRSAS_QUEUE_FROZEN (1 << 3)
#define MPRSAS_SHUTDOWN (1 << 4)
+#define MPRSAS_SCANTHREAD (1 << 5)
u_int maxtargets;
struct mprsas_target *targets;
struct cam_devq *devq;
@@ -103,6 +103,7 @@ struct mprsas_softc {
struct mpr_event_handle *mprsas_eh;
u_int startup_refcount;
+ u_int tm_count;
struct proc *sysctl_proc;
struct taskqueue *ev_tq;
@@ -149,19 +150,6 @@ mprsas_set_lun(uint8_t *lun, u_int ccblun)
return (0);
}
-static __inline void
-mprsas_set_ccbstatus(union ccb *ccb, int status)
-{
- ccb->ccb_h.status &= ~CAM_STATUS_MASK;
- ccb->ccb_h.status |= status;
-}
-
-static __inline int
-mprsas_get_ccbstatus(union ccb *ccb)
-{
- return (ccb->ccb_h.status & CAM_STATUS_MASK);
-}
-
#define MPR_SET_SINGLE_LUN(req, lun) \
do { \
bzero((req)->LUN, 8); \
@@ -170,10 +158,11 @@ do { \
void mprsas_rescan_target(struct mpr_softc *sc, struct mprsas_target *targ);
void mprsas_discovery_end(struct mprsas_softc *sassc);
-void mprsas_prepare_for_tm(struct mpr_softc *sc, struct mpr_command *tm,
- struct mprsas_target *target, lun_id_t lun_id);
void mprsas_startup_increment(struct mprsas_softc *sassc);
void mprsas_startup_decrement(struct mprsas_softc *sassc);
+void mprsas_release_simq_reinit(struct mprsas_softc *sassc);
+struct mpr_command * mprsas_alloc_tm(struct mpr_softc *sc);
+void mprsas_free_tm(struct mpr_softc *sc, struct mpr_command *tm);
void mprsas_firmware_event_work(void *arg, int pending);
int mprsas_check_id(struct mprsas_softc *sassc, int id);
diff --git a/sys/dev/mpr/mpr_sas_lsi.c b/sys/dev/mpr/mpr_sas_lsi.c
index 7d6ef70..32e9b3a 100644
--- a/sys/dev/mpr/mpr_sas_lsi.c
+++ b/sys/dev/mpr/mpr_sas_lsi.c
@@ -1,6 +1,5 @@
/*-
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,13 +23,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-/* Communications core for LSI MPT3 */
+/* Communications core for LSI MPT2 */
/* TODO Move headers to mprvar */
#include <sys/types.h>
@@ -106,9 +105,7 @@ struct _ata_identify_device_data {
u16 serial_number[10]; /* 10-19 */
u16 reserved2[7]; /* 20-26 */
u16 model_number[20]; /* 27-46*/
- u16 reserved3[170]; /* 47-216 */
- u16 rotational_speed; /* 217 */
- u16 reserved4[38]; /* 218-255 */
+ u16 reserved3[209]; /* 47-255*/
};
static u32 event_count;
static void mprsas_fw_work(struct mpr_softc *sc,
@@ -119,9 +116,8 @@ static int mprsas_add_device(struct mpr_softc *sc, u16 handle, u8 linkrate);
static int mprsas_get_sata_identify(struct mpr_softc *sc, u16 handle,
Mpi2SataPassthroughReply_t *mpi_reply, char *id_buffer, int sz,
u32 devinfo);
-static void mprsas_ata_id_timeout(void *data);
int mprsas_get_sas_address_for_sata_disk(struct mpr_softc *sc,
- u64 *sas_address, u16 handle, u32 device_info, u8 *is_SATA_SSD);
+ u64 *sas_address, u16 handle, u32 device_info);
static int mprsas_volume_add(struct mpr_softc *sc,
u16 handle);
static void mprsas_SSU_to_SATA_devices(struct mpr_softc *sc);
@@ -329,7 +325,7 @@ mprsas_fw_work(struct mpr_softc *sc, struct mpr_fw_event_work *fw_event)
return;
}
- mpr_dprint(sc, MPR_EVENT, "Sending FP action "
+ mpr_dprint(sc, MPR_INFO, "Sending FP action "
"from "
"MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST "
":\n");
@@ -354,9 +350,9 @@ mprsas_fw_work(struct mpr_softc *sc, struct mpr_fw_event_work *fw_event)
if (reply && (le16toh(reply->IOCStatus) &
MPI2_IOCSTATUS_MASK) !=
MPI2_IOCSTATUS_SUCCESS) {
- mpr_dprint(sc, MPR_ERROR, "%s: error "
- "sending RaidActionPage; "
- "iocstatus = 0x%x\n", __func__,
+ mpr_dprint(sc, MPR_INFO, "%s: error "
+ "sending RaidActionPage; iocstatus "
+ "= 0x%x\n", __func__,
le16toh(reply->IOCStatus));
}
@@ -364,7 +360,7 @@ mprsas_fw_work(struct mpr_softc *sc, struct mpr_fw_event_work *fw_event)
mpr_free_command(sc, cm);
}
skip_fp_send:
- mpr_dprint(sc, MPR_EVENT, "Received "
+ mpr_dprint(sc, MPR_INFO, "Received "
"MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST Reason "
"code %x:\n", element->ReasonCode);
switch (element->ReasonCode) {
@@ -425,6 +421,7 @@ skip_fp_send:
break;
targ->flags |= MPR_TARGET_FLAGS_RAID_COMPONENT;
mprsas_rescan_target(sc, targ);
+
break;
case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED:
/*
@@ -681,13 +678,14 @@ mprsas_add_device(struct mpr_softc *sc, u16 handle, u8 linkrate){
struct mprsas_target *targ;
Mpi2ConfigReply_t mpi_reply;
Mpi2SasDevicePage0_t config_page;
- uint64_t sas_address, parent_sas_address = 0;
+ uint64_t sas_address, sata_sas_address;
+ uint64_t parent_sas_address = 0;
+ u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags);
u32 device_info, parent_devinfo = 0;
unsigned int id;
- int ret = 1, error = 0, i;
+ int ret;
+ int error = 0;
struct mprsas_lun *lun;
- u8 is_SATA_SSD = 0;
- struct mpr_command *cm;
sassc = sc->sassc;
mprsas_startup_increment(sassc);
@@ -719,29 +717,26 @@ mprsas_add_device(struct mpr_softc *sc, u16 handle, u8 linkrate){
}
/* TODO Check proper endianess */
sas_address = config_page.SASAddress.High;
- sas_address = (sas_address << 32) | config_page.SASAddress.Low;
- mpr_dprint(sc, MPR_INFO, "SAS Address from SAS device page0 = %jx\n",
- sas_address);
-
- /*
- * 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.
- */
- if (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE) {
- ret = mprsas_get_sas_address_for_sata_disk(sc, &sas_address,
- handle, device_info, &is_SATA_SSD);
- if (ret) {
- mpr_dprint(sc, MPR_ERROR, "%s: failed to get disk type "
- "(SSD or HDD) for SATA device with handle 0x%04x\n",
- __func__, handle);
- } else {
- mpr_dprint(sc, MPR_INFO, "SAS Address from SATA "
- "device = %jx\n", sas_address);
- }
- }
+ sas_address = (sas_address << 32) |
+ config_page.SASAddress.Low;
+
+ if ((ioc_pg8_flags & MPI2_IOCPAGE8_FLAGS_MASK_MAPPING_MODE)
+ == MPI2_IOCPAGE8_FLAGS_DEVICE_PERSISTENCE_MAPPING) {
+ if (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE) {
+ ret = mprsas_get_sas_address_for_sata_disk(sc,
+ &sata_sas_address, handle, device_info);
+ if (!ret)
+ id = mpr_mapping_get_sas_id(sc,
+ sata_sas_address, handle);
+ else
+ id = mpr_mapping_get_sas_id(sc,
+ sas_address, handle);
+ } else
+ id = mpr_mapping_get_sas_id(sc, sas_address,
+ handle);
+ } else
+ id = mpr_mapping_get_sas_id(sc, sas_address, handle);
- id = mpr_mapping_get_sas_id(sc, sas_address, handle);
if (id == MPR_MAP_BAD_ID) {
printf("failure at %s:%d/%s()! Could not get ID for device "
"with handle 0x%04x\n", __FILE__, __LINE__, __func__,
@@ -755,7 +750,7 @@ mprsas_add_device(struct mpr_softc *sc, u16 handle, u8 linkrate){
error = ENXIO;
goto out;
}
-
+
mpr_dprint(sc, MPR_MAPPING, "SAS Address from SAS device page0 = %jx\n",
sas_address);
targ = &sassc->targets[id];
@@ -778,9 +773,6 @@ mprsas_add_device(struct mpr_softc *sc, u16 handle, u8 linkrate){
targ->tid = id;
targ->linkrate = (linkrate>>4);
targ->flags = 0;
- if (is_SATA_SSD) {
- targ->flags = MPR_TARGET_IS_SATA_SSD;
- }
if (le16toh(config_page.Flags) &
MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE) {
targ->scsi_req_desc_type =
@@ -800,12 +792,12 @@ mprsas_add_device(struct mpr_softc *sc, u16 handle, u8 linkrate){
SLIST_INIT(&targ->luns);
mpr_describe_devinfo(targ->devinfo, devstring, 80);
- mpr_dprint(sc, (MPR_INFO|MPR_MAPPING), "Found device <%s> <%s> "
+ mpr_dprint(sc, (MPR_XINFO|MPR_MAPPING), "Found device <%s> <%s> "
"handle<0x%04x> enclosureHandle<0x%04x> slot %d\n", devstring,
mpr_describe_table(mpr_linkrate_names, targ->linkrate),
targ->handle, targ->encl_handle, targ->encl_slot);
if (targ->encl_level_valid) {
- mpr_dprint(sc, (MPR_INFO|MPR_MAPPING), "At enclosure level %d "
+ mpr_dprint(sc, (MPR_XINFO|MPR_MAPPING), "At enclosure level %d "
"and connector name (%4s)\n", targ->encl_level,
targ->connector_name);
}
@@ -815,57 +807,15 @@ mprsas_add_device(struct mpr_softc *sc, u16 handle, u8 linkrate){
#endif
mprsas_rescan_target(sc, targ);
mpr_dprint(sc, MPR_MAPPING, "Target id 0x%x added\n", targ->tid);
-
- /*
- * Check all commands to see if the SATA_ID_TIMEOUT flag has been set.
- * If so, send a Target Reset TM to the target that was just created.
- * An Abort Task TM should be used instead of a Target Reset, but that
- * would be much more difficult because targets have not been fully
- * discovered yet, and LUN's haven't been setup. So, just reset the
- * target instead of the LUN.
- */
- for (i = 1; i < sc->num_reqs; i++) {
- cm = &sc->commands[i];
- if (cm->cm_flags & MPR_CM_FLAGS_SATA_ID_TIMEOUT) {
- targ->timeouts++;
- cm->cm_state = MPR_CM_STATE_TIMEDOUT;
-
- if ((targ->tm = mprsas_alloc_tm(sc)) != NULL) {
- mpr_dprint(sc, MPR_INFO, "%s: sending Target "
- "Reset for stuck SATA identify command "
- "(cm = %p)\n", __func__, cm);
- targ->tm->cm_targ = targ;
- mprsas_send_reset(sc, targ->tm,
- MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET);
- } else {
- mpr_dprint(sc, MPR_ERROR, "Failed to allocate "
- "tm for Target Reset after SATA ID "
- "command timed out (cm %p)\n", cm);
- }
- /*
- * No need to check for more since the target is
- * already being reset.
- */
- break;
- }
- }
out:
- /*
- * Free the commands that may not have been freed from the SATA ID call
- */
- for (i = 1; i < sc->num_reqs; i++) {
- cm = &sc->commands[i];
- if (cm->cm_flags & MPR_CM_FLAGS_SATA_ID_TIMEOUT) {
- mpr_free_command(sc, cm);
- }
- }
mprsas_startup_decrement(sassc);
return (error);
+
}
int
mprsas_get_sas_address_for_sata_disk(struct mpr_softc *sc,
- u64 *sas_address, u16 handle, u32 device_info, u8 *is_SATA_SSD)
+ u64 *sas_address, u16 handle, u32 device_info)
{
Mpi2SataPassthroughReply_t mpi_reply;
int i, rc, try_count;
@@ -885,16 +835,7 @@ mprsas_get_sas_address_for_sata_disk(struct mpr_softc *sc,
ioc_status = le16toh(mpi_reply.IOCStatus)
& MPI2_IOCSTATUS_MASK;
sas_status = mpi_reply.SASStatus;
- if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
- if (sc->spinup_wait_time > 0) {
- mpr_dprint(sc, MPR_INFO, "Sleeping %d seconds "
- "after SATA ID error to wait for spinup\n",
- sc->spinup_wait_time);
- msleep(&sc->msleep_fake_chan, &sc->mpr_mtx, 0,
- "mprid", sc->spinup_wait_time * hz);
- }
- }
- } while (((rc && (rc != EWOULDBLOCK)) || ioc_status || sas_status) &&
+ } while ((rc == -EAGAIN || ioc_status || sas_status) &&
(try_count < 5));
if (rc == 0 && !ioc_status && !sas_status) {
@@ -943,10 +884,6 @@ mprsas_get_sas_address_for_sata_disk(struct mpr_softc *sc,
(u64)hash_address.wwid[3] << 32 | (u64)hash_address.wwid[4] << 24 |
(u64)hash_address.wwid[5] << 16 | (u64)hash_address.wwid[6] << 8 |
(u64)hash_address.wwid[7];
- if (ata_identify.rotational_speed == 1) {
- *is_SATA_SSD = 1;
- }
-
return 0;
}
@@ -986,29 +923,14 @@ mprsas_get_sata_identify(struct mpr_softc *sc, u16 handle,
cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
cm->cm_data = buffer;
cm->cm_length = htole32(sz);
-
- /*
- * Start a timeout counter specifically for the SATA ID command. This
- * is used to fix a problem where the FW does not send a reply sometimes
- * when a bad disk is in the topology. So, this is used to timeout the
- * command so that processing can continue normally.
- */
- mpr_dprint(sc, MPR_XINFO, "%s start timeout counter for SATA ID "
- "command\n", __func__);
- callout_reset(&cm->cm_callout, MPR_ATA_ID_TIMEOUT * hz,
- mprsas_ata_id_timeout, cm);
error = mpr_wait_command(sc, cm, 60, CAN_SLEEP);
- mpr_dprint(sc, MPR_XINFO, "%s stop timeout counter for SATA ID "
- "command\n", __func__);
- callout_stop(&cm->cm_callout);
-
reply = (Mpi2SataPassthroughReply_t *)cm->cm_reply;
if (error || (reply == NULL)) {
/* FIXME */
/*
* If the request returns an error then we need to do a diag
* reset
- */
+ */
printf("%s: request for page completed with error %d",
__func__, error);
error = ENXIO;
@@ -1024,66 +946,11 @@ mprsas_get_sata_identify(struct mpr_softc *sc, u16 handle,
goto out;
}
out:
- /*
- * If the SATA_ID_TIMEOUT flag has been set for this command, don't free
- * it. The command will be freed after sending a target reset TM. If
- * the command did timeout, use EWOULDBLOCK.
- */
- if ((cm->cm_flags & MPR_CM_FLAGS_SATA_ID_TIMEOUT) == 0)
- mpr_free_command(sc, cm);
- else if (error == 0)
- error = EWOULDBLOCK;
- free(buffer, M_MPR);
+ mpr_free_command(sc, cm);
+ free(buffer, M_MPR);
return (error);
}
-static void
-mprsas_ata_id_timeout(void *data)
-{
- struct mpr_softc *sc;
- struct mpr_command *cm;
-
- cm = (struct mpr_command *)data;
- sc = cm->cm_sc;
- mtx_assert(&sc->mpr_mtx, MA_OWNED);
-
- mpr_dprint(sc, MPR_INFO, "%s checking ATA ID command %p sc %p\n",
- __func__, cm, sc);
- if ((callout_pending(&cm->cm_callout)) ||
- (!callout_active(&cm->cm_callout))) {
- mpr_dprint(sc, MPR_INFO, "%s ATA ID command almost timed "
- "out\n", __func__);
- return;
- }
- callout_deactivate(&cm->cm_callout);
-
- /*
- * Run the interrupt handler to make sure it's not pending. This
- * isn't perfect because the command could have already completed
- * and been re-used, though this is unlikely.
- */
- mpr_intr_locked(sc);
- if (cm->cm_state == MPR_CM_STATE_FREE) {
- mpr_dprint(sc, MPR_INFO, "%s ATA ID command almost timed "
- "out\n", __func__);
- return;
- }
-
- mpr_dprint(sc, MPR_INFO, "ATA ID command timeout cm %p\n", cm);
-
- /*
- * Send wakeup() to the sleeping thread that issued this ATA ID
- * command. wakeup() will cause msleep to return a 0 (not EWOULDBLOCK),
- * and this will keep reinit() from being called. This way, an Abort
- * Task TM can be issued so that the timed out command can be cleared.
- * The Abort Task cannot be sent from here because the driver has not
- * completed setting up targets. Instead, the command is flagged so
- * that special handling will be used to send the abort.
- */
- cm->cm_flags |= MPR_CM_FLAGS_SATA_ID_TIMEOUT;
- wakeup(cm);
-}
-
static int
mprsas_volume_add(struct mpr_softc *sc, u16 handle)
{
@@ -1157,13 +1024,15 @@ mprsas_SSU_to_SATA_devices(struct mpr_softc *sc)
path_id_t pathid = cam_sim_path(sassc->sim);
target_id_t targetid;
struct mprsas_target *target;
+ struct mprsas_lun *lun;
char path_str[64];
struct timeval cur_time, start_time;
mpr_lock(sc);
/*
- * For each target, issue a StartStopUnit command to stop the device.
+ * For each LUN of each target, issue a StartStopUnit command to stop
+ * the device.
*/
sc->SSU_started = TRUE;
sc->SSU_refcount = 0;
@@ -1173,52 +1042,59 @@ mprsas_SSU_to_SATA_devices(struct mpr_softc *sc)
continue;
}
- ccb = xpt_alloc_ccb_nowait();
- if (ccb == NULL) {
- mpr_dprint(sc, MPR_FAULT, "Unable to alloc CCB to stop "
- "unit.\n");
- return;
- }
-
- /*
- * The stop_at_shutdown flag will be set if this device is
- * a SATA direct-access end device.
- */
- if (target->stop_at_shutdown) {
- if (xpt_create_path(&ccb->ccb_h.path, xpt_periph,
- pathid, targetid, CAM_LUN_WILDCARD) !=
- CAM_REQ_CMP) {
- mpr_dprint(sc, MPR_ERROR, "Unable to create "
- "path to stop unit.\n");
- xpt_free_ccb(ccb);
+ SLIST_FOREACH(lun, &target->luns, lun_link) {
+ ccb = xpt_alloc_ccb_nowait();
+ if (ccb == NULL) {
+ mpr_unlock(sc);
+ mpr_dprint(sc, MPR_FAULT, "Unable to alloc "
+ "CCB to stop unit.\n");
return;
}
- xpt_path_string(ccb->ccb_h.path, path_str,
- sizeof(path_str));
-
- mpr_dprint(sc, MPR_INFO, "Sending StopUnit: path %s "
- "handle %d\n", path_str, target->handle);
/*
- * Issue a START STOP UNIT command for the target.
- * Increment the SSU counter to be used to count the
- * number of required replies.
+ * The stop_at_shutdown flag will be set if this LUN is
+ * a SATA direct-access end device.
*/
- mpr_dprint(sc, MPR_INFO, "Incrementing SSU count\n");
- sc->SSU_refcount++;
- ccb->ccb_h.target_id =
- xpt_path_target_id(ccb->ccb_h.path);
- ccb->ccb_h.ppriv_ptr1 = sassc;
- scsi_start_stop(&ccb->csio,
- /*retries*/0,
- mprsas_stop_unit_done,
- MSG_SIMPLE_Q_TAG,
- /*start*/FALSE,
- /*load/eject*/0,
- /*immediate*/FALSE,
- MPR_SENSE_LEN,
- /*timeout*/10000);
- xpt_action(ccb);
+ if (lun->stop_at_shutdown) {
+ if (xpt_create_path(&ccb->ccb_h.path,
+ xpt_periph, pathid, targetid,
+ lun->lun_id) != CAM_REQ_CMP) {
+ mpr_dprint(sc, MPR_FAULT, "Unable to "
+ "create LUN path to stop unit.\n");
+ xpt_free_ccb(ccb);
+ mpr_unlock(sc);
+ return;
+ }
+ xpt_path_string(ccb->ccb_h.path, path_str,
+ sizeof(path_str));
+
+ mpr_dprint(sc, MPR_INFO, "Sending StopUnit: "
+ "path %s handle %d\n", path_str,
+ target->handle);
+
+ /*
+ * Issue a START STOP UNIT command for the LUN.
+ * Increment the SSU counter to be used to
+ * count the number of required replies.
+ */
+ mpr_dprint(sc, MPR_INFO, "Incrementing SSU "
+ "count\n");
+ sc->SSU_refcount++;
+ ccb->ccb_h.target_id =
+ xpt_path_target_id(ccb->ccb_h.path);
+ ccb->ccb_h.target_lun = lun->lun_id;
+ ccb->ccb_h.ppriv_ptr1 = sassc;
+ scsi_start_stop(&ccb->csio,
+ /*retries*/0,
+ mprsas_stop_unit_done,
+ MSG_SIMPLE_Q_TAG,
+ /*start*/FALSE,
+ /*load/eject*/0,
+ /*immediate*/FALSE,
+ MPR_SENSE_LEN,
+ /*timeout*/10000);
+ xpt_action(ccb);
+ }
}
}
@@ -1226,7 +1102,7 @@ mprsas_SSU_to_SATA_devices(struct mpr_softc *sc)
/*
* Wait until all of the SSU commands have completed or time has
- * expired (60 seconds). Pause for 100ms each time through. If any
+ * expired (60 seconds). pause for 100ms each time through. If any
* command times out, the target will be reset in the SCSI command
* timeout routine.
*/
@@ -1236,7 +1112,7 @@ mprsas_SSU_to_SATA_devices(struct mpr_softc *sc)
getmicrotime(&cur_time);
if ((cur_time.tv_sec - start_time.tv_sec) > 60) {
- mpr_dprint(sc, MPR_ERROR, "Time has expired waiting "
+ mpr_dprint(sc, MPR_FAULT, "Time has expired waiting "
"for SSU commands to complete.\n");
break;
}
@@ -1286,8 +1162,6 @@ mprsas_ir_shutdown(struct mpr_softc *sc)
unsigned int id, found_volume = 0;
struct mpr_command *cm;
Mpi2RaidActionRequest_t *action;
- target_id_t targetid;
- struct mprsas_target *target;
mpr_dprint(sc, MPR_TRACE, "%s\n", __func__);
@@ -1340,47 +1214,5 @@ mprsas_ir_shutdown(struct mpr_softc *sc)
mpr_free_command(sc, cm);
out:
- /*
- * All of the targets must have the correct value set for
- * 'stop_at_shutdown' for the current 'enable_ssu' sysctl variable.
- *
- * The possible values for the 'enable_ssu' variable are:
- * 0: disable to SSD and HDD
- * 1: disable only to HDD (default)
- * 2: disable only to SSD
- * 3: enable to SSD and HDD
- * anything else will default to 1.
- */
- for (targetid = 0; targetid < sc->facts->MaxTargets; targetid++) {
- target = &sc->sassc->targets[targetid];
- if (target->handle == 0x0) {
- continue;
- }
-
- if (target->supports_SSU) {
- switch (sc->enable_ssu) {
- case MPR_SSU_DISABLE_SSD_DISABLE_HDD:
- target->stop_at_shutdown = FALSE;
- break;
- case MPR_SSU_DISABLE_SSD_ENABLE_HDD:
- target->stop_at_shutdown = TRUE;
- if (target->flags & MPR_TARGET_IS_SATA_SSD) {
- target->stop_at_shutdown = FALSE;
- }
- break;
- case MPR_SSU_ENABLE_SSD_ENABLE_HDD:
- target->stop_at_shutdown = TRUE;
- break;
- case MPR_SSU_ENABLE_SSD_DISABLE_HDD:
- default:
- target->stop_at_shutdown = TRUE;
- if ((target->flags &
- MPR_TARGET_IS_SATA_SSD) == 0) {
- target->stop_at_shutdown = FALSE;
- }
- break;
- }
- }
- }
mprsas_SSU_to_SATA_devices(sc);
}
diff --git a/sys/dev/mpr/mpr_user.c b/sys/dev/mpr/mpr_user.c
index 37d9467..60680f5 100644
--- a/sys/dev/mpr/mpr_user.c
+++ b/sys/dev/mpr/mpr_user.c
@@ -27,11 +27,10 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD userland interface
+ * LSI MPT-Fusion Host Adapter FreeBSD userland interface
*/
/*-
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -55,7 +54,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
+ * LSI MPT-Fusion Host Adapter FreeBSD
*
* $FreeBSD$
*/
@@ -91,7 +90,7 @@ __FBSDID("$FreeBSD$");
#include <sys/rman.h>
#include <cam/cam.h>
-#include <cam/cam_ccb.h>
+#include <cam/scsi/scsi_all.h>
#include <dev/mpr/mpi/mpi2_type.h>
#include <dev/mpr/mpi/mpi2.h>
@@ -285,7 +284,8 @@ mpr_user_read_cfg_header(struct mpr_softc *sc,
static int
mpr_user_read_cfg_page(struct mpr_softc *sc,
- struct mpr_cfg_page_req *page_req, void *buf)
+ struct mpr_cfg_page_req *page_req,
+ void *buf)
{
MPI2_CONFIG_PAGE_HEADER *reqhdr, *hdr;
struct mpr_config_params params;
@@ -328,10 +328,6 @@ mpr_user_read_extcfg_header(struct mpr_softc *sc,
hdr->PageNumber = ext_page_req->header.PageNumber;
hdr->ExtPageType = ext_page_req->header.ExtPageType;
params.page_address = le32toh(ext_page_req->page_address);
- params.buffer = NULL;
- params.length = 0;
- params.callback = NULL;
-
if ((error = mpr_read_config_page(sc, &params)) != 0) {
/*
* Leave the request. Without resetting the chip, it's
@@ -369,8 +365,8 @@ mpr_user_read_extcfg_page(struct mpr_softc *sc,
params.action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
params.page_address = le32toh(ext_page_req->page_address);
hdr->PageVersion = reqhdr->PageVersion;
- hdr->PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
hdr->PageNumber = reqhdr->PageNumber;
+ hdr->PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
hdr->ExtPageType = reqhdr->ExtPageType;
hdr->ExtPageLength = reqhdr->ExtPageLength;
params.buffer = buf;
@@ -545,8 +541,6 @@ mpi_pre_fw_upload(struct mpr_command *cm, struct mpr_usr_command *cmd)
req->ImageOffset = 0;
req->ImageSize = cmd->len;
- cm->cm_flags |= MPR_CM_FLAGS_DATAIN;
-
return (mpr_push_ieee_sge(cm, &req->SGL, 0));
}
@@ -840,22 +834,11 @@ mpr_user_pass_thru(struct mpr_softc *sc, mpr_pass_thru_t *data)
task->TaskMID = cm->cm_desc.Default.SMID;
cm->cm_data = NULL;
- cm->cm_desc.HighPriority.RequestFlags =
- MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
+ cm->cm_desc.HighPriority.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
cm->cm_complete = NULL;
cm->cm_complete_data = NULL;
- targ = mprsas_find_target_by_handle(sc->sassc, 0,
- task->DevHandle);
- if (targ == NULL) {
- mpr_dprint(sc, MPR_INFO,
- "%s %d : invalid handle for requested TM 0x%x \n",
- __func__, __LINE__, task->DevHandle);
- err = 1;
- } else {
- mprsas_prepare_for_tm(sc, cm, targ, CAM_LUN_WILDCARD);
- err = mpr_wait_command(sc, cm, 30, CAN_SLEEP);
- }
+ err = mpr_wait_command(sc, cm, 30, CAN_SLEEP);
if (err != 0) {
err = EIO;
@@ -1046,7 +1029,7 @@ mpr_user_pass_thru(struct mpr_softc *sc, mpr_pass_thru_t *data)
if (cm->cm_flags & MPR_CM_FLAGS_DATAIN)
dir = BUS_DMASYNC_POSTREAD;
else if (cm->cm_flags & MPR_CM_FLAGS_DATAOUT)
- dir = BUS_DMASYNC_POSTWRITE;
+ dir = BUS_DMASYNC_POSTWRITE;;
bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap, dir);
bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap);
@@ -1368,8 +1351,8 @@ done:
}
static int
-mpr_diag_register(struct mpr_softc *sc, mpr_fw_diag_register_t *diag_register,
- uint32_t *return_code)
+mpr_diag_register(struct mpr_softc *sc,
+ mpr_fw_diag_register_t *diag_register, uint32_t *return_code)
{
mpr_fw_diagnostic_buffer_t *pBuffer;
uint8_t extended_type, buffer_type, i;
diff --git a/sys/dev/mpr/mprvar.h b/sys/dev/mpr/mprvar.h
index acac44c..9752dcd 100644
--- a/sys/dev/mpr/mprvar.h
+++ b/sys/dev/mpr/mprvar.h
@@ -1,7 +1,6 @@
/*-
* Copyright (c) 2009 Yahoo! Inc.
- * Copyright (c) 2011-2015 LSI Corp.
- * Copyright (c) 2013-2015 Avago Technologies
+ * Copyright (c) 2011-2014 LSI Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -25,15 +24,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
- *
* $FreeBSD$
*/
#ifndef _MPRVAR_H
#define _MPRVAR_H
-#define MPR_DRIVER_VERSION "09.255.01.00-fbsd"
+#define MPR_DRIVER_VERSION "05.255.05.00-fbsd"
#define MPR_DB_MAX_WAIT 2500
@@ -50,19 +47,16 @@
#define MPR_FUNCTRACE(sc) \
mpr_dprint((sc), MPR_TRACE, "%s\n", __func__)
-#define CAN_SLEEP 1
-#define NO_SLEEP 0
+#define CAN_SLEEP 1
+#define NO_SLEEP 0
#define MPR_PERIODIC_DELAY 1 /* 1 second heartbeat/watchdog check */
-#define MPR_ATA_ID_TIMEOUT 5 /* 5 second timeout for SATA ID cmd */
#define IFAULT_IOP_OVER_TEMP_THRESHOLD_EXCEEDED 0x2810
#define MPR_SCSI_RI_INVALID_FRAME (0x00000002)
#define MPR_STRING_LENGTH 64
-#define DEFAULT_SPINUP_WAIT 3 /* seconds to wait for spinup */
-
#include <sys/endian.h>
/*
@@ -219,14 +213,13 @@ struct mpr_command {
#define MPR_CM_FLAGS_CHAIN_FAILED (1 << 8)
#define MPR_CM_FLAGS_ERROR_MASK MPR_CM_FLAGS_CHAIN_FAILED
#define MPR_CM_FLAGS_USE_CCB (1 << 9)
-#define MPR_CM_FLAGS_SATA_ID_TIMEOUT (1 << 10)
u_int cm_state;
#define MPR_CM_STATE_FREE 0
#define MPR_CM_STATE_BUSY 1
#define MPR_CM_STATE_TIMEDOUT 2
bus_dmamap_t cm_dmamap;
struct scsi_sense_data *cm_sense;
- TAILQ_HEAD(, mpr_chain) cm_chain_list;
+ TAILQ_HEAD(, mpr_chain) cm_chain_list;
uint32_t cm_req_busaddr;
uint32_t cm_sense_busaddr;
struct callout cm_callout;
@@ -263,8 +256,6 @@ struct mpr_softc {
int chain_free;
int max_chains;
int chain_free_lowwater;
- u_int enable_ssu;
- int spinup_wait_time;
#if __FreeBSD_version >= 900030
uint64_t chain_alloc_fail;
#endif
@@ -279,7 +270,7 @@ struct mpr_softc {
char tmp_string[MPR_STRING_LENGTH];
TAILQ_HEAD(, mpr_command) req_list;
TAILQ_HEAD(, mpr_command) high_priority_req_list;
- TAILQ_HEAD(, mpr_chain) chain_list;
+ TAILQ_HEAD(, mpr_chain) chain_list;
TAILQ_HEAD(, mpr_command) tm_list;
int replypostindex;
int replyfreeindex;
@@ -300,7 +291,7 @@ struct mpr_softc {
uint8_t event_mask[16];
TAILQ_HEAD(, mpr_event_handle) event_list;
- struct mpr_event_handle *mpr_log_eh;
+ struct mpr_event_handle *mpr_log_eh;
struct mtx mpr_mtx;
struct intr_config_hook mpr_ich;
@@ -574,11 +565,6 @@ mpr_unlock(struct mpr_softc *sc)
#define MPR_MAPPING (1 << 9) /* Trace device mappings */
#define MPR_TRACE (1 << 10) /* Function-by-function trace */
-#define MPR_SSU_DISABLE_SSD_DISABLE_HDD 0
-#define MPR_SSU_ENABLE_SSD_DISABLE_HDD 1
-#define MPR_SSU_DISABLE_SSD_ENABLE_HDD 2
-#define MPR_SSU_ENABLE_SSD_ENABLE_HDD 3
-
#define mpr_printf(sc, args...) \
device_printf((sc)->mpr_dev, ##args)
@@ -614,6 +600,9 @@ do { \
#define MPR_EVENTFIELD(sc, facts, attr, fmt) \
mpr_dprint_field((sc), MPR_EVENT, #attr ": " #fmt "\n", (facts)->attr)
+#define CAN_SLEEP 1
+#define NO_SLEEP 0
+
static __inline void
mpr_from_u64(uint64_t data, U64 *mpr)
{
@@ -624,6 +613,7 @@ mpr_from_u64(uint64_t data, U64 *mpr)
static __inline uint64_t
mpr_to_u64(U64 *data)
{
+
return (((uint64_t)le32toh(data->High) << 32) | le32toh(data->Low));
}
@@ -737,12 +727,6 @@ void mprsas_prepare_volume_remove(struct mprsas_softc *sassc,
int mprsas_startup(struct mpr_softc *sc);
struct mprsas_target * mprsas_find_target_by_handle(struct mprsas_softc *,
int, uint16_t);
-void mprsas_realloc_targets(struct mpr_softc *sc, int maxtargets);
-struct mpr_command * mprsas_alloc_tm(struct mpr_softc *sc);
-void mprsas_free_tm(struct mpr_softc *sc, struct mpr_command *tm);
-void mprsas_release_simq_reinit(struct mprsas_softc *sassc);
-int mprsas_send_reset(struct mpr_softc *sc, struct mpr_command *tm,
- uint8_t type);
SYSCTL_DECL(_hw_mpr);
OpenPOWER on IntegriCloud