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 = {
 
 #include <linux/dmaengine.h>
 #include <linux/workqueue.h>
 
+#include <linux/ethtool.h>
 #include <net/net_namespace.h>
 #include <net/dsa.h>
 #ifdef CONFIG_DCB
 #endif
 
 struct vlan_group;
-struct ethtool_ops;
 struct netpoll_info;
 /* 802.11 specific */
 struct wireless_dev;
 }
 
 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 */
 
                                     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,
 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 = {