linux/net/dsa/dsa_priv.h
<<
>>
Prefs
   1/*
   2 * net/dsa/dsa_priv.h - Hardware switch handling
   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 __DSA_PRIV_H
  12#define __DSA_PRIV_H
  13
  14#include <linux/list.h>
  15#include <linux/phy.h>
  16#include <linux/timer.h>
  17#include <linux/workqueue.h>
  18#include <net/dsa.h>
  19
  20struct dsa_switch {
  21        /*
  22         * Parent switch tree, and switch index.
  23         */
  24        struct dsa_switch_tree  *dst;
  25        int                     index;
  26
  27        /*
  28         * Configuration data for this switch.
  29         */
  30        struct dsa_chip_data    *pd;
  31
  32        /*
  33         * The used switch driver.
  34         */
  35        struct dsa_switch_driver        *drv;
  36
  37        /*
  38         * Reference to mii bus to use.
  39         */
  40        struct mii_bus          *master_mii_bus;
  41
  42        /*
  43         * Slave mii_bus and devices for the individual ports.
  44         */
  45        u32                     dsa_port_mask;
  46        u32                     phys_port_mask;
  47        struct mii_bus          *slave_mii_bus;
  48        struct net_device       *ports[DSA_MAX_PORTS];
  49};
  50
  51struct dsa_switch_tree {
  52        /*
  53         * Configuration data for the platform device that owns
  54         * this dsa switch tree instance.
  55         */
  56        struct dsa_platform_data        *pd;
  57
  58        /*
  59         * Reference to network device to use, and which tagging
  60         * protocol to use.
  61         */
  62        struct net_device       *master_netdev;
  63        __be16                  tag_protocol;
  64
  65        /*
  66         * The switch and port to which the CPU is attached.
  67         */
  68        s8                      cpu_switch;
  69        s8                      cpu_port;
  70
  71        /*
  72         * Link state polling.
  73         */
  74        int                     link_poll_needed;
  75        struct work_struct      link_poll_work;
  76        struct timer_list       link_poll_timer;
  77
  78        /*
  79         * Data for the individual switch chips.
  80         */
  81        struct dsa_switch       *ds[DSA_MAX_SWITCHES];
  82};
  83
  84static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
  85{
  86        return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
  87}
  88
  89static inline u8 dsa_upstream_port(struct dsa_switch *ds)
  90{
  91        struct dsa_switch_tree *dst = ds->dst;
  92
  93        /*
  94         * If this is the root switch (i.e. the switch that connects
  95         * to the CPU), return the cpu port number on this switch.
  96         * Else return the (DSA) port number that connects to the
  97         * switch that is one hop closer to the cpu.
  98         */
  99        if (dst->cpu_switch == ds->index)
 100                return dst->cpu_port;
 101        else
 102                return ds->pd->rtable[dst->cpu_switch];
 103}
 104
 105struct dsa_slave_priv {
 106        /*
 107         * The linux network interface corresponding to this
 108         * switch port.
 109         */
 110        struct net_device       *dev;
 111
 112        /*
 113         * Which switch this port is a part of, and the port index
 114         * for this port.
 115         */
 116        struct dsa_switch       *parent;
 117        u8                      port;
 118
 119        /*
 120         * The phylib phy_device pointer for the PHY connected
 121         * to this port.
 122         */
 123        struct phy_device       *phy;
 124};
 125
 126struct dsa_switch_driver {
 127        struct list_head        list;
 128
 129        __be16                  tag_protocol;
 130        int                     priv_size;
 131
 132        /*
 133         * Probing and setup.
 134         */
 135        char    *(*probe)(struct mii_bus *bus, int sw_addr);
 136        int     (*setup)(struct dsa_switch *ds);
 137        int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
 138
 139        /*
 140         * Access to the switch's PHY registers.
 141         */
 142        int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
 143        int     (*phy_write)(struct dsa_switch *ds, int port,
 144                             int regnum, u16 val);
 145
 146        /*
 147         * Link state polling and IRQ handling.
 148         */
 149        void    (*poll_link)(struct dsa_switch *ds);
 150
 151        /*
 152         * ethtool hardware statistics.
 153         */
 154        void    (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
 155        void    (*get_ethtool_stats)(struct dsa_switch *ds,
 156                                     int port, uint64_t *data);
 157        int     (*get_sset_count)(struct dsa_switch *ds);
 158};
 159
 160/* dsa.c */
 161extern char dsa_driver_version[];
 162void register_switch_driver(struct dsa_switch_driver *type);
 163void unregister_switch_driver(struct dsa_switch_driver *type);
 164
 165/* slave.c */
 166void dsa_slave_mii_bus_init(struct dsa_switch *ds);
 167struct net_device *dsa_slave_create(struct dsa_switch *ds,
 168                                    struct device *parent,
 169                                    int port, char *name);
 170
 171/* tag_dsa.c */
 172int dsa_xmit(struct sk_buff *skb, struct net_device *dev);
 173
 174/* tag_edsa.c */
 175int edsa_xmit(struct sk_buff *skb, struct net_device *dev);
 176
 177/* tag_trailer.c */
 178int trailer_xmit(struct sk_buff *skb, struct net_device *dev);
 179
 180
 181#endif
 182
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.