Author: asomers
Date: Mon Dec 14 19:40:47 2015
New Revision: 292218
URL: https://svnweb.freebsd.org/changeset/base/292218

Log:
  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

Modified:
  head/sys/dev/mpr/mpr_sas_lsi.c
  head/sys/dev/mps/mps_sas_lsi.c

Modified: head/sys/dev/mpr/mpr_sas_lsi.c
==============================================================================
--- head/sys/dev/mpr/mpr_sas_lsi.c      Mon Dec 14 19:20:18 2015        
(r292217)
+++ head/sys/dev/mpr/mpr_sas_lsi.c      Mon Dec 14 19:40:47 2015        
(r292218)
@@ -885,7 +885,13 @@ mprsas_get_sas_address_for_sata_disk(str
                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) {
                                mpr_dprint(sc, MPR_INFO, "Sleeping %d seconds "
                                    "after SATA ID error to wait for spinup\n",
@@ -894,8 +900,10 @@ mprsas_get_sas_address_for_sata_disk(str
                                    "mprid", 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) {
                mpr_dprint(sc, MPR_MAPPING, "%s: got SATA identify "

Modified: head/sys/dev/mps/mps_sas_lsi.c
==============================================================================
--- head/sys/dev/mps/mps_sas_lsi.c      Mon Dec 14 19:20:18 2015        
(r292217)
+++ head/sys/dev/mps/mps_sas_lsi.c      Mon Dec 14 19:40:47 2015        
(r292218)
@@ -794,7 +794,13 @@ mpssas_get_sas_address_for_sata_disk(str
                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(str
                                    "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 "
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to