diff options
Diffstat (limited to 'drivers/net/usb/lan78xx.c')
-rw-r--r-- | drivers/net/usb/lan78xx.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index b99a7fb09f8e..0161f77641fa 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c | |||
@@ -1265,30 +1265,45 @@ static int lan78xx_ethtool_get_eeprom(struct net_device *netdev, | |||
1265 | struct ethtool_eeprom *ee, u8 *data) | 1265 | struct ethtool_eeprom *ee, u8 *data) |
1266 | { | 1266 | { |
1267 | struct lan78xx_net *dev = netdev_priv(netdev); | 1267 | struct lan78xx_net *dev = netdev_priv(netdev); |
1268 | int ret; | ||
1269 | |||
1270 | ret = usb_autopm_get_interface(dev->intf); | ||
1271 | if (ret) | ||
1272 | return ret; | ||
1268 | 1273 | ||
1269 | ee->magic = LAN78XX_EEPROM_MAGIC; | 1274 | ee->magic = LAN78XX_EEPROM_MAGIC; |
1270 | 1275 | ||
1271 | return lan78xx_read_raw_eeprom(dev, ee->offset, ee->len, data); | 1276 | ret = lan78xx_read_raw_eeprom(dev, ee->offset, ee->len, data); |
1277 | |||
1278 | usb_autopm_put_interface(dev->intf); | ||
1279 | |||
1280 | return ret; | ||
1272 | } | 1281 | } |
1273 | 1282 | ||
1274 | static int lan78xx_ethtool_set_eeprom(struct net_device *netdev, | 1283 | static int lan78xx_ethtool_set_eeprom(struct net_device *netdev, |
1275 | struct ethtool_eeprom *ee, u8 *data) | 1284 | struct ethtool_eeprom *ee, u8 *data) |
1276 | { | 1285 | { |
1277 | struct lan78xx_net *dev = netdev_priv(netdev); | 1286 | struct lan78xx_net *dev = netdev_priv(netdev); |
1287 | int ret; | ||
1288 | |||
1289 | ret = usb_autopm_get_interface(dev->intf); | ||
1290 | if (ret) | ||
1291 | return ret; | ||
1278 | 1292 | ||
1279 | /* Allow entire eeprom update only */ | 1293 | /* Invalid EEPROM_INDICATOR at offset zero will result in a failure |
1280 | if ((ee->magic == LAN78XX_EEPROM_MAGIC) && | 1294 | * to load data from EEPROM |
1281 | (ee->offset == 0) && | 1295 | */ |
1282 | (ee->len == 512) && | 1296 | if (ee->magic == LAN78XX_EEPROM_MAGIC) |
1283 | (data[0] == EEPROM_INDICATOR)) | 1297 | ret = lan78xx_write_raw_eeprom(dev, ee->offset, ee->len, data); |
1284 | return lan78xx_write_raw_eeprom(dev, ee->offset, ee->len, data); | ||
1285 | else if ((ee->magic == LAN78XX_OTP_MAGIC) && | 1298 | else if ((ee->magic == LAN78XX_OTP_MAGIC) && |
1286 | (ee->offset == 0) && | 1299 | (ee->offset == 0) && |
1287 | (ee->len == 512) && | 1300 | (ee->len == 512) && |
1288 | (data[0] == OTP_INDICATOR_1)) | 1301 | (data[0] == OTP_INDICATOR_1)) |
1289 | return lan78xx_write_raw_otp(dev, ee->offset, ee->len, data); | 1302 | ret = lan78xx_write_raw_otp(dev, ee->offset, ee->len, data); |
1303 | |||
1304 | usb_autopm_put_interface(dev->intf); | ||
1290 | 1305 | ||
1291 | return -EINVAL; | 1306 | return ret; |
1292 | } | 1307 | } |
1293 | 1308 | ||
1294 | static void lan78xx_get_strings(struct net_device *netdev, u32 stringset, | 1309 | static void lan78xx_get_strings(struct net_device *netdev, u32 stringset, |
@@ -2434,7 +2449,6 @@ static int lan78xx_reset(struct lan78xx_net *dev) | |||
2434 | /* LAN7801 only has RGMII mode */ | 2449 | /* LAN7801 only has RGMII mode */ |
2435 | if (dev->chipid == ID_REV_CHIP_ID_7801_) | 2450 | if (dev->chipid == ID_REV_CHIP_ID_7801_) |
2436 | buf &= ~MAC_CR_GMII_EN_; | 2451 | buf &= ~MAC_CR_GMII_EN_; |
2437 | buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_; | ||
2438 | ret = lan78xx_write_reg(dev, MAC_CR, buf); | 2452 | ret = lan78xx_write_reg(dev, MAC_CR, buf); |
2439 | 2453 | ||
2440 | ret = lan78xx_read_reg(dev, MAC_TX, &buf); | 2454 | ret = lan78xx_read_reg(dev, MAC_TX, &buf); |