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 | } |
