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. Reviewed by: slm MFC after: 4 weeks Sponsored by: Spectra Logic Corp Differential Revision: https://reviews.freebsd.org/D4553
This commit is contained in:
parent
43aa90e584
commit
a92fe02768
@ -885,7 +885,13 @@ mprsas_get_sas_address_for_sata_disk(struct mpr_softc *sc,
|
|||||||
ioc_status = le16toh(mpi_reply.IOCStatus)
|
ioc_status = le16toh(mpi_reply.IOCStatus)
|
||||||
& MPI2_IOCSTATUS_MASK;
|
& MPI2_IOCSTATUS_MASK;
|
||||||
sas_status = mpi_reply.SASStatus;
|
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) {
|
if (sc->spinup_wait_time > 0) {
|
||||||
mpr_dprint(sc, MPR_INFO, "Sleeping %d seconds "
|
mpr_dprint(sc, MPR_INFO, "Sleeping %d seconds "
|
||||||
"after SATA ID error to wait for spinup\n",
|
"after SATA ID error to wait for spinup\n",
|
||||||
@ -894,8 +900,10 @@ mprsas_get_sas_address_for_sata_disk(struct mpr_softc *sc,
|
|||||||
"mprid", sc->spinup_wait_time * hz);
|
"mprid", sc->spinup_wait_time * hz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (((rc && (rc != EWOULDBLOCK)) || ioc_status || sas_status) &&
|
} while (((rc && (rc != EWOULDBLOCK)) ||
|
||||||
(try_count < 5));
|
(ioc_status &&
|
||||||
|
(ioc_status != MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR))
|
||||||
|
|| sas_status) && (try_count < 5));
|
||||||
|
|
||||||
if (rc == 0 && !ioc_status && !sas_status) {
|
if (rc == 0 && !ioc_status && !sas_status) {
|
||||||
mpr_dprint(sc, MPR_MAPPING, "%s: got SATA identify "
|
mpr_dprint(sc, MPR_MAPPING, "%s: got SATA identify "
|
||||||
|
@ -794,7 +794,13 @@ mpssas_get_sas_address_for_sata_disk(struct mps_softc *sc,
|
|||||||
ioc_status = le16toh(mpi_reply.IOCStatus)
|
ioc_status = le16toh(mpi_reply.IOCStatus)
|
||||||
& MPI2_IOCSTATUS_MASK;
|
& MPI2_IOCSTATUS_MASK;
|
||||||
sas_status = mpi_reply.SASStatus;
|
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) {
|
if (sc->spinup_wait_time > 0) {
|
||||||
mps_dprint(sc, MPS_INFO, "Sleeping %d seconds "
|
mps_dprint(sc, MPS_INFO, "Sleeping %d seconds "
|
||||||
"after SATA ID error to wait for spinup\n",
|
"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);
|
"mpsid", sc->spinup_wait_time * hz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (((rc && (rc != EWOULDBLOCK)) || ioc_status || sas_status) &&
|
} while (((rc && (rc != EWOULDBLOCK)) ||
|
||||||
(try_count < 5));
|
(ioc_status &&
|
||||||
|
(ioc_status != MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR))
|
||||||
|
|| sas_status) && (try_count < 5));
|
||||||
|
|
||||||
if (rc == 0 && !ioc_status && !sas_status) {
|
if (rc == 0 && !ioc_status && !sas_status) {
|
||||||
mps_dprint(sc, MPS_MAPPING, "%s: got SATA identify "
|
mps_dprint(sc, MPS_MAPPING, "%s: got SATA identify "
|
||||||
|
Loading…
x
Reference in New Issue
Block a user