net: factor out ethtool invocation of vlan/macvlan drivers
Patrick McHardy [Mon, 20 Apr 2009 04:49:28 +0000 (04:49 +0000)]
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

drivers/net/macvlan.c
include/linux/netdevice.h
net/8021q/vlan_dev.c

index 214a8cf..329cd50 100644 (file)
@@ -374,36 +374,20 @@ static void macvlan_ethtool_get_drvinfo(struct net_device *dev,
 static u32 macvlan_ethtool_get_rx_csum(struct net_device *dev)
 {
        const struct macvlan_dev *vlan = netdev_priv(dev);
-       struct net_device *lowerdev = vlan->lowerdev;
-
-       if (lowerdev->ethtool_ops == NULL ||
-           lowerdev->ethtool_ops->get_rx_csum == NULL)
-               return 0;
-       return lowerdev->ethtool_ops->get_rx_csum(lowerdev);
+       return dev_ethtool_get_rx_csum(vlan->lowerdev);
 }
 
 static int macvlan_ethtool_get_settings(struct net_device *dev,
                                        struct ethtool_cmd *cmd)
 {
        const struct macvlan_dev *vlan = netdev_priv(dev);
-       struct net_device *lowerdev = vlan->lowerdev;
-
-       if (!lowerdev->ethtool_ops ||
-           !lowerdev->ethtool_ops->get_settings)
-               return -EOPNOTSUPP;
-
-       return lowerdev->ethtool_ops->get_settings(lowerdev, cmd);
+       return dev_ethtool_get_settings(vlan->lowerdev, cmd);
 }
 
 static u32 macvlan_ethtool_get_flags(struct net_device *dev)
 {
        const struct macvlan_dev *vlan = netdev_priv(dev);
-       struct net_device *lowerdev = vlan->lowerdev;
-
-       if (!lowerdev->ethtool_ops ||
-           !lowerdev->ethtool_ops->get_flags)
-               return 0;
-       return lowerdev->ethtool_ops->get_flags(lowerdev);
+       return dev_ethtool_get_flags(vlan->lowerdev);
 }
 
 static const struct ethtool_ops macvlan_ethtool_ops = {
index 54db3eb..3116745 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/dmaengine.h>
 #include <linux/workqueue.h>
 
+#include <linux/ethtool.h>
 #include <net/net_namespace.h>
 #include <net/dsa.h>
 #ifdef CONFIG_DCB
@@ -49,7 +50,6 @@
 #endif
 
 struct vlan_group;
-struct ethtool_ops;
 struct netpoll_info;
 /* 802.11 specific */
 struct wireless_dev;
@@ -1906,6 +1906,28 @@ static inline int skb_bond_should_drop(struct sk_buff *skb)
 }
 
 extern struct pernet_operations __net_initdata loopback_net_ops;
+
+static inline int dev_ethtool_get_settings(struct net_device *dev,
+                                          struct ethtool_cmd *cmd)
+{
+       if (!dev->ethtool_ops || !dev->ethtool_ops->get_settings)
+               return -EOPNOTSUPP;
+       return dev->ethtool_ops->get_settings(dev, cmd);
+}
+
+static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev)
+{
+       if (!dev->ethtool_ops || !dev->ethtool_ops->get_rx_csum)
+               return 0;
+       return dev->ethtool_ops->get_rx_csum(dev);
+}
+
+static inline u32 dev_ethtool_get_flags(struct net_device *dev)
+{
+       if (!dev->ethtool_ops || !dev->ethtool_ops->get_flags)
+               return 0;
+       return dev->ethtool_ops->get_flags(dev);
+}
 #endif /* __KERNEL__ */
 
 #endif /* _LINUX_DEV_H */
index 6b09213..04dc8c8 100644 (file)
@@ -666,13 +666,7 @@ static int vlan_ethtool_get_settings(struct net_device *dev,
                                     struct ethtool_cmd *cmd)
 {
        const struct vlan_dev_info *vlan = vlan_dev_info(dev);
-       struct net_device *real_dev = vlan->real_dev;
-
-       if (!real_dev->ethtool_ops ||
-           !real_dev->ethtool_ops->get_settings)
-               return -EOPNOTSUPP;
-
-       return real_dev->ethtool_ops->get_settings(real_dev, cmd);
+       return dev_ethtool_get_settings(vlan->real_dev, cmd);
 }
 
 static void vlan_ethtool_get_drvinfo(struct net_device *dev,
@@ -686,24 +680,13 @@ static void vlan_ethtool_get_drvinfo(struct net_device *dev,
 static u32 vlan_ethtool_get_rx_csum(struct net_device *dev)
 {
        const struct vlan_dev_info *vlan = vlan_dev_info(dev);
-       struct net_device *real_dev = vlan->real_dev;
-
-       if (real_dev->ethtool_ops == NULL ||
-           real_dev->ethtool_ops->get_rx_csum == NULL)
-               return 0;
-       return real_dev->ethtool_ops->get_rx_csum(real_dev);
+       return dev_ethtool_get_rx_csum(vlan->real_dev);
 }
 
 static u32 vlan_ethtool_get_flags(struct net_device *dev)
 {
        const struct vlan_dev_info *vlan = vlan_dev_info(dev);
-       struct net_device *real_dev = vlan->real_dev;
-
-       if (!(real_dev->features & NETIF_F_HW_VLAN_RX) ||
-           real_dev->ethtool_ops == NULL ||
-           real_dev->ethtool_ops->get_flags == NULL)
-               return 0;
-       return real_dev->ethtool_ops->get_flags(real_dev);
+       return dev_ethtool_get_flags(vlan->real_dev);
 }
 
 static const struct ethtool_ops vlan_ethtool_ops = {