linux/include/net/dsa.h
<<
>>
Prefs
   1/*
   2 * include/net/dsa.h - Driver for Distributed Switch Architecture switch chips
   3 * Copyright (c) 2008-2009 Marvell Semiconductor
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation; either version 2 of the License, or
   8 * (at your option) any later version.
   9 */
  10
  11#ifndef __LINUX_NET_DSA_H
  12#define __LINUX_NET_DSA_H
  13
  14#include <linux/if.h>
  15#include <linux/if_ether.h>
  16#include <linux/list.h>
  17#include <linux/notifier.h>
  18#include <linux/timer.h>
  19#include <linux/workqueue.h>
  20#include <linux/of.h>
  21#include <linux/ethtool.h>
  22#include <linux/net_tstamp.h>
  23#include <linux/phy.h>
  24#include <linux/platform_data/dsa.h>
  25#include <net/devlink.h>
  26#include <net/switchdev.h>
  27
  28struct tc_action;
  29struct phy_device;
  30struct fixed_phy_status;
  31struct phylink_link_state;
  32
  33enum dsa_tag_protocol {
  34        DSA_TAG_PROTO_NONE = 0,
  35        DSA_TAG_PROTO_BRCM,
  36        DSA_TAG_PROTO_BRCM_PREPEND,
  37        DSA_TAG_PROTO_DSA,
  38        DSA_TAG_PROTO_EDSA,
  39        DSA_TAG_PROTO_GSWIP,
  40        DSA_TAG_PROTO_KSZ9477,
  41        DSA_TAG_PROTO_KSZ9893,
  42        DSA_TAG_PROTO_LAN9303,
  43        DSA_TAG_PROTO_MTK,
  44        DSA_TAG_PROTO_QCA,
  45        DSA_TAG_PROTO_TRAILER,
  46        DSA_TAG_LAST,           /* MUST BE LAST */
  47};
  48
  49struct packet_type;
  50struct dsa_switch;
  51
  52struct dsa_device_ops {
  53        struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev);
  54        struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
  55                               struct packet_type *pt);
  56        int (*flow_dissect)(const struct sk_buff *skb, __be16 *proto,
  57                            int *offset);
  58        unsigned int overhead;
  59};
  60
  61struct dsa_switch_tree {
  62        struct list_head        list;
  63
  64        /* Notifier chain for switch-wide events */
  65        struct raw_notifier_head        nh;
  66
  67        /* Tree identifier */
  68        unsigned int index;
  69
  70        /* Number of switches attached to this tree */
  71        struct kref refcount;
  72
  73        /* Has this tree been applied to the hardware? */
  74        bool setup;
  75
  76        /*
  77         * Configuration data for the platform device that owns
  78         * this dsa switch tree instance.
  79         */
  80        struct dsa_platform_data        *pd;
  81
  82        /*
  83         * The switch port to which the CPU is attached.
  84         */
  85        struct dsa_port         *cpu_dp;
  86
  87        /*
  88         * Data for the individual switch chips.
  89         */
  90        struct dsa_switch       *ds[DSA_MAX_SWITCHES];
  91};
  92
  93/* TC matchall action types, only mirroring for now */
  94enum dsa_port_mall_action_type {
  95        DSA_PORT_MALL_MIRROR,
  96};
  97
  98/* TC mirroring entry */
  99struct dsa_mall_mirror_tc_entry {
 100        u8 to_local_port;
 101        bool ingress;
 102};
 103
 104/* TC matchall entry */
 105struct dsa_mall_tc_entry {
 106        struct list_head list;
 107        unsigned long cookie;
 108        enum dsa_port_mall_action_type type;
 109        union {
 110                struct dsa_mall_mirror_tc_entry mirror;
 111        };
 112};
 113
 114
 115struct dsa_port {
 116        /* A CPU port is physically connected to a master device.
 117         * A user port exposed to userspace has a slave device.
 118         */
 119        union {
 120                struct net_device *master;
 121                struct net_device *slave;
 122        };
 123
 124        /* CPU port tagging operations used by master or slave devices */
 125        const struct dsa_device_ops *tag_ops;
 126
 127        /* Copies for faster access in master receive hot path */
 128        struct dsa_switch_tree *dst;
 129        struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
 130                               struct packet_type *pt);
 131
 132        enum {
 133                DSA_PORT_TYPE_UNUSED = 0,
 134                DSA_PORT_TYPE_CPU,
 135                DSA_PORT_TYPE_DSA,
 136                DSA_PORT_TYPE_USER,
 137        } type;
 138
 139        struct dsa_switch       *ds;
 140        unsigned int            index;
 141        const char              *name;
 142        const struct dsa_port   *cpu_dp;
 143        struct device_node      *dn;
 144        unsigned int            ageing_time;
 145        u8                      stp_state;
 146        struct net_device       *bridge_dev;
 147        struct devlink_port     devlink_port;
 148        struct phylink          *pl;
 149        /*
 150         * Original copy of the master netdev ethtool_ops
 151         */
 152        const struct ethtool_ops *orig_ethtool_ops;
 153
 154        /*
 155         * Original copy of the master netdev net_device_ops
 156         */
 157        const struct net_device_ops *orig_ndo_ops;
 158};
 159
 160struct dsa_switch {
 161        struct device *dev;
 162
 163        /*
 164         * Parent switch tree, and switch index.
 165         */
 166        struct dsa_switch_tree  *dst;
 167        unsigned int            index;
 168
 169        /* Listener for switch fabric events */
 170        struct notifier_block   nb;
 171
 172        /*
 173         * Give the switch driver somewhere to hang its private data
 174         * structure.
 175         */
 176        void *priv;
 177
 178        /*
 179         * Configuration data for this switch.
 180         */
 181        struct dsa_chip_data    *cd;
 182
 183        /*
 184         * The switch operations.
 185         */
 186        const struct dsa_switch_ops     *ops;
 187
 188        /*
 189         * An array of which element [a] indicates which port on this
 190         * switch should be used to send packets to that are destined
 191         * for switch a. Can be NULL if there is only one switch chip.
 192         */
 193        s8              rtable[DSA_MAX_SWITCHES];
 194
 195        /*
 196         * Slave mii_bus and devices for the individual ports.
 197         */
 198        u32                     phys_mii_mask;
 199        struct mii_bus          *slave_mii_bus;
 200
 201        /* Ageing Time limits in msecs */
 202        unsigned int ageing_time_min;
 203        unsigned int ageing_time_max;
 204
 205        /* devlink used to represent this switch device */
 206        struct devlink          *devlink;
 207
 208        /* Number of switch port queues */
 209        unsigned int            num_tx_queues;
 210
 211        unsigned long           *bitmap;
 212        unsigned long           _bitmap;
 213
 214        /* Dynamically allocated ports, keep last */
 215        size_t num_ports;
 216        struct dsa_port ports[];
 217};
 218
 219static inline const struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
 220{
 221        return &ds->ports[p];
 222}
 223
 224static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p)
 225{
 226        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED;
 227}
 228
 229static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
 230{
 231        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU;
 232}
 233
 234static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
 235{
 236        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA;
 237}
 238
 239static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)
 240{
 241        return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER;
 242}
 243
 244static inline u32 dsa_user_ports(struct dsa_switch *ds)
 245{
 246        u32 mask = 0;
 247        int p;
 248
 249        for (p = 0; p < ds->num_ports; p++)
 250                if (dsa_is_user_port(ds, p))
 251                        mask |= BIT(p);
 252
 253        return mask;
 254}
 255
 256/* Return the local port used to reach an arbitrary switch port */
 257static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
 258                                            int port)
 259{
 260        if (device == ds->index)
 261                return port;
 262        else
 263                return ds->rtable[device];
 264}
 265
 266/* Return the local port used to reach the dedicated CPU port */
 267static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port)
 268{
 269        const struct dsa_port *dp = dsa_to_port(ds, port);
 270        const struct dsa_port *cpu_dp = dp->cpu_dp;
 271
 272        if (!cpu_dp)
 273                return port;
 274
 275        return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index);
 276}
 277
 278typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid,
 279                              bool is_static, void *data);
 280struct dsa_switch_ops {
 281#if IS_ENABLED(CONFIG_NET_DSA_LEGACY)
 282        /*
 283         * Legacy probing.
 284         */
 285        const char      *(*probe)(struct device *dsa_dev,
 286                                  struct device *host_dev, int sw_addr,
 287                                  void **priv);
 288#endif
 289
 290        enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds,
 291                                                  int port);
 292
 293        int     (*setup)(struct dsa_switch *ds);
 294        u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
 295
 296        /*
 297         * Access to the switch's PHY registers.
 298         */
 299        int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
 300        int     (*phy_write)(struct dsa_switch *ds, int port,
 301                             int regnum, u16 val);
 302
 303        /*
 304         * Link state adjustment (called from libphy)
 305         */
 306        void    (*adjust_link)(struct dsa_switch *ds, int port,
 307                                struct phy_device *phydev);
 308        void    (*fixed_link_update)(struct dsa_switch *ds, int port,
 309                                struct fixed_phy_status *st);
 310
 311        /*
 312         * PHYLINK integration
 313         */
 314        void    (*phylink_validate)(struct dsa_switch *ds, int port,
 315                                    unsigned long *supported,
 316                                    struct phylink_link_state *state);
 317        int     (*phylink_mac_link_state)(struct dsa_switch *ds, int port,
 318                                          struct phylink_link_state *state);
 319        void    (*phylink_mac_config)(struct dsa_switch *ds, int port,
 320                                      unsigned int mode,
 321                                      const struct phylink_link_state *state);
 322        void    (*phylink_mac_an_restart)(struct dsa_switch *ds, int port);
 323        void    (*phylink_mac_link_down)(struct dsa_switch *ds, int port,
 324                                         unsigned int mode,
 325                                         phy_interface_t interface);
 326        void    (*phylink_mac_link_up)(struct dsa_switch *ds, int port,
 327                                       unsigned int mode,
 328                                       phy_interface_t interface,
 329                                       struct phy_device *phydev);
 330        void    (*phylink_fixed_state)(struct dsa_switch *ds, int port,
 331                                       struct phylink_link_state *state);
 332        /*
 333         * ethtool hardware statistics.
 334         */
 335        void    (*get_strings)(struct dsa_switch *ds, int port,
 336                               u32 stringset, uint8_t *data);
 337        void    (*get_ethtool_stats)(struct dsa_switch *ds,
 338                                     int port, uint64_t *data);
 339        int     (*get_sset_count)(struct dsa_switch *ds, int port, int sset);
 340        void    (*get_ethtool_phy_stats)(struct dsa_switch *ds,
 341                                         int port, uint64_t *data);
 342
 343        /*
 344         * ethtool Wake-on-LAN
 345         */
 346        void    (*get_wol)(struct dsa_switch *ds, int port,
 347                           struct ethtool_wolinfo *w);
 348        int     (*set_wol)(struct dsa_switch *ds, int port,
 349                           struct ethtool_wolinfo *w);
 350
 351        /*
 352         * ethtool timestamp info
 353         */
 354        int     (*get_ts_info)(struct dsa_switch *ds, int port,
 355                               struct ethtool_ts_info *ts);
 356
 357        /*
 358         * Suspend and resume
 359         */
 360        int     (*suspend)(struct dsa_switch *ds);
 361        int     (*resume)(struct dsa_switch *ds);
 362
 363        /*
 364         * Port enable/disable
 365         */
 366        int     (*port_enable)(struct dsa_switch *ds, int port,
 367                               struct phy_device *phy);
 368        void    (*port_disable)(struct dsa_switch *ds, int port);
 369
 370        /*
 371         * Port's MAC EEE settings
 372         */
 373        int     (*set_mac_eee)(struct dsa_switch *ds, int port,
 374                               struct ethtool_eee *e);
 375        int     (*get_mac_eee)(struct dsa_switch *ds, int port,
 376                               struct ethtool_eee *e);
 377
 378        /* EEPROM access */
 379        int     (*get_eeprom_len)(struct dsa_switch *ds);
 380        int     (*get_eeprom)(struct dsa_switch *ds,
 381                              struct ethtool_eeprom *eeprom, u8 *data);
 382        int     (*set_eeprom)(struct dsa_switch *ds,
 383                              struct ethtool_eeprom *eeprom, u8 *data);
 384
 385        /*
 386         * Register access.
 387         */
 388        int     (*get_regs_len)(struct dsa_switch *ds, int port);
 389        void    (*get_regs)(struct dsa_switch *ds, int port,
 390                            struct ethtool_regs *regs, void *p);
 391
 392        /*
 393         * Bridge integration
 394         */
 395        int     (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
 396        int     (*port_bridge_join)(struct dsa_switch *ds, int port,
 397                                    struct net_device *bridge);
 398        void    (*port_bridge_leave)(struct dsa_switch *ds, int port,
 399                                     struct net_device *bridge);
 400        void    (*port_stp_state_set)(struct dsa_switch *ds, int port,
 401                                      u8 state);
 402        void    (*port_fast_age)(struct dsa_switch *ds, int port);
 403        int     (*port_egress_floods)(struct dsa_switch *ds, int port,
 404                                      bool unicast, bool multicast);
 405
 406        /*
 407         * VLAN support
 408         */
 409        int     (*port_vlan_filtering)(struct dsa_switch *ds, int port,
 410                                       bool vlan_filtering);
 411        int (*port_vlan_prepare)(struct dsa_switch *ds, int port,
 412                                 const struct switchdev_obj_port_vlan *vlan);
 413        void (*port_vlan_add)(struct dsa_switch *ds, int port,
 414                              const struct switchdev_obj_port_vlan *vlan);
 415        int     (*port_vlan_del)(struct dsa_switch *ds, int port,
 416                                 const struct switchdev_obj_port_vlan *vlan);
 417        /*
 418         * Forwarding database
 419         */
 420        int     (*port_fdb_add)(struct dsa_switch *ds, int port,
 421                                const unsigned char *addr, u16 vid);
 422        int     (*port_fdb_del)(struct dsa_switch *ds, int port,
 423                                const unsigned char *addr, u16 vid);
 424        int     (*port_fdb_dump)(struct dsa_switch *ds, int port,
 425                                 dsa_fdb_dump_cb_t *cb, void *data);
 426
 427        /*
 428         * Multicast database
 429         */
 430        int (*port_mdb_prepare)(struct dsa_switch *ds, int port,
 431                                const struct switchdev_obj_port_mdb *mdb);
 432        void (*port_mdb_add)(struct dsa_switch *ds, int port,
 433                             const struct switchdev_obj_port_mdb *mdb);
 434        int     (*port_mdb_del)(struct dsa_switch *ds, int port,
 435                                const struct switchdev_obj_port_mdb *mdb);
 436        /*
 437         * RXNFC
 438         */
 439        int     (*get_rxnfc)(struct dsa_switch *ds, int port,
 440                             struct ethtool_rxnfc *nfc, u32 *rule_locs);
 441        int     (*set_rxnfc)(struct dsa_switch *ds, int port,
 442                             struct ethtool_rxnfc *nfc);
 443
 444        /*
 445         * TC integration
 446         */
 447        int     (*port_mirror_add)(struct dsa_switch *ds, int port,
 448                                   struct dsa_mall_mirror_tc_entry *mirror,
 449                                   bool ingress);
 450        void    (*port_mirror_del)(struct dsa_switch *ds, int port,
 451                                   struct dsa_mall_mirror_tc_entry *mirror);
 452
 453        /*
 454         * Cross-chip operations
 455         */
 456        int     (*crosschip_bridge_join)(struct dsa_switch *ds, int sw_index,
 457                                         int port, struct net_device *br);
 458        void    (*crosschip_bridge_leave)(struct dsa_switch *ds, int sw_index,
 459                                          int port, struct net_device *br);
 460
 461        /*
 462         * PTP functionality
 463         */
 464        int     (*port_hwtstamp_get)(struct dsa_switch *ds, int port,
 465                                     struct ifreq *ifr);
 466        int     (*port_hwtstamp_set)(struct dsa_switch *ds, int port,
 467                                     struct ifreq *ifr);
 468        bool    (*port_txtstamp)(struct dsa_switch *ds, int port,
 469                                 struct sk_buff *clone, unsigned int type);
 470        bool    (*port_rxtstamp)(struct dsa_switch *ds, int port,
 471                                 struct sk_buff *skb, unsigned int type);
 472};
 473
 474struct dsa_switch_driver {
 475        struct list_head        list;
 476        const struct dsa_switch_ops *ops;
 477};
 478
 479#if IS_ENABLED(CONFIG_NET_DSA_LEGACY)
 480/* Legacy driver registration */
 481void register_switch_driver(struct dsa_switch_driver *type);
 482void unregister_switch_driver(struct dsa_switch_driver *type);
 483struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev);
 484
 485#else
 486static inline void register_switch_driver(struct dsa_switch_driver *type) { }
 487static inline void unregister_switch_driver(struct dsa_switch_driver *type) { }
 488static inline struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev)
 489{
 490        return NULL;
 491}
 492#endif
 493struct net_device *dsa_dev_to_net_device(struct device *dev);
 494
 495/* Keep inline for faster access in hot path */
 496static inline bool netdev_uses_dsa(struct net_device *dev)
 497{
 498#if IS_ENABLED(CONFIG_NET_DSA)
 499        return dev->dsa_ptr && dev->dsa_ptr->rcv;
 500#endif
 501        return false;
 502}
 503
 504struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n);
 505void dsa_unregister_switch(struct dsa_switch *ds);
 506int dsa_register_switch(struct dsa_switch *ds);
 507#ifdef CONFIG_PM_SLEEP
 508int dsa_switch_suspend(struct dsa_switch *ds);
 509int dsa_switch_resume(struct dsa_switch *ds);
 510#else
 511static inline int dsa_switch_suspend(struct dsa_switch *ds)
 512{
 513        return 0;
 514}
 515static inline int dsa_switch_resume(struct dsa_switch *ds)
 516{
 517        return 0;
 518}
 519#endif /* CONFIG_PM_SLEEP */
 520
 521enum dsa_notifier_type {
 522        DSA_PORT_REGISTER,
 523        DSA_PORT_UNREGISTER,
 524};
 525
 526struct dsa_notifier_info {
 527        struct net_device *dev;
 528};
 529
 530struct dsa_notifier_register_info {
 531        struct dsa_notifier_info info;  /* must be first */
 532        struct net_device *master;
 533        unsigned int port_number;
 534        unsigned int switch_number;
 535};
 536
 537static inline struct net_device *
 538dsa_notifier_info_to_dev(const struct dsa_notifier_info *info)
 539{
 540        return info->dev;
 541}
 542
 543#if IS_ENABLED(CONFIG_NET_DSA)
 544int register_dsa_notifier(struct notifier_block *nb);
 545int unregister_dsa_notifier(struct notifier_block *nb);
 546int call_dsa_notifiers(unsigned long val, struct net_device *dev,
 547                       struct dsa_notifier_info *info);
 548#else
 549static inline int register_dsa_notifier(struct notifier_block *nb)
 550{
 551        return 0;
 552}
 553
 554static inline int unregister_dsa_notifier(struct notifier_block *nb)
 555{
 556        return 0;
 557}
 558
 559static inline int call_dsa_notifiers(unsigned long val, struct net_device *dev,
 560                                     struct dsa_notifier_info *info)
 561{
 562        return NOTIFY_DONE;
 563}
 564#endif
 565
 566/* Broadcom tag specific helpers to insert and extract queue/port number */
 567#define BRCM_TAG_SET_PORT_QUEUE(p, q)   ((p) << 8 | q)
 568#define BRCM_TAG_GET_PORT(v)            ((v) >> 8)
 569#define BRCM_TAG_GET_QUEUE(v)           ((v) & 0xff)
 570
 571
 572int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data);
 573int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data);
 574int dsa_port_get_phy_sset_count(struct dsa_port *dp);
 575void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up);
 576
 577#endif
 578