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