Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/dsa/dsa_priv.h
15109 views
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
20
struct 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
51
struct 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
84
static 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
89
static 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
105
struct 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
126
struct 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 */
161
extern char dsa_driver_version[];
162
void register_switch_driver(struct dsa_switch_driver *type);
163
void unregister_switch_driver(struct dsa_switch_driver *type);
164
165
/* slave.c */
166
void dsa_slave_mii_bus_init(struct dsa_switch *ds);
167
struct net_device *dsa_slave_create(struct dsa_switch *ds,
168
struct device *parent,
169
int port, char *name);
170
171
/* tag_dsa.c */
172
netdev_tx_t dsa_xmit(struct sk_buff *skb, struct net_device *dev);
173
174
/* tag_edsa.c */
175
netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev);
176
177
/* tag_trailer.c */
178
netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev);
179
180
181
#endif
182
183