diff options
Diffstat (limited to 'include/net/dsa.h')
| -rw-r--r-- | include/net/dsa.h | 39 | 
1 files changed, 37 insertions, 2 deletions
diff --git a/include/net/dsa.h b/include/net/dsa.h index 4e13e695f025..8e24677b1c62 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -19,6 +19,7 @@  #include <linux/workqueue.h>  #include <linux/of.h>  #include <linux/ethtool.h> +#include <net/devlink.h>  struct tc_action;  struct phy_device; @@ -31,6 +32,8 @@ enum dsa_tag_protocol {  	DSA_TAG_PROTO_EDSA,  	DSA_TAG_PROTO_BRCM,  	DSA_TAG_PROTO_QCA, +	DSA_TAG_PROTO_MTK, +	DSA_TAG_PROTO_LAN9303,  	DSA_TAG_LAST,		/* MUST BE LAST */  }; @@ -122,7 +125,7 @@ struct dsa_switch_tree {  	 * protocol to use.  	 */  	struct net_device	*master_netdev; -	int			(*rcv)(struct sk_buff *skb, +	struct sk_buff *	(*rcv)(struct sk_buff *skb,  				       struct net_device *dev,  				       struct packet_type *pt,  				       struct net_device *orig_dev); @@ -182,6 +185,7 @@ struct dsa_port {  	unsigned int		ageing_time;  	u8			stp_state;  	struct net_device	*bridge_dev; +	struct devlink_port	devlink_port;  };  struct dsa_switch { @@ -233,6 +237,13 @@ struct dsa_switch {  	u32			phys_mii_mask;  	struct mii_bus		*slave_mii_bus; +	/* Ageing Time limits in msecs */ +	unsigned int ageing_time_min; +	unsigned int ageing_time_max; + +	/* devlink used to represent this switch device */ +	struct devlink		*devlink; +  	/* Dynamically allocated ports, keep last */  	size_t num_ports;  	struct dsa_port ports[]; @@ -248,6 +259,11 @@ static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)  	return !!((ds->dsa_port_mask) & (1 << p));  } +static inline bool dsa_is_normal_port(struct dsa_switch *ds, int p) +{ +	return !dsa_is_cpu_port(ds, p) && !dsa_is_dsa_port(ds, p); +} +  static inline bool dsa_is_port_initialized(struct dsa_switch *ds, int p)  {  	return ds->enabled_port_mask & (1 << p) && ds->ports[p].netdev; @@ -287,7 +303,7 @@ struct dsa_notifier_bridge_info {  struct dsa_switch_ops {  	/* -	 * Probing and setup. +	 * Legacy probing.  	 */  	const char	*(*probe)(struct device *dsa_dev,  				  struct device *host_dev, int sw_addr, @@ -442,6 +458,14 @@ struct dsa_switch_ops {  				   bool ingress);  	void	(*port_mirror_del)(struct dsa_switch *ds, int port,  				   struct dsa_mall_mirror_tc_entry *mirror); + +	/* +	 * Cross-chip operations +	 */ +	int	(*crosschip_bridge_join)(struct dsa_switch *ds, int sw_index, +					 int port, struct net_device *br); +	void	(*crosschip_bridge_leave)(struct dsa_switch *ds, int sw_index, +					  int port, struct net_device *br);  };  struct dsa_switch_driver { @@ -449,9 +473,11 @@ struct dsa_switch_driver {  	const struct dsa_switch_ops *ops;  }; +/* Legacy driver registration */  void register_switch_driver(struct dsa_switch_driver *type);  void unregister_switch_driver(struct dsa_switch_driver *type);  struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev); +  struct net_device *dsa_dev_to_net_device(struct device *dev);  static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst) @@ -459,6 +485,15 @@ static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst)  	return dst->rcv != NULL;  } +static inline bool netdev_uses_dsa(struct net_device *dev) +{ +#if IS_ENABLED(CONFIG_NET_DSA) +	if (dev->dsa_ptr != NULL) +		return dsa_uses_tagged_protocol(dev->dsa_ptr); +#endif +	return false; +} +  struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n);  void dsa_unregister_switch(struct dsa_switch *ds);  int dsa_register_switch(struct dsa_switch *ds, struct device *dev);  | 
