mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-09-21 15:12:04 +00:00
net: macb: explicitly pass phy_adr to mdio read and write
To support accessing arbitrary addresses the mii/mdio bus it is necessary that the macb_mdio_read and macb_mdio_write functions do not implicitly use the address of the connected phy. The function signature is extended according to the Linux kernel equivalent. Signed-off-by: Josef Holzmayr <holzmayr@rsi-elektrotechnik.de> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
27c3f70f3b
commit
0d3044c210
1 changed files with 17 additions and 16 deletions
|
@ -165,7 +165,8 @@ static int gem_is_gigabit_capable(struct macb_device *macb)
|
|||
return macb_is_gem(macb) && !cpu_is_sama5d2() && !cpu_is_sama5d4();
|
||||
}
|
||||
|
||||
static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value)
|
||||
static void macb_mdio_write(struct macb_device *macb, u8 phy_adr, u8 reg,
|
||||
u16 value)
|
||||
{
|
||||
unsigned long netctl;
|
||||
unsigned long netstat;
|
||||
|
@ -177,7 +178,7 @@ static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value)
|
|||
|
||||
frame = (MACB_BF(SOF, 1)
|
||||
| MACB_BF(RW, 1)
|
||||
| MACB_BF(PHYA, macb->phy_addr)
|
||||
| MACB_BF(PHYA, phy_adr)
|
||||
| MACB_BF(REGA, reg)
|
||||
| MACB_BF(CODE, 2)
|
||||
| MACB_BF(DATA, value));
|
||||
|
@ -192,7 +193,7 @@ static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value)
|
|||
macb_writel(macb, NCR, netctl);
|
||||
}
|
||||
|
||||
static u16 macb_mdio_read(struct macb_device *macb, u8 reg)
|
||||
static u16 macb_mdio_read(struct macb_device *macb, u8 phy_adr, u8 reg)
|
||||
{
|
||||
unsigned long netctl;
|
||||
unsigned long netstat;
|
||||
|
@ -204,7 +205,7 @@ static u16 macb_mdio_read(struct macb_device *macb, u8 reg)
|
|||
|
||||
frame = (MACB_BF(SOF, 1)
|
||||
| MACB_BF(RW, 2)
|
||||
| MACB_BF(PHYA, macb->phy_addr)
|
||||
| MACB_BF(PHYA, phy_adr)
|
||||
| MACB_BF(REGA, reg)
|
||||
| MACB_BF(CODE, 2));
|
||||
macb_writel(macb, MAN, frame);
|
||||
|
@ -244,7 +245,7 @@ int macb_miiphy_read(struct mii_dev *bus, int phy_adr, int devad, int reg)
|
|||
return -1;
|
||||
|
||||
arch_get_mdio_control(bus->name);
|
||||
value = macb_mdio_read(macb, reg);
|
||||
value = macb_mdio_read(macb, macb->phy_addr, reg);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
@ -264,7 +265,7 @@ int macb_miiphy_write(struct mii_dev *bus, int phy_adr, int devad, int reg,
|
|||
return -1;
|
||||
|
||||
arch_get_mdio_control(bus->name);
|
||||
macb_mdio_write(macb, reg, value);
|
||||
macb_mdio_write(macb, macb->phy_addr, reg, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -451,13 +452,13 @@ static void macb_phy_reset(struct macb_device *macb, const char *name)
|
|||
u16 status, adv;
|
||||
|
||||
adv = ADVERTISE_CSMA | ADVERTISE_ALL;
|
||||
macb_mdio_write(macb, MII_ADVERTISE, adv);
|
||||
macb_mdio_write(macb, macb->phy_addr, MII_ADVERTISE, adv);
|
||||
printf("%s: Starting autonegotiation...\n", name);
|
||||
macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE
|
||||
macb_mdio_write(macb, macb->phy_addr, MII_BMCR, (BMCR_ANENABLE
|
||||
| BMCR_ANRESTART));
|
||||
|
||||
for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) {
|
||||
status = macb_mdio_read(macb, MII_BMSR);
|
||||
status = macb_mdio_read(macb, macb->phy_addr, MII_BMSR);
|
||||
if (status & BMSR_ANEGCOMPLETE)
|
||||
break;
|
||||
udelay(100);
|
||||
|
@ -478,7 +479,7 @@ static int macb_phy_find(struct macb_device *macb, const char *name)
|
|||
/* Search for PHY... */
|
||||
for (i = 0; i < 32; i++) {
|
||||
macb->phy_addr = i;
|
||||
phy_id = macb_mdio_read(macb, MII_PHYSID1);
|
||||
phy_id = macb_mdio_read(macb, macb->phy_addr, MII_PHYSID1);
|
||||
if (phy_id != 0xffff) {
|
||||
printf("%s: PHY present at %d\n", name, i);
|
||||
return 0;
|
||||
|
@ -596,7 +597,7 @@ static int macb_phy_init(struct macb_device *macb, const char *name)
|
|||
return ret;
|
||||
|
||||
/* Check if the PHY is up to snuff... */
|
||||
phy_id = macb_mdio_read(macb, MII_PHYSID1);
|
||||
phy_id = macb_mdio_read(macb, macb->phy_addr, MII_PHYSID1);
|
||||
if (phy_id == 0xffff) {
|
||||
printf("%s: No PHY present\n", name);
|
||||
return -ENODEV;
|
||||
|
@ -619,13 +620,13 @@ static int macb_phy_init(struct macb_device *macb, const char *name)
|
|||
phy_config(macb->phydev);
|
||||
#endif
|
||||
|
||||
status = macb_mdio_read(macb, MII_BMSR);
|
||||
status = macb_mdio_read(macb, macb->phy_addr, MII_BMSR);
|
||||
if (!(status & BMSR_LSTATUS)) {
|
||||
/* Try to re-negotiate if we don't have link already. */
|
||||
macb_phy_reset(macb, name);
|
||||
|
||||
for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) {
|
||||
status = macb_mdio_read(macb, MII_BMSR);
|
||||
status = macb_mdio_read(macb, macb->phy_addr, MII_BMSR);
|
||||
if (status & BMSR_LSTATUS) {
|
||||
/*
|
||||
* Delay a bit after the link is established,
|
||||
|
@ -646,7 +647,7 @@ static int macb_phy_init(struct macb_device *macb, const char *name)
|
|||
|
||||
/* First check for GMAC and that it is GiB capable */
|
||||
if (gem_is_gigabit_capable(macb)) {
|
||||
lpa = macb_mdio_read(macb, MII_STAT1000);
|
||||
lpa = macb_mdio_read(macb, macb->phy_addr, MII_STAT1000);
|
||||
|
||||
if (lpa & (LPA_1000FULL | LPA_1000HALF | LPA_1000XFULL |
|
||||
LPA_1000XHALF)) {
|
||||
|
@ -680,8 +681,8 @@ static int macb_phy_init(struct macb_device *macb, const char *name)
|
|||
}
|
||||
|
||||
/* fall back for EMAC checking */
|
||||
adv = macb_mdio_read(macb, MII_ADVERTISE);
|
||||
lpa = macb_mdio_read(macb, MII_LPA);
|
||||
adv = macb_mdio_read(macb, macb->phy_addr, MII_ADVERTISE);
|
||||
lpa = macb_mdio_read(macb, macb->phy_addr, MII_LPA);
|
||||
media = mii_nway_result(lpa & adv);
|
||||
speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF)
|
||||
? 1 : 0);
|
||||
|
|
Loading…
Reference in a new issue