From 34bfc04e4c2ea74a025994fc37c83d640942a651 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 6 Aug 2009 01:18:38 +0100 Subject: [infiniband] Update all other MAD users to use a management interface --- src/drivers/net/ipoib.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'src/drivers') diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c index 9110784c0..3f1492471 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 */ @@ -456,6 +458,26 @@ static void ipoib_irq ( struct net_device *netdev __unused, /* No implementation */ } +/** + * 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 * @@ -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; } } -- cgit v1.2.3-55-g7522