[Intel-wired-lan] [PATCH 13/13 net-next] i40e: convert i40e_set_link_ksettings to new API
Shannon Nelson
shannon.nelson at oracle.com
Wed Oct 4 23:47:18 UTC 2017
On 10/4/2017 10:58 AM, Alan Brady wrote:
> This finishes off the conversion to the new ethtool API by removing the
> old macros being used in i40e_set_link_ksettings and replacing them with
> shiny new ones.
>
> This conversion also allows us to provide link speed support for new 25G
> and 10G macros which is included here as well.
>
> Signed-off-by: Alan Brady <alan.brady at intel.com>
> ---
> drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 94 ++++++++++++++++----------
> 1 file changed, 58 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index f25cdd4cb860..489aecd3f5dc 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -855,9 +855,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
> i40e_status status = 0;
> int timeout = 50;
> int err = 0;
> - u32 autoneg;
> - u32 advertise;
> - u32 tmp;
> + u8 autoneg;
>
> /* Changing port settings is not supported if this isn't the
> * port's controlling PF
> @@ -885,28 +883,35 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
> /* copy the ksettings to copy_ks to avoid modifying the origin */
> memcpy(©_ks, ks, sizeof(struct ethtool_link_ksettings));
>
> + /* save autoneg out of ksettings */
> + autoneg = copy_ks.base.autoneg;
> +
> + memset(&safe_ks, 0, sizeof(safe_ks));
> + /* Get link modes supported by hardware... */
> + i40e_phy_type_to_ethtool(pf, &safe_ks);
> + /* ...and check against modes requested by user.
> + * Return an error if unsupported mode was set.
> + */
Please don't split this comment, it makes things harder to read.
sln
> + if (!bitmap_subset(copy_ks.link_modes.advertising,
> + safe_ks.link_modes.supported,
> + __ETHTOOL_LINK_MODE_MASK_NBITS))
> + return -EINVAL;
> +
> /* get our own copy of the bits to check against */
> memset(&safe_ks, 0, sizeof(struct ethtool_link_ksettings));
> + safe_ks.base.cmd = copy_ks.base.cmd;
> + safe_ks.base.link_mode_masks_nwords =
> + copy_ks.base.link_mode_masks_nwords;
> i40e_get_link_ksettings(netdev, &safe_ks);
>
> - /* save autoneg and speed out of ksettings */
> - autoneg = ks->base.autoneg;
> - ethtool_convert_link_mode_to_legacy_u32(&advertise,
> - ks->link_modes.advertising);
> -
> - /* set autoneg and speed back to what they currently are */
> + /* set autoneg back to what it currently is */
> copy_ks.base.autoneg = safe_ks.base.autoneg;
> - ethtool_convert_link_mode_to_legacy_u32(
> - &tmp, safe_ks.link_modes.advertising);
> - ethtool_convert_legacy_u32_to_link_mode(
> - copy_ks.link_modes.advertising, tmp);
>
> - copy_ks.base.cmd = safe_ks.base.cmd;
> -
> - /* If copy_ks and safe_ks are not the same now, then they are
> - * trying to set something that we do not support
> + /* If copy_ks.base and safe_ks.base are not the same now, then they are
> + * trying to set something that we do not support.
> */
> - if (memcmp(©_ks, &safe_ks, sizeof(struct ethtool_link_ksettings)))
> + if (memcmp(©_ks.base, &safe_ks.base,
> + sizeof(struct ethtool_link_settings)))
> return -EOPNOTSUPP;
>
> while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) {
> @@ -967,28 +972,45 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
> }
> }
>
> - ethtool_convert_link_mode_to_legacy_u32(&tmp,
> - safe_ks.link_modes.supported);
> - if (advertise & ~tmp) {
> - err = -EINVAL;
> - goto done;
> - }
> -
> - if (advertise & ADVERTISED_100baseT_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 100baseT_Full))
> config.link_speed |= I40E_LINK_SPEED_100MB;
> - if (advertise & ADVERTISED_1000baseT_Full ||
> - advertise & ADVERTISED_1000baseKX_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 1000baseT_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 1000baseX_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 1000baseKX_Full))
> config.link_speed |= I40E_LINK_SPEED_1GB;
> - if (advertise & ADVERTISED_10000baseT_Full ||
> - advertise & ADVERTISED_10000baseKX4_Full ||
> - advertise & ADVERTISED_10000baseKR_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseT_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseKX4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseKR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseCR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseSR_Full))
> config.link_speed |= I40E_LINK_SPEED_10GB;
> - if (advertise & ADVERTISED_20000baseKR2_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 20000baseKR2_Full))
> config.link_speed |= I40E_LINK_SPEED_20GB;
> - if (advertise & ADVERTISED_40000baseKR4_Full ||
> - advertise & ADVERTISED_40000baseCR4_Full ||
> - advertise & ADVERTISED_40000baseSR4_Full ||
> - advertise & ADVERTISED_40000baseLR4_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 25000baseCR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 25000baseKR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 25000baseSR_Full))
> + config.link_speed |= I40E_LINK_SPEED_25GB;
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseKR4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseCR4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseSR4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseLR4_Full))
> config.link_speed |= I40E_LINK_SPEED_40GB;
>
> /* If speed didn't get set, set it to what it currently is.
>
More information about the Intel-wired-lan
mailing list