diff options
| -rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 35 |
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 | ||
| 1509 | static int reset_gid_table(struct mlx4_ib_dev *dev) | 1506 | static 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); |
