summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/ipoib.c
diff options
context:
space:
mode:
authorMichael Brown2009-08-06 02:18:38 +0200
committerMichael Brown2009-08-09 00:56:28 +0200
commit34bfc04e4c2ea74a025994fc37c83d640942a651 (patch)
tree959f4815000618ff158ffccf14fcb21c89c70d16 /src/drivers/net/ipoib.c
parent[infiniband] Update subnet management agent to use a management interface (diff)
downloadipxe-34bfc04e4c2ea74a025994fc37c83d640942a651.tar.gz
ipxe-34bfc04e4c2ea74a025994fc37c83d640942a651.tar.xz
ipxe-34bfc04e4c2ea74a025994fc37c83d640942a651.zip
[infiniband] Update all other MAD users to use a management interface
Diffstat (limited to 'src/drivers/net/ipoib.c')
-rw-r--r--src/drivers/net/ipoib.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c
index 9110784c..3f149247 100644
--- a/src/drivers/net/ipoib.c
+++ b/src/drivers/net/ipoib.c
@@ -58,12 +58,14 @@ struct ipoib_device {
struct ib_queue_pair *qp;
/** Broadcast MAC */
struct ipoib_mac broadcast;
- /** Joined to multicast group
+ /** Joined to IPv4 broadcast multicast group
*
* This flag indicates whether or not we have initiated the
- * join to the IPv4 multicast group.
+ * join to the IPv4 broadcast multicast group.
*/
int broadcast_joined;
+ /** IPv4 broadcast multicast group membership */
+ struct ib_mc_membership broadcast_membership;
};
/** Broadcast IPoIB address */
@@ -457,6 +459,26 @@ static void ipoib_irq ( struct net_device *netdev __unused,
}
/**
+ * Handle IPv4 broadcast multicast group join completion
+ *
+ * @v ibdev Infiniband device
+ * @v qp Queue pair
+ * @v membership Multicast group membership
+ * @v rc Status code
+ * @v mad Response MAD (or NULL on error)
+ */
+void ipoib_join_complete ( struct ib_device *ibdev __unused,
+ struct ib_queue_pair *qp __unused,
+ struct ib_mc_membership *membership, int rc,
+ union ib_mad *mad __unused ) {
+ struct ipoib_device *ipoib = container_of ( membership,
+ struct ipoib_device, broadcast_membership );
+
+ /* Record join status as link status */
+ netdev_link_err ( ipoib->netdev, rc );
+}
+
+/**
* Join IPv4 broadcast multicast group
*
* @v ipoib IPoIB device
@@ -466,7 +488,9 @@ static int ipoib_join_broadcast_group ( struct ipoib_device *ipoib ) {
int rc;
if ( ( rc = ib_mcast_join ( ipoib->ibdev, ipoib->qp,
- &ipoib->broadcast.gid ) ) != 0 ) {
+ &ipoib->broadcast_membership,
+ &ipoib->broadcast.gid,
+ ipoib_join_complete ) ) != 0 ) {
DBGC ( ipoib, "IPoIB %p could not join broadcast group: %s\n",
ipoib, strerror ( rc ) );
return rc;
@@ -485,7 +509,7 @@ static void ipoib_leave_broadcast_group ( struct ipoib_device *ipoib ) {
if ( ipoib->broadcast_joined ) {
ib_mcast_leave ( ipoib->ibdev, ipoib->qp,
- &ipoib->broadcast.gid );
+ &ipoib->broadcast_membership );
ipoib->broadcast_joined = 0;
}
}