summaryrefslogtreecommitdiffstats
path: root/src/drivers
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
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')
-rw-r--r--src/drivers/infiniband/arbel.c4
-rw-r--r--src/drivers/infiniband/hermon.c4
-rw-r--r--src/drivers/net/ipoib.c12
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 */