1501ef306SVadym Kochan /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2501ef306SVadym Kochan /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
3501ef306SVadym Kochan 
4501ef306SVadym Kochan #ifndef _PRESTERA_H_
5501ef306SVadym Kochan #define _PRESTERA_H_
6501ef306SVadym Kochan 
7501ef306SVadym Kochan #include <linux/notifier.h>
8501ef306SVadym Kochan #include <linux/skbuff.h>
9501ef306SVadym Kochan #include <linux/workqueue.h>
1052323ef7SOleksandr Mazur #include <linux/phylink.h>
1134dd1710SVadym Kochan #include <net/devlink.h>
12501ef306SVadym Kochan #include <uapi/linux/if_ether.h>
13501ef306SVadym Kochan 
1434dd1710SVadym Kochan #define PRESTERA_DRV_NAME	"prestera"
1534dd1710SVadym Kochan 
16e1189d9aSVadym Kochan #define PRESTERA_DEFAULT_VID    1
17e1189d9aSVadym Kochan 
18501ef306SVadym Kochan struct prestera_fw_rev {
19501ef306SVadym Kochan 	u16 maj;
20501ef306SVadym Kochan 	u16 min;
21501ef306SVadym Kochan 	u16 sub;
22501ef306SVadym Kochan };
23501ef306SVadym Kochan 
24fec7c9c7SOleksandr Mazur struct prestera_flood_domain {
25fec7c9c7SOleksandr Mazur 	struct prestera_switch *sw;
26fec7c9c7SOleksandr Mazur 	struct list_head flood_domain_port_list;
27fec7c9c7SOleksandr Mazur 	u32 idx;
28fec7c9c7SOleksandr Mazur };
29fec7c9c7SOleksandr Mazur 
30fec7c9c7SOleksandr Mazur struct prestera_mdb_entry {
31fec7c9c7SOleksandr Mazur 	struct prestera_switch *sw;
32fec7c9c7SOleksandr Mazur 	struct prestera_flood_domain *flood_domain;
33fec7c9c7SOleksandr Mazur 	unsigned char addr[ETH_ALEN];
34fec7c9c7SOleksandr Mazur 	u16 vid;
35fec7c9c7SOleksandr Mazur };
36fec7c9c7SOleksandr Mazur 
37fec7c9c7SOleksandr Mazur struct prestera_flood_domain_port {
38fec7c9c7SOleksandr Mazur 	struct prestera_flood_domain *flood_domain;
39fec7c9c7SOleksandr Mazur 	struct net_device *dev;
40fec7c9c7SOleksandr Mazur 	struct list_head flood_domain_port_node;
41fec7c9c7SOleksandr Mazur 	u16 vid;
42fec7c9c7SOleksandr Mazur };
43fec7c9c7SOleksandr Mazur 
44501ef306SVadym Kochan struct prestera_port_stats {
45501ef306SVadym Kochan 	u64 good_octets_received;
46501ef306SVadym Kochan 	u64 bad_octets_received;
47501ef306SVadym Kochan 	u64 mac_trans_error;
48501ef306SVadym Kochan 	u64 broadcast_frames_received;
49501ef306SVadym Kochan 	u64 multicast_frames_received;
50501ef306SVadym Kochan 	u64 frames_64_octets;
51501ef306SVadym Kochan 	u64 frames_65_to_127_octets;
52501ef306SVadym Kochan 	u64 frames_128_to_255_octets;
53501ef306SVadym Kochan 	u64 frames_256_to_511_octets;
54501ef306SVadym Kochan 	u64 frames_512_to_1023_octets;
55501ef306SVadym Kochan 	u64 frames_1024_to_max_octets;
56501ef306SVadym Kochan 	u64 excessive_collision;
57501ef306SVadym Kochan 	u64 multicast_frames_sent;
58501ef306SVadym Kochan 	u64 broadcast_frames_sent;
59501ef306SVadym Kochan 	u64 fc_sent;
60501ef306SVadym Kochan 	u64 fc_received;
61501ef306SVadym Kochan 	u64 buffer_overrun;
62501ef306SVadym Kochan 	u64 undersize;
63501ef306SVadym Kochan 	u64 fragments;
64501ef306SVadym Kochan 	u64 oversize;
65501ef306SVadym Kochan 	u64 jabber;
66501ef306SVadym Kochan 	u64 rx_error_frame_received;
67501ef306SVadym Kochan 	u64 bad_crc;
68501ef306SVadym Kochan 	u64 collisions;
69501ef306SVadym Kochan 	u64 late_collision;
70501ef306SVadym Kochan 	u64 unicast_frames_received;
71501ef306SVadym Kochan 	u64 unicast_frames_sent;
72501ef306SVadym Kochan 	u64 sent_multiple;
73501ef306SVadym Kochan 	u64 sent_deferred;
74501ef306SVadym Kochan 	u64 good_octets_sent;
75501ef306SVadym Kochan };
76501ef306SVadym Kochan 
77bb5dbf2cSVolodymyr Mytnyk #define PRESTERA_AP_PORT_MAX   (10)
78bb5dbf2cSVolodymyr Mytnyk 
79501ef306SVadym Kochan struct prestera_port_caps {
80501ef306SVadym Kochan 	u64 supp_link_modes;
81501ef306SVadym Kochan 	u8 supp_fec;
82501ef306SVadym Kochan 	u8 type;
83501ef306SVadym Kochan 	u8 transceiver;
84501ef306SVadym Kochan };
85501ef306SVadym Kochan 
86255213caSSerhiy Boiko struct prestera_lag {
87255213caSSerhiy Boiko 	struct net_device *dev;
88255213caSSerhiy Boiko 	struct list_head members;
89255213caSSerhiy Boiko 	u16 member_count;
90255213caSSerhiy Boiko 	u16 lag_id;
91255213caSSerhiy Boiko };
92255213caSSerhiy Boiko 
938b474a9fSSerhiy Boiko struct prestera_flow_block;
948b474a9fSSerhiy Boiko 
95bb5dbf2cSVolodymyr Mytnyk struct prestera_port_mac_state {
9652323ef7SOleksandr Mazur 	bool valid;
97bb5dbf2cSVolodymyr Mytnyk 	u32 mode;
98bb5dbf2cSVolodymyr Mytnyk 	u32 speed;
99bb5dbf2cSVolodymyr Mytnyk 	bool oper;
100bb5dbf2cSVolodymyr Mytnyk 	u8 duplex;
101bb5dbf2cSVolodymyr Mytnyk 	u8 fc;
102bb5dbf2cSVolodymyr Mytnyk 	u8 fec;
103bb5dbf2cSVolodymyr Mytnyk };
104bb5dbf2cSVolodymyr Mytnyk 
105bb5dbf2cSVolodymyr Mytnyk struct prestera_port_phy_state {
106bb5dbf2cSVolodymyr Mytnyk 	u64 lmode_bmap;
107bb5dbf2cSVolodymyr Mytnyk 	struct {
108bb5dbf2cSVolodymyr Mytnyk 		bool pause;
109bb5dbf2cSVolodymyr Mytnyk 		bool asym_pause;
110bb5dbf2cSVolodymyr Mytnyk 	} remote_fc;
111bb5dbf2cSVolodymyr Mytnyk 	u8 mdix;
112bb5dbf2cSVolodymyr Mytnyk };
113bb5dbf2cSVolodymyr Mytnyk 
114bb5dbf2cSVolodymyr Mytnyk struct prestera_port_mac_config {
115bb5dbf2cSVolodymyr Mytnyk 	u32 mode;
116bb5dbf2cSVolodymyr Mytnyk 	u32 speed;
117bb5dbf2cSVolodymyr Mytnyk 	bool admin;
118bb5dbf2cSVolodymyr Mytnyk 	u8 inband;
119bb5dbf2cSVolodymyr Mytnyk 	u8 duplex;
120bb5dbf2cSVolodymyr Mytnyk 	u8 fec;
121bb5dbf2cSVolodymyr Mytnyk };
122bb5dbf2cSVolodymyr Mytnyk 
123bb5dbf2cSVolodymyr Mytnyk struct prestera_port_phy_config {
124bb5dbf2cSVolodymyr Mytnyk 	u32 mode;
125bb5dbf2cSVolodymyr Mytnyk 	bool admin;
126bb5dbf2cSVolodymyr Mytnyk 	u8 mdix;
127bb5dbf2cSVolodymyr Mytnyk };
128bb5dbf2cSVolodymyr Mytnyk 
129501ef306SVadym Kochan struct prestera_port {
130501ef306SVadym Kochan 	struct net_device *dev;
131501ef306SVadym Kochan 	struct prestera_switch *sw;
132702e7014SMaksym Glubokiy 	struct prestera_flow_block *ingress_flow_block;
133702e7014SMaksym Glubokiy 	struct prestera_flow_block *egress_flow_block;
13434dd1710SVadym Kochan 	struct devlink_port dl_port;
135255213caSSerhiy Boiko 	struct list_head lag_member;
136255213caSSerhiy Boiko 	struct prestera_lag *lag;
137501ef306SVadym Kochan 	u32 id;
138501ef306SVadym Kochan 	u32 hw_id;
139501ef306SVadym Kochan 	u32 dev_id;
140501ef306SVadym Kochan 	u16 fp_id;
141e1189d9aSVadym Kochan 	u16 pvid;
142501ef306SVadym Kochan 	bool autoneg;
143501ef306SVadym Kochan 	u64 adver_link_modes;
144501ef306SVadym Kochan 	u8 adver_fec;
145501ef306SVadym Kochan 	struct prestera_port_caps caps;
146501ef306SVadym Kochan 	struct list_head list;
147e1189d9aSVadym Kochan 	struct list_head vlans_list;
148501ef306SVadym Kochan 	struct {
149501ef306SVadym Kochan 		struct prestera_port_stats stats;
150501ef306SVadym Kochan 		struct delayed_work caching_dw;
151501ef306SVadym Kochan 	} cached_hw_stats;
152bb5dbf2cSVolodymyr Mytnyk 	struct prestera_port_mac_config cfg_mac;
153bb5dbf2cSVolodymyr Mytnyk 	struct prestera_port_phy_config cfg_phy;
154bb5dbf2cSVolodymyr Mytnyk 	struct prestera_port_mac_state state_mac;
155bb5dbf2cSVolodymyr Mytnyk 	struct prestera_port_phy_state state_phy;
15652323ef7SOleksandr Mazur 
15752323ef7SOleksandr Mazur 	struct phylink_config phy_config;
15852323ef7SOleksandr Mazur 	struct phylink *phy_link;
15952323ef7SOleksandr Mazur 	struct phylink_pcs phylink_pcs;
16052323ef7SOleksandr Mazur 
16152323ef7SOleksandr Mazur 	/* protects state_mac */
16252323ef7SOleksandr Mazur 	spinlock_t state_mac_lock;
163501ef306SVadym Kochan };
164501ef306SVadym Kochan 
165501ef306SVadym Kochan struct prestera_device {
166501ef306SVadym Kochan 	struct device *dev;
167501ef306SVadym Kochan 	u8 __iomem *ctl_regs;
168501ef306SVadym Kochan 	u8 __iomem *pp_regs;
169501ef306SVadym Kochan 	struct prestera_fw_rev fw_rev;
170501ef306SVadym Kochan 	void *priv;
171501ef306SVadym Kochan 
172501ef306SVadym Kochan 	/* called by device driver to handle received packets */
173501ef306SVadym Kochan 	void (*recv_pkt)(struct prestera_device *dev);
174501ef306SVadym Kochan 
175501ef306SVadym Kochan 	/* called by device driver to pass event up to the higher layer */
176501ef306SVadym Kochan 	int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size);
177501ef306SVadym Kochan 
178501ef306SVadym Kochan 	/* called by higher layer to send request to the firmware */
179bb5dbf2cSVolodymyr Mytnyk 	int (*send_req)(struct prestera_device *dev, int qid, void *in_msg,
180501ef306SVadym Kochan 			size_t in_size, void *out_msg, size_t out_size,
181501ef306SVadym Kochan 			unsigned int wait);
182501ef306SVadym Kochan };
183501ef306SVadym Kochan 
184501ef306SVadym Kochan enum prestera_event_type {
185501ef306SVadym Kochan 	PRESTERA_EVENT_TYPE_UNSPEC,
186501ef306SVadym Kochan 
187501ef306SVadym Kochan 	PRESTERA_EVENT_TYPE_PORT,
188e1189d9aSVadym Kochan 	PRESTERA_EVENT_TYPE_FDB,
189501ef306SVadym Kochan 	PRESTERA_EVENT_TYPE_RXTX,
190501ef306SVadym Kochan 
191501ef306SVadym Kochan 	PRESTERA_EVENT_TYPE_MAX
192501ef306SVadym Kochan };
193501ef306SVadym Kochan 
194501ef306SVadym Kochan enum prestera_rxtx_event_id {
195501ef306SVadym Kochan 	PRESTERA_RXTX_EVENT_UNSPEC,
196501ef306SVadym Kochan 	PRESTERA_RXTX_EVENT_RCV_PKT,
197501ef306SVadym Kochan };
198501ef306SVadym Kochan 
199501ef306SVadym Kochan enum prestera_port_event_id {
200501ef306SVadym Kochan 	PRESTERA_PORT_EVENT_UNSPEC,
201bb5dbf2cSVolodymyr Mytnyk 	PRESTERA_PORT_EVENT_MAC_STATE_CHANGED,
202501ef306SVadym Kochan };
203501ef306SVadym Kochan 
204501ef306SVadym Kochan struct prestera_port_event {
205501ef306SVadym Kochan 	u32 port_id;
206501ef306SVadym Kochan 	union {
207bb5dbf2cSVolodymyr Mytnyk 		struct {
208bb5dbf2cSVolodymyr Mytnyk 			u32 mode;
209bb5dbf2cSVolodymyr Mytnyk 			u32 speed;
210bb5dbf2cSVolodymyr Mytnyk 			u8 oper;
211bb5dbf2cSVolodymyr Mytnyk 			u8 duplex;
212bb5dbf2cSVolodymyr Mytnyk 			u8 fc;
213bb5dbf2cSVolodymyr Mytnyk 			u8 fec;
214bb5dbf2cSVolodymyr Mytnyk 		} mac;
215bb5dbf2cSVolodymyr Mytnyk 		struct {
216bb5dbf2cSVolodymyr Mytnyk 			u64 lmode_bmap;
217bb5dbf2cSVolodymyr Mytnyk 			struct {
218bb5dbf2cSVolodymyr Mytnyk 				bool pause;
219bb5dbf2cSVolodymyr Mytnyk 				bool asym_pause;
220bb5dbf2cSVolodymyr Mytnyk 			} remote_fc;
221bb5dbf2cSVolodymyr Mytnyk 			u8 mdix;
222bb5dbf2cSVolodymyr Mytnyk 		} phy;
223501ef306SVadym Kochan 	} data;
224501ef306SVadym Kochan };
225501ef306SVadym Kochan 
226255213caSSerhiy Boiko enum prestera_fdb_entry_type {
227255213caSSerhiy Boiko 	PRESTERA_FDB_ENTRY_TYPE_REG_PORT,
228255213caSSerhiy Boiko 	PRESTERA_FDB_ENTRY_TYPE_LAG,
229255213caSSerhiy Boiko 	PRESTERA_FDB_ENTRY_TYPE_MAX
230255213caSSerhiy Boiko };
231255213caSSerhiy Boiko 
232e1189d9aSVadym Kochan enum prestera_fdb_event_id {
233e1189d9aSVadym Kochan 	PRESTERA_FDB_EVENT_UNSPEC,
234e1189d9aSVadym Kochan 	PRESTERA_FDB_EVENT_LEARNED,
235e1189d9aSVadym Kochan 	PRESTERA_FDB_EVENT_AGED,
236e1189d9aSVadym Kochan };
237e1189d9aSVadym Kochan 
238e1189d9aSVadym Kochan struct prestera_fdb_event {
239255213caSSerhiy Boiko 	enum prestera_fdb_entry_type type;
240255213caSSerhiy Boiko 	union {
241e1189d9aSVadym Kochan 		u32 port_id;
242255213caSSerhiy Boiko 		u16 lag_id;
243255213caSSerhiy Boiko 	} dest;
244e1189d9aSVadym Kochan 	u32 vid;
245e1189d9aSVadym Kochan 	union {
246e1189d9aSVadym Kochan 		u8 mac[ETH_ALEN];
247e1189d9aSVadym Kochan 	} data;
248e1189d9aSVadym Kochan };
249e1189d9aSVadym Kochan 
250501ef306SVadym Kochan struct prestera_event {
251501ef306SVadym Kochan 	u16 id;
252501ef306SVadym Kochan 	union {
253501ef306SVadym Kochan 		struct prestera_port_event port_evt;
254e1189d9aSVadym Kochan 		struct prestera_fdb_event fdb_evt;
255501ef306SVadym Kochan 	};
256501ef306SVadym Kochan };
257501ef306SVadym Kochan 
2580f07bd6bSYevhen Orlov enum prestera_if_type {
2590f07bd6bSYevhen Orlov 	/* the interface is of port type (dev,port) */
2600f07bd6bSYevhen Orlov 	PRESTERA_IF_PORT_E = 0,
2610f07bd6bSYevhen Orlov 
2620f07bd6bSYevhen Orlov 	/* the interface is of lag type (lag-id) */
2630f07bd6bSYevhen Orlov 	PRESTERA_IF_LAG_E = 1,
2640f07bd6bSYevhen Orlov 
2650f07bd6bSYevhen Orlov 	/* the interface is of Vid type (vlan-id) */
2660f07bd6bSYevhen Orlov 	PRESTERA_IF_VID_E = 3,
2670f07bd6bSYevhen Orlov };
2680f07bd6bSYevhen Orlov 
2690f07bd6bSYevhen Orlov struct prestera_iface {
2700f07bd6bSYevhen Orlov 	enum prestera_if_type type;
2710f07bd6bSYevhen Orlov 	struct {
2720f07bd6bSYevhen Orlov 		u32 hw_dev_num;
2730f07bd6bSYevhen Orlov 		u32 port_num;
2740f07bd6bSYevhen Orlov 	} dev_port;
2750f07bd6bSYevhen Orlov 	u32 hw_dev_num;
2760f07bd6bSYevhen Orlov 	u16 vr_id;
2770f07bd6bSYevhen Orlov 	u16 lag_id;
2780f07bd6bSYevhen Orlov 	u16 vlan_id;
2790f07bd6bSYevhen Orlov };
2800f07bd6bSYevhen Orlov 
281e1189d9aSVadym Kochan struct prestera_switchdev;
28213defa27SSerhiy Boiko struct prestera_span;
283501ef306SVadym Kochan struct prestera_rxtx;
2840a9003f4SOleksandr Mazur struct prestera_trap_data;
2858b474a9fSSerhiy Boiko struct prestera_acl;
286501ef306SVadym Kochan 
287501ef306SVadym Kochan struct prestera_switch {
288501ef306SVadym Kochan 	struct prestera_device *dev;
289e1189d9aSVadym Kochan 	struct prestera_switchdev *swdev;
290501ef306SVadym Kochan 	struct prestera_rxtx *rxtx;
2918b474a9fSSerhiy Boiko 	struct prestera_acl *acl;
29213defa27SSerhiy Boiko 	struct prestera_span *span;
293501ef306SVadym Kochan 	struct list_head event_handlers;
294e1189d9aSVadym Kochan 	struct notifier_block netdev_nb;
2950a9003f4SOleksandr Mazur 	struct prestera_trap_data *trap_data;
296501ef306SVadym Kochan 	char base_mac[ETH_ALEN];
297501ef306SVadym Kochan 	struct list_head port_list;
298501ef306SVadym Kochan 	rwlock_t port_list_lock;
299501ef306SVadym Kochan 	u32 port_count;
300501ef306SVadym Kochan 	u32 mtu_min;
301501ef306SVadym Kochan 	u32 mtu_max;
302501ef306SVadym Kochan 	u8 id;
30352323ef7SOleksandr Mazur 	struct device_node *np;
30469204174SYevhen Orlov 	struct prestera_router *router;
305255213caSSerhiy Boiko 	struct prestera_lag *lags;
3066e36c7bcSVolodymyr Mytnyk 	struct prestera_counter *counter;
307255213caSSerhiy Boiko 	u8 lag_member_max;
308255213caSSerhiy Boiko 	u8 lag_max;
3090a23ae23SYevhen Orlov 	u32 size_tbl_router_nexthop;
310501ef306SVadym Kochan };
311501ef306SVadym Kochan 
31269204174SYevhen Orlov struct prestera_router {
31369204174SYevhen Orlov 	struct prestera_switch *sw;
31469204174SYevhen Orlov 	struct list_head vr_list;
31569204174SYevhen Orlov 	struct list_head rif_entry_list;
3160a23ae23SYevhen Orlov 	struct rhashtable nh_neigh_ht;
3170a23ae23SYevhen Orlov 	struct rhashtable nexthop_group_ht;
31816de3db1SYevhen Orlov 	struct rhashtable fib_ht;
319396b80cbSYevhen Orlov 	struct rhashtable kern_neigh_cache_ht;
3204394fbcbSYevhen Orlov 	struct rhashtable kern_fib_cache_ht;
321da3c1639SYevhen Orlov 	struct notifier_block inetaddr_nb;
322da3c1639SYevhen Orlov 	struct notifier_block inetaddr_valid_nb;
3234394fbcbSYevhen Orlov 	struct notifier_block fib_nb;
3248b1ef491SYevhen Orlov 	struct notifier_block netevent_nb;
3250a23ae23SYevhen Orlov 	u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */
3260a23ae23SYevhen Orlov 	unsigned long nhgrp_hw_cache_kick; /* jiffies */
327*ae15ed6eSYevhen Orlov 	struct {
328*ae15ed6eSYevhen Orlov 		struct delayed_work dw;
329*ae15ed6eSYevhen Orlov 	} neighs_update;
33069204174SYevhen Orlov };
33169204174SYevhen Orlov 
332501ef306SVadym Kochan struct prestera_rxtx_params {
333501ef306SVadym Kochan 	bool use_sdma;
334501ef306SVadym Kochan 	u32 map_addr;
335501ef306SVadym Kochan };
336501ef306SVadym Kochan 
337501ef306SVadym Kochan #define prestera_dev(sw)		((sw)->dev->dev)
338501ef306SVadym Kochan 
prestera_write(const struct prestera_switch * sw,unsigned int reg,u32 val)339501ef306SVadym Kochan static inline void prestera_write(const struct prestera_switch *sw,
340501ef306SVadym Kochan 				  unsigned int reg, u32 val)
341501ef306SVadym Kochan {
342501ef306SVadym Kochan 	writel(val, sw->dev->pp_regs + reg);
343501ef306SVadym Kochan }
344501ef306SVadym Kochan 
prestera_read(const struct prestera_switch * sw,unsigned int reg)345501ef306SVadym Kochan static inline u32 prestera_read(const struct prestera_switch *sw,
346501ef306SVadym Kochan 				unsigned int reg)
347501ef306SVadym Kochan {
348501ef306SVadym Kochan 	return readl(sw->dev->pp_regs + reg);
349501ef306SVadym Kochan }
350501ef306SVadym Kochan 
351501ef306SVadym Kochan int prestera_device_register(struct prestera_device *dev);
352501ef306SVadym Kochan void prestera_device_unregister(struct prestera_device *dev);
353501ef306SVadym Kochan 
354501ef306SVadym Kochan struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
355501ef306SVadym Kochan 						 u32 dev_id, u32 hw_id);
356501ef306SVadym Kochan 
357bb5dbf2cSVolodymyr Mytnyk int prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes);
358a97d3c69SVadym Kochan 
35969204174SYevhen Orlov int prestera_router_init(struct prestera_switch *sw);
36069204174SYevhen Orlov void prestera_router_fini(struct prestera_switch *sw);
36169204174SYevhen Orlov 
362e1189d9aSVadym Kochan struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id);
363e1189d9aSVadym Kochan 
364deef0d6aSOleksandr Mazur struct prestera_switch *prestera_switch_get(struct net_device *dev);
365deef0d6aSOleksandr Mazur 
366bb5dbf2cSVolodymyr Mytnyk int prestera_port_cfg_mac_read(struct prestera_port *port,
367bb5dbf2cSVolodymyr Mytnyk 			       struct prestera_port_mac_config *cfg);
368bb5dbf2cSVolodymyr Mytnyk 
369bb5dbf2cSVolodymyr Mytnyk int prestera_port_cfg_mac_write(struct prestera_port *port,
370bb5dbf2cSVolodymyr Mytnyk 				struct prestera_port_mac_config *cfg);
371bb5dbf2cSVolodymyr Mytnyk 
372e1189d9aSVadym Kochan struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev);
373e1189d9aSVadym Kochan 
3744394fbcbSYevhen Orlov void prestera_queue_work(struct work_struct *work);
37590b6f9c0SYevhen Orlov void prestera_queue_delayed_work(struct delayed_work *work, unsigned long delay);
37690b6f9c0SYevhen Orlov void prestera_queue_drain(void);
3774394fbcbSYevhen Orlov 
378116f5af7SOleksandr Mazur int prestera_port_learning_set(struct prestera_port *port, bool learn_enable);
379116f5af7SOleksandr Mazur int prestera_port_uc_flood_set(struct prestera_port *port, bool flood);
380116f5af7SOleksandr Mazur int prestera_port_mc_flood_set(struct prestera_port *port, bool flood);
381116f5af7SOleksandr Mazur 
38273ef239cSOleksandr Mazur int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked);
38373ef239cSOleksandr Mazur 
384e1189d9aSVadym Kochan int prestera_port_pvid_set(struct prestera_port *port, u16 vid);
385e1189d9aSVadym Kochan 
386e1189d9aSVadym Kochan bool prestera_netdev_check(const struct net_device *dev);
387e1189d9aSVadym Kochan 
388da3c1639SYevhen Orlov int prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr);
389da3c1639SYevhen Orlov 
390255213caSSerhiy Boiko bool prestera_port_is_lag_member(const struct prestera_port *port);
391fec7c9c7SOleksandr Mazur int prestera_lag_id(struct prestera_switch *sw,
392fec7c9c7SOleksandr Mazur 		    struct net_device *lag_dev, u16 *lag_id);
393255213caSSerhiy Boiko 
394255213caSSerhiy Boiko struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id);
395255213caSSerhiy Boiko 
396255213caSSerhiy Boiko u16 prestera_port_lag_id(const struct prestera_port *port);
397255213caSSerhiy Boiko 
3987950b214SOleksandr Mazur struct prestera_mdb_entry *
3997950b214SOleksandr Mazur prestera_mdb_entry_create(struct prestera_switch *sw,
4007950b214SOleksandr Mazur 			  const unsigned char *addr, u16 vid);
4017950b214SOleksandr Mazur void prestera_mdb_entry_destroy(struct prestera_mdb_entry *mdb_entry);
4027950b214SOleksandr Mazur 
4037950b214SOleksandr Mazur struct prestera_flood_domain *
4047950b214SOleksandr Mazur prestera_flood_domain_create(struct prestera_switch *sw);
4057950b214SOleksandr Mazur void prestera_flood_domain_destroy(struct prestera_flood_domain *flood_domain);
4067950b214SOleksandr Mazur 
4077950b214SOleksandr Mazur int
4087950b214SOleksandr Mazur prestera_flood_domain_port_create(struct prestera_flood_domain *flood_domain,
4097950b214SOleksandr Mazur 				  struct net_device *dev,
4107950b214SOleksandr Mazur 				  u16 vid);
4117950b214SOleksandr Mazur void
4127950b214SOleksandr Mazur prestera_flood_domain_port_destroy(struct prestera_flood_domain_port *port);
4137950b214SOleksandr Mazur struct prestera_flood_domain_port *
4147950b214SOleksandr Mazur prestera_flood_domain_port_find(struct prestera_flood_domain *flood_domain,
4157950b214SOleksandr Mazur 				struct net_device *dev, u16 vid);
4167950b214SOleksandr Mazur 
417501ef306SVadym Kochan #endif /* _PRESTERA_H_ */
418