bnx2x: Support DCBX for all functions
authorBarak Witkowski <barak@broadcom.com>
Tue, 19 Jun 2012 07:48:31 +0000 (07:48 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Jun 2012 21:34:35 +0000 (14:34 -0700)
In multi-function device, allow configuring dcbx admin params from all drivers
on a single physical port.

Signed-off-by: Barak Witkowski <barak@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h

index fcc3b26c1c60b4fbc5d1c3367ab4c63af115f8fd..fa061cf60feeeba7b8813855f0e2b69fffb1016e 100644 (file)
@@ -1318,6 +1318,7 @@ struct bnx2x {
 #define NO_FCOE_FLAG                   (1 << 15)
 #define BC_SUPPORTS_PFC_STATS          (1 << 17)
 #define USING_SINGLE_MSIX_FLAG         (1 << 20)
+#define BC_SUPPORTS_DCBX_MSG_NON_PMF   (1 << 21)
 
 #define NO_ISCSI(bp)           ((bp)->flags & NO_ISCSI_FLAG)
 #define NO_ISCSI_OOO(bp)       ((bp)->flags & NO_ISCSI_OOO_FLAG)
index 829befbc20a5f629031451b20d30fb7d251db7ca..00951b3aa62bf70096ce7dd771450e6235b6dad3 100644 (file)
@@ -2274,8 +2274,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
                return -EBUSY;
        }
 
-       if (bp->state != BNX2X_STATE_DIAG)
-               bnx2x_dcbx_init(bp);
+       /* If PMF - send ADMIN DCBX msg to MFW to initiate DCBX FSM */
+       if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG))
+               bnx2x_dcbx_init(bp, false);
+
        return 0;
 
 #ifndef BNX2X_STOP_ON_ERROR
index 12dbbc4ff9bc9ebaa0bd362a43fd35ac389965fc..daa894bd772a771a8f9ca483228fdef8dd1ab39e 100644 (file)
@@ -418,7 +418,7 @@ void bnx2x_ilt_set_info(struct bnx2x *bp);
  *
  * @bp:                driver handle
  */
-void bnx2x_dcbx_init(struct bnx2x *bp);
+void bnx2x_dcbx_init(struct bnx2x *bp, bool update_shmem);
 
 /**
  * bnx2x_set_power_state - set power state to the requested value.
index 4f9244bd7530877ff791defbe2082a0c2e9aa480..8a73374e52a763ba16d8526a2d3f1aa8b80fb11e 100644 (file)
@@ -972,23 +972,26 @@ void bnx2x_dcbx_init_params(struct bnx2x *bp)
        bp->dcbx_config_params.admin_default_priority = 0;
 }
 
-void bnx2x_dcbx_init(struct bnx2x *bp)
+void bnx2x_dcbx_init(struct bnx2x *bp, bool update_shmem)
 {
        u32 dcbx_lldp_params_offset = SHMEM_LLDP_DCBX_PARAMS_NONE;
 
+       /* only PMF can send ADMIN msg to MFW in old MFW versions */
+       if ((!bp->port.pmf) && (!(bp->flags & BC_SUPPORTS_DCBX_MSG_NON_PMF)))
+               return;
+
        if (bp->dcbx_enabled <= 0)
                return;
 
        /* validate:
         * chip of good for dcbx version,
         * dcb is wanted
-        * the function is pmf
         * shmem2 contains DCBX support fields
         */
        DP(BNX2X_MSG_DCB, "dcb_state %d bp->port.pmf %d\n",
           bp->dcb_state, bp->port.pmf);
 
-       if (bp->dcb_state == BNX2X_DCB_STATE_ON && bp->port.pmf &&
+       if (bp->dcb_state == BNX2X_DCB_STATE_ON &&
            SHMEM2_HAS(bp, dcbx_lldp_params_offset)) {
                dcbx_lldp_params_offset =
                        SHMEM2_RD(bp, dcbx_lldp_params_offset);
@@ -999,12 +1002,23 @@ void bnx2x_dcbx_init(struct bnx2x *bp)
                bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0);
 
                if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) {
-                       bnx2x_dcbx_admin_mib_updated_params(bp,
-                               dcbx_lldp_params_offset);
+                       /* need HW lock to avoid scenario of two drivers
+                        * writing in parallel to shmem
+                        */
+                       bnx2x_acquire_hw_lock(bp,
+                                             HW_LOCK_RESOURCE_DCBX_ADMIN_MIB);
+                       if (update_shmem)
+                               bnx2x_dcbx_admin_mib_updated_params(bp,
+                                       dcbx_lldp_params_offset);
 
                        /* Let HW start negotiation */
                        bnx2x_fw_command(bp,
                                         DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG, 0);
+                       /* release HW lock only after MFW acks that it finished
+                        * reading values from shmem
+                        */
+                       bnx2x_release_hw_lock(bp,
+                                             HW_LOCK_RESOURCE_DCBX_ADMIN_MIB);
                }
        }
 }
@@ -2063,10 +2077,8 @@ static u8 bnx2x_dcbnl_set_all(struct net_device *netdev)
                           "Handling parity error recovery. Try again later\n");
                return 1;
        }
-       if (netif_running(bp->dev)) {
-               bnx2x_nic_unload(bp, UNLOAD_NORMAL);
-               rc = bnx2x_nic_load(bp, LOAD_NORMAL);
-       }
+       if (netif_running(bp->dev))
+               bnx2x_dcbx_init(bp, true);
        DP(BNX2X_MSG_DCB, "set_dcbx_params done (%d)\n", rc);
        if (rc)
                return 1;
index c61aa37298a376fdb092b2b3e1d5efe3ef05d9e0..6b776309e0a1c2d9715baaeda12ddd065b43e3fd 100644 (file)
@@ -1253,6 +1253,7 @@ struct drv_func_mb {
 
        #define DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG         0xb0000000
        #define DRV_MSG_CODE_DCBX_PMF_DRV_OK            0xb2000000
+       #define REQ_BC_VER_4_DCBX_ADMIN_MSG_NON_PMF     0x00070401
 
        #define DRV_MSG_CODE_VF_DISABLED_DONE           0xc0000000
 
index 08c8d7d5e89379fa52eb8c7d643a2061a7a7c6bb..8ddc78e0d945c3f64395c78184c3c3b14a0f8b17 100644 (file)
@@ -9732,6 +9732,8 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)
        bp->flags |= (val >= REQ_BC_VER_4_PFC_STATS_SUPPORTED) ?
                        BC_SUPPORTS_PFC_STATS : 0;
 
+       bp->flags |= (val >= REQ_BC_VER_4_DCBX_ADMIN_MSG_NON_PMF) ?
+                       BC_SUPPORTS_DCBX_MSG_NON_PMF : 0;
        boot_mode = SHMEM_RD(bp,
                        dev_info.port_feature_config[BP_PORT(bp)].mba_config) &
                        PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK;
index bfef98f666c933d1726e6162edae595726563b65..a78e35683b0323492025bdf8db56baf5b0fb6795 100644 (file)
 #define MISC_REGISTERS_SPIO_OUTPUT_LOW                          0
 #define MISC_REGISTERS_SPIO_SET_POS                             8
 #define HW_LOCK_MAX_RESOURCE_VALUE                              31
+#define HW_LOCK_RESOURCE_DCBX_ADMIN_MIB                                 13
 #define HW_LOCK_RESOURCE_DRV_FLAGS                              10
 #define HW_LOCK_RESOURCE_GPIO                                   1
 #define HW_LOCK_RESOURCE_MDIO                                   0