Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * include/net/dsa.h - Driver for Distributed Switch Architecture switch chips
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (c) 2008-2009 Marvell Semiconductor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #ifndef __LINUX_NET_DSA_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #define __LINUX_NET_DSA_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/if.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/if_ether.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/notifier.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/ethtool.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/net_tstamp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/phy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <linux/platform_data/dsa.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <linux/phylink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <net/devlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #include <net/switchdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) struct tc_action;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) struct phy_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) struct fixed_phy_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) struct phylink_link_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define DSA_TAG_PROTO_NONE_VALUE		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define DSA_TAG_PROTO_BRCM_VALUE		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define DSA_TAG_PROTO_BRCM_PREPEND_VALUE	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define DSA_TAG_PROTO_DSA_VALUE			3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define DSA_TAG_PROTO_EDSA_VALUE		4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define DSA_TAG_PROTO_GSWIP_VALUE		5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define DSA_TAG_PROTO_KSZ9477_VALUE		6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define DSA_TAG_PROTO_KSZ9893_VALUE		7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define DSA_TAG_PROTO_LAN9303_VALUE		8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #define DSA_TAG_PROTO_MTK_VALUE			9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) #define DSA_TAG_PROTO_QCA_VALUE			10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define DSA_TAG_PROTO_TRAILER_VALUE		11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define DSA_TAG_PROTO_8021Q_VALUE		12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) #define DSA_TAG_PROTO_SJA1105_VALUE		13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define DSA_TAG_PROTO_KSZ8795_VALUE		14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define DSA_TAG_PROTO_OCELOT_VALUE		15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) #define DSA_TAG_PROTO_AR9331_VALUE		16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #define DSA_TAG_PROTO_RTL4_A_VALUE		17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) enum dsa_tag_protocol {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	DSA_TAG_PROTO_NONE		= DSA_TAG_PROTO_NONE_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	DSA_TAG_PROTO_BRCM		= DSA_TAG_PROTO_BRCM_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	DSA_TAG_PROTO_BRCM_PREPEND	= DSA_TAG_PROTO_BRCM_PREPEND_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	DSA_TAG_PROTO_DSA		= DSA_TAG_PROTO_DSA_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	DSA_TAG_PROTO_EDSA		= DSA_TAG_PROTO_EDSA_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	DSA_TAG_PROTO_GSWIP		= DSA_TAG_PROTO_GSWIP_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	DSA_TAG_PROTO_KSZ9477		= DSA_TAG_PROTO_KSZ9477_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	DSA_TAG_PROTO_KSZ9893		= DSA_TAG_PROTO_KSZ9893_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	DSA_TAG_PROTO_LAN9303		= DSA_TAG_PROTO_LAN9303_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	DSA_TAG_PROTO_MTK		= DSA_TAG_PROTO_MTK_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	DSA_TAG_PROTO_QCA		= DSA_TAG_PROTO_QCA_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	DSA_TAG_PROTO_TRAILER		= DSA_TAG_PROTO_TRAILER_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	DSA_TAG_PROTO_8021Q		= DSA_TAG_PROTO_8021Q_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	DSA_TAG_PROTO_SJA1105		= DSA_TAG_PROTO_SJA1105_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	DSA_TAG_PROTO_KSZ8795		= DSA_TAG_PROTO_KSZ8795_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	DSA_TAG_PROTO_OCELOT		= DSA_TAG_PROTO_OCELOT_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	DSA_TAG_PROTO_AR9331		= DSA_TAG_PROTO_AR9331_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	DSA_TAG_PROTO_RTL4_A		= DSA_TAG_PROTO_RTL4_A_VALUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) struct packet_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) struct dsa_switch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) struct dsa_device_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 			       struct packet_type *pt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	void (*flow_dissect)(const struct sk_buff *skb, __be16 *proto,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 			     int *offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	/* Used to determine which traffic should match the DSA filter in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	 * eth_type_trans, and which, if any, should bypass it and be processed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	 * as regular on the master net device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	unsigned int overhead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	enum dsa_tag_protocol proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	/* Some tagging protocols either mangle or shift the destination MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	 * address, in which case the DSA master would drop packets on ingress
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	 * if what it understands out of the destination MAC address is not in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	 * its RX filter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	bool promisc_on_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	bool tail_tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) /* This structure defines the control interfaces that are overlayed by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)  * DSA layer on top of the DSA CPU/management net_device instance. This is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98)  * used by the core net_device layer while calling various net_device_ops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99)  * function pointers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct dsa_netdevice_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 			    int cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define DSA_TAG_DRIVER_ALIAS "dsa_tag-"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define MODULE_ALIAS_DSA_TAG_DRIVER(__proto)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	MODULE_ALIAS(DSA_TAG_DRIVER_ALIAS __stringify(__proto##_VALUE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct dsa_skb_cb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	struct sk_buff *clone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct __dsa_skb_cb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	struct dsa_skb_cb cb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	u8 priv[48 - sizeof(struct dsa_skb_cb)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define DSA_SKB_CB(skb) ((struct dsa_skb_cb *)((skb)->cb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define DSA_SKB_CB_PRIV(skb)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	((void *)(skb)->cb + offsetof(struct __dsa_skb_cb, priv))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct dsa_switch_tree {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	struct list_head	list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	/* Notifier chain for switch-wide events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	struct raw_notifier_head	nh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	/* Tree identifier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	unsigned int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	/* Number of switches attached to this tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	struct kref refcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	/* Has this tree been applied to the hardware? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	bool setup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	 * Configuration data for the platform device that owns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	 * this dsa switch tree instance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	struct dsa_platform_data	*pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	/* List of switch ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	struct list_head ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	/* List of DSA links composing the routing table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	struct list_head rtable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* TC matchall action types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) enum dsa_port_mall_action_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	DSA_PORT_MALL_MIRROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	DSA_PORT_MALL_POLICER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /* TC mirroring entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) struct dsa_mall_mirror_tc_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	u8 to_local_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	bool ingress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* TC port policer entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) struct dsa_mall_policer_tc_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	u32 burst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	u64 rate_bytes_per_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /* TC matchall entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) struct dsa_mall_tc_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	unsigned long cookie;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	enum dsa_port_mall_action_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 		struct dsa_mall_mirror_tc_entry mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		struct dsa_mall_policer_tc_entry policer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct dsa_port {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	/* A CPU port is physically connected to a master device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	 * A user port exposed to userspace has a slave device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		struct net_device *master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		struct net_device *slave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	/* CPU port tagging operations used by master or slave devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	const struct dsa_device_ops *tag_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	/* Copies for faster access in master receive hot path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	struct dsa_switch_tree *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 			       struct packet_type *pt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		DSA_PORT_TYPE_UNUSED = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		DSA_PORT_TYPE_CPU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		DSA_PORT_TYPE_DSA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		DSA_PORT_TYPE_USER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	} type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	struct dsa_switch	*ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	unsigned int		index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	const char		*name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	struct dsa_port		*cpu_dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	const char		*mac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	struct device_node	*dn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	unsigned int		ageing_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	bool			vlan_filtering;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	u8			stp_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	struct net_device	*bridge_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	struct devlink_port	devlink_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	bool			devlink_port_setup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	struct phylink		*pl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	struct phylink_config	pl_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	 * Give the switch driver somewhere to hang its per-port private data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	 * structures (accessible from the tagger).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	void *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	 * Original copy of the master netdev ethtool_ops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	const struct ethtool_ops *orig_ethtool_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	 * Original copy of the master netdev net_device_ops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	const struct dsa_netdevice_ops *netdev_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	bool setup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* TODO: ideally DSA ports would have a single dp->link_dp member,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)  * and no dst->rtable nor this struct dsa_link would be needed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)  * but this would require some more complex tree walking,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)  * so keep it stupid at the moment and list them all.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct dsa_link {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	struct dsa_port *dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	struct dsa_port *link_dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) struct dsa_switch {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	bool setup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	 * Parent switch tree, and switch index.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	struct dsa_switch_tree	*dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	unsigned int		index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	/* Listener for switch fabric events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	struct notifier_block	nb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	 * Give the switch driver somewhere to hang its private data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	 * structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	void *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	 * Configuration data for this switch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	struct dsa_chip_data	*cd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	 * The switch operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	const struct dsa_switch_ops	*ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	 * Slave mii_bus and devices for the individual ports.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	u32			phys_mii_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	struct mii_bus		*slave_mii_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	/* Ageing Time limits in msecs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	unsigned int ageing_time_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	unsigned int ageing_time_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	/* devlink used to represent this switch device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	struct devlink		*devlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	/* Number of switch port queues */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	unsigned int		num_tx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	/* Disallow bridge core from requesting different VLAN awareness
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	 * settings on ports if not hardware-supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	bool			vlan_filtering_is_global;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	/* Pass .port_vlan_add and .port_vlan_del to drivers even for bridges
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	 * that have vlan_filtering=0. All drivers should ideally set this (and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	 * then the option would get removed), but it is unknown whether this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	 * would break things or not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	bool			configure_vlan_while_not_filtering;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	/* If the switch driver always programs the CPU port as egress tagged
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	 * despite the VLAN configuration indicating otherwise, then setting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	 * @untag_bridge_pvid will force the DSA receive path to pop the bridge's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	 * default_pvid VLAN tagged frames to offer a consistent behavior
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	 * between a vlan_filtering=0 and vlan_filtering=1 bridge device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	bool			untag_bridge_pvid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	/* In case vlan_filtering_is_global is set, the VLAN awareness state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	 * should be retrieved from here and not from the per-port settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	bool			vlan_filtering;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	/* MAC PCS does not provide link state change interrupt, and requires
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	 * polling. Flag passed on to PHYLINK.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	bool			pcs_poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	/* For switches that only have the MRU configurable. To ensure the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	 * configured MTU is not exceeded, normalization of MRU on all bridged
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	 * interfaces is needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	bool			mtu_enforcement_ingress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	size_t num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) static inline struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	struct dsa_switch_tree *dst = ds->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	struct dsa_port *dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	list_for_each_entry(dp, &dst->ports, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 		if (dp->ds == ds && dp->index == p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 			return dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) static inline u32 dsa_user_ports(struct dsa_switch *ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	u32 mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	int p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	for (p = 0; p < ds->num_ports; p++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 		if (dsa_is_user_port(ds, p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 			mask |= BIT(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	return mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) /* Return the local port used to reach an arbitrary switch device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static inline unsigned int dsa_routing_port(struct dsa_switch *ds, int device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	struct dsa_switch_tree *dst = ds->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	struct dsa_link *dl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	list_for_each_entry(dl, &dst->rtable, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 		if (dl->dp->ds == ds && dl->link_dp->ds->index == device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 			return dl->dp->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	return ds->num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) /* Return the local port used to reach an arbitrary switch port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 					    int port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	if (device == ds->index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 		return port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 		return dsa_routing_port(ds, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) /* Return the local port used to reach the dedicated CPU port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	const struct dsa_port *dp = dsa_to_port(ds, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	const struct dsa_port *cpu_dp = dp->cpu_dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	if (!cpu_dp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 		return port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	const struct dsa_switch *ds = dp->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 	if (ds->vlan_filtering_is_global)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 		return ds->vlan_filtering;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 		return dp->vlan_filtering;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 			      bool is_static, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) struct dsa_switch_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 						  int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 						  enum dsa_tag_protocol mprot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	int	(*setup)(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	void	(*teardown)(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 	u32	(*get_phy_flags)(struct dsa_switch *ds, int port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 	 * Access to the switch's PHY registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	int	(*phy_read)(struct dsa_switch *ds, int port, int regnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	int	(*phy_write)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 			     int regnum, u16 val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	 * Link state adjustment (called from libphy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	void	(*adjust_link)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 				struct phy_device *phydev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	void	(*fixed_link_update)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 				struct fixed_phy_status *st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 	 * PHYLINK integration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	void	(*phylink_validate)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 				    unsigned long *supported,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 				    struct phylink_link_state *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	int	(*phylink_mac_link_state)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 					  struct phylink_link_state *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	void	(*phylink_mac_config)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 				      unsigned int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 				      const struct phylink_link_state *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	void	(*phylink_mac_an_restart)(struct dsa_switch *ds, int port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	void	(*phylink_mac_link_down)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 					 unsigned int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 					 phy_interface_t interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	void	(*phylink_mac_link_up)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 				       unsigned int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 				       phy_interface_t interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 				       struct phy_device *phydev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 				       int speed, int duplex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 				       bool tx_pause, bool rx_pause);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	void	(*phylink_fixed_state)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 				       struct phylink_link_state *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 	 * ethtool hardware statistics.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 	void	(*get_strings)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 			       u32 stringset, uint8_t *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	void	(*get_ethtool_stats)(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 				     int port, uint64_t *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 	int	(*get_sset_count)(struct dsa_switch *ds, int port, int sset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 	void	(*get_ethtool_phy_stats)(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 					 int port, uint64_t *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	 * ethtool Wake-on-LAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	void	(*get_wol)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 			   struct ethtool_wolinfo *w);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	int	(*set_wol)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 			   struct ethtool_wolinfo *w);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 	 * ethtool timestamp info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 	int	(*get_ts_info)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 			       struct ethtool_ts_info *ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	 * Suspend and resume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 	int	(*suspend)(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 	int	(*resume)(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 	 * Port enable/disable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 	int	(*port_enable)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 			       struct phy_device *phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	void	(*port_disable)(struct dsa_switch *ds, int port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	 * Port's MAC EEE settings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 	int	(*set_mac_eee)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 			       struct ethtool_eee *e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 	int	(*get_mac_eee)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 			       struct ethtool_eee *e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 	/* EEPROM access */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	int	(*get_eeprom_len)(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 	int	(*get_eeprom)(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 			      struct ethtool_eeprom *eeprom, u8 *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 	int	(*set_eeprom)(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 			      struct ethtool_eeprom *eeprom, u8 *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 	 * Register access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 	int	(*get_regs_len)(struct dsa_switch *ds, int port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 	void	(*get_regs)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 			    struct ethtool_regs *regs, void *p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 	 * Bridge integration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 	int	(*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 	int	(*port_bridge_join)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 				    struct net_device *bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	void	(*port_bridge_leave)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 				     struct net_device *bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	void	(*port_stp_state_set)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 				      u8 state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	void	(*port_fast_age)(struct dsa_switch *ds, int port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	int	(*port_egress_floods)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 				      bool unicast, bool multicast);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	 * VLAN support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 	int	(*port_vlan_filtering)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 				       bool vlan_filtering,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 				       struct switchdev_trans *trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	int (*port_vlan_prepare)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 				 const struct switchdev_obj_port_vlan *vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	void (*port_vlan_add)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 			      const struct switchdev_obj_port_vlan *vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 	int	(*port_vlan_del)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 				 const struct switchdev_obj_port_vlan *vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 	 * Forwarding database
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 	int	(*port_fdb_add)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 				const unsigned char *addr, u16 vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 	int	(*port_fdb_del)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 				const unsigned char *addr, u16 vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 	int	(*port_fdb_dump)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 				 dsa_fdb_dump_cb_t *cb, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 	 * Multicast database
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 	int (*port_mdb_prepare)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 				const struct switchdev_obj_port_mdb *mdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 	void (*port_mdb_add)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 			     const struct switchdev_obj_port_mdb *mdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 	int	(*port_mdb_del)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 				const struct switchdev_obj_port_mdb *mdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 	 * RXNFC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 	int	(*get_rxnfc)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 			     struct ethtool_rxnfc *nfc, u32 *rule_locs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 	int	(*set_rxnfc)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 			     struct ethtool_rxnfc *nfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 	 * TC integration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 	int	(*cls_flower_add)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 				  struct flow_cls_offload *cls, bool ingress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 	int	(*cls_flower_del)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 				  struct flow_cls_offload *cls, bool ingress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 	int	(*cls_flower_stats)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 				    struct flow_cls_offload *cls, bool ingress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 	int	(*port_mirror_add)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 				   struct dsa_mall_mirror_tc_entry *mirror,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 				   bool ingress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 	void	(*port_mirror_del)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 				   struct dsa_mall_mirror_tc_entry *mirror);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	int	(*port_policer_add)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 				    struct dsa_mall_policer_tc_entry *policer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 	void	(*port_policer_del)(struct dsa_switch *ds, int port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 	int	(*port_setup_tc)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 				 enum tc_setup_type type, void *type_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 	 * Cross-chip operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 	int	(*crosschip_bridge_join)(struct dsa_switch *ds, int tree_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 					 int sw_index, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 					 struct net_device *br);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 	void	(*crosschip_bridge_leave)(struct dsa_switch *ds, int tree_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 					  int sw_index, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 					  struct net_device *br);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 	 * PTP functionality
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 	int	(*port_hwtstamp_get)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 				     struct ifreq *ifr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 	int	(*port_hwtstamp_set)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 				     struct ifreq *ifr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 	bool	(*port_txtstamp)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 				 struct sk_buff *clone, unsigned int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 	bool	(*port_rxtstamp)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 				 struct sk_buff *skb, unsigned int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 	/* Devlink parameters, etc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 	int	(*devlink_param_get)(struct dsa_switch *ds, u32 id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 				     struct devlink_param_gset_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 	int	(*devlink_param_set)(struct dsa_switch *ds, u32 id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 				     struct devlink_param_gset_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 	int	(*devlink_info_get)(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 				    struct devlink_info_req *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 				    struct netlink_ext_ack *extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 	 * MTU change functionality. Switches can also adjust their MRU through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 	 * this method. By MTU, one understands the SDU (L2 payload) length.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 	 * If the switch needs to account for the DSA tag on the CPU port, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 	 * method needs to do so privately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 	int	(*port_change_mtu)(struct dsa_switch *ds, int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 				   int new_mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 	int	(*port_max_mtu)(struct dsa_switch *ds, int port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) #define DSA_DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 	DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes,		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 			     dsa_devlink_param_get, dsa_devlink_param_set, NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) int dsa_devlink_param_get(struct devlink *dl, u32 id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 			  struct devlink_param_gset_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) int dsa_devlink_param_set(struct devlink *dl, u32 id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 			  struct devlink_param_gset_ctx *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) int dsa_devlink_params_register(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 				const struct devlink_param *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 				size_t params_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) void dsa_devlink_params_unregister(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 				   const struct devlink_param *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 				   size_t params_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) int dsa_devlink_resource_register(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 				  const char *resource_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 				  u64 resource_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 				  u64 resource_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 				  u64 parent_resource_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 				  const struct devlink_resource_size_params *size_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) void dsa_devlink_resources_unregister(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) void dsa_devlink_resource_occ_get_register(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 					   u64 resource_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 					   devlink_resource_occ_get_t *occ_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 					   void *occ_get_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) void dsa_devlink_resource_occ_get_unregister(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 					     u64 resource_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct devlink_region *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) dsa_devlink_region_create(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 			  const struct devlink_region_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 			  u32 region_max_snapshots, u64 region_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct devlink_region *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) dsa_devlink_port_region_create(struct dsa_switch *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 			       int port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 			       const struct devlink_port_region_ops *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 			       u32 region_max_snapshots, u64 region_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) void dsa_devlink_region_destroy(struct devlink_region *region);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct dsa_port *dsa_port_from_netdev(struct net_device *netdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) struct dsa_devlink_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 	struct dsa_switch *ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) static inline struct dsa_switch *dsa_devlink_to_ds(struct devlink *dl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 	struct dsa_devlink_priv *dl_priv = devlink_priv(dl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 	return dl_priv->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) static inline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) struct dsa_switch *dsa_devlink_port_to_ds(struct devlink_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 	struct devlink *dl = port->devlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 	struct dsa_devlink_priv *dl_priv = devlink_priv(dl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 	return dl_priv->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) static inline int dsa_devlink_port_to_port(struct devlink_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 	return port->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct dsa_switch_driver {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 	struct list_head	list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 	const struct dsa_switch_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) struct net_device *dsa_dev_to_net_device(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) /* Keep inline for faster access in hot path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) static inline bool netdev_uses_dsa(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) #if IS_ENABLED(CONFIG_NET_DSA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 	return dev->dsa_ptr && dev->dsa_ptr->rcv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) static inline bool dsa_can_decode(const struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 				  struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) #if IS_ENABLED(CONFIG_NET_DSA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 	return !dev->dsa_ptr->filter || dev->dsa_ptr->filter(skb, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) /* All DSA tags that push the EtherType to the right (basically all except tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)  * tags, which don't break dissection) can be treated the same from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)  * perspective of the flow dissector.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)  * We need to return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)  *  - offset: the (B - A) difference between:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)  *    A. the position of the real EtherType and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)  *    B. the current skb->data (aka ETH_HLEN bytes into the frame, aka 2 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)  *       after the normal EtherType was supposed to be)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)  *    The offset in bytes is exactly equal to the tagger overhead (and half of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)  *    that, in __be16 shorts).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)  *  - proto: the value of the real EtherType.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) static inline void dsa_tag_generic_flow_dissect(const struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 						__be16 *proto, int *offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) #if IS_ENABLED(CONFIG_NET_DSA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 	const struct dsa_device_ops *ops = skb->dev->dsa_ptr->tag_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) 	int tag_len = ops->overhead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 	*offset = tag_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 	*proto = ((__be16 *)skb->data)[(tag_len / 2) - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) #if IS_ENABLED(CONFIG_NET_DSA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) static inline int __dsa_netdevice_ops_check(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) 	int err = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 	if (!dev->dsa_ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 	if (!dev->dsa_ptr->netdev_ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) static inline int dsa_ndo_do_ioctl(struct net_device *dev, struct ifreq *ifr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) 				   int cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 	const struct dsa_netdevice_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 	err = __dsa_netdevice_ops_check(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 	ops = dev->dsa_ptr->netdev_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 	return ops->ndo_do_ioctl(dev, ifr, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) static inline int dsa_ndo_do_ioctl(struct net_device *dev, struct ifreq *ifr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 				   int cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) 	return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) void dsa_unregister_switch(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) int dsa_register_switch(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) struct dsa_switch *dsa_switch_find(int tree_index, int sw_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) #ifdef CONFIG_PM_SLEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) int dsa_switch_suspend(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) int dsa_switch_resume(struct dsa_switch *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) static inline int dsa_switch_suspend(struct dsa_switch *ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) static inline int dsa_switch_resume(struct dsa_switch *ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) #endif /* CONFIG_PM_SLEEP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) enum dsa_notifier_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) 	DSA_PORT_REGISTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) 	DSA_PORT_UNREGISTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) struct dsa_notifier_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) 	struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) struct dsa_notifier_register_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) 	struct dsa_notifier_info info;	/* must be first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) 	struct net_device *master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) 	unsigned int port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) 	unsigned int switch_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) static inline struct net_device *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) dsa_notifier_info_to_dev(const struct dsa_notifier_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) 	return info->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) #if IS_ENABLED(CONFIG_NET_DSA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) int register_dsa_notifier(struct notifier_block *nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) int unregister_dsa_notifier(struct notifier_block *nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) int call_dsa_notifiers(unsigned long val, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) 		       struct dsa_notifier_info *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) static inline int register_dsa_notifier(struct notifier_block *nb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) static inline int unregister_dsa_notifier(struct notifier_block *nb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) static inline int call_dsa_notifiers(unsigned long val, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) 				     struct dsa_notifier_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) 	return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) /* Broadcom tag specific helpers to insert and extract queue/port number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) #define BRCM_TAG_SET_PORT_QUEUE(p, q)	((p) << 8 | q)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) #define BRCM_TAG_GET_PORT(v)		((v) >> 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) #define BRCM_TAG_GET_QUEUE(v)		((v) & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) netdev_tx_t dsa_enqueue_skb(struct sk_buff *skb, struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) int dsa_port_get_phy_sset_count(struct dsa_port *dp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) struct dsa_tag_driver {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) 	const struct dsa_device_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) 	struct module *owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) void dsa_tag_drivers_register(struct dsa_tag_driver *dsa_tag_driver_array[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) 			      unsigned int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) 			      struct module *owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) void dsa_tag_drivers_unregister(struct dsa_tag_driver *dsa_tag_driver_array[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) 				unsigned int count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) #define dsa_tag_driver_module_drivers(__dsa_tag_drivers_array, __count)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) static int __init dsa_tag_driver_module_init(void)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) {									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) 	dsa_tag_drivers_register(__dsa_tag_drivers_array, __count,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) 				 THIS_MODULE);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) 	return 0;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) }									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) module_init(dsa_tag_driver_module_init);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) 									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) static void __exit dsa_tag_driver_module_exit(void)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) {									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) 	dsa_tag_drivers_unregister(__dsa_tag_drivers_array, __count);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) }									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) module_exit(dsa_tag_driver_module_exit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)  * module_dsa_tag_drivers() - Helper macro for registering DSA tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)  * drivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)  * @__ops_array: Array of tag driver strucutres
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)  * Helper macro for DSA tag drivers which do not do anything special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)  * in module init/exit. Each module may only use this macro once, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)  * calling it replaces module_init() and module_exit().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) #define module_dsa_tag_drivers(__ops_array)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) dsa_tag_driver_module_drivers(__ops_array, ARRAY_SIZE(__ops_array))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) #define DSA_TAG_DRIVER_NAME(__ops) dsa_tag_driver ## _ ## __ops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) /* Create a static structure we can build a linked list of dsa_tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)  * drivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) #define DSA_TAG_DRIVER(__ops)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) static struct dsa_tag_driver DSA_TAG_DRIVER_NAME(__ops) = {		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) 	.ops = &__ops,							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)  * module_dsa_tag_driver() - Helper macro for registering a single DSA tag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)  * driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)  * @__ops: Single tag driver structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)  * Helper macro for DSA tag drivers which do not do anything special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)  * in module init/exit. Each module may only use this macro once, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)  * calling it replaces module_init() and module_exit().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) #define module_dsa_tag_driver(__ops)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) DSA_TAG_DRIVER(__ops);							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) 									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) static struct dsa_tag_driver *dsa_tag_driver_array[] =	{		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) 	&DSA_TAG_DRIVER_NAME(__ops)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) };									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) module_dsa_tag_drivers(dsa_tag_driver_array)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)