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

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
......@@ -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
......
......@@ -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 */
......
......@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment