|
@@ -3655,6 +3655,33 @@ static void bnx2x_ext_phy_update_adv_fc(struct bnx2x_phy *phy,
|
|
|
if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) {
|
|
|
bnx2x_cl22_read(bp, phy, 0x4, &ld_pause);
|
|
|
bnx2x_cl22_read(bp, phy, 0x5, &lp_pause);
|
|
|
+ } else if (CHIP_IS_E3(bp) &&
|
|
|
+ SINGLE_MEDIA_DIRECT(params)) {
|
|
|
+ u8 lane = bnx2x_get_warpcore_lane(phy, params);
|
|
|
+ u16 gp_status, gp_mask;
|
|
|
+ bnx2x_cl45_read(bp, phy,
|
|
|
+ MDIO_AN_DEVAD, MDIO_WC_REG_GP2_STATUS_GP_2_4,
|
|
|
+ &gp_status);
|
|
|
+ gp_mask = (MDIO_WC_REG_GP2_STATUS_GP_2_4_CL73_AN_CMPL |
|
|
|
+ MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_LP_AN_CAP) <<
|
|
|
+ lane;
|
|
|
+ if ((gp_status & gp_mask) == gp_mask) {
|
|
|
+ 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);
|
|
|
+ } else {
|
|
|
+ bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD,
|
|
|
+ MDIO_AN_REG_CL37_FC_LD, &ld_pause);
|
|
|
+ bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD,
|
|
|
+ MDIO_AN_REG_CL37_FC_LP, &lp_pause);
|
|
|
+ ld_pause = ((ld_pause &
|
|
|
+ MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH)
|
|
|
+ << 3);
|
|
|
+ lp_pause = ((lp_pause &
|
|
|
+ MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH)
|
|
|
+ << 3);
|
|
|
+ }
|
|
|
} else {
|
|
|
bnx2x_cl45_read(bp, phy,
|
|
|
MDIO_AN_DEVAD,
|