]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - include/net/dsa.h
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 151
[mirror_ubuntu-jammy-kernel.git] / include / net / dsa.h
CommitLineData
91da11f8
LB
1/*
2 * include/net/dsa.h - Driver for Distributed Switch Architecture switch chips
e84665c9 3 * Copyright (c) 2008-2009 Marvell Semiconductor
91da11f8
LB
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
4d56a29f 14#include <linux/if.h>
ea1f51be 15#include <linux/if_ether.h>
c8f0b869 16#include <linux/list.h>
f515f192 17#include <linux/notifier.h>
cf50dcc2
BH
18#include <linux/timer.h>
19#include <linux/workqueue.h>
fa981d9a 20#include <linux/of.h>
a2820543 21#include <linux/ethtool.h>
0336369d 22#include <linux/net_tstamp.h>
11d8f3dd 23#include <linux/phy.h>
ecfc9372 24#include <linux/platform_data/dsa.h>
96567d5d 25#include <net/devlink.h>
f0c24ccf 26#include <net/switchdev.h>
cf50dcc2 27
f50f2127 28struct tc_action;
4d56a29f
RK
29struct phy_device;
30struct fixed_phy_status;
11d8f3dd 31struct phylink_link_state;
f50f2127 32
0b42f033
AL
33#define DSA_TAG_PROTO_NONE_VALUE 0
34#define DSA_TAG_PROTO_BRCM_VALUE 1
35#define DSA_TAG_PROTO_BRCM_PREPEND_VALUE 2
36#define DSA_TAG_PROTO_DSA_VALUE 3
37#define DSA_TAG_PROTO_EDSA_VALUE 4
38#define DSA_TAG_PROTO_GSWIP_VALUE 5
39#define DSA_TAG_PROTO_KSZ9477_VALUE 6
40#define DSA_TAG_PROTO_KSZ9893_VALUE 7
41#define DSA_TAG_PROTO_LAN9303_VALUE 8
42#define DSA_TAG_PROTO_MTK_VALUE 9
43#define DSA_TAG_PROTO_QCA_VALUE 10
44#define DSA_TAG_PROTO_TRAILER_VALUE 11
f9bbe447 45#define DSA_TAG_PROTO_8021Q_VALUE 12
227d07a0 46#define DSA_TAG_PROTO_SJA1105_VALUE 13
0b42f033 47
ac7a04c3 48enum dsa_tag_protocol {
0b42f033
AL
49 DSA_TAG_PROTO_NONE = DSA_TAG_PROTO_NONE_VALUE,
50 DSA_TAG_PROTO_BRCM = DSA_TAG_PROTO_BRCM_VALUE,
51 DSA_TAG_PROTO_BRCM_PREPEND = DSA_TAG_PROTO_BRCM_PREPEND_VALUE,
52 DSA_TAG_PROTO_DSA = DSA_TAG_PROTO_DSA_VALUE,
53 DSA_TAG_PROTO_EDSA = DSA_TAG_PROTO_EDSA_VALUE,
54 DSA_TAG_PROTO_GSWIP = DSA_TAG_PROTO_GSWIP_VALUE,
55 DSA_TAG_PROTO_KSZ9477 = DSA_TAG_PROTO_KSZ9477_VALUE,
56 DSA_TAG_PROTO_KSZ9893 = DSA_TAG_PROTO_KSZ9893_VALUE,
57 DSA_TAG_PROTO_LAN9303 = DSA_TAG_PROTO_LAN9303_VALUE,
58 DSA_TAG_PROTO_MTK = DSA_TAG_PROTO_MTK_VALUE,
59 DSA_TAG_PROTO_QCA = DSA_TAG_PROTO_QCA_VALUE,
60 DSA_TAG_PROTO_TRAILER = DSA_TAG_PROTO_TRAILER_VALUE,
f9bbe447 61 DSA_TAG_PROTO_8021Q = DSA_TAG_PROTO_8021Q_VALUE,
227d07a0 62 DSA_TAG_PROTO_SJA1105 = DSA_TAG_PROTO_SJA1105_VALUE,
ac7a04c3 63};
5037d532 64
5075314e 65struct packet_type;
90af1059 66struct dsa_switch;
3e8a72d1 67
68277a2c
JC
68struct dsa_device_ops {
69 struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev);
70 struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
89e49506 71 struct packet_type *pt);
598a9680
JC
72 int (*flow_dissect)(const struct sk_buff *skb, __be16 *proto,
73 int *offset);
cc1939e4
VO
74 /* Used to determine which traffic should match the DSA filter in
75 * eth_type_trans, and which, if any, should bypass it and be processed
76 * as regular on the master net device.
77 */
78 bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
a5dd3087 79 unsigned int overhead;
875138f8 80 const char *name;
056eed2f 81 enum dsa_tag_protocol proto;
68277a2c
JC
82};
83
0b42f033
AL
84#define DSA_TAG_DRIVER_ALIAS "dsa_tag-"
85#define MODULE_ALIAS_DSA_TAG_DRIVER(__proto) \
86 MODULE_ALIAS(DSA_TAG_DRIVER_ALIAS __stringify(__proto##_VALUE))
87
b68b0dd0
VO
88struct dsa_skb_cb {
89 struct sk_buff *clone;
97a69a0d 90 bool deferred_xmit;
b68b0dd0
VO
91};
92
93struct __dsa_skb_cb {
94 struct dsa_skb_cb cb;
95 u8 priv[48 - sizeof(struct dsa_skb_cb)];
96};
97
98#define __DSA_SKB_CB(skb) ((struct __dsa_skb_cb *)((skb)->cb))
99
100#define DSA_SKB_CB(skb) ((struct dsa_skb_cb *)((skb)->cb))
101
b68b0dd0
VO
102#define DSA_SKB_CB_PRIV(skb) \
103 ((void *)(skb)->cb + offsetof(struct __dsa_skb_cb, priv))
104
cf50dcc2 105struct dsa_switch_tree {
83c0afae
AL
106 struct list_head list;
107
f515f192
VD
108 /* Notifier chain for switch-wide events */
109 struct raw_notifier_head nh;
110
83c0afae 111 /* Tree identifier */
49463b7f 112 unsigned int index;
83c0afae
AL
113
114 /* Number of switches attached to this tree */
115 struct kref refcount;
116
117 /* Has this tree been applied to the hardware? */
ec15dd42 118 bool setup;
83c0afae 119
cf50dcc2
BH
120 /*
121 * Configuration data for the platform device that owns
122 * this dsa switch tree instance.
123 */
124 struct dsa_platform_data *pd;
125
cf50dcc2 126 /*
8b0d3ea5 127 * The switch port to which the CPU is attached.
cf50dcc2 128 */
8b0d3ea5 129 struct dsa_port *cpu_dp;
cf50dcc2 130
cf50dcc2
BH
131 /*
132 * Data for the individual switch chips.
133 */
134 struct dsa_switch *ds[DSA_MAX_SWITCHES];
135};
136
f50f2127
FF
137/* TC matchall action types, only mirroring for now */
138enum dsa_port_mall_action_type {
139 DSA_PORT_MALL_MIRROR,
140};
141
142/* TC mirroring entry */
143struct dsa_mall_mirror_tc_entry {
144 u8 to_local_port;
145 bool ingress;
146};
147
148/* TC matchall entry */
149struct dsa_mall_tc_entry {
150 struct list_head list;
151 unsigned long cookie;
152 enum dsa_port_mall_action_type type;
153 union {
154 struct dsa_mall_mirror_tc_entry mirror;
155 };
156};
157
158
c8b09808 159struct dsa_port {
f8b8b1cd
VD
160 /* A CPU port is physically connected to a master device.
161 * A user port exposed to userspace has a slave device.
162 */
163 union {
164 struct net_device *master;
165 struct net_device *slave;
166 };
167
15240248
VD
168 /* CPU port tagging operations used by master or slave devices */
169 const struct dsa_device_ops *tag_ops;
170
3e41f93b
VD
171 /* Copies for faster access in master receive hot path */
172 struct dsa_switch_tree *dst;
173 struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
174 struct packet_type *pt);
cc1939e4 175 bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
3e41f93b 176
057cad2c
VD
177 enum {
178 DSA_PORT_TYPE_UNUSED = 0,
179 DSA_PORT_TYPE_CPU,
180 DSA_PORT_TYPE_DSA,
181 DSA_PORT_TYPE_USER,
182 } type;
183
818be848
VD
184 struct dsa_switch *ds;
185 unsigned int index;
71e0bbde 186 const char *name;
24a9332a 187 const struct dsa_port *cpu_dp;
a2c7023f 188 const char *mac;
189b0d93 189 struct device_node *dn;
34a79f63 190 unsigned int ageing_time;
33162e9a 191 bool vlan_filtering;
732f794c 192 u8 stp_state;
a5e9a02e 193 struct net_device *bridge_dev;
96567d5d 194 struct devlink_port devlink_port;
aab9c406 195 struct phylink *pl;
97a69a0d
VO
196
197 struct work_struct xmit_work;
198 struct sk_buff_head xmit_queue;
199
c362beb0
VO
200 /*
201 * Give the switch driver somewhere to hang its per-port private data
202 * structures (accessible from the tagger).
203 */
204 void *priv;
205
67dbb9d4
FF
206 /*
207 * Original copy of the master netdev ethtool_ops
208 */
67dbb9d4 209 const struct ethtool_ops *orig_ethtool_ops;
da7b9e9b
FF
210
211 /*
212 * Original copy of the master netdev net_device_ops
213 */
214 const struct net_device_ops *orig_ndo_ops;
c8b09808
AL
215};
216
c8f0b869 217struct dsa_switch {
c33063d6
AL
218 struct device *dev;
219
c8f0b869
BH
220 /*
221 * Parent switch tree, and switch index.
222 */
223 struct dsa_switch_tree *dst;
99feaafc 224 unsigned int index;
c8f0b869 225
f515f192
VD
226 /* Listener for switch fabric events */
227 struct notifier_block nb;
228
7543a6d5
AL
229 /*
230 * Give the switch driver somewhere to hang its private data
231 * structure.
232 */
233 void *priv;
234
c8f0b869
BH
235 /*
236 * Configuration data for this switch.
237 */
ff04955c 238 struct dsa_chip_data *cd;
c8f0b869
BH
239
240 /*
9d490b4e 241 * The switch operations.
c8f0b869 242 */
a82f67af 243 const struct dsa_switch_ops *ops;
c8f0b869 244
66472fc0
AL
245 /*
246 * An array of which element [a] indicates which port on this
247 * switch should be used to send packets to that are destined
248 * for switch a. Can be NULL if there is only one switch chip.
249 */
250 s8 rtable[DSA_MAX_SWITCHES];
251
c8f0b869
BH
252 /*
253 * Slave mii_bus and devices for the individual ports.
254 */
0d8bcdd3 255 u32 phys_mii_mask;
c8f0b869 256 struct mii_bus *slave_mii_bus;
a0c02161 257
0f3da6af
VD
258 /* Ageing Time limits in msecs */
259 unsigned int ageing_time_min;
260 unsigned int ageing_time_max;
261
96567d5d
AL
262 /* devlink used to represent this switch device */
263 struct devlink *devlink;
264
55199df6
FF
265 /* Number of switch port queues */
266 unsigned int num_tx_queues;
267
8f5d16f6
VO
268 /* Disallow bridge core from requesting different VLAN awareness
269 * settings on ports if not hardware-supported
270 */
271 bool vlan_filtering_is_global;
272
14574676
VO
273 /* In case vlan_filtering_is_global is set, the VLAN awareness state
274 * should be retrieved from here and not from the per-port settings.
275 */
276 bool vlan_filtering;
277
0015b80a
SM
278 unsigned long *bitmap;
279 unsigned long _bitmap;
280
a0c02161
VD
281 /* Dynamically allocated ports, keep last */
282 size_t num_ports;
283 struct dsa_port ports[];
c8f0b869
BH
284};
285
c38c5a66 286static inline const struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
bff7b688 287{
c38c5a66
VD
288 return &ds->ports[p];
289}
bff7b688 290
c38c5a66
VD
291static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p)
292{
293 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED;
bff7b688
VD
294}
295
c8f0b869
BH
296static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
297{
c38c5a66 298 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU;
c8f0b869
BH
299}
300
60045cbf
AL
301static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
302{
c38c5a66 303 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA;
60045cbf
AL
304}
305
2b3e9891 306static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)
6cd456f3 307{
c38c5a66 308 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER;
6cd456f3
VD
309}
310
02bc6e54
VD
311static inline u32 dsa_user_ports(struct dsa_switch *ds)
312{
c38c5a66
VD
313 u32 mask = 0;
314 int p;
02bc6e54 315
c38c5a66
VD
316 for (p = 0; p < ds->num_ports; p++)
317 if (dsa_is_user_port(ds, p))
318 mask |= BIT(p);
319
320 return mask;
c8652c83
VD
321}
322
3b8fac5d
VD
323/* Return the local port used to reach an arbitrary switch port */
324static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
325 int port)
326{
327 if (device == ds->index)
328 return port;
329 else
330 return ds->rtable[device];
331}
332
333/* Return the local port used to reach the dedicated CPU port */
07073c79 334static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port)
c8f0b869 335{
07073c79
VD
336 const struct dsa_port *dp = dsa_to_port(ds, port);
337 const struct dsa_port *cpu_dp = dp->cpu_dp;
338
339 if (!cpu_dp)
340 return port;
c8f0b869 341
3b8fac5d 342 return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index);
c8f0b869
BH
343}
344
cf2d45f5
VO
345static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp)
346{
347 const struct dsa_switch *ds = dp->ds;
348
349 if (ds->vlan_filtering_is_global)
350 return ds->vlan_filtering;
351 else
352 return dp->vlan_filtering;
353}
354
2bedde1a
AS
355typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid,
356 bool is_static, void *data);
9d490b4e 357struct dsa_switch_ops {
5ed4e3eb
FF
358 enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds,
359 int port);
7b314362 360
c8f0b869 361 int (*setup)(struct dsa_switch *ds);
6819563e 362 u32 (*get_phy_flags)(struct dsa_switch *ds, int port);
c8f0b869
BH
363
364 /*
365 * Access to the switch's PHY registers.
366 */
367 int (*phy_read)(struct dsa_switch *ds, int port, int regnum);
368 int (*phy_write)(struct dsa_switch *ds, int port,
369 int regnum, u16 val);
370
ec9436ba
FF
371 /*
372 * Link state adjustment (called from libphy)
373 */
374 void (*adjust_link)(struct dsa_switch *ds, int port,
375 struct phy_device *phydev);
ce31b31c
FF
376 void (*fixed_link_update)(struct dsa_switch *ds, int port,
377 struct fixed_phy_status *st);
ec9436ba 378
11d8f3dd
FF
379 /*
380 * PHYLINK integration
381 */
382 void (*phylink_validate)(struct dsa_switch *ds, int port,
383 unsigned long *supported,
384 struct phylink_link_state *state);
385 int (*phylink_mac_link_state)(struct dsa_switch *ds, int port,
386 struct phylink_link_state *state);
387 void (*phylink_mac_config)(struct dsa_switch *ds, int port,
388 unsigned int mode,
389 const struct phylink_link_state *state);
390 void (*phylink_mac_an_restart)(struct dsa_switch *ds, int port);
391 void (*phylink_mac_link_down)(struct dsa_switch *ds, int port,
392 unsigned int mode,
393 phy_interface_t interface);
394 void (*phylink_mac_link_up)(struct dsa_switch *ds, int port,
395 unsigned int mode,
396 phy_interface_t interface,
397 struct phy_device *phydev);
398 void (*phylink_fixed_state)(struct dsa_switch *ds, int port,
399 struct phylink_link_state *state);
c8f0b869
BH
400 /*
401 * ethtool hardware statistics.
402 */
89f09048
FF
403 void (*get_strings)(struct dsa_switch *ds, int port,
404 u32 stringset, uint8_t *data);
c8f0b869
BH
405 void (*get_ethtool_stats)(struct dsa_switch *ds,
406 int port, uint64_t *data);
89f09048 407 int (*get_sset_count)(struct dsa_switch *ds, int port, int sset);
cf963573
FF
408 void (*get_ethtool_phy_stats)(struct dsa_switch *ds,
409 int port, uint64_t *data);
24462549 410
19e57c4e
FF
411 /*
412 * ethtool Wake-on-LAN
413 */
414 void (*get_wol)(struct dsa_switch *ds, int port,
415 struct ethtool_wolinfo *w);
416 int (*set_wol)(struct dsa_switch *ds, int port,
417 struct ethtool_wolinfo *w);
418
0336369d
BS
419 /*
420 * ethtool timestamp info
421 */
422 int (*get_ts_info)(struct dsa_switch *ds, int port,
423 struct ethtool_ts_info *ts);
424
24462549
FF
425 /*
426 * Suspend and resume
427 */
428 int (*suspend)(struct dsa_switch *ds);
429 int (*resume)(struct dsa_switch *ds);
b2f2af21
FF
430
431 /*
432 * Port enable/disable
433 */
434 int (*port_enable)(struct dsa_switch *ds, int port,
435 struct phy_device *phy);
75104db0 436 void (*port_disable)(struct dsa_switch *ds, int port);
7905288f
FF
437
438 /*
08f50061 439 * Port's MAC EEE settings
7905288f 440 */
08f50061
VD
441 int (*set_mac_eee)(struct dsa_switch *ds, int port,
442 struct ethtool_eee *e);
443 int (*get_mac_eee)(struct dsa_switch *ds, int port,
444 struct ethtool_eee *e);
51579c3f 445
6793abb4
GR
446 /* EEPROM access */
447 int (*get_eeprom_len)(struct dsa_switch *ds);
448 int (*get_eeprom)(struct dsa_switch *ds,
449 struct ethtool_eeprom *eeprom, u8 *data);
450 int (*set_eeprom)(struct dsa_switch *ds,
451 struct ethtool_eeprom *eeprom, u8 *data);
3d762a0f
GR
452
453 /*
454 * Register access.
455 */
456 int (*get_regs_len)(struct dsa_switch *ds, int port);
457 void (*get_regs)(struct dsa_switch *ds, int port,
458 struct ethtool_regs *regs, void *p);
b73adef6
FF
459
460 /*
461 * Bridge integration
462 */
34a79f63 463 int (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
71327a4e 464 int (*port_bridge_join)(struct dsa_switch *ds, int port,
a6692754 465 struct net_device *bridge);
f123f2fb
VD
466 void (*port_bridge_leave)(struct dsa_switch *ds, int port,
467 struct net_device *bridge);
43c44a9f
VD
468 void (*port_stp_state_set)(struct dsa_switch *ds, int port,
469 u8 state);
732f794c 470 void (*port_fast_age)(struct dsa_switch *ds, int port);
57652796
RK
471 int (*port_egress_floods)(struct dsa_switch *ds, int port,
472 bool unicast, bool multicast);
2a778e1b 473
11149536
VD
474 /*
475 * VLAN support
476 */
fb2dabad
VD
477 int (*port_vlan_filtering)(struct dsa_switch *ds, int port,
478 bool vlan_filtering);
80e02360
VD
479 int (*port_vlan_prepare)(struct dsa_switch *ds, int port,
480 const struct switchdev_obj_port_vlan *vlan);
481 void (*port_vlan_add)(struct dsa_switch *ds, int port,
482 const struct switchdev_obj_port_vlan *vlan);
76e398a6
VD
483 int (*port_vlan_del)(struct dsa_switch *ds, int port,
484 const struct switchdev_obj_port_vlan *vlan);
2a778e1b
VD
485 /*
486 * Forwarding database
487 */
1b6dd556 488 int (*port_fdb_add)(struct dsa_switch *ds, int port,
6c2c1dcb 489 const unsigned char *addr, u16 vid);
2a778e1b 490 int (*port_fdb_del)(struct dsa_switch *ds, int port,
6c2c1dcb 491 const unsigned char *addr, u16 vid);
ea70ba98 492 int (*port_fdb_dump)(struct dsa_switch *ds, int port,
2bedde1a 493 dsa_fdb_dump_cb_t *cb, void *data);
8df30255
VD
494
495 /*
496 * Multicast database
497 */
3709aadc
VD
498 int (*port_mdb_prepare)(struct dsa_switch *ds, int port,
499 const struct switchdev_obj_port_mdb *mdb);
500 void (*port_mdb_add)(struct dsa_switch *ds, int port,
501 const struct switchdev_obj_port_mdb *mdb);
8df30255
VD
502 int (*port_mdb_del)(struct dsa_switch *ds, int port,
503 const struct switchdev_obj_port_mdb *mdb);
bf9f2648
FF
504 /*
505 * RXNFC
506 */
507 int (*get_rxnfc)(struct dsa_switch *ds, int port,
508 struct ethtool_rxnfc *nfc, u32 *rule_locs);
509 int (*set_rxnfc)(struct dsa_switch *ds, int port,
510 struct ethtool_rxnfc *nfc);
f50f2127
FF
511
512 /*
513 * TC integration
514 */
515 int (*port_mirror_add)(struct dsa_switch *ds, int port,
516 struct dsa_mall_mirror_tc_entry *mirror,
517 bool ingress);
518 void (*port_mirror_del)(struct dsa_switch *ds, int port,
519 struct dsa_mall_mirror_tc_entry *mirror);
40ef2c93
VD
520
521 /*
522 * Cross-chip operations
523 */
524 int (*crosschip_bridge_join)(struct dsa_switch *ds, int sw_index,
525 int port, struct net_device *br);
526 void (*crosschip_bridge_leave)(struct dsa_switch *ds, int sw_index,
527 int port, struct net_device *br);
0336369d
BS
528
529 /*
530 * PTP functionality
531 */
532 int (*port_hwtstamp_get)(struct dsa_switch *ds, int port,
533 struct ifreq *ifr);
534 int (*port_hwtstamp_set)(struct dsa_switch *ds, int port,
535 struct ifreq *ifr);
90af1059
BS
536 bool (*port_txtstamp)(struct dsa_switch *ds, int port,
537 struct sk_buff *clone, unsigned int type);
538 bool (*port_rxtstamp)(struct dsa_switch *ds, int port,
539 struct sk_buff *skb, unsigned int type);
97a69a0d
VO
540
541 /*
542 * Deferred frame Tx
543 */
544 netdev_tx_t (*port_deferred_xmit)(struct dsa_switch *ds, int port,
545 struct sk_buff *skb);
c8f0b869
BH
546};
547
ab3d408d
FF
548struct dsa_switch_driver {
549 struct list_head list;
a82f67af 550 const struct dsa_switch_ops *ops;
ab3d408d
FF
551};
552
14b89f36 553struct net_device *dsa_dev_to_net_device(struct device *dev);
c8f0b869 554
73a7ece8 555/* Keep inline for faster access in hot path */
c6e970a0
AL
556static inline bool netdev_uses_dsa(struct net_device *dev)
557{
558#if IS_ENABLED(CONFIG_NET_DSA)
717ffbfb 559 return dev->dsa_ptr && dev->dsa_ptr->rcv;
c6e970a0
AL
560#endif
561 return false;
562}
563
cc1939e4
VO
564static inline bool dsa_can_decode(const struct sk_buff *skb,
565 struct net_device *dev)
566{
567#if IS_ENABLED(CONFIG_NET_DSA)
568 return !dev->dsa_ptr->filter || dev->dsa_ptr->filter(skb, dev);
569#endif
570 return false;
571}
572
a0c02161 573struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n);
83c0afae 574void dsa_unregister_switch(struct dsa_switch *ds);
23c9ee49 575int dsa_register_switch(struct dsa_switch *ds);
ea825e70
FF
576#ifdef CONFIG_PM_SLEEP
577int dsa_switch_suspend(struct dsa_switch *ds);
578int dsa_switch_resume(struct dsa_switch *ds);
579#else
580static inline int dsa_switch_suspend(struct dsa_switch *ds)
581{
582 return 0;
583}
584static inline int dsa_switch_resume(struct dsa_switch *ds)
585{
586 return 0;
587}
588#endif /* CONFIG_PM_SLEEP */
589
60724d4b
FF
590enum dsa_notifier_type {
591 DSA_PORT_REGISTER,
592 DSA_PORT_UNREGISTER,
593};
594
595struct dsa_notifier_info {
596 struct net_device *dev;
597};
598
599struct dsa_notifier_register_info {
600 struct dsa_notifier_info info; /* must be first */
601 struct net_device *master;
602 unsigned int port_number;
603 unsigned int switch_number;
604};
605
606static inline struct net_device *
607dsa_notifier_info_to_dev(const struct dsa_notifier_info *info)
608{
609 return info->dev;
610}
611
612#if IS_ENABLED(CONFIG_NET_DSA)
613int register_dsa_notifier(struct notifier_block *nb);
614int unregister_dsa_notifier(struct notifier_block *nb);
615int call_dsa_notifiers(unsigned long val, struct net_device *dev,
616 struct dsa_notifier_info *info);
617#else
618static inline int register_dsa_notifier(struct notifier_block *nb)
619{
620 return 0;
621}
622
623static inline int unregister_dsa_notifier(struct notifier_block *nb)
624{
625 return 0;
626}
627
628static inline int call_dsa_notifiers(unsigned long val, struct net_device *dev,
629 struct dsa_notifier_info *info)
630{
631 return NOTIFY_DONE;
632}
633#endif
634
0a5f14ce
FF
635/* Broadcom tag specific helpers to insert and extract queue/port number */
636#define BRCM_TAG_SET_PORT_QUEUE(p, q) ((p) << 8 | q)
637#define BRCM_TAG_GET_PORT(v) ((v) >> 8)
638#define BRCM_TAG_GET_QUEUE(v) ((v) & 0xff)
639
cf963573 640
97a69a0d 641netdev_tx_t dsa_enqueue_skb(struct sk_buff *skb, struct net_device *dev);
cf963573
FF
642int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data);
643int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data);
644int dsa_port_get_phy_sset_count(struct dsa_port *dp);
11d8f3dd 645void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up);
cf963573 646
d3b8c049
AL
647struct dsa_tag_driver {
648 const struct dsa_device_ops *ops;
649 struct list_head list;
650 struct module *owner;
651};
652
653void dsa_tag_drivers_register(struct dsa_tag_driver *dsa_tag_driver_array[],
654 unsigned int count,
655 struct module *owner);
656void dsa_tag_drivers_unregister(struct dsa_tag_driver *dsa_tag_driver_array[],
657 unsigned int count);
658
659#define dsa_tag_driver_module_drivers(__dsa_tag_drivers_array, __count) \
660static int __init dsa_tag_driver_module_init(void) \
661{ \
662 dsa_tag_drivers_register(__dsa_tag_drivers_array, __count, \
663 THIS_MODULE); \
664 return 0; \
665} \
666module_init(dsa_tag_driver_module_init); \
667 \
668static void __exit dsa_tag_driver_module_exit(void) \
669{ \
670 dsa_tag_drivers_unregister(__dsa_tag_drivers_array, __count); \
671} \
672module_exit(dsa_tag_driver_module_exit)
673
674/**
675 * module_dsa_tag_drivers() - Helper macro for registering DSA tag
676 * drivers
677 * @__ops_array: Array of tag driver strucutres
678 *
679 * Helper macro for DSA tag drivers which do not do anything special
680 * in module init/exit. Each module may only use this macro once, and
681 * calling it replaces module_init() and module_exit().
682 */
683#define module_dsa_tag_drivers(__ops_array) \
684dsa_tag_driver_module_drivers(__ops_array, ARRAY_SIZE(__ops_array))
685
686#define DSA_TAG_DRIVER_NAME(__ops) dsa_tag_driver ## _ ## __ops
687
688/* Create a static structure we can build a linked list of dsa_tag
689 * drivers
690 */
691#define DSA_TAG_DRIVER(__ops) \
692static struct dsa_tag_driver DSA_TAG_DRIVER_NAME(__ops) = { \
693 .ops = &__ops, \
694}
695
696/**
697 * module_dsa_tag_driver() - Helper macro for registering a single DSA tag
698 * driver
699 * @__ops: Single tag driver structures
700 *
701 * Helper macro for DSA tag drivers which do not do anything special
702 * in module init/exit. Each module may only use this macro once, and
703 * calling it replaces module_init() and module_exit().
704 */
705#define module_dsa_tag_driver(__ops) \
706DSA_TAG_DRIVER(__ops); \
707 \
708static struct dsa_tag_driver *dsa_tag_driver_array[] = { \
709 &DSA_TAG_DRIVER_NAME(__ops) \
710}; \
711module_dsa_tag_drivers(dsa_tag_driver_array)
91da11f8 712#endif
d3b8c049 713