summaryrefslogtreecommitdiffstats
path: root/src/drivers/net
diff options
context:
space:
mode:
authorMichael Brown2009-01-02 22:04:31 +0100
committerMichael Brown2009-01-02 22:04:31 +0100
commit53a7dd26cd0aff8409e16c6cc1c7423d4a551f4b (patch)
tree84a376781898482a5b6dba32d4134d7769f020b4 /src/drivers/net
parent[pcbios] Add additional sanity check for bogus e820 map (diff)
downloadipxe-53a7dd26cd0aff8409e16c6cc1c7423d4a551f4b.tar.gz
ipxe-53a7dd26cd0aff8409e16c6cc1c7423d4a551f4b.tar.xz
ipxe-53a7dd26cd0aff8409e16c6cc1c7423d4a551f4b.zip
[infiniband] Call ib_open() only when opening the IPoIB net device
Defer the call to ib_open() until we want to actually open the device, rather than when the device is registered.
Diffstat (limited to 'src/drivers/net')
-rw-r--r--src/drivers/net/ipoib.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c
index 3a78dcef4..8ad2c29fa 100644
--- a/src/drivers/net/ipoib.c
+++ b/src/drivers/net/ipoib.c
@@ -926,6 +926,13 @@ static int ipoib_open ( struct net_device *netdev ) {
struct ipoib_mac *mac = ( ( struct ipoib_mac * ) netdev->ll_addr );
int rc;
+ /* Open IB device */
+ if ( ( rc = ib_open ( ipoib->ibdev ) ) != 0 ) {
+ DBGC ( ipoib, "IPoIB %p could not open device: %s\n",
+ ipoib, strerror ( rc ) );
+ goto err_ib_open;
+ }
+
/* Allocate metadata queue set */
if ( ( rc = ipoib_create_qset ( ipoib, &ipoib->meta,
IPOIB_META_NUM_CQES,
@@ -971,6 +978,8 @@ static int ipoib_open ( struct net_device *netdev ) {
err_create_data_qset:
ipoib_destroy_qset ( ipoib, &ipoib->meta );
err_create_meta_qset:
+ ib_close ( ipoib->ibdev );
+ err_ib_open:
return rc;
}
@@ -992,6 +1001,9 @@ static void ipoib_close ( struct net_device *netdev ) {
/* Tear down the queues */
ipoib_destroy_qset ( ipoib, &ipoib->data );
ipoib_destroy_qset ( ipoib, &ipoib->meta );
+
+ /* Close IB device */
+ ib_close ( ipoib->ibdev );
}
/** IPoIB network device operations */