Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Nov 2015 19:55:59 +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: r290796 - stable/10/sys/dev/isp
Message-ID:  <201511131955.tADJtxot098994@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Fri Nov 13 19:55:59 2015
New Revision: 290796
URL: https://svnweb.freebsd.org/changeset/base/290796

Log:
  MFC r289937: Try to keep Loop IDs persistent across chip reinits.

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

Modified: stable/10/sys/dev/isp/isp.c
==============================================================================
--- stable/10/sys/dev/isp/isp.c	Fri Nov 13 19:54:58 2015	(r290795)
+++ stable/10/sys/dev/isp/isp.c	Fri Nov 13 19:55:59 2015	(r290796)
@@ -1669,7 +1669,6 @@ isp_fibre_init(ispsoftc_t *isp)
 	fcparam *fcp;
 	isp_icb_t local, *icbp = &local;
 	mbreg_t mbs;
-	int ownloopid;
 
 	/*
 	 * We only support one channel on non-24XX cards
@@ -1743,19 +1742,12 @@ isp_fibre_init(ispsoftc_t *isp)
 	}
 	icbp->icb_retry_delay = fcp->isp_retry_delay;
 	icbp->icb_retry_count = fcp->isp_retry_count;
-	icbp->icb_hardaddr = fcp->isp_loopid;
-	ownloopid = (isp->isp_confopts & ISP_CFG_OWNLOOPID) != 0;
-	if (icbp->icb_hardaddr >= LOCAL_LOOP_LIM) {
-		icbp->icb_hardaddr = 0;
-		ownloopid = 0;
-	}
-
-	/*
-	 * Our life seems so much better with 2200s and later with
-	 * the latest f/w if we set Hard Address.
-	 */
-	if (ownloopid || ISP_FW_NEWER_THAN(isp, 2, 2, 5)) {
-		icbp->icb_fwoptions |= ICBOPT_HARD_ADDRESS;
+	if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
+		icbp->icb_hardaddr = fcp->isp_loopid;
+		if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
+			icbp->icb_fwoptions |= ICBOPT_HARD_ADDRESS;
+		else
+			icbp->icb_fwoptions |= ICBOPT_PREV_ADDRESS;
 	}
 
 	/*
@@ -1989,7 +1981,6 @@ isp_fibre_init_2400(ispsoftc_t *isp)
 	isp_icb_2400_t local, *icbp = &local;
 	mbreg_t mbs;
 	int chan;
-	int ownloopid = 0;
 
 	/*
 	 * Check to see whether all channels have *some* kind of role
@@ -2024,16 +2015,20 @@ isp_fibre_init_2400(ispsoftc_t *isp)
 
 	ISP_MEMZERO(icbp, sizeof (*icbp));
 	icbp->icb_fwoptions1 = fcp->isp_fwoptions;
-	if (fcp->role & ISP_ROLE_TARGET) {
-		icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE;
-	} else {
-		icbp->icb_fwoptions1 &= ~ICB2400_OPT1_TGT_ENABLE;
-	}
-
-	if (fcp->role & ISP_ROLE_INITIATOR) {
+	icbp->icb_fwoptions2 = fcp->isp_xfwoptions;
+	icbp->icb_fwoptions3 = fcp->isp_zfwoptions;
+	if (isp->isp_nchan > 1 && (isp->isp_fwattr & ISP2400_FW_ATTR_VP0)) {
 		icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE;
+		icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE;
 	} else {
-		icbp->icb_fwoptions1 |= ICB2400_OPT1_INI_DISABLE;
+		if (fcp->role & ISP_ROLE_TARGET)
+			icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE;
+		else
+			icbp->icb_fwoptions1 &= ~ICB2400_OPT1_TGT_ENABLE;
+		if (fcp->role & ISP_ROLE_INITIATOR)
+			icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE;
+		else
+			icbp->icb_fwoptions1 |= ICB2400_OPT1_INI_DISABLE;
 	}
 
 	icbp->icb_version = ICB_VERSION1;
@@ -2058,18 +2053,14 @@ isp_fibre_init_2400(ispsoftc_t *isp)
 			icbp->icb_xchgcnt >>= 1;
 	}
 
-
-	ownloopid = (isp->isp_confopts & ISP_CFG_OWNLOOPID) != 0;
-	icbp->icb_hardaddr = fcp->isp_loopid;
-	if (icbp->icb_hardaddr >= LOCAL_LOOP_LIM) {
-		icbp->icb_hardaddr = 0;
-		ownloopid = 0;
+	if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
+		icbp->icb_hardaddr = fcp->isp_loopid;
+		if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
+			icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS;
+		else
+			icbp->icb_fwoptions1 |= ICB2400_OPT1_PREV_ADDRESS;
 	}
 
-	if (ownloopid)
-		icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS;
-
-	icbp->icb_fwoptions2 = fcp->isp_xfwoptions;
 	if (isp->isp_confopts & ISP_CFG_NOFCTAPE) {
 		icbp->icb_fwoptions2 &= ~ICB2400_OPT2_FCTAPE;
 	}
@@ -2113,7 +2104,6 @@ isp_fibre_init_2400(ispsoftc_t *isp)
 		break;
 	}
 
-	icbp->icb_fwoptions3 = fcp->isp_zfwoptions;
 	if ((icbp->icb_fwoptions3 & ICB2400_OPT3_RSPSZ_MASK) == 0) {
 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RSPSZ_24;
 	}
@@ -2129,9 +2119,6 @@ isp_fibre_init_2400(ispsoftc_t *isp)
 	} else {
 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_AUTO;
 	}
-	if (ownloopid == 0) {
-		icbp->icb_fwoptions3 |= ICB2400_OPT3_SOFTID;
-	}
 	icbp->icb_logintime = ICB_LOGIN_TOV;
 
 	if (fcp->isp_wwnn && fcp->isp_wwpn) {
@@ -2238,6 +2225,13 @@ isp_fibre_init_2400(ispsoftc_t *isp)
 				if ((fcp2->role & ISP_ROLE_TARGET) == 0)
 					pi.vp_port_options |= ICB2400_VPOPT_TGT_DISABLE;
 			}
+			if (fcp2->isp_loopid < LOCAL_LOOP_LIM) {
+				pi.vp_port_loopid = fcp2->isp_loopid;
+				if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
+					pi.vp_port_options |= ICB2400_VPOPT_HARD_ADDRESS;
+				else
+					pi.vp_port_options |= ICB2400_VPOPT_PREV_ADDRESS;
+			}
 			MAKE_NODE_NAME_FROM_WWN(pi.vp_port_portname, fcp2->isp_wwpn);
 			MAKE_NODE_NAME_FROM_WWN(pi.vp_port_nodename, fcp2->isp_wwnn);
 			off = fcp->isp_scratch;

Modified: stable/10/sys/dev/isp/ispmbox.h
==============================================================================
--- stable/10/sys/dev/isp/ispmbox.h	Fri Nov 13 19:54:58 2015	(r290795)
+++ stable/10/sys/dev/isp/ispmbox.h	Fri Nov 13 19:55:59 2015	(r290796)
@@ -928,7 +928,7 @@ typedef struct {
 #define	ICBOPT_BOTH_WWNS	0x4000
 #define	ICBOPT_FULL_LOGIN	0x2000
 #define	ICBOPT_STOP_ON_QFULL	0x1000	/* 2200/2100 only */
