aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers/net/ipoib.c
diff options
context:
space:
mode:
authorMichael Brown <mcb30@etherboot.org>2009-11-14 03:40:29 +0000
committerMichael Brown <mcb30@etherboot.org>2009-11-16 22:14:12 +0000
commitbbc530c0dde2385d85631cdc9ac82ebd0bdea763 (patch)
tree5773cce038a53d58c7b3c40f649acd686ff0d1fe /src/drivers/net/ipoib.c
parent228ac9d0184006d22f12d5daecd0a03d81cd029e (diff)
downloadipxe-bbc530c0dde2385d85631cdc9ac82ebd0bdea763.tar.gz
[infiniband] Report IB link status as IPoIB netdevice status
Diffstat (limited to 'src/drivers/net/ipoib.c')
-rw-r--r--src/drivers/net/ipoib.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c
index 260d2d0ee..06e6a2cfe 100644
--- a/src/drivers/net/ipoib.c
+++ b/src/drivers/net/ipoib.c
@@ -24,6 +24,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <string.h>
#include <byteswap.h>
#include <errno.h>
+#include <gpxe/errortab.h>
#include <gpxe/if_arp.h>
#include <gpxe/iobuf.h>
#include <gpxe/netdevice.h>
@@ -75,6 +76,14 @@ static struct ipoib_mac ipoib_broadcast = {
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff },
};
+/** Link status for "broadcast join in progress" */
+#define EINPROGRESS_JOINING ( EINPROGRESS | EUNIQ_01 )
+
+/** Human-readable message for the link status */
+struct errortab ipoib_errors[] __errortab = {
+ { EINPROGRESS_JOINING, "Joining" },
+};
+
/****************************************************************************
*
* IPoIB peer cache
@@ -702,17 +711,15 @@ void ipoib_link_state_changed ( struct ib_device *ibdev ) {
ipoib->broadcast.gid.u.words[2] = htons ( ibdev->pkey );
/* Set net device link state to reflect Infiniband link state */
- if ( ib_link_ok ( ibdev ) ) {
- netdev_link_up ( netdev );
- } else {
- netdev_link_down ( netdev );
- }
+ rc = ib_link_rc ( ibdev );
+ netdev_link_err ( netdev, ( rc ? rc : -EINPROGRESS_JOINING ) );
/* Join new broadcast group */
if ( ib_link_ok ( ibdev ) &&
( ( rc = ipoib_join_broadcast_group ( ipoib ) ) != 0 ) ) {
DBGC ( ipoib, "IPoIB %p could not rejoin broadcast group: "
"%s\n", ipoib, strerror ( rc ) );
+ netdev_link_err ( netdev, rc );
return;
}
}