linux-mips
[Top] [All Lists]

[PATCH 9/12] sbmac-fixes

To: linux-mips@linux-mips.org
Subject: [PATCH 9/12] sbmac-fixes
From: "Andrew Isaacson" <adi@broadcom.com>
Date: Wed, 19 Oct 2005 23:58:26 -0700
In-reply-to: <20051020065320.GA23857@broadcom.com>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20051020065320.GA23857@broadcom.com>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.4.2.1i
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>

 drivers/net/sb1250-mac.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+)

Index: lmo/drivers/net/sb1250-mac.c
===================================================================
--- lmo.orig/drivers/net/sb1250-mac.c   2005-10-19 22:34:12.000000000 -0700
+++ lmo/drivers/net/sb1250-mac.c        2005-10-19 22:34:12.000000000 -0700
@@ -314,6 +314,7 @@
 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);
@@ -451,6 +452,9 @@
 
 #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) */
 
@@ -2460,6 +2464,15 @@
                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
         */
 
@@ -2492,6 +2505,29 @@
        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)


<Prev in Thread] Current Thread [Next in Thread>