Merge branch 'for-2.6.31' of git://fieldses.org/git/linux-nfsd
[linux-2.6] / net / dsa / dsa_priv.h
1 /*
2  * net/dsa/dsa_priv.h - Hardware switch handling
3  * Copyright (c) 2008-2009 Marvell Semiconductor
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  */
10
11 #ifndef __DSA_PRIV_H
12 #define __DSA_PRIV_H
13
14 #include <linux/list.h>
15 #include <linux/phy.h>
16 #include <linux/timer.h>
17 #include <linux/workqueue.h>
18 #include <net/dsa.h>
19
20 struct dsa_switch {
21         /*
22          * Parent switch tree, and switch index.
23          */
24         struct dsa_switch_tree  *dst;
25         int                     index;
26
27         /*
28          * Configuration data for this switch.
29          */
30         struct dsa_chip_data    *pd;
31
32         /*
33          * The used switch driver.
34          */
35         struct dsa_switch_driver        *drv;
36
37         /*
38          * Reference to mii bus to use.
39          */
40         struct mii_bus          *master_mii_bus;
41
42         /*
43          * Slave mii_bus and devices for the individual ports.
44          */
45         u32                     dsa_port_mask;
46         u32                     phys_port_mask;
47         struct mii_bus          *slave_mii_bus;
48         struct net_device       *ports[DSA_MAX_PORTS];
49 };
50
51 struct dsa_switch_tree {
52         /*
53          * Configuration data for the platform device that owns
54          * this dsa switch tree instance.
55          */
56         struct dsa_platform_data        *pd;
57
58         /*
59          * Reference to network device to use, and which tagging
60          * protocol to use.
61          */
62         struct net_device       *master_netdev;
63         __be16                  tag_protocol;
64
65         /*
66          * The switch and port to which the CPU is attached.
67          */
68         s8                      cpu_switch;
69         s8                      cpu_port;
70
71         /*
72          * Link state polling.
73          */
74         int                     link_poll_needed;
75         struct work_struct      link_poll_work;
76         struct timer_list       link_poll_timer;
77
78         /*
79          * Data for the individual switch chips.
80          */
81         struct dsa_switch       *ds[DSA_MAX_SWITCHES];
82 };
83
84 static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
85 {
86         return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
87 }
88
89 static inline u8 dsa_upstream_port(struct dsa_switch *ds)
90 {
91         struct dsa_switch_tree *dst = ds->dst;
92
93         /*
94          * If this is the root switch (i.e. the switch that connects
95          * to the CPU), return the cpu port number on this switch.
96          * Else return the (DSA) port number that connects to the
97          * switch that is one hop closer to the cpu.
98          */
99         if (dst->cpu_switch == ds->index)
100                 return dst->cpu_port;
101         else
102                 return ds->pd->rtable[dst->cpu_switch];
103 }
104
105 struct dsa_slave_priv {
106         /*
107          * The linux network interface corresponding to this
108          * switch port.
109          */
110         struct net_device       *dev;
111
112         /*
113          * Which switch this port is a part of, and the port index
114          * for this port.
115          */
116         struct dsa_switch       *parent;
117         u8                      port;
118
119         /*
120          * The phylib phy_device pointer for the PHY connected
121          * to this port.
122          */
123         struct phy_device       *phy;
124 };
125
126 struct dsa_switch_driver {
127         struct list_head        list;
128
129         __be16                  tag_protocol;
130         int                     priv_size;
131
132         /*
133          * Probing and setup.
134          */
135         char    *(*probe)(struct mii_bus *bus, int sw_addr);
136         int     (*setup)(struct dsa_switch *ds);
137         int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
138
139         /*
140          * Access to the switch's PHY registers.
141          */
142         int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
143         int     (*phy_write)(struct dsa_switch *ds, int port,
144                              int regnum, u16 val);
145
146         /*
147          * Link state polling and IRQ handling.
148          */
149         void    (*poll_link)(struct dsa_switch *ds);
150
151         /*
152          * ethtool hardware statistics.
153          */
154         void    (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
155         void    (*get_ethtool_stats)(struct dsa_switch *ds,
156                                      int port, uint64_t *data);
157         int     (*get_sset_count)(struct dsa_switch *ds);
158 };
159
160 /* dsa.c */
161 extern char dsa_driver_version[];
162 void register_switch_driver(struct dsa_switch_driver *type);
163 void unregister_switch_driver(struct dsa_switch_driver *type);
164
165 /* slave.c */
166 void dsa_slave_mii_bus_init(struct dsa_switch *ds);
167 struct net_device *dsa_slave_create(struct dsa_switch *ds,
168                                     struct device *parent,
169                                     int port, char *name);
170
171 /* tag_dsa.c */
172 int dsa_xmit(struct sk_buff *skb, struct net_device *dev);
173
174 /* tag_edsa.c */
175 int edsa_xmit(struct sk_buff *skb, struct net_device *dev);
176
177 /* tag_trailer.c */
178 int trailer_xmit(struct sk_buff *skb, struct net_device *dev);
179
180
181 #endif