Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 May 2016 07:13:42 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r300581 - stable/10/sys/dev/isp
Message-ID:  <201605240713.u4O7Dg2R076343@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Tue May 24 07:13:42 2016
New Revision: 300581
URL: https://svnweb.freebsd.org/changeset/base/300581

Log:
  MFC r300058: Make RQCS_PORT_LOGGED_OUT for ZOMBIE ports retriable.
  
  It is normal for ZOMBIE ports to be logged out.  This status is not really
  an error until Gone Device Timeout expires, so make CAM retry after delay.

Modified:
  stable/10/sys/dev/isp/isp.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/isp/isp.c
==============================================================================
--- stable/10/sys/dev/isp/isp.c	Tue May 24 07:12:53 2016	(r300580)
+++ stable/10/sys/dev/isp/isp.c	Tue May 24 07:13:42 2016	(r300581)
@@ -6517,6 +6517,8 @@ isp_parse_status(ispsoftc_t *isp, ispsta
 	{
 		const char *reason;
 		uint8_t sts = sp->req_completion_status & 0xff;
+		fcparam *fcp = FCPARAM(isp, 0);
+		fcportdb_t *lp;
 
 		/*
 		 * It was there (maybe)- treat as a selection timeout.
@@ -6534,8 +6536,8 @@ isp_parse_status(ispsoftc_t *isp, ispsta
 		 * to force a re-login of this unit. If we're on fabric,
 		 * then we'll have to log in again as a matter of course.
 		 */
-		if (FCPARAM(isp, 0)->isp_topo == TOPO_NL_PORT ||
-		    FCPARAM(isp, 0)->isp_topo == TOPO_FL_PORT) {
+		if (fcp->isp_topo == TOPO_NL_PORT ||
+		    fcp->isp_topo == TOPO_FL_PORT) {
 			mbreg_t mbs;
 			MBSINIT(&mbs, MBOX_INIT_LIP, MBLOGALL, 0);
 			if (ISP_CAP_2KLOGIN(isp)) {
@@ -6544,7 +6546,12 @@ isp_parse_status(ispsoftc_t *isp, ispsta
 			isp_mboxcmd_qnw(isp, &mbs, 1);
 		}
 		if (XS_NOERR(xs)) {
-			XS_SETERR(xs, HBA_SELTIMEOUT);
+			lp = &fcp->portdb[XS_TGT(xs)];
+			if (lp->state == FC_PORTDB_STATE_ZOMBIE) {
+				*XS_STSP(xs) = SCSI_BUSY;
+				XS_SETERR(xs, HBA_TGTBSY);
+			} else
+				XS_SETERR(xs, HBA_SELTIMEOUT);
 		}
 		return;
 	}
@@ -6668,6 +6675,8 @@ isp_parse_status_24xx(ispsoftc_t *isp, i
 	{
 		const char *reason;
 		uint8_t sts = sp->req_completion_status & 0xff;
+		fcparam *fcp = FCPARAM(isp, XS_CHANNEL(xs));
+		fcportdb_t *lp;
 
 		/*
 		 * It was there (maybe)- treat as a selection timeout.
@@ -6685,7 +6694,12 @@ isp_parse_status_24xx(ispsoftc_t *isp, i
 		 * There is no MBOX_INIT_LIP for the 24XX.
 		 */
 		if (XS_NOERR(xs)) {
-			XS_SETERR(xs, HBA_SELTIMEOUT);
+			lp = &fcp->portdb[XS_TGT(xs)];
+			if (lp->state == FC_PORTDB_STATE_ZOMBIE) {
+				*XS_STSP(xs) = SCSI_BUSY;
+				XS_SETERR(xs, HBA_TGTBSY);
+			} else
+				XS_SETERR(xs, HBA_SELTIMEOUT);
 		}
 		return;
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605240713.u4O7Dg2R076343>