aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx4/main.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index 3bafd0bebd4c..8e10630561c1 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -1408,7 +1408,6 @@ static void reset_gids_task(struct work_struct *work)
1408 struct mlx4_cmd_mailbox *mailbox; 1408 struct mlx4_cmd_mailbox *mailbox;
1409 union ib_gid *gids; 1409 union ib_gid *gids;
1410 int err; 1410 int err;
1411 int i;
1412 struct mlx4_dev *dev = gw->dev->dev; 1411 struct mlx4_dev *dev = gw->dev->dev;
1413 1412
1414 mailbox = mlx4_alloc_cmd_mailbox(dev); 1413 mailbox = mlx4_alloc_cmd_mailbox(dev);
@@ -1420,18 +1419,16 @@ static void reset_gids_task(struct work_struct *work)
1420 gids = mailbox->buf; 1419 gids = mailbox->buf;
1421 memcpy(gids, gw->gids, sizeof(gw->gids)); 1420 memcpy(gids, gw->gids, sizeof(gw->gids));
1422 1421
1423 for (i = 1; i < gw->dev->num_ports + 1; i++) { 1422 if (mlx4_ib_port_link_layer(&gw->dev->ib_dev, gw->port) ==
1424 if (mlx4_ib_port_link_layer(&gw->dev->ib_dev, i) == 1423 IB_LINK_LAYER_ETHERNET) {
1425 IB_LINK_LAYER_ETHERNET) { 1424 err = mlx4_cmd(dev, mailbox->dma,
1426 err = mlx4_cmd(dev, mailbox->dma, 1425 MLX4_SET_PORT_GID_TABLE << 8 | gw->port,
1427 MLX4_SET_PORT_GID_TABLE << 8 | i, 1426 1, MLX4_CMD_SET_PORT,
1428 1, MLX4_CMD_SET_PORT, 1427 MLX4_CMD_TIME_CLASS_B,
1429 MLX4_CMD_TIME_CLASS_B, 1428 MLX4_CMD_WRAPPED);
1430 MLX4_CMD_WRAPPED); 1429 if (err)
1431 if (err) 1430 pr_warn(KERN_WARNING
1432 pr_warn(KERN_WARNING 1431 "set port %d command failed\n", gw->port);
1433 "set port %d command failed\n", i);
1434 }
1435 } 1432 }
1436 1433
1437 mlx4_free_cmd_mailbox(dev, mailbox); 1434 mlx4_free_cmd_mailbox(dev, mailbox);
@@ -1506,7 +1503,7 @@ static void mlx4_make_default_gid(struct net_device *dev, union ib_gid *gid)
1506} 1503}
1507 1504
1508 1505
1509static int reset_gid_table(struct mlx4_ib_dev *dev) 1506static int reset_gid_table(struct mlx4_ib_dev *dev, u8 port)
1510{ 1507{
1511 struct update_gid_work *work; 1508 struct update_gid_work *work;
1512 1509
@@ -1514,10 +1511,12 @@ static int reset_gid_table(struct mlx4_ib_dev *dev)
1514 work = kzalloc(sizeof(*work), GFP_ATOMIC); 1511 work = kzalloc(sizeof(*work), GFP_ATOMIC);
1515 if (!work) 1512 if (!work)
1516 return -ENOMEM; 1513 return -ENOMEM;
1517 memset(dev->iboe.gid_table, 0, sizeof(dev->iboe.gid_table)); 1514
1515 memset(dev->iboe.gid_table[port - 1], 0, sizeof(work->gids));
1518 memset(work->gids, 0, sizeof(work->gids)); 1516 memset(work->gids, 0, sizeof(work->gids));
1519 INIT_WORK(&work->work, reset_gids_task); 1517 INIT_WORK(&work->work, reset_gids_task);
1520 work->dev = dev; 1518 work->dev = dev;
1519 work->port = port;
1521 queue_work(wq, &work->work); 1520 queue_work(wq, &work->work);
1522 return 0; 1521 return 0;
1523} 1522}
@@ -1670,9 +1669,11 @@ static int mlx4_ib_init_gid_table(struct mlx4_ib_dev *ibdev)
1670{ 1669{
1671 struct net_device *dev; 1670 struct net_device *dev;
1672 struct mlx4_ib_iboe *iboe = &ibdev->iboe; 1671 struct mlx4_ib_iboe *iboe = &ibdev->iboe;
1672 int i;
1673 1673
1674 if (reset_gid_table(ibdev)) 1674 for (i = 1; i <= ibdev->num_ports; ++i)
1675 return -1; 1675 if (reset_gid_table(ibdev, i))
1676 return -1;
1676 1677
1677 read_lock(&dev_base_lock); 1678 read_lock(&dev_base_lock);
1678 spin_lock(&iboe->lock); 1679 spin_lock(&iboe->lock);