^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)