[OpenWrt-Devel] [PATCH] ar8216: fix issue with ANEG being disabled with kernel >=3.14

Felix Fietkau nbd at openwrt.org
Thu Nov 13 16:18:52 EST 2014


On 2014-11-13 22:00, Heiner Kallweit wrote:
> See also ticket 17800
> With kernel>=3.14 autonegotiation is disabled at least for AR8327 based
> switches. Reason is that with 3.14 an additional phy reset was
> introduced in phy_init_hw in drivers/net/phy/phy_device.c
> This reset clears BMCR_ANENABLE.
> After the reset phy_init_hw calls the driver's config_init callback
> which however for ar8327/8337 does nothing.
> Fix the issue by extending ar8xxx_phy_config_init to check for
> BMCR_ANENABLE being set in case of ar8327/ar8337.
> If needed set the flag and restart autonegotiation.
> 
> For kernel>=3.16 the phy reset in phy_init_hw can be overwritten by
> a soft_reset callback provided by the phy driver.
> ar8216 driver takes care of resetting the switch properly for all
> supported switch types anyway, therefore provide a dummy soft_reset
> callback to disable the unneeded additional phy reset.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
> ---
>  .../linux/generic/files/drivers/net/phy/ar8216.c   | 34 ++++++++++++++++++++--
>  1 file changed, 32 insertions(+), 2 deletions(-)
> 
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c
> index 4410fbb..03de384 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8216.c
> +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
> @@ -36,6 +36,7 @@
>  #include <linux/of_device.h>
>  #include <linux/leds.h>
>  #include <linux/gpio.h>
> +#include <linux/version.h>
>  
>  #include "ar8216.h"
>  
> @@ -2765,8 +2766,24 @@ ar8xxx_phy_config_init(struct phy_device *phydev)
>  	if (WARN_ON(!priv))
>  		return -ENODEV;
>  
> -	if (chip_is_ar8327(priv) || chip_is_ar8337(priv))
> -		return 0;
> +	if (chip_is_ar8327(priv) || chip_is_ar8337(priv)) {
> +		if (AUTONEG_ENABLE != phydev->autoneg)
Why the yoda condition?

> +			return 0;
> +		/*
> +		 * BMCR_ANENABLE might have been cleared
> +		 * by phy_init_hw in certain kernel versions
> +		 * therefore check for it
> +		 */
> +		ret = phy_read(phydev, MII_BMCR);
> +		if (ret < 0)
> +			return ret;
> +		if (ret & BMCR_ANENABLE)
> +			return 0;
> +
> +		dev_info(&phydev->dev, "ANEG disabled, re-enabling ..\n");
> +		ret |= BMCR_ANENABLE | BMCR_ANRESTART;
> +		return phy_write(phydev, MII_BMCR, ret);
Are you sure that this is only needed on AR8327/AR8337?

- Felix
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list