diff options
author | Jack Morgenstein <jackm@dev.mellanox.co.il> | 2014-05-29 09:31:01 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-05-30 00:12:58 -0400 |
commit | 61565013cf7024e8aa52e0a8e78208a955ce7e5f (patch) | |
tree | b2ae8a1e5f0937f6c3089b949cdac8a982ad8416 | |
parent | bc82878baa10c2a6a4a6affaf52c152935112142 (diff) |
IB/mlx4: SET_PORT called by mlx4_ib_modify_port should be wrapped
mlx4_ib_modify_port is invoked in IB for resetting the Q_Key violations
counters and for modifying the IB port capability flags.
For example, when opensm is started up on the hypervisor,
mlx4_ib_modify_port is called to set the port's IsSM flag.
In multifunction mode, the SET_PORT command used in this flow should
be wrapped (so that the PF port capability flags are also tracked,
thus enabling the aggregate of all the VF/PF capability flags to be
tracked properly).
The procedure mlx4_SET_PORT() in main.c is also renamed to mlx4_ib_SET_PORT()
to differentiate it from procedure mlx4_SET_PORT() in port.c.
mlx4_ib_SET_PORT() is used exclusively by mlx4_ib_modify_port().
Finally, the CM invokes ib_modify_port() to set the IsCMSupported flag
even when running over RoCE. Therefore, when RoCE is active,
mlx4_ib_modify_port should return OK unconditionally (since the
capability flags and qkey violations counter are not relevant).
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 1b6dbe156a37..3c3806aff712 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
@@ -544,12 +544,11 @@ static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask, | |||
544 | return 0; | 544 | return 0; |
545 | } | 545 | } |
546 | 546 | ||
547 | static int mlx4_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols, | 547 | static int mlx4_ib_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols, |
548 | u32 cap_mask) | 548 | u32 cap_mask) |
549 | { | 549 | { |
550 | struct mlx4_cmd_mailbox *mailbox; | 550 | struct mlx4_cmd_mailbox *mailbox; |
551 | int err; | 551 | int err; |
552 | u8 is_eth = dev->dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH; | ||
553 | 552 | ||
554 | mailbox = mlx4_alloc_cmd_mailbox(dev->dev); | 553 | mailbox = mlx4_alloc_cmd_mailbox(dev->dev); |
555 | if (IS_ERR(mailbox)) | 554 | if (IS_ERR(mailbox)) |
@@ -563,8 +562,8 @@ static int mlx4_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols, | |||
563 | ((__be32 *) mailbox->buf)[1] = cpu_to_be32(cap_mask); | 562 | ((__be32 *) mailbox->buf)[1] = cpu_to_be32(cap_mask); |
564 | } | 563 | } |
565 | 564 | ||
566 | err = mlx4_cmd(dev->dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, | 565 | err = mlx4_cmd(dev->dev, mailbox->dma, port, 0, MLX4_CMD_SET_PORT, |
567 | MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); | 566 | MLX4_CMD_TIME_CLASS_B, MLX4_CMD_WRAPPED); |
568 | 567 | ||
569 | mlx4_free_cmd_mailbox(dev->dev, mailbox); | 568 | mlx4_free_cmd_mailbox(dev->dev, mailbox); |
570 | return err; | 569 | return err; |
@@ -573,11 +572,20 @@ static int mlx4_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols, | |||
573 | static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, | 572 | static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, |
574 | struct ib_port_modify *props) | 573 | struct ib_port_modify *props) |
575 | { | 574 | { |
575 | struct mlx4_ib_dev *mdev = to_mdev(ibdev); | ||
576 | u8 is_eth = mdev->dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH; | ||
576 | struct ib_port_attr attr; | 577 | struct ib_port_attr attr; |
577 | u32 cap_mask; | 578 | u32 cap_mask; |
578 | int err; | 579 | int err; |
579 | 580 | ||
580 | mutex_lock(&to_mdev(ibdev)->cap_mask_mutex); | 581 | /* return OK if this is RoCE. CM calls ib_modify_port() regardless |
582 | * of whether port link layer is ETH or IB. For ETH ports, qkey | ||
583 | * violations and port capabilities are not meaningful. | ||
584 | */ | ||
585 | if (is_eth) | ||
586 | return 0; | ||
587 | |||
588 | mutex_lock(&mdev->cap_mask_mutex); | ||
581 | 589 | ||
582 | err = mlx4_ib_query_port(ibdev, port, &attr); | 590 | err = mlx4_ib_query_port(ibdev, port, &attr); |
583 | if (err) | 591 | if (err) |
@@ -586,9 +594,9 @@ static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, | |||
586 | cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) & | 594 | cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) & |
587 | ~props->clr_port_cap_mask; | 595 | ~props->clr_port_cap_mask; |
588 | 596 | ||
589 | err = mlx4_SET_PORT(to_mdev(ibdev), port, | 597 | err = mlx4_ib_SET_PORT(mdev, port, |
590 | !!(mask & IB_PORT_RESET_QKEY_CNTR), | 598 | !!(mask & IB_PORT_RESET_QKEY_CNTR), |
591 | cap_mask); | 599 | cap_mask); |
592 | 600 | ||
593 | out: | 601 | out: |
594 | mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex); | 602 | mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex); |