summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoshua Oreman2009-06-19 11:08:21 +0200
committerMichael Brown2009-06-24 14:15:27 +0200
commit4125216a2f88c1e4c9fd33931d1249b8afc2f923 (patch)
treead9d8013d96ed1f55549fb044d59410e086ab53b
parent[netdevice] Add mechanism for reporting detailed link status codes (diff)
downloadipxe-4125216a2f88c1e4c9fd33931d1249b8afc2f923.tar.gz
ipxe-4125216a2f88c1e4c9fd33931d1249b8afc2f923.tar.xz
ipxe-4125216a2f88c1e4c9fd33931d1249b8afc2f923.zip
[ifmgmt] Move link-up status messages from autoboot() to iflinkwait()
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>
-rw-r--r--src/usr/autoboot.c6
-rw-r--r--src/usr/ifmgmt.c34
2 files changed, 28 insertions, 12 deletions
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c
index a99d12b1..41b6d3f4 100644
--- a/src/usr/autoboot.c
+++ b/src/usr/autoboot.c
@@ -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 )
diff --git a/src/usr/ifmgmt.c b/src/usr/ifmgmt.c
index 2c4b3d24..97cde4a0 100644
--- a/src/usr/ifmgmt.c
+++ b/src/usr/ifmgmt.c
@@ -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;
}