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#define DSA_TAG_PROTO_KSZ8795_VALUE             14
  45
  46enum 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
  64struct packet_type;
  65struct dsa_switch;
  66
  67struct 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
  87struct dsa_skb_cb {
  88        struct sk_buff *clone;
  89        bool deferred_xmit;
  90};
  91
  92struct __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(skb) ((struct dsa_skb_cb *)((skb)->cb))
 100
 101#define DSA_SKB_CB_PRIV(skb)                    \
 102        ((void *)(skb)->cb + offsetof(struct __dsa_skb_cb, priv))
 103
 104struct dsa_switch_tree {
 105        struct list_head        list;
 106
 107        /* Notifier chain for switch-wide events */
 108        struct raw_notifier_head        nh;
 109
 110        /* Tree identifier */
 111        unsigned int index;
 112
 113        /* Number of switches attached to this tree */
 114        struct kref refcount;
 115
 116        /* Has this tree been applied to the hardware? */
 117        bool setup;
 118
 119        /*
 120         * Configuration data for the platform device that owns
 121         * this dsa switch tree instance.
 122         */
 123        struct dsa_platform_data        *pd;
 124
 125        /*
 126         * The switch port to which the CPU is attached.
 127         */
 128        struct dsa_port         *cpu_dp;
 129
 130        /*
 131         * Data for the individual switch chips.
 132         */
 133        struct dsa_switch       *ds[DSA_MAX_SWITCHES];
 134};
 135
 136/* TC matchall action types, only mirroring for now */
 137enum dsa_port_mall_action_type {
 138        DSA_PORT_MALL_MIRROR,
 139};
 140
 141/* TC mirroring entry */
 142struct dsa_mall_mirror_tc_entry {
 143        u8 to_local_port;
 144        bool ingress;
 145};
 146
 147/* TC matchall entry */
 148struct dsa_mall_tc_entry {
 149        struct list_head list;
 150        unsigned long cookie;
 151        enum dsa_port_mall_action_type type;
 152        union {
 153                struct dsa_mall_mirror_tc_entry mirror;
 154        };
 155};
 156
 157
 158struct dsa_port {
 159        /* A CPU port is physically connected to a master device.
 160         * A user port exposed to userspace has a slave device.
 161         */
 162        union {
 163                struct net_device *master;
 164                struct net_device *slave;
 165        };
 166
 167        /* CPU port tagging operations used by master or slave devices */
 168        const struct dsa_device_ops *tag_ops;
 169
 170        /* Copies for faster access in master receive hot path */
 171        struct dsa_switch_tree *dst;
 172        struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
 173                               struct packet_type *pt);
 174        bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
 175
 176        enum {
 177                DSA_PORT_TYPE_UNUSED = 0,
 178                DSA_PORT_TYPE_CPU,
 179                DSA_PORT_TYPE_DSA,
 180                DSA_PORT_TYPE_USER,
 181        } type;
 182
 183        struct dsa_switch       *ds;
 184        unsigned int            index;
 185        const char              *name;
 186        struct dsa_port         *cpu_dp;
 187        const char              *mac;
 188        struct device_node      *dn;
 189        unsigned int            ageing_time;
 190        bool                    vlan_filtering;
 191        u8                      stp_state;
 192        struct net_device       *bridge_dev;
 193        struct devlink_port     devlink_port;
 194        struct phylink          *pl;
 195        struct phylink_config   pl_config;
 196
 197        struct work_struct      xmit_work;
 198        struct sk_buff_head     xmit_queue;
 199
 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
 206        /*
 207         * Original copy of the master netdev ethtool_ops
 208         */
 209        const struct ethtool_ops *orig_ethtool_ops;
 210
 211        /*
 212         * Original copy of the master netdev net_device_ops
 213         */
 214        const struct net_device_ops *orig_ndo_ops;
 215};
 216
 217struct dsa_switch {
 218        struct device *dev;
 219
 220        /*
 221         * Parent switch tree, and switch index.
 222         */
 223        struct dsa_switch_tree  *dst;
 224        unsigned int            index;
 225
 226        /* Listener for switch fabric events */
 227        struct notifier_block   nb;
 228
 229        /*
 230         * Give the switch driver somewhere to hang its private data
 231         * structure.
 232         */
 233        void *priv;
 234
 235        /*
 236         * Configuration data for this switch.
 237         */
 238        struct dsa_chip_data    *cd;
 239
 240        /*
 241         * The switch operations.
 242         */
 243        const struct dsa_switch_ops     *ops;
 244
 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
 252        /*
 253         * Slave mii_bus and devices for the individual ports.
 254         */
 255        u32                     phys_mii_mask;
 256        struct mii_bus          *slave_mii_bus;
 257
 258        /* Ageing Time limits in msecs */
 259        unsigned int ageing_time_min;
 260        unsigned int ageing_time_max;
 261
 262        /* devlink used to represent this switch device */
 263        struct devlink          *devlink;
 264
 265        /* Number of switch port queues */
 266        unsigned int            num_tx_queues;
 267
 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
 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
 278        /* Dynamically allocated ports, keep last */
 279        size_t num_ports;
 280        struct dsa_port ports[];
 281};
 282
 283static inline const struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
 284{
 285        return &ds->ports[p];
 286}
 287
 288static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p)
 289{
 290        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED;
 291}
 292
 293static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
 294{
 295        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU;
 296}
 297
 298static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
 299{
 300        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA;
 301}
 302
 303static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)
 304{
 305        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER;
 306}
 307
 308static inline u32 dsa_user_ports(struct dsa_switch *ds)
 309{
 310        u32 mask = 0;
 311        int p;
 312
 313        for (p = 0; p < ds->num_ports; p++)
 314                if (dsa_is_user_port(ds, p))
 315                        mask |= BIT(p);
 316
 317        return mask;
 318}
 319
 320/* Return the local port used to reach an arbitrary switch port */
 321static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
 322                                            int port)
 323{
 324        if (device == ds->index)
 325                return port;
 326        else
 327                return ds->rtable[device];
 328}
 329
 330/* Return the local port used to reach the dedicated CPU port */
 331static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port)
 332{
 333        const struct dsa_port *dp = dsa_to_port(ds, port);
 334        const struct dsa_port *cpu_dp = dp->cpu_dp;
 335
 336        if (!cpu_dp)
 337                return port;
 338
 339        return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index);
 340}
 341
 342static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp)
 343{
 344        const struct dsa_switch *ds = dp->ds;
 345
 346        if (ds->vlan_filtering_is_global)
 347                return ds->vlan_filtering;
 348        else
 349                return dp->vlan_filtering;
 350}
 351
 352typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid,
 353                              bool is_static, void *data);
 354struct dsa_switch_ops {
 355        enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds,
 356                                                  int port);
 357
 358        int     (*setup)(struct dsa_switch *ds);
 359        void    (*teardown)(struct dsa_switch *ds);
 360        u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
 361
 362        /*
 363         * Access to the switch's PHY registers.
 364         */
 365        int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
 366        int     (*phy_write)(struct dsa_switch *ds, int port,
 367                             int regnum, u16 val);
 368
 369        /*
 370         * Link state adjustment (called from libphy)
 371         */
 372        void    (*adjust_link)(struct dsa_switch *ds, int port,
 373                                struct phy_device *phydev);
 374        void    (*fixed_link_update)(struct dsa_switch *ds, int port,
 375                                struct fixed_phy_status *st);
 376
 377        /*
 378         * PHYLINK integration
 379         */
 380        void    (*phylink_validate)(struct dsa_switch *ds, int port,
 381                                    unsigned long *supported,
 382                                    struct phylink_link_state *state);
 383        int     (*phylink_mac_link_state)(struct dsa_switch *ds, int port,
 384                                          struct phylink_link_state *state);
 385        void    (*phylink_mac_config)(struct dsa_switch *ds, int port,
 386                                      unsigned int mode,
 387                                      const struct phylink_link_state *state);
 388        void    (*phylink_mac_an_restart)(struct dsa_switch *ds, int port);
 389        void    (*phylink_mac_link_down)(struct dsa_switch *ds, int port,
 390                                         unsigned int mode,
 391                                         phy_interface_t interface);
 392        void    (*phylink_mac_link_up)(struct dsa_switch *ds, int port,
 393                                       unsigned int mode,
 394                                       phy_interface_t interface,
 395                                       struct phy_device *phydev);
 396        void    (*phylink_fixed_state)(struct dsa_switch *ds, int port,
 397                                       struct phylink_link_state *state);
 398        /*
 399         * ethtool hardware statistics.
 400         */
 401        void    (*get_strings)(struct dsa_switch *ds, int port,
 402                               u32 stringset, uint8_t *data);
 403        void    (*get_ethtool_stats)(struct dsa_switch *ds,
 404                                     int port, uint64_t *data);
 405        int     (*get_sset_count)(struct dsa_switch *ds, int port, int sset);
 406        void    (*get_ethtool_phy_stats)(struct dsa_switch *ds,
 407                                         int port, uint64_t *data);
 408
 409        /*
 410         * ethtool Wake-on-LAN
 411         */
 412        void    (*get_wol)(struct dsa_switch *ds, int port,
 413                           struct ethtool_wolinfo *w);
 414        int     (*set_wol)(struct dsa_switch *ds, int port,
 415                           struct ethtool_wolinfo *w);
 416
 417        /*
 418         * ethtool timestamp info
 419         */
 420        int     (*get_ts_info)(struct dsa_switch *ds, int port,
 421                               struct ethtool_ts_info *ts);
 422
 423        /*
 424         * Suspend and resume
 425         */
 426        int     (*suspend)(struct dsa_switch *ds);
 427        int     (*resume)(struct dsa_switch *ds);
 428
 429        /*
 430         * Port enable/disable
 431         */
 432        int     (*port_enable)(struct dsa_switch *ds, int port,
 433                               struct phy_device *phy);
 434        void    (*port_disable)(struct dsa_switch *ds, int port);
 435
 436        /*
 437         * Port's MAC EEE settings
 438         */
 439        int     (*set_mac_eee)(struct dsa_switch *ds, int port,
 440                               struct ethtool_eee *e);
 441        int     (*get_mac_eee)(struct dsa_switch *ds, int port,
 442                               struct ethtool_eee *e);
 443
 444        /* EEPROM access */
 445        int     (*get_eeprom_len)(struct dsa_switch *ds);
 446        int     (*get_eeprom)(struct dsa_switch *ds,
 447                              struct ethtool_eeprom *eeprom, u8 *data);
 448        int     (*set_eeprom)(struct dsa_switch *ds,
 449                              struct ethtool_eeprom *eeprom, u8 *data);
 450
 451        /*
 452         * Register access.
 453         */
 454        int     (*get_regs_len)(struct dsa_switch *ds, int port);
 455        void    (*get_regs)(struct dsa_switch *ds, int port,
 456                            struct ethtool_regs *regs, void *p);
 457
 458        /*
 459         * Bridge integration
 460         */
 461        int     (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
 462        int     (*port_bridge_join)(struct dsa_switch *ds, int port,
 463                                    struct net_device *bridge);
 464        void    (*port_bridge_leave)(struct dsa_switch *ds, int port,
 465                                     struct net_device *bridge);
 466        void    (*port_stp_state_set)(struct dsa_switch *ds, int port,
 467                                      u8 state);
 468        void    (*port_fast_age)(struct dsa_switch *ds, int port);
 469        int     (*port_egress_floods)(struct dsa_switch *ds, int port,
 470                                      bool unicast, bool multicast);
 471
 472        /*
 473         * VLAN support
 474         */
 475        int     (*port_vlan_filtering)(struct dsa_switch *ds, int port,
 476                                       bool vlan_filtering);
 477        int (*port_vlan_prepare)(struct dsa_switch *ds, int port,
 478                                 const struct switchdev_obj_port_vlan *vlan);
 479        void (*port_vlan_add)(struct dsa_switch *ds, int port,
 480                              const struct switchdev_obj_port_vlan *vlan);
 481        int     (*port_vlan_del)(struct dsa_switch *ds, int port,
 482                                 const struct switchdev_obj_port_vlan *vlan);
 483        /*
 484         * Forwarding database
 485         */
 486        int     (*port_fdb_add)(struct dsa_switch *ds, int port,
 487                                const unsigned char *addr, u16 vid);
 488        int     (*port_fdb_del)(struct dsa_switch *ds, int port,
 489                                const unsigned char *addr, u16 vid);
 490        int     (*port_fdb_dump)(struct dsa_switch *ds, int port,
 491                                 dsa_fdb_dump_cb_t *cb, void *data);
 492
 493        /*
 494         * Multicast database
 495         */
 496        int (*port_mdb_prepare)(struct dsa_switch *ds, int port,
 497                                const struct switchdev_obj_port_mdb *mdb);
 498        void (*port_mdb_add)(struct dsa_switch *ds, int port,
 499                             const struct switchdev_obj_port_mdb *mdb);
 500        int     (*port_mdb_del)(struct dsa_switch *ds, int port,
 501                                const struct switchdev_obj_port_mdb *mdb);
 502        /*
 503         * RXNFC
 504         */
 505        int     (*get_rxnfc)(struct dsa_switch *ds, int port,
 506                             struct ethtool_rxnfc *nfc, u32 *rule_locs);
 507        int     (*set_rxnfc)(struct dsa_switch *ds, int port,
 508                             struct ethtool_rxnfc *nfc);
 509
 510        /*
 511         * TC integration
 512         */
 513        int     (*port_mirror_add)(struct dsa_switch *ds, int port,
 514                                   struct dsa_mall_mirror_tc_entry *mirror,
 515                                   bool ingress);
 516        void    (*port_mirror_del)(struct dsa_switch *ds, int port,
 517                                   struct dsa_mall_mirror_tc_entry *mirror);
 518        int     (*port_setup_tc)(struct dsa_switch *ds, int port,
 519                                 enum tc_setup_type type, void *type_data);
 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);
 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);
 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);
 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);
 546};
 547
 548struct dsa_switch_driver {
 549        struct list_head        list;
 550        const struct dsa_switch_ops *ops;
 551};
 552
 553struct net_device *dsa_dev_to_net_device(struct device *dev);
 554
 555/* Keep inline for faster access in hot path */
 556static inline bool netdev_uses_dsa(struct net_device *dev)
 557{
 558#if IS_ENABLED(CONFIG_NET_DSA)
 559        return dev->dsa_ptr && dev->dsa_ptr->rcv;
 560#endif
 561        return false;
 562}
 563
 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
 573struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n);
 574void dsa_unregister_switch(struct dsa_switch *ds);
 575int dsa_register_switch(struct dsa_switch *ds);
 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
 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
 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
 640
 641netdev_tx_t dsa_enqueue_skb(struct sk_buff *skb, struct net_device *dev);
 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);
 645void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up);
 646
 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)
 712#endif
 713
 714