[U-Boot] [PATCH 1/2] drivers/net/at91_emac.c: increase timeout for autonegotiation

Reinhard Meyer u-boot at emk-elektronik.de
Thu Oct 7 10:12:12 CEST 2010


Dear Andreas Bießmann,
> This patch increases timeout for autonegotiation from 1 second to 3 seconds.
> Some boards (e.g. at91rm9200ek) did not negotiate within 1 second.

> @@ -220,7 +220,7 @@ static int at91emac_phy_reset(struct eth_device *netdev)
>  	at91emac_write(emac, CONFIG_DRIVER_AT91EMAC_PHYADDR, MII_BMCR,
>  		(BMCR_ANENABLE | BMCR_ANRESTART));
>  
> -	for (i = 0; i < 100000 / 100; i++) {
> +	for (i = 0; i < 30000; i++) {
>  		at91emac_read(emac, CONFIG_DRIVER_AT91EMAC_PHYADDR,
>  			MII_BMSR, &status);
>  		if (status & BMSR_ANEGCOMPLETE)

You might want to change the timeout to use the timer like here,
otherwise such looped timeouts are subject to toolchain version
and cache and optimisation and cpu clock and whatever ;)

/*
 * Wait for the XTAL oscillator to become ready
 */
static int enc_clock_wait(enc_dev_t *enc)
{
	uint64_t etime;

	/* one second timeout */
	etime = get_ticks() + get_tbclk();

	/*
	 * Wait for CLKRDY to become set (i.e., check that we can
	 * communicate with the ENC)
	 */
	do
	{
		if (enc_r8(enc, CTL_REG_ESTAT) & ENC_ESTAT_CLKRDY)
			return 0;
	} while (get_ticks() <= etime);

	printf("%s: timeout waiting for CLKRDY\n", enc->dev->name);
	return -1;
}

Reinhard



More information about the U-Boot mailing list