[ifmgmt] Move link-up status messages from autoboot() to iflinkwait()
authorJoshua Oreman <oremanj@rwcr.net>
Fri, 19 Jun 2009 09:08:21 +0000 (02:08 -0700)
committerMichael Brown <mcb30@etherboot.org>
Wed, 24 Jun 2009 12:15:27 +0000 (13:15 +0100)
With the addition of link status codes, we can now display a detailed
error indication if iflinkwait() fails.

Putting the error output in iflinkwait avoids code duplication, and
gains symmetry with the other interface management routines; ifopen()
already prints an error directly if it cannot open its interface.

Modified-by: Michael Brown <mcb30@etherboot.org>
Signed-off-by: Michael Brown <mcb30@etherboot.org>
src/usr/autoboot.c
src/usr/ifmgmt.c

index a99d12b..41b6d3f 100644 (file)
@@ -154,12 +154,8 @@ static int netboot ( struct net_device *netdev ) {
        ifstat ( netdev );
 
        /* Wait for link-up */
-       printf ( "Waiting for link-up on %s...", netdev->name );
-       if ( ( rc = iflinkwait ( netdev, LINK_WAIT_MS ) ) != 0 ) {
-               printf ( " no link detected\n" );
+       if ( ( rc = iflinkwait ( netdev, LINK_WAIT_MS ) ) != 0 )
                return rc;
-       }
-       printf ( " ok\n" );
 
        /* Configure device via DHCP */
        if ( ( rc = dhcp ( netdev ) ) != 0 )
index 2c4b3d2..97cde4a 100644 (file)
@@ -103,25 +103,45 @@ void ifstat ( struct net_device *netdev ) {
 }
 
 /**
- * Wait for link-up
+ * Wait for link-up, with status indication
  *
  * @v netdev           Network device
  * @v max_wait_ms      Maximum time to wait, in ms
  */
 int iflinkwait ( struct net_device *netdev, unsigned int max_wait_ms ) {
        int key;
+       int rc;
+
+       if ( netdev_link_ok ( netdev ) )
+               return 0;
+
+       printf ( "Waiting for link-up on %s...", netdev->name );
 
        while ( 1 ) {
-               if ( netdev_link_ok ( netdev ) )
-                       return 0;
-               if ( max_wait_ms-- == 0 )
-                       return -ETIMEDOUT;
+               if ( netdev_link_ok ( netdev ) ) {
+                       rc = 0;
+                       break;
+               }
+               if ( max_wait_ms-- == 0 ) {
+                       rc = netdev->link_rc;
+                       break;
+               }
                step();
                if ( iskey() ) {
                        key = getchar();
-                       if ( key == CTRL_C )
-                               return -ECANCELED;
+                       if ( key == CTRL_C ) {
+                               rc = -ECANCELED;
+                               break;
+                       }
                }
                mdelay ( 1 );
        }
+
+       if ( rc == 0 ) {
+               printf ( " ok\n" );
+       } else {
+               printf ( " failed: %s\n", strerror ( rc ) );
+       }
+
+       return rc;
 }