Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Apr 2016 10:35:17 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r297915 - head/sys/dev/isp
Message-ID:  <201604131035.u3DAZHFn097067@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed Apr 13 10:35:17 2016
New Revision: 297915
URL: https://svnweb.freebsd.org/changeset/base/297915

Log:
  Filter Port Database Changed notifications.
  
  For some reason firmware sends Port Database Changed notifications in case
  of explicit login requests from the driver when target port is unavailabe.
  Those notifications don't give driver any new information, but only cause
  infinite scan loop.

Modified:
  head/sys/dev/isp/isp.c
  head/sys/dev/isp/ispvar.h

Modified: head/sys/dev/isp/isp.c
==============================================================================
--- head/sys/dev/isp/isp.c	Wed Apr 13 09:44:32 2016	(r297914)
+++ head/sys/dev/isp/isp.c	Wed Apr 13 10:35:17 2016	(r297915)
@@ -2630,6 +2630,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uin
 	isp_put_plogx(isp, &pl, (isp_plogx_t *)reqp);
 	if (isp->isp_dblev & ISP_LOGDEBUG1)
 		isp_print_bytes(isp, "IOCB LOGX", QENTRY_LEN, reqp);
+	FCPARAM(isp, chan)->isp_login_hdl = handle;
 	ISP_SYNC_REQUEST(isp);
 	if (msleep(resp, &isp->isp_lock, 0, "PLOGX", 3 * ICB_LOGIN_TOV * hz)
 	    == EWOULDBLOCK) {
@@ -2638,6 +2639,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uin
 		isp_destroy_handle(isp, pl.plogx_handle);
 		return (-1);
 	}
+	FCPARAM(isp, chan)->isp_login_hdl = NIL_HANDLE;
 	if (isp->isp_dblev & ISP_LOGDEBUG1)
 		isp_print_bytes(isp, "IOCB LOGX response", QENTRY_LEN, resp);
 	isp_get_plogx(isp, (isp_plogx_t *)resp, &pl);
@@ -6000,9 +6002,13 @@ isp_parse_async_fc(ispsoftc_t *isp, uint
 			fcp = FCPARAM(isp, chan);
 			if (fcp->role == ISP_ROLE_NONE)
 				continue;
-			if (fcp->isp_loopstate > LOOP_LTEST_DONE)
+			if (fcp->isp_loopstate > LOOP_LTEST_DONE) {
+				if (nphdl != NIL_HANDLE &&
+				    nphdl == fcp->isp_login_hdl &&
+				    reason == PDB24XX_AE_OPN_2)
+					continue;
 				fcp->isp_loopstate = LOOP_LTEST_DONE;
-			else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
+			} else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
 				fcp->isp_loopstate = LOOP_HAVE_LINK;
 			isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan,
 			    ISPASYNC_CHANGE_PDB, nphdl, nlstate, reason);
@@ -7818,6 +7824,7 @@ isp_setdfltfcparm(ispsoftc_t *isp, int c
 	fcp->isp_xfwoptions = 0;
 	fcp->isp_zfwoptions = 0;
 	fcp->isp_lasthdl = NIL_HANDLE;
+	fcp->isp_login_hdl = NIL_HANDLE;
 
 	if (IS_24XX(isp)) {
 		fcp->isp_fwoptions |= ICB2400_OPT1_FAIRNESS;

Modified: head/sys/dev/isp/ispvar.h
==============================================================================
--- head/sys/dev/isp/ispvar.h	Wed Apr 13 09:44:32 2016	(r297914)
+++ head/sys/dev/isp/ispvar.h	Wed Apr 13 10:35:17 2016	(r297915)
@@ -449,6 +449,7 @@ typedef struct {
 	uint16_t		isp_lasthdl;		/* only valid for channel 0 */
 	uint16_t		isp_maxalloc;
 	uint16_t		isp_fabric_params;
+	uint16_t		isp_login_hdl;		/* Logging in handle */
 	uint8_t			isp_retry_delay;
 	uint8_t			isp_retry_count;
 



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