Merge tag 'sched_urgent_for_v5.16_rc1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / include / net / dsa.h
index d784e76..eff5c44 100644 (file)
@@ -51,6 +51,7 @@ struct phylink_link_state;
 #define DSA_TAG_PROTO_SEVILLE_VALUE            21
 #define DSA_TAG_PROTO_BRCM_LEGACY_VALUE                22
 #define DSA_TAG_PROTO_SJA1110_VALUE            23
+#define DSA_TAG_PROTO_RTL8_4_VALUE             24
 
 enum dsa_tag_protocol {
        DSA_TAG_PROTO_NONE              = DSA_TAG_PROTO_NONE_VALUE,
@@ -77,6 +78,7 @@ enum dsa_tag_protocol {
        DSA_TAG_PROTO_OCELOT_8021Q      = DSA_TAG_PROTO_OCELOT_8021Q_VALUE,
        DSA_TAG_PROTO_SEVILLE           = DSA_TAG_PROTO_SEVILLE_VALUE,
        DSA_TAG_PROTO_SJA1110           = DSA_TAG_PROTO_SJA1110_VALUE,
+       DSA_TAG_PROTO_RTL8_4            = DSA_TAG_PROTO_RTL8_4_VALUE,
 };
 
 struct dsa_switch;
@@ -285,6 +287,7 @@ struct dsa_port {
        /* List of MAC addresses that must be forwarded on this port.
         * These are only valid on CPU ports and DSA links.
         */
+       struct mutex            addr_lists_lock;
        struct list_head        fdbs;
        struct list_head        mdbs;
 
@@ -472,14 +475,41 @@ static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)
        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER;
 }
 
+#define dsa_tree_for_each_user_port(_dp, _dst) \
+       list_for_each_entry((_dp), &(_dst)->ports, list) \
+               if (dsa_port_is_user((_dp)))
+
+#define dsa_switch_for_each_port(_dp, _ds) \
+       list_for_each_entry((_dp), &(_ds)->dst->ports, list) \
+               if ((_dp)->ds == (_ds))
+
+#define dsa_switch_for_each_port_safe(_dp, _next, _ds) \
+       list_for_each_entry_safe((_dp), (_next), &(_ds)->dst->ports, list) \
+               if ((_dp)->ds == (_ds))
+
+#define dsa_switch_for_each_port_continue_reverse(_dp, _ds) \
+       list_for_each_entry_continue_reverse((_dp), &(_ds)->dst->ports, list) \
+               if ((_dp)->ds == (_ds))
+
+#define dsa_switch_for_each_available_port(_dp, _ds) \
+       dsa_switch_for_each_port((_dp), (_ds)) \
+               if (!dsa_port_is_unused((_dp)))
+
+#define dsa_switch_for_each_user_port(_dp, _ds) \
+       dsa_switch_for_each_port((_dp), (_ds)) \
+               if (dsa_port_is_user((_dp)))
+
+#define dsa_switch_for_each_cpu_port(_dp, _ds) \
+       dsa_switch_for_each_port((_dp), (_ds)) \
+               if (dsa_port_is_cpu((_dp)))
+
 static inline u32 dsa_user_ports(struct dsa_switch *ds)
 {
+       struct dsa_port *dp;
        u32 mask = 0;
-       int p;
 
-       for (p = 0; p < ds->num_ports; p++)
-               if (dsa_is_user_port(ds, p))
-                       mask |= BIT(p);
+       dsa_switch_for_each_user_port(dp, ds)
+               mask |= BIT(dp->index);
 
        return mask;
 }
@@ -615,6 +645,8 @@ struct dsa_switch_ops {
        /*
         * PHYLINK integration
         */
+       void    (*phylink_get_interfaces)(struct dsa_switch *ds, int port,
+                                         unsigned long *supported_interfaces);
        void    (*phylink_validate)(struct dsa_switch *ds, int port,
                                    unsigned long *supported,
                                    struct phylink_link_state *state);
@@ -645,6 +677,12 @@ struct dsa_switch_ops {
        int     (*get_sset_count)(struct dsa_switch *ds, int port, int sset);
        void    (*get_ethtool_phy_stats)(struct dsa_switch *ds,
                                         int port, uint64_t *data);
+       void    (*get_eth_phy_stats)(struct dsa_switch *ds, int port,
+                                    struct ethtool_eth_phy_stats *phy_stats);
+       void    (*get_eth_mac_stats)(struct dsa_switch *ds, int port,
+                                    struct ethtool_eth_mac_stats *mac_stats);
+       void    (*get_eth_ctrl_stats)(struct dsa_switch *ds, int port,
+                                     struct ethtool_eth_ctrl_stats *ctrl_stats);
        void    (*get_stats64)(struct dsa_switch *ds, int port,
                                   struct rtnl_link_stats64 *s);
        void    (*self_test)(struct dsa_switch *ds, int port,