From owner-svn-src-all@freebsd.org Fri Nov 13 19:56:00 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 86BD6A2ED4C; Fri, 13 Nov 2015 19:56:00 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 5DAE311DB; Fri, 13 Nov 2015 19:56:00 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id tADJtxik098996; Fri, 13 Nov 2015 19:55:59 GMT (envelope-from mav@FreeBSD.org) Received: (from mav@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id tADJtxot098994; Fri, 13 Nov 2015 19:55:59 GMT (envelope-from mav@FreeBSD.org) Message-Id: <201511131955.tADJtxot098994@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mav set sender to mav@FreeBSD.org using -f From: Alexander Motin Date: Fri, 13 Nov 2015 19:55:59 +0000 (UTC) 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 X-SVN-Group: stable-10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Nov 2015 19:56:00 -0000 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