diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-04-26 15:05:39 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-04-26 15:05:39 +0200 |
commit | 31d44b57c508971c083ce038d7c5ededd09cea01 (patch) | |
tree | 249689625896d65894f56763c22f726e39fde5ec /net/core/ethtool.c | |
parent | 885f42e1f466c36e3663d912a831e940f01a112b (diff) | |
parent | 1c7276cfc04b1a5b296b691c2e07297a4f6c19aa (diff) |
Merge branch 'fix/hda' into topic/hda
Diffstat (limited to 'net/core/ethtool.c')
-rw-r--r-- | net/core/ethtool.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 24bd57493c0d..74ead9eca126 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -141,9 +141,24 @@ u32 ethtool_op_get_flags(struct net_device *dev) } EXPORT_SYMBOL(ethtool_op_get_flags); +/* Check if device can enable (or disable) particular feature coded in "data" + * argument. Flags "supported" describe features that can be toggled by device. + * If feature can not be toggled, it state (enabled or disabled) must match + * hardcoded device features state, otherwise flags are marked as invalid. + */ +bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported) +{ + u32 features = dev->features & flags_dup_features; + /* "data" can contain only flags_dup_features bits, + * see __ethtool_set_flags */ + + return (features & ~supported) != (data & ~supported); +} +EXPORT_SYMBOL(ethtool_invalid_flags); + int ethtool_op_set_flags(struct net_device *dev, u32 data, u32 supported) { - if (data & ~supported) + if (ethtool_invalid_flags(dev, data, supported)) return -EINVAL; dev->features = ((dev->features & ~flags_dup_features) | |