net: dsa: Optional VLAN-based port separation for switches without tagging
[linux-2.6-block.git] / include / net / dsa.h
index aab3c2029edd50fb769e04a29df133a1ccaed7f4..69f3714f42bab2637d3396909d6eeb79f5981c2c 100644 (file)
@@ -42,6 +42,7 @@ struct phylink_link_state;
 #define DSA_TAG_PROTO_MTK_VALUE                        9
 #define DSA_TAG_PROTO_QCA_VALUE                        10
 #define DSA_TAG_PROTO_TRAILER_VALUE            11
+#define DSA_TAG_PROTO_8021Q_VALUE              12
 
 enum dsa_tag_protocol {
        DSA_TAG_PROTO_NONE              = DSA_TAG_PROTO_NONE_VALUE,
@@ -56,6 +57,7 @@ enum dsa_tag_protocol {
        DSA_TAG_PROTO_MTK               = DSA_TAG_PROTO_MTK_VALUE,
        DSA_TAG_PROTO_QCA               = DSA_TAG_PROTO_QCA_VALUE,
        DSA_TAG_PROTO_TRAILER           = DSA_TAG_PROTO_TRAILER_VALUE,
+       DSA_TAG_PROTO_8021Q             = DSA_TAG_PROTO_8021Q_VALUE,
 };
 
 struct packet_type;
@@ -233,6 +235,11 @@ struct dsa_switch {
         */
        bool                    vlan_filtering_is_global;
 
+       /* In case vlan_filtering_is_global is set, the VLAN awareness state
+        * should be retrieved from here and not from the per-port settings.
+        */
+       bool                    vlan_filtering;
+
        unsigned long           *bitmap;
        unsigned long           _bitmap;
 
@@ -300,18 +307,19 @@ static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port)
        return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index);
 }
 
+static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp)
+{
+       const struct dsa_switch *ds = dp->ds;
+
+       if (ds->vlan_filtering_is_global)
+               return ds->vlan_filtering;
+       else
+               return dp->vlan_filtering;
+}
+
 typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid,
                              bool is_static, void *data);
 struct dsa_switch_ops {
-#if IS_ENABLED(CONFIG_NET_DSA_LEGACY)
-       /*
-        * Legacy probing.
-        */
-       const char      *(*probe)(struct device *dsa_dev,
-                                 struct device *host_dev, int sw_addr,
-                                 void **priv);
-#endif
-
        enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds,
                                                  int port);
 
@@ -501,20 +509,6 @@ struct dsa_switch_driver {
        const struct dsa_switch_ops *ops;
 };
 
-#if IS_ENABLED(CONFIG_NET_DSA_LEGACY)
-/* Legacy driver registration */
-void register_switch_driver(struct dsa_switch_driver *type);
-void unregister_switch_driver(struct dsa_switch_driver *type);
-struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev);
-
-#else
-static inline void register_switch_driver(struct dsa_switch_driver *type) { }
-static inline void unregister_switch_driver(struct dsa_switch_driver *type) { }
-static inline struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev)
-{
-       return NULL;
-}
-#endif
 struct net_device *dsa_dev_to_net_device(struct device *dev);
 
 /* Keep inline for faster access in hot path */