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_
628bf2672SBrett Creeley enum ice_arfs_fltr_state {
728bf2672SBrett Creeley 	ICE_ARFS_INACTIVE,
828bf2672SBrett Creeley 	ICE_ARFS_ACTIVE,
928bf2672SBrett Creeley 	ICE_ARFS_TODEL,
1028bf2672SBrett Creeley };
1128bf2672SBrett Creeley 
1228bf2672SBrett Creeley struct ice_arfs_entry {
1328bf2672SBrett Creeley 	struct ice_fdir_fltr fltr_info;
1428bf2672SBrett Creeley 	struct hlist_node list_entry;
1528bf2672SBrett Creeley 	u64 time_activated;	/* only valid for UDP flows */
1628bf2672SBrett Creeley 	u32 flow_id;
1728bf2672SBrett Creeley 	/* fltr_state = 0 - ICE_ARFS_INACTIVE:
1828bf2672SBrett Creeley 	 *	filter needs to be updated or programmed in HW.
1928bf2672SBrett Creeley 	 * fltr_state = 1 - ICE_ARFS_ACTIVE:
2028bf2672SBrett Creeley 	 *	filter is active and programmed in HW.
2128bf2672SBrett Creeley 	 * fltr_state = 2 - ICE_ARFS_TODEL:
2228bf2672SBrett Creeley 	 *	filter has been deleted from HW and needs to be removed from
2328bf2672SBrett Creeley 	 *	the aRFS hash table.
2428bf2672SBrett Creeley 	 */
2528bf2672SBrett Creeley 	u8 fltr_state;
2628bf2672SBrett Creeley };
2728bf2672SBrett Creeley 
2828bf2672SBrett Creeley struct ice_arfs_entry_ptr {
2928bf2672SBrett Creeley 	struct ice_arfs_entry *arfs_entry;
3028bf2672SBrett Creeley 	struct hlist_node list_entry;
3128bf2672SBrett Creeley };
3228bf2672SBrett Creeley 
3328bf2672SBrett Creeley struct ice_arfs_active_fltr_cntrs {
3428bf2672SBrett Creeley 	atomic_t active_tcpv4_cnt;
3528bf2672SBrett Creeley 	atomic_t active_tcpv6_cnt;
3628bf2672SBrett Creeley 	atomic_t active_udpv4_cnt;
3728bf2672SBrett Creeley 	atomic_t active_udpv6_cnt;
3828bf2672SBrett Creeley };
3928bf2672SBrett Creeley 
4028bf2672SBrett Creeley #ifdef CONFIG_RFS_ACCEL
4128bf2672SBrett Creeley int
4228bf2672SBrett Creeley ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb,
4328bf2672SBrett Creeley 		  u16 rxq_idx, u32 flow_id);
4428bf2672SBrett Creeley void ice_clear_arfs(struct ice_vsi *vsi);
4528bf2672SBrett Creeley void ice_free_cpu_rx_rmap(struct ice_vsi *vsi);
4628bf2672SBrett Creeley void ice_init_arfs(struct ice_vsi *vsi);
4728bf2672SBrett Creeley void ice_sync_arfs_fltrs(struct ice_pf *pf);
4828bf2672SBrett Creeley int ice_set_cpu_rx_rmap(struct ice_vsi *vsi);
4928bf2672SBrett Creeley void ice_remove_arfs(struct ice_pf *pf);
5028bf2672SBrett Creeley void ice_rebuild_arfs(struct ice_pf *pf);
5128bf2672SBrett Creeley bool
5228bf2672SBrett Creeley ice_is_arfs_using_perfect_flow(struct ice_hw *hw,
5328bf2672SBrett Creeley 			       enum ice_fltr_ptype flow_type);
5428bf2672SBrett Creeley #else
5528bf2672SBrett Creeley #define ice_sync_arfs_fltrs(pf) do {} while (0)
5628bf2672SBrett Creeley #define ice_init_arfs(vsi) do {} while (0)
5728bf2672SBrett Creeley #define ice_clear_arfs(vsi) do {} while (0)
5828bf2672SBrett Creeley #define ice_remove_arfs(pf) do {} while (0)
5928bf2672SBrett Creeley #define ice_free_cpu_rx_rmap(vsi) do {} while (0)
6028bf2672SBrett Creeley #define ice_rebuild_arfs(pf) do {} while (0)
6128bf2672SBrett Creeley 
6228bf2672SBrett Creeley static inline int ice_set_cpu_rx_rmap(struct ice_vsi __always_unused *vsi)
6328bf2672SBrett Creeley {
6428bf2672SBrett Creeley 	return 0;
6528bf2672SBrett Creeley }
6628bf2672SBrett Creeley 
6728bf2672SBrett Creeley static inline int
6828bf2672SBrett Creeley ice_rx_flow_steer(struct net_device __always_unused *netdev,
6928bf2672SBrett Creeley 		  const struct sk_buff __always_unused *skb,
7028bf2672SBrett Creeley 		  u16 __always_unused rxq_idx, u32 __always_unused flow_id)
7128bf2672SBrett Creeley {
7228bf2672SBrett Creeley 	return -EOPNOTSUPP;
7328bf2672SBrett Creeley }
7428bf2672SBrett Creeley 
7528bf2672SBrett Creeley static inline bool
7628bf2672SBrett Creeley ice_is_arfs_using_perfect_flow(struct ice_hw __always_unused *hw,
7728bf2672SBrett Creeley 			       enum ice_fltr_ptype __always_unused flow_type)
7828bf2672SBrett Creeley {
7928bf2672SBrett Creeley 	return false;
8028bf2672SBrett Creeley }
8128bf2672SBrett Creeley #endif /* CONFIG_RFS_ACCEL */
8228bf2672SBrett Creeley #endif /* _ICE_ARFS_H_ */
83