xref: /openbmc/linux/net/dsa/slave.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1*09f92341SVladimir Oltean /* SPDX-License-Identifier: GPL-2.0-or-later */
2*09f92341SVladimir Oltean 
3*09f92341SVladimir Oltean #ifndef __DSA_SLAVE_H
4*09f92341SVladimir Oltean #define __DSA_SLAVE_H
5*09f92341SVladimir Oltean 
6*09f92341SVladimir Oltean #include <linux/if_bridge.h>
7*09f92341SVladimir Oltean #include <linux/if_vlan.h>
8*09f92341SVladimir Oltean #include <linux/list.h>
9*09f92341SVladimir Oltean #include <linux/netpoll.h>
10*09f92341SVladimir Oltean #include <linux/types.h>
11*09f92341SVladimir Oltean #include <net/dsa.h>
12*09f92341SVladimir Oltean #include <net/gro_cells.h>
13*09f92341SVladimir Oltean 
14*09f92341SVladimir Oltean struct net_device;
15*09f92341SVladimir Oltean struct netlink_ext_ack;
16*09f92341SVladimir Oltean 
17*09f92341SVladimir Oltean extern struct notifier_block dsa_slave_switchdev_notifier;
18*09f92341SVladimir Oltean extern struct notifier_block dsa_slave_switchdev_blocking_notifier;
19*09f92341SVladimir Oltean 
20*09f92341SVladimir Oltean struct dsa_slave_priv {
21*09f92341SVladimir Oltean 	/* Copy of CPU port xmit for faster access in slave transmit hot path */
22*09f92341SVladimir Oltean 	struct sk_buff *	(*xmit)(struct sk_buff *skb,
23*09f92341SVladimir Oltean 					struct net_device *dev);
24*09f92341SVladimir Oltean 
25*09f92341SVladimir Oltean 	struct gro_cells	gcells;
26*09f92341SVladimir Oltean 
27*09f92341SVladimir Oltean 	/* DSA port data, such as switch, port index, etc. */
28*09f92341SVladimir Oltean 	struct dsa_port		*dp;
29*09f92341SVladimir Oltean 
30*09f92341SVladimir Oltean #ifdef CONFIG_NET_POLL_CONTROLLER
31*09f92341SVladimir Oltean 	struct netpoll		*netpoll;
32*09f92341SVladimir Oltean #endif
33*09f92341SVladimir Oltean 
34*09f92341SVladimir Oltean 	/* TC context */
35*09f92341SVladimir Oltean 	struct list_head	mall_tc_list;
36*09f92341SVladimir Oltean };
37*09f92341SVladimir Oltean 
38*09f92341SVladimir Oltean void dsa_slave_mii_bus_init(struct dsa_switch *ds);
39*09f92341SVladimir Oltean int dsa_slave_create(struct dsa_port *dp);
40*09f92341SVladimir Oltean void dsa_slave_destroy(struct net_device *slave_dev);
41*09f92341SVladimir Oltean int dsa_slave_suspend(struct net_device *slave_dev);
42*09f92341SVladimir Oltean int dsa_slave_resume(struct net_device *slave_dev);
43*09f92341SVladimir Oltean int dsa_slave_register_notifier(void);
44*09f92341SVladimir Oltean void dsa_slave_unregister_notifier(void);
45*09f92341SVladimir Oltean void dsa_slave_sync_ha(struct net_device *dev);
46*09f92341SVladimir Oltean void dsa_slave_unsync_ha(struct net_device *dev);
47*09f92341SVladimir Oltean void dsa_slave_setup_tagger(struct net_device *slave);
48*09f92341SVladimir Oltean int dsa_slave_change_mtu(struct net_device *dev, int new_mtu);
49*09f92341SVladimir Oltean int dsa_slave_change_master(struct net_device *dev, struct net_device *master,
50*09f92341SVladimir Oltean 			    struct netlink_ext_ack *extack);
51*09f92341SVladimir Oltean int dsa_slave_manage_vlan_filtering(struct net_device *dev,
52*09f92341SVladimir Oltean 				    bool vlan_filtering);
53*09f92341SVladimir Oltean 
dsa_slave_to_port(const struct net_device * dev)54*09f92341SVladimir Oltean static inline struct dsa_port *dsa_slave_to_port(const struct net_device *dev)
55*09f92341SVladimir Oltean {
56*09f92341SVladimir Oltean 	struct dsa_slave_priv *p = netdev_priv(dev);
57*09f92341SVladimir Oltean 
58*09f92341SVladimir Oltean 	return p->dp;
59*09f92341SVladimir Oltean }
60*09f92341SVladimir Oltean 
61*09f92341SVladimir Oltean static inline struct net_device *
dsa_slave_to_master(const struct net_device * dev)62*09f92341SVladimir Oltean dsa_slave_to_master(const struct net_device *dev)
63*09f92341SVladimir Oltean {
64*09f92341SVladimir Oltean 	struct dsa_port *dp = dsa_slave_to_port(dev);
65*09f92341SVladimir Oltean 
66*09f92341SVladimir Oltean 	return dsa_port_to_master(dp);
67*09f92341SVladimir Oltean }
68*09f92341SVladimir Oltean 
69*09f92341SVladimir Oltean #endif
70