|
@@ -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, ®s->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)
|