162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (C) 2018-2020, Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _ICE_ARFS_H_
562306a36Sopenharmony_ci#define _ICE_ARFS_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "ice_fdir.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cienum ice_arfs_fltr_state {
1062306a36Sopenharmony_ci	ICE_ARFS_INACTIVE,
1162306a36Sopenharmony_ci	ICE_ARFS_ACTIVE,
1262306a36Sopenharmony_ci	ICE_ARFS_TODEL,
1362306a36Sopenharmony_ci};
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct ice_arfs_entry {
1662306a36Sopenharmony_ci	struct ice_fdir_fltr fltr_info;
1762306a36Sopenharmony_ci	struct hlist_node list_entry;
1862306a36Sopenharmony_ci	u64 time_activated;	/* only valid for UDP flows */
1962306a36Sopenharmony_ci	u32 flow_id;
2062306a36Sopenharmony_ci	/* fltr_state = 0 - ICE_ARFS_INACTIVE:
2162306a36Sopenharmony_ci	 *	filter needs to be updated or programmed in HW.
2262306a36Sopenharmony_ci	 * fltr_state = 1 - ICE_ARFS_ACTIVE:
2362306a36Sopenharmony_ci	 *	filter is active and programmed in HW.
2462306a36Sopenharmony_ci	 * fltr_state = 2 - ICE_ARFS_TODEL:
2562306a36Sopenharmony_ci	 *	filter has been deleted from HW and needs to be removed from
2662306a36Sopenharmony_ci	 *	the aRFS hash table.
2762306a36Sopenharmony_ci	 */
2862306a36Sopenharmony_ci	u8 fltr_state;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct ice_arfs_entry_ptr {
3262306a36Sopenharmony_ci	struct ice_arfs_entry *arfs_entry;
3362306a36Sopenharmony_ci	struct hlist_node list_entry;
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistruct ice_arfs_active_fltr_cntrs {
3762306a36Sopenharmony_ci	atomic_t active_tcpv4_cnt;
3862306a36Sopenharmony_ci	atomic_t active_tcpv6_cnt;
3962306a36Sopenharmony_ci	atomic_t active_udpv4_cnt;
4062306a36Sopenharmony_ci	atomic_t active_udpv6_cnt;
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#ifdef CONFIG_RFS_ACCEL
4462306a36Sopenharmony_ciint
4562306a36Sopenharmony_ciice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb,
4662306a36Sopenharmony_ci		  u16 rxq_idx, u32 flow_id);
4762306a36Sopenharmony_civoid ice_clear_arfs(struct ice_vsi *vsi);
4862306a36Sopenharmony_civoid ice_free_cpu_rx_rmap(struct ice_vsi *vsi);
4962306a36Sopenharmony_civoid ice_init_arfs(struct ice_vsi *vsi);
5062306a36Sopenharmony_civoid ice_sync_arfs_fltrs(struct ice_pf *pf);
5162306a36Sopenharmony_ciint ice_set_cpu_rx_rmap(struct ice_vsi *vsi);
5262306a36Sopenharmony_civoid ice_remove_arfs(struct ice_pf *pf);
5362306a36Sopenharmony_civoid ice_rebuild_arfs(struct ice_pf *pf);
5462306a36Sopenharmony_cibool
5562306a36Sopenharmony_ciice_is_arfs_using_perfect_flow(struct ice_hw *hw,
5662306a36Sopenharmony_ci			       enum ice_fltr_ptype flow_type);
5762306a36Sopenharmony_ci#else
5862306a36Sopenharmony_cistatic inline void ice_clear_arfs(struct ice_vsi *vsi) { }
5962306a36Sopenharmony_cistatic inline void ice_free_cpu_rx_rmap(struct ice_vsi *vsi) { }
6062306a36Sopenharmony_cistatic inline void ice_init_arfs(struct ice_vsi *vsi) { }
6162306a36Sopenharmony_cistatic inline void ice_sync_arfs_fltrs(struct ice_pf *pf) { }
6262306a36Sopenharmony_cistatic inline void ice_remove_arfs(struct ice_pf *pf) { }
6362306a36Sopenharmony_cistatic inline void ice_rebuild_arfs(struct ice_pf *pf) { }
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline int ice_set_cpu_rx_rmap(struct ice_vsi __always_unused *vsi)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	return 0;
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistatic inline int
7162306a36Sopenharmony_ciice_rx_flow_steer(struct net_device __always_unused *netdev,
7262306a36Sopenharmony_ci		  const struct sk_buff __always_unused *skb,
7362306a36Sopenharmony_ci		  u16 __always_unused rxq_idx, u32 __always_unused flow_id)
7462306a36Sopenharmony_ci{
7562306a36Sopenharmony_ci	return -EOPNOTSUPP;
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic inline bool
7962306a36Sopenharmony_ciice_is_arfs_using_perfect_flow(struct ice_hw __always_unused *hw,
8062306a36Sopenharmony_ci			       enum ice_fltr_ptype __always_unused flow_type)
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	return false;
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci#endif /* CONFIG_RFS_ACCEL */
8562306a36Sopenharmony_ci#endif /* _ICE_ARFS_H_ */
86