diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx4/mad.c')
-rw-r--r-- | drivers/infiniband/hw/mlx4/mad.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index f38d5b118927..57ffa50f509e 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
@@ -211,6 +211,8 @@ static void forward_trap(struct mlx4_ib_dev *dev, u8 port_num, struct ib_mad *ma | |||
211 | if (agent) { | 211 | if (agent) { |
212 | send_buf = ib_create_send_mad(agent, qpn, 0, 0, IB_MGMT_MAD_HDR, | 212 | send_buf = ib_create_send_mad(agent, qpn, 0, 0, IB_MGMT_MAD_HDR, |
213 | IB_MGMT_MAD_DATA, GFP_ATOMIC); | 213 | IB_MGMT_MAD_DATA, GFP_ATOMIC); |
214 | if (IS_ERR(send_buf)) | ||
215 | return; | ||
214 | /* | 216 | /* |
215 | * We rely here on the fact that MLX QPs don't use the | 217 | * We rely here on the fact that MLX QPs don't use the |
216 | * address handle after the send is posted (this is | 218 | * address handle after the send is posted (this is |
@@ -311,19 +313,25 @@ int mlx4_ib_mad_init(struct mlx4_ib_dev *dev) | |||
311 | struct ib_mad_agent *agent; | 313 | struct ib_mad_agent *agent; |
312 | int p, q; | 314 | int p, q; |
313 | int ret; | 315 | int ret; |
316 | enum rdma_link_layer ll; | ||
314 | 317 | ||
315 | for (p = 0; p < dev->num_ports; ++p) | 318 | for (p = 0; p < dev->num_ports; ++p) { |
319 | ll = rdma_port_get_link_layer(&dev->ib_dev, p + 1); | ||
316 | for (q = 0; q <= 1; ++q) { | 320 | for (q = 0; q <= 1; ++q) { |
317 | agent = ib_register_mad_agent(&dev->ib_dev, p + 1, | 321 | if (ll == IB_LINK_LAYER_INFINIBAND) { |
318 | q ? IB_QPT_GSI : IB_QPT_SMI, | 322 | agent = ib_register_mad_agent(&dev->ib_dev, p + 1, |
319 | NULL, 0, send_handler, | 323 | q ? IB_QPT_GSI : IB_QPT_SMI, |
320 | NULL, NULL); | 324 | NULL, 0, send_handler, |
321 | if (IS_ERR(agent)) { | 325 | NULL, NULL); |
322 | ret = PTR_ERR(agent); | 326 | if (IS_ERR(agent)) { |
323 | goto err; | 327 | ret = PTR_ERR(agent); |
324 | } | 328 | goto err; |
325 | dev->send_agent[p][q] = agent; | 329 | } |
330 | dev->send_agent[p][q] = agent; | ||
331 | } else | ||
332 | dev->send_agent[p][q] = NULL; | ||
326 | } | 333 | } |
334 | } | ||
327 | 335 | ||
328 | return 0; | 336 | return 0; |
329 | 337 | ||
@@ -344,8 +352,10 @@ void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev) | |||
344 | for (p = 0; p < dev->num_ports; ++p) { | 352 | for (p = 0; p < dev->num_ports; ++p) { |
345 | for (q = 0; q <= 1; ++q) { | 353 | for (q = 0; q <= 1; ++q) { |
346 | agent = dev->send_agent[p][q]; | 354 | agent = dev->send_agent[p][q]; |
347 | dev->send_agent[p][q] = NULL; | 355 | if (agent) { |
348 | ib_unregister_mad_agent(agent); | 356 | dev->send_agent[p][q] = NULL; |
357 | ib_unregister_mad_agent(agent); | ||
358 | } | ||
349 | } | 359 | } |
350 | 360 | ||
351 | if (dev->sm_ah[p]) | 361 | if (dev->sm_ah[p]) |