summaryrefslogtreecommitdiffstats
path: root/src/drivers/net
diff options
context:
space:
mode:
authorMichael Brown2016-06-20 15:07:41 +0200
committerMichael Brown2016-06-20 15:26:37 +0200
commitc9176878ef9edee1cf5a8a1ca1d9b9afdf2edfcd (patch)
tree0ce6f8ee06710c6b39fc04c8ab66bb979d2d29ce /src/drivers/net
parent[virtio] Fix virtio-pci logging (diff)
downloadipxe-c9176878ef9edee1cf5a8a1ca1d9b9afdf2edfcd.tar.gz
ipxe-c9176878ef9edee1cf5a8a1ca1d9b9afdf2edfcd.tar.xz
ipxe-c9176878ef9edee1cf5a8a1ca1d9b9afdf2edfcd.zip
[smsc75xx] Allow up to 100ms for reset to complete
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net')
-rw-r--r--src/drivers/net/smsc75xx.c23
-rw-r--r--src/drivers/net/smsc75xx.h4
2 files changed, 16 insertions, 11 deletions
diff --git a/src/drivers/net/smsc75xx.c b/src/drivers/net/smsc75xx.c
index 9a963460..4ce98ac8 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 2463b72a..ae81fc16 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