diff options
Diffstat (limited to 'drivers/net/forcedeth.c')
-rw-r--r-- | drivers/net/forcedeth.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 731d0d7b2f37..525624fc03b4 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -99,6 +99,7 @@ | |||
99 | * 0.44: 20 Aug 2005: Add support for scatter gather and segmentation. | 99 | * 0.44: 20 Aug 2005: Add support for scatter gather and segmentation. |
100 | * 0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check | 100 | * 0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check |
101 | * 0.46: 20 Oct 2005: Add irq optimization modes. | 101 | * 0.46: 20 Oct 2005: Add irq optimization modes. |
102 | * 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan. | ||
102 | * | 103 | * |
103 | * Known bugs: | 104 | * Known bugs: |
104 | * We suspect that on some hardware no TX done interrupts are generated. | 105 | * We suspect that on some hardware no TX done interrupts are generated. |
@@ -110,7 +111,7 @@ | |||
110 | * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few | 111 | * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few |
111 | * superfluous timer interrupts from the nic. | 112 | * superfluous timer interrupts from the nic. |
112 | */ | 113 | */ |
113 | #define FORCEDETH_VERSION "0.46" | 114 | #define FORCEDETH_VERSION "0.47" |
114 | #define DRV_NAME "forcedeth" | 115 | #define DRV_NAME "forcedeth" |
115 | 116 | ||
116 | #include <linux/module.h> | 117 | #include <linux/module.h> |
@@ -2557,16 +2558,17 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
2557 | } | 2558 | } |
2558 | 2559 | ||
2559 | /* find a suitable phy */ | 2560 | /* find a suitable phy */ |
2560 | for (i = 1; i < 32; i++) { | 2561 | for (i = 1; i <= 32; i++) { |
2561 | int id1, id2; | 2562 | int id1, id2; |
2563 | int phyaddr = i & 0x1F; | ||
2562 | 2564 | ||
2563 | spin_lock_irq(&np->lock); | 2565 | spin_lock_irq(&np->lock); |
2564 | id1 = mii_rw(dev, i, MII_PHYSID1, MII_READ); | 2566 | id1 = mii_rw(dev, phyaddr, MII_PHYSID1, MII_READ); |
2565 | spin_unlock_irq(&np->lock); | 2567 | spin_unlock_irq(&np->lock); |
2566 | if (id1 < 0 || id1 == 0xffff) | 2568 | if (id1 < 0 || id1 == 0xffff) |
2567 | continue; | 2569 | continue; |
2568 | spin_lock_irq(&np->lock); | 2570 | spin_lock_irq(&np->lock); |
2569 | id2 = mii_rw(dev, i, MII_PHYSID2, MII_READ); | 2571 | id2 = mii_rw(dev, phyaddr, MII_PHYSID2, MII_READ); |
2570 | spin_unlock_irq(&np->lock); | 2572 | spin_unlock_irq(&np->lock); |
2571 | if (id2 < 0 || id2 == 0xffff) | 2573 | if (id2 < 0 || id2 == 0xffff) |
2572 | continue; | 2574 | continue; |
@@ -2574,23 +2576,19 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
2574 | id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT; | 2576 | id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT; |
2575 | id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT; | 2577 | id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT; |
2576 | dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n", | 2578 | dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n", |
2577 | pci_name(pci_dev), id1, id2, i); | 2579 | pci_name(pci_dev), id1, id2, phyaddr); |
2578 | np->phyaddr = i; | 2580 | np->phyaddr = phyaddr; |
2579 | np->phy_oui = id1 | id2; | 2581 | np->phy_oui = id1 | id2; |
2580 | break; | 2582 | break; |
2581 | } | 2583 | } |
2582 | if (i == 32) { | 2584 | if (i == 33) { |
2583 | /* PHY in isolate mode? No phy attached and user wants to | ||
2584 | * test loopback? Very odd, but can be correct. | ||
2585 | */ | ||
2586 | printk(KERN_INFO "%s: open: Could not find a valid PHY.\n", | 2585 | printk(KERN_INFO "%s: open: Could not find a valid PHY.\n", |
2587 | pci_name(pci_dev)); | 2586 | pci_name(pci_dev)); |
2588 | } | 2587 | goto out_freering; |
2589 | |||
2590 | if (i != 32) { | ||
2591 | /* reset it */ | ||
2592 | phy_init(dev); | ||
2593 | } | 2588 | } |
2589 | |||
2590 | /* reset it */ | ||
2591 | phy_init(dev); | ||
2594 | 2592 | ||
2595 | /* set default link speed settings */ | 2593 | /* set default link speed settings */ |
2596 | np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; | 2594 | np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; |