diff options
author | Petko Manolov <petkan@nucleusys.com> | 2006-09-27 17:25:37 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-28 18:36:42 -0400 |
commit | 37cf3477d2140f496e0713738fabdb5bc6fd60f3 (patch) | |
tree | 162f7a38f3279f03924d80272d9dd723c60c654b /drivers/usb | |
parent | 7923811a46f7e29ae8052edf2461e6c6b8ec2415 (diff) |
USB: Pegasus driver failing for ADMtek 8515 network device
Address http://bugzilla.kernel.org/show_bug.cgi?id=7126
Attempting to read the ethernet ID directly from the eeprom somehow
confuses ADM8515. Subsequent read requests to either the eeprom or the MII
fail as well. Didn't dig much deeper, though. For example ADM8513 does
not experience this problem.
I used the fact that at power up the device is reading its ID automatically
(not true for older Pegasus based devices) and put it in the Ethernet ID
registers. So now the driver uses get_registers() instead of
read_eprom_word() if the device is Pegasus_II based one. Tested it with
all (Pegasus and Pegasus_II) gadgets i have and everything seems ok.
Cc: <jogeedaklown@yahoo.com>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/net/pegasus.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index b8e25af13f02..918cf5a77c08 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c | |||
@@ -45,7 +45,7 @@ | |||
45 | /* | 45 | /* |
46 | * Version Information | 46 | * Version Information |
47 | */ | 47 | */ |
48 | #define DRIVER_VERSION "v0.6.13 (2005/11/13)" | 48 | #define DRIVER_VERSION "v0.6.14 (2006/09/27)" |
49 | #define DRIVER_AUTHOR "Petko Manolov <petkan@users.sourceforge.net>" | 49 | #define DRIVER_AUTHOR "Petko Manolov <petkan@users.sourceforge.net>" |
50 | #define DRIVER_DESC "Pegasus/Pegasus II USB Ethernet driver" | 50 | #define DRIVER_DESC "Pegasus/Pegasus II USB Ethernet driver" |
51 | 51 | ||
@@ -339,7 +339,7 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd) | |||
339 | } | 339 | } |
340 | fail: | 340 | fail: |
341 | if (netif_msg_drv(pegasus)) | 341 | if (netif_msg_drv(pegasus)) |
342 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 342 | dev_warn(&pegasus->intf->dev, "%s failed\n", __FUNCTION__); |
343 | 343 | ||
344 | return ret; | 344 | return ret; |
345 | } | 345 | } |
@@ -376,7 +376,7 @@ static int write_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 regd) | |||
376 | 376 | ||
377 | fail: | 377 | fail: |
378 | if (netif_msg_drv(pegasus)) | 378 | if (netif_msg_drv(pegasus)) |
379 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 379 | dev_warn(&pegasus->intf->dev, "%s failed\n", __FUNCTION__); |
380 | return -ETIMEDOUT; | 380 | return -ETIMEDOUT; |
381 | } | 381 | } |
382 | 382 | ||
@@ -413,7 +413,7 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata) | |||
413 | 413 | ||
414 | fail: | 414 | fail: |
415 | if (netif_msg_drv(pegasus)) | 415 | if (netif_msg_drv(pegasus)) |
416 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 416 | dev_warn(&pegasus->intf->dev, "%s failed\n", __FUNCTION__); |
417 | return -ETIMEDOUT; | 417 | return -ETIMEDOUT; |
418 | } | 418 | } |
419 | 419 | ||
@@ -461,7 +461,7 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data) | |||
461 | return ret; | 461 | return ret; |
462 | fail: | 462 | fail: |
463 | if (netif_msg_drv(pegasus)) | 463 | if (netif_msg_drv(pegasus)) |
464 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 464 | dev_warn(&pegasus->intf->dev, "%s failed\n", __FUNCTION__); |
465 | return -ETIMEDOUT; | 465 | return -ETIMEDOUT; |
466 | } | 466 | } |
467 | #endif /* PEGASUS_WRITE_EEPROM */ | 467 | #endif /* PEGASUS_WRITE_EEPROM */ |
@@ -481,8 +481,12 @@ static void set_ethernet_addr(pegasus_t * pegasus) | |||
481 | { | 481 | { |
482 | __u8 node_id[6]; | 482 | __u8 node_id[6]; |
483 | 483 | ||
484 | get_node_id(pegasus, node_id); | 484 | if (pegasus->features & PEGASUS_II) { |
485 | set_registers(pegasus, EthID, sizeof (node_id), node_id); | 485 | get_registers(pegasus, 0x10, sizeof(node_id), node_id); |
486 | } else { | ||
487 | get_node_id(pegasus, node_id); | ||
488 | set_registers(pegasus, EthID, sizeof (node_id), node_id); | ||
489 | } | ||
486 | memcpy(pegasus->net->dev_addr, node_id, sizeof (node_id)); | 490 | memcpy(pegasus->net->dev_addr, node_id, sizeof (node_id)); |
487 | } | 491 | } |
488 | 492 | ||