Commit 9876879f authored by Barak Witkowski's avatar Barak Witkowski Committed by David S. Miller

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: default avatarBarak Witkowski <barak@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0e8d2ec5
...@@ -1318,6 +1318,7 @@ struct bnx2x { ...@@ -1318,6 +1318,7 @@ struct bnx2x {
#define NO_FCOE_FLAG (1 << 15) #define NO_FCOE_FLAG (1 << 15)
#define BC_SUPPORTS_PFC_STATS (1 << 17) #define BC_SUPPORTS_PFC_STATS (1 << 17)
#define USING_SINGLE_MSIX_FLAG (1 << 20) #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(bp) ((bp)->flags & NO_ISCSI_FLAG)
#define NO_ISCSI_OOO(bp) ((bp)->flags & NO_ISCSI_OOO_FLAG) #define NO_ISCSI_OOO(bp) ((bp)->flags & NO_ISCSI_OOO_FLAG)
......
...@@ -2274,8 +2274,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) ...@@ -2274,8 +2274,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
return -EBUSY; return -EBUSY;
} }
if (bp->state != BNX2X_STATE_DIAG) /* If PMF - send ADMIN DCBX msg to MFW to initiate DCBX FSM */
bnx2x_dcbx_init(bp); if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG))
bnx2x_dcbx_init(bp, false);
return 0; return 0;
#ifndef BNX2X_STOP_ON_ERROR #ifndef BNX2X_STOP_ON_ERROR
......
...@@ -418,7 +418,7 @@ void bnx2x_ilt_set_info(struct bnx2x *bp); ...@@ -418,7 +418,7 @@ void bnx2x_ilt_set_info(struct bnx2x *bp);
* *
* @bp: driver handle * @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. * bnx2x_set_power_state - set power state to the requested value.
......
...@@ -972,23 +972,26 @@ void bnx2x_dcbx_init_params(struct bnx2x *bp) ...@@ -972,23 +972,26 @@ void bnx2x_dcbx_init_params(struct bnx2x *bp)
bp->dcbx_config_params.admin_default_priority = 0; 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; 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) if (bp->dcbx_enabled <= 0)
return; return;
/* validate: /* validate:
* chip of good for dcbx version, * chip of good for dcbx version,
* dcb is wanted * dcb is wanted
* the function is pmf
* shmem2 contains DCBX support fields * shmem2 contains DCBX support fields
*/ */
DP(BNX2X_MSG_DCB, "dcb_state %d bp->port.pmf %d\n", DP(BNX2X_MSG_DCB, "dcb_state %d bp->port.pmf %d\n",
bp->dcb_state, bp->port.pmf); 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)) { SHMEM2_HAS(bp, dcbx_lldp_params_offset)) {
dcbx_lldp_params_offset = dcbx_lldp_params_offset =
SHMEM2_RD(bp, dcbx_lldp_params_offset); SHMEM2_RD(bp, dcbx_lldp_params_offset);
...@@ -999,12 +1002,23 @@ void bnx2x_dcbx_init(struct bnx2x *bp) ...@@ -999,12 +1002,23 @@ void bnx2x_dcbx_init(struct bnx2x *bp)
bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0); bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0);
if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) { if (SHMEM_LLDP_DCBX_PARAMS_NONE != 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, bnx2x_dcbx_admin_mib_updated_params(bp,
dcbx_lldp_params_offset); dcbx_lldp_params_offset);
/* Let HW start negotiation */ /* Let HW start negotiation */
bnx2x_fw_command(bp, bnx2x_fw_command(bp,
DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG, 0); 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) ...@@ -2063,10 +2077,8 @@ static u8 bnx2x_dcbnl_set_all(struct net_device *netdev)
"Handling parity error recovery. Try again later\n"); "Handling parity error recovery. Try again later\n");
return 1; return 1;
} }
if (netif_running(bp->dev)) { if (netif_running(bp->dev))
bnx2x_nic_unload(bp, UNLOAD_NORMAL); bnx2x_dcbx_init(bp, true);
rc = bnx2x_nic_load(bp, LOAD_NORMAL);
}
DP(BNX2X_MSG_DCB, "set_dcbx_params done (%d)\n", rc); DP(BNX2X_MSG_DCB, "set_dcbx_params done (%d)\n", rc);
if (rc) if (rc)
return 1; return 1;
......
...@@ -1253,6 +1253,7 @@ struct drv_func_mb { ...@@ -1253,6 +1253,7 @@ struct drv_func_mb {
#define DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG 0xb0000000 #define DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG 0xb0000000
#define DRV_MSG_CODE_DCBX_PMF_DRV_OK 0xb2000000 #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 #define DRV_MSG_CODE_VF_DISABLED_DONE 0xc0000000
......
...@@ -9732,6 +9732,8 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp) ...@@ -9732,6 +9732,8 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)
bp->flags |= (val >= REQ_BC_VER_4_PFC_STATS_SUPPORTED) ? bp->flags |= (val >= REQ_BC_VER_4_PFC_STATS_SUPPORTED) ?
BC_SUPPORTS_PFC_STATS : 0; 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, boot_mode = SHMEM_RD(bp,
dev_info.port_feature_config[BP_PORT(bp)].mba_config) & dev_info.port_feature_config[BP_PORT(bp)].mba_config) &
PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK; PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK;
......
...@@ -5913,6 +5913,7 @@ ...@@ -5913,6 +5913,7 @@
#define MISC_REGISTERS_SPIO_OUTPUT_LOW 0 #define MISC_REGISTERS_SPIO_OUTPUT_LOW 0
#define MISC_REGISTERS_SPIO_SET_POS 8 #define MISC_REGISTERS_SPIO_SET_POS 8
#define HW_LOCK_MAX_RESOURCE_VALUE 31 #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_DRV_FLAGS 10
#define HW_LOCK_RESOURCE_GPIO 1 #define HW_LOCK_RESOURCE_GPIO 1
#define HW_LOCK_RESOURCE_MDIO 0 #define HW_LOCK_RESOURCE_MDIO 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment