diff options
| author | Don Skidmore <donald.c.skidmore@intel.com> | 2016-10-21 21:10:54 -0400 |
|---|---|---|
| committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2016-11-04 20:04:58 -0400 |
| commit | d2e455a8884dcf5549ef67fcc2714ac0a64b9dc8 (patch) | |
| tree | 228da8fe88d9adeeb039d12bb91fba2d1462883e /drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | |
| parent | 805cedd663549bfc74dbbc5dca73810df0589396 (diff) | |
ixgbe: Update setup PHY link to unset all speeds
This patch updates ixgbe_setup_phy_link_generic to set/unset
auto-negotiation for all speeds. This ensures that unsupported
speeds are unset. This is necessary since the PHY NVM may
advertise unsupported speeds.
Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com>
Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c index 021ab9b89c71..648739a3904a 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | |||
| @@ -705,53 +705,52 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw) | |||
| 705 | 705 | ||
| 706 | ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg); | 706 | ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg); |
| 707 | 707 | ||
| 708 | if (speed & IXGBE_LINK_SPEED_10GB_FULL) { | 708 | /* Set or unset auto-negotiation 10G advertisement */ |
| 709 | /* Set or unset auto-negotiation 10G advertisement */ | 709 | hw->phy.ops.read_reg(hw, MDIO_AN_10GBT_CTRL, MDIO_MMD_AN, &autoneg_reg); |
| 710 | hw->phy.ops.read_reg(hw, MDIO_AN_10GBT_CTRL, | ||
| 711 | MDIO_MMD_AN, | ||
| 712 | &autoneg_reg); | ||
| 713 | 710 | ||
| 714 | autoneg_reg &= ~MDIO_AN_10GBT_CTRL_ADV10G; | 711 | autoneg_reg &= ~MDIO_AN_10GBT_CTRL_ADV10G; |
| 715 | if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) | 712 | if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) && |
| 716 | autoneg_reg |= MDIO_AN_10GBT_CTRL_ADV10G; | 713 | (speed & IXGBE_LINK_SPEED_10GB_FULL)) |
| 714 | autoneg_reg |= MDIO_AN_10GBT_CTRL_ADV10G; | ||
| 717 | 715 | ||
| 718 | hw->phy.ops.write_reg(hw, MDIO_AN_10GBT_CTRL, | 716 | hw->phy.ops.write_reg(hw, MDIO_AN_10GBT_CTRL, MDIO_MMD_AN, autoneg_reg); |
| 719 | MDIO_MMD_AN, | ||
| 720 | autoneg_reg); | ||
| 721 | } | ||
| 722 | 717 | ||
| 723 | if (speed & IXGBE_LINK_SPEED_1GB_FULL) { | 718 | hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, |
| 724 | /* Set or unset auto-negotiation 1G advertisement */ | 719 | MDIO_MMD_AN, &autoneg_reg); |
| 725 | hw->phy.ops.read_reg(hw, | ||
| 726 | IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, | ||
| 727 | MDIO_MMD_AN, | ||
| 728 | &autoneg_reg); | ||
| 729 | |||
| 730 | autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE; | ||
| 731 | if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) | ||
| 732 | autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE; | ||
| 733 | 720 | ||
| 734 | hw->phy.ops.write_reg(hw, | 721 | if (hw->mac.type == ixgbe_mac_X550) { |
| 735 | IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, | 722 | /* Set or unset auto-negotiation 5G advertisement */ |
| 736 | MDIO_MMD_AN, | 723 | autoneg_reg &= ~IXGBE_MII_5GBASE_T_ADVERTISE; |
| 737 | autoneg_reg); | 724 | if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_5GB_FULL) && |
| 725 | (speed & IXGBE_LINK_SPEED_5GB_FULL)) | ||
| 726 | autoneg_reg |= IXGBE_MII_5GBASE_T_ADVERTISE; | ||
| 727 | |||
| 728 | /* Set or unset auto-negotiation 2.5G advertisement */ | ||
| 729 | autoneg_reg &= ~IXGBE_MII_2_5GBASE_T_ADVERTISE; | ||
| 730 | if ((hw->phy.autoneg_advertised & | ||
| 731 | IXGBE_LINK_SPEED_2_5GB_FULL) && | ||
| 732 | (speed & IXGBE_LINK_SPEED_2_5GB_FULL)) | ||
| 733 | autoneg_reg |= IXGBE_MII_2_5GBASE_T_ADVERTISE; | ||
| 738 | } | 734 | } |
| 739 | 735 | ||
| 740 | if (speed & IXGBE_LINK_SPEED_100_FULL) { | 736 | /* Set or unset auto-negotiation 1G advertisement */ |
| 741 | /* Set or unset auto-negotiation 100M advertisement */ | 737 | autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE; |
| 742 | hw->phy.ops.read_reg(hw, MDIO_AN_ADVERTISE, | 738 | if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) && |
| 743 | MDIO_MMD_AN, | 739 | (speed & IXGBE_LINK_SPEED_1GB_FULL)) |
| 744 | &autoneg_reg); | 740 | autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE; |
| 745 | 741 | ||
| 746 | autoneg_reg &= ~(ADVERTISE_100FULL | | 742 | hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, |
| 747 | ADVERTISE_100HALF); | 743 | MDIO_MMD_AN, autoneg_reg); |
| 748 | if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) | ||
| 749 | autoneg_reg |= ADVERTISE_100FULL; | ||
| 750 | 744 | ||
| 751 | hw->phy.ops.write_reg(hw, MDIO_AN_ADVERTISE, | 745 | /* Set or unset auto-negotiation 100M advertisement */ |
| 752 | MDIO_MMD_AN, | 746 | hw->phy.ops.read_reg(hw, MDIO_AN_ADVERTISE, MDIO_MMD_AN, &autoneg_reg); |
| 753 | autoneg_reg); | 747 | |
| 754 | } | 748 | autoneg_reg &= ~(ADVERTISE_100FULL | ADVERTISE_100HALF); |
| 749 | if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) && | ||
| 750 | (speed & IXGBE_LINK_SPEED_100_FULL)) | ||
| 751 | autoneg_reg |= ADVERTISE_100FULL; | ||
| 752 | |||
| 753 | hw->phy.ops.write_reg(hw, MDIO_AN_ADVERTISE, MDIO_MMD_AN, autoneg_reg); | ||
| 755 | 754 | ||
| 756 | /* Blocked by MNG FW so don't reset PHY */ | 755 | /* Blocked by MNG FW so don't reset PHY */ |
| 757 | if (ixgbe_check_reset_blocked(hw)) | 756 | if (ixgbe_check_reset_blocked(hw)) |
