Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: fix hw_features ethtool_ops->set_flags compatibility

__ethtool_set_flags() was not taking into account features set but not
user-toggleable.

Since GFLAGS returns masked dev->features, EINVAL is returned when
passed flags differ to it, and not to wanted_features.

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Michał Mirosław and committed by
David S. Miller
5f8629c5 47007831

+2 -2
+2 -2
net/core/ethtool.c
··· 546 546 } 547 547 548 548 /* allow changing only bits set in hw_features */ 549 - changed = (data ^ dev->wanted_features) & flags_dup_features; 549 + changed = (data ^ dev->features) & flags_dup_features; 550 550 if (changed & ~dev->hw_features) 551 551 return (changed & dev->hw_features) ? -EINVAL : -EOPNOTSUPP; 552 552 553 553 dev->wanted_features = 554 - (dev->wanted_features & ~changed) | data; 554 + (dev->wanted_features & ~changed) | (data & dev->hw_features); 555 555 556 556 __netdev_update_features(dev); 557 557