From 32c23b47dbd9765c6ec2542400f41f0d47a7d2c1 Mon Sep 17 00:00:00 2001 From: Jan Sokolowski Date: Mon, 19 Mar 2018 09:28:03 -0700 Subject: [PATCH] i40e: Properly check allowed advertisement capabilities The i40e_set_link_ksettings and i40e_get_link_ksettings use different codepaths to check available and supported advertisement modes. This creates scenarios where it's possible to set a mode that's not allowed, resulting in a link down. Fix setting advertisement in i40e_set_link_ksettings by calling i40e_get_link_ksettings to check what modes are allowed. Signed-off-by: Jan Sokolowski Tested-by: Andrew Bowers Signed-off-by: Jeff Kirsher --- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c index 89807e32a898..0ce68e8a45cc 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c @@ -870,16 +870,6 @@ static int i40e_set_link_ksettings(struct net_device *netdev, /* save autoneg out of ksettings */ autoneg = copy_ks.base.autoneg; - memset(&safe_ks, 0, sizeof(safe_ks)); - /* Get link modes supported by hardware and check against modes - * requested by the user. Return an error if unsupported mode was set. - */ - i40e_phy_type_to_ethtool(pf, &safe_ks); - 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; @@ -887,6 +877,14 @@ static int i40e_set_link_ksettings(struct net_device *netdev, copy_ks.base.link_mode_masks_nwords; i40e_get_link_ksettings(netdev, &safe_ks); + /* Get link modes supported by hardware and check against modes + * requested by the user. Return an error if unsupported mode was set. + */ + if (!bitmap_subset(copy_ks.link_modes.advertising, + safe_ks.link_modes.supported, + __ETHTOOL_LINK_MODE_MASK_NBITS)) + return -EINVAL; + /* set autoneg back to what it currently is */ copy_ks.base.autoneg = safe_ks.base.autoneg;