summaryrefslogtreecommitdiffstats
path: root/src/net/infiniband.c
diff options
context:
space:
mode:
authorMichael Brown2008-02-27 14:59:56 +0100
committerMichael Brown2008-02-27 14:59:56 +0100
commitbc3f0a25c6e3ce8344fa3c255a8e3a981f59309b (patch)
treedfd6a969a801e98f8ec12f2378fa14ba2b4ed72f /src/net/infiniband.c
parent[Infiniband] Centralise MAD operations (diff)
downloadipxe-bc3f0a25c6e3ce8344fa3c255a8e3a981f59309b.tar.gz
ipxe-bc3f0a25c6e3ce8344fa3c255a8e3a981f59309b.tar.xz
ipxe-bc3f0a25c6e3ce8344fa3c255a8e3a981f59309b.zip
[Infiniband] Add preliminary support for multi-port devices.
Arbel and Hermon cards both have multiple ports. Add the infrastructure required to register each port as a separate IB device. Don't yet register more than one port, since registration will currently fail unless a valid link is detected. Use ib_*_{set,get}_{drv,owner}data wrappers to access driver- and owner-private data on Infiniband structures.
Diffstat (limited to 'src/net/infiniband.c')
-rw-r--r--src/net/infiniband.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/net/infiniband.c b/src/net/infiniband.c
index 2edadc99..39d11285 100644
--- a/src/net/infiniband.c
+++ b/src/net/infiniband.c
@@ -67,7 +67,8 @@ struct ib_completion_queue * ib_create_cq ( struct ib_device *ibdev,
}
DBGC ( ibdev, "IBDEV %p created %d-entry completion queue %p (%p) "
- "with CQN %#lx\n", ibdev, num_cqes, cq, cq->dev_priv, cq->cqn );
+ "with CQN %#lx\n", ibdev, num_cqes, cq,
+ ib_cq_get_drvdata ( cq ), cq->cqn );
return cq;
}
@@ -141,7 +142,7 @@ struct ib_queue_pair * ib_create_qp ( struct ib_device *ibdev,
}
DBGC ( ibdev, "IBDEV %p created queue pair %p (%p) with QPN %#lx\n",
- ibdev, qp, qp->dev_priv, qp->qpn );
+ ibdev, qp, ib_qp_get_drvdata ( qp ), qp->qpn );
DBGC ( ibdev, "IBDEV %p QPN %#lx has %d send entries at [%p,%p)\n",
ibdev, qp->qpn, num_send_wqes, qp->send.iobufs,
qp->recv.iobufs );
@@ -360,17 +361,19 @@ static int ib_get_mad_params ( struct ib_device *ibdev ) {
/**
* Allocate Infiniband device
*
- * @v priv_size Size of private data area
+ * @v priv_size Size of driver private data area
* @ret ibdev Infiniband device, or NULL
*/
struct ib_device * alloc_ibdev ( size_t priv_size ) {
struct ib_device *ibdev;
+ void *drv_priv;
size_t total_len;
total_len = ( sizeof ( *ibdev ) + priv_size );
ibdev = zalloc ( total_len );
if ( ibdev ) {
- ibdev->dev_priv = ( ( ( void * ) ibdev ) + sizeof ( *ibdev ) );
+ drv_priv = ( ( ( void * ) ibdev ) + sizeof ( *ibdev ) );
+ ib_set_drvdata ( ibdev, drv_priv );
}
return ibdev;
}