Skip to content

Commit

Permalink
net: intel: igb: Use linkmode helpers for EEE
Browse files Browse the repository at this point in the history
Make use of the existing linkmode helpers for converting PHY EEE
register values into links modes, now that ethtool_keee uses link
modes, rather than u32 values.

Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Andrew Lunn authored and David S. Miller committed Feb 28, 2024
1 parent 02de174 commit 41b9797
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions drivers/net/ethernet/intel/igb/igb_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -3038,11 +3038,13 @@ static int igb_get_eee(struct net_device *netdev, struct ethtool_keee *edata)
(hw->phy.media_type != e1000_media_type_copper))
return -EOPNOTSUPP;

edata->supported_u32 = (SUPPORTED_1000baseT_Full |
SUPPORTED_100baseT_Full);
linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
edata->supported);
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
edata->supported);
if (!hw->dev_spec._82575.eee_disable)
edata->advertised_u32 =
mmd_eee_adv_to_ethtool_adv_t(adapter->eee_advert);
mii_eee_cap1_mod_linkmode_t(edata->advertised,
adapter->eee_advert);

/* The IPCNFG and EEER registers are not supported on I354. */
if (hw->mac.type == e1000_i354) {
Expand All @@ -3068,7 +3070,7 @@ static int igb_get_eee(struct net_device *netdev, struct ethtool_keee *edata)
if (ret_val)
return -ENODATA;

edata->lp_advertised_u32 = mmd_eee_adv_to_ethtool_adv_t(phy_data);
mii_eee_cap1_mod_linkmode_t(edata->lp_advertised, phy_data);
break;
case e1000_i354:
case e1000_i210:
Expand All @@ -3079,7 +3081,7 @@ static int igb_get_eee(struct net_device *netdev, struct ethtool_keee *edata)
if (ret_val)
return -ENODATA;

edata->lp_advertised_u32 = mmd_eee_adv_to_ethtool_adv_t(phy_data);
mii_eee_cap1_mod_linkmode_t(edata->lp_advertised, phy_data);

break;
default:
Expand All @@ -3099,7 +3101,7 @@ static int igb_get_eee(struct net_device *netdev, struct ethtool_keee *edata)
edata->eee_enabled = false;
edata->eee_active = false;
edata->tx_lpi_enabled = false;
edata->advertised_u32 &= ~edata->advertised_u32;
linkmode_zero(edata->advertised);
}

return 0;
Expand All @@ -3109,6 +3111,8 @@ static int igb_set_eee(struct net_device *netdev,
struct ethtool_keee *edata)
{
struct igb_adapter *adapter = netdev_priv(netdev);
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = {};
__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp) = {};
struct e1000_hw *hw = &adapter->hw;
struct ethtool_keee eee_curr;
bool adv1g_eee = true, adv100m_eee = true;
Expand Down Expand Up @@ -3138,22 +3142,29 @@ static int igb_set_eee(struct net_device *netdev,
return -EINVAL;
}

if (!edata->advertised_u32 || (edata->advertised_u32 &
~(ADVERTISE_100_FULL | ADVERTISE_1000_FULL))) {
linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
supported);
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
supported);
if (linkmode_andnot(tmp, edata->advertised, supported)) {
dev_err(&adapter->pdev->dev,
"EEE Advertisement supports only 100Tx and/or 100T full duplex\n");
return -EINVAL;
}
adv100m_eee = !!(edata->advertised_u32 & ADVERTISE_100_FULL);
adv1g_eee = !!(edata->advertised_u32 & ADVERTISE_1000_FULL);
adv100m_eee = linkmode_test_bit(
ETHTOOL_LINK_MODE_100baseT_Full_BIT,
edata->advertised);
adv1g_eee = linkmode_test_bit(
ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
edata->advertised);

} else if (!edata->eee_enabled) {
dev_err(&adapter->pdev->dev,
"Setting EEE options are not supported with EEE disabled\n");
return -EINVAL;
}

adapter->eee_advert = ethtool_adv_to_mmd_eee_adv_t(edata->advertised_u32);
adapter->eee_advert = linkmode_to_mii_eee_cap1_t(edata->advertised);
if (hw->dev_spec._82575.eee_disable != !edata->eee_enabled) {
hw->dev_spec._82575.eee_disable = !edata->eee_enabled;
adapter->flags |= IGB_FLAG_EEE;
Expand Down

0 comments on commit 41b9797

Please sign in to comment.