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