diff --git a/src/include/ipxe/ib_mi.h b/src/include/ipxe/ib_mi.h index c7c8143b..bd087cd3 100644 --- a/src/include/ipxe/ib_mi.h +++ b/src/include/ipxe/ib_mi.h @@ -127,8 +127,9 @@ ib_create_madx ( struct ib_device *ibdev, struct ib_mad_interface *mi, extern void ib_destroy_madx ( struct ib_device *ibdev, struct ib_mad_interface *mi, struct ib_mad_transaction *madx ); -extern struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev, - enum ib_queue_pair_type type ); +extern int ib_create_mi ( struct ib_device *ibdev, + enum ib_queue_pair_type type, + struct ib_mad_interface **new_mi ); extern void ib_destroy_mi ( struct ib_device *ibdev, struct ib_mad_interface *mi ); diff --git a/src/net/infiniband.c b/src/net/infiniband.c index fa45653e..3b79a660 100644 --- a/src/net/infiniband.c +++ b/src/net/infiniband.c @@ -666,10 +666,9 @@ int ib_open ( struct ib_device *ibdev ) { } /* Create subnet management interface */ - ibdev->smi = ib_create_mi ( ibdev, IB_QPT_SMI ); - if ( ! ibdev->smi ) { - DBGC ( ibdev, "IBDEV %s could not create SMI\n", ibdev->name ); - rc = -ENOMEM; + if ( ( rc = ib_create_mi ( ibdev, IB_QPT_SMI, &ibdev->smi ) ) != 0 ) { + DBGC ( ibdev, "IBDEV %s could not create SMI: %s\n", + ibdev->name, strerror ( rc ) ); goto err_create_smi; } @@ -681,10 +680,9 @@ int ib_open ( struct ib_device *ibdev ) { } /* Create general services interface */ - ibdev->gsi = ib_create_mi ( ibdev, IB_QPT_GSI ); - if ( ! ibdev->gsi ) { - DBGC ( ibdev, "IBDEV %s could not create GSI\n", ibdev->name ); - rc = -ENOMEM; + if ( ( rc = ib_create_mi ( ibdev, IB_QPT_GSI, &ibdev->gsi ) ) != 0 ) { + DBGC ( ibdev, "IBDEV %s could not create GSI: %s\n", + ibdev->name, strerror ( rc ) ); goto err_create_gsi; } diff --git a/src/net/infiniband/ib_mi.c b/src/net/infiniband/ib_mi.c index 149c1e4d..781a3e2e 100644 --- a/src/net/infiniband/ib_mi.c +++ b/src/net/infiniband/ib_mi.c @@ -341,18 +341,21 @@ void ib_destroy_madx ( struct ib_device *ibdev __unused, * * @v ibdev Infiniband device * @v type Queue pair type - * @ret mi Management agent, or NULL + * @v new_mi New management interface to fill in + * @ret rc Return status code */ -struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev, - enum ib_queue_pair_type type ) { +int ib_create_mi ( struct ib_device *ibdev, enum ib_queue_pair_type type, + struct ib_mad_interface **new_mi ) { struct ib_mad_interface *mi; const char *name; int rc; /* Allocate and initialise fields */ mi = zalloc ( sizeof ( *mi ) ); - if ( ! mi ) + if ( ! mi ) { + rc = -ENOMEM; goto err_alloc; + } mi->ibdev = ibdev; INIT_LIST_HEAD ( &mi->madx ); @@ -387,7 +390,8 @@ struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev, /* Fill receive ring */ ib_refill_recv ( ibdev, mi->qp ); - return mi; + *new_mi = mi; + return 0; err_modify_qp: ib_destroy_qp ( ibdev, mi->qp ); @@ -396,7 +400,7 @@ struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev, err_create_cq: free ( mi ); err_alloc: - return NULL; + return rc; } /**