From c9176878ef9edee1cf5a8a1ca1d9b9afdf2edfcd Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 20 Jun 2016 14:07:41 +0100 Subject: [PATCH] [smsc75xx] Allow up to 100ms for reset to complete Signed-off-by: Michael Brown --- src/drivers/net/smsc75xx.c | 23 ++++++++++++++--------- src/drivers/net/smsc75xx.h | 4 ++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/drivers/net/smsc75xx.c b/src/drivers/net/smsc75xx.c index 9a9634600..4ce98ac80 100644 --- a/src/drivers/net/smsc75xx.c +++ b/src/drivers/net/smsc75xx.c @@ -511,6 +511,7 @@ static int smsc75xx_dump_statistics ( struct smsc75xx_device *smsc75xx ) { */ static int smsc75xx_reset ( struct smsc75xx_device *smsc75xx ) { uint32_t hw_cfg; + unsigned int i; int rc; /* Reset device */ @@ -519,18 +520,22 @@ static int smsc75xx_reset ( struct smsc75xx_device *smsc75xx ) { return rc; /* Wait for reset to complete */ - udelay ( SMSC75XX_RESET_DELAY_US ); + for ( i = 0 ; i < SMSC75XX_RESET_MAX_WAIT_MS ; i++ ) { - /* Check that reset has completed */ - if ( ( rc = smsc75xx_readl ( smsc75xx, SMSC75XX_HW_CFG, - &hw_cfg ) ) != 0 ) - return rc; - if ( hw_cfg & SMSC75XX_HW_CFG_LRST ) { - DBGC ( smsc75xx, "SMSC75XX %p failed to reset\n", smsc75xx ); - return -ETIMEDOUT; + /* Check if reset has completed */ + if ( ( rc = smsc75xx_readl ( smsc75xx, SMSC75XX_HW_CFG, + &hw_cfg ) ) != 0 ) + return rc; + if ( ! ( hw_cfg & SMSC75XX_HW_CFG_LRST ) ) + return 0; + + /* Delay */ + mdelay ( 1 ); } - return 0; + DBGC ( smsc75xx, "SMSC75XX %p timed out waiting for reset\n", + smsc75xx ); + return -ETIMEDOUT; } /****************************************************************************** diff --git a/src/drivers/net/smsc75xx.h b/src/drivers/net/smsc75xx.h index 2463b72a1..ae81fc168 100644 --- a/src/drivers/net/smsc75xx.h +++ b/src/drivers/net/smsc75xx.h @@ -280,8 +280,8 @@ struct smsc75xx_device { uint32_t int_sts; }; -/** Reset delay (in microseconds) */ -#define SMSC75XX_RESET_DELAY_US 2 +/** Maximum time to wait for reset (in milliseconds) */ +#define SMSC75XX_RESET_MAX_WAIT_MS 100 /** Maximum time to wait for EEPROM (in milliseconds) */ #define SMSC75XX_EEPROM_MAX_WAIT_MS 100