Skip to content

Commit 6fb5dfe

Browse files
hkallweitkuba-moo
authored andcommitted
bnxt: convert EEE handling to use linkmode bitmaps
Convert EEE handling to use linkmode bitmaps. This prepares for removing the legacy bitmaps from struct ethtool_keee. No functional change intended. When replacing _bnxt_fw_to_ethtool_adv_spds() with _bnxt_fw_to_linkmode(), remove the fw_pause argument because it's always passed as 0. Note: There's a discussion on whether the underlying implementation is correct, but it's independent of this mechanical conversion w/o functional change. Signed-off-by: Heiner Kallweit <[email protected]> Reviewed-by: Michael Chan <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 5c80e62 commit 6fb5dfe

File tree

3 files changed

+40
-50
lines changed

3 files changed

+40
-50
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10624,7 +10624,7 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
1062410624
struct ethtool_keee *eee = &bp->eee;
1062510625
u16 fw_speeds = le16_to_cpu(resp->supported_speeds_eee_mode);
1062610626

10627-
eee->supported_u32 = _bnxt_fw_to_ethtool_adv_spds(fw_speeds, 0);
10627+
_bnxt_fw_to_linkmode(eee->supported, fw_speeds);
1062810628
bp->lpi_tmr_lo = le32_to_cpu(resp->tx_lpi_timer_low) &
1062910629
PORT_PHY_QCAPS_RESP_TX_LPI_TIMER_LOW_MASK;
1063010630
bp->lpi_tmr_hi = le32_to_cpu(resp->valid_tx_lpi_timer_high) &
@@ -10775,8 +10775,7 @@ int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
1077510775
eee->eee_active = 1;
1077610776
fw_speeds = le16_to_cpu(
1077710777
resp->link_partner_adv_eee_link_speed_mask);
10778-
eee->lp_advertised_u32 =
10779-
_bnxt_fw_to_ethtool_adv_spds(fw_speeds, 0);
10778+
_bnxt_fw_to_linkmode(eee->lp_advertised, fw_speeds);
1078010779
}
1078110780

1078210781
/* Pull initial EEE config */
@@ -10786,8 +10785,7 @@ int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
1078610785
eee->eee_enabled = 1;
1078710786

1078810787
fw_speeds = le16_to_cpu(resp->adv_eee_link_speed_mask);
10789-
eee->advertised_u32 =
10790-
_bnxt_fw_to_ethtool_adv_spds(fw_speeds, 0);
10788+
_bnxt_fw_to_linkmode(eee->advertised, fw_speeds);
1079110789

