[PATCH 1/2] net: phy: micrel_ksz90x1: disable asymmetric pause for KSZ9031
Max Merchel
max.merchel at ew.tq-group.com
Tue Dec 2 08:51:48 CET 2025
Am 24.11.25 um 17:31 schrieb Quentin Schulz:
> Hi Max, Markus,
>
> On 11/21/25 9:18 AM, Max Merchel wrote:
>> From: Markus Niebel <Markus.Niebel at ew.tq-group.com>
>>
>> Disable the support due to chip errata and call genphy_config_aneg
>> instead of genphy_config. For a complete describtion look at the
>> errata sheets: DS80000691D or DS80000692D.
>>
>
> Linux counterpart seems to be 3aed3e2a143c ("net: phy: micrel: add Asym
> Pause workaround"). It does seem to set an additional bit
> (ADVERTISE_PAUSE_CAP in U-Boot) but the explanation doesn't seem to
> apply to U-Boot.
I checked ADVERTISE_PAUSE_CAP in the code and ran tests on TQMa6-MBa6.
Setting ADVERTISE_PAUSE_CAP isn't necessary for the workaround.
>
> Though another interesting commit is in the Linux tree as well,
> 407d8098cb1a ("net: phy: micrel: add Asym Pause workaround for
> KSZ9021"). I assume we need a similar fix in ksz9021_config()?
I will integrate the workaround for KSZ9021 into the commit in V2 and
add references to both Linux commits.
>> Signed-off-by: Markus Niebel <Markus.Niebel at ew.tq-group.com>
>> Signed-off-by: Max Merchel <Max.Merchel at ew.tq-group.com>
>> ---
>> drivers/net/phy/micrel_ksz90x1.c | 18 +++++++++++++++++-
>> 1 file changed, 17 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/phy/micrel_ksz90x1.c b/drivers/net/phy/
>> micrel_ksz90x1.c
>> index a02dbe900b8..bc42506c65e 100644
>> --- a/drivers/net/phy/micrel_ksz90x1.c
>> +++ b/drivers/net/phy/micrel_ksz90x1.c
>> @@ -336,6 +336,7 @@ static int ksz9031_phy_extwrite(struct phy_device
>> *phydev, int addr,
>> static int ksz9031_config(struct phy_device *phydev)
>> {
>> + unsigned int features = phydev->drv->features;
>
> It's a u32 member, so we can simply use a u32 for the local variable.
I've changed it in V2.
>
> This will be overshadowed by unsigned features in the if block, just
> remove the overshadowing variable and features = phydev->drv->features;
> in the if block since you'll already have set it.
>
>> int ret;
>> ret = ksz9031_of_config(phydev);
>> @@ -371,7 +372,22 @@ static int ksz9031_config(struct phy_device *phydev)
>> return 0;
>> }
>> - return genphy_config(phydev);
>> + /* Silicon Errata Sheet (DS80000691D or DS80000692D):
>> + * Whenever the device's Asymmetric Pause capability is set to 1,
>> + * link-up may fail after a link-up to link-down transition.
>> + *
>> + * Workaround:
>> + * Do not enable the Asymmetric Pause capability bit.
>> + */
>> + features &= ~ADVERTISE_PAUSE_ASYM;
>> + /* update feature support and forward to advertised features */
>> + phydev->supported = features;
>> + phydev->advertising = phydev->supported;
>> +
>> + /* genphy_restart_aneg called from genphy_config_aneg */
>> + return genphy_config_aneg(phydev);
>> +
>> + return 0;
>
> Don't need the return 0 here as it won't be reached.
I remove it.>
> Is this errata only applicable if 1000BASE-T is supported? I couldn't
> find that in the doc but maybe I misread. In which case, we need the
> exact same logic in the if (env_get("disable_giga")) section I think?
I checked. It doesn't only apply to 1000BASE-T.
To use the workaround for KSZ9021 as well, it's implemented as a
function and called before `if (env_get("disable_giga"))` for KSZ9031.
>
> Cheers,
> Quentin
I send V2
--
Best regards,
Max
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/
More information about the U-Boot
mailing list