]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[smsc75xx] Allow up to 100ms for reset to complete
authorMichael Brown <mcb30@ipxe.org>
Mon, 20 Jun 2016 13:07:41 +0000 (14:07 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 20 Jun 2016 13:26:37 +0000 (14:26 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/smsc75xx.c
src/drivers/net/smsc75xx.h

index 9a96346004ea3794774912864d38ed6551bc7bbd..4ce98ac804e59ae3c4360a9e6536ca6335d3a456 100644 (file)
@@ -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;
 }
 
 /******************************************************************************
index 2463b72a1b0fbd91b4678071ed6bda55b9a101b0..ae81fc168a722ea502a89e29931ee6300193992c 100644 (file)
@@ -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