Commit ad7dffae authored by Sasha Neftin's avatar Sasha Neftin Committed by Tony Nguyen
Browse files

igc: Add Energy Efficient Ethernet ability



According to the IEEE standard report the EEE ability (registers 7.60 and
7.62) and the EEE Link Partner ability (registers 7.61 and 7.63). Use the
kernel's 'ethtool_keee' structure and report EEE link modes.

Example:
ethtool --show-eee <device>

Before:
Advertised EEE link modes:  Not reported
Link partner advertised EEE link modes:  Not reported

After:
	Advertised EEE link modes:  100baseT/Full
	                            1000baseT/Full
	                            2500baseT/Full
	Link partner advertised EEE link modes:  100baseT/Full
	                                         1000baseT/Full
	                                         2500baseT/Full

Signed-off-by: default avatarSasha Neftin <sasha.neftin@intel.com>
Tested-by: default avatarAvigail Dahan <avigailx.dahan@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 8dcf2c21
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -652,6 +652,16 @@
#define IGC_MDIC_READY		0x10000000
#define IGC_MDIC_ERROR		0x40000000

/* EEE Link Ability */
#define IGC_EEE_2500BT_MASK	BIT(0)
#define IGC_EEE_1000BT_MASK	BIT(2)
#define IGC_EEE_100BT_MASK	BIT(1)

/* EEE Link-Partner Ability */
#define IGC_LP_EEE_2500BT_MASK	BIT(0)
#define IGC_LP_EEE_1000BT_MASK	BIT(2)
#define IGC_LP_EEE_100BT_MASK	BIT(1)

#define IGC_N0_QUEUE		-1

#define IGC_MAX_MAC_HDR_LEN	127
+72 −1
Original line number Diff line number Diff line
@@ -1631,8 +1631,11 @@ static int igc_ethtool_get_eee(struct net_device *netdev,
{
	struct igc_adapter *adapter = netdev_priv(netdev);
	struct igc_hw *hw = &adapter->hw;
	u32 eeer;
	struct igc_phy_info *phy = &hw->phy;
	u16 eee_advert, eee_lp_advert;
	u32 eeer, ret_val;

	/* EEE supported */
	linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
			 edata->supported);
	linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
@@ -1640,6 +1643,74 @@ static int igc_ethtool_get_eee(struct net_device *netdev,
	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
			 edata->supported);

	/* EEE Advertisement 1 - reg 7.60 */
	ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
				    MMD_DEVADDR_SHIFT) |
				    IGC_ANEG_EEE_AB1,
				    &eee_advert);
	if (ret_val) {
		netdev_err(adapter->netdev,
			   "Failed to read IEEE 7.60 register\n");
		return -EINVAL;
	}

	if (eee_advert & IGC_EEE_1000BT_MASK)
		linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
				 edata->advertised);

	if (eee_advert & IGC_EEE_100BT_MASK)
		linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
				 edata->advertised);

	/* EEE Advertisement 2 - reg 7.62 */
	ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
				    MMD_DEVADDR_SHIFT) |
				    IGC_ANEG_EEE_AB2,
				    &eee_advert);
	if (ret_val) {
		netdev_err(adapter->netdev,
			   "Failed to read IEEE 7.62 register\n");
		return -EINVAL;
	}

	if (eee_advert & IGC_EEE_2500BT_MASK)
		linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
				 edata->advertised);

	/* EEE Link-Partner Ability 1 - reg 7.61 */
	ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
				    MMD_DEVADDR_SHIFT) |
				    IGC_ANEG_EEE_LP_AB1,
				    &eee_lp_advert);
	if (ret_val) {
		netdev_err(adapter->netdev,
			   "Failed to read IEEE 7.61 register\n");
		return -EINVAL;
	}

	if (eee_lp_advert & IGC_LP_EEE_1000BT_MASK)
		linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
				 edata->lp_advertised);

	if (eee_lp_advert & IGC_LP_EEE_100BT_MASK)
		linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
				 edata->lp_advertised);

	/* EEE Link-Partner Ability 2 - reg 7.63 */
	ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
				    MMD_DEVADDR_SHIFT) |
				    IGC_ANEG_EEE_LP_AB2,
				    &eee_lp_advert);
	if (ret_val) {
		netdev_err(adapter->netdev,
			   "Failed to read IEEE 7.63 register\n");
		return -EINVAL;
	}

	if (eee_lp_advert & IGC_LP_EEE_2500BT_MASK)
		linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
				 edata->lp_advertised);

	eeer = rd32(IGC_EEER);

	/* EEE status on negotiated link */
+7 −0
Original line number Diff line number Diff line
@@ -310,6 +310,13 @@
#define IGC_IPCNFG	0x0E38 /* Internal PHY Configuration */
#define IGC_EEE_SU	0x0E34 /* EEE Setup */

/* EEE ANeg Advertisement Register - reg 7.60 and reg 7.62 */
#define IGC_ANEG_EEE_AB1	0x003c
#define IGC_ANEG_EEE_AB2	0x003e
/* EEE ANeg Link-Partner Advertisement Register - reg 7.61 and reg 7.63 */
#define IGC_ANEG_EEE_LP_AB1	0x003d
#define IGC_ANEG_EEE_LP_AB2	0x003f

/* LTR registers */
#define IGC_LTRC	0x01A0 /* Latency Tolerance Reporting Control */
#define IGC_LTRMINV	0x5BB0 /* LTR Minimum Value */