net/mlx5: Update access functions to Query/Modify vport MAC address
authorSaeed Mahameed <saeedm@mellanox.com>
Tue, 1 Dec 2015 16:03:11 +0000 (18:03 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Dec 2015 17:08:44 +0000 (12:08 -0500)
In preparation for SR-IOV we add here an API to enable each e-switch
client (PF/VF) to configure its L2 MAC addresses and for the e-switch
manager (usually the PF) to access them in order to be able to
configure them into the e-switch.
Therefore we now pass vport num parameter to
mlx5_query_nic_vport_context, so PF can access other vports contexts.

preperation for ethernet sriov and l2 table management.

Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/vport.c
include/linux/mlx5/vport.h

index f6a8cc78760355b2ceb50ca05488926fca99759a..2ef717f98b0da80d424481204124c05208d6fdc6 100644 (file)
@@ -2028,7 +2028,7 @@ static void mlx5e_set_netdev_dev_addr(struct net_device *netdev)
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
 
-       mlx5_query_nic_vport_mac_address(priv->mdev, netdev->dev_addr);
+       mlx5_query_nic_vport_mac_address(priv->mdev, 0, netdev->dev_addr);
 }
 
 static void mlx5e_build_netdev(struct net_device *netdev)
index b94177ebcf3a31bfd0455d56bf23cc6ade1f3758..442916e98724873a11b77c8f34cc832e87a4f64c 100644 (file)
@@ -57,33 +57,98 @@ u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod)
 }
 EXPORT_SYMBOL(mlx5_query_vport_state);
 
-void mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev, u8 *addr)
+static int mlx5_query_nic_vport_context(struct mlx5_core_dev *mdev, u16 vport,
+                                       u32 *out, int outlen)
+{
+       u32 in[MLX5_ST_SZ_DW(query_nic_vport_context_in)];
+
+       memset(in, 0, sizeof(in));
+
+       MLX5_SET(query_nic_vport_context_in, in, opcode,
+                MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT);
+
+       MLX5_SET(query_nic_vport_context_in, in, vport_number, vport);
+       if (vport)
+               MLX5_SET(query_nic_vport_context_in, in, other_vport, 1);
+
+       return mlx5_cmd_exec_check_status(mdev, in, sizeof(in), out, outlen);
+}
+
+static int mlx5_modify_nic_vport_context(struct mlx5_core_dev *mdev, void *in,
+                                        int inlen)
+{
+       u32 out[MLX5_ST_SZ_DW(modify_nic_vport_context_out)];
+
+       MLX5_SET(modify_nic_vport_context_in, in, opcode,
+                MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT);
+
+       memset(out, 0, sizeof(out));
+       return mlx5_cmd_exec_check_status(mdev, in, inlen, out, sizeof(out));
+}
+
+int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev,
+                                    u16 vport, u8 *addr)
 {
-       u32  in[MLX5_ST_SZ_DW(query_nic_vport_context_in)];
        u32 *out;
        int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out);
        u8 *out_addr;
+       int err;
 
        out = mlx5_vzalloc(outlen);
        if (!out)
-               return;
+               return -ENOMEM;
 
        out_addr = MLX5_ADDR_OF(query_nic_vport_context_out, out,
                                nic_vport_context.permanent_address);
 
-       memset(in, 0, sizeof(in));
-
-       MLX5_SET(query_nic_vport_context_in, in, opcode,
-                MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT);
-
-       memset(out, 0, outlen);
-       mlx5_cmd_exec_check_status(mdev, in, sizeof(in), out, outlen);
+       err = mlx5_query_nic_vport_context(mdev, vport, out, outlen);
+       if (err)
+               goto out;
 
        ether_addr_copy(addr, &out_addr[2]);
 
+out:
        kvfree(out);
+       return err;
+}
+EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_mac_address);
+
+int mlx5_modify_nic_vport_mac_address(struct mlx5_core_dev *mdev,
+                                     u16 vport, u8 *addr)
+{
+       void *in;
+       int inlen = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in);
+       int err;
+       void *nic_vport_ctx;
+       u8 *perm_mac;
+
+       in = mlx5_vzalloc(inlen);
+       if (!in) {
+               mlx5_core_warn(mdev, "failed to allocate inbox\n");
+               return -ENOMEM;
+       }
+
+       MLX5_SET(modify_nic_vport_context_in, in,
+                field_select.permanent_address, 1);
+       MLX5_SET(modify_nic_vport_context_in, in, vport_number, vport);
+
+       if (vport)
+               MLX5_SET(modify_nic_vport_context_in, in, other_vport, 1);
+
+       nic_vport_ctx = MLX5_ADDR_OF(modify_nic_vport_context_in,
+                                    in, nic_vport_context);
+       perm_mac = MLX5_ADDR_OF(nic_vport_context, nic_vport_ctx,
+                               permanent_address);
+
+       ether_addr_copy(&perm_mac[2], addr);
+
+       err = mlx5_modify_nic_vport_context(mdev, in, inlen);
+
+       kvfree(in);
+
+       return err;
 }
-EXPORT_SYMBOL(mlx5_query_nic_vport_mac_address);
+EXPORT_SYMBOL(mlx5_modify_nic_vport_mac_address);
 
 int mlx5_query_hca_vport_gid(struct mlx5_core_dev *dev, u8 other_vport,
                             u8 port_num, u16  vf_num, u16 gid_index,
index 967e0fd06e89724d8eacf03442fbf0257a1c6349..43e82d9f54638cb8b2b6e7e68be8a45c248a93a7 100644 (file)
 #include <linux/mlx5/driver.h>
 
 u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod);
-void mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev, u8 *addr);
+int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev,
+                                    u16 vport, u8 *addr);
+int mlx5_modify_nic_vport_mac_address(struct mlx5_core_dev *dev,
+                                     u16 vport, u8 *addr);
 int mlx5_query_hca_vport_gid(struct mlx5_core_dev *dev, u8 other_vport,
                             u8 port_num, u16  vf_num, u16 gid_index,
                             union ib_gid *gid);