This provides the option for TC offload support to be disabled in the
driver.

Signed-off-by: Jes Sorensen <jsoren...@fb.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/Kconfig   | 10 ++++++
 drivers/net/ethernet/mellanox/mlx5/core/Makefile  |  4 ++-
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 39 ++++++-----------------
 drivers/net/ethernet/mellanox/mlx5/core/en_rep.c  | 12 +++++++
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c   | 29 +++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.h   |  1 +
 6 files changed, 65 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig 
b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
index d91272d437bf..6c2607e2866d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
@@ -52,6 +52,16 @@ config MLX5_CORE_EN_ESWITCH_OFFLOADS
 
          If unsure, set to Y
 
+config MLX5_CORE_EN_TC
+       bool "Enable support for TC Filtering Offload Support"
+       default y
+       depends on MLX5_CORE_EN && MLX5_CORE_EN_ESWITCH_OFFLOADS
+       ---help---
+         Say Y here if you want to use Mellanox TC offload support.
+         If set to N, the driver will use the kernel's software implementation.
+
+         If unsure, set to Y
+
 config MLX5_CORE_IPOIB
        bool "Mellanox Technologies ConnectX-4 IPoIB offloads support"
        depends on MLX5_CORE_EN
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile 
b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
index 615b33693cc2..72d7d58e9823 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
@@ -11,10 +11,12 @@ mlx5_core-$(CONFIG_MLX5_FPGA) += fpga/cmd.o fpga/core.o
 mlx5_core-$(CONFIG_MLX5_CORE_EN) += wq.o eswitch.o \
                en_main.o en_common.o en_fs.o en_ethtool.o en_tx.o \
                en_rx.o en_rx_am.o en_txrx.o en_clock.o vxlan.o \
-               en_tc.o en_arfs.o en_rep.o en_fs_ethtool.o en_selftest.o
+               en_arfs.o en_rep.o en_fs_ethtool.o en_selftest.o
 
 mlx5_core-$(CONFIG_MLX5_CORE_EN_DCB) +=  en_dcbnl.o
 
+mlx5_core-$(CONFIG_MLX5_CORE_EN_TC) +=  en_tc.o
+
 mlx5_core-$(CONFIG_MLX5_EN_ESWITCH_OFFLOADS) +=  en_eswitch_offloads.o
 
 mlx5_core-$(CONFIG_MLX5_CORE_IPOIB) += ipoib.o
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index cdff04b2aea1..9abdd4189edf 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -2961,38 +2961,10 @@ static int mlx5e_modify_channels_vsd(struct 
mlx5e_channels *chs, bool vsd)
        return 0;
 }
 
-static int mlx5e_setup_tc(struct net_device *netdev, u8 tc)
-{
-       struct mlx5e_priv *priv = netdev_priv(netdev);
-       struct mlx5e_channels new_channels = {};
-       int err = 0;
-
-       if (tc && tc != MLX5E_MAX_NUM_TC)
-               return -EINVAL;
-
-       mutex_lock(&priv->state_lock);
-
-       new_channels.params = priv->channels.params;
-       new_channels.params.num_tc = tc ? tc : 1;
-
-       if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
-               priv->channels.params = new_channels.params;
-               goto out;
-       }
-
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto out;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
-out:
-       mutex_unlock(&priv->state_lock);
-       return err;
-}
-
 static int mlx5e_ndo_setup_tc(struct net_device *dev, u32 handle,
                              __be16 proto, struct tc_to_netdev *tc)
 {
+#ifdef CONFIG_MLX5_CORE_EN_TC
        struct mlx5e_priv *priv = netdev_priv(dev);
 
        if (TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS))
@@ -3019,6 +2991,9 @@ static int mlx5e_ndo_setup_tc(struct net_device *dev, u32 
handle,
        tc->mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS;
 
        return mlx5e_setup_tc(dev, tc->mqprio->num_tc);
+#else
+       return -EOPNOTSUPP;
+#endif
 }
 
 static void
@@ -4085,14 +4060,18 @@ static int mlx5e_init_nic_rx(struct mlx5e_priv *priv)
                goto err_destroy_direct_tirs;
        }
 
+#ifdef CONFIG_MLX5_CORE_EN_TC
        err = mlx5e_tc_init(priv);
        if (err)
                goto err_destroy_flow_steering;
+#endif
 
        return 0;
 
+#ifdef CONFIG_MLX5_CORE_EN_TC
 err_destroy_flow_steering:
        mlx5e_destroy_flow_steering(priv);
+#endif
 err_destroy_direct_tirs:
        mlx5e_destroy_direct_tirs(priv);
 err_destroy_indirect_tirs:
