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
  23struct tc_action;
  24struct phy_device;
  25struct fixed_phy_status;
  26
  27enum dsa_tag_protocol {
  28        DSA_TAG_PROTO_NONE = 0,
  29        DSA_TAG_PROTO_DSA,
  30        DSA_TAG_PROTO_TRAILER,
  31        DSA_TAG_PROTO_EDSA,
  32        DSA_TAG_PROTO_BRCM,
  33        DSA_TAG_PROTO_QCA,
  34        DSA_TAG_LAST,           /* MUST BE LAST */
  35};
  36
  37#define DSA_MAX_SWITCHES        4
  38#define DSA_MAX_PORTS           12
  39
  40#define DSA_RTABLE_NONE         -1
  41
  42struct dsa_chip_data {
  43        /*
  44         * How to access the switch configuration registers.
  45         */
  46        struct device   *host_dev;
  47        int             sw_addr;
  48
  49        /*
  50         * Reference to network devices
  51         */
  52        struct device   *netdev[DSA_MAX_PORTS];
  53
  54        /* set to size of eeprom if supported by the switch */
  55        int             eeprom_len;
  56
  57        /* Device tree node pointer for this specific switch chip
  58         * used during switch setup in case additional properties
  59         * and resources needs to be used
  60         */
  61        struct device_node *of_node;
  62
  63        /*
  64         * The names of the switch's ports.  Use "cpu" to
  65         * designate the switch port that the cpu is connected to,
  66         * "dsa" to indicate that this port is a DSA link to
  67         * another switch, NULL to indicate the port is unused,
  68         * or any other string to indicate this is a physical port.
  69         */
  70        char            *port_names[DSA_MAX_PORTS];
  71        struct device_node *port_dn[DSA_MAX_PORTS];
  72
  73        /*
  74         * An array of which element [a] indicates which port on this
  75         * switch should be used to send packets to that are destined
  76         * for switch a. Can be NULL if there is only one switch chip.
  77         */
  78        s8              rtable[DSA_MAX_SWITCHES];
  79};
  80
  81struct dsa_platform_data {
  82        /*
  83         * Reference to a Linux network interface that connects
  84         * to the root switch chip of the tree.
  85         */
  86        struct device   *netdev;
  87        struct net_device *of_netdev;
  88
  89        /*
  90         * Info structs describing each of the switch chips
  91         * connected via this network interface.
  92         */
  93        int             nr_chips;
  94        struct dsa_chip_data    *chip;
  95};
  96
  97struct packet_type;
  98
  99struct dsa_switch_tree {
 100        struct list_head        list;
 101
 102        /* Notifier chain for switch-wide events */
 103        struct raw_notifier_head        nh;
 104
 105        /* Tree identifier */
 106        u32 tree;
 107
 108        /* Number of switches attached to this tree */
 109        struct kref refcount;
 110
 111        /* Has this tree been applied to the hardware? */
 112        bool applied;
 113
 114        /*
 115         * Configuration data for the platform device that owns
 116         * this dsa switch tree instance.
 117         */
 118        struct dsa_platform_data        *pd;
 119
 120        /*
 121         * Reference to network device to use, and which tagging
 122         * protocol to use.
 123         */
 124        struct net_device       *master_netdev;
 125        int                     (*rcv)(struct sk_buff *skb,
 126                                       struct net_device *dev,
 127                                       struct packet_type *pt,
 128                                       struct net_device *orig_dev);
 129
 130        /*
 131         * Original copy of the master netdev ethtool_ops
 132         */
 133        struct ethtool_ops      master_ethtool_ops;
 134        const struct ethtool_ops *master_orig_ethtool_ops;
 135
 136        /*
 137         * The switch and port to which the CPU is attached.
 138         */
 139        struct dsa_switch       *cpu_switch;
 140        s8                      cpu_port;
 141
 142        /*
 143         * Data for the individual switch chips.
 144         */
 145        struct dsa_switch       *ds[DSA_MAX_SWITCHES];
 146
 147        /*
 148         * Tagging protocol operations for adding and removing an
 149         * encapsulation tag.
 150         */
 151        const struct dsa_device_ops *tag_ops;
 152};
 153
 154/* TC matchall action types, only mirroring for now */
 155enum dsa_port_mall_action_type {
 156        DSA_PORT_MALL_MIRROR,
 157};
 158
 159/* TC mirroring entry */
 160struct dsa_mall_mirror_tc_entry {
 161        u8 to_local_port;
 162        bool ingress;
 163};
 164
 165/* TC matchall entry */
 166struct dsa_mall_tc_entry {
 167        struct list_head list;
 168        unsigned long cookie;
 169        enum dsa_port_mall_action_type type;
 170        union {
 171                struct dsa_mall_mirror_tc_entry mirror;
 172        };
 173};
 174
 175
 176struct dsa_port {
 177        struct dsa_switch       *ds;
 178        unsigned int            index;
 179        const char              *name;
 180        struct net_device       *netdev;
 181        struct device_node      *dn;
 182        unsigned int            ageing_time;
 183        u8                      stp_state;
 184        struct net_device       *bridge_dev;
 185};
 186
 187struct dsa_switch {
 188        struct device *dev;
 189
 190        /*
 191         * Parent switch tree, and switch index.
 192         */
 193        struct dsa_switch_tree  *dst;
 194        int                     index;
 195
 196        /* Listener for switch fabric events */
 197        struct notifier_block   nb;
 198
 199        /*
 200         * Give the switch driver somewhere to hang its private data
 201         * structure.
 202         */
 203        void *priv;
 204
 205        /*
 206         * Configuration data for this switch.
 207         */
 208        struct dsa_chip_data    *cd;
 209
 210        /*
 211         * The switch operations.
 212         */
 213        const struct dsa_switch_ops     *ops;
 214
 215        /*
 216         * An array of which element [a] indicates which port on this
 217         * switch should be used to send packets to that are destined
 218         * for switch a. Can be NULL if there is only one switch chip.
 219         */
 220        s8              rtable[DSA_MAX_SWITCHES];
 221
 222        /*
 223         * The lower device this switch uses to talk to the host
 224         */
 225        struct net_device *master_netdev;
 226
 227        /*
 228         * Slave mii_bus and devices for the individual ports.
 229         */
 230        u32                     dsa_port_mask;
 231        u32                     cpu_port_mask;
 232        u32                     enabled_port_mask;
 233        u32                     phys_mii_mask;
 234        struct mii_bus          *slave_mii_bus;
 235
 236        /* Dynamically allocated ports, keep last */
 237        size_t num_ports;
 238        struct dsa_port ports[];
 239};
 240
 241static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
 242{
 243        return !!(ds == ds->dst->cpu_switch && p == ds->dst->cpu_port);
 244}
 245
 246static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
 247{
 248        return !!((ds->dsa_port_mask) & (1 << p));
 249}
 250
 251static inline bool dsa_is_port_initialized(struct dsa_switch *ds, int p)
 252{
 253        return ds->enabled_port_mask & (1 << p) && ds->ports[p].netdev;
 254}
 255
 256static inline u8 dsa_upstream_port(struct dsa_switch *ds)
 257{
 258        struct dsa_switch_tree *dst = ds->dst;
 259
 260        /*
 261         * If this is the root switch (i.e. the switch that connects
 262         * to the CPU), return the cpu port number on this switch.
 263         * Else return the (DSA) port number that connects to the
 264         * switch that is one hop closer to the cpu.
 265         */
 266        if (dst->cpu_switch == ds)
 267                return dst->cpu_port;
 268        else
 269                return ds->rtable[dst->cpu_switch->index];
 270}
 271
 272struct switchdev_trans;
 273struct switchdev_obj;
 274struct switchdev_obj_port_fdb;
 275struct switchdev_obj_port_mdb;
 276struct switchdev_obj_port_vlan;
 277
 278#define DSA_NOTIFIER_BRIDGE_JOIN                1
 279#define DSA_NOTIFIER_BRIDGE_LEAVE               2
 280
 281/* DSA_NOTIFIER_BRIDGE_* */
 282struct dsa_notifier_bridge_info {
 283        struct net_device *br;
 284        int sw_index;
 285        int port;
 286};
 287
 288struct dsa_switch_ops {
 289        /*
 290         * Probing and setup.
 291         */
 292        const char      *(*probe)(struct device *dsa_dev,
 293                                  struct device *host_dev, int sw_addr,
 294                                  void **priv);
 295
 296        enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds);
 297
 298        int     (*setup)(struct dsa_switch *ds);
 299        int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
 300        u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
 301
 302        /*
 303         * Access to the switch's PHY registers.
 304         */
 305        int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
 306        int     (*phy_write)(struct dsa_switch *ds, int port,
 307                             int regnum, u16 val);
 308
 309        /*
 310         * Link state adjustment (called from libphy)
 311         */
 312        void    (*adjust_link)(struct dsa_switch *ds, int port,
 313                                struct phy_device *phydev);
 314        void    (*fixed_link_update)(struct dsa_switch *ds, int port,
 315                                struct fixed_phy_status *st);
 316
 317        /*
 318         * ethtool hardware statistics.
 319         */
 320        void    (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
 321        void    (*get_ethtool_stats)(struct dsa_switch *ds,
 322                                     int port, uint64_t *data);
 323        int     (*get_sset_count)(struct dsa_switch *ds);
 324
 325        /*
 326         * ethtool Wake-on-LAN
 327         */
 328        void    (*get_wol)(struct dsa_switch *ds, int port,
 329                           struct ethtool_wolinfo *w);
 330        int     (*set_wol)(struct dsa_switch *ds, int port,
 331                           struct ethtool_wolinfo *w);
 332
 333        /*
 334         * Suspend and resume
 335         */
 336        int     (*suspend)(struct dsa_switch *ds);
 337        int     (*resume)(struct dsa_switch *ds);
 338
 339        /*
 340         * Port enable/disable
 341         */
 342        int     (*port_enable)(struct dsa_switch *ds, int port,
 343                               struct phy_device *phy);
 344        void    (*port_disable)(struct dsa_switch *ds, int port,
 345                                struct phy_device *phy);
 346
 347        /*
 348         * EEE setttings
 349         */
 350        int     (*set_eee)(struct dsa_switch *ds, int port,
 351                           struct phy_device *phydev,
 352                           struct ethtool_eee *e);
 353        int     (*get_eee)(struct dsa_switch *ds, int port,
 354                           struct ethtool_eee *e);
 355
 356        /* EEPROM access */
 357        int     (*get_eeprom_len)(struct dsa_switch *ds);
 358        int     (*get_eeprom)(struct dsa_switch *ds,
 359                              struct ethtool_eeprom *eeprom, u8 *data);
 360        int     (*set_eeprom)(struct dsa_switch *ds,
 361                              struct ethtool_eeprom *eeprom, u8 *data);
 362
 363        /*
 364         * Register access.
 365         */
 366        int     (*get_regs_len)(struct dsa_switch *ds, int port);
 367        void    (*get_regs)(struct dsa_switch *ds, int port,
 368                            struct ethtool_regs *regs, void *p);
 369
 370        /*
 371         * Bridge integration
 372         */
 373        int     (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
 374        int     (*port_bridge_join)(struct dsa_switch *ds, int port,
 375                                    struct net_device *bridge);
 376        void    (*port_bridge_leave)(struct dsa_switch *ds, int port,
 377                                     struct net_device *bridge);
 378        void    (*port_stp_state_set)(struct dsa_switch *ds, int port,
 379                                      u8 state);
 380        void    (*port_fast_age)(struct dsa_switch *ds, int port);
 381
 382        /*
 383         * VLAN support
 384         */
 385        int     (*port_vlan_filtering)(struct dsa_switch *ds, int port,
 386                                       bool vlan_filtering);
 387        int     (*port_vlan_prepare)(struct dsa_switch *ds, int port,
 388                                     const struct switchdev_obj_port_vlan *vlan,
 389                                     struct switchdev_trans *trans);
 390        void    (*port_vlan_add)(struct dsa_switch *ds, int port,
 391                                 const struct switchdev_obj_port_vlan *vlan,
 392                                 struct switchdev_trans *trans);
 393        int     (*port_vlan_del)(struct dsa_switch *ds, int port,
 394                                 const struct switchdev_obj_port_vlan *vlan);
 395        int     (*port_vlan_dump)(struct dsa_switch *ds, int port,
 396                                  struct switchdev_obj_port_vlan *vlan,
 397                                  int (*cb)(struct switchdev_obj *obj));
 398
 399        /*
 400         * Forwarding database
 401         */
 402        int     (*port_fdb_prepare)(struct dsa_switch *ds, int port,
 403                                    const struct switchdev_obj_port_fdb *fdb,
 404                                    struct switchdev_trans *trans);
 405        void    (*port_fdb_add)(struct dsa_switch *ds, int port,
 406                                const struct switchdev_obj_port_fdb *fdb,
 407                                struct switchdev_trans *trans);
 408        int     (*port_fdb_del)(struct dsa_switch *ds, int port,
 409                                const struct switchdev_obj_port_fdb *fdb);
 410        int     (*port_fdb_dump)(struct dsa_switch *ds, int port,
 411                                 struct switchdev_obj_port_fdb *fdb,
 412                                 int (*cb)(struct switchdev_obj *obj));
 413
 414        /*
 415         * Multicast database
 416         */
 417        int     (*port_mdb_prepare)(struct dsa_switch *ds, int port,
 418                                    const struct switchdev_obj_port_mdb *mdb,
 419                                    struct switchdev_trans *trans);
 420        void    (*port_mdb_add)(struct dsa_switch *ds, int port,
 421                                const struct switchdev_obj_port_mdb *mdb,
 422                                struct switchdev_trans *trans);
 423        int     (*port_mdb_del)(struct dsa_switch *ds, int port,
 424                                const struct switchdev_obj_port_mdb *mdb);
 425        int     (*port_mdb_dump)(struct dsa_switch *ds, int port,
 426                                 struct switchdev_obj_port_mdb *mdb,
 427                                 int (*cb)(struct switchdev_obj *obj));
 428
 429        /*
 430         * RXNFC
 431         */
 432        int     (*get_rxnfc)(struct dsa_switch *ds, int port,
 433                             struct ethtool_rxnfc *nfc, u32 *rule_locs);
 434        int     (*set_rxnfc)(struct dsa_switch *ds, int port,
 435                             struct ethtool_rxnfc *nfc);
 436
 437        /*
 438         * TC integration
 439         */
 440        int     (*port_mirror_add)(struct dsa_switch *ds, int port,
 441                                   struct dsa_mall_mirror_tc_entry *mirror,
 442                                   bool ingress);
 443        void    (*port_mirror_del)(struct dsa_switch *ds, int port,
 444                                   struct dsa_mall_mirror_tc_entry *mirror);
 445};
 446
 447struct dsa_switch_driver {
 448        struct list_head        list;
 449        const struct dsa_switch_ops *ops;
 450};
 451
 452void register_switch_driver(struct dsa_switch_driver *type);
 453void unregister_switch_driver(struct dsa_switch_driver *type);
 454struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev);
 455struct net_device *dsa_dev_to_net_device(struct device *dev);
 456
 457static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst)
 458{
 459        return dst->rcv != NULL;
 460}
 461
 462struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n);
 463void dsa_unregister_switch(struct dsa_switch *ds);
 464int dsa_register_switch(struct dsa_switch *ds, struct device *dev);
 465#ifdef CONFIG_PM_SLEEP
 466int dsa_switch_suspend(struct dsa_switch *ds);
 467int dsa_switch_resume(struct dsa_switch *ds);
 468#else
 469static inline int dsa_switch_suspend(struct dsa_switch *ds)
 470{
 471        return 0;
 472}
 473static inline int dsa_switch_resume(struct dsa_switch *ds)
 474{
 475        return 0;
 476}
 477#endif /* CONFIG_PM_SLEEP */
 478
 479#endif
 480