diff options
Diffstat (limited to 'drivers/usb/net/pegasus.c')
-rw-r--r-- | drivers/usb/net/pegasus.c | 106 |
1 files changed, 51 insertions, 55 deletions
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 683e3df5d607..d8c7adabf201 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.12 (2005/01/13)" | 48 | #define DRIVER_VERSION "v0.6.13 (2005/11/13)" |
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 | ||
@@ -113,7 +113,7 @@ static void ctrl_callback(struct urb *urb, struct pt_regs *regs) | |||
113 | break; | 113 | break; |
114 | default: | 114 | default: |
115 | if (netif_msg_drv(pegasus)) | 115 | if (netif_msg_drv(pegasus)) |
116 | dev_err(&pegasus->intf->dev, "%s, status %d\n", | 116 | dev_dbg(&pegasus->intf->dev, "%s, status %d\n", |
117 | __FUNCTION__, urb->status); | 117 | __FUNCTION__, urb->status); |
118 | } | 118 | } |
119 | pegasus->flags &= ~ETH_REGS_CHANGED; | 119 | pegasus->flags &= ~ETH_REGS_CHANGED; |
@@ -308,9 +308,9 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd) | |||
308 | __le16 regdi; | 308 | __le16 regdi; |
309 | int ret; | 309 | int ret; |
310 | 310 | ||
311 | ret = set_register(pegasus, PhyCtrl, 0); | 311 | set_register(pegasus, PhyCtrl, 0); |
312 | ret = set_registers(pegasus, PhyAddr, sizeof (data), data); | 312 | set_registers(pegasus, PhyAddr, sizeof (data), data); |
313 | ret = set_register(pegasus, PhyCtrl, (indx | PHY_READ)); | 313 | set_register(pegasus, PhyCtrl, (indx | PHY_READ)); |
314 | for (i = 0; i < REG_TIMEOUT; i++) { | 314 | for (i = 0; i < REG_TIMEOUT; i++) { |
315 | ret = get_registers(pegasus, PhyCtrl, 1, data); | 315 | ret = get_registers(pegasus, PhyCtrl, 1, data); |
316 | if (data[0] & PHY_DONE) | 316 | if (data[0] & PHY_DONE) |
@@ -319,12 +319,12 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd) | |||
319 | if (i < REG_TIMEOUT) { | 319 | if (i < REG_TIMEOUT) { |
320 | ret = get_registers(pegasus, PhyData, 2, ®di); | 320 | ret = get_registers(pegasus, PhyData, 2, ®di); |
321 | *regd = le16_to_cpu(regdi); | 321 | *regd = le16_to_cpu(regdi); |
322 | return 1; | 322 | return ret; |
323 | } | 323 | } |
324 | if (netif_msg_drv(pegasus)) | 324 | if (netif_msg_drv(pegasus)) |
325 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 325 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); |
326 | 326 | ||
327 | return 0; | 327 | return ret; |
328 | } | 328 | } |
329 | 329 | ||
330 | static int mdio_read(struct net_device *dev, int phy_id, int loc) | 330 | static int mdio_read(struct net_device *dev, int phy_id, int loc) |
@@ -344,20 +344,20 @@ static int write_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 regd) | |||
344 | 344 | ||
345 | data[1] = (u8) regd; | 345 | data[1] = (u8) regd; |
346 | data[2] = (u8) (regd >> 8); | 346 | data[2] = (u8) (regd >> 8); |
347 | ret = set_register(pegasus, PhyCtrl, 0); | 347 | set_register(pegasus, PhyCtrl, 0); |
348 | ret = set_registers(pegasus, PhyAddr, sizeof(data), data); | 348 | set_registers(pegasus, PhyAddr, sizeof(data), data); |
349 | ret = set_register(pegasus, PhyCtrl, (indx | PHY_WRITE)); | 349 | set_register(pegasus, PhyCtrl, (indx | PHY_WRITE)); |
350 | for (i = 0; i < REG_TIMEOUT; i++) { | 350 | for (i = 0; i < REG_TIMEOUT; i++) { |
351 | ret = get_registers(pegasus, PhyCtrl, 1, data); | 351 | ret = get_registers(pegasus, PhyCtrl, 1, data); |
352 | if (data[0] & PHY_DONE) | 352 | if (data[0] & PHY_DONE) |
353 | break; | 353 | break; |
354 | } | 354 | } |
355 | if (i < REG_TIMEOUT) | 355 | if (i < REG_TIMEOUT) |
356 | return 0; | 356 | return ret; |
357 | 357 | ||
358 | if (netif_msg_drv(pegasus)) | 358 | if (netif_msg_drv(pegasus)) |
359 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 359 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); |
360 | return 1; | 360 | return -ETIMEDOUT; |
361 | } | 361 | } |
362 | 362 | ||
363 | static void mdio_write(struct net_device *dev, int phy_id, int loc, int val) | 363 | static void mdio_write(struct net_device *dev, int phy_id, int loc, int val) |
@@ -374,9 +374,9 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata) | |||
374 | __le16 retdatai; | 374 | __le16 retdatai; |
375 | int ret; | 375 | int ret; |
376 | 376 | ||
377 | ret = set_register(pegasus, EpromCtrl, 0); | 377 | set_register(pegasus, EpromCtrl, 0); |
378 | ret = set_register(pegasus, EpromOffset, index); | 378 | set_register(pegasus, EpromOffset, index); |
379 | ret = set_register(pegasus, EpromCtrl, EPROM_READ); | 379 | set_register(pegasus, EpromCtrl, EPROM_READ); |
380 | 380 | ||
381 | for (i = 0; i < REG_TIMEOUT; i++) { | 381 | for (i = 0; i < REG_TIMEOUT; i++) { |
382 | ret = get_registers(pegasus, EpromCtrl, 1, &tmp); | 382 | ret = get_registers(pegasus, EpromCtrl, 1, &tmp); |
@@ -386,12 +386,12 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata) | |||
386 | if (i < REG_TIMEOUT) { | 386 | if (i < REG_TIMEOUT) { |
387 | ret = get_registers(pegasus, EpromData, 2, &retdatai); | 387 | ret = get_registers(pegasus, EpromData, 2, &retdatai); |
388 | *retdata = le16_to_cpu(retdatai); | 388 | *retdata = le16_to_cpu(retdatai); |
389 | return 0; | 389 | return ret; |
390 | } | 390 | } |
391 | 391 | ||
392 | if (netif_msg_drv(pegasus)) | 392 | if (netif_msg_drv(pegasus)) |
393 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 393 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); |
394 | return -1; | 394 | return -ETIMEDOUT; |
395 | } | 395 | } |
396 | 396 | ||
397 | #ifdef PEGASUS_WRITE_EEPROM | 397 | #ifdef PEGASUS_WRITE_EEPROM |
@@ -400,8 +400,8 @@ static inline void enable_eprom_write(pegasus_t * pegasus) | |||
400 | __u8 tmp; | 400 | __u8 tmp; |
401 | int ret; | 401 | int ret; |
402 | 402 | ||
403 | ret = get_registers(pegasus, EthCtrl2, 1, &tmp); | 403 | get_registers(pegasus, EthCtrl2, 1, &tmp); |
404 | ret = set_register(pegasus, EthCtrl2, tmp | EPROM_WR_ENABLE); | 404 | set_register(pegasus, EthCtrl2, tmp | EPROM_WR_ENABLE); |
405 | } | 405 | } |
406 | 406 | ||
407 | static inline void disable_eprom_write(pegasus_t * pegasus) | 407 | static inline void disable_eprom_write(pegasus_t * pegasus) |
@@ -409,9 +409,9 @@ static inline void disable_eprom_write(pegasus_t * pegasus) | |||
409 | __u8 tmp; | 409 | __u8 tmp; |
410 | int ret; | 410 | int ret; |
411 | 411 | ||
412 | ret = get_registers(pegasus, EthCtrl2, 1, &tmp); | 412 | get_registers(pegasus, EthCtrl2, 1, &tmp); |
413 | ret = set_register(pegasus, EpromCtrl, 0); | 413 | set_register(pegasus, EpromCtrl, 0); |
414 | ret = set_register(pegasus, EthCtrl2, tmp & ~EPROM_WR_ENABLE); | 414 | set_register(pegasus, EthCtrl2, tmp & ~EPROM_WR_ENABLE); |
415 | } | 415 | } |
416 | 416 | ||
417 | static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data) | 417 | static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data) |
@@ -420,11 +420,11 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data) | |||
420 | __u8 tmp, d[4] = { 0x3f, 0, 0, EPROM_WRITE }; | 420 | __u8 tmp, d[4] = { 0x3f, 0, 0, EPROM_WRITE }; |
421 | int ret; | 421 | int ret; |
422 | 422 | ||
423 | ret = set_registers(pegasus, EpromOffset, 4, d); | 423 | set_registers(pegasus, EpromOffset, 4, d); |
424 | enable_eprom_write(pegasus); | 424 | enable_eprom_write(pegasus); |
425 | ret = set_register(pegasus, EpromOffset, index); | 425 | set_register(pegasus, EpromOffset, index); |
426 | ret = set_registers(pegasus, EpromData, 2, &data); | 426 | set_registers(pegasus, EpromData, 2, &data); |
427 | ret = set_register(pegasus, EpromCtrl, EPROM_WRITE); | 427 | set_register(pegasus, EpromCtrl, EPROM_WRITE); |
428 | 428 | ||
429 | for (i = 0; i < REG_TIMEOUT; i++) { | 429 | for (i = 0; i < REG_TIMEOUT; i++) { |
430 | ret = get_registers(pegasus, EpromCtrl, 1, &tmp); | 430 | ret = get_registers(pegasus, EpromCtrl, 1, &tmp); |
@@ -433,10 +433,10 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data) | |||
433 | } | 433 | } |
434 | disable_eprom_write(pegasus); | 434 | disable_eprom_write(pegasus); |
435 | if (i < REG_TIMEOUT) | 435 | if (i < REG_TIMEOUT) |
436 | return 0; | 436 | return ret; |
437 | if (netif_msg_drv(pegasus)) | 437 | if (netif_msg_drv(pegasus)) |
438 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); | 438 | dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__); |
439 | return -1; | 439 | return -ETIMEDOUT; |
440 | } | 440 | } |
441 | #endif /* PEGASUS_WRITE_EEPROM */ | 441 | #endif /* PEGASUS_WRITE_EEPROM */ |
442 | 442 | ||
@@ -454,10 +454,9 @@ static inline void get_node_id(pegasus_t * pegasus, __u8 * id) | |||
454 | static void set_ethernet_addr(pegasus_t * pegasus) | 454 | static void set_ethernet_addr(pegasus_t * pegasus) |
455 | { | 455 | { |
456 | __u8 node_id[6]; | 456 | __u8 node_id[6]; |
457 | int ret; | ||
458 | 457 | ||
459 | get_node_id(pegasus, node_id); | 458 | get_node_id(pegasus, node_id); |
460 | ret = set_registers(pegasus, EthID, sizeof (node_id), node_id); | 459 | set_registers(pegasus, EthID, sizeof (node_id), node_id); |
461 | memcpy(pegasus->net->dev_addr, node_id, sizeof (node_id)); | 460 | memcpy(pegasus->net->dev_addr, node_id, sizeof (node_id)); |
462 | } | 461 | } |
463 | 462 | ||
@@ -465,30 +464,29 @@ static inline int reset_mac(pegasus_t * pegasus) | |||
465 | { | 464 | { |
466 | __u8 data = 0x8; | 465 | __u8 data = 0x8; |
467 | int i; | 466 | int i; |
468 | int ret; | ||
469 | 467 | ||
470 | ret = set_register(pegasus, EthCtrl1, data); | 468 | set_register(pegasus, EthCtrl1, data); |
471 | for (i = 0; i < REG_TIMEOUT; i++) { | 469 | for (i = 0; i < REG_TIMEOUT; i++) { |
472 | ret = get_registers(pegasus, EthCtrl1, 1, &data); | 470 | get_registers(pegasus, EthCtrl1, 1, &data); |
473 | if (~data & 0x08) { | 471 | if (~data & 0x08) { |
474 | if (loopback & 1) | 472 | if (loopback & 1) |
475 | break; | 473 | break; |
476 | if (mii_mode && (pegasus->features & HAS_HOME_PNA)) | 474 | if (mii_mode && (pegasus->features & HAS_HOME_PNA)) |
477 | ret = set_register(pegasus, Gpio1, 0x34); | 475 | set_register(pegasus, Gpio1, 0x34); |
478 | else | 476 | else |
479 | ret = set_register(pegasus, Gpio1, 0x26); | 477 | set_register(pegasus, Gpio1, 0x26); |
480 | ret = set_register(pegasus, Gpio0, pegasus->features); | 478 | set_register(pegasus, Gpio0, pegasus->features); |
481 | ret = set_register(pegasus, Gpio0, DEFAULT_GPIO_SET); | 479 | set_register(pegasus, Gpio0, DEFAULT_GPIO_SET); |
482 | break; | 480 | break; |
483 | } | 481 | } |
484 | } | 482 | } |
485 | if (i == REG_TIMEOUT) | 483 | if (i == REG_TIMEOUT) |
486 | return 1; | 484 | return -ETIMEDOUT; |
487 | 485 | ||
488 | if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS || | 486 | if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS || |
489 | usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) { | 487 | usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) { |
490 | ret = set_register(pegasus, Gpio0, 0x24); | 488 | set_register(pegasus, Gpio0, 0x24); |
491 | ret = set_register(pegasus, Gpio0, 0x26); | 489 | set_register(pegasus, Gpio0, 0x26); |
492 | } | 490 | } |
493 | if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_ELCON) { | 491 | if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_ELCON) { |
494 | __u16 auxmode; | 492 | __u16 auxmode; |
@@ -527,7 +525,7 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb) | |||
527 | write_mii_word(pegasus, 0, 0x1b, auxmode | 4); | 525 | write_mii_word(pegasus, 0, 0x1b, auxmode | 4); |
528 | } | 526 | } |
529 | 527 | ||
530 | return 0; | 528 | return ret; |
531 | } | 529 | } |
532 | 530 | ||
533 | static void fill_skb_pool(pegasus_t * pegasus) | 531 | static void fill_skb_pool(pegasus_t * pegasus) |
@@ -881,9 +879,8 @@ static struct net_device_stats *pegasus_netdev_stats(struct net_device *dev) | |||
881 | static inline void disable_net_traffic(pegasus_t * pegasus) | 879 | static inline void disable_net_traffic(pegasus_t * pegasus) |
882 | { | 880 | { |
883 | int tmp = 0; | 881 | int tmp = 0; |
884 | int ret; | ||
885 | 882 | ||
886 | ret = set_registers(pegasus, EthCtrl0, 2, &tmp); | 883 | set_registers(pegasus, EthCtrl0, 2, &tmp); |
887 | } | 884 | } |
888 | 885 | ||
889 | static inline void get_interrupt_interval(pegasus_t * pegasus) | 886 | static inline void get_interrupt_interval(pegasus_t * pegasus) |
@@ -1206,18 +1203,17 @@ static __u8 mii_phy_probe(pegasus_t * pegasus) | |||
1206 | static inline void setup_pegasus_II(pegasus_t * pegasus) | 1203 | static inline void setup_pegasus_II(pegasus_t * pegasus) |
1207 | { | 1204 | { |
1208 | __u8 data = 0xa5; | 1205 | __u8 data = 0xa5; |
1209 | int ret; | ||
1210 | 1206 | ||
1211 | ret = set_register(pegasus, Reg1d, 0); | 1207 | set_register(pegasus, Reg1d, 0); |
1212 | ret = set_register(pegasus, Reg7b, 1); | 1208 | set_register(pegasus, Reg7b, 1); |
1213 | mdelay(100); | 1209 | mdelay(100); |
1214 | if ((pegasus->features & HAS_HOME_PNA) && mii_mode) | 1210 | if ((pegasus->features & HAS_HOME_PNA) && mii_mode) |
1215 | ret = set_register(pegasus, Reg7b, 0); | 1211 | set_register(pegasus, Reg7b, 0); |
1216 | else | 1212 | else |
1217 | ret = set_register(pegasus, Reg7b, 2); | 1213 | set_register(pegasus, Reg7b, 2); |
1218 | 1214 | ||
1219 | ret = set_register(pegasus, 0x83, data); | 1215 | set_register(pegasus, 0x83, data); |
1220 | ret = get_registers(pegasus, 0x83, 1, &data); | 1216 | get_registers(pegasus, 0x83, 1, &data); |
1221 | 1217 | ||
1222 | if (data == 0xa5) { | 1218 | if (data == 0xa5) { |
1223 | pegasus->chip = 0x8513; | 1219 | pegasus->chip = 0x8513; |
@@ -1225,14 +1221,14 @@ static inline void setup_pegasus_II(pegasus_t * pegasus) | |||
1225 | pegasus->chip = 0; | 1221 | pegasus->chip = 0; |
1226 | } | 1222 | } |
1227 | 1223 | ||
1228 | ret = set_register(pegasus, 0x80, 0xc0); | 1224 | set_register(pegasus, 0x80, 0xc0); |
1229 | ret = set_register(pegasus, 0x83, 0xff); | 1225 | set_register(pegasus, 0x83, 0xff); |
1230 | ret = set_register(pegasus, 0x84, 0x01); | 1226 | set_register(pegasus, 0x84, 0x01); |
1231 | 1227 | ||
1232 | if (pegasus->features & HAS_HOME_PNA && mii_mode) | 1228 | if (pegasus->features & HAS_HOME_PNA && mii_mode) |
1233 | ret = set_register(pegasus, Reg81, 6); | 1229 | set_register(pegasus, Reg81, 6); |
1234 | else | 1230 | else |
1235 | ret = set_register(pegasus, Reg81, 2); | 1231 | set_register(pegasus, Reg81, 2); |
1236 | } | 1232 | } |
1237 | 1233 | ||
1238 | 1234 | ||