adc00ae7e9e9ae624fb372af08881fdc06353c70
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / en / fs.h
1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2 /* Copyright (c) 2018 Mellanox Technologies. */
3
4 #ifndef __MLX5E_FLOW_STEER_H__
5 #define __MLX5E_FLOW_STEER_H__
6
7 struct mlx5e_flow_table {
8         int num_groups;
9         struct mlx5_flow_table *t;
10         struct mlx5_flow_group **g;
11 };
12
13 #ifdef CONFIG_MLX5_EN_RXNFC
14
15 struct mlx5e_ethtool_table {
16         struct mlx5_flow_table *ft;
17         int                    num_rules;
18 };
19
20 #define ETHTOOL_NUM_L3_L4_FTS 7
21 #define ETHTOOL_NUM_L2_FTS 4
22
23 struct mlx5e_ethtool_steering {
24         struct mlx5e_ethtool_table      l3_l4_ft[ETHTOOL_NUM_L3_L4_FTS];
25         struct mlx5e_ethtool_table      l2_ft[ETHTOOL_NUM_L2_FTS];
26         struct list_head                rules;
27         int                             tot_num_rules;
28 };
29
30 void mlx5e_ethtool_init_steering(struct mlx5e_priv *priv);
31 void mlx5e_ethtool_cleanup_steering(struct mlx5e_priv *priv);
32 int mlx5e_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd);
33 int mlx5e_get_rxnfc(struct net_device *dev,
34                     struct ethtool_rxnfc *info, u32 *rule_locs);
35 #else
36 static inline void mlx5e_ethtool_init_steering(struct mlx5e_priv *priv)    { }
37 static inline void mlx5e_ethtool_cleanup_steering(struct mlx5e_priv *priv) { }
38 #endif /* CONFIG_MLX5_EN_RXNFC */
39
40 #ifdef CONFIG_MLX5_EN_ARFS
41 #define ARFS_HASH_SHIFT BITS_PER_BYTE
42 #define ARFS_HASH_SIZE BIT(BITS_PER_BYTE)
43
44 struct arfs_table {
45         struct mlx5e_flow_table  ft;
46         struct mlx5_flow_handle  *default_rule;
47         struct hlist_head        rules_hash[ARFS_HASH_SIZE];
48 };
49
50 enum  arfs_type {
51         ARFS_IPV4_TCP,
52         ARFS_IPV6_TCP,
53         ARFS_IPV4_UDP,
54         ARFS_IPV6_UDP,
55         ARFS_NUM_TYPES,
56 };
57
58 struct mlx5e_arfs_tables {
59         struct arfs_table arfs_tables[ARFS_NUM_TYPES];
60         /* Protect aRFS rules list */
61         spinlock_t                     arfs_lock;
62         struct list_head               rules;
63         int                            last_filter_id;
64         struct workqueue_struct        *wq;
65 };
66
67 int mlx5e_arfs_create_tables(struct mlx5e_priv *priv);
68 void mlx5e_arfs_destroy_tables(struct mlx5e_priv *priv);
69 int mlx5e_arfs_enable(struct mlx5e_priv *priv);
70 int mlx5e_arfs_disable(struct mlx5e_priv *priv);
71 int mlx5e_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
72                         u16 rxq_index, u32 flow_id);
73 #else
74 static inline int mlx5e_arfs_create_tables(struct mlx5e_priv *priv) { return 0; }
75 static inline void mlx5e_arfs_destroy_tables(struct mlx5e_priv *priv) {}
76 static inline int mlx5e_arfs_enable(struct mlx5e_priv *priv) { return -EOPNOTSUPP; }
77 static inline int mlx5e_arfs_disable(struct mlx5e_priv *priv) { return -EOPNOTSUPP; }
78 #endif
79
80 #endif /* __MLX5E_FLOW_STEER_H__ */
81