mirror of https://gitee.com/openkylin/linux.git
[PATCH] sb1250-mac: PHY probing fixes.
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>
This commit is contained in:
parent
902f90735b
commit
59b8182707
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue