diff options
Diffstat (limited to 'drivers/net/usb/usbnet.c')
| -rw-r--r-- | drivers/net/usb/usbnet.c | 38 | 
1 files changed, 32 insertions, 6 deletions
| diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index f4f37ecfed58..ecf62849f4c1 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -944,7 +944,10 @@ EXPORT_SYMBOL_GPL(usbnet_open);   * they'll probably want to use this base set.   */ -int usbnet_get_link_ksettings(struct net_device *net, +/* These methods are written on the assumption that the device + * uses MII + */ +int usbnet_get_link_ksettings_mii(struct net_device *net,  			      struct ethtool_link_ksettings *cmd)  {  	struct usbnet *dev = netdev_priv(net); @@ -956,9 +959,30 @@ int usbnet_get_link_ksettings(struct net_device *net,  	return 0;  } -EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings); +EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings_mii); + +int usbnet_get_link_ksettings_internal(struct net_device *net, +					struct ethtool_link_ksettings *cmd) +{ +	struct usbnet *dev = netdev_priv(net); + +	/* the assumption that speed is equal on tx and rx +	 * is deeply engrained into the networking layer. +	 * For wireless stuff it is not true. +	 * We assume that rx_speed matters more. +	 */ +	if (dev->rx_speed != SPEED_UNSET) +		cmd->base.speed = dev->rx_speed / 1000000; +	else if (dev->tx_speed != SPEED_UNSET) +		cmd->base.speed = dev->tx_speed / 1000000; +	else +		cmd->base.speed = SPEED_UNKNOWN; + +	return 0; +} +EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings_internal); -int usbnet_set_link_ksettings(struct net_device *net, +int usbnet_set_link_ksettings_mii(struct net_device *net,  			      const struct ethtool_link_ksettings *cmd)  {  	struct usbnet *dev = netdev_priv(net); @@ -978,7 +1002,7 @@ int usbnet_set_link_ksettings(struct net_device *net,  	return retval;  } -EXPORT_SYMBOL_GPL(usbnet_set_link_ksettings); +EXPORT_SYMBOL_GPL(usbnet_set_link_ksettings_mii);  u32 usbnet_get_link (struct net_device *net)  { @@ -1043,8 +1067,8 @@ static const struct ethtool_ops usbnet_ethtool_ops = {  	.get_msglevel		= usbnet_get_msglevel,  	.set_msglevel		= usbnet_set_msglevel,  	.get_ts_info		= ethtool_op_get_ts_info, -	.get_link_ksettings	= usbnet_get_link_ksettings, -	.set_link_ksettings	= usbnet_set_link_ksettings, +	.get_link_ksettings	= usbnet_get_link_ksettings_mii, +	.set_link_ksettings	= usbnet_set_link_ksettings_mii,  };  /*-------------------------------------------------------------------------*/ @@ -1661,6 +1685,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  	dev->intf = udev;  	dev->driver_info = info;  	dev->driver_name = name; +	dev->rx_speed = SPEED_UNSET; +	dev->tx_speed = SPEED_UNSET;  	net->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);  	if (!net->tstats) | 
