diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2006-10-09 00:08:01 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-10-17 14:46:32 -0700 | 
| commit | c41286fd42f3545513f8de9f61028120b6d38e89 (patch) | |
| tree | 2dddcf5c7423c0db62a1f8752c002cf62080287b /drivers/usb/net/usbnet.c | |
| parent | 2a36d7083438ccb607055abae633f39495a99947 (diff) | |
usbnet: improve generic ethtool support
This adds generic support for the ethtool commands get_settings,
set_settings, get_link and nway_reset to usbnet. These are now
implemented using mii functions when a low-level driver supports
mdio_read/mdio_write and does not override the usbnet ethtool
commands with its own.
Currently, this applies to the asix and the mcs7830 drivers.
I have tested it on mcs7830.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: David Hollis <dhollis@davehollis.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
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,  }; | 
