aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
diff options
context:
space:
mode:
authorDon Skidmore <donald.c.skidmore@intel.com>2016-10-21 21:10:54 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-11-04 20:04:58 -0400
commitd2e455a8884dcf5549ef67fcc2714ac0a64b9dc8 (patch)
tree228da8fe88d9adeeb039d12bb91fba2d1462883e /drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
parent805cedd663549bfc74dbbc5dca73810df0589396 (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.c77
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))