mirror of https://gitee.com/openkylin/linux.git
bnx2x: Fix grammar and relocate code
This patch relocates some functions as a preparation for next patches, and also fixes some grammar mistakes. Signed-off-by: Yaniv Rosner <yanivr@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bac27bd941
commit
9045f6b44a
|
@ -509,7 +509,7 @@ static void bnx2x_emac_init(struct link_params *params,
|
|||
}
|
||||
|
||||
static int bnx2x_emac_enable(struct link_params *params,
|
||||
struct link_vars *vars, u8 lb)
|
||||
struct link_vars *vars, u8 lb)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u8 port = params->port;
|
||||
|
@ -1613,7 +1613,172 @@ static void bnx2x_xgxs_deassert(struct link_params *params)
|
|||
params->phy[INT_PHY].def_md_devad);
|
||||
}
|
||||
|
||||
static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy,
|
||||
struct link_params *params, u16 *ieee_fc)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
*ieee_fc = MDIO_COMBO_IEEE0_AUTO_NEG_ADV_FULL_DUPLEX;
|
||||
/**
|
||||
* resolve pause mode and advertisement Please refer to Table
|
||||
* 28B-3 of the 802.3ab-1999 spec
|
||||
*/
|
||||
|
||||
switch (phy->req_flow_ctrl) {
|
||||
case BNX2X_FLOW_CTRL_AUTO:
|
||||
if (params->req_fc_auto_adv == BNX2X_FLOW_CTRL_BOTH)
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
|
||||
else
|
||||
*ieee_fc |=
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
|
||||
break;
|
||||
|
||||
case BNX2X_FLOW_CTRL_TX:
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
|
||||
break;
|
||||
|
||||
case BNX2X_FLOW_CTRL_RX:
|
||||
case BNX2X_FLOW_CTRL_BOTH:
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
|
||||
break;
|
||||
|
||||
case BNX2X_FLOW_CTRL_NONE:
|
||||
default:
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_NONE;
|
||||
break;
|
||||
}
|
||||
DP(NETIF_MSG_LINK, "ieee_fc = 0x%x\n", *ieee_fc);
|
||||
}
|
||||
|
||||
static void set_phy_vars(struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u8 actual_phy_idx, phy_index, link_cfg_idx;
|
||||
u8 phy_config_swapped = params->multi_phy_config &
|
||||
PORT_HW_CFG_PHY_SWAPPED_ENABLED;
|
||||
for (phy_index = INT_PHY; phy_index < params->num_phys;
|
||||
phy_index++) {
|
||||
link_cfg_idx = LINK_CONFIG_IDX(phy_index);
|
||||
actual_phy_idx = phy_index;
|
||||
if (phy_config_swapped) {
|
||||
if (phy_index == EXT_PHY1)
|
||||
actual_phy_idx = EXT_PHY2;
|
||||
else if (phy_index == EXT_PHY2)
|
||||
actual_phy_idx = EXT_PHY1;
|
||||
}
|
||||
params->phy[actual_phy_idx].req_flow_ctrl =
|
||||
params->req_flow_ctrl[link_cfg_idx];
|
||||
|
||||
params->phy[actual_phy_idx].req_line_speed =
|
||||
params->req_line_speed[link_cfg_idx];
|
||||
|
||||
params->phy[actual_phy_idx].speed_cap_mask =
|
||||
params->speed_cap_mask[link_cfg_idx];
|
||||
|
||||
params->phy[actual_phy_idx].req_duplex =
|
||||
params->req_duplex[link_cfg_idx];
|
||||
|
||||
if (params->req_line_speed[link_cfg_idx] ==
|
||||
SPEED_AUTO_NEG)
|
||||
vars->link_status |= LINK_STATUS_AUTO_NEGOTIATE_ENABLED;
|
||||
|
||||
DP(NETIF_MSG_LINK, "req_flow_ctrl %x, req_line_speed %x,"
|
||||
" speed_cap_mask %x\n",
|
||||
params->phy[actual_phy_idx].req_flow_ctrl,
|
||||
params->phy[actual_phy_idx].req_line_speed,
|
||||
params->phy[actual_phy_idx].speed_cap_mask);
|
||||
}
|
||||
}
|
||||
|
||||
static void bnx2x_ext_phy_set_pause(struct link_params *params,
|
||||
struct bnx2x_phy *phy,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
u16 val;
|
||||
struct bnx2x *bp = params->bp;
|
||||
/* read modify write pause advertizing */
|
||||
bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV_PAUSE, &val);
|
||||
|
||||
val &= ~MDIO_AN_REG_ADV_PAUSE_BOTH;
|
||||
|
||||
/* Please refer to Table 28B-3 of 802.3ab-1999 spec. */
|
||||
bnx2x_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc);
|
||||
if ((vars->ieee_fc &
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) ==
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) {
|
||||
val |= MDIO_AN_REG_ADV_PAUSE_ASYMMETRIC;
|
||||
}
|
||||
if ((vars->ieee_fc &
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) ==
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) {
|
||||
val |= MDIO_AN_REG_ADV_PAUSE_PAUSE;
|
||||
}
|
||||
DP(NETIF_MSG_LINK, "Ext phy AN advertize 0x%x\n", val);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV_PAUSE, val);
|
||||
}
|
||||
|
||||
static void bnx2x_pause_resolve(struct link_vars *vars, u32 pause_result)
|
||||
{ /* LD LP */
|
||||
switch (pause_result) { /* ASYM P ASYM P */
|
||||
case 0xb: /* 1 0 1 1 */
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_TX;
|
||||
break;
|
||||
|
||||
case 0xe: /* 1 1 1 0 */
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_RX;
|
||||
break;
|
||||
|
||||
case 0x5: /* 0 1 0 1 */
|
||||
case 0x7: /* 0 1 1 1 */
|
||||
case 0xd: /* 1 1 0 1 */
|
||||
case 0xf: /* 1 1 1 1 */
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_BOTH;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (pause_result & (1<<0))
|
||||
vars->link_status |= LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE;
|
||||
if (pause_result & (1<<1))
|
||||
vars->link_status |= LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE;
|
||||
}
|
||||
|
||||
static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,
|
||||
struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u16 ld_pause; /* local */
|
||||
u16 lp_pause; /* link partner */
|
||||
u16 pause_result;
|
||||
u8 ret = 0;
|
||||
/* read twice */
|
||||
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
|
||||
if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO)
|
||||
vars->flow_ctrl = phy->req_flow_ctrl;
|
||||
else if (phy->req_line_speed != SPEED_AUTO_NEG)
|
||||
vars->flow_ctrl = params->req_fc_auto_adv;
|
||||
else if (vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
|
||||
ret = 1;
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_AN_DEVAD,
|
||||
MDIO_AN_REG_ADV_PAUSE, &ld_pause);
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_AN_DEVAD,
|
||||
MDIO_AN_REG_LP_AUTO_NEG, &lp_pause);
|
||||
pause_result = (ld_pause &
|
||||
MDIO_AN_REG_ADV_PAUSE_MASK) >> 8;
|
||||
pause_result |= (lp_pause &
|
||||
MDIO_AN_REG_ADV_PAUSE_MASK) >> 10;
|
||||
DP(NETIF_MSG_LINK, "Ext PHY pause result 0x%x\n",
|
||||
pause_result);
|
||||
bnx2x_pause_resolve(vars, pause_result);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
void bnx2x_link_status_update(struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
|
@ -2078,8 +2243,8 @@ static void bnx2x_program_serdes(struct bnx2x_phy *phy,
|
|||
|
||||
}
|
||||
|
||||
static void bnx2x_set_brcm_cl37_advertisment(struct bnx2x_phy *phy,
|
||||
struct link_params *params)
|
||||
static void bnx2x_set_brcm_cl37_advertisement(struct bnx2x_phy *phy,
|
||||
struct link_params *params)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u16 val = 0;
|
||||
|
@ -2100,44 +2265,9 @@ static void bnx2x_set_brcm_cl37_advertisment(struct bnx2x_phy *phy,
|
|||
MDIO_OVER_1G_UP3, 0x400);
|
||||
}
|
||||
|
||||
static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy,
|
||||
struct link_params *params, u16 *ieee_fc)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
*ieee_fc = MDIO_COMBO_IEEE0_AUTO_NEG_ADV_FULL_DUPLEX;
|
||||
/*
|
||||
* Resolve pause mode and advertisement.
|
||||
* Please refer to Table 28B-3 of the 802.3ab-1999 spec
|
||||
*/
|
||||
|
||||
switch (phy->req_flow_ctrl) {
|
||||
case BNX2X_FLOW_CTRL_AUTO:
|
||||
if (params->req_fc_auto_adv == BNX2X_FLOW_CTRL_BOTH)
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
|
||||
else
|
||||
*ieee_fc |=
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
|
||||
break;
|
||||
case BNX2X_FLOW_CTRL_TX:
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
|
||||
break;
|
||||
|
||||
case BNX2X_FLOW_CTRL_RX:
|
||||
case BNX2X_FLOW_CTRL_BOTH:
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
|
||||
break;
|
||||
|
||||
case BNX2X_FLOW_CTRL_NONE:
|
||||
default:
|
||||
*ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_NONE;
|
||||
break;
|
||||
}
|
||||
DP(NETIF_MSG_LINK, "ieee_fc = 0x%x\n", *ieee_fc);
|
||||
}
|
||||
|
||||
static void bnx2x_set_ieee_aneg_advertisment(struct bnx2x_phy *phy,
|
||||
struct link_params *params,
|
||||
u16 ieee_fc)
|
||||
static void bnx2x_set_ieee_aneg_advertisement(struct bnx2x_phy *phy,
|
||||
struct link_params *params,
|
||||
u16 ieee_fc)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u16 val;
|
||||
|
@ -2271,33 +2401,6 @@ static void bnx2x_initialize_sgmii_process(struct bnx2x_phy *phy,
|
|||
* link management
|
||||
*/
|
||||
|
||||
static void bnx2x_pause_resolve(struct link_vars *vars, u32 pause_result)
|
||||
{ /* LD LP */
|
||||
switch (pause_result) { /* ASYM P ASYM P */
|
||||
case 0xb: /* 1 0 1 1 */
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_TX;
|
||||
break;
|
||||
|
||||
case 0xe: /* 1 1 1 0 */
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_RX;
|
||||
break;
|
||||
|
||||
case 0x5: /* 0 1 0 1 */
|
||||
case 0x7: /* 0 1 1 1 */
|
||||
case 0xd: /* 1 1 0 1 */
|
||||
case 0xf: /* 1 1 1 1 */
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_BOTH;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (pause_result & (1<<0))
|
||||
vars->link_status |= LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE;
|
||||
if (pause_result & (1<<1))
|
||||
vars->link_status |= LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE;
|
||||
}
|
||||
|
||||
static int bnx2x_direct_parallel_detect_used(struct bnx2x_phy *phy,
|
||||
struct link_params *params)
|
||||
{
|
||||
|
@ -2402,7 +2505,7 @@ static void bnx2x_check_fallback_to_cl37(struct bnx2x_phy *phy,
|
|||
struct link_params *params)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u16 rx_status, ustat_val, cl37_fsm_recieved;
|
||||
u16 rx_status, ustat_val, cl37_fsm_received;
|
||||
DP(NETIF_MSG_LINK, "bnx2x_check_fallback_to_cl37\n");
|
||||
/* Step 1: Make sure signal is detected */
|
||||
CL22_RD_OVER_CL45(bp, phy,
|
||||
|
@ -2440,15 +2543,15 @@ static void bnx2x_check_fallback_to_cl37(struct bnx2x_phy *phy,
|
|||
CL22_RD_OVER_CL45(bp, phy,
|
||||
MDIO_REG_BANK_REMOTE_PHY,
|
||||
MDIO_REMOTE_PHY_MISC_RX_STATUS,
|
||||
&cl37_fsm_recieved);
|
||||
if ((cl37_fsm_recieved &
|
||||
&cl37_fsm_received);
|
||||
if ((cl37_fsm_received &
|
||||
(MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_OVER1G_MSG |
|
||||
MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_BRCM_OUI_MSG)) !=
|
||||
(MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_OVER1G_MSG |
|
||||
MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_BRCM_OUI_MSG)) {
|
||||
DP(NETIF_MSG_LINK, "No CL37 FSM were received. "
|
||||
"misc_rx_status(0x8330) = 0x%x\n",
|
||||
cl37_fsm_recieved);
|
||||
cl37_fsm_received);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
|
@ -2761,11 +2864,11 @@ static void bnx2x_init_internal_phy(struct bnx2x_phy *phy,
|
|||
DP(NETIF_MSG_LINK, "not SGMII, AN\n");
|
||||
|
||||
/* AN enabled */
|
||||
bnx2x_set_brcm_cl37_advertisment(phy, params);
|
||||
bnx2x_set_brcm_cl37_advertisement(phy, params);
|
||||
|
||||
/* program duplex & pause advertisement (for aneg) */
|
||||
bnx2x_set_ieee_aneg_advertisment(phy, params,
|
||||
vars->ieee_fc);
|
||||
bnx2x_set_ieee_aneg_advertisement(phy, params,
|
||||
vars->ieee_fc);
|
||||
|
||||
/* enable autoneg */
|
||||
bnx2x_set_autoneg(phy, params, vars, enable_cl73);
|
||||
|
@ -3338,7 +3441,8 @@ static int bnx2x_link_initialize(struct link_params *params,
|
|||
if (phy_index == EXT_PHY2 &&
|
||||
(bnx2x_phy_selection(params) ==
|
||||
PORT_HW_CFG_PHY_SELECTION_FIRST_PHY)) {
|
||||
DP(NETIF_MSG_LINK, "Ignoring second phy\n");
|
||||
DP(NETIF_MSG_LINK, "Not initializing"
|
||||
" second phy\n");
|
||||
continue;
|
||||
}
|
||||
params->phy[phy_index].config_init(
|
||||
|
@ -3520,7 +3624,7 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars)
|
|||
* Step 1:
|
||||
* Check external link change only for external phys, and apply
|
||||
* priority selection between them in case the link on both phys
|
||||
* is up. Note that the instead of the common vars, a temporary
|
||||
* is up. Note that instead of the common vars, a temporary
|
||||
* vars argument is used since each phy may have different link/
|
||||
* speed/duplex result
|
||||
*/
|
||||
|
@ -3704,7 +3808,7 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars)
|
|||
}
|
||||
/*
|
||||
* Link is up only if both local phy and external phy (in case of
|
||||
* non-direct board) are up
|
||||
* non-direct board) are up and no fault detected on active PHY.
|
||||
*/
|
||||
vars->link_up = (vars->phy_link_up &&
|
||||
(ext_phy_link_up ||
|
||||
|
@ -3756,69 +3860,6 @@ static void bnx2x_save_bcm_spirom_ver(struct bnx2x *bp,
|
|||
phy->ver_addr);
|
||||
}
|
||||
|
||||
static void bnx2x_ext_phy_set_pause(struct link_params *params,
|
||||
struct bnx2x_phy *phy,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
u16 val;
|
||||
struct bnx2x *bp = params->bp;
|
||||
/* read modify write pause advertizing */
|
||||
bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV_PAUSE, &val);
|
||||
|
||||
val &= ~MDIO_AN_REG_ADV_PAUSE_BOTH;
|
||||
|
||||
/* Please refer to Table 28B-3 of 802.3ab-1999 spec. */
|
||||
bnx2x_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc);
|
||||
if ((vars->ieee_fc &
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) ==
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) {
|
||||
val |= MDIO_AN_REG_ADV_PAUSE_ASYMMETRIC;
|
||||
}
|
||||
if ((vars->ieee_fc &
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) ==
|
||||
MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) {
|
||||
val |= MDIO_AN_REG_ADV_PAUSE_PAUSE;
|
||||
}
|
||||
DP(NETIF_MSG_LINK, "Ext phy AN advertize 0x%x\n", val);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV_PAUSE, val);
|
||||
}
|
||||
|
||||
static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,
|
||||
struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u16 ld_pause; /* local */
|
||||
u16 lp_pause; /* link partner */
|
||||
u16 pause_result;
|
||||
u8 ret = 0;
|
||||
/* read twice */
|
||||
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
|
||||
if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO)
|
||||
vars->flow_ctrl = phy->req_flow_ctrl;
|
||||
else if (phy->req_line_speed != SPEED_AUTO_NEG)
|
||||
vars->flow_ctrl = params->req_fc_auto_adv;
|
||||
else if (vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
|
||||
ret = 1;
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_AN_DEVAD,
|
||||
MDIO_AN_REG_ADV_PAUSE, &ld_pause);
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_AN_DEVAD,
|
||||
MDIO_AN_REG_LP_AUTO_NEG, &lp_pause);
|
||||
pause_result = (ld_pause &
|
||||
MDIO_AN_REG_ADV_PAUSE_MASK) >> 8;
|
||||
pause_result |= (lp_pause &
|
||||
MDIO_AN_REG_ADV_PAUSE_MASK) >> 10;
|
||||
DP(NETIF_MSG_LINK, "Ext PHY pause result 0x%x\n",
|
||||
pause_result);
|
||||
bnx2x_pause_resolve(vars, pause_result);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void bnx2x_ext_phy_10G_an_resolve(struct bnx2x *bp,
|
||||
struct bnx2x_phy *phy,
|
||||
struct link_vars *vars)
|
||||
|
@ -4732,8 +4773,7 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
|
|||
params,
|
||||
SFP_EEPROM_FC_TX_TECH_ADDR,
|
||||
1,
|
||||
&copper_module_type) !=
|
||||
0) {
|
||||
&copper_module_type) != 0) {
|
||||
DP(NETIF_MSG_LINK,
|
||||
"Failed to read copper-cable-type"
|
||||
" from SFP+ EEPROM\n");
|
||||
|
@ -5938,7 +5978,7 @@ static u8 bnx2x_8727_read_status(struct bnx2x_phy *phy,
|
|||
if (!lasi_ctrl)
|
||||
return 0;
|
||||
|
||||
/* Check the LASI */
|
||||
/* Check the LASI on Rx */
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM,
|
||||
&rx_alarm_status);
|
||||
|
@ -6322,10 +6362,10 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,
|
|||
(phy->speed_cap_mask &
|
||||
PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) ||
|
||||
(phy->req_line_speed == SPEED_10000)) {
|
||||
DP(NETIF_MSG_LINK, "Advertising 10G\n");
|
||||
/* Restart autoneg for 10G*/
|
||||
DP(NETIF_MSG_LINK, "Advertising 10G\n");
|
||||
/* Restart autoneg for 10G*/
|
||||
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_AN_DEVAD, MDIO_AN_REG_CTRL,
|
||||
0x3200);
|
||||
} else if (phy->req_line_speed != SPEED_10 &&
|
||||
|
@ -7031,9 +7071,8 @@ static void bnx2x_7101_set_link_led(struct bnx2x_phy *phy,
|
|||
static struct bnx2x_phy phy_null = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN,
|
||||
.addr = 0,
|
||||
.flags = FLAGS_INIT_XGXS_FIRST,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = FLAGS_INIT_XGXS_FIRST,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7058,9 +7097,8 @@ static struct bnx2x_phy phy_null = {
|
|||
static struct bnx2x_phy phy_serdes = {
|
||||
.type = PORT_HW_CFG_SERDES_EXT_PHY_TYPE_DIRECT,
|
||||
.addr = 0xff,
|
||||
.flags = 0,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = 0,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7094,9 +7132,8 @@ static struct bnx2x_phy phy_serdes = {
|
|||
static struct bnx2x_phy phy_xgxs = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT,
|
||||
.addr = 0xff,
|
||||
.flags = 0,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = 0,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7131,9 +7168,8 @@ static struct bnx2x_phy phy_xgxs = {
|
|||
static struct bnx2x_phy phy_7101 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101,
|
||||
.addr = 0xff,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7161,9 +7197,8 @@ static struct bnx2x_phy phy_7101 = {
|
|||
static struct bnx2x_phy phy_8073 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
|
||||
.addr = 0xff,
|
||||
.flags = FLAGS_HW_LOCK_REQUIRED,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = FLAGS_HW_LOCK_REQUIRED,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7193,9 +7228,8 @@ static struct bnx2x_phy phy_8073 = {
|
|||
static struct bnx2x_phy phy_8705 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705,
|
||||
.addr = 0xff,
|
||||
.flags = FLAGS_INIT_XGXS_FIRST,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = FLAGS_INIT_XGXS_FIRST,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7222,9 +7256,8 @@ static struct bnx2x_phy phy_8705 = {
|
|||
static struct bnx2x_phy phy_8706 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706,
|
||||
.addr = 0xff,
|
||||
.flags = FLAGS_INIT_XGXS_FIRST,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = FLAGS_INIT_XGXS_FIRST,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7253,10 +7286,9 @@ static struct bnx2x_phy phy_8706 = {
|
|||
static struct bnx2x_phy phy_8726 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726,
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = (FLAGS_HW_LOCK_REQUIRED |
|
||||
FLAGS_INIT_XGXS_FIRST),
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7286,9 +7318,8 @@ static struct bnx2x_phy phy_8726 = {
|
|||
static struct bnx2x_phy phy_8727 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727,
|
||||
.addr = 0xff,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7316,10 +7347,9 @@ static struct bnx2x_phy phy_8727 = {
|
|||
static struct bnx2x_phy phy_8481 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481,
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ |
|
||||
FLAGS_REARM_LATCH_SIGNAL,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7353,10 +7383,9 @@ static struct bnx2x_phy phy_8481 = {
|
|||
static struct bnx2x_phy phy_84823 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823,
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ |
|
||||
FLAGS_REARM_LATCH_SIGNAL,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7390,10 +7419,9 @@ static struct bnx2x_phy phy_84823 = {
|
|||
static struct bnx2x_phy phy_84833 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833,
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ |
|
||||
FLAGS_REARM_LATCH_SIGNAL,
|
||||
.def_md_devad = 0,
|
||||
.reserved = 0,
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
|
@ -7827,40 +7855,89 @@ int bnx2x_phy_probe(struct link_params *params)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void set_phy_vars(struct link_params *params)
|
||||
void bnx2x_init_bmac_loopback(struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u8 actual_phy_idx, phy_index, link_cfg_idx;
|
||||
u8 phy_config_swapped = params->multi_phy_config &
|
||||
PORT_HW_CFG_PHY_SWAPPED_ENABLED;
|
||||
for (phy_index = INT_PHY; phy_index < params->num_phys;
|
||||
phy_index++) {
|
||||
link_cfg_idx = LINK_CONFIG_IDX(phy_index);
|
||||
actual_phy_idx = phy_index;
|
||||
if (phy_config_swapped) {
|
||||
if (phy_index == EXT_PHY1)
|
||||
actual_phy_idx = EXT_PHY2;
|
||||
else if (phy_index == EXT_PHY2)
|
||||
actual_phy_idx = EXT_PHY1;
|
||||
vars->link_up = 1;
|
||||
vars->line_speed = SPEED_10000;
|
||||
vars->duplex = DUPLEX_FULL;
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
vars->mac_type = MAC_TYPE_BMAC;
|
||||
|
||||
vars->phy_flags = PHY_XGXS_FLAG;
|
||||
|
||||
bnx2x_xgxs_deassert(params);
|
||||
|
||||
/* set bmac loopback */
|
||||
bnx2x_bmac_enable(params, vars, 1);
|
||||
|
||||
REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
|
||||
}
|
||||
|
||||
void bnx2x_init_emac_loopback(struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
vars->link_up = 1;
|
||||
vars->line_speed = SPEED_1000;
|
||||
vars->duplex = DUPLEX_FULL;
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
vars->mac_type = MAC_TYPE_EMAC;
|
||||
|
||||
vars->phy_flags = PHY_XGXS_FLAG;
|
||||
|
||||
bnx2x_xgxs_deassert(params);
|
||||
/* set bmac loopback */
|
||||
bnx2x_emac_enable(params, vars, 1);
|
||||
bnx2x_emac_program(params, vars);
|
||||
REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
|
||||
}
|
||||
|
||||
void bnx2x_init_xgxs_loopback(struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
vars->link_up = 1;
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
vars->duplex = DUPLEX_FULL;
|
||||
if (params->req_line_speed[0] == SPEED_1000)
|
||||
vars->line_speed = SPEED_1000;
|
||||
else
|
||||
vars->line_speed = SPEED_10000;
|
||||
|
||||
|
||||
bnx2x_xgxs_deassert(params);
|
||||
bnx2x_link_initialize(params, vars);
|
||||
|
||||
if (params->req_line_speed[0] == SPEED_1000) {
|
||||
bnx2x_emac_program(params, vars);
|
||||
bnx2x_emac_enable(params, vars, 0);
|
||||
|
||||
} else
|
||||
bnx2x_bmac_enable(params, vars, 0);
|
||||
|
||||
|
||||
if (params->loopback_mode == LOOPBACK_XGXS) {
|
||||
/* set 10G XGXS loopback */
|
||||
params->phy[INT_PHY].config_loopback(
|
||||
¶ms->phy[INT_PHY],
|
||||
params);
|
||||
|
||||
} else {
|
||||
/* set external phy loopback */
|
||||
u8 phy_index;
|
||||
for (phy_index = EXT_PHY1;
|
||||
phy_index < params->num_phys; phy_index++) {
|
||||
if (params->phy[phy_index].config_loopback)
|
||||
params->phy[phy_index].config_loopback(
|
||||
¶ms->phy[phy_index],
|
||||
params);
|
||||
}
|
||||
}
|
||||
params->phy[actual_phy_idx].req_flow_ctrl =
|
||||
params->req_flow_ctrl[link_cfg_idx];
|
||||
REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
|
||||
|
||||
params->phy[actual_phy_idx].req_line_speed =
|
||||
params->req_line_speed[link_cfg_idx];
|
||||
|
||||
params->phy[actual_phy_idx].speed_cap_mask =
|
||||
params->speed_cap_mask[link_cfg_idx];
|
||||
|
||||
params->phy[actual_phy_idx].req_duplex =
|
||||
params->req_duplex[link_cfg_idx];
|
||||
|
||||
DP(NETIF_MSG_LINK, "req_flow_ctrl %x, req_line_speed %x,"
|
||||
" speed_cap_mask %x\n",
|
||||
params->phy[actual_phy_idx].req_flow_ctrl,
|
||||
params->phy[actual_phy_idx].req_line_speed,
|
||||
params->phy[actual_phy_idx].speed_cap_mask);
|
||||
}
|
||||
bnx2x_set_led(params, vars, LED_MODE_OPER, vars->line_speed);
|
||||
}
|
||||
|
||||
int bnx2x_phy_init(struct link_params *params, struct link_vars *vars)
|
||||
|
@ -7893,88 +7970,22 @@ int bnx2x_phy_init(struct link_params *params, struct link_vars *vars)
|
|||
DP(NETIF_MSG_LINK, "No phy found for initialization !!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
set_phy_vars(params);
|
||||
set_phy_vars(params, vars);
|
||||
|
||||
DP(NETIF_MSG_LINK, "Num of phys on board: %d\n", params->num_phys);
|
||||
if (params->loopback_mode == LOOPBACK_BMAC) {
|
||||
|
||||
vars->link_up = 1;
|
||||
vars->line_speed = SPEED_10000;
|
||||
vars->duplex = DUPLEX_FULL;
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
vars->mac_type = MAC_TYPE_BMAC;
|
||||
|
||||
vars->phy_flags = PHY_XGXS_FLAG;
|
||||
|
||||
bnx2x_xgxs_deassert(params);
|
||||
|
||||
/* set bmac loopback */
|
||||
bnx2x_bmac_enable(params, vars, 1);
|
||||
|
||||
REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
|
||||
|
||||
} else if (params->loopback_mode == LOOPBACK_EMAC) {
|
||||
|
||||
vars->link_up = 1;
|
||||
vars->line_speed = SPEED_1000;
|
||||
vars->duplex = DUPLEX_FULL;
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
vars->mac_type = MAC_TYPE_EMAC;
|
||||
|
||||
vars->phy_flags = PHY_XGXS_FLAG;
|
||||
|
||||
bnx2x_xgxs_deassert(params);
|
||||
/* set bmac loopback */
|
||||
bnx2x_emac_enable(params, vars, 1);
|
||||
bnx2x_emac_program(params, vars);
|
||||
REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
|
||||
|
||||
} else if ((params->loopback_mode == LOOPBACK_XGXS) ||
|
||||
(params->loopback_mode == LOOPBACK_EXT_PHY)) {
|
||||
|
||||
vars->link_up = 1;
|
||||
vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
|
||||
vars->duplex = DUPLEX_FULL;
|
||||
if (params->req_line_speed[0] == SPEED_1000) {
|
||||
vars->line_speed = SPEED_1000;
|
||||
vars->mac_type = MAC_TYPE_EMAC;
|
||||
} else {
|
||||
vars->line_speed = SPEED_10000;
|
||||
vars->mac_type = MAC_TYPE_BMAC;
|
||||
}
|
||||
|
||||
bnx2x_xgxs_deassert(params);
|
||||
bnx2x_link_initialize(params, vars);
|
||||
|
||||
if (params->req_line_speed[0] == SPEED_1000) {
|
||||
bnx2x_emac_program(params, vars);
|
||||
bnx2x_emac_enable(params, vars, 0);
|
||||
} else
|
||||
bnx2x_bmac_enable(params, vars, 0);
|
||||
if (params->loopback_mode == LOOPBACK_XGXS) {
|
||||
/* set 10G XGXS loopback */
|
||||
params->phy[INT_PHY].config_loopback(
|
||||
¶ms->phy[INT_PHY],
|
||||
params);
|
||||
|
||||
} else {
|
||||
/* set external phy loopback */
|
||||
u8 phy_index;
|
||||
for (phy_index = EXT_PHY1;
|
||||
phy_index < params->num_phys; phy_index++) {
|
||||
if (params->phy[phy_index].config_loopback)
|
||||
params->phy[phy_index].config_loopback(
|
||||
¶ms->phy[phy_index],
|
||||
params);
|
||||
}
|
||||
}
|
||||
REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
|
||||
|
||||
bnx2x_set_led(params, vars,
|
||||
LED_MODE_OPER, vars->line_speed);
|
||||
} else
|
||||
/* No loopback */
|
||||
{
|
||||
switch (params->loopback_mode) {
|
||||
case LOOPBACK_BMAC:
|
||||
bnx2x_init_bmac_loopback(params, vars);
|
||||
break;
|
||||
case LOOPBACK_EMAC:
|
||||
bnx2x_init_emac_loopback(params, vars);
|
||||
break;
|
||||
case LOOPBACK_XGXS:
|
||||
case LOOPBACK_EXT_PHY:
|
||||
bnx2x_init_xgxs_loopback(params, vars);
|
||||
break;
|
||||
default:
|
||||
/* No loopback */
|
||||
if (params->switch_cfg == SWITCH_CFG_10G)
|
||||
bnx2x_xgxs_deassert(params);
|
||||
else
|
||||
|
@ -7983,6 +7994,7 @@ int bnx2x_phy_init(struct link_params *params, struct link_vars *vars)
|
|||
bnx2x_link_initialize(params, vars);
|
||||
msleep(30);
|
||||
bnx2x_link_int_enable(params);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -121,8 +121,8 @@ struct bnx2x_phy {
|
|||
|
||||
/* Loaded during init */
|
||||
u8 addr;
|
||||
|
||||
u8 flags;
|
||||
u8 def_md_devad;
|
||||
u16 flags;
|
||||
/* Require HW lock */
|
||||
#define FLAGS_HW_LOCK_REQUIRED (1<<0)
|
||||
/* No Over-Current detection */
|
||||
|
@ -134,8 +134,6 @@ struct bnx2x_phy {
|
|||
#define FLAGS_REARM_LATCH_SIGNAL (1<<6)
|
||||
#define FLAGS_SFP_NOT_APPROVED (1<<7)
|
||||
|
||||
u8 def_md_devad;
|
||||
u8 reserved;
|
||||
/* preemphasis values for the rx side */
|
||||
u16 rx_preemphasis[4];
|
||||
|
||||
|
|
Loading…
Reference in New Issue