1079210790
if (resp->eee_config_phy_addr &
1079310791
PORT_PHY_QCFG_RESP_EEE_CONFIG_EEE_TX_LPI) {
@@ -10969,7 +10967,7 @@ static void bnxt_hwrm_set_eee(struct bnxt *bp,
1096910967
flags |= PORT_PHY_CFG_REQ_FLAGS_EEE_TX_LPI_DISABLE;
1097010968

1097110969
req->flags |= cpu_to_le32(flags);
10972-
eee_speeds = bnxt_get_fw_auto_link_speeds(eee->advertised_u32);
10970+
eee_speeds = bnxt_get_fw_auto_link_speeds(eee->advertised);
1097310971
req->eee_link_speed_mask = cpu_to_le16(eee_speeds);
1097410972
req->tx_lpi_timer = cpu_to_le32(eee->tx_lpi_timer);
1097510973
} else {
@@ -11329,15 +11327,18 @@ static bool bnxt_eee_config_ok(struct bnxt *bp)
1132911327
return true;
1133011328

1133111329
if (eee->eee_enabled) {
11332-
u32 advertising =
11333-
_bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
11330+
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
11331+
__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
11332+
11333+
_bnxt_fw_to_linkmode(advertising, link_info->advertising);
1133411334

1133511335
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) {
1133611336
eee->eee_enabled = 0;
1133711337
return false;
1133811338
}
11339-
if (eee->advertised_u32 & ~advertising) {
11340-
eee->advertised_u32 = advertising & eee->supported_u32;
11339+
if (linkmode_andnot(tmp, eee->advertised, advertising)) {
11340+
linkmode_and(eee->advertised, advertising,
11341+
eee->supported);
1134111342
return false;
1134211343
}
1134311344
}

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,31 +1751,21 @@ static int bnxt_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
17511751
return 0;
17521752
}
17531753

1754-
u32 _bnxt_fw_to_ethtool_adv_spds(u16 fw_speeds, u8 fw_pause)
1754+
/* TODO: support 25GB, 40GB, 50GB with different cable type */
1755+
void _bnxt_fw_to_linkmode(unsigned long *mode, u16 fw_speeds)
17551756
{
1756-
u32 speed_mask = 0;
1757+
linkmode_zero(mode);
17571758

1758-
/* TODO: support 25GB, 40GB, 50GB with different cable type */
1759-
/* set the advertised speeds */
17601759
if (fw_speeds & BNXT_LINK_SPEED_MSK_100MB)
1761-
speed_mask |= ADVERTISED_100baseT_Full;
1760+
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mode);
17621761
if (fw_speeds & BNXT_LINK_SPEED_MSK_1GB)
1763-
speed_mask |= ADVERTISED_1000baseT_Full;
1762+
linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, mode);
17641763
if (fw_speeds & BNXT_LINK_SPEED_MSK_2_5GB)
1765-
speed_mask |= ADVERTISED_2500baseX_Full;
1764+
linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT, mode);
17661765
if (fw_speeds & BNXT_LINK_SPEED_MSK_10GB)
1767-
speed_mask |= ADVERTISED_10000baseT_Full;
1766+
linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, mode);
17681767
if (fw_speeds & BNXT_LINK_SPEED_MSK_40GB)
1769-
speed_mask |= ADVERTISED_40000baseCR4_Full;
1770-
1771-
if ((fw_pause & BNXT_LINK_PAUSE_BOTH) == BNXT_LINK_PAUSE_BOTH)
1772-
speed_mask |= ADVERTISED_Pause;
1773-
else if (fw_pause & BNXT_LINK_PAUSE_TX)
1774-
speed_mask |= ADVERTISED_Asym_Pause;
1775-
else if (fw_pause & BNXT_LINK_PAUSE_RX)
1776-
speed_mask |= ADVERTISED_Pause | ADVERTISED_Asym_Pause;
1777-
1778-
return speed_mask;
1768+
linkmode_set_bit(ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT, mode);
17791769
}
17801770

17811771
enum bnxt_media_type {
@@ -2643,23 +2633,22 @@ bnxt_force_link_speed(struct net_device *dev, u32 ethtool_speed, u32 lanes)
26432633
return 0;
26442634
}
26452635

2646-
u16 bnxt_get_fw_auto_link_speeds(u32 advertising)
2636+
u16 bnxt_get_fw_auto_link_speeds(const unsigned long *mode)
26472637
{
26482638
u16 fw_speed_mask = 0;
26492639

2650-
/* only support autoneg at speed 100, 1000, and 10000 */
2651-
if (advertising & (ADVERTISED_100baseT_Full |
2652-
ADVERTISED_100baseT_Half)) {
2640+
if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mode) ||
2641+
linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mode))
26532642
fw_speed_mask |= BNXT_LINK_SPEED_MSK_100MB;
2654-
}
2655-
if (advertising & (ADVERTISED_1000baseT_Full |
2656-
ADVERTISED_1000baseT_Half)) {
2643+
2644+
if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, mode) ||
2645+
linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, mode))
26572646
fw_speed_mask |= BNXT_LINK_SPEED_MSK_1GB;
2658-
}
2659-
if (advertising & ADVERTISED_10000baseT_Full)
2647+
2648+
if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, mode))
26602649
fw_speed_mask |= BNXT_LINK_SPEED_MSK_10GB;
26612650

