diff options
Diffstat (limited to 'drivers/usb/net/usbnet.c')
| -rw-r--r-- | drivers/usb/net/usbnet.c | 52 | 
1 files changed, 51 insertions, 1 deletions
| diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index af6d061dc79..decc1b17924 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c @@ -669,6 +669,37 @@ done:   * they'll probably want to use this base set.   */ +int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd) +{ +	struct usbnet *dev = netdev_priv(net); + +	if (!dev->mii.mdio_read) +		return -EOPNOTSUPP; + +	return mii_ethtool_gset(&dev->mii, cmd); +} +EXPORT_SYMBOL_GPL(usbnet_get_settings); + +int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd) +{ +	struct usbnet *dev = netdev_priv(net); +	int retval; + +	if (!dev->mii.mdio_write) +		return -EOPNOTSUPP; + +	retval = mii_ethtool_sset(&dev->mii, cmd); + +	/* link speed/duplex might have changed */ +	if (dev->driver_info->link_reset) +		dev->driver_info->link_reset(dev); + +	return retval; + +} +EXPORT_SYMBOL_GPL(usbnet_set_settings); + +  void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info)  {  	struct usbnet *dev = netdev_priv(net); @@ -682,7 +713,7 @@ void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info)  }  EXPORT_SYMBOL_GPL(usbnet_get_drvinfo); -static u32 usbnet_get_link (struct net_device *net) +u32 usbnet_get_link (struct net_device *net)  {  	struct usbnet *dev = netdev_priv(net); @@ -690,9 +721,14 @@ static u32 usbnet_get_link (struct net_device *net)  	if (dev->driver_info->check_connect)  		return dev->driver_info->check_connect (dev) == 0; +	/* if the device has mii operations, use those */ +	if (dev->mii.mdio_read) +		return mii_link_ok(&dev->mii); +  	/* Otherwise, say we're up (to avoid breaking scripts) */  	return 1;  } +EXPORT_SYMBOL_GPL(usbnet_get_link);  u32 usbnet_get_msglevel (struct net_device *net)  { @@ -710,10 +746,24 @@ void usbnet_set_msglevel (struct net_device *net, u32 level)  }  EXPORT_SYMBOL_GPL(usbnet_set_msglevel); +int usbnet_nway_reset(struct net_device *net) +{ +	struct usbnet *dev = netdev_priv(net); + +	if (!dev->mii.mdio_write) +		return -EOPNOTSUPP; + +	return mii_nway_restart(&dev->mii); +} +EXPORT_SYMBOL_GPL(usbnet_nway_reset); +  /* drivers may override default ethtool_ops in their bind() routine */  static struct ethtool_ops usbnet_ethtool_ops = { +	.get_settings		= usbnet_get_settings, +	.set_settings		= usbnet_set_settings,  	.get_drvinfo		= usbnet_get_drvinfo,  	.get_link		= usbnet_get_link, +	.nway_reset		= usbnet_nway_reset,  	.get_msglevel		= usbnet_get_msglevel,  	.set_msglevel		= usbnet_set_msglevel,  }; | 
