Skip to content

Commit

Permalink
net: qlogic: qede: Use linkmode helpers for EEE
Browse files Browse the repository at this point in the history
Make use of the existing linkmode helpers for bit manipulation of EEE
advertise, support and link partner support. The aim is to drop the
restricted _u32 variants in the near future.

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 93e6da6 commit 9f8b8ad
Showing 1 changed file with 38 additions and 22 deletions.
60 changes: 38 additions & 22 deletions drivers/net/ethernet/qlogic/qede/qede_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -1789,18 +1789,26 @@ static int qede_get_eee(struct net_device *dev, struct ethtool_keee *edata)
return -EOPNOTSUPP;
}

if (current_link.eee.adv_caps & QED_EEE_1G_ADV)
edata->advertised_u32 = ADVERTISED_1000baseT_Full;
if (current_link.eee.adv_caps & QED_EEE_10G_ADV)
edata->advertised_u32 |= ADVERTISED_10000baseT_Full;
if (current_link.sup_caps & QED_EEE_1G_ADV)
edata->supported_u32 = ADVERTISED_1000baseT_Full;
if (current_link.sup_caps & QED_EEE_10G_ADV)
edata->supported_u32 |= ADVERTISED_10000baseT_Full;
if (current_link.eee.lp_adv_caps & QED_EEE_1G_ADV)
edata->lp_advertised_u32 = ADVERTISED_1000baseT_Full;
if (current_link.eee.lp_adv_caps & QED_EEE_10G_ADV)
edata->lp_advertised_u32 |= ADVERTISED_10000baseT_Full;
linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
edata->advertised,
current_link.eee.adv_caps & QED_EEE_1G_ADV);
linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
edata->advertised,
current_link.eee.adv_caps & QED_EEE_10G_ADV);

linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
edata->supported,
current_link.sup_caps & QED_EEE_1G_ADV);
linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
edata->supported,
current_link.sup_caps & QED_EEE_10G_ADV);

linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
edata->lp_advertised,
current_link.eee.lp_adv_caps & QED_EEE_1G_ADV);
linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
edata->lp_advertised,
current_link.eee.lp_adv_caps & QED_EEE_10G_ADV);

edata->tx_lpi_timer = current_link.eee.tx_lpi_timer;
edata->eee_enabled = current_link.eee.enable;
Expand All @@ -1812,9 +1820,12 @@ static int qede_get_eee(struct net_device *dev, struct ethtool_keee *edata)

static int qede_set_eee(struct net_device *dev, struct ethtool_keee *edata)
{
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = {};
__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp) = {};
struct qede_dev *edev = netdev_priv(dev);
struct qed_link_output current_link;
struct qed_link_params params;
bool unsupp;

if (!edev->ops->common->can_link_change(edev->cdev)) {
DP_INFO(edev, "Link settings are not allowed to be changed\n");
Expand All @@ -1832,21 +1843,26 @@ static int qede_set_eee(struct net_device *dev, struct ethtool_keee *edata)
memset(&params, 0, sizeof(params));
params.override_flags |= QED_LINK_OVERRIDE_EEE_CONFIG;

if (!(edata->advertised_u32 & (ADVERTISED_1000baseT_Full |
ADVERTISED_10000baseT_Full)) ||
((edata->advertised_u32 & (ADVERTISED_1000baseT_Full |
ADVERTISED_10000baseT_Full)) !=
edata->advertised_u32)) {
linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
supported);
linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
supported);

unsupp = linkmode_andnot(tmp, edata->advertised, supported);
if (unsupp) {
DP_VERBOSE(edev, QED_MSG_DEBUG,
"Invalid advertised capabilities %d\n",
edata->advertised_u32);
"Invalid advertised capabilities %*pb\n",
__ETHTOOL_LINK_MODE_MASK_NBITS, edata->advertised);
return -EINVAL;
}

if (edata->advertised_u32 & ADVERTISED_1000baseT_Full)
if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
edata->advertised))
params.eee.adv_caps = QED_EEE_1G_ADV;
if (edata->advertised_u32 & ADVERTISED_10000baseT_Full)
params.eee.adv_caps |= QED_EEE_10G_ADV;
if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
edata->advertised))
params.eee.adv_caps = QED_EEE_10G_ADV;

params.eee.enable = edata->eee_enabled;
params.eee.tx_lpi_enable = edata->tx_lpi_enabled;
params.eee.tx_lpi_timer = edata->tx_lpi_timer;
Expand Down

0 comments on commit 9f8b8ad

Please sign in to comment.