aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx4
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/mlx4')
-rw-r--r--drivers/infiniband/hw/mlx4/main.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index 62e8cd6f0371..ac6951d99336 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -272,14 +272,32 @@ out:
272static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask, 272static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask,
273 struct ib_device_modify *props) 273 struct ib_device_modify *props)
274{ 274{
275 struct mlx4_cmd_mailbox *mailbox;
276
275 if (mask & ~IB_DEVICE_MODIFY_NODE_DESC) 277 if (mask & ~IB_DEVICE_MODIFY_NODE_DESC)
276 return -EOPNOTSUPP; 278 return -EOPNOTSUPP;
277 279
278 if (mask & IB_DEVICE_MODIFY_NODE_DESC) { 280 if (!(mask & IB_DEVICE_MODIFY_NODE_DESC))
279 spin_lock(&to_mdev(ibdev)->sm_lock); 281 return 0;
280 memcpy(ibdev->node_desc, props->node_desc, 64); 282
281 spin_unlock(&to_mdev(ibdev)->sm_lock); 283 spin_lock(&to_mdev(ibdev)->sm_lock);
282 } 284 memcpy(ibdev->node_desc, props->node_desc, 64);
285 spin_unlock(&to_mdev(ibdev)->sm_lock);
286
287 /*
288 * If possible, pass node desc to FW, so it can generate
289 * a 144 trap. If cmd fails, just ignore.
290 */
291 mailbox = mlx4_alloc_cmd_mailbox(to_mdev(ibdev)->dev);
292 if (IS_ERR(mailbox))
293 return 0;
294
295 memset(mailbox->buf, 0, 256);
296 memcpy(mailbox->buf, props->node_desc, 64);
297 mlx4_cmd(to_mdev(ibdev)->dev, mailbox->dma, 1, 0,
298 MLX4_CMD_SET_NODE, MLX4_CMD_TIME_CLASS_A);
299
300 mlx4_free_cmd_mailbox(to_mdev(ibdev)->dev, mailbox);
283 301
284 return 0; 302 return 0;
285} 303}