2662-
if (advertising & ADVERTISED_40000baseCR4_Full)
2651+
if (linkmode_test_bit(ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT, mode))
26632652
fw_speed_mask |= BNXT_LINK_SPEED_MSK_40GB;
26642653

26652654
return fw_speed_mask;
@@ -3886,10 +3875,11 @@ static int bnxt_set_eeprom(struct net_device *dev,
38863875

38873876
static int bnxt_set_eee(struct net_device *dev, struct ethtool_keee *edata)
38883877
{
3878+
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
3879+
__ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
38893880
struct bnxt *bp = netdev_priv(dev);
38903881
struct ethtool_keee *eee = &bp->eee;
38913882
struct bnxt_link_info *link_info = &bp->link_info;
3892-
u32 advertising;
38933883
int rc = 0;
38943884

38953885
if (!BNXT_PHY_CFG_ABLE(bp))
@@ -3899,7 +3889,7 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_keee *edata)
38993889
return -EOPNOTSUPP;
39003890

39013891
mutex_lock(&bp->link_lock);
3902-
advertising = _bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
3892+
_bnxt_fw_to_linkmode(advertising, link_info->advertising);
39033893
if (!edata->eee_enabled)
39043894
goto eee_ok;
39053895

@@ -3919,16 +3909,15 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_keee *edata)
39193909
edata->tx_lpi_timer = eee->tx_lpi_timer;
39203910
}
39213911
}
3922-
if (!edata->advertised_u32) {
3923-
edata->advertised_u32 = advertising & eee->supported_u32;
3924-
} else if (edata->advertised_u32 & ~advertising) {
3925-
netdev_warn(dev, "EEE advertised %x must be a subset of autoneg advertised speeds %x\n",
3926-
edata->advertised_u32, advertising);
3912+
if (linkmode_empty(edata->advertised)) {
3913+
linkmode_and(edata->advertised, advertising, eee->supported);
3914+
} else if (linkmode_andnot(tmp, edata->advertised, advertising)) {
3915+
netdev_warn(dev, "EEE advertised must be a subset of autoneg advertised speeds\n");
39273916
rc = -EINVAL;
39283917
goto eee_exit;
39293918
}
39303919

3931-
eee->advertised_u32 = edata->advertised_u32;
3920+
linkmode_copy(eee->advertised, edata->advertised);
39323921
eee->tx_lpi_enabled = edata->tx_lpi_enabled;
39333922
eee->tx_lpi_timer = edata->tx_lpi_timer;
39343923
eee_ok:
@@ -3954,12 +3943,12 @@ static int bnxt_get_eee(struct net_device *dev, struct ethtool_keee *edata)
39543943
/* Preserve tx_lpi_timer so that the last value will be used
39553944
* by default when it is re-enabled.
39563945
*/
3957-
edata->advertised_u32 = 0;
3946+
linkmode_zero(edata->advertised);
39583947
edata->tx_lpi_enabled = 0;
39593948
}
39603949

39613950
if (!bp->eee.eee_active)
3962-
edata->lp_advertised_u32 = 0;
3951+
linkmode_zero(edata->lp_advertised);
39633952

39643953
return 0;
39653954
}

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ struct bnxt_led_cfg {
4646
extern const struct ethtool_ops bnxt_ethtool_ops;
4747

4848
u32 bnxt_get_rxfh_indir_size(struct net_device *dev);
49-
u32 _bnxt_fw_to_ethtool_adv_spds(u16, u8);
49+
void _bnxt_fw_to_linkmode(unsigned long *mode, u16 fw_speeds);
5050
u32 bnxt_fw_to_ethtool_speed(u16);
51-
u16 bnxt_get_fw_auto_link_speeds(u32);
51+
u16 bnxt_get_fw_auto_link_speeds(const unsigned long *mode);
5252
int bnxt_hwrm_nvm_get_dev_info(struct bnxt *bp,
5353
struct hwrm_nvm_get_dev_info_output *nvm_dev_info);
5454
int bnxt_hwrm_firmware_reset(struct net_device *dev, u8 proc_type,

0 commit comments

Comments
 (0)