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