bnxt: convert EEE handling to use linkmode bitmaps
authorHeiner Kallweit <hkallweit1@gmail.com>
Wed, 7 Feb 2024 16:47:35 +0000 (17:47 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 Feb 2024 03:06:01 +0000 (19:06 -0800)
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 <hkallweit1@gmail.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/9123bf18-a0d0-404e-a7c4-d6c466b4c5e8@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h

index fde32b32fa81cf5e4303f4705126330c813c30e7..8fe8a73ffa7ed6efd9530408a5b4403217e837d5 100644 (file)
@@ -10624,7 +10624,7 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
                struct ethtool_keee *eee = &bp->eee;
                u16 fw_speeds = le16_to_cpu(resp->supported_speeds_eee_mode);
 
-               eee->supported_u32 = _bnxt_fw_to_ethtool_adv_spds(fw_speeds, 0);
+               _bnxt_fw_to_linkmode(eee->supported, fw_speeds);
                bp->lpi_tmr_lo = le32_to_cpu(resp->tx_lpi_timer_low) &
                                 PORT_PHY_QCAPS_RESP_TX_LPI_TIMER_LOW_MASK;
                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)
                        eee->eee_active = 1;
                        fw_speeds = le16_to_cpu(
                                resp->link_partner_adv_eee_link_speed_mask);
-                       eee->lp_advertised_u32 =
-                               _bnxt_fw_to_ethtool_adv_spds(fw_speeds, 0);
+                       _bnxt_fw_to_linkmode(eee->lp_advertised, fw_speeds);
                }
 
                /* Pull initial EEE config */
@@ -10786,8 +10785,7 @@ int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
                                eee->eee_enabled = 1;
 
                        fw_speeds = le16_to_cpu(resp->adv_eee_link_speed_mask);
-                       eee->advertised_u32 =
-                               _bnxt_fw_to_ethtool_adv_spds(fw_speeds, 0);
+                       _bnxt_fw_to_linkmode(eee->advertised, fw_speeds);
 
                        if (resp->eee_config_phy_addr &
                            PORT_PHY_QCFG_RESP_EEE_CONFIG_EEE_TX_LPI) {
@@ -10969,7 +10967,7 @@ static void bnxt_hwrm_set_eee(struct bnxt *bp,
                        flags |= PORT_PHY_CFG_REQ_FLAGS_EEE_TX_LPI_DISABLE;
 
                req->flags |= cpu_to_le32(flags);
-               eee_speeds = bnxt_get_fw_auto_link_speeds(eee->advertised_u32);
+               eee_speeds = bnxt_get_fw_auto_link_speeds(eee->advertised);
                req->eee_link_speed_mask = cpu_to_le16(eee_speeds);
                req->tx_lpi_timer = cpu_to_le32(eee->tx_lpi_timer);
        } else {
@@ -11329,15 +11327,18 @@ static bool bnxt_eee_config_ok(struct bnxt *bp)
                return true;
 
        if (eee->eee_enabled) {
-               u32 advertising =
-                       _bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
+               __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
+               __ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
+
+               _bnxt_fw_to_linkmode(advertising, link_info->advertising);
 
                if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) {
                        eee->eee_enabled = 0;
                        return false;
                }
-               if (eee->advertised_u32 & ~advertising) {
-                       eee->advertised_u32 = advertising & eee->supported_u32;
+               if (linkmode_andnot(tmp, eee->advertised, advertising)) {
+                       linkmode_and(eee->advertised, advertising,
+                                    eee->supported);
                        return false;
                }
        }
index 481b835a7703ad1847fbb8d8cbc97dcd98286a40..482ce88b1563410a268a7f6f5d6ecacfbae95654 100644 (file)
@@ -1751,31 +1751,21 @@ static int bnxt_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
        return 0;
 }
 
-u32 _bnxt_fw_to_ethtool_adv_spds(u16 fw_speeds, u8 fw_pause)
+/* TODO: support 25GB, 40GB, 50GB with different cable type */
+void _bnxt_fw_to_linkmode(unsigned long *mode, u16 fw_speeds)
 {
-       u32 speed_mask = 0;
+       linkmode_zero(mode);
 
-       /* TODO: support 25GB, 40GB, 50GB with different cable type */
-       /* set the advertised speeds */
        if (fw_speeds & BNXT_LINK_SPEED_MSK_100MB)
-               speed_mask |= ADVERTISED_100baseT_Full;
+               linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mode);
        if (fw_speeds & BNXT_LINK_SPEED_MSK_1GB)
-               speed_mask |= ADVERTISED_1000baseT_Full;
+               linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, mode);
        if (fw_speeds & BNXT_LINK_SPEED_MSK_2_5GB)
-               speed_mask |= ADVERTISED_2500baseX_Full;
+               linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT, mode);
        if (fw_speeds & BNXT_LINK_SPEED_MSK_10GB)
-               speed_mask |= ADVERTISED_10000baseT_Full;
+               linkmode_set_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, mode);
        if (fw_speeds & BNXT_LINK_SPEED_MSK_40GB)
