[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