aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/dsa.h
diff options
context:
space:
mode:
authorBen Hutchings <ben@decadent.org.uk>2011-11-27 12:06:08 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-29 00:21:36 -0500
commitc8f0b86996c88081095124d16b869e8d8a1c02c5 (patch)
treec8ae0274df112c03a9029625aec9e3eb4e2e7026 /include/net/dsa.h
parentfa67a04497c03a1ead12cd896262de14980311e8 (diff)
dsa: Move all definitions needed by drivers into <net/dsa.h>
Any headers included by drivers should be under include/, and any definitions they use are not really private to the core as the name "dsa_priv.h" suggests. Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Acked-by: Lennert Buytenhek <buytenh@wantstofly.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/dsa.h')
-rw-r--r--include/net/dsa.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/include/net/dsa.h b/include/net/dsa.h
index 32a1b49e8a8c..b78db3c09608 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -11,6 +11,7 @@
11#ifndef __LINUX_NET_DSA_H 11#ifndef __LINUX_NET_DSA_H
12#define __LINUX_NET_DSA_H 12#define __LINUX_NET_DSA_H
13 13
14#include <linux/list.h>
14#include <linux/timer.h> 15#include <linux/timer.h>
15#include <linux/workqueue.h> 16#include <linux/workqueue.h>
16 17
@@ -90,6 +91,95 @@ struct dsa_switch_tree {
90 struct dsa_switch *ds[DSA_MAX_SWITCHES]; 91 struct dsa_switch *ds[DSA_MAX_SWITCHES];
91}; 92};
92 93
94struct dsa_switch {
95 /*
96 * Parent switch tree, and switch index.
97 */
98 struct dsa_switch_tree *dst;
99 int index;
100
101 /*
102 * Configuration data for this switch.
103 */
104 struct dsa_chip_data *pd;
105
106 /*
107 * The used switch driver.
108 */
109 struct dsa_switch_driver *drv;
110
111 /*
112 * Reference to mii bus to use.
113 */
114 struct mii_bus *master_mii_bus;
115
116 /*
117 * Slave mii_bus and devices for the individual ports.
118 */
119 u32 dsa_port_mask;
120 u32 phys_port_mask;
121 struct mii_bus *slave_mii_bus;
122 struct net_device *ports[DSA_MAX_PORTS];
123};
124
125static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
126{
127 return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
128}
129
130static inline u8 dsa_upstream_port(struct dsa_switch *ds)
131{
132 struct dsa_switch_tree *dst = ds->dst;
133
134 /*
135 * If this is the root switch (i.e. the switch that connects
136 * to the CPU), return the cpu port number on this switch.
137 * Else return the (DSA) port number that connects to the
138 * switch that is one hop closer to the cpu.
139 */
140 if (dst->cpu_switch == ds->index)
141 return dst->cpu_port;
142 else
143 return ds->pd->rtable[dst->cpu_switch];
144}
145
146struct dsa_switch_driver {
147 struct list_head list;
148
149 __be16 tag_protocol;
150 int priv_size;
151
152 /*
153 * Probing and setup.
154 */
155 char *(*probe)(struct mii_bus *bus, int sw_addr);
156 int (*setup)(struct dsa_switch *ds);
157 int (*set_addr)(struct dsa_switch *ds, u8 *addr);
158
159 /*
160 * Access to the switch's PHY registers.
161 */
162 int (*phy_read)(struct dsa_switch *ds, int port, int regnum);
163 int (*phy_write)(struct dsa_switch *ds, int port,
164 int regnum, u16 val);
165
166 /*
167 * Link state polling and IRQ handling.
168 */
169 void (*poll_link)(struct dsa_switch *ds);
170
171 /*
172 * ethtool hardware statistics.
173 */
174 void (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
175 void (*get_ethtool_stats)(struct dsa_switch *ds,
176 int port, uint64_t *data);
177 int (*get_sset_count)(struct dsa_switch *ds);
178};
179
180void register_switch_driver(struct dsa_switch_driver *type);
181void unregister_switch_driver(struct dsa_switch_driver *type);
182
93/* 183/*
94 * The original DSA tag format and some other tag formats have no 184 * The original DSA tag format and some other tag formats have no
95 * ethertype, which means that we need to add a little hack to the 185 * ethertype, which means that we need to add a little hack to the