Messages in this thread Patch in this message | | | Date | Wed, 6 Oct 2021 11:39:55 +0200 | From | Francesco Dolcini <> | Subject | Re: [PATCH] net: phy: micrel: ksz9131 led errata workaround |
| |
Hello, the link to the errata in the commit message is wrong, the correct one is https://ww1.microchip.com/downloads/en/DeviceDoc/KSZ9131RNX-Silicon-Errata-and-Data-Sheet-Clarification-80000863B.pdf, I will fix it in the next patch version.
Francesco
On Wed, Oct 06, 2021 at 09:37:55AM +0200, Francesco Dolcini wrote: > Micrel KSZ9131 PHY LED behavior is not correct when configured in > Individual Mode, LED1 (Activity LED) is in the ON state when there is > no-link. > > Workaround this by setting bit 9 of register 0x1e after verifying that > the LED configuration is Individual Mode. > > This issue is described in KSZ9131RNX Silicon Errata DS80000693B > (http://ww1.microchip.com/downloads/en/DeviceDoc/80000863A.pdf) and > according to that it will not be corrected in a future silicon revision. > > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> > --- > drivers/net/phy/micrel.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c > index c330a5a9f665..661dedec84c4 100644 > --- a/drivers/net/phy/micrel.c > +++ b/drivers/net/phy/micrel.c > @@ -1003,6 +1003,23 @@ static int ksz9131_config_rgmii_delay(struct phy_device *phydev) > txcdll_val); > } > > +/* Silicon Errata DS80000693B > + * > + * When LEDs are configured in Individual Mode, LED1 is ON in a no-link > + * condition. Workaround is to set register 0x1e, bit 9, this way LED1 behaves > + * according to the datasheet (off if there is no link). > + */ > + > +static int ksz9131_led_errata(struct phy_device *phydev) > +{ > + int ret = 0; > + > + if (phy_read_mmd(phydev, 2, 0) & BIT(4)) > + ret = phy_set_bits(phydev, 0x1e, BIT(9)); > + > + return ret; > +} > + > static int ksz9131_config_init(struct phy_device *phydev) > { > struct device_node *of_node; > @@ -1058,6 +1075,10 @@ static int ksz9131_config_init(struct phy_device *phydev) > if (ret < 0) > return ret; > > + ret = ksz9131_led_errata(phydev); > + if (ret < 0) > + return ret; > + > return 0; > } > > -- > 2.25.1 >
| |