net: ag7xxx: Propagate errors on phy access
Don't wait forever. Pass errors back to the caller. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com> Acked-by: Marek Vasut <marex@denx.de>
This commit is contained in:
parent
9240a2f5f1
commit
2fd519f777
@ -285,18 +285,33 @@ static int ag7xxx_switch_reg_write(struct mii_dev *bus, int reg, u32 val)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ag7xxx_mdio_rw(struct mii_dev *bus, int addr, int reg, u32 val)
|
static int ag7xxx_mdio_rw(struct mii_dev *bus, int addr, int reg, u32 val)
|
||||||
{
|
{
|
||||||
u32 data;
|
u32 data;
|
||||||
|
unsigned long start;
|
||||||
|
int ret;
|
||||||
|
/* No idea if this is long enough or too long */
|
||||||
|
int timeout_ms = 1000;
|
||||||
|
|
||||||
/* Dummy read followed by PHY read/write command. */
|
/* Dummy read followed by PHY read/write command. */
|
||||||
ag7xxx_switch_reg_read(bus, 0x98, &data);
|
ret = ag7xxx_switch_reg_read(bus, 0x98, &data);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
data = val | (reg << 16) | (addr << 21) | BIT(30) | BIT(31);
|
data = val | (reg << 16) | (addr << 21) | BIT(30) | BIT(31);
|
||||||
ag7xxx_switch_reg_write(bus, 0x98, data);
|
ret = ag7xxx_switch_reg_write(bus, 0x98, data);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
start = get_timer(0);
|
||||||
|
|
||||||
/* Wait for operation to finish */
|
/* Wait for operation to finish */
|
||||||
do {
|
do {
|
||||||
ag7xxx_switch_reg_read(bus, 0x98, &data);
|
ret = ag7xxx_switch_reg_read(bus, 0x98, &data);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (get_timer(start) > timeout_ms)
|
||||||
|
return -ETIMEDOUT;
|
||||||
} while (data & BIT(31));
|
} while (data & BIT(31));
|
||||||
|
|
||||||
return data & 0xffff;
|
return data & 0xffff;
|
||||||
@ -310,7 +325,11 @@ static int ag7xxx_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
|
|||||||
static int ag7xxx_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
|
static int ag7xxx_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
|
||||||
u16 val)
|
u16 val)
|
||||||
{
|
{
|
||||||
ag7xxx_mdio_rw(bus, addr, reg, val);
|
int ret;
|
||||||
|
|
||||||
|
ret = ag7xxx_mdio_rw(bus, addr, reg, val);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user