Messages in this thread | | | Date | Wed, 27 Sep 2006 15:33:40 -0400 | From | dhollis@daveholl ... | Subject | Re: [PATCH 3/3] usbnet: improve generic ethtool support |
| |
Quoting Arnd Bergmann <arnd@arndb.de>:
> 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>
> > Index: linux-cg/drivers/usb/net/asix.c > =================================================================== > --- linux-cg.orig/drivers/usb/net/asix.c 2006-09-17 00:05:53.000000000 +0200 > +++ linux-cg/drivers/usb/net/asix.c 2006-09-17 00:09:43.000000000 +0200 > @@ -458,20 +458,6 @@ > info->eedump_len = 0x3e; > } > > -static int asix_get_settings(struct net_device *net, struct > ethtool_cmd *cmd) > -{ > - struct usbnet *dev = netdev_priv(net); > - > - return mii_ethtool_gset(&dev->mii,cmd); > -} > - > -static int asix_set_settings(struct net_device *net, struct > ethtool_cmd *cmd) > -{ > - struct usbnet *dev = netdev_priv(net); > - > - return mii_ethtool_sset(&dev->mii,cmd); > -} > - > /* We need to override some ethtool_ops so we require our > own structure so we don't interfere with other usbnet > devices that may be connected at the same time. */ > @@ -484,8 +470,9 @@ > .set_wol = asix_set_wol, > .get_eeprom_len = asix_get_eeprom_len, > .get_eeprom = asix_get_eeprom, > - .get_settings = asix_get_settings, > - .set_settings = asix_set_settings, > + .get_settings = usbnet_get_settings, > + .set_settings = usbnet_set_settings, > + .nway_reset = usbnet_nway_reset, > }; > > static int asix_ioctl (struct net_device *net, struct ifreq *rq, int cmd) > @@ -564,8 +551,9 @@ > .set_wol = asix_set_wol, > .get_eeprom_len = asix_get_eeprom_len, > .get_eeprom = asix_get_eeprom, > - .get_settings = asix_get_settings, > - .set_settings = asix_set_settings, > + .get_settings = usbnet_get_settings, > + .set_settings = usbnet_set_settings, > + .nway_reset = usbnet_nway_reset, > }; > > static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) > Index: linux-cg/drivers/usb/net/mcs7830.c > =================================================================== > --- linux-cg.orig/drivers/usb/net/mcs7830.c 2006-09-17 > 00:05:53.000000000 +0200 > +++ linux-cg/drivers/usb/net/mcs7830.c 2006-09-17 00:06:21.000000000 +0200 > @@ -430,8 +430,12 @@ > .get_regs = mcs7830_get_regs, > > /* common usbnet calls */ > + .get_link = usbnet_get_link, > .get_msglevel = usbnet_get_msglevel, > .set_msglevel = usbnet_set_msglevel, > + .get_settings = usbnet_get_settings, > + .set_settings = usbnet_set_settings, > + .nway_reset = usbnet_nway_reset, > }; > > static int mcs7830_bind(struct usbnet *dev, struct usb_interface *udev) > Index: linux-cg/drivers/usb/net/usbnet.c > =================================================================== > --- linux-cg.orig/drivers/usb/net/usbnet.c 2006-09-17 > 00:05:53.000000000 +0200 > +++ linux-cg/drivers/usb/net/usbnet.c 2006-09-17 00:07:45.000000000 +0200 > @@ -645,6 +645,29 @@ > * 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); > + > + if (!dev->mii.mdio_write) > + return -EOPNOTSUPP; > + > + return mii_ethtool_sset(&dev->mii, cmd); > +} > +EXPORT_SYMBOL_GPL(usbnet_set_settings); > + > + > void usbnet_get_drvinfo (struct net_device *net, struct > ethtool_drvinfo *info) > { > struct usbnet *dev = netdev_priv(net); > @@ -658,7 +681,7 @@ > } > 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); > > @@ -666,9 +689,14 @@ > 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) > { > @@ -686,10 +714,24 @@ > } > 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, > }; > Index: linux-cg/drivers/usb/net/usbnet.h > =================================================================== > --- linux-cg.orig/drivers/usb/net/usbnet.h 2006-09-17 > 00:05:53.000000000 +0200 > +++ linux-cg/drivers/usb/net/usbnet.h 2006-09-17 00:07:53.000000000 +0200 > @@ -167,9 +167,13 @@ > extern void usbnet_defer_kevent (struct usbnet *, int); > extern void usbnet_skb_return (struct usbnet *, struct sk_buff *); > > +extern int usbnet_get_settings (struct net_device *net, struct > ethtool_cmd *cmd); > +extern int usbnet_set_settings (struct net_device *net, struct > ethtool_cmd *cmd); > +extern u32 usbnet_get_link (struct net_device *net); > extern u32 usbnet_get_msglevel (struct net_device *); > extern void usbnet_set_msglevel (struct net_device *, u32); > extern void usbnet_get_drvinfo (struct net_device *, struct > ethtool_drvinfo *); > +extern int usbnet_nway_reset(struct net_device *net); > > /* messaging support includes the interface name, so it must not be > * used before it has one ... notably, in minidriver bind() calls. > >
---------------------------------------------------------------- This message was sent using IMP, the Internet Messaging Program.
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |