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