|
|
|
@ -292,20 +292,11 @@ static int macb_recv(struct eth_device *netdev) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int macb_phy_init(struct macb_device *macb) |
|
|
|
|
static void macb_phy_reset(struct macb_device *macb) |
|
|
|
|
{ |
|
|
|
|
struct eth_device *netdev = &macb->netdev; |
|
|
|
|
u32 ncfgr; |
|
|
|
|
u16 phy_id, status, adv, lpa; |
|
|
|
|
int media, speed, duplex; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
/* Check if the PHY is up to snuff... */ |
|
|
|
|
phy_id = macb_mdio_read(macb, MII_PHYSID1); |
|
|
|
|
if (phy_id == 0xffff) { |
|
|
|
|
printf("%s: No PHY present\n", netdev->name); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
u16 status, adv; |
|
|
|
|
|
|
|
|
|
adv = ADVERTISE_CSMA | ADVERTISE_ALL; |
|
|
|
|
macb_mdio_write(macb, MII_ADVERTISE, adv); |
|
|
|
@ -313,11 +304,6 @@ static int macb_phy_init(struct macb_device *macb) |
|
|
|
|
macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE |
|
|
|
|
| BMCR_ANRESTART)); |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
for (i = 0; i < 9; i++) |
|
|
|
|
printf("mii%d: 0x%04x\n", i, macb_mdio_read(macb, i)); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
for (i = 0; i < CFG_MACB_AUTONEG_TIMEOUT / 100; i++) { |
|
|
|
|
status = macb_mdio_read(macb, MII_BMSR); |
|
|
|
|
if (status & BMSR_ANEGCOMPLETE) |
|
|
|
@ -330,13 +316,33 @@ static int macb_phy_init(struct macb_device *macb) |
|
|
|
|
else |
|
|
|
|
printf("%s: Autonegotiation timed out (status=0x%04x)\n", |
|
|
|
|
netdev->name, status); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int macb_phy_init(struct macb_device *macb) |
|
|
|
|
{ |
|
|
|
|
struct eth_device *netdev = &macb->netdev; |
|
|
|
|
u32 ncfgr; |
|
|
|
|
u16 phy_id, status, adv, lpa; |
|
|
|
|
int media, speed, duplex; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
/* Check if the PHY is up to snuff... */ |
|
|
|
|
phy_id = macb_mdio_read(macb, MII_PHYSID1); |
|
|
|
|
if (phy_id == 0xffff) { |
|
|
|
|
printf("%s: No PHY present\n", netdev->name); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
status = macb_mdio_read(macb, MII_BMSR); |
|
|
|
|
if (!(status & BMSR_LSTATUS)) { |
|
|
|
|
/* Try to re-negotiate if we don't have link already. */ |
|
|
|
|
macb_phy_reset(macb); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < CFG_MACB_AUTONEG_TIMEOUT / 100; i++) { |
|
|
|
|
udelay(100); |
|
|
|
|
status = macb_mdio_read(macb, MII_BMSR); |
|
|
|
|
if (status & BMSR_LSTATUS) |
|
|
|
|
break; |
|
|
|
|
udelay(100); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -345,6 +351,7 @@ static int macb_phy_init(struct macb_device *macb) |
|
|
|
|
netdev->name, status); |
|
|
|
|
return 0; |
|
|
|
|
} else { |
|
|
|
|
adv = macb_mdio_read(macb, MII_ADVERTISE); |
|
|
|
|
lpa = macb_mdio_read(macb, MII_LPA); |
|
|
|
|
media = mii_nway_result(lpa & adv); |
|
|
|
|
speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF) |
|
|
|
|