@@ -4106,7 +4085,9 @@ static int mlx5e_init_nic_rx(struct mlx5e_priv *priv)
 
 static void mlx5e_cleanup_nic_rx(struct mlx5e_priv *priv)
 {
+#ifdef CONFIG_MLX5_CORE_EN_TC
        mlx5e_tc_cleanup(priv);
+#endif
        mlx5e_destroy_flow_steering(priv);
        mlx5e_destroy_direct_tirs(priv);
        mlx5e_destroy_indirect_tirs(priv);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 79462c0368a0..514f190b3f3f 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -256,6 +256,7 @@ void mlx5e_rep_queue_neigh_stats_work(struct mlx5e_priv 
*priv)
 
 static void mlx5e_rep_neigh_stats_work(struct work_struct *work)
 {
+#ifdef CONFIG_MLX5_CORE_EN_TC
        struct mlx5e_rep_priv *rpriv = container_of(work, struct mlx5e_rep_priv,
                                                    
neigh_update.neigh_stats_work.work);
        struct net_device *netdev = rpriv->rep->netdev;
@@ -270,6 +271,7 @@ static void mlx5e_rep_neigh_stats_work(struct work_struct 
*work)
                mlx5e_tc_update_neigh_used_value(nhe);
 
        rtnl_unlock();
+#endif
 }
 
 static void mlx5e_rep_neigh_entry_hold(struct mlx5e_neigh_hash_entry *nhe)
@@ -288,6 +290,7 @@ static void mlx5e_rep_update_flows(struct mlx5e_priv *priv,
                                   bool neigh_connected,
                                   unsigned char ha[ETH_ALEN])
 {
+#ifdef CONFIG_MLX5_CORE_EN_TC
        struct ethhdr *eth = (struct ethhdr *)e->encap_header;
 
        ASSERT_RTNL();
@@ -302,6 +305,7 @@ static void mlx5e_rep_update_flows(struct mlx5e_priv *priv,
 
                mlx5e_tc_encap_flows_add(priv, e);
        }
+#endif
 }
 
 static void mlx5e_rep_neigh_update(struct work_struct *work)
@@ -859,14 +863,18 @@ static int mlx5e_init_rep_rx(struct mlx5e_priv *priv)
        }
        rep->vport_rx_rule = flow_rule;
 
+#ifdef CONFIG_MLX5_CORE_EN_TC
        err = mlx5e_tc_init(priv);
        if (err)
                goto err_del_flow_rule;
+#endif
 
        return 0;
 
+#ifdef CONFIG_MLX5_CORE_EN_TC
 err_del_flow_rule:
        mlx5_del_flow_rules(rep->vport_rx_rule);
+#endif
 err_destroy_direct_tirs:
        mlx5e_destroy_direct_tirs(priv);
 err_destroy_direct_rqts:
@@ -879,7 +887,9 @@ static void mlx5e_cleanup_rep_rx(struct mlx5e_priv *priv)
        struct mlx5e_rep_priv *rpriv = priv->ppriv;
        struct mlx5_eswitch_rep *rep = rpriv->rep;
 
+#ifdef CONFIG_MLX5_CORE_EN_TC
        mlx5e_tc_cleanup(priv);
+#endif
        mlx5_del_flow_rules(rep->vport_rx_rule);
        mlx5e_destroy_direct_tirs(priv);
        mlx5e_destroy_direct_rqts(priv);
@@ -953,8 +963,10 @@ mlx5e_nic_rep_unload(struct mlx5_eswitch *esw, struct 
mlx5_eswitch_rep *rep)
                mlx5e_remove_sqs_fwd_rules(priv);
 
        /* clean (and re-init) existing uplink offloaded TC rules */
+#ifdef CONFIG_MLX5_CORE_EN_TC
        mlx5e_tc_cleanup(priv);
        mlx5e_tc_init(priv);
+#endif
 
        mlx5e_rep_neigh_cleanup(rpriv);
 }
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 8ec13f9be660..2eba4c74ed97 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -1966,3 +1966,32 @@ void mlx5e_tc_cleanup(struct mlx5e_priv *priv)
                tc->t = NULL;
        }
 }
+
+int mlx5e_setup_tc(struct net_device *netdev, u8 tc)
+{
+       struct mlx5e_priv *priv = netdev_priv(netdev);
+       struct mlx5e_channels new_channels = {};
+       int err = 0;
+
+       if (tc && tc != MLX5E_MAX_NUM_TC)
+               return -EINVAL;
+
+       mutex_lock(&priv->state_lock);
+
+       new_channels.params = priv->channels.params;
+       new_channels.params.num_tc = tc ? tc : 1;
+
+       if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
+               priv->channels.params = new_channels.params;
+               goto out;
+       }
+
+       err = mlx5e_open_channels(priv, &new_channels);
+       if (err)
+               goto out;
+
+       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+out:
+       mutex_unlock(&priv->state_lock);
+       return err;
+}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h 
b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
index ecbe30d808ae..c1562fa77f35 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
@@ -37,6 +37,7 @@
 
 int mlx5e_tc_init(struct mlx5e_priv *priv);
 void mlx5e_tc_cleanup(struct mlx5e_priv *priv);
+int mlx5e_setup_tc(struct net_device *netdev, u8 tc);
 
 int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
                           struct tc_cls_flower_offload *f);
-- 
2.13.0

Reply via email to