162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __DSA_SLAVE_H 462306a36Sopenharmony_ci#define __DSA_SLAVE_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/if_bridge.h> 762306a36Sopenharmony_ci#include <linux/if_vlan.h> 862306a36Sopenharmony_ci#include <linux/list.h> 962306a36Sopenharmony_ci#include <linux/netpoll.h> 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci#include <net/dsa.h> 1262306a36Sopenharmony_ci#include <net/gro_cells.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct net_device; 1562306a36Sopenharmony_cistruct netlink_ext_ack; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciextern struct notifier_block dsa_slave_switchdev_notifier; 1862306a36Sopenharmony_ciextern struct notifier_block dsa_slave_switchdev_blocking_notifier; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct dsa_slave_priv { 2162306a36Sopenharmony_ci /* Copy of CPU port xmit for faster access in slave transmit hot path */ 2262306a36Sopenharmony_ci struct sk_buff * (*xmit)(struct sk_buff *skb, 2362306a36Sopenharmony_ci struct net_device *dev); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci struct gro_cells gcells; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci /* DSA port data, such as switch, port index, etc. */ 2862306a36Sopenharmony_ci struct dsa_port *dp; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#ifdef CONFIG_NET_POLL_CONTROLLER 3162306a36Sopenharmony_ci struct netpoll *netpoll; 3262306a36Sopenharmony_ci#endif 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci /* TC context */ 3562306a36Sopenharmony_ci struct list_head mall_tc_list; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_civoid dsa_slave_mii_bus_init(struct dsa_switch *ds); 3962306a36Sopenharmony_ciint dsa_slave_create(struct dsa_port *dp); 4062306a36Sopenharmony_civoid dsa_slave_destroy(struct net_device *slave_dev); 4162306a36Sopenharmony_ciint dsa_slave_suspend(struct net_device *slave_dev); 4262306a36Sopenharmony_ciint dsa_slave_resume(struct net_device *slave_dev); 4362306a36Sopenharmony_ciint dsa_slave_register_notifier(void); 4462306a36Sopenharmony_civoid dsa_slave_unregister_notifier(void); 4562306a36Sopenharmony_civoid dsa_slave_sync_ha(struct net_device *dev); 4662306a36Sopenharmony_civoid dsa_slave_unsync_ha(struct net_device *dev); 4762306a36Sopenharmony_civoid dsa_slave_setup_tagger(struct net_device *slave); 4862306a36Sopenharmony_ciint dsa_slave_change_mtu(struct net_device *dev, int new_mtu); 4962306a36Sopenharmony_ciint dsa_slave_change_master(struct net_device *dev, struct net_device *master, 5062306a36Sopenharmony_ci struct netlink_ext_ack *extack); 5162306a36Sopenharmony_ciint dsa_slave_manage_vlan_filtering(struct net_device *dev, 5262306a36Sopenharmony_ci bool vlan_filtering); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic inline struct dsa_port *dsa_slave_to_port(const struct net_device *dev) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci struct dsa_slave_priv *p = netdev_priv(dev); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci return p->dp; 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic inline struct net_device * 6262306a36Sopenharmony_cidsa_slave_to_master(const struct net_device *dev) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci struct dsa_port *dp = dsa_slave_to_port(dev); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci return dsa_port_to_master(dp); 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#endif 70