|
@@ -32,6 +32,7 @@
|
|
|
|
|
|
#include <linux/mlx5/flow_table.h>
|
|
#include <linux/mlx5/flow_table.h>
|
|
#include "en.h"
|
|
#include "en.h"
|
|
|
|
+#include "eswitch.h"
|
|
|
|
|
|
struct mlx5e_rq_param {
|
|
struct mlx5e_rq_param {
|
|
u32 rqc[MLX5_ST_SZ_DW(rqc)];
|
|
u32 rqc[MLX5_ST_SZ_DW(rqc)];
|
|
@@ -1931,6 +1932,79 @@ static int mlx5e_change_mtu(struct net_device *netdev, int new_mtu)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int mlx5e_set_vf_mac(struct net_device *dev, int vf, u8 *mac)
|
|
|
|
+{
|
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
+ struct mlx5_core_dev *mdev = priv->mdev;
|
|
|
|
+
|
|
|
|
+ return mlx5_eswitch_set_vport_mac(mdev->priv.eswitch, vf + 1, mac);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mlx5e_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos)
|
|
|
|
+{
|
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
+ struct mlx5_core_dev *mdev = priv->mdev;
|
|
|
|
+
|
|
|
|
+ return mlx5_eswitch_set_vport_vlan(mdev->priv.eswitch, vf + 1,
|
|
|
|
+ vlan, qos);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mlx5_vport_link2ifla(u8 esw_link)
|
|
|
|
+{
|
|
|
|
+ switch (esw_link) {
|
|
|
|
+ case MLX5_ESW_VPORT_ADMIN_STATE_DOWN:
|
|
|
|
+ return IFLA_VF_LINK_STATE_DISABLE;
|
|
|
|
+ case MLX5_ESW_VPORT_ADMIN_STATE_UP:
|
|
|
|
+ return IFLA_VF_LINK_STATE_ENABLE;
|
|
|
|
+ }
|
|
|
|
+ return IFLA_VF_LINK_STATE_AUTO;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mlx5_ifla_link2vport(u8 ifla_link)
|
|
|
|
+{
|
|
|
|
+ switch (ifla_link) {
|
|
|
|
+ case IFLA_VF_LINK_STATE_DISABLE:
|
|
|
|
+ return MLX5_ESW_VPORT_ADMIN_STATE_DOWN;
|
|
|
|
+ case IFLA_VF_LINK_STATE_ENABLE:
|
|
|
|
+ return MLX5_ESW_VPORT_ADMIN_STATE_UP;
|
|
|
|
+ }
|
|
|
|
+ return MLX5_ESW_VPORT_ADMIN_STATE_AUTO;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mlx5e_set_vf_link_state(struct net_device *dev, int vf,
|
|
|
|
+ int link_state)
|
|
|
|
+{
|
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
+ struct mlx5_core_dev *mdev = priv->mdev;
|
|
|
|
+
|
|
|
|
+ return mlx5_eswitch_set_vport_state(mdev->priv.eswitch, vf + 1,
|
|
|
|
+ mlx5_ifla_link2vport(link_state));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mlx5e_get_vf_config(struct net_device *dev,
|
|
|
|
+ int vf, struct ifla_vf_info *ivi)
|
|
|
|
+{
|
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
+ struct mlx5_core_dev *mdev = priv->mdev;
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ err = mlx5_eswitch_get_vport_config(mdev->priv.eswitch, vf + 1, ivi);
|
|
|
|
+ if (err)
|
|
|
|
+ return err;
|
|
|
|
+ ivi->linkstate = mlx5_vport_link2ifla(ivi->linkstate);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mlx5e_get_vf_stats(struct net_device *dev,
|
|
|
|
+ int vf, struct ifla_vf_stats *vf_stats)
|
|
|
|
+{
|
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
+ struct mlx5_core_dev *mdev = priv->mdev;
|
|
|
|
+
|
|
|
|
+ return mlx5_eswitch_get_vport_stats(mdev->priv.eswitch, vf + 1,
|
|
|
|
+ vf_stats);
|
|
|
|
+}
|
|
|
|
+
|
|
static struct net_device_ops mlx5e_netdev_ops = {
|
|
static struct net_device_ops mlx5e_netdev_ops = {
|
|
.ndo_open = mlx5e_open,
|
|
.ndo_open = mlx5e_open,
|
|
.ndo_stop = mlx5e_close,
|
|
.ndo_stop = mlx5e_close,
|
|
@@ -1941,7 +2015,7 @@ static struct net_device_ops mlx5e_netdev_ops = {
|
|
.ndo_vlan_rx_add_vid = mlx5e_vlan_rx_add_vid,
|
|
.ndo_vlan_rx_add_vid = mlx5e_vlan_rx_add_vid,
|
|
.ndo_vlan_rx_kill_vid = mlx5e_vlan_rx_kill_vid,
|
|
.ndo_vlan_rx_kill_vid = mlx5e_vlan_rx_kill_vid,
|
|
.ndo_set_features = mlx5e_set_features,
|
|
.ndo_set_features = mlx5e_set_features,
|
|
- .ndo_change_mtu = mlx5e_change_mtu,
|
|
|
|
|
|
+ .ndo_change_mtu = mlx5e_change_mtu
|
|
};
|
|
};
|
|
|
|
|
|
static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev)
|
|
static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev)
|
|
@@ -2041,6 +2115,14 @@ static void mlx5e_build_netdev(struct net_device *netdev)
|
|
if (priv->params.num_tc > 1)
|
|
if (priv->params.num_tc > 1)
|
|
mlx5e_netdev_ops.ndo_select_queue = mlx5e_select_queue;
|
|
mlx5e_netdev_ops.ndo_select_queue = mlx5e_select_queue;
|
|
|
|
|
|
|
|
+ if (MLX5_CAP_GEN(mdev, vport_group_manager)) {
|
|
|
|
+ mlx5e_netdev_ops.ndo_set_vf_mac = mlx5e_set_vf_mac;
|
|
|
|
+ mlx5e_netdev_ops.ndo_set_vf_vlan = mlx5e_set_vf_vlan;
|
|
|
|
+ mlx5e_netdev_ops.ndo_get_vf_config = mlx5e_get_vf_config;
|
|
|
|
+ mlx5e_netdev_ops.ndo_set_vf_link_state = mlx5e_set_vf_link_state;
|
|
|
|
+ mlx5e_netdev_ops.ndo_get_vf_stats = mlx5e_get_vf_stats;
|
|
|
|
+ }
|
|
|
|
+
|
|
netdev->netdev_ops = &mlx5e_netdev_ops;
|
|
netdev->netdev_ops = &mlx5e_netdev_ops;
|
|
netdev->watchdog_timeo = 15 * HZ;
|
|
netdev->watchdog_timeo = 15 * HZ;
|
|
|
|
|