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
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to