[ifmgmt] Move link-up status messages from autoboot() to iflinkwait()
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 09:08:21 +0000 (02:08 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 09:33:23 +0000 (02:33 -0700)
With the addition of link-up error possibilities, it is important
that all calls to iflinkwait() (there are currently two) show an
error indication if one exists, since the user has no other
means of seeing what an error occurred.

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.

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 9c82503..e90f8dc 100644 (file)
@@ -99,25 +99,50 @@ 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 key, 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 ( netdev->link_rc != 0 ) {
+                       rc = netdev->link_rc;
+                       break;
+               }
+               if ( max_wait_ms-- == 0 ) {
+                       rc = -ETIMEDOUT;
+                       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 if ( netdev->link_rc ) {
+               printf ( " error: %s\n", strerror ( netdev->link_rc ) );
+       } else {
+               printf ( " no link detected\n" );
+       }
+
+       return rc;
 }