net/mlx5e: Refactor RSS related objects and code
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_fs.c
index def5134848452c37516841464c38a33fb295e071..f64dda2bed316e3bbedf22d280713e9874034ffe 100644 (file)
@@ -806,25 +806,25 @@ mlx5e_generate_ttc_rule(struct mlx5e_priv *priv,
        return err ? ERR_PTR(err) : rule;
 }
 
-static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv)
+static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv,
+                                         struct ttc_params *params,
+                                         struct mlx5e_ttc_table *ttc)
 {
        struct mlx5_flow_destination dest = {};
-       struct mlx5e_ttc_table *ttc;
        struct mlx5_flow_handle **rules;
        struct mlx5_flow_table *ft;
        int tt;
        int err;
 
-       ttc = &priv->fs.ttc;
        ft = ttc->ft.t;
        rules = ttc->rules;
 
        dest.type = MLX5_FLOW_DESTINATION_TYPE_TIR;
        for (tt = 0; tt < MLX5E_NUM_TT; tt++) {
                if (tt == MLX5E_TT_ANY)
-                       dest.tir_num = priv->direct_tir[0].tirn;
+                       dest.tir_num = params->any_tt_tirn;
                else
-                       dest.tir_num = priv->indir_tir[tt].tirn;
+                       dest.tir_num = params->indir_tirn[tt];
                rules[tt] = mlx5e_generate_ttc_rule(priv, ft, &dest,
                                                    ttc_rules[tt].etype,
                                                    ttc_rules[tt].proto);
@@ -832,12 +832,12 @@ static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv)
                        goto del_rules;
        }
 
-       if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
+       if (!params->inner_ttc || !mlx5e_tunnel_inner_ft_supported(priv->mdev))
                return 0;
 
        rules     = ttc->tunnel_rules;
        dest.type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
-       dest.ft   = priv->fs.inner_ttc.ft.t;
+       dest.ft   = params->inner_ttc->ft.t;
        for (tt = 0; tt < MLX5E_NUM_TUNNEL_TT; tt++) {
                rules[tt] = mlx5e_generate_ttc_rule(priv, ft, &dest,
                                                    ttc_tunnel_rules[tt].etype,
@@ -977,25 +977,25 @@ mlx5e_generate_inner_ttc_rule(struct mlx5e_priv *priv,
        return err ? ERR_PTR(err) : rule;
 }
 
-static int mlx5e_generate_inner_ttc_table_rules(struct mlx5e_priv *priv)
+static int mlx5e_generate_inner_ttc_table_rules(struct mlx5e_priv *priv,
+                                               struct ttc_params *params,
+                                               struct mlx5e_ttc_table *ttc)
 {
        struct mlx5_flow_destination dest = {};
        struct mlx5_flow_handle **rules;
-       struct mlx5e_ttc_table *ttc;
        struct mlx5_flow_table *ft;
        int err;
        int tt;
 
-       ttc =  &priv->fs.inner_ttc;
        ft = ttc->ft.t;
        rules = ttc->rules;
 
        dest.type = MLX5_FLOW_DESTINATION_TYPE_TIR;
        for (tt = 0; tt < MLX5E_NUM_TT; tt++) {
                if (tt == MLX5E_TT_ANY)
-                       dest.tir_num = priv->direct_tir[0].tirn;
+                       dest.tir_num = params->any_tt_tirn;
                else
-                       dest.tir_num = priv->inner_indir_tir[tt].tirn;
+                       dest.tir_num = params->indir_tirn[tt];
 
                rules[tt] = mlx5e_generate_inner_ttc_rule(priv, ft, &dest,
                                                          ttc_rules[tt].etype,
@@ -1075,21 +1075,42 @@ err:
        return err;
 }
 
-int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv)
+void mlx5e_set_ttc_basic_params(struct mlx5e_priv *priv,
+                               struct ttc_params *ttc_params)
+{
+       ttc_params->any_tt_tirn = priv->direct_tir[0].tirn;
+       ttc_params->inner_ttc = &priv->fs.inner_ttc;
+}
+
+void mlx5e_set_inner_ttc_ft_params(struct ttc_params *ttc_params)
+{
+       struct mlx5_flow_table_attr *ft_attr = &ttc_params->ft_attr;
+
+       ft_attr->max_fte = MLX5E_INNER_TTC_TABLE_SIZE;
+       ft_attr->level = MLX5E_INNER_TTC_FT_LEVEL;
+       ft_attr->prio = MLX5E_NIC_PRIO;
+}
+
+void mlx5e_set_ttc_ft_params(struct ttc_params *ttc_params)
+
+{
+       struct mlx5_flow_table_attr *ft_attr = &ttc_params->ft_attr;
+
+       ft_attr->max_fte = MLX5E_TTC_TABLE_SIZE;
+       ft_attr->level = MLX5E_TTC_FT_LEVEL;
+       ft_attr->prio = MLX5E_NIC_PRIO;
+}
+
+int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
+                                struct mlx5e_ttc_table *ttc)
 {
-       struct mlx5e_ttc_table *ttc = &priv->fs.inner_ttc;
-       struct mlx5_flow_table_attr ft_attr = {};
        struct mlx5e_flow_table *ft = &ttc->ft;
        int err;
 
        if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
                return 0;
 
-       ft_attr.max_fte = MLX5E_INNER_TTC_TABLE_SIZE;
-       ft_attr.level   = MLX5E_INNER_TTC_FT_LEVEL;
-       ft_attr.prio    = MLX5E_NIC_PRIO;
-
-       ft->t = mlx5_create_flow_table(priv->fs.ns, &ft_attr);
+       ft->t = mlx5_create_flow_table(priv->fs.ns, &params->ft_attr);
        if (IS_ERR(ft->t)) {
                err = PTR_ERR(ft->t);
                ft->t = NULL;
@@ -1100,7 +1121,7 @@ int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv)
        if (err)
                goto err;
 
-       err = mlx5e_generate_inner_ttc_table_rules(priv);
+       err = mlx5e_generate_inner_ttc_table_rules(priv, params, ttc);
        if (err)
                goto err;
 
@@ -1111,10 +1132,9 @@ err:
        return err;
 }
 
-void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv)
+void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv,
+                                  struct mlx5e_ttc_table *ttc)
 {
-       struct mlx5e_ttc_table *ttc = &priv->fs.inner_ttc;
-
        if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
                return;
 
@@ -1122,27 +1142,21 @@ void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv)
        mlx5e_destroy_flow_table(&ttc->ft);
 }
 
