diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx4/main.c')
-rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 5266b49c46ee..4f230c26622d 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
@@ -898,7 +898,6 @@ static void update_gids_task(struct work_struct *work) | |||
898 | union ib_gid *gids; | 898 | union ib_gid *gids; |
899 | int err; | 899 | int err; |
900 | struct mlx4_dev *dev = gw->dev->dev; | 900 | struct mlx4_dev *dev = gw->dev->dev; |
901 | struct ib_event event; | ||
902 | 901 | ||
903 | mailbox = mlx4_alloc_cmd_mailbox(dev); | 902 | mailbox = mlx4_alloc_cmd_mailbox(dev); |
904 | if (IS_ERR(mailbox)) { | 903 | if (IS_ERR(mailbox)) { |
@@ -916,10 +915,7 @@ static void update_gids_task(struct work_struct *work) | |||
916 | pr_warn("set port command failed\n"); | 915 | pr_warn("set port command failed\n"); |
917 | else { | 916 | else { |
918 | memcpy(gw->dev->iboe.gid_table[gw->port - 1], gw->gids, sizeof gw->gids); | 917 | memcpy(gw->dev->iboe.gid_table[gw->port - 1], gw->gids, sizeof gw->gids); |
919 | event.device = &gw->dev->ib_dev; | 918 | mlx4_ib_dispatch_event(gw->dev, gw->port, IB_EVENT_GID_CHANGE); |
920 | event.element.port_num = gw->port; | ||
921 | event.event = IB_EVENT_GID_CHANGE; | ||
922 | ib_dispatch_event(&event); | ||
923 | } | 919 | } |
924 | 920 | ||
925 | mlx4_free_cmd_mailbox(dev, mailbox); | 921 | mlx4_free_cmd_mailbox(dev, mailbox); |
@@ -1383,10 +1379,18 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr) | |||
1383 | } | 1379 | } |
1384 | 1380 | ||
1385 | static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr, | 1381 | static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr, |
1386 | enum mlx4_dev_event event, int port) | 1382 | enum mlx4_dev_event event, unsigned long param) |
1387 | { | 1383 | { |
1388 | struct ib_event ibev; | 1384 | struct ib_event ibev; |
1389 | struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr); | 1385 | struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr); |
1386 | struct mlx4_eqe *eqe = NULL; | ||
1387 | struct ib_event_work *ew; | ||
1388 | int port = 0; | ||
1389 | |||
1390 | if (event == MLX4_DEV_EVENT_PORT_MGMT_CHANGE) | ||
1391 | eqe = (struct mlx4_eqe *)param; | ||
1392 | else | ||
1393 | port = (u8)param; | ||
1390 | 1394 | ||
1391 | if (port > ibdev->num_ports) | 1395 | if (port > ibdev->num_ports) |
1392 | return; | 1396 | return; |
@@ -1405,6 +1409,19 @@ static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr, | |||
1405 | ibev.event = IB_EVENT_DEVICE_FATAL; | 1409 | ibev.event = IB_EVENT_DEVICE_FATAL; |
1406 | break; | 1410 | break; |
1407 | 1411 | ||
1412 | case MLX4_DEV_EVENT_PORT_MGMT_CHANGE: | ||
1413 | ew = kmalloc(sizeof *ew, GFP_ATOMIC); | ||
1414 | if (!ew) { | ||
1415 | pr_err("failed to allocate memory for events work\n"); | ||
1416 | break; | ||
1417 | } | ||
1418 | |||
1419 | INIT_WORK(&ew->work, handle_port_mgmt_change_event); | ||
1420 | memcpy(&ew->ib_eqe, eqe, sizeof *eqe); | ||
1421 | ew->ib_dev = ibdev; | ||
1422 | handle_port_mgmt_change_event(&ew->work); | ||
1423 | return; | ||
1424 | |||
1408 | default: | 1425 | default: |
1409 | return; | 1426 | return; |
1410 | } | 1427 | } |