net/mlx5: Introduce access functions to modify/query vport promisc mode
authorSaeed Mahameed <saeedm@mellanox.com>
Tue, 1 Dec 2015 16:03:14 +0000 (18:03 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Dec 2015 17:08:45 +0000 (12:08 -0500)
Those functions are needed to notify the upcoming SR-IOV
E-Switch(FDB) manager(PF), of the NIC vport (vf) promisc mode changes.

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/vport.c
include/linux/mlx5/mlx5_ifc.h
include/linux/mlx5/vport.h

index b017a7e68b28a6ef24291a172c640be0a019d5c7..68aa51df29c1c64d70bdc42a146e90e72ea9bfad 100644 (file)
@@ -576,3 +576,65 @@ int mlx5_query_hca_vport_node_guid(struct mlx5_core_dev *dev,
        return err;
 }
 EXPORT_SYMBOL_GPL(mlx5_query_hca_vport_node_guid);
+
+int mlx5_query_nic_vport_promisc(struct mlx5_core_dev *mdev,
+                                u32 vport,
+                                int *promisc_uc,
+                                int *promisc_mc,
+                                int *promisc_all)
+{
+       u32 *out;
+       int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out);
+       int err;
+
+       out = kzalloc(outlen, GFP_KERNEL);
+       if (!out)
+               return -ENOMEM;
+
+       err = mlx5_query_nic_vport_context(mdev, vport, out, outlen);
+       if (err)
+               goto out;
+
+       *promisc_uc = MLX5_GET(query_nic_vport_context_out, out,
+                              nic_vport_context.promisc_uc);
+       *promisc_mc = MLX5_GET(query_nic_vport_context_out, out,
+                              nic_vport_context.promisc_mc);
+       *promisc_all = MLX5_GET(query_nic_vport_context_out, out,
+                               nic_vport_context.promisc_all);
+
+out:
+       kfree(out);
+       return err;
+}
+EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_promisc);
+
+int mlx5_modify_nic_vport_promisc(struct mlx5_core_dev *mdev,
+                                 int promisc_uc,
+                                 int promisc_mc,
+                                 int promisc_all)
+{
+       void *in;
+       int inlen = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in);
+       int err;
+
+       in = mlx5_vzalloc(inlen);
+       if (!in) {
+               mlx5_core_err(mdev, "failed to allocate inbox\n");
+               return -ENOMEM;
+       }
+
+       MLX5_SET(modify_nic_vport_context_in, in, field_select.promisc, 1);
+       MLX5_SET(modify_nic_vport_context_in, in,
+                nic_vport_context.promisc_uc, promisc_uc);
+       MLX5_SET(modify_nic_vport_context_in, in,
+                nic_vport_context.promisc_mc, promisc_mc);
+       MLX5_SET(modify_nic_vport_context_in, in,
+                nic_vport_context.promisc_all, promisc_all);
+
+       err = mlx5_modify_nic_vport_context(mdev, in, inlen);
+
+       kvfree(in);
+
+       return err;
+}
+EXPORT_SYMBOL_GPL(mlx5_modify_nic_vport_promisc);
index 655184702ea2d5ed28a6b159dde0133e46f6830a..2728b5f6c017e29bdafd4cf5faa09c5662217d0c 100644 (file)
@@ -2147,16 +2147,31 @@ struct mlx5_ifc_nic_vport_context_bits {
        u8         reserved_0[0x1f];
        u8         roce_en[0x1];
 
-       u8         reserved_1[0x760];
+       u8         arm_change_event[0x1];
+       u8         reserved_1[0x1a];
+       u8         event_on_mtu[0x1];
+       u8         event_on_promisc_change[0x1];
+       u8         event_on_vlan_change[0x1];
+       u8         event_on_mc_address_change[0x1];
+       u8         event_on_uc_address_change[0x1];
 
-       u8         reserved_2[0x5];
+       u8         reserved_2[0xf0];
+
+       u8         mtu[0x10];
+
+       u8         reserved_3[0x640];
+
+       u8         promisc_uc[0x1];
+       u8         promisc_mc[0x1];
+       u8         promisc_all[0x1];
+       u8         reserved_4[0x2];
        u8         allowed_list_type[0x3];
-       u8         reserved_3[0xc];
+       u8         reserved_5[0xc];
        u8         allowed_list_size[0xc];
 
        struct mlx5_ifc_mac_address_layout_bits permanent_address;
 
-       u8         reserved_4[0x20];
+       u8         reserved_6[0x20];
 
        u8         current_uc_mac_address[0][0x40];
 };
@@ -4235,7 +4250,10 @@ struct mlx5_ifc_modify_nic_vport_context_out_bits {
 };
 
 struct mlx5_ifc_modify_nic_vport_field_select_bits {
-       u8         reserved_0[0x1c];
+       u8         reserved_0[0x19];
+       u8         mtu[0x1];
+       u8         change_event[0x1];
+       u8         promisc[0x1];
        u8         permanent_address[0x1];
        u8         addresses_list[0x1];
        u8         roce_en[0x1];
index c1bba59488510aa6a375cbac298904c639142416..dbbaed9f975aefc42cb36be89ea1ca036c643ac8 100644 (file)
@@ -68,5 +68,14 @@ int mlx5_modify_nic_vport_mac_list(struct mlx5_core_dev *dev,
                                   enum mlx5_list_type list_type,
                                   u8 addr_list[][ETH_ALEN],
                                   int list_size);
+int mlx5_query_nic_vport_promisc(struct mlx5_core_dev *mdev,
+                                u32 vport,
+                                int *promisc_uc,
+                                int *promisc_mc,
+                                int *promisc_all);
+int mlx5_modify_nic_vport_promisc(struct mlx5_core_dev *mdev,
+                                 int promisc_uc,
+                                 int promisc_mc,
+                                 int promisc_all);
 
 #endif /* __MLX5_VPORT_H__ */