diff options
author | Barak Witkowski <barak@broadcom.com> | 2012-06-19 03:48:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-19 17:34:35 -0400 |
commit | 9876879fce3081cd9f3f2b9e995954d423bcd863 (patch) | |
tree | f8a923b2268ee74ea9141402be5e38d12147197c /drivers | |
parent | 0e8d2ec5c6ccf74dbe40216bb62d82c2f73fe836 (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.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | 30 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | 1 |
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 | */ |
421 | void bnx2x_dcbx_init(struct bnx2x *bp); | 421 | void 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 | ||
975 | void bnx2x_dcbx_init(struct bnx2x *bp) | 975 | void 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 |