dsa: Move all definitions needed by drivers into <net/dsa.h>
[deliverable/linux.git] / include / net / dsa.h
index 32a1b49e8a8c20a8a403c218ba7f6c5bdc877650..b78db3c096083cb23d3ef1d4932ba64174f9f597 100644 (file)
@@ -11,6 +11,7 @@
 #ifndef __LINUX_NET_DSA_H
 #define __LINUX_NET_DSA_H
 
+#include <linux/list.h>
 #include <linux/timer.h>
 #include <linux/workqueue.h>
 
@@ -90,6 +91,95 @@ struct dsa_switch_tree {
        struct dsa_switch       *ds[DSA_MAX_SWITCHES];
 };
 
+struct dsa_switch {
+       /*
+        * Parent switch tree, and switch index.
+        */
+       struct dsa_switch_tree  *dst;
+       int                     index;
+
+       /*
+        * Configuration data for this switch.
+        */
+       struct dsa_chip_data    *pd;
+
+       /*
+        * The used switch driver.
+        */
+       struct dsa_switch_driver        *drv;
+
+       /*
+        * Reference to mii bus to use.
+        */
+       struct mii_bus          *master_mii_bus;
+
+       /*
+        * Slave mii_bus and devices for the individual ports.
+        */
+       u32                     dsa_port_mask;
+       u32                     phys_port_mask;
+       struct mii_bus          *slave_mii_bus;
+       struct net_device       *ports[DSA_MAX_PORTS];
+};
+
+static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
+{
+       return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
+}
+
+static inline u8 dsa_upstream_port(struct dsa_switch *ds)
+{
+       struct dsa_switch_tree *dst = ds->dst;
+
+       /*
+        * If this is the root switch (i.e. the switch that connects
+        * to the CPU), return the cpu port number on this switch.
+        * Else return the (DSA) port number that connects to the
+        * switch that is one hop closer to the cpu.
+        */
+       if (dst->cpu_switch == ds->index)
+               return dst->cpu_port;
+       else
+               return ds->pd->rtable[dst->cpu_switch];
+}
+
+struct dsa_switch_driver {
+       struct list_head        list;
+
+       __be16                  tag_protocol;
+       int                     priv_size;
+
+       /*
+        * Probing and setup.
+        */
+       char    *(*probe)(struct mii_bus *bus, int sw_addr);
+       int     (*setup)(struct dsa_switch *ds);
+       int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
+
+       /*
+        * Access to the switch's PHY registers.
+        */
+       int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
+       int     (*phy_write)(struct dsa_switch *ds, int port,
+                            int regnum, u16 val);
+
+       /*
+        * Link state polling and IRQ handling.
+        */
+       void    (*poll_link)(struct dsa_switch *ds);
+
+       /*
+        * ethtool hardware statistics.
+        */
+       void    (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
+       void    (*get_ethtool_stats)(struct dsa_switch *ds,
+                                    int port, uint64_t *data);
+       int     (*get_sset_count)(struct dsa_switch *ds);
+};
+
+void register_switch_driver(struct dsa_switch_driver *type);
+void unregister_switch_driver(struct dsa_switch_driver *type);
+
 /*
  * The original DSA tag format and some other tag formats have no
  * ethertype, which means that we need to add a little hack to the
This page took 0.02802 seconds and 5 git commands to generate.