aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx4/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/mlx4/main.c')
-rw-r--r--drivers/infiniband/hw/mlx4/main.c29
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
1385static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr, 1381static 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 }