[netdrvr] sundance: fix phy scanning on IP100A
authorJeff Garzik <jeff@garzik.org>
Sat, 29 Sep 2007 05:10:14 +0000 (01:10 -0400)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 10 Oct 2007 23:53:46 +0000 (16:53 -0700)
Based on a based from Jesse Huang <jesse@icplus.com.tw>.

Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/net/sundance.c

index a37637ec9b7717cb3861a5b9302067a853ab26a4..ff98f5d597f117294ec870cce330bfd339a63bca 100644 (file)
@@ -466,7 +466,7 @@ static int __devinit sundance_probe1 (struct pci_dev *pdev,
 #else
        int bar = 1;
 #endif
-       int phy, phy_idx = 0;
+       int phy, phy_end, phy_idx = 0;
        DECLARE_MAC_BUF(mac);
 
 /* when built into the kernel, we only print version if device is found */
@@ -552,11 +552,19 @@ static int __devinit sundance_probe1 (struct pci_dev *pdev,
 
        np->phys[0] = 1;                /* Default setting */
        np->mii_preamble_required++;
+
        /*
         * It seems some phys doesn't deal well with address 0 being accessed
-        * first, so leave address zero to the end of the loop (32 & 31).
+        * first
         */
-       for (phy = 1; phy <= 32 && phy_idx < MII_CNT; phy++) {
+       if (sundance_pci_tbl[np->chip_id].device == 0x0200) {
+               phy = 0;
+               phy_end = 31;
+       } else {
+               phy = 1;
+               phy_end = 32;   /* wraps to zero, due to 'phy & 0x1f' */
+       }
+       for (; phy <= phy_end && phy_idx < MII_CNT; phy++) {
                int phyx = phy & 0x1f;
                int mii_status = mdio_read(dev, phyx, MII_BMSR);
                if (mii_status != 0xffff  &&  mii_status != 0x0000) {