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