summaryrefslogtreecommitdiffstats
path: root/sys/dev/mps/mps_sas_lsi.c
diff options
context:
space:
mode:
authorasomers <asomers@FreeBSD.org>2016-01-11 21:12:49 +0000
committerasomers <asomers@FreeBSD.org>2016-01-11 21:12:49 +0000
commitc726cf023367deda48e442a5e909971b55e3b2d8 (patch)
tree0af5b31b122c45b569518e83e01f376d28bbc958 /sys/dev/mps/mps_sas_lsi.c
parentcd967a6f7f31639f1575aae1d53fa28a77052894 (diff)
downloadFreeBSD-src-c726cf023367deda48e442a5e909971b55e3b2d8.zip
FreeBSD-src-c726cf023367deda48e442a5e909971b55e3b2d8.tar.gz
MFC r292218
Don't retry SAS commands in response to protocol errors sys/dev/mpr/mpr_sas_lsi.c sys/dev/mps/mps_sas_lsi.c When mp[rs]sas_get_sata_identify returns MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR, don't bother retrying. Protocol errors aren't likely to be fixed by sleeping. Without this change, a system that generated may protocol errors due to signal integrity issues was taking more than an hour to boot, due to all the retries.
Diffstat (limited to 'sys/dev/mps/mps_sas_lsi.c')
-rw-r--r--sys/dev/mps/mps_sas_lsi.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/dev/mps/mps_sas_lsi.c b/sys/dev/mps/mps_sas_lsi.c
index 434663a..268383a 100644
--- a/sys/dev/mps/mps_sas_lsi.c
+++ b/sys/dev/mps/mps_sas_lsi.c
@@ -794,7 +794,13 @@ mpssas_get_sas_address_for_sata_disk(struct mps_softc *sc,
ioc_status = le16toh(mpi_reply.IOCStatus)
& MPI2_IOCSTATUS_MASK;
sas_status = mpi_reply.SASStatus;
- if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
+ switch (ioc_status) {
+ case MPI2_IOCSTATUS_SUCCESS:
+ break;
+ case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
+ /* No sense sleeping. this error won't get better */
+ break;
+ default:
if (sc->spinup_wait_time > 0) {
mps_dprint(sc, MPS_INFO, "Sleeping %d seconds "
"after SATA ID error to wait for spinup\n",
@@ -803,8 +809,10 @@ mpssas_get_sas_address_for_sata_disk(struct mps_softc *sc,
"mpsid", sc->spinup_wait_time * hz);
}
}
- } while (((rc && (rc != EWOULDBLOCK)) || ioc_status || sas_status) &&
- (try_count < 5));
+ } while (((rc && (rc != EWOULDBLOCK)) ||
+ (ioc_status &&
+ (ioc_status != MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR))
+ || sas_status) && (try_count < 5));
if (rc == 0 && !ioc_status && !sas_status) {
mps_dprint(sc, MPS_MAPPING, "%s: got SATA identify "
OpenPOWER on IntegriCloud