Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / include / net / dsa.h
index 8a8a5d976f977056cb90615e1ee75c298e47e0b8..b76559293535b3b388d0ec1b66105df6892fa754 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/of.h>
 #include <linux/phy.h>
 #include <linux/phy_fixed.h>
+#include <linux/ethtool.h>
 
 enum dsa_tag_protocol {
        DSA_TAG_PROTO_NONE = 0,
@@ -34,7 +35,7 @@ struct dsa_chip_data {
        /*
         * How to access the switch configuration registers.
         */
-       struct device   *mii_bus;
+       struct device   *host_dev;
        int             sw_addr;
 
        /* Device tree node pointer for this specific switch chip
@@ -77,7 +78,7 @@ struct dsa_platform_data {
        struct dsa_chip_data    *chip;
 };
 
-struct dsa_device_ops;
+struct packet_type;
 
 struct dsa_switch_tree {
        /*
@@ -91,7 +92,10 @@ struct dsa_switch_tree {
         * protocol to use.
         */
        struct net_device       *master_netdev;
-       const struct dsa_device_ops     *ops;
+       int                     (*rcv)(struct sk_buff *skb,
+                                      struct net_device *dev,
+                                      struct packet_type *pt,
+                                      struct net_device *orig_dev);
        enum dsa_tag_protocol   tag_protocol;
 
        /*
@@ -131,9 +135,9 @@ struct dsa_switch {
        struct dsa_switch_driver        *drv;
 
        /*
-        * Reference to mii bus to use.
+        * Reference to host device to use.
         */
-       struct mii_bus          *master_mii_bus;
+       struct device           *master_dev;
 
        /*
         * Slave mii_bus and devices for the individual ports.
@@ -175,9 +179,10 @@ struct dsa_switch_driver {
        /*
         * Probing and setup.
         */
-       char    *(*probe)(struct mii_bus *bus, int sw_addr);
+       char    *(*probe)(struct device *host_dev, int sw_addr);
        int     (*setup)(struct dsa_switch *ds);
        int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
+       u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
 
        /*
         * Access to the switch's PHY registers.
@@ -206,10 +211,42 @@ struct dsa_switch_driver {
        void    (*get_ethtool_stats)(struct dsa_switch *ds,
                                     int port, uint64_t *data);
        int     (*get_sset_count)(struct dsa_switch *ds);
+
+       /*
+        * ethtool Wake-on-LAN
+        */
+       void    (*get_wol)(struct dsa_switch *ds, int port,
+                          struct ethtool_wolinfo *w);
+       int     (*set_wol)(struct dsa_switch *ds, int port,
+                          struct ethtool_wolinfo *w);
+
+       /*
+        * Suspend and resume
+        */
+       int     (*suspend)(struct dsa_switch *ds);
+       int     (*resume)(struct dsa_switch *ds);
+
+       /*
+        * Port enable/disable
+        */
+       int     (*port_enable)(struct dsa_switch *ds, int port,
+                              struct phy_device *phy);
+       void    (*port_disable)(struct dsa_switch *ds, int port,
+                               struct phy_device *phy);
+
+       /*
+        * EEE setttings
+        */
+       int     (*set_eee)(struct dsa_switch *ds, int port,
+                          struct phy_device *phydev,
+                          struct ethtool_eee *e);
+       int     (*get_eee)(struct dsa_switch *ds, int port,
+                          struct ethtool_eee *e);
 };
 
 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);
 
 static inline void *ds_to_priv(struct dsa_switch *ds)
 {
@@ -218,7 +255,6 @@ static inline void *ds_to_priv(struct dsa_switch *ds)
 
 static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst)
 {
-       return dst->tag_protocol != DSA_TAG_PROTO_NONE;
+       return dst->rcv != NULL;
 }
-
 #endif