Commit fd36a2e6 authored by Yaniv Rosner's avatar Yaniv Rosner Committed by David S. Miller

bnx2x: Fix link status sync

Fix link status synchronization between the primary function, and rest functions.
Signed-off-by: default avatarYaniv Rosner <yanivr@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 020c7e3f
...@@ -1786,12 +1786,15 @@ void bnx2x_link_status_update(struct link_params *params, ...@@ -1786,12 +1786,15 @@ void bnx2x_link_status_update(struct link_params *params,
u8 link_10g; u8 link_10g;
u8 port = params->port; u8 port = params->port;
u32 sync_offset, media_types; u32 sync_offset, media_types;
/* Update PHY configuration */
set_phy_vars(params, vars);
vars->link_status = REG_RD(bp, params->shmem_base + vars->link_status = REG_RD(bp, params->shmem_base +
offsetof(struct shmem_region, offsetof(struct shmem_region,
port_mb[port].link_status)); port_mb[port].link_status));
vars->link_up = (vars->link_status & LINK_STATUS_LINK_UP); vars->link_up = (vars->link_status & LINK_STATUS_LINK_UP);
vars->phy_flags = PHY_XGXS_FLAG;
if (vars->link_up) { if (vars->link_up) {
DP(NETIF_MSG_LINK, "phy link up\n"); DP(NETIF_MSG_LINK, "phy link up\n");
...@@ -3436,7 +3439,11 @@ static int bnx2x_link_initialize(struct link_params *params, ...@@ -3436,7 +3439,11 @@ static int bnx2x_link_initialize(struct link_params *params,
} }
/* Init external phy*/ /* Init external phy*/
if (!non_ext_phy) if (non_ext_phy) {
if (params->phy[INT_PHY].supported &
SUPPORTED_FIBRE)
vars->link_status |= LINK_STATUS_SERDES_LINK;
} else {
for (phy_index = EXT_PHY1; phy_index < params->num_phys; for (phy_index = EXT_PHY1; phy_index < params->num_phys;
phy_index++) { phy_index++) {
/* /*
...@@ -3445,6 +3452,10 @@ static int bnx2x_link_initialize(struct link_params *params, ...@@ -3445,6 +3452,10 @@ static int bnx2x_link_initialize(struct link_params *params,
* need to initialize the first phy, since they are * need to initialize the first phy, since they are
* connected. * connected.
*/ */
if (params->phy[phy_index].supported &
SUPPORTED_FIBRE)
vars->link_status |= LINK_STATUS_SERDES_LINK;
if (phy_index == EXT_PHY2 && if (phy_index == EXT_PHY2 &&
(bnx2x_phy_selection(params) == (bnx2x_phy_selection(params) ==
PORT_HW_CFG_PHY_SELECTION_FIRST_PHY)) { PORT_HW_CFG_PHY_SELECTION_FIRST_PHY)) {
...@@ -3456,7 +3467,7 @@ static int bnx2x_link_initialize(struct link_params *params, ...@@ -3456,7 +3467,7 @@ static int bnx2x_link_initialize(struct link_params *params,
&params->phy[phy_index], &params->phy[phy_index],
params, vars); params, vars);
} }
}
/* Reset the interrupt indication after phy was initialized */ /* Reset the interrupt indication after phy was initialized */
bnx2x_bits_dis(bp, NIG_REG_STATUS_INTERRUPT_PORT0 + bnx2x_bits_dis(bp, NIG_REG_STATUS_INTERRUPT_PORT0 +
params->port*4, params->port*4,
...@@ -3464,6 +3475,7 @@ static int bnx2x_link_initialize(struct link_params *params, ...@@ -3464,6 +3475,7 @@ static int bnx2x_link_initialize(struct link_params *params,
NIG_STATUS_XGXS0_LINK_STATUS | NIG_STATUS_XGXS0_LINK_STATUS |
NIG_STATUS_SERDES0_LINK_STATUS | NIG_STATUS_SERDES0_LINK_STATUS |
NIG_MASK_MI_INT)); NIG_MASK_MI_INT));
bnx2x_update_mng(params, vars->link_status);
return rc; return rc;
} }
...@@ -3507,7 +3519,12 @@ static int bnx2x_update_link_down(struct link_params *params, ...@@ -3507,7 +3519,12 @@ static int bnx2x_update_link_down(struct link_params *params,
vars->mac_type = MAC_TYPE_NONE; vars->mac_type = MAC_TYPE_NONE;
/* update shared memory */ /* update shared memory */
vars->link_status = 0; vars->link_status &= ~(LINK_STATUS_SPEED_AND_DUPLEX_MASK |
LINK_STATUS_LINK_UP |
LINK_STATUS_AUTO_NEGOTIATE_COMPLETE |
LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK |
LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK |
LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK);
vars->line_speed = 0; vars->line_speed = 0;
bnx2x_update_mng(params, vars->link_status); bnx2x_update_mng(params, vars->link_status);
...@@ -3597,7 +3614,7 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars) ...@@ -3597,7 +3614,7 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars)
u8 is_mi_int = 0; u8 is_mi_int = 0;
u16 ext_phy_line_speed = 0, prev_line_speed = vars->line_speed; u16 ext_phy_line_speed = 0, prev_line_speed = vars->line_speed;
u8 active_external_phy = INT_PHY; u8 active_external_phy = INT_PHY;
vars->link_status = 0;
for (phy_index = INT_PHY; phy_index < params->num_phys; for (phy_index = INT_PHY; phy_index < params->num_phys;
phy_index++) { phy_index++) {
phy_vars[phy_index].flow_ctrl = 0; phy_vars[phy_index].flow_ctrl = 0;
...@@ -3738,6 +3755,8 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars) ...@@ -3738,6 +3755,8 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars)
if (params->phy[active_external_phy].supported & if (params->phy[active_external_phy].supported &
SUPPORTED_FIBRE) SUPPORTED_FIBRE)
vars->link_status |= LINK_STATUS_SERDES_LINK; vars->link_status |= LINK_STATUS_SERDES_LINK;
else
vars->link_status &= ~LINK_STATUS_SERDES_LINK;
DP(NETIF_MSG_LINK, "Active external phy selected: %x\n", DP(NETIF_MSG_LINK, "Active external phy selected: %x\n",
active_external_phy); active_external_phy);
} }
......
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