blob: a45186cb6daf9c006e29865b2dd29b8b1c713405 [file] [log] [blame]
Lennert Buytenhek91da11f2008-10-07 13:44:02 +00001/*
2 * net/dsa/dsa_priv.h - Hardware switch handling
Lennert Buytenheke84665c2009-03-20 09:52:09 +00003 * Copyright (c) 2008-2009 Marvell Semiconductor
Lennert Buytenhek91da11f2008-10-07 13:44:02 +00004 *
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 /*
Lennert Buytenheke84665c2009-03-20 09:52:09 +000022 * Parent switch tree, and switch index.
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000023 */
Lennert Buytenheke84665c2009-03-20 09:52:09 +000024 struct dsa_switch_tree *dst;
25 int index;
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000026
27 /*
Lennert Buytenheke84665c2009-03-20 09:52:09 +000028 * Configuration data for this switch.
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000029 */
Lennert Buytenheke84665c2009-03-20 09:52:09 +000030 struct dsa_chip_data *pd;
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000031
32 /*
Lennert Buytenheke84665c2009-03-20 09:52:09 +000033 * The used switch driver.
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000034 */
35 struct dsa_switch_driver *drv;
Lennert Buytenheke84665c2009-03-20 09:52:09 +000036
37 /*
38 * Reference to mii bus to use.
39 */
40 struct mii_bus *master_mii_bus;
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000041
42 /*
43 * Slave mii_bus and devices for the individual ports.
44 */
Lennert Buytenheke84665c2009-03-20 09:52:09 +000045 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
Lennert Buytenheke84665c2009-03-20 09:52:09 +000051static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
52{
53 return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port);
54}
55
56static inline u8 dsa_upstream_port(struct dsa_switch *ds)
57{
58 struct dsa_switch_tree *dst = ds->dst;
59
60 /*
61 * If this is the root switch (i.e. the switch that connects
62 * to the CPU), return the cpu port number on this switch.
63 * Else return the (DSA) port number that connects to the
64 * switch that is one hop closer to the cpu.
65 */
66 if (dst->cpu_switch == ds->index)
67 return dst->cpu_port;
68 else
69 return ds->pd->rtable[dst->cpu_switch];
70}
71
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000072struct dsa_slave_priv {
Lennert Buytenheke84665c2009-03-20 09:52:09 +000073 /*
74 * The linux network interface corresponding to this
75 * switch port.
76 */
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000077 struct net_device *dev;
Lennert Buytenheke84665c2009-03-20 09:52:09 +000078
79 /*
80 * Which switch this port is a part of, and the port index
81 * for this port.
82 */
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000083 struct dsa_switch *parent;
Lennert Buytenheke84665c2009-03-20 09:52:09 +000084 u8 port;
85
86 /*
87 * The phylib phy_device pointer for the PHY connected
88 * to this port.
89 */
Lennert Buytenhek91da11f2008-10-07 13:44:02 +000090 struct phy_device *phy;
91};
92
93struct dsa_switch_driver {
94 struct list_head list;
95
96 __be16 tag_protocol;
97 int priv_size;
98
99 /*
100 * Probing and setup.
101 */
102 char *(*probe)(struct mii_bus *bus, int sw_addr);
103 int (*setup)(struct dsa_switch *ds);
104 int (*set_addr)(struct dsa_switch *ds, u8 *addr);
105
106 /*
107 * Access to the switch's PHY registers.
108 */
109 int (*phy_read)(struct dsa_switch *ds, int port, int regnum);
110 int (*phy_write)(struct dsa_switch *ds, int port,
111 int regnum, u16 val);
112
113 /*
114 * Link state polling and IRQ handling.
115 */
116 void (*poll_link)(struct dsa_switch *ds);
117
118 /*
119 * ethtool hardware statistics.
120 */
121 void (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data);
122 void (*get_ethtool_stats)(struct dsa_switch *ds,
123 int port, uint64_t *data);
124 int (*get_sset_count)(struct dsa_switch *ds);
125};
126
127/* dsa.c */
128extern char dsa_driver_version[];
129void register_switch_driver(struct dsa_switch_driver *type);
130void unregister_switch_driver(struct dsa_switch_driver *type);
131
132/* slave.c */
133void dsa_slave_mii_bus_init(struct dsa_switch *ds);
134struct net_device *dsa_slave_create(struct dsa_switch *ds,
135 struct device *parent,
136 int port, char *name);
137
Lennert Buytenhekcf85d082008-10-07 13:45:02 +0000138/* tag_dsa.c */
Stephen Hemminger6fef4c02009-08-31 19:50:41 +0000139netdev_tx_t dsa_xmit(struct sk_buff *skb, struct net_device *dev);
Lennert Buytenhekcf85d082008-10-07 13:45:02 +0000140
Lennert Buytenhek91da11f2008-10-07 13:44:02 +0000141/* tag_edsa.c */
Stephen Hemminger6fef4c02009-08-31 19:50:41 +0000142netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev);
Lennert Buytenhek91da11f2008-10-07 13:44:02 +0000143
Lennert Buytenhek396138f02008-10-07 13:46:07 +0000144/* tag_trailer.c */
Stephen Hemminger6fef4c02009-08-31 19:50:41 +0000145netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev);
Lennert Buytenhek396138f02008-10-07 13:46:07 +0000146
Lennert Buytenhek91da11f2008-10-07 13:44:02 +0000147
148#endif