18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright (C) 2018-2020, Intel Corporation. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef _ICE_ARFS_H_
58c2ecf20Sopenharmony_ci#define _ICE_ARFS_H_
68c2ecf20Sopenharmony_cienum ice_arfs_fltr_state {
78c2ecf20Sopenharmony_ci	ICE_ARFS_INACTIVE,
88c2ecf20Sopenharmony_ci	ICE_ARFS_ACTIVE,
98c2ecf20Sopenharmony_ci	ICE_ARFS_TODEL,
108c2ecf20Sopenharmony_ci};
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistruct ice_arfs_entry {
138c2ecf20Sopenharmony_ci	struct ice_fdir_fltr fltr_info;
148c2ecf20Sopenharmony_ci	struct hlist_node list_entry;
158c2ecf20Sopenharmony_ci	u64 time_activated;	/* only valid for UDP flows */
168c2ecf20Sopenharmony_ci	u32 flow_id;
178c2ecf20Sopenharmony_ci	/* fltr_state = 0 - ICE_ARFS_INACTIVE:
188c2ecf20Sopenharmony_ci	 *	filter needs to be updated or programmed in HW.
198c2ecf20Sopenharmony_ci	 * fltr_state = 1 - ICE_ARFS_ACTIVE:
208c2ecf20Sopenharmony_ci	 *	filter is active and programmed in HW.
218c2ecf20Sopenharmony_ci	 * fltr_state = 2 - ICE_ARFS_TODEL:
228c2ecf20Sopenharmony_ci	 *	filter has been deleted from HW and needs to be removed from
238c2ecf20Sopenharmony_ci	 *	the aRFS hash table.
248c2ecf20Sopenharmony_ci	 */
258c2ecf20Sopenharmony_ci	u8 fltr_state;
268c2ecf20Sopenharmony_ci};
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistruct ice_arfs_entry_ptr {
298c2ecf20Sopenharmony_ci	struct ice_arfs_entry *arfs_entry;
308c2ecf20Sopenharmony_ci	struct hlist_node list_entry;
318c2ecf20Sopenharmony_ci};
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistruct ice_arfs_active_fltr_cntrs {
348c2ecf20Sopenharmony_ci	atomic_t active_tcpv4_cnt;
358c2ecf20Sopenharmony_ci	atomic_t active_tcpv6_cnt;
368c2ecf20Sopenharmony_ci	atomic_t active_udpv4_cnt;
378c2ecf20Sopenharmony_ci	atomic_t active_udpv6_cnt;
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci#ifdef CONFIG_RFS_ACCEL
418c2ecf20Sopenharmony_ciint
428c2ecf20Sopenharmony_ciice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb,
438c2ecf20Sopenharmony_ci		  u16 rxq_idx, u32 flow_id);
448c2ecf20Sopenharmony_civoid ice_clear_arfs(struct ice_vsi *vsi);
458c2ecf20Sopenharmony_civoid ice_free_cpu_rx_rmap(struct ice_vsi *vsi);
468c2ecf20Sopenharmony_civoid ice_init_arfs(struct ice_vsi *vsi);
478c2ecf20Sopenharmony_civoid ice_sync_arfs_fltrs(struct ice_pf *pf);
488c2ecf20Sopenharmony_ciint ice_set_cpu_rx_rmap(struct ice_vsi *vsi);
498c2ecf20Sopenharmony_civoid ice_remove_arfs(struct ice_pf *pf);
508c2ecf20Sopenharmony_civoid ice_rebuild_arfs(struct ice_pf *pf);
518c2ecf20Sopenharmony_cibool
528c2ecf20Sopenharmony_ciice_is_arfs_using_perfect_flow(struct ice_hw *hw,
538c2ecf20Sopenharmony_ci			       enum ice_fltr_ptype flow_type);
548c2ecf20Sopenharmony_ci#else
558c2ecf20Sopenharmony_ci#define ice_sync_arfs_fltrs(pf) do {} while (0)
568c2ecf20Sopenharmony_ci#define ice_init_arfs(vsi) do {} while (0)
578c2ecf20Sopenharmony_ci#define ice_clear_arfs(vsi) do {} while (0)
588c2ecf20Sopenharmony_ci#define ice_remove_arfs(pf) do {} while (0)
598c2ecf20Sopenharmony_ci#define ice_free_cpu_rx_rmap(vsi) do {} while (0)
608c2ecf20Sopenharmony_ci#define ice_rebuild_arfs(pf) do {} while (0)
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cistatic inline int ice_set_cpu_rx_rmap(struct ice_vsi __always_unused *vsi)
638c2ecf20Sopenharmony_ci{
648c2ecf20Sopenharmony_ci	return 0;
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistatic inline int
688c2ecf20Sopenharmony_ciice_rx_flow_steer(struct net_device __always_unused *netdev,
698c2ecf20Sopenharmony_ci		  const struct sk_buff __always_unused *skb,
708c2ecf20Sopenharmony_ci		  u16 __always_unused rxq_idx, u32 __always_unused flow_id)
718c2ecf20Sopenharmony_ci{
728c2ecf20Sopenharmony_ci	return -EOPNOTSUPP;
738c2ecf20Sopenharmony_ci}
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistatic inline bool
768c2ecf20Sopenharmony_ciice_is_arfs_using_perfect_flow(struct ice_hw __always_unused *hw,
778c2ecf20Sopenharmony_ci			       enum ice_fltr_ptype __always_unused flow_type)
788c2ecf20Sopenharmony_ci{
798c2ecf20Sopenharmony_ci	return false;
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci#endif /* CONFIG_RFS_ACCEL */
828c2ecf20Sopenharmony_ci#endif /* _ICE_ARFS_H_ */
83