xref: /linux/drivers/net/ethernet/intel/ice/ice_eswitch_br.h (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
1f6e8fb55SWojciech Drewek /* SPDX-License-Identifier: GPL-2.0 */
2f6e8fb55SWojciech Drewek /* Copyright (C) 2023, Intel Corporation. */
3f6e8fb55SWojciech Drewek 
4f6e8fb55SWojciech Drewek #ifndef _ICE_ESWITCH_BR_H_
5f6e8fb55SWojciech Drewek #define _ICE_ESWITCH_BR_H_
6f6e8fb55SWojciech Drewek 
77c945a1aSWojciech Drewek #include <linux/rhashtable.h>
8e42c6e0cSMichal Swiatkowski #include <linux/workqueue.h>
97c945a1aSWojciech Drewek 
107c945a1aSWojciech Drewek struct ice_esw_br_fdb_data {
117c945a1aSWojciech Drewek 	unsigned char addr[ETH_ALEN];
127c945a1aSWojciech Drewek 	u16 vid;
137c945a1aSWojciech Drewek };
147c945a1aSWojciech Drewek 
157c945a1aSWojciech Drewek struct ice_esw_br_flow {
167c945a1aSWojciech Drewek 	struct ice_rule_query_data *fwd_rule;
17bccd9bceSMarcin Szycik 	struct ice_rule_query_data *guard_rule;
187c945a1aSWojciech Drewek };
197c945a1aSWojciech Drewek 
207c945a1aSWojciech Drewek enum {
217c945a1aSWojciech Drewek 	ICE_ESWITCH_BR_FDB_ADDED_BY_USER = BIT(0),
227c945a1aSWojciech Drewek };
237c945a1aSWojciech Drewek 
247c945a1aSWojciech Drewek struct ice_esw_br_fdb_entry {
257c945a1aSWojciech Drewek 	struct ice_esw_br_fdb_data data;
267c945a1aSWojciech Drewek 	struct rhash_head ht_node;
277c945a1aSWojciech Drewek 	struct list_head list;
287c945a1aSWojciech Drewek 
297c945a1aSWojciech Drewek 	int flags;
307c945a1aSWojciech Drewek 
317c945a1aSWojciech Drewek 	struct net_device *dev;
327c945a1aSWojciech Drewek 	struct ice_esw_br_port *br_port;
337c945a1aSWojciech Drewek 	struct ice_esw_br_flow *flow;
34e42c6e0cSMichal Swiatkowski 
35e42c6e0cSMichal Swiatkowski 	unsigned long last_use;
367c945a1aSWojciech Drewek };
377c945a1aSWojciech Drewek 
38f6e8fb55SWojciech Drewek enum ice_esw_br_port_type {
39f6e8fb55SWojciech Drewek 	ICE_ESWITCH_BR_UPLINK_PORT = 0,
40f6e8fb55SWojciech Drewek 	ICE_ESWITCH_BR_VF_REPR_PORT = 1,
41f6e8fb55SWojciech Drewek };
42f6e8fb55SWojciech Drewek 
43f6e8fb55SWojciech Drewek struct ice_esw_br_port {
44f6e8fb55SWojciech Drewek 	struct ice_esw_br *bridge;
45f6e8fb55SWojciech Drewek 	struct ice_vsi *vsi;
46f6e8fb55SWojciech Drewek 	enum ice_esw_br_port_type type;
47f6e8fb55SWojciech Drewek 	u16 vsi_idx;
482946204bSMichal Swiatkowski 	u16 pvid;
49*639ac8ceSMichal Swiatkowski 	u32 repr_id;
50e9dda2cfSMarcin Szycik 	struct xarray vlans;
51e9dda2cfSMarcin Szycik };
52e9dda2cfSMarcin Szycik 
53e9dda2cfSMarcin Szycik enum {
54e9dda2cfSMarcin Szycik 	ICE_ESWITCH_BR_VLAN_FILTERING = BIT(0),
55f6e8fb55SWojciech Drewek };
56f6e8fb55SWojciech Drewek 
57f6e8fb55SWojciech Drewek struct ice_esw_br {
58f6e8fb55SWojciech Drewek 	struct ice_esw_br_offloads *br_offloads;
59f6e8fb55SWojciech Drewek 	struct xarray ports;
60f6e8fb55SWojciech Drewek 
617c945a1aSWojciech Drewek 	struct rhashtable fdb_ht;
627c945a1aSWojciech Drewek 	struct list_head fdb_list;
637c945a1aSWojciech Drewek 
64f6e8fb55SWojciech Drewek 	int ifindex;
65e9dda2cfSMarcin Szycik 	u32 flags;
66e42c6e0cSMichal Swiatkowski 	unsigned long ageing_time;
67f6e8fb55SWojciech Drewek };
68f6e8fb55SWojciech Drewek 
69f6e8fb55SWojciech Drewek struct ice_esw_br_offloads {
70f6e8fb55SWojciech Drewek 	struct ice_pf *pf;
71f6e8fb55SWojciech Drewek 	struct ice_esw_br *bridge;
72f6e8fb55SWojciech Drewek 	struct notifier_block netdev_nb;
73e9dda2cfSMarcin Szycik 	struct notifier_block switchdev_blk;
747c945a1aSWojciech Drewek 	struct notifier_block switchdev_nb;
757c945a1aSWojciech Drewek 
767c945a1aSWojciech Drewek 	struct workqueue_struct *wq;
77e42c6e0cSMichal Swiatkowski 	struct delayed_work update_work;
787c945a1aSWojciech Drewek };
797c945a1aSWojciech Drewek 
807c945a1aSWojciech Drewek struct ice_esw_br_fdb_work {
817c945a1aSWojciech Drewek 	struct work_struct work;
827c945a1aSWojciech Drewek 	struct switchdev_notifier_fdb_info fdb_info;
837c945a1aSWojciech Drewek 	struct net_device *dev;
847c945a1aSWojciech Drewek 	unsigned long event;
85f6e8fb55SWojciech Drewek };
86f6e8fb55SWojciech Drewek 
87e9dda2cfSMarcin Szycik struct ice_esw_br_vlan {
88e9dda2cfSMarcin Szycik 	u16 vid;
89e9dda2cfSMarcin Szycik 	u16 flags;
90e9dda2cfSMarcin Szycik };
91e9dda2cfSMarcin Szycik 
92f6e8fb55SWojciech Drewek #define ice_nb_to_br_offloads(nb, nb_name) \
93f6e8fb55SWojciech Drewek 	container_of(nb, \
94f6e8fb55SWojciech Drewek 		     struct ice_esw_br_offloads, \
95f6e8fb55SWojciech Drewek 		     nb_name)
96f6e8fb55SWojciech Drewek 
97e42c6e0cSMichal Swiatkowski #define ice_work_to_br_offloads(w) \
98e42c6e0cSMichal Swiatkowski 	container_of(w, \
99e42c6e0cSMichal Swiatkowski 		     struct ice_esw_br_offloads, \
100e42c6e0cSMichal Swiatkowski 		     update_work.work)
101e42c6e0cSMichal Swiatkowski 
1027c945a1aSWojciech Drewek #define ice_work_to_fdb_work(w) \
1037c945a1aSWojciech Drewek 	container_of(w, \
1047c945a1aSWojciech Drewek 		     struct ice_esw_br_fdb_work, \
1057c945a1aSWojciech Drewek 		     work)
1067c945a1aSWojciech Drewek 
ice_eswitch_br_is_vid_valid(u16 vid)107e9dda2cfSMarcin Szycik static inline bool ice_eswitch_br_is_vid_valid(u16 vid)
108e9dda2cfSMarcin Szycik {
109e9dda2cfSMarcin Szycik 	/* In trunk VLAN mode, for untagged traffic the bridge sends requests
110e9dda2cfSMarcin Szycik 	 * to offload VLAN 1 with pvid and untagged flags set. Since these
111e9dda2cfSMarcin Szycik 	 * flags are not supported, add a MAC filter instead.
112e9dda2cfSMarcin Szycik 	 */
113e9dda2cfSMarcin Szycik 	return vid > 1;
114e9dda2cfSMarcin Szycik }
115e9dda2cfSMarcin Szycik 
116f6e8fb55SWojciech Drewek void
117f6e8fb55SWojciech Drewek ice_eswitch_br_offloads_deinit(struct ice_pf *pf);
118f6e8fb55SWojciech Drewek int
119f6e8fb55SWojciech Drewek ice_eswitch_br_offloads_init(struct ice_pf *pf);
120f6e8fb55SWojciech Drewek 
121f6e8fb55SWojciech Drewek #endif /* _ICE_ESWITCH_BR_H_ */
122