net/mlx4_core: Enhance the MAD_IFC wrapper to convert VF port to physical
authorOr Gerlitz <ogerlitz@mellanox.com>
Thu, 21 May 2015 12:14:05 +0000 (15:14 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 May 2015 03:05:09 +0000 (23:05 -0400)
Single port VFs always provide port = 1 (even if the actual physical
port used is port 2). As such, we need to convert the port provided
by the VF to the physical port before calling into the firmware.

It turns out that the Linux mlx4 VF RoCE driver maintains a copy of
the GID table and hence this change became critical only for single
ported IB VFs, but it could be needed for other RoCE VF drivers too.

Fixes: 449fc48866f7 ('net/mlx4: Adapt code for N-Port VF')
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/cmd.c

index 4f7dc044601e2751ad625e4c011aa3a1c328e62f..153fb15769a8635d3fbfec1b15358689225ab574 100644 (file)
@@ -877,7 +877,7 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave,
 {
        struct ib_smp *smp = inbox->buf;
        u32 index;
-       u8 port;
+       u8 port, slave_port;
        u8 opcode_modifier;
        u16 *table;
        int err;
@@ -889,7 +889,8 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave,
        __be32 slave_cap_mask;
        __be64 slave_node_guid;
 
-       port = vhcr->in_modifier;
+       slave_port = vhcr->in_modifier;
+       port = mlx4_slave_convert_port(dev, slave, slave_port);
 
        /* network-view bit is for driver use only, and should not be passed to FW */
        opcode_modifier = vhcr->op_modifier & ~0x8; /* clear netw view bit */
@@ -925,8 +926,9 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave,
                        if (smp->attr_id == IB_SMP_ATTR_PORT_INFO) {
                                /*get the slave specific caps:*/
                                /*do the command */
+                               smp->attr_mod = cpu_to_be32(port);
                                err = mlx4_cmd_box(dev, inbox->dma, outbox->dma,
-                                           vhcr->in_modifier, opcode_modifier,
+                                           port, opcode_modifier,
                                            vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE);
                                /* modify the response for slaves */
                                if (!err && slave != mlx4_master_func_num(dev)) {
@@ -970,7 +972,7 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave,
                        }
                        if (smp->attr_id == IB_SMP_ATTR_NODE_INFO) {
                                err = mlx4_cmd_box(dev, inbox->dma, outbox->dma,
-                                            vhcr->in_modifier, opcode_modifier,
+                                            port, opcode_modifier,
                                             vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE);
                                if (!err) {
                                        slave_node_guid =  mlx4_get_slave_node_guid(dev, slave);