diff options
author | Eli Cohen <eli@mellanox.co.il> | 2010-10-25 00:08:52 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2010-10-25 13:20:39 -0400 |
commit | fa417f7b520ee60b39f7e23528d2030af30a07d1 (patch) | |
tree | 8eca6ed53c985616e990b57b99a21714ed011534 /drivers/infiniband/hw/mlx4/mad.c | |
parent | 7ac870ed7d2316587ec06747c28cb9f44f67997d (diff) |
IB/mlx4: Add support for IBoE
Add support for IBoE to mlx4_ib. The bulk of the code is handling the
new address vector fields; mlx4 needs the MAC address of a remote node
to include it in a WQE (for datagrams) or in the QP context (for
connected QPs). Address resolution is done by assuming all unicast
GIDs are either link-local IPv6 addresses.
Multicast group attach/detach needs to update the NIC's multicast
filters; but since attaching a QP to a multicast group can be done
before the QP is bound to a port, for IBoE we need to keep track of
all multicast groups that a QP is attached too before it transitions
from INIT to RTR (since it does not have a port in the INIT state).
Signed-off-by: Eli Cohen <eli@mellanox.co.il>
[ Many things cleaned up and otherwise monkeyed with; hope I didn't
introduce too many bugs. - Roland ]
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/mlx4/mad.c')
-rw-r--r-- | drivers/infiniband/hw/mlx4/mad.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index f38d5b118927..c9a8dd63b9e2 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
@@ -311,19 +311,25 @@ int mlx4_ib_mad_init(struct mlx4_ib_dev *dev) | |||
311 | struct ib_mad_agent *agent; | 311 | struct ib_mad_agent *agent; |
312 | int p, q; | 312 | int p, q; |
313 | int ret; | 313 | int ret; |
314 | enum rdma_link_layer ll; | ||
314 | 315 | ||
315 | for (p = 0; p < dev->num_ports; ++p) | 316 | for (p = 0; p < dev->num_ports; ++p) { |
317 | ll = rdma_port_get_link_layer(&dev->ib_dev, p + 1); | ||
316 | for (q = 0; q <= 1; ++q) { | 318 | for (q = 0; q <= 1; ++q) { |
317 | agent = ib_register_mad_agent(&dev->ib_dev, p + 1, | 319 | if (ll == IB_LINK_LAYER_INFINIBAND) { |
318 | q ? IB_QPT_GSI : IB_QPT_SMI, | 320 | agent = ib_register_mad_agent(&dev->ib_dev, p + 1, |
319 | NULL, 0, send_handler, | 321 | q ? IB_QPT_GSI : IB_QPT_SMI, |
320 | NULL, NULL); | 322 | NULL, 0, send_handler, |
321 | if (IS_ERR(agent)) { | 323 | NULL, NULL); |
322 | ret = PTR_ERR(agent); | 324 | if (IS_ERR(agent)) { |
323 | goto err; | 325 | ret = PTR_ERR(agent); |
324 | } | 326 | goto err; |
325 | dev->send_agent[p][q] = agent; | 327 | } |
328 | dev->send_agent[p][q] = agent; | ||
329 | } else | ||
330 | dev->send_agent[p][q] = NULL; | ||
326 | } | 331 | } |
332 | } | ||
327 | 333 | ||
328 | return 0; | 334 | return 0; |
329 | 335 | ||
@@ -344,8 +350,10 @@ void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev) | |||
344 | for (p = 0; p < dev->num_ports; ++p) { | 350 | for (p = 0; p < dev->num_ports; ++p) { |
345 | for (q = 0; q <= 1; ++q) { | 351 | for (q = 0; q <= 1; ++q) { |
346 | agent = dev->send_agent[p][q]; | 352 | agent = dev->send_agent[p][q]; |
347 | dev->send_agent[p][q] = NULL; | 353 | if (agent) { |
348 | ib_unregister_mad_agent(agent); | 354 | dev->send_agent[p][q] = NULL; |
355 | ib_unregister_mad_agent(agent); | ||
356 | } | ||
349 | } | 357 | } |
350 | 358 | ||
351 | if (dev->sm_ah[p]) | 359 | if (dev->sm_ah[p]) |