128bf2672SBrett Creeley /* SPDX-License-Identifier: GPL-2.0 */
228bf2672SBrett Creeley /* Copyright (C) 2018-2020, Intel Corporation. */
328bf2672SBrett Creeley 
428bf2672SBrett Creeley #ifndef _ICE_ARFS_H_
528bf2672SBrett Creeley #define _ICE_ARFS_H_
6*649c87c6SJacob Keller 
7*649c87c6SJacob Keller #include "ice_fdir.h"
8*649c87c6SJacob Keller 
928bf2672SBrett Creeley enum ice_arfs_fltr_state {
1028bf2672SBrett Creeley 	ICE_ARFS_INACTIVE,
1128bf2672SBrett Creeley 	ICE_ARFS_ACTIVE,
1228bf2672SBrett Creeley 	ICE_ARFS_TODEL,
1328bf2672SBrett Creeley };
1428bf2672SBrett Creeley 
1528bf2672SBrett Creeley struct ice_arfs_entry {
1628bf2672SBrett Creeley 	struct ice_fdir_fltr fltr_info;
1728bf2672SBrett Creeley 	struct hlist_node list_entry;
1828bf2672SBrett Creeley 	u64 time_activated;	/* only valid for UDP flows */
1928bf2672SBrett Creeley 	u32 flow_id;
2028bf2672SBrett Creeley 	/* fltr_state = 0 - ICE_ARFS_INACTIVE:
2128bf2672SBrett Creeley 	 *	filter needs to be updated or programmed in HW.
2228bf2672SBrett Creeley 	 * fltr_state = 1 - ICE_ARFS_ACTIVE:
2328bf2672SBrett Creeley 	 *	filter is active and programmed in HW.
2428bf2672SBrett Creeley 	 * fltr_state = 2 - ICE_ARFS_TODEL:
2528bf2672SBrett Creeley 	 *	filter has been deleted from HW and needs to be removed from
2628bf2672SBrett Creeley 	 *	the aRFS hash table.
2728bf2672SBrett Creeley 	 */
2828bf2672SBrett Creeley 	u8 fltr_state;
2928bf2672SBrett Creeley };
3028bf2672SBrett Creeley 
3128bf2672SBrett Creeley struct ice_arfs_entry_ptr {
3228bf2672SBrett Creeley 	struct ice_arfs_entry *arfs_entry;
3328bf2672SBrett Creeley 	struct hlist_node list_entry;
3428bf2672SBrett Creeley };
3528bf2672SBrett Creeley 
3628bf2672SBrett Creeley struct ice_arfs_active_fltr_cntrs {
3728bf2672SBrett Creeley 	atomic_t active_tcpv4_cnt;
3828bf2672SBrett Creeley 	atomic_t active_tcpv6_cnt;
3928bf2672SBrett Creeley 	atomic_t active_udpv4_cnt;
4028bf2672SBrett Creeley 	atomic_t active_udpv6_cnt;
4128bf2672SBrett Creeley };
4228bf2672SBrett Creeley 
4328bf2672SBrett Creeley #ifdef CONFIG_RFS_ACCEL
4428bf2672SBrett Creeley int
4528bf2672SBrett Creeley ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb,
4628bf2672SBrett Creeley 		  u16 rxq_idx, u32 flow_id);
4728bf2672SBrett Creeley void ice_clear_arfs(struct ice_vsi *vsi);
4828bf2672SBrett Creeley void ice_free_cpu_rx_rmap(struct ice_vsi *vsi);
4928bf2672SBrett Creeley void ice_init_arfs(struct ice_vsi *vsi);
5028bf2672SBrett Creeley void ice_sync_arfs_fltrs(struct ice_pf *pf);
5128bf2672SBrett Creeley int ice_set_cpu_rx_rmap(struct ice_vsi *vsi);
5228bf2672SBrett Creeley void ice_remove_arfs(struct ice_pf *pf);
5328bf2672SBrett Creeley void ice_rebuild_arfs(struct ice_pf *pf);
5428bf2672SBrett Creeley bool
5528bf2672SBrett Creeley ice_is_arfs_using_perfect_flow(struct ice_hw *hw,
5628bf2672SBrett Creeley 			       enum ice_fltr_ptype flow_type);
5728bf2672SBrett Creeley #else
ice_clear_arfs(struct ice_vsi * vsi)5896cf4f68SJesse Brandeburg static inline void ice_clear_arfs(struct ice_vsi *vsi) { }
ice_free_cpu_rx_rmap(struct ice_vsi * vsi)5996cf4f68SJesse Brandeburg static inline void ice_free_cpu_rx_rmap(struct ice_vsi *vsi) { }
ice_init_arfs(struct ice_vsi * vsi)6096cf4f68SJesse Brandeburg static inline void ice_init_arfs(struct ice_vsi *vsi) { }
ice_sync_arfs_fltrs(struct ice_pf * pf)6196cf4f68SJesse Brandeburg static inline void ice_sync_arfs_fltrs(struct ice_pf *pf) { }
ice_remove_arfs(struct ice_pf * pf)6296cf4f68SJesse Brandeburg static inline void ice_remove_arfs(struct ice_pf *pf) { }
ice_rebuild_arfs(struct ice_pf * pf)6396cf4f68SJesse Brandeburg static inline void ice_rebuild_arfs(struct ice_pf *pf) { }
6428bf2672SBrett Creeley 
ice_set_cpu_rx_rmap(struct ice_vsi __always_unused * vsi)6528bf2672SBrett Creeley static inline int ice_set_cpu_rx_rmap(struct ice_vsi __always_unused *vsi)
6628bf2672SBrett Creeley {
6728bf2672SBrett Creeley 	return 0;
6828bf2672SBrett Creeley }
6928bf2672SBrett Creeley 
7028bf2672SBrett Creeley 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)7128bf2672SBrett Creeley ice_rx_flow_steer(struct net_device __always_unused *netdev,
7228bf2672SBrett Creeley 		  const struct sk_buff __always_unused *skb,
7328bf2672SBrett Creeley 		  u16 __always_unused rxq_idx, u32 __always_unused flow_id)
7428bf2672SBrett Creeley {
7528bf2672SBrett Creeley 	return -EOPNOTSUPP;
7628bf2672SBrett Creeley }
7728bf2672SBrett Creeley 
7828bf2672SBrett Creeley static inline bool
ice_is_arfs_using_perfect_flow(struct ice_hw __always_unused * hw,enum ice_fltr_ptype __always_unused flow_type)7928bf2672SBrett Creeley ice_is_arfs_using_perfect_flow(struct ice_hw __always_unused *hw,
8028bf2672SBrett Creeley 			       enum ice_fltr_ptype __always_unused flow_type)
8128bf2672SBrett Creeley {
8228bf2672SBrett Creeley 	return false;
8328bf2672SBrett Creeley }
8428bf2672SBrett Creeley #endif /* CONFIG_RFS_ACCEL */
8528bf2672SBrett Creeley #endif /* _ICE_ARFS_H_ */
86