#include <net/sock.h>
 #include <linux/ethtool_netlink.h>
+#include <linux/pm_runtime.h>
 #include "netlink.h"
 
 static struct genl_family ethtool_genl_family;
 
 int ethnl_ops_begin(struct net_device *dev)
 {
+       int ret;
+
        if (!dev)
                return 0;
 
-       if (!netif_device_present(dev))
-               return -ENODEV;
+       if (dev->dev.parent)
+               pm_runtime_get_sync(dev->dev.parent);
 
-       if (dev->ethtool_ops->begin)
-               return dev->ethtool_ops->begin(dev);
-       else
-               return 0;
+       if (!netif_device_present(dev)) {
+               ret = -ENODEV;
+               goto err;
+       }
+
+       if (dev->ethtool_ops->begin) {
+               ret = dev->ethtool_ops->begin(dev);
+               if (ret)
+                       goto err;
+       }
+
+       return 0;
+err:
+       if (dev->dev.parent)
+               pm_runtime_put(dev->dev.parent);
+
+       return ret;
 }
 
 void ethnl_ops_complete(struct net_device *dev)
 {
        if (dev && dev->ethtool_ops->complete)
                dev->ethtool_ops->complete(dev);
+
+       if (dev->dev.parent)
+               pm_runtime_put(dev->dev.parent);
 }
 
 /**