mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 05:12:49 +00:00
net: dsa: microchip: ksz8795: add error handling to ksz8_r/w_phy
Now ksz_pread/ksz_pwrite can return error value. So, make use of it. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> Reviewed-by: Vladimir Oltean <olteanv@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9da975e1bb
commit
9590fc4a2a
1 changed files with 81 additions and 21 deletions
|
@ -560,14 +560,24 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
|
|||
u8 val1, val2;
|
||||
u16 data = 0;
|
||||
u8 p = phy;
|
||||
int ret;
|
||||
|
||||
regs = dev->info->regs;
|
||||
|
||||
switch (reg) {
|
||||
case MII_BMCR:
|
||||
ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
|
||||
ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
|
||||
ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
|
||||
ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (restart & PORT_PHY_LOOPBACK)
|
||||
data |= BMCR_LOOPBACK;
|
||||
if (ctrl & PORT_FORCE_100_MBIT)
|
||||
|
@ -597,7 +607,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
|
|||
data |= KSZ886X_BMCR_DISABLE_LED;
|
||||
break;
|
||||
case MII_BMSR:
|
||||
ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
|
||||
ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = BMSR_100FULL |
|
||||
BMSR_100HALF |
|
||||
BMSR_10FULL |
|
||||
|
@ -618,7 +631,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
|
|||
data = KSZ8795_ID_LO;
|
||||
break;
|
||||
case MII_ADVERTISE:
|
||||
ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
|
||||
ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = ADVERTISE_CSMA;
|
||||
if (ctrl & PORT_AUTO_NEG_SYM_PAUSE)
|
||||
data |= ADVERTISE_PAUSE_CAP;
|
||||
|
@ -632,7 +648,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
|
|||
data |= ADVERTISE_10HALF;
|
||||
break;
|
||||
case MII_LPA:
|
||||
ksz_pread8(dev, p, regs[P_REMOTE_STATUS], &link);
|
||||
ret = ksz_pread8(dev, p, regs[P_REMOTE_STATUS], &link);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = LPA_SLCT;
|
||||
if (link & PORT_REMOTE_SYM_PAUSE)
|
||||
data |= LPA_PAUSE_CAP;
|
||||
|
@ -648,8 +667,14 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
|
|||
data |= LPA_LPACK;
|
||||
break;
|
||||
case PHY_REG_LINK_MD:
|
||||
ksz_pread8(dev, p, REG_PORT_LINK_MD_CTRL, &val1);
|
||||
ksz_pread8(dev, p, REG_PORT_LINK_MD_RESULT, &val2);
|
||||
ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_CTRL, &val1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_RESULT, &val2);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val1 & PORT_START_CABLE_DIAG)
|
||||
data |= PHY_START_CABLE_DIAG;
|
||||
|
||||
|
@ -664,7 +689,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
|
|||
FIELD_GET(PORT_CABLE_FAULT_COUNTER_L, val2));
|
||||
break;
|
||||
case PHY_REG_PHY_CTRL:
|
||||
ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
|
||||
ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (link & PORT_MDIX_STATUS)
|
||||
data |= KSZ886X_CTRL_MDIX_STAT;
|
||||
break;
|
||||
|
@ -683,6 +711,7 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
|
|||
u8 restart, speed, ctrl, data;
|
||||
const u16 *regs;
|
||||
u8 p = phy;
|
||||
int ret;
|
||||
|
||||
regs = dev->info->regs;
|
||||
|
||||
|
@ -692,15 +721,26 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
|
|||
/* Do not support PHY reset function. */
|
||||
if (val & BMCR_RESET)
|
||||
break;
|
||||
ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
|
||||
ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = speed;
|
||||
if (val & KSZ886X_BMCR_HP_MDIX)
|
||||
data |= PORT_HP_MDIX;
|
||||
else
|
||||
data &= ~PORT_HP_MDIX;
|
||||
if (data != speed)
|
||||
ksz_pwrite8(dev, p, regs[P_SPEED_STATUS], data);
|
||||
ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
|
||||
|
||||
if (data != speed) {
|
||||
ret = ksz_pwrite8(dev, p, regs[P_SPEED_STATUS], data);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = ctrl;
|
||||
if (ksz_is_ksz88x3(dev)) {
|
||||
if ((val & BMCR_ANENABLE))
|
||||
|
@ -726,9 +766,17 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
|
|||
data |= PORT_FORCE_FULL_DUPLEX;
|
||||
else
|
||||
data &= ~PORT_FORCE_FULL_DUPLEX;
|
||||
if (data != ctrl)
|
||||
ksz_pwrite8(dev, p, regs[P_FORCE_CTRL], data);
|
||||
ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
|
||||
|
||||
if (data != ctrl) {
|
||||
ret = ksz_pwrite8(dev, p, regs[P_FORCE_CTRL], data);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = restart;
|
||||
if (val & KSZ886X_BMCR_DISABLE_LED)
|
||||
data |= PORT_LED_OFF;
|
||||
|
@ -758,11 +806,19 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
|
|||
data |= PORT_PHY_LOOPBACK;
|
||||
else
|
||||
data &= ~PORT_PHY_LOOPBACK;
|
||||
if (data != restart)
|
||||
ksz_pwrite8(dev, p, regs[P_NEG_RESTART_CTRL], data);
|
||||
|
||||
if (data != restart) {
|
||||
ret = ksz_pwrite8(dev, p, regs[P_NEG_RESTART_CTRL],
|
||||
data);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case MII_ADVERTISE:
|
||||
ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
|
||||
ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
data = ctrl;
|
||||
data &= ~(PORT_AUTO_NEG_SYM_PAUSE |
|
||||
PORT_AUTO_NEG_100BTX_FD |
|
||||
|
@ -779,8 +835,12 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
|
|||
data |= PORT_AUTO_NEG_10BT_FD;
|
||||
if (val & ADVERTISE_10HALF)
|
||||
data |= PORT_AUTO_NEG_10BT;
|
||||
if (data != ctrl)
|
||||
ksz_pwrite8(dev, p, regs[P_LOCAL_CTRL], data);
|
||||
|
||||
if (data != ctrl) {
|
||||
ret = ksz_pwrite8(dev, p, regs[P_LOCAL_CTRL], data);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case PHY_REG_LINK_MD:
|
||||
if (val & PHY_START_CABLE_DIAG)
|
||||
|
|
Loading…
Reference in a new issue