smsc95xx: support ethtool get_regs
authorEmeric Vigier <emeric.vigier@savoirfairelinux.com>
Mon, 9 Jul 2012 21:44:45 +0000 (17:44 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 9 Jul 2012 21:47:52 +0000 (14:47 -0700)
Inspired by implementation in smsc911x.c and smsc9420.c
Tested on ARM/pandaboard running android

Signed-off-by: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/smsc95xx.c

index b1112e7538592181faf89f9147c20e0feb53485a..05ecf14d6597721d00c3115630dce2682fd4a450 100644 (file)
@@ -578,6 +578,35 @@ static int smsc95xx_ethtool_set_eeprom(struct net_device *netdev,
        return smsc95xx_write_eeprom(dev, ee->offset, ee->len, data);
 }
 
+static int smsc95xx_ethtool_getregslen(struct net_device *netdev)
+{
+       /* all smsc95xx registers */
+       return COE_CR - ID_REV + 1;
+}
+
+static void
+smsc95xx_ethtool_getregs(struct net_device *netdev, struct ethtool_regs *regs,
+                        void *buf)
+{
+       struct usbnet *dev = netdev_priv(netdev);
+       unsigned int i, j, retval;
+       u32 *data = buf;
+
+       retval = smsc95xx_read_reg(dev, ID_REV, &regs->version);
+       if (retval < 0) {
+               netdev_warn(netdev, "REGS: cannot read ID_REV\n");
+               return;
+       }
+
+       for (i = ID_REV, j = 0; i <= COE_CR; i += (sizeof(u32)), j++) {
+               retval = smsc95xx_read_reg(dev, i, &data[j]);
+               if (retval < 0) {
+                       netdev_warn(netdev, "REGS: cannot read reg[%x]\n", i);
+                       return;
+               }
+       }
+}
+
 static const struct ethtool_ops smsc95xx_ethtool_ops = {
        .get_link       = usbnet_get_link,
        .nway_reset     = usbnet_nway_reset,
@@ -589,6 +618,8 @@ static const struct ethtool_ops smsc95xx_ethtool_ops = {
        .get_eeprom_len = smsc95xx_ethtool_get_eeprom_len,
        .get_eeprom     = smsc95xx_ethtool_get_eeprom,
        .set_eeprom     = smsc95xx_ethtool_set_eeprom,
+       .get_regs_len   = smsc95xx_ethtool_getregslen,
+       .get_regs       = smsc95xx_ethtool_getregs,
 };
 
 static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)