diff options
| author | Michael Brown | 2009-01-02 22:04:31 +0100 |
|---|---|---|
| committer | Michael Brown | 2009-01-02 22:04:31 +0100 |
| commit | 53a7dd26cd0aff8409e16c6cc1c7423d4a551f4b (patch) | |
| tree | 84a376781898482a5b6dba32d4134d7769f020b4 /src/drivers | |
| parent | [pcbios] Add additional sanity check for bogus e820 map (diff) | |
| download | ipxe-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')
| -rw-r--r-- | src/drivers/infiniband/arbel.c | 4 | ||||
| -rw-r--r-- | src/drivers/infiniband/hermon.c | 4 | ||||
| -rw-r--r-- | src/drivers/net/ipoib.c | 12 |
3 files changed, 20 insertions, 0 deletions
diff --git a/src/drivers/infiniband/arbel.c b/src/drivers/infiniband/arbel.c index e9bc260ec..1756a6e2d 100644 --- a/src/drivers/infiniband/arbel.c +++ b/src/drivers/infiniband/arbel.c @@ -2175,6 +2175,10 @@ static int arbel_probe ( struct pci_device *pci, if ( ( rc = arbel_create_eq ( arbel ) ) != 0 ) goto err_create_eq; + /* Update MAD parameters */ + for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ ) + ib_smc_update ( arbel->ibdev[i], arbel_mad ); + /* Register Infiniband devices */ for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ ) { if ( ( rc = register_ibdev ( arbel->ibdev[i] ) ) != 0 ) { diff --git a/src/drivers/infiniband/hermon.c b/src/drivers/infiniband/hermon.c index f598a31f0..40add28a2 100644 --- a/src/drivers/infiniband/hermon.c +++ b/src/drivers/infiniband/hermon.c @@ -2244,6 +2244,10 @@ static int hermon_probe ( struct pci_device *pci, if ( ( rc = hermon_create_eq ( hermon ) ) != 0 ) goto err_create_eq; + /* Update MAD parameters */ + for ( i = 0 ; i < HERMON_NUM_PORTS ; i++ ) + ib_smc_update ( hermon->ibdev[i], hermon_mad ); + /* Register Infiniband devices */ for ( i = 0 ; i < HERMON_NUM_PORTS ; i++ ) { if ( ( rc = register_ibdev ( hermon->ibdev[i] ) ) != 0 ) { 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 */ |
