]> err.no Git - linux-2.6/commitdiff
[PATCH] sb1250-mac: PHY probing fixes.
authorRalf Baechle <ralf@linux-mips.org>
Thu, 20 Oct 2005 11:01:28 +0000 (12:01 +0100)
committerJeff Garzik <jgarzik@pobox.com>
Thu, 20 Oct 2005 20:06:11 +0000 (16:06 -0400)
Improve sb1250-mac driver to probe for PHYs at addresses other
than 1, such as the PHYs on BigSur.

Signed-Off-By: Andy Isaacson <adi@broadcom.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/net/sb1250-mac.c

index d4c8ecdfa4a7912eef4f5ee313bcca6cb0cca751..aa4ca182175909c93f6b70eaa2b46e6370d8cbcd 100644 (file)
@@ -296,6 +296,7 @@ static void sbmac_set_rx_mode(struct net_device *dev);
 static int sbmac_mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 static int sbmac_close(struct net_device *dev);
 static int sbmac_mii_poll(struct sbmac_softc *s,int noisy);
+static int sbmac_mii_probe(struct net_device *dev);
 
 static void sbmac_mii_sync(struct sbmac_softc *s);
 static void sbmac_mii_senddata(struct sbmac_softc *s,unsigned int data, int bitcnt);
@@ -433,6 +434,9 @@ static uint64_t sbmac_orig_hwaddr[MAX_UNITS];
 
 #define        MII_BMCR        0x00    /* Basic mode control register (rw) */
 #define        MII_BMSR        0x01    /* Basic mode status register (ro) */
+#define        MII_PHYIDR1     0x02
+#define        MII_PHYIDR2     0x03
+
 #define MII_K1STSR     0x0A    /* 1K Status Register (ro) */
 #define        MII_ANLPAR      0x05    /* Autonegotiation lnk partner abilities (rw) */
 
@@ -2431,6 +2435,15 @@ static int sbmac_open(struct net_device *dev)
        if (request_irq(dev->irq, &sbmac_intr, SA_SHIRQ, dev->name, dev))
                return -EBUSY;
 
+       /*
+        * Probe phy address
+        */
+
+       if(sbmac_mii_probe(dev) == -1) {
+               printk("%s: failed to probe PHY.\n", dev->name);
+               return -EINVAL;
+       }
+
        /*
         * Configure default speed
         */
@@ -2464,6 +2477,29 @@ static int sbmac_open(struct net_device *dev)
        return 0;
 }
 
+static int sbmac_mii_probe(struct net_device *dev)
+{
+       int i;
+       struct sbmac_softc *s = netdev_priv(dev);
+       u16 bmsr, id1, id2;
+       u32 vendor, device;
+
+       for (i=1; i<31; i++) {
+       bmsr = sbmac_mii_read(s, i, MII_BMSR);
+               if (bmsr != 0) {
+                       s->sbm_phys[0] = i;
+                       id1 = sbmac_mii_read(s, i, MII_PHYIDR1);
+                       id2 = sbmac_mii_read(s, i, MII_PHYIDR2);
+                       vendor = ((u32)id1 << 6) | ((id2 >> 10) & 0x3f);
+                       device = (id2 >> 4) & 0x3f;
+
+                       printk(KERN_INFO "%s: found phy %d, vendor %06x part %02x\n",
+                               dev->name, i, vendor, device);
+                       return i;
+               }
+       }
+       return -1;
+}
 
 
 static int sbmac_mii_poll(struct sbmac_softc *s,int noisy)