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