diff options
author | Michael Brown | 2008-04-22 18:40:50 +0200 |
---|---|---|
committer | Michael Brown | 2008-04-22 18:40:50 +0200 |
commit | 1ba959c6b342b314dfb01ca0a926ed6832c090b3 (patch) | |
tree | d977e301ebfe46d76f9def376e9edb173b96eb26 /src/drivers/net/ipoib.c | |
parent | [Infiniband] Fix event queue doorbell ringing on Arbel (diff) | |
download | ipxe-1ba959c6b342b314dfb01ca0a926ed6832c090b3.tar.gz ipxe-1ba959c6b342b314dfb01ca0a926ed6832c090b3.tar.xz ipxe-1ba959c6b342b314dfb01ca0a926ed6832c090b3.zip |
[NETDEV] Add notion of link state
Add ability for network devices to flag link up/down state to the
networking core.
Autobooting code will now wait for link-up before attempting DHCP.
IPoIB reflects the Infiniband link state as the network device link state
(which is not strictly correct; we also need a succesful IPoIB IPv4
broadcast group join), but is probably more informative.
Diffstat (limited to 'src/drivers/net/ipoib.c')
-rw-r--r-- | src/drivers/net/ipoib.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c index 3b915bf0..e3baa14f 100644 --- a/src/drivers/net/ipoib.c +++ b/src/drivers/net/ipoib.c @@ -471,6 +471,12 @@ static int ipoib_transmit ( struct net_device *netdev, } iob_pull ( iobuf, ( sizeof ( *ipoib_pshdr ) ) ); + /* Attempting transmission while link is down will put the + * queue pair into an error state, so don't try it. + */ + if ( ! ibdev->link_up ) + return -ENETUNREACH; + /* Construct address vector */ memset ( &av, 0, sizeof ( av ) ); av.qkey = IB_GLOBAL_QKEY; @@ -790,6 +796,10 @@ static int ipoib_join_broadcast_group ( struct ipoib_device *ipoib ) { return rc; } + /* We will set link up on the network device when we receive + * the broadcast join response. + */ + return 0; } @@ -907,16 +917,24 @@ static struct net_device_operations ipoib_operations = { */ static void ipoib_set_ib_params ( struct ipoib_device *ipoib ) { struct ib_device *ibdev = ipoib->ibdev; + struct net_device *netdev = ipoib->netdev; struct ipoib_mac *mac; /* Calculate GID portion of MAC address based on port GID */ - mac = ( ( struct ipoib_mac * ) ipoib->netdev->ll_addr ); + mac = ( ( struct ipoib_mac * ) netdev->ll_addr ); memcpy ( &mac->gid, &ibdev->port_gid, sizeof ( mac->gid ) ); /* Calculate broadcast GID based on partition key */ memcpy ( &ipoib->broadcast_gid, &ipv4_broadcast_gid, sizeof ( ipoib->broadcast_gid ) ); ipoib->broadcast_gid.u.words[2] = htons ( ibdev->pkey ); + + /* Set net device link state to reflect Infiniband link state */ + if ( ibdev->link_up ) { + netdev_link_up ( netdev ); + } else { + netdev_link_down ( netdev ); + } } /** |