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};
  30
  31#define DSA_MAX_SWITCHES        4
  32#define DSA_MAX_PORTS           12
  33
  34struct dsa_chip_data {
  35        /*
  36         * How to access the switch configuration registers.
  37         */
  38        struct device   *host_dev;
  39        int             sw_addr;
  40
  41        /* set to size of eeprom if supported by the switch */
  42        int             eeprom_len;
  43
  44        /* Device tree node pointer for this specific switch chip
  45         * used during switch setup in case additional properties
  46         * and resources needs to be used
  47         */
  48        struct device_node *of_node;
  49
  50        /*
  51         * The names of the switch's ports.  Use "cpu" to
  52         * designate the switch port that the cpu is connected to,
  53         * "dsa" to indicate that this port is a DSA link to
  54         * another switch, NULL to indicate the port is unused,
  55         * or any other string to indicate this is a physical port.
  56         */
  57        char            *port_names[DSA_MAX_PORTS];
  58        struct device_node *port_dn[DSA_MAX_PORTS];
  59
  60        /*
  61         * An array (with nr_chips elements) of which element [a]
  62         * indicates which port on this switch should be used to
  63         * send packets to that are destined for switch a.  Can be
  64         * NULL if there is only one switch chip.
  65         */
  66        s8              *rtable;
  67};
  68
  69struct dsa_platform_data {
  70        /*
  71         * Reference to a Linux network interface that connects
  72         * to the root switch chip of the tree.
  73         */
  74        struct device   *netdev;
  75        struct net_device *of_netdev;
  76
  77        /*
  78         * Info structs describing each of the switch chips
  79         * connected via this network interface.
  80         */
  81        int             nr_chips;
  82        struct dsa_chip_data    *chip;
  83};
  84
  85struct packet_type;
  86
  87struct dsa_switch_tree {
  88        /*
  89         * Configuration data for the platform device that owns
  90         * this dsa switch tree instance.
  91         */
  92        struct dsa_platform_data        *pd;
  93
  94        /*
  95         * Reference to network device to use, and which tagging
  96         * protocol to use.
  97         */
  98        struct net_device       *master_netdev;
  99        int                     (*rcv)(struct sk_buff *skb,
 100                                       struct net_device *dev,
 101                                       struct packet_type *pt,
 102                                       struct net_device *orig_dev);
 103        enum dsa_tag_protocol   tag_protocol;
 104
 105        /*
 106         * The switch and port to which the CPU is attached.
 107         */
 108        s8                      cpu_switch;
 109        s8                      cpu_port;
 110
 111        /*
 112         * Link state polling.
 113         */
 114        int                     link_poll_needed;
 115        struct work_struct      link_poll_work;
 116        struct timer_list       link_poll_timer;
 117
 118        /*
 119         * Data for the individual switch chips.
 120         */
 121        struct dsa_switch       *ds[DSA_MAX_SWITCHES];
 122};
 123
 124struct dsa_switch {
 125        /*
 126         * Parent switch tree, and switch index.
 127         */
 128        struct dsa_switch_tree  *dst;
 129        int                     index;
 130
 131        /*
 132         * Tagging protocol understood by this switch
 133         */
 134        enum dsa_tag_protocol   tag_protocol;
 135
 136        /*
 137         * Configuration data for this switch.
 138         */
 139        struct dsa_chip_data    *pd;
 140
 141        /*
 142         * The used switch driver.
 143         */
 144        struct dsa_switch_driver        *drv;
 145
 146        /*
 147         * Reference to host device to use.
 148         */
 149        struct device           *master_dev;
 150
 151#ifdef CONFIG_NET_DSA_HWMON
 152        /*
 153         * Hardware monitoring information
 154         */
 155        char                    hwmon_name[IFNAMSIZ + 8];
 156        struct device           *hwmon_dev;
 157#endif
 158
 159        /*
 160         * Slave mii_bus and devices for the individual ports.
 161         */
 162        u32                     dsa_port_mask;
 163        u32                     phys_port_mask;
 164        u32                     phys_mii_mask;
 165        struct mii_bus          *slave_mii_bus;
 166        struct net_device       *ports[DSA_MAX_PORTS];
 167};
 168
 169static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
 170{
 171        return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
 172}
 173
 174static inline bool dsa_is_port_initialized(struct dsa_switch *ds, int p)
 175{
 176        return ds->phys_port_mask & (1 << p) && ds->ports[p];
 177}
 178
 179static inline u8 dsa_upstream_port(struct dsa_switch *ds)
 180{
 181        struct dsa_switch_tree *dst = ds->dst;
 182
 183        /*
 184         * If this is the root switch (i.e. the switch that connects
 185         * to the CPU), return the cpu port number on this switch.
 186         * Else return the (DSA) port number that connects to the
 187         * switch that is one hop closer to the cpu.
 188         */
 189        if (dst->cpu_switch == ds->index)
 190                return dst->cpu_port;
 191        else
 192                return ds->pd->rtable[dst->cpu_switch];
 193}
 194
 195struct dsa_switch_driver {
 196        struct list_head        list;
 197
 198        enum dsa_tag_protocol   tag_protocol;
 199        int                     priv_size;
 200
 201        /*
 202         * Probing and setup.
 203         */
 204        char    *(*probe)(struct device *host_dev, int sw_addr);
 205        int     (*setup)(struct dsa_switch *ds);
 206        int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
 207        u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
 208
 209        /*
 210         * Access to the switch's PHY registers.
 211         */
 212        int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
 213        int     (*phy_write)(struct dsa_switch *ds, int port,
 214                             int regnum, u16 val);
 215
 216        /*
 217         * Link state polling and IRQ handling.
 218         */
 219        void    (*poll_link)(struct dsa_switch *ds);
 220
 221        /*
 222         * Link state adjustment (called from libphy)
 223         */
 224        void    (*adjust_link)(struct dsa_switch *ds, int port,
 225                                struct phy_device *phydev);
 226        void    (*fixed_link_update)(struct dsa_switch *ds, int port,
 227                                struct fixed_phy_status *st);
 228
 229        /*
 230         * ethtool hardware statistics.
 231         */
 232        void    (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
 233        void    (*get_ethtool_stats)(struct dsa_switch *ds,
 234                                     int port, uint64_t *data);
 235        int     (*get_sset_count)(struct dsa_switch *ds);
 236
 237        /*
 238         * ethtool Wake-on-LAN
 239         */
 240        void    (*get_wol)(struct dsa_switch *ds, int port,
 241                           struct ethtool_wolinfo *w);
 242        int     (*set_wol)(struct dsa_switch *ds, int port,
 243                           struct ethtool_wolinfo *w);
 244
 245        /*
 246         * Suspend and resume
 247         */
 248        int     (*suspend)(struct dsa_switch *ds);
 249        int     (*resume)(struct dsa_switch *ds);
 250
 251        /*
 252         * Port enable/disable
 253         */
 254        int     (*port_enable)(struct dsa_switch *ds, int port,
 255                               struct phy_device *phy);
 256        void    (*port_disable)(struct dsa_switch *ds, int port,
 257                                struct phy_device *phy);
 258
 259        /*
 260         * EEE setttings
 261         */
 262        int     (*set_eee)(struct dsa_switch *ds, int port,
 263                           struct phy_device *phydev,
 264                           struct ethtool_eee *e);
 265        int     (*get_eee)(struct dsa_switch *ds, int port,
 266                           struct ethtool_eee *e);
 267
 268#ifdef CONFIG_NET_DSA_HWMON
 269        /* Hardware monitoring */
 270        int     (*get_temp)(struct dsa_switch *ds, int *temp);
 271        int     (*get_temp_limit)(struct dsa_switch *ds, int *temp);
 272        int     (*set_temp_limit)(struct dsa_switch *ds, int temp);
 273        int     (*get_temp_alarm)(struct dsa_switch *ds, bool *alarm);
 274#endif
 275
 276        /* EEPROM access */
 277        int     (*get_eeprom_len)(struct dsa_switch *ds);
 278        int     (*get_eeprom)(struct dsa_switch *ds,
 279                              struct ethtool_eeprom *eeprom, u8 *data);
 280        int     (*set_eeprom)(struct dsa_switch *ds,
 281                              struct ethtool_eeprom *eeprom, u8 *data);
 282
 283        /*
 284         * Register access.
 285         */
 286        int     (*get_regs_len)(struct dsa_switch *ds, int port);
 287        void    (*get_regs)(struct dsa_switch *ds, int port,
 288                            struct ethtool_regs *regs, void *p);
 289
 290        /*
 291         * Bridge integration
 292         */
 293        int     (*port_join_bridge)(struct dsa_switch *ds, int port,
 294                                    u32 br_port_mask);
 295        int     (*port_leave_bridge)(struct dsa_switch *ds, int port,
 296                                     u32 br_port_mask);
 297        int     (*port_stp_update)(struct dsa_switch *ds, int port,
 298                                   u8 state);
 299        int     (*fdb_add)(struct dsa_switch *ds, int port,
 300                           const unsigned char *addr, u16 vid);
 301        int     (*fdb_del)(struct dsa_switch *ds, int port,
 302                           const unsigned char *addr, u16 vid);
 303        int     (*fdb_getnext)(struct dsa_switch *ds, int port,
 304                               unsigned char *addr, bool *is_static);
 305};
 306
 307void register_switch_driver(struct dsa_switch_driver *type);
 308void unregister_switch_driver(struct dsa_switch_driver *type);
 309struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev);
 310
 311static inline void *ds_to_priv(struct dsa_switch *ds)
 312{
 313        return (void *)(ds + 1);
 314}
 315
 316static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst)
 317{
 318        return dst->rcv != NULL;
 319}
 320#endif
 321