-void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv)
+void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv,
+                            struct mlx5e_ttc_table *ttc)
 {
-       struct mlx5e_ttc_table *ttc = &priv->fs.ttc;
-
        mlx5e_cleanup_ttc_rules(ttc);
        mlx5e_destroy_flow_table(&ttc->ft);
 }
 
-int mlx5e_create_ttc_table(struct mlx5e_priv *priv)
+int mlx5e_create_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
+                          struct mlx5e_ttc_table *ttc)
 {
        bool match_ipv_outer = MLX5_CAP_FLOWTABLE_NIC_RX(priv->mdev, ft_field_support.outer_ip_version);
-       struct mlx5e_ttc_table *ttc = &priv->fs.ttc;
-       struct mlx5_flow_table_attr ft_attr = {};
        struct mlx5e_flow_table *ft = &ttc->ft;
        int err;
 
-       ft_attr.max_fte = MLX5E_TTC_TABLE_SIZE;
-       ft_attr.level = MLX5E_TTC_FT_LEVEL;
-       ft_attr.prio = MLX5E_NIC_PRIO;
-
-       ft->t = mlx5_create_flow_table(priv->fs.ns, &ft_attr);
+       ft->t = mlx5_create_flow_table(priv->fs.ns, &params->ft_attr);
        if (IS_ERR(ft->t)) {
                err = PTR_ERR(ft->t);
                ft->t = NULL;
@@ -1153,7 +1167,7 @@ int mlx5e_create_ttc_table(struct mlx5e_priv *priv)
        if (err)
                goto err;
 
-       err = mlx5e_generate_ttc_table_rules(priv);
+       err = mlx5e_generate_ttc_table_rules(priv, params, ttc);
        if (err)
                goto err;
 
@@ -1474,7 +1488,8 @@ static void mlx5e_destroy_vlan_table(struct mlx5e_priv *priv)
 
 int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
 {
-       int err;
+       struct ttc_params ttc_params = {};
+       int tt, err;
 
        priv->fs.ns = mlx5_get_flow_namespace(priv->mdev,
                                               MLX5_FLOW_NAMESPACE_KERNEL);
@@ -1489,14 +1504,23 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
                priv->netdev->hw_features &= ~NETIF_F_NTUPLE;
        }
 
-       err = mlx5e_create_inner_ttc_table(priv);
+       mlx5e_set_ttc_basic_params(priv, &ttc_params);
+       mlx5e_set_inner_ttc_ft_params(&ttc_params);
+       for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
+               ttc_params.indir_tirn[tt] = priv->inner_indir_tir[tt].tirn;
+
+       err = mlx5e_create_inner_ttc_table(priv, &ttc_params, &priv->fs.inner_ttc);
        if (err) {
                netdev_err(priv->netdev, "Failed to create inner ttc table, err=%d\n",
                           err);
                goto err_destroy_arfs_tables;
        }
 
-       err = mlx5e_create_ttc_table(priv);
+       mlx5e_set_ttc_ft_params(&ttc_params);
+       for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
+               ttc_params.indir_tirn[tt] = priv->indir_tir[tt].tirn;
+
+       err = mlx5e_create_ttc_table(priv, &ttc_params, &priv->fs.ttc);
        if (err) {
                netdev_err(priv->netdev, "Failed to create ttc table, err=%d\n",
                           err);
@@ -1524,9 +1548,9 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
 err_destroy_l2_table:
        mlx5e_destroy_l2_table(priv);
 err_destroy_ttc_table:
-       mlx5e_destroy_ttc_table(priv);
+       mlx5e_destroy_ttc_table(priv, &priv->fs.ttc);
 err_destroy_inner_ttc_table:
-       mlx5e_destroy_inner_ttc_table(priv);
+       mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
 err_destroy_arfs_tables:
        mlx5e_arfs_destroy_tables(priv);
 
@@ -1537,8 +1561,8 @@ void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv)
 {
        mlx5e_destroy_vlan_table(priv);
        mlx5e_destroy_l2_table(priv);
-       mlx5e_destroy_ttc_table(priv);
-       mlx5e_destroy_inner_ttc_table(priv);
+       mlx5e_destroy_ttc_table(priv, &priv->fs.ttc);
+       mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
        mlx5e_arfs_destroy_tables(priv);
        mlx5e_ethtool_cleanup_steering(priv);
 }