xref: /openbmc/linux/include/net/dsa.h (revision aac5987a)
1 /*
2  * include/net/dsa.h - Driver for Distributed Switch Architecture switch chips
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 __LINUX_NET_DSA_H
12 #define __LINUX_NET_DSA_H
13 
14 #include <linux/if.h>
15 #include <linux/if_ether.h>
16 #include <linux/list.h>
17 #include <linux/notifier.h>
18 #include <linux/timer.h>
19 #include <linux/workqueue.h>
20 #include <linux/of.h>
21 #include <linux/ethtool.h>
22 
23 struct tc_action;
24 struct phy_device;
25 struct fixed_phy_status;
26 
27 enum dsa_tag_protocol {
28 	DSA_TAG_PROTO_NONE = 0,
29 	DSA_TAG_PROTO_DSA,
30 	DSA_TAG_PROTO_TRAILER,
31 	DSA_TAG_PROTO_EDSA,
32 	DSA_TAG_PROTO_BRCM,
33 	DSA_TAG_PROTO_QCA,
34 	DSA_TAG_LAST,		/* MUST BE LAST */
35 };
36 
37 #define DSA_MAX_SWITCHES	4
38 #define DSA_MAX_PORTS		12
39 
40 #define DSA_RTABLE_NONE		-1
41 
42 struct dsa_chip_data {
43 	/*
44 	 * How to access the switch configuration registers.
45 	 */
46 	struct device	*host_dev;
47 	int		sw_addr;
48 
49 	/*
50 	 * Reference to network devices
51 	 */
52 	struct device	*netdev[DSA_MAX_PORTS];
53 
54 	/* set to size of eeprom if supported by the switch */
55 	int		eeprom_len;
56 
57 	/* Device tree node pointer for this specific switch chip
58 	 * used during switch setup in case additional properties
59 	 * and resources needs to be used
60 	 */
61 	struct device_node *of_node;
62 
63 	/*
64 	 * The names of the switch's ports.  Use "cpu" to
65 	 * designate the switch port that the cpu is connected to,
66 	 * "dsa" to indicate that this port is a DSA link to
67 	 * another switch, NULL to indicate the port is unused,
68 	 * or any other string to indicate this is a physical port.
69 	 */
70 	char		*port_names[DSA_MAX_PORTS];
71 	struct device_node *port_dn[DSA_MAX_PORTS];
72 
73 	/*
74 	 * An array of which element [a] indicates which port on this
75 	 * switch should be used to send packets to that are destined
76 	 * for switch a. Can be NULL if there is only one switch chip.
77 	 */
78 	s8		rtable[DSA_MAX_SWITCHES];
79 };
80 
81 struct dsa_platform_data {
82 	/*
83 	 * Reference to a Linux network interface that connects
84 	 * to the root switch chip of the tree.
85 	 */
86 	struct device	*netdev;
87 	struct net_device *of_netdev;
88 
89 	/*
90 	 * Info structs describing each of the switch chips
91 	 * connected via this network interface.
92 	 */
93 	int		nr_chips;
94 	struct dsa_chip_data	*chip;
95 };
96 
97 struct packet_type;
98 
99 struct dsa_switch_tree {
100 	struct list_head	list;
101 
102 	/* Notifier chain for switch-wide events */
103 	struct raw_notifier_head	nh;
104 
105 	/* Tree identifier */
106 	u32 tree;
107 
108 	/* Number of switches attached to this tree */
109 	struct kref refcount;
110 
111 	/* Has this tree been applied to the hardware? */
112 	bool applied;
113 
114 	/*
115 	 * Configuration data for the platform device that owns
116 	 * this dsa switch tree instance.
117 	 */
118 	struct dsa_platform_data	*pd;
119 
120 	/*
121 	 * Reference to network device to use, and which tagging
122 	 * protocol to use.
123 	 */
124 	struct net_device	*master_netdev;
125 	int			(*rcv)(struct sk_buff *skb,
126 				       struct net_device *dev,
127 				       struct packet_type *pt,
128 				       struct net_device *orig_dev);
129 
130 	/*
131 	 * Original copy of the master netdev ethtool_ops
132 	 */
133 	struct ethtool_ops	master_ethtool_ops;
134 	const struct ethtool_ops *master_orig_ethtool_ops;
135 
136 	/*
137 	 * The switch and port to which the CPU is attached.
138 	 */
139 	struct dsa_switch	*cpu_switch;
140 	s8			cpu_port;
141 
142 	/*
143 	 * Data for the individual switch chips.
144 	 */
145 	struct dsa_switch	*ds[DSA_MAX_SWITCHES];
146 
147 	/*
148 	 * Tagging protocol operations for adding and removing an
149 	 * encapsulation tag.
150 	 */
151 	const struct dsa_device_ops *tag_ops;
152 };
153 
154 /* TC matchall action types, only mirroring for now */
155 enum dsa_port_mall_action_type {
156 	DSA_PORT_MALL_MIRROR,
157 };
158 
159 /* TC mirroring entry */
160 struct dsa_mall_mirror_tc_entry {
161 	u8 to_local_port;
162 	bool ingress;
163 };
164 
165 /* TC matchall entry */
166 struct dsa_mall_tc_entry {
167 	struct list_head list;
168 	unsigned long cookie;
169 	enum dsa_port_mall_action_type type;
170 	union {
171 		struct dsa_mall_mirror_tc_entry mirror;
172 	};
173 };
174 
175 
176 struct dsa_port {
177 	struct dsa_switch	*ds;
178 	unsigned int		index;
179 	const char		*name;
180 	struct net_device	*netdev;
181 	struct device_node	*dn;
182 	unsigned int		ageing_time;
183 	u8			stp_state;
184 	struct net_device	*bridge_dev;
185 };
186 
187 struct dsa_switch {
188 	struct device *dev;
189 
190 	/*
191 	 * Parent switch tree, and switch index.
192 	 */
193 	struct dsa_switch_tree	*dst;
194 	int			index;
195 
196 	/* Listener for switch fabric events */
197 	struct notifier_block	nb;
198 
199 	/*
200 	 * Give the switch driver somewhere to hang its private data
201 	 * structure.
202 	 */
203 	void *priv;
204 
205 	/*
206 	 * Configuration data for this switch.
207 	 */
208 	struct dsa_chip_data	*cd;
209 
210 	/*
211 	 * The switch operations.
212 	 */
213 	const struct dsa_switch_ops	*ops;
214 
215 	/*
216 	 * An array of which element [a] indicates which port on this
217 	 * switch should be used to send packets to that are destined
218 	 * for switch a. Can be NULL if there is only one switch chip.
219 	 */
220 	s8		rtable[DSA_MAX_SWITCHES];
221 
222 	/*
223 	 * The lower device this switch uses to talk to the host
224 	 */
225 	struct net_device *master_netdev;
226 
227 	/*
228 	 * Slave mii_bus and devices for the individual ports.
229 	 */
230 	u32			dsa_port_mask;
231 	u32			cpu_port_mask;
232 	u32			enabled_port_mask;
233 	u32			phys_mii_mask;
234 	struct mii_bus		*slave_mii_bus;
235 
236 	/* Dynamically allocated ports, keep last */
237 	size_t num_ports;
238 	struct dsa_port ports[];
239 };
240 
241 static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
242 {
243 	return !!(ds == ds->dst->cpu_switch && p == ds->dst->cpu_port);
244 }
245 
246 static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
247 {
248 	return !!((ds->dsa_port_mask) & (1 << p));
249 }
250 
251 static inline bool dsa_is_port_initialized(struct dsa_switch *ds, int p)
252 {
253 	return ds->enabled_port_mask & (1 << p) && ds->ports[p].netdev;
254 }
255 
256 static inline u8 dsa_upstream_port(struct dsa_switch *ds)
257 {
258 	struct dsa_switch_tree *dst = ds->dst;
259 
260 	/*
261 	 * If this is the root switch (i.e. the switch that connects
262 	 * to the CPU), return the cpu port number on this switch.
263 	 * Else return the (DSA) port number that connects to the
264 	 * switch that is one hop closer to the cpu.
265 	 */
266 	if (dst->cpu_switch == ds)
267 		return dst->cpu_port;
268 	else
269 		return ds->rtable[dst->cpu_switch->index];
270 }
271 
272 struct switchdev_trans;
273 struct switchdev_obj;
274 struct switchdev_obj_port_fdb;
275 struct switchdev_obj_port_mdb;
276 struct switchdev_obj_port_vlan;
277 
278 #define DSA_NOTIFIER_BRIDGE_JOIN		1
279 #define DSA_NOTIFIER_BRIDGE_LEAVE		2
280 
281 /* DSA_NOTIFIER_BRIDGE_* */
282 struct dsa_notifier_bridge_info {
283 	struct net_device *br;
284 	int sw_index;
285 	int port;
286 };
287 
288 struct dsa_switch_ops {
289 	/*
290 	 * Probing and setup.
291 	 */
292 	const char	*(*probe)(struct device *dsa_dev,
293 				  struct device *host_dev, int sw_addr,
294 				  void **priv);
295 
296 	enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds);
297 
298 	int	(*setup)(struct dsa_switch *ds);
299 	int	(*set_addr)(struct dsa_switch *ds, u8 *addr);
300 	u32	(*get_phy_flags)(struct dsa_switch *ds, int port);
301 
302 	/*
303 	 * Access to the switch's PHY registers.
304 	 */
305 	int	(*phy_read)(struct dsa_switch *ds, int port, int regnum);
306 	int	(*phy_write)(struct dsa_switch *ds, int port,
307 			     int regnum, u16 val);
308 
309 	/*
310 	 * Link state adjustment (called from libphy)
311 	 */
312 	void	(*adjust_link)(struct dsa_switch *ds, int port,
313 				struct phy_device *phydev);
314 	void	(*fixed_link_update)(struct dsa_switch *ds, int port,
315 				struct fixed_phy_status *st);
316 
317 	/*
318 	 * ethtool hardware statistics.
319 	 */
320 	void	(*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
321 	void	(*get_ethtool_stats)(struct dsa_switch *ds,
322 				     int port, uint64_t *data);
323 	int	(*get_sset_count)(struct dsa_switch *ds);
324 
325 	/*
326 	 * ethtool Wake-on-LAN
327 	 */
328 	void	(*get_wol)(struct dsa_switch *ds, int port,
329 			   struct ethtool_wolinfo *w);
330 	int	(*set_wol)(struct dsa_switch *ds, int port,
331 			   struct ethtool_wolinfo *w);
332 
333 	/*
334 	 * Suspend and resume
335 	 */
336 	int	(*suspend)(struct dsa_switch *ds);
337 	int	(*resume)(struct dsa_switch *ds);
338 
339 	/*
340 	 * Port enable/disable
341 	 */
342 	int	(*port_enable)(struct dsa_switch *ds, int port,
343 			       struct phy_device *phy);
344 	void	(*port_disable)(struct dsa_switch *ds, int port,
345 				struct phy_device *phy);
346 
347 	/*
348 	 * EEE setttings
349 	 */
350 	int	(*set_eee)(struct dsa_switch *ds, int port,
351 			   struct phy_device *phydev,
352 			   struct ethtool_eee *e);
353 	int	(*get_eee)(struct dsa_switch *ds, int port,
354 			   struct ethtool_eee *e);
355 
356 	/* EEPROM access */
357 	int	(*get_eeprom_len)(struct dsa_switch *ds);
358 	int	(*get_eeprom)(struct dsa_switch *ds,
359 			      struct ethtool_eeprom *eeprom, u8 *data);
360 	int	(*set_eeprom)(struct dsa_switch *ds,
361 			      struct ethtool_eeprom *eeprom, u8 *data);
362 
363 	/*
364 	 * Register access.
365 	 */
366 	int	(*get_regs_len)(struct dsa_switch *ds, int port);
367 	void	(*get_regs)(struct dsa_switch *ds, int port,
368 			    struct ethtool_regs *regs, void *p);
369 
370 	/*
371 	 * Bridge integration
372 	 */
373 	int	(*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
374 	int	(*port_bridge_join)(struct dsa_switch *ds, int port,
375 				    struct net_device *bridge);
376 	void	(*port_bridge_leave)(struct dsa_switch *ds, int port,
377 				     struct net_device *bridge);
378 	void	(*port_stp_state_set)(struct dsa_switch *ds, int port,
379 				      u8 state);
380 	void	(*port_fast_age)(struct dsa_switch *ds, int port);
381 
382 	/*
383 	 * VLAN support
384 	 */
385 	int	(*port_vlan_filtering)(struct dsa_switch *ds, int port,
386 				       bool vlan_filtering);
387 	int	(*port_vlan_prepare)(struct dsa_switch *ds, int port,
388 				     const struct switchdev_obj_port_vlan *vlan,
389 				     struct switchdev_trans *trans);
390 	void	(*port_vlan_add)(struct dsa_switch *ds, int port,
391 				 const struct switchdev_obj_port_vlan *vlan,
392 				 struct switchdev_trans *trans);
393 	int	(*port_vlan_del)(struct dsa_switch *ds, int port,
394 				 const struct switchdev_obj_port_vlan *vlan);
395 	int	(*port_vlan_dump)(struct dsa_switch *ds, int port,
396 				  struct switchdev_obj_port_vlan *vlan,
397 				  int (*cb)(struct switchdev_obj *obj));
398 
399 	/*
400 	 * Forwarding database
401 	 */
402 	int	(*port_fdb_prepare)(struct dsa_switch *ds, int port,
403 				    const struct switchdev_obj_port_fdb *fdb,
404 				    struct switchdev_trans *trans);
405 	void	(*port_fdb_add)(struct dsa_switch *ds, int port,
406 				const struct switchdev_obj_port_fdb *fdb,
407 				struct switchdev_trans *trans);
408 	int	(*port_fdb_del)(struct dsa_switch *ds, int port,
409 				const struct switchdev_obj_port_fdb *fdb);
410 	int	(*port_fdb_dump)(struct dsa_switch *ds, int port,
411 				 struct switchdev_obj_port_fdb *fdb,
412 				 int (*cb)(struct switchdev_obj *obj));
413 
414 	/*
415 	 * Multicast database
416 	 */
417 	int	(*port_mdb_prepare)(struct dsa_switch *ds, int port,
418 				    const struct switchdev_obj_port_mdb *mdb,
419 				    struct switchdev_trans *trans);
420 	void	(*port_mdb_add)(struct dsa_switch *ds, int port,
421 				const struct switchdev_obj_port_mdb *mdb,
422 				struct switchdev_trans *trans);
423 	int	(*port_mdb_del)(struct dsa_switch *ds, int port,
424 				const struct switchdev_obj_port_mdb *mdb);
425 	int	(*port_mdb_dump)(struct dsa_switch *ds, int port,
426 				 struct switchdev_obj_port_mdb *mdb,
427 				 int (*cb)(struct switchdev_obj *obj));
428 
429 	/*
430 	 * RXNFC
431 	 */
432 	int	(*get_rxnfc)(struct dsa_switch *ds, int port,
433 			     struct ethtool_rxnfc *nfc, u32 *rule_locs);
434 	int	(*set_rxnfc)(struct dsa_switch *ds, int port,
435 			     struct ethtool_rxnfc *nfc);
436 
437 	/*
438 	 * TC integration
439 	 */
440 	int	(*port_mirror_add)(struct dsa_switch *ds, int port,
441 				   struct dsa_mall_mirror_tc_entry *mirror,
442 				   bool ingress);
443 	void	(*port_mirror_del)(struct dsa_switch *ds, int port,
444 				   struct dsa_mall_mirror_tc_entry *mirror);
445 };
446 
447 struct dsa_switch_driver {
448 	struct list_head	list;
449 	const struct dsa_switch_ops *ops;
450 };
451 
452 void register_switch_driver(struct dsa_switch_driver *type);
453 void unregister_switch_driver(struct dsa_switch_driver *type);
454 struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev);
455 struct net_device *dsa_dev_to_net_device(struct device *dev);
456 
457 static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst)
458 {
459 	return dst->rcv != NULL;
460 }
461 
462 struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n);
463 void dsa_unregister_switch(struct dsa_switch *ds);
464 int dsa_register_switch(struct dsa_switch *ds, struct device *dev);
465 #ifdef CONFIG_PM_SLEEP
466 int dsa_switch_suspend(struct dsa_switch *ds);
467 int dsa_switch_resume(struct dsa_switch *ds);
468 #else
469 static inline int dsa_switch_suspend(struct dsa_switch *ds)
470 {
471 	return 0;
472 }
473 static inline int dsa_switch_resume(struct dsa_switch *ds)
474 {
475 	return 0;
476 }
477 #endif /* CONFIG_PM_SLEEP */
478 
479 #endif
480