162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _PRESTERA_H_
562306a36Sopenharmony_ci#define _PRESTERA_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/notifier.h>
862306a36Sopenharmony_ci#include <linux/skbuff.h>
962306a36Sopenharmony_ci#include <linux/workqueue.h>
1062306a36Sopenharmony_ci#include <linux/phylink.h>
1162306a36Sopenharmony_ci#include <net/devlink.h>
1262306a36Sopenharmony_ci#include <uapi/linux/if_ether.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define PRESTERA_DRV_NAME	"prestera"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define PRESTERA_DEFAULT_VID    1
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct prestera_fw_rev {
1962306a36Sopenharmony_ci	u16 maj;
2062306a36Sopenharmony_ci	u16 min;
2162306a36Sopenharmony_ci	u16 sub;
2262306a36Sopenharmony_ci};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct prestera_flood_domain {
2562306a36Sopenharmony_ci	struct prestera_switch *sw;
2662306a36Sopenharmony_ci	struct list_head flood_domain_port_list;
2762306a36Sopenharmony_ci	u32 idx;
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct prestera_mdb_entry {
3162306a36Sopenharmony_ci	struct prestera_switch *sw;
3262306a36Sopenharmony_ci	struct prestera_flood_domain *flood_domain;
3362306a36Sopenharmony_ci	unsigned char addr[ETH_ALEN];
3462306a36Sopenharmony_ci	u16 vid;
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct prestera_flood_domain_port {
3862306a36Sopenharmony_ci	struct prestera_flood_domain *flood_domain;
3962306a36Sopenharmony_ci	struct net_device *dev;
4062306a36Sopenharmony_ci	struct list_head flood_domain_port_node;
4162306a36Sopenharmony_ci	u16 vid;
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct prestera_port_stats {
4562306a36Sopenharmony_ci	u64 good_octets_received;
4662306a36Sopenharmony_ci	u64 bad_octets_received;
4762306a36Sopenharmony_ci	u64 mac_trans_error;
4862306a36Sopenharmony_ci	u64 broadcast_frames_received;
4962306a36Sopenharmony_ci	u64 multicast_frames_received;
5062306a36Sopenharmony_ci	u64 frames_64_octets;
5162306a36Sopenharmony_ci	u64 frames_65_to_127_octets;
5262306a36Sopenharmony_ci	u64 frames_128_to_255_octets;
5362306a36Sopenharmony_ci	u64 frames_256_to_511_octets;
5462306a36Sopenharmony_ci	u64 frames_512_to_1023_octets;
5562306a36Sopenharmony_ci	u64 frames_1024_to_max_octets;
5662306a36Sopenharmony_ci	u64 excessive_collision;
5762306a36Sopenharmony_ci	u64 multicast_frames_sent;
5862306a36Sopenharmony_ci	u64 broadcast_frames_sent;
5962306a36Sopenharmony_ci	u64 fc_sent;
6062306a36Sopenharmony_ci	u64 fc_received;
6162306a36Sopenharmony_ci	u64 buffer_overrun;
6262306a36Sopenharmony_ci	u64 undersize;
6362306a36Sopenharmony_ci	u64 fragments;
6462306a36Sopenharmony_ci	u64 oversize;
6562306a36Sopenharmony_ci	u64 jabber;
6662306a36Sopenharmony_ci	u64 rx_error_frame_received;
6762306a36Sopenharmony_ci	u64 bad_crc;
6862306a36Sopenharmony_ci	u64 collisions;
6962306a36Sopenharmony_ci	u64 late_collision;
7062306a36Sopenharmony_ci	u64 unicast_frames_received;
7162306a36Sopenharmony_ci	u64 unicast_frames_sent;
7262306a36Sopenharmony_ci	u64 sent_multiple;
7362306a36Sopenharmony_ci	u64 sent_deferred;
7462306a36Sopenharmony_ci	u64 good_octets_sent;
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define PRESTERA_AP_PORT_MAX   (10)
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct prestera_port_caps {
8062306a36Sopenharmony_ci	u64 supp_link_modes;
8162306a36Sopenharmony_ci	u8 supp_fec;
8262306a36Sopenharmony_ci	u8 type;
8362306a36Sopenharmony_ci	u8 transceiver;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistruct prestera_lag {
8762306a36Sopenharmony_ci	struct net_device *dev;
8862306a36Sopenharmony_ci	struct list_head members;
8962306a36Sopenharmony_ci	u16 member_count;
9062306a36Sopenharmony_ci	u16 lag_id;
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct prestera_flow_block;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistruct prestera_port_mac_state {
9662306a36Sopenharmony_ci	bool valid;
9762306a36Sopenharmony_ci	u32 mode;
9862306a36Sopenharmony_ci	u32 speed;
9962306a36Sopenharmony_ci	bool oper;
10062306a36Sopenharmony_ci	u8 duplex;
10162306a36Sopenharmony_ci	u8 fc;
10262306a36Sopenharmony_ci	u8 fec;
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistruct prestera_port_phy_state {
10662306a36Sopenharmony_ci	u64 lmode_bmap;
10762306a36Sopenharmony_ci	struct {
10862306a36Sopenharmony_ci		bool pause;
10962306a36Sopenharmony_ci		bool asym_pause;
11062306a36Sopenharmony_ci	} remote_fc;
11162306a36Sopenharmony_ci	u8 mdix;
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistruct prestera_port_mac_config {
11562306a36Sopenharmony_ci	u32 mode;
11662306a36Sopenharmony_ci	u32 speed;
11762306a36Sopenharmony_ci	bool admin;
11862306a36Sopenharmony_ci	u8 inband;
11962306a36Sopenharmony_ci	u8 duplex;
12062306a36Sopenharmony_ci	u8 fec;
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistruct prestera_port_phy_config {
12462306a36Sopenharmony_ci	u32 mode;
12562306a36Sopenharmony_ci	bool admin;
12662306a36Sopenharmony_ci	u8 mdix;
12762306a36Sopenharmony_ci};
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cistruct prestera_port {
13062306a36Sopenharmony_ci	struct net_device *dev;
13162306a36Sopenharmony_ci	struct prestera_switch *sw;
13262306a36Sopenharmony_ci	struct prestera_flow_block *ingress_flow_block;
13362306a36Sopenharmony_ci	struct prestera_flow_block *egress_flow_block;
13462306a36Sopenharmony_ci	struct devlink_port dl_port;
13562306a36Sopenharmony_ci	struct list_head lag_member;
13662306a36Sopenharmony_ci	struct prestera_lag *lag;
13762306a36Sopenharmony_ci	u32 id;
13862306a36Sopenharmony_ci	u32 hw_id;
13962306a36Sopenharmony_ci	u32 dev_id;
14062306a36Sopenharmony_ci	u16 fp_id;
14162306a36Sopenharmony_ci	u16 pvid;
14262306a36Sopenharmony_ci	bool autoneg;
14362306a36Sopenharmony_ci	u64 adver_link_modes;
14462306a36Sopenharmony_ci	u8 adver_fec;
14562306a36Sopenharmony_ci	struct prestera_port_caps caps;
14662306a36Sopenharmony_ci	struct list_head list;
14762306a36Sopenharmony_ci	struct list_head vlans_list;
14862306a36Sopenharmony_ci	struct {
14962306a36Sopenharmony_ci		struct prestera_port_stats stats;
15062306a36Sopenharmony_ci		struct delayed_work caching_dw;
15162306a36Sopenharmony_ci	} cached_hw_stats;
15262306a36Sopenharmony_ci	struct prestera_port_mac_config cfg_mac;
15362306a36Sopenharmony_ci	struct prestera_port_phy_config cfg_phy;
15462306a36Sopenharmony_ci	struct prestera_port_mac_state state_mac;
15562306a36Sopenharmony_ci	struct prestera_port_phy_state state_phy;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	struct phylink_config phy_config;
15862306a36Sopenharmony_ci	struct phylink *phy_link;
15962306a36Sopenharmony_ci	struct phylink_pcs phylink_pcs;
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	/* protects state_mac */
16262306a36Sopenharmony_ci	spinlock_t state_mac_lock;
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistruct prestera_device {
16662306a36Sopenharmony_ci	struct device *dev;
16762306a36Sopenharmony_ci	u8 __iomem *ctl_regs;
16862306a36Sopenharmony_ci	u8 __iomem *pp_regs;
16962306a36Sopenharmony_ci	struct prestera_fw_rev fw_rev;
17062306a36Sopenharmony_ci	void *priv;
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	/* called by device driver to handle received packets */
17362306a36Sopenharmony_ci	void (*recv_pkt)(struct prestera_device *dev);
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci	/* called by device driver to pass event up to the higher layer */
17662306a36Sopenharmony_ci	int (*recv_msg)(struct prestera_device *dev, void *msg, size_t size);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	/* called by higher layer to send request to the firmware */
17962306a36Sopenharmony_ci	int (*send_req)(struct prestera_device *dev, int qid, void *in_msg,
18062306a36Sopenharmony_ci			size_t in_size, void *out_msg, size_t out_size,
18162306a36Sopenharmony_ci			unsigned int wait);
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cienum prestera_event_type {
18562306a36Sopenharmony_ci	PRESTERA_EVENT_TYPE_UNSPEC,
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	PRESTERA_EVENT_TYPE_PORT,
18862306a36Sopenharmony_ci	PRESTERA_EVENT_TYPE_FDB,
18962306a36Sopenharmony_ci	PRESTERA_EVENT_TYPE_RXTX,
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	PRESTERA_EVENT_TYPE_MAX
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_cienum prestera_rxtx_event_id {
19562306a36Sopenharmony_ci	PRESTERA_RXTX_EVENT_UNSPEC,
19662306a36Sopenharmony_ci	PRESTERA_RXTX_EVENT_RCV_PKT,
19762306a36Sopenharmony_ci};
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cienum prestera_port_event_id {
20062306a36Sopenharmony_ci	PRESTERA_PORT_EVENT_UNSPEC,
20162306a36Sopenharmony_ci	PRESTERA_PORT_EVENT_MAC_STATE_CHANGED,
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cistruct prestera_port_event {
20562306a36Sopenharmony_ci	u32 port_id;
20662306a36Sopenharmony_ci	union {
20762306a36Sopenharmony_ci		struct {
20862306a36Sopenharmony_ci			u32 mode;
20962306a36Sopenharmony_ci			u32 speed;
21062306a36Sopenharmony_ci			u8 oper;
21162306a36Sopenharmony_ci			u8 duplex;
21262306a36Sopenharmony_ci			u8 fc;
21362306a36Sopenharmony_ci			u8 fec;
21462306a36Sopenharmony_ci		} mac;
21562306a36Sopenharmony_ci		struct {
21662306a36Sopenharmony_ci			u64 lmode_bmap;
21762306a36Sopenharmony_ci			struct {
21862306a36Sopenharmony_ci				bool pause;
21962306a36Sopenharmony_ci				bool asym_pause;
22062306a36Sopenharmony_ci			} remote_fc;
22162306a36Sopenharmony_ci			u8 mdix;
22262306a36Sopenharmony_ci		} phy;
22362306a36Sopenharmony_ci	} data;
22462306a36Sopenharmony_ci};
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cienum prestera_fdb_entry_type {
22762306a36Sopenharmony_ci	PRESTERA_FDB_ENTRY_TYPE_REG_PORT,
22862306a36Sopenharmony_ci	PRESTERA_FDB_ENTRY_TYPE_LAG,
22962306a36Sopenharmony_ci	PRESTERA_FDB_ENTRY_TYPE_MAX
23062306a36Sopenharmony_ci};
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cienum prestera_fdb_event_id {
23362306a36Sopenharmony_ci	PRESTERA_FDB_EVENT_UNSPEC,
23462306a36Sopenharmony_ci	PRESTERA_FDB_EVENT_LEARNED,
23562306a36Sopenharmony_ci	PRESTERA_FDB_EVENT_AGED,
23662306a36Sopenharmony_ci};
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_cistruct prestera_fdb_event {
23962306a36Sopenharmony_ci	enum prestera_fdb_entry_type type;
24062306a36Sopenharmony_ci	union {
24162306a36Sopenharmony_ci		u32 port_id;
24262306a36Sopenharmony_ci		u16 lag_id;
24362306a36Sopenharmony_ci	} dest;
24462306a36Sopenharmony_ci	u32 vid;
24562306a36Sopenharmony_ci	union {
24662306a36Sopenharmony_ci		u8 mac[ETH_ALEN];
24762306a36Sopenharmony_ci	} data;
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_cistruct prestera_event {
25162306a36Sopenharmony_ci	u16 id;
25262306a36Sopenharmony_ci	union {
25362306a36Sopenharmony_ci		struct prestera_port_event port_evt;
25462306a36Sopenharmony_ci		struct prestera_fdb_event fdb_evt;
25562306a36Sopenharmony_ci	};
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cienum prestera_if_type {
25962306a36Sopenharmony_ci	/* the interface is of port type (dev,port) */
26062306a36Sopenharmony_ci	PRESTERA_IF_PORT_E = 0,
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	/* the interface is of lag type (lag-id) */
26362306a36Sopenharmony_ci	PRESTERA_IF_LAG_E = 1,
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	/* the interface is of Vid type (vlan-id) */
26662306a36Sopenharmony_ci	PRESTERA_IF_VID_E = 3,
26762306a36Sopenharmony_ci};
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_cistruct prestera_iface {
27062306a36Sopenharmony_ci	enum prestera_if_type type;
27162306a36Sopenharmony_ci	struct {
27262306a36Sopenharmony_ci		u32 hw_dev_num;
27362306a36Sopenharmony_ci		u32 port_num;
27462306a36Sopenharmony_ci	} dev_port;
27562306a36Sopenharmony_ci	u32 hw_dev_num;
27662306a36Sopenharmony_ci	u16 vr_id;
27762306a36Sopenharmony_ci	u16 lag_id;
27862306a36Sopenharmony_ci	u16 vlan_id;
27962306a36Sopenharmony_ci};
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_cistruct prestera_switchdev;
28262306a36Sopenharmony_cistruct prestera_span;
28362306a36Sopenharmony_cistruct prestera_rxtx;
28462306a36Sopenharmony_cistruct prestera_trap_data;
28562306a36Sopenharmony_cistruct prestera_acl;
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_cistruct prestera_switch {
28862306a36Sopenharmony_ci	struct prestera_device *dev;
28962306a36Sopenharmony_ci	struct prestera_switchdev *swdev;
29062306a36Sopenharmony_ci	struct prestera_rxtx *rxtx;
29162306a36Sopenharmony_ci	struct prestera_acl *acl;
29262306a36Sopenharmony_ci	struct prestera_span *span;
29362306a36Sopenharmony_ci	struct list_head event_handlers;
29462306a36Sopenharmony_ci	struct notifier_block netdev_nb;
29562306a36Sopenharmony_ci	struct prestera_trap_data *trap_data;
29662306a36Sopenharmony_ci	char base_mac[ETH_ALEN];
29762306a36Sopenharmony_ci	struct list_head port_list;
29862306a36Sopenharmony_ci	rwlock_t port_list_lock;
29962306a36Sopenharmony_ci	u32 port_count;
30062306a36Sopenharmony_ci	u32 mtu_min;
30162306a36Sopenharmony_ci	u32 mtu_max;
30262306a36Sopenharmony_ci	u8 id;
30362306a36Sopenharmony_ci	struct device_node *np;
30462306a36Sopenharmony_ci	struct prestera_router *router;
30562306a36Sopenharmony_ci	struct prestera_lag *lags;
30662306a36Sopenharmony_ci	struct prestera_counter *counter;
30762306a36Sopenharmony_ci	u8 lag_member_max;
30862306a36Sopenharmony_ci	u8 lag_max;
30962306a36Sopenharmony_ci	u32 size_tbl_router_nexthop;
31062306a36Sopenharmony_ci};
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_cistruct prestera_router {
31362306a36Sopenharmony_ci	struct prestera_switch *sw;
31462306a36Sopenharmony_ci	struct list_head vr_list;
31562306a36Sopenharmony_ci	struct list_head rif_entry_list;
31662306a36Sopenharmony_ci	struct rhashtable nh_neigh_ht;
31762306a36Sopenharmony_ci	struct rhashtable nexthop_group_ht;
31862306a36Sopenharmony_ci	struct rhashtable fib_ht;
31962306a36Sopenharmony_ci	struct rhashtable kern_neigh_cache_ht;
32062306a36Sopenharmony_ci	struct rhashtable kern_fib_cache_ht;
32162306a36Sopenharmony_ci	struct notifier_block inetaddr_nb;
32262306a36Sopenharmony_ci	struct notifier_block inetaddr_valid_nb;
32362306a36Sopenharmony_ci	struct notifier_block fib_nb;
32462306a36Sopenharmony_ci	struct notifier_block netevent_nb;
32562306a36Sopenharmony_ci	u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */
32662306a36Sopenharmony_ci	unsigned long nhgrp_hw_cache_kick; /* jiffies */
32762306a36Sopenharmony_ci	struct {
32862306a36Sopenharmony_ci		struct delayed_work dw;
32962306a36Sopenharmony_ci	} neighs_update;
33062306a36Sopenharmony_ci};
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cistruct prestera_rxtx_params {
33362306a36Sopenharmony_ci	bool use_sdma;
33462306a36Sopenharmony_ci	u32 map_addr;
33562306a36Sopenharmony_ci};
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci#define prestera_dev(sw)		((sw)->dev->dev)
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_cistatic inline void prestera_write(const struct prestera_switch *sw,
34062306a36Sopenharmony_ci				  unsigned int reg, u32 val)
34162306a36Sopenharmony_ci{
34262306a36Sopenharmony_ci	writel(val, sw->dev->pp_regs + reg);
34362306a36Sopenharmony_ci}
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_cistatic inline u32 prestera_read(const struct prestera_switch *sw,
34662306a36Sopenharmony_ci				unsigned int reg)
34762306a36Sopenharmony_ci{
34862306a36Sopenharmony_ci	return readl(sw->dev->pp_regs + reg);
34962306a36Sopenharmony_ci}
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ciint prestera_device_register(struct prestera_device *dev);
35262306a36Sopenharmony_civoid prestera_device_unregister(struct prestera_device *dev);
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_cistruct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
35562306a36Sopenharmony_ci						 u32 dev_id, u32 hw_id);
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ciint prestera_port_autoneg_set(struct prestera_port *port, u64 link_modes);
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ciint prestera_router_init(struct prestera_switch *sw);
36062306a36Sopenharmony_civoid prestera_router_fini(struct prestera_switch *sw);
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_cistruct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id);
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_cistruct prestera_switch *prestera_switch_get(struct net_device *dev);
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ciint prestera_port_cfg_mac_read(struct prestera_port *port,
36762306a36Sopenharmony_ci			       struct prestera_port_mac_config *cfg);
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ciint prestera_port_cfg_mac_write(struct prestera_port *port,
37062306a36Sopenharmony_ci				struct prestera_port_mac_config *cfg);
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cistruct prestera_port *prestera_port_dev_lower_find(struct net_device *dev);
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_civoid prestera_queue_work(struct work_struct *work);
37562306a36Sopenharmony_civoid prestera_queue_delayed_work(struct delayed_work *work, unsigned long delay);
37662306a36Sopenharmony_civoid prestera_queue_drain(void);
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ciint prestera_port_learning_set(struct prestera_port *port, bool learn_enable);
37962306a36Sopenharmony_ciint prestera_port_uc_flood_set(struct prestera_port *port, bool flood);
38062306a36Sopenharmony_ciint prestera_port_mc_flood_set(struct prestera_port *port, bool flood);
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ciint prestera_port_br_locked_set(struct prestera_port *port, bool br_locked);
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ciint prestera_port_pvid_set(struct prestera_port *port, u16 vid);
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_cibool prestera_netdev_check(const struct net_device *dev);
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ciint prestera_is_valid_mac_addr(struct prestera_port *port, const u8 *addr);
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_cibool prestera_port_is_lag_member(const struct prestera_port *port);
39162306a36Sopenharmony_ciint prestera_lag_id(struct prestera_switch *sw,
39262306a36Sopenharmony_ci		    struct net_device *lag_dev, u16 *lag_id);
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_cistruct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id);
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ciu16 prestera_port_lag_id(const struct prestera_port *port);
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_cistruct prestera_mdb_entry *
39962306a36Sopenharmony_ciprestera_mdb_entry_create(struct prestera_switch *sw,
40062306a36Sopenharmony_ci			  const unsigned char *addr, u16 vid);
40162306a36Sopenharmony_civoid prestera_mdb_entry_destroy(struct prestera_mdb_entry *mdb_entry);
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_cistruct prestera_flood_domain *
40462306a36Sopenharmony_ciprestera_flood_domain_create(struct prestera_switch *sw);
40562306a36Sopenharmony_civoid prestera_flood_domain_destroy(struct prestera_flood_domain *flood_domain);
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ciint
40862306a36Sopenharmony_ciprestera_flood_domain_port_create(struct prestera_flood_domain *flood_domain,
40962306a36Sopenharmony_ci				  struct net_device *dev,
41062306a36Sopenharmony_ci				  u16 vid);
41162306a36Sopenharmony_civoid
41262306a36Sopenharmony_ciprestera_flood_domain_port_destroy(struct prestera_flood_domain_port *port);
41362306a36Sopenharmony_cistruct prestera_flood_domain_port *
41462306a36Sopenharmony_ciprestera_flood_domain_port_find(struct prestera_flood_domain *flood_domain,
41562306a36Sopenharmony_ci				struct net_device *dev, u16 vid);
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci#endif /* _PRESTERA_H_ */
418