-               speed_mask |= ADVERTISED_40000baseCR4_Full;
-
-       if ((fw_pause & BNXT_LINK_PAUSE_BOTH) == BNXT_LINK_PAUSE_BOTH)
-               speed_mask |= ADVERTISED_Pause;
-       else if (fw_pause & BNXT_LINK_PAUSE_TX)
-               speed_mask |= ADVERTISED_Asym_Pause;
-       else if (fw_pause & BNXT_LINK_PAUSE_RX)
-               speed_mask |= ADVERTISED_Pause | ADVERTISED_Asym_Pause;
-
-       return speed_mask;
+               linkmode_set_bit(ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT, mode);
 }
 
 enum bnxt_media_type {
@@ -2643,23 +2633,22 @@ bnxt_force_link_speed(struct net_device *dev, u32 ethtool_speed, u32 lanes)
        return 0;
 }
 
-u16 bnxt_get_fw_auto_link_speeds(u32 advertising)
+u16 bnxt_get_fw_auto_link_speeds(const unsigned long *mode)
 {
        u16 fw_speed_mask = 0;
 
-       /* only support autoneg at speed 100, 1000, and 10000 */
-       if (advertising & (ADVERTISED_100baseT_Full |
-                          ADVERTISED_100baseT_Half)) {
+       if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mode) ||
+           linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mode))
                fw_speed_mask |= BNXT_LINK_SPEED_MSK_100MB;
-       }
-       if (advertising & (ADVERTISED_1000baseT_Full |
-                          ADVERTISED_1000baseT_Half)) {
+
+       if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, mode) ||
+           linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, mode))
                fw_speed_mask |= BNXT_LINK_SPEED_MSK_1GB;
-       }
-       if (advertising & ADVERTISED_10000baseT_Full)
+
+       if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, mode))
                fw_speed_mask |= BNXT_LINK_SPEED_MSK_10GB;
 
-       if (advertising & ADVERTISED_40000baseCR4_Full)
+       if (linkmode_test_bit(ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT, mode))
                fw_speed_mask |= BNXT_LINK_SPEED_MSK_40GB;
 
        return fw_speed_mask;
@@ -3886,10 +3875,11 @@ static int bnxt_set_eeprom(struct net_device *dev,
 
 static int bnxt_set_eee(struct net_device *dev, struct ethtool_keee *edata)
 {
+       __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
+       __ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
        struct bnxt *bp = netdev_priv(dev);
        struct ethtool_keee *eee = &bp->eee;
        struct bnxt_link_info *link_info = &bp->link_info;
-       u32 advertising;
        int rc = 0;
 
        if (!BNXT_PHY_CFG_ABLE(bp))
@@ -3899,7 +3889,7 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_keee *edata)
                return -EOPNOTSUPP;
 
        mutex_lock(&bp->link_lock);
-       advertising = _bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
+       _bnxt_fw_to_linkmode(advertising, link_info->advertising);
        if (!edata->eee_enabled)
                goto eee_ok;
 
@@ -3919,16 +3909,15 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_keee *edata)
                        edata->tx_lpi_timer = eee->tx_lpi_timer;
                }
        }
-       if (!edata->advertised_u32) {
-               edata->advertised_u32 = advertising & eee->supported_u32;
-       } else if (edata->advertised_u32 & ~advertising) {
-               netdev_warn(dev, "EEE advertised %x must be a subset of autoneg advertised speeds %x\n",
-                           edata->advertised_u32, advertising);
+       if (linkmode_empty(edata->advertised)) {
+               linkmode_and(edata->advertised, advertising, eee->supported);
+       } else if (linkmode_andnot(tmp, edata->advertised, advertising)) {
+               netdev_warn(dev, "EEE advertised must be a subset of autoneg advertised speeds\n");
                rc = -EINVAL;
                goto eee_exit;
        }
 
-       eee->advertised_u32 = edata->advertised_u32;
+       linkmode_copy(eee->advertised, edata->advertised);
        eee->tx_lpi_enabled = edata->tx_lpi_enabled;
        eee->tx_lpi_timer = edata->tx_lpi_timer;
 eee_ok:
@@ -3954,12 +3943,12 @@ static int bnxt_get_eee(struct net_device *dev, struct ethtool_keee *edata)
                /* Preserve tx_lpi_timer so that the last value will be used
                 * by default when it is re-enabled.
                 */
-               edata->advertised_u32 = 0;
+               linkmode_zero(edata->advertised);
                edata->tx_lpi_enabled = 0;
        }
 
        if (!bp->eee.eee_active)
-               edata->lp_advertised_u32 = 0;
+               linkmode_zero(edata->lp_advertised);
 
        return 0;
 }
index a8ecef8ab82c156a848ce0fcb0adea301ccb8410..0ea0f4a36a040348e205231cb02666734a9b6878 100644 (file)
@@ -46,9 +46,9 @@ struct bnxt_led_cfg {
 extern const struct ethtool_ops bnxt_ethtool_ops;
 
 u32 bnxt_get_rxfh_indir_size(struct net_device *dev);
-u32 _bnxt_fw_to_ethtool_adv_spds(u16, u8);
+void _bnxt_fw_to_linkmode(unsigned long *mode, u16 fw_speeds);
 u32 bnxt_fw_to_ethtool_speed(u16);
-u16 bnxt_get_fw_auto_link_speeds(u32);
+u16 bnxt_get_fw_auto_link_speeds(const unsigned long *mode);
 int bnxt_hwrm_nvm_get_dev_info(struct bnxt *bp,
                               struct hwrm_nvm_get_dev_info_output *nvm_dev_info);
 int bnxt_hwrm_firmware_reset(struct net_device *dev, u8 proc_type,