-#define	ICBOPT_PREVLOOP		0x0800
+#define	ICBOPT_PREV_ADDRESS	0x0800
 #define	ICBOPT_SRCHDOWN		0x0400
 #define	ICBOPT_NOLIP		0x0200
 #define	ICBOPT_PDBCHANGE_AE	0x0100
@@ -982,7 +982,7 @@ typedef struct {
 /* 2400 F/W options */
 #define	ICB2400_OPT1_BOTH_WWNS		0x00004000
 #define	ICB2400_OPT1_FULL_LOGIN		0x00002000
-#define	ICB2400_OPT1_PREVLOOP		0x00000800
+#define	ICB2400_OPT1_PREV_ADDRESS	0x00000800
 #define	ICB2400_OPT1_SRCHDOWN		0x00000400
 #define	ICB2400_OPT1_NOLIP		0x00000200
 #define	ICB2400_OPT1_INI_DISABLE	0x00000020
@@ -1144,7 +1144,7 @@ typedef struct {
 #define	ICB2400_VPOPT_INI_ENABLE	0x00000010	/* Initiator Mode Enabled */
 #define	ICB2400_VPOPT_ENABLED		0x00000008	/* VP Enabled */
 #define	ICB2400_VPOPT_NOPLAY		0x00000004	/* ID Not Acquired */
-#define	ICB2400_VPOPT_PREVLOOP		0x00000002	/* Previously Assigned ID */
+#define	ICB2400_VPOPT_PREV_ADDRESS	0x00000002	/* Previously Assigned ID */
 #define	ICB2400_VPOPT_HARD_ADDRESS	0x00000001	/* Hard Assigned ID */
 
 #define	ICB2400_VPOPT_WRITE_SIZE	20



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