1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (C) 2018-2020, Intel Corporation. */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #ifndef _ICE_ARFS_H_
5*4882a593Smuzhiyun #define _ICE_ARFS_H_
6*4882a593Smuzhiyun enum ice_arfs_fltr_state {
7*4882a593Smuzhiyun ICE_ARFS_INACTIVE,
8*4882a593Smuzhiyun ICE_ARFS_ACTIVE,
9*4882a593Smuzhiyun ICE_ARFS_TODEL,
10*4882a593Smuzhiyun };
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun struct ice_arfs_entry {
13*4882a593Smuzhiyun struct ice_fdir_fltr fltr_info;
14*4882a593Smuzhiyun struct hlist_node list_entry;
15*4882a593Smuzhiyun u64 time_activated; /* only valid for UDP flows */
16*4882a593Smuzhiyun u32 flow_id;
17*4882a593Smuzhiyun /* fltr_state = 0 - ICE_ARFS_INACTIVE:
18*4882a593Smuzhiyun * filter needs to be updated or programmed in HW.
19*4882a593Smuzhiyun * fltr_state = 1 - ICE_ARFS_ACTIVE:
20*4882a593Smuzhiyun * filter is active and programmed in HW.
21*4882a593Smuzhiyun * fltr_state = 2 - ICE_ARFS_TODEL:
22*4882a593Smuzhiyun * filter has been deleted from HW and needs to be removed from
23*4882a593Smuzhiyun * the aRFS hash table.
24*4882a593Smuzhiyun */
25*4882a593Smuzhiyun u8 fltr_state;
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun struct ice_arfs_entry_ptr {
29*4882a593Smuzhiyun struct ice_arfs_entry *arfs_entry;
30*4882a593Smuzhiyun struct hlist_node list_entry;
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun struct ice_arfs_active_fltr_cntrs {
34*4882a593Smuzhiyun atomic_t active_tcpv4_cnt;
35*4882a593Smuzhiyun atomic_t active_tcpv6_cnt;
36*4882a593Smuzhiyun atomic_t active_udpv4_cnt;
37*4882a593Smuzhiyun atomic_t active_udpv6_cnt;
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #ifdef CONFIG_RFS_ACCEL
41*4882a593Smuzhiyun int
42*4882a593Smuzhiyun ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb,
43*4882a593Smuzhiyun u16 rxq_idx, u32 flow_id);
44*4882a593Smuzhiyun void ice_clear_arfs(struct ice_vsi *vsi);
45*4882a593Smuzhiyun void ice_free_cpu_rx_rmap(struct ice_vsi *vsi);
46*4882a593Smuzhiyun void ice_init_arfs(struct ice_vsi *vsi);
47*4882a593Smuzhiyun void ice_sync_arfs_fltrs(struct ice_pf *pf);
48*4882a593Smuzhiyun int ice_set_cpu_rx_rmap(struct ice_vsi *vsi);
49*4882a593Smuzhiyun void ice_remove_arfs(struct ice_pf *pf);
50*4882a593Smuzhiyun void ice_rebuild_arfs(struct ice_pf *pf);
51*4882a593Smuzhiyun bool
52*4882a593Smuzhiyun ice_is_arfs_using_perfect_flow(struct ice_hw *hw,
53*4882a593Smuzhiyun enum ice_fltr_ptype flow_type);
54*4882a593Smuzhiyun #else
55*4882a593Smuzhiyun #define ice_sync_arfs_fltrs(pf) do {} while (0)
56*4882a593Smuzhiyun #define ice_init_arfs(vsi) do {} while (0)
57*4882a593Smuzhiyun #define ice_clear_arfs(vsi) do {} while (0)
58*4882a593Smuzhiyun #define ice_remove_arfs(pf) do {} while (0)
59*4882a593Smuzhiyun #define ice_free_cpu_rx_rmap(vsi) do {} while (0)
60*4882a593Smuzhiyun #define ice_rebuild_arfs(pf) do {} while (0)
61*4882a593Smuzhiyun
ice_set_cpu_rx_rmap(struct ice_vsi __always_unused * vsi)62*4882a593Smuzhiyun static inline int ice_set_cpu_rx_rmap(struct ice_vsi __always_unused *vsi)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun return 0;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun static inline int
ice_rx_flow_steer(struct net_device __always_unused * netdev,const struct sk_buff __always_unused * skb,u16 __always_unused rxq_idx,u32 __always_unused flow_id)68*4882a593Smuzhiyun ice_rx_flow_steer(struct net_device __always_unused *netdev,
69*4882a593Smuzhiyun const struct sk_buff __always_unused *skb,
70*4882a593Smuzhiyun u16 __always_unused rxq_idx, u32 __always_unused flow_id)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun return -EOPNOTSUPP;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun static inline bool
ice_is_arfs_using_perfect_flow(struct ice_hw __always_unused * hw,enum ice_fltr_ptype __always_unused flow_type)76*4882a593Smuzhiyun ice_is_arfs_using_perfect_flow(struct ice_hw __always_unused *hw,
77*4882a593Smuzhiyun enum ice_fltr_ptype __always_unused flow_type)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun return false;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun #endif /* CONFIG_RFS_ACCEL */
82*4882a593Smuzhiyun #endif /* _ICE_ARFS_H_ */
83