aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBarak Witkowski <barak@broadcom.com>2012-06-19 03:48:31 -0400
committerDavid S. Miller <davem@davemloft.net>2012-06-19 17:34:35 -0400
commit9876879fce3081cd9f3f2b9e995954d423bcd863 (patch)
treef8a923b2268ee74ea9141402be5e38d12147197c /drivers
parent0e8d2ec5c6ccf74dbe40216bb62d82c2f73fe836 (diff)
bnx2x: Support DCBX for all functions
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x.h1
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c6
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h2
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c30
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h1
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c2
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h1
7 files changed, 31 insertions, 12 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index fcc3b26c1c60..fa061cf60fee 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -1318,6 +1318,7 @@ struct bnx2x {
1318#define NO_FCOE_FLAG (1 << 15) 1318#define NO_FCOE_FLAG (1 << 15)
1319#define BC_SUPPORTS_PFC_STATS (1 << 17) 1319#define BC_SUPPORTS_PFC_STATS (1 << 17)
1320#define USING_SINGLE_MSIX_FLAG (1 << 20) 1320#define USING_SINGLE_MSIX_FLAG (1 << 20)
1321#define BC_SUPPORTS_DCBX_MSG_NON_PMF (1 << 21)
1321 1322
1322#define NO_ISCSI(bp) ((bp)->flags & NO_ISCSI_FLAG) 1323#define NO_ISCSI(bp) ((bp)->flags & NO_ISCSI_FLAG)
1323#define NO_ISCSI_OOO(bp) ((bp)->flags & NO_ISCSI_OOO_FLAG) 1324#define NO_ISCSI_OOO(bp) ((bp)->flags & NO_ISCSI_OOO_FLAG)
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 829befbc20a5..00951b3aa62b 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -2274,8 +2274,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
2274 return -EBUSY; 2274 return -EBUSY;
2275 } 2275 }
2276 2276
2277 if (bp->state != BNX2X_STATE_DIAG) 2277 /* If PMF - send ADMIN DCBX msg to MFW to initiate DCBX FSM */
2278 bnx2x_dcbx_init(bp); 2278 if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG))
2279 bnx2x_dcbx_init(bp, false);
2280
2279 return 0; 2281 return 0;
2280 2282
2281#ifndef BNX2X_STOP_ON_ERROR 2283#ifndef BNX2X_STOP_ON_ERROR
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
index 12dbbc4ff9bc..daa894bd772a 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
@@ -418,7 +418,7 @@ void bnx2x_ilt_set_info(struct bnx2x *bp);
418 * 418 *
419 * @bp: driver handle 419 * @bp: driver handle
420 */ 420 */
421void bnx2x_dcbx_init(struct bnx2x *bp); 421void bnx2x_dcbx_init(struct bnx2x *bp, bool update_shmem);
422 422
423/** 423/**
424 * bnx2x_set_power_state - set power state to the requested value. 424 * bnx2x_set_power_state - set power state to the requested value.
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
index 4f9244bd7530..8a73374e52a7 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
@@ -972,23 +972,26 @@ void bnx2x_dcbx_init_params(struct bnx2x *bp)
972 bp->dcbx_config_params.admin_default_priority = 0; 972 bp->dcbx_config_params.admin_default_priority = 0;
973} 973}
974 974
975void bnx2x_dcbx_init(struct bnx2x *bp) 975void bnx2x_dcbx_init(struct bnx2x *bp, bool update_shmem)
976{ 976{
977 u32 dcbx_lldp_params_offset = SHMEM_LLDP_DCBX_PARAMS_NONE; 977 u32 dcbx_lldp_params_offset = SHMEM_LLDP_DCBX_PARAMS_NONE;
978 978
979 /* only PMF can send ADMIN msg to MFW in old MFW versions */
980 if ((!bp->port.pmf) && (!(bp->flags & BC_SUPPORTS_DCBX_MSG_NON_PMF)))
981 return;
982
979 if (bp->dcbx_enabled <= 0) 983 if (bp->dcbx_enabled <= 0)
980 return; 984 return;
981 985
982 /* validate: 986 /* validate:
983 * chip of good for dcbx version, 987 * chip of good for dcbx version,
984 * dcb is wanted 988 * dcb is wanted
985 * the function is pmf
986 * shmem2 contains DCBX support fields 989 * shmem2 contains DCBX support fields
987 */ 990 */
988 DP(BNX2X_MSG_DCB, "dcb_state %d bp->port.pmf %d\n", 991 DP(BNX2X_MSG_DCB, "dcb_state %d bp->port.pmf %d\n",
989 bp->dcb_state, bp->port.pmf); 992 bp->dcb_state, bp->port.pmf);
990 993
991 if (bp->dcb_state == BNX2X_DCB_STATE_ON && bp->port.pmf && 994 if (bp->dcb_state == BNX2X_DCB_STATE_ON &&
992 SHMEM2_HAS(bp, dcbx_lldp_params_offset)) { 995 SHMEM2_HAS(bp, dcbx_lldp_params_offset)) {
993 dcbx_lldp_params_offset = 996 dcbx_lldp_params_offset =
994 SHMEM2_RD(bp, dcbx_lldp_params_offset); 997 SHMEM2_RD(bp, dcbx_lldp_params_offset);
@@ -999,12 +1002,23 @@ void bnx2x_dcbx_init(struct bnx2x *bp)
999 bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0); 1002 bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0);
1000 1003
1001 if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) { 1004 if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) {
1002 bnx2x_dcbx_admin_mib_updated_params(bp, 1005 /* need HW lock to avoid scenario of two drivers
1003 dcbx_lldp_params_offset); 1006 * writing in parallel to shmem
1007 */
1008 bnx2x_acquire_hw_lock(bp,
1009 HW_LOCK_RESOURCE_DCBX_ADMIN_MIB);
1010 if (update_shmem)
1011 bnx2x_dcbx_admin_mib_updated_params(bp,
1012 dcbx_lldp_params_offset);
1004 1013
1005 /* Let HW start negotiation */ 1014 /* Let HW start negotiation */
1006 bnx2x_fw_command(bp, 1015 bnx2x_fw_command(bp,
1007 DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG, 0); 1016 DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG, 0);
1017 /* release HW lock only after MFW acks that it finished
1018 * reading values from shmem
1019 */
1020 bnx2x_release_hw_lock(bp,
1021 HW_LOCK_RESOURCE_DCBX_ADMIN_MIB);
1008 } 1022 }
1009 } 1023 }
1010} 1024}
@@ -2063,10 +2077,8 @@ static u8 bnx2x_dcbnl_set_all(struct net_device *netdev)
2063 "Handling parity error recovery. Try again later\n"); 2077 "Handling parity error recovery. Try again later\n");
2064 return 1; 2078 return 1;
2065 } 2079 }
2066 if (netif_running(bp->dev)) { 2080 if (netif_running(bp->dev))
2067 bnx2x_nic_unload(bp, UNLOAD_NORMAL); 2081 bnx2x_dcbx_init(bp, true);
2068 rc = bnx2x_nic_load(bp, LOAD_NORMAL);
2069 }
2070 DP(BNX2X_MSG_DCB, "set_dcbx_params done (%d)\n", rc); 2082 DP(BNX2X_MSG_DCB, "set_dcbx_params done (%d)\n", rc);
2071 if (rc) 2083 if (rc)
2072 return 1; 2084 return 1;
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
index c61aa37298a3..6b776309e0a1 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
@@ -1253,6 +1253,7 @@ struct drv_func_mb {
1253 1253
1254 #define DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG 0xb0000000 1254 #define DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG 0xb0000000
1255 #define DRV_MSG_CODE_DCBX_PMF_DRV_OK 0xb2000000 1255 #define DRV_MSG_CODE_DCBX_PMF_DRV_OK 0xb2000000
1256 #define REQ_BC_VER_4_DCBX_ADMIN_MSG_NON_PMF 0x00070401
1256 1257
1257 #define DRV_MSG_CODE_VF_DISABLED_DONE 0xc0000000 1258 #define DRV_MSG_CODE_VF_DISABLED_DONE 0xc0000000
1258 1259
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 08c8d7d5e893..8ddc78e0d945 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -9732,6 +9732,8 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)
9732 bp->flags |= (val >= REQ_BC_VER_4_PFC_STATS_SUPPORTED) ? 9732 bp->flags |= (val >= REQ_BC_VER_4_PFC_STATS_SUPPORTED) ?
9733 BC_SUPPORTS_PFC_STATS : 0; 9733 BC_SUPPORTS_PFC_STATS : 0;
9734 9734
9735 bp->flags |= (val >= REQ_BC_VER_4_DCBX_ADMIN_MSG_NON_PMF) ?
9736 BC_SUPPORTS_DCBX_MSG_NON_PMF : 0;
9735 boot_mode = SHMEM_RD(bp, 9737 boot_mode = SHMEM_RD(bp,
9736 dev_info.port_feature_config[BP_PORT(bp)].mba_config) & 9738 dev_info.port_feature_config[BP_PORT(bp)].mba_config) &
9737 PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK; 9739 PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK;
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
index bfef98f666c9..a78e35683b03 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h
@@ -5913,6 +5913,7 @@
5913#define MISC_REGISTERS_SPIO_OUTPUT_LOW 0 5913#define MISC_REGISTERS_SPIO_OUTPUT_LOW 0
5914#define MISC_REGISTERS_SPIO_SET_POS 8 5914#define MISC_REGISTERS_SPIO_SET_POS 8
5915#define HW_LOCK_MAX_RESOURCE_VALUE 31 5915#define HW_LOCK_MAX_RESOURCE_VALUE 31
5916#define HW_LOCK_RESOURCE_DCBX_ADMIN_MIB 13
5916#define HW_LOCK_RESOURCE_DRV_FLAGS 10 5917#define HW_LOCK_RESOURCE_DRV_FLAGS 10
5917#define HW_LOCK_RESOURCE_GPIO 1 5918#define HW_LOCK_RESOURCE_GPIO 1
5918#define HW_LOCK_RESOURCE_MDIO 0 5919#define HW_LOCK_RESOURCE_MDIO 0