struct packet_type *pt);
        int (*flow_dissect)(const struct sk_buff *skb, __be16 *proto,
                            int *offset);
+       /* Used to determine which traffic should match the DSA filter in
+        * eth_type_trans, and which, if any, should bypass it and be processed
+        * as regular on the master net device.
+        */
+       bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
        unsigned int overhead;
        const char *name;
        enum dsa_tag_protocol proto;
        struct dsa_switch_tree *dst;
        struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
                               struct packet_type *pt);
+       bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
 
        enum {
                DSA_PORT_TYPE_UNUSED = 0,
        return false;
 }
 
+static inline bool dsa_can_decode(const struct sk_buff *skb,
+                                 struct net_device *dev)
+{
+#if IS_ENABLED(CONFIG_NET_DSA)
+       return !dev->dsa_ptr->filter || dev->dsa_ptr->filter(skb, dev);
+#endif
+       return false;
+}
+
 struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n);
 void dsa_unregister_switch(struct dsa_switch *ds);
 int dsa_register_switch(struct dsa_switch *ds);
 
         * at all, so we check here whether one of those tagging
         * variants has been configured on the receiving interface,
         * and if so, set skb->protocol without looking at the packet.
+        * The DSA tagging protocol may be able to decode some but not all
+        * traffic (for example only for management). In that case give it the
+        * option to filter the packets from which it can decode source port
+        * information.
         */
-       if (unlikely(netdev_uses_dsa(dev)))
+       if (unlikely(netdev_uses_dsa(dev)) && dsa_can_decode(skb, dev))
                return htons(ETH_P_XDSA);
 
        if (likely(eth_proto_is_802_3(eth->h_proto)))