|
@@ -891,6 +891,20 @@ static int ethtool_nway_reset(struct net_device *dev)
|
|
|
return dev->ethtool_ops->nway_reset(dev);
|
|
|
}
|
|
|
|
|
|
+static int ethtool_get_link(struct net_device *dev, char __user *useraddr)
|
|
|
+{
|
|
|
+ struct ethtool_value edata = { .cmd = ETHTOOL_GLINK };
|
|
|
+
|
|
|
+ if (!dev->ethtool_ops->get_link)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ edata.data = netif_running(dev) && dev->ethtool_ops->get_link(dev);
|
|
|
+
|
|
|
+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
|
|
|
+ return -EFAULT;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
|
|
|
{
|
|
|
struct ethtool_eeprom eeprom;
|
|
@@ -1530,8 +1544,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
|
|
|
rc = ethtool_nway_reset(dev);
|
|
|
break;
|
|
|
case ETHTOOL_GLINK:
|
|
|
- rc = ethtool_get_value(dev, useraddr, ethcmd,
|
|
|
- dev->ethtool_ops->get_link);
|
|
|
+ rc = ethtool_get_link(dev, useraddr);
|
|
|
break;
|
|
|
case ETHTOOL_GEEPROM:
|
|
|
rc = ethtool_get_eeprom(dev, useraddr);
|