[OpenWrt-Devel] [PATCH 1/3] ag71xx: replace fixed PHY reset wait time in ar7240sw_setup

John Crispin blogic at openwrt.org
Fri Dec 5 03:55:57 EST 2014


Hi,

just added this to my local tree, images are building, the ar71xx
network stuff scares me and i want to test this for a few b

On 05/12/2014 07:36, Heiner Kallweit wrote:
> Replace the fixed wait time of 1s with polling for BMCR_RESET
> to be cleared on all PHYs.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
> ---
>  .../net/ethernet/atheros/ag71xx/ag71xx_ar7240.c    | 29 +++++++++++++++++++++-
>  1 file changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_ar7240.c b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_ar7240.c
> index d4ccc02..0a6d0ca 100644
> --- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_ar7240.c
> +++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_ar7240.c
> @@ -618,6 +618,31 @@ static void ar7240sw_setup(struct ar7240sw *as)
>  	ar7240sw_reg_rmw(mii, AR7240_REG_SERVICE_TAG, AR7240_SERVICE_TAG_M, 0);
>  }
>  
> +/* inspired by phy_poll_reset in drivers/net/phy/phy_device.c */
> +static int
> +ar7240sw_phy_poll_reset(struct mii_bus *bus)
> +{
> +	const unsigned int sleep_msecs = 20;
> +	int ret, elapsed, i;
> +
> +	for (elapsed = sleep_msecs; elapsed <= 600;
> +	     elapsed += sleep_msecs) {
> +		msleep(sleep_msecs);
> +		for (i = 0; i < AR7240_NUM_PHYS; i++) {
> +			ret = ar7240sw_phy_read(bus, i, MII_BMCR);
> +			if (ret < 0)
> +				return ret;
> +			if (ret & BMCR_RESET)
> +				break;
> +			if (i == AR7240_NUM_PHYS - 1) {
> +				usleep_range(1000, 2000);
> +				return 0;
> +			}
> +		}
> +	}
> +	return -ETIMEDOUT;
> +}
> +
>  static int ar7240sw_reset(struct ar7240sw *as)
>  {
>  	struct mii_bus *mii = as->mii_bus;
> @@ -646,7 +671,9 @@ static int ar7240sw_reset(struct ar7240sw *as)
>  		ar7240sw_phy_write(mii, i, MII_BMCR,
>  				   BMCR_RESET | BMCR_ANENABLE);
>  	}
> -	msleep(1000);
> +	ret = ar7240sw_phy_poll_reset(mii);
> +	if (ret)
> +		return ret;
>  
>  	ar7240sw_setup(as);
>  	return ret;
> 
_______________________________________________
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