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