14
14
#include <linux/workqueue.h>
15
15
#include <linux/module.h>
16
16
#include <linux/if_bridge.h>
17
+ #include <linux/dsa/loop.h>
17
18
#include <net/dsa.h>
18
19
19
20
#include "dsa_loop.h"
20
21
21
- struct dsa_loop_vlan {
22
- u16 members ;
23
- u16 untagged ;
24
- };
25
-
26
- struct dsa_loop_mib_entry {
27
- char name [ETH_GSTRING_LEN ];
28
- unsigned long val ;
29
- };
30
-
31
- enum dsa_loop_mib_counters {
32
- DSA_LOOP_PHY_READ_OK ,
33
- DSA_LOOP_PHY_READ_ERR ,
34
- DSA_LOOP_PHY_WRITE_OK ,
35
- DSA_LOOP_PHY_WRITE_ERR ,
36
- __DSA_LOOP_CNT_MAX ,
37
- };
38
-
39
22
static struct dsa_loop_mib_entry dsa_loop_mibs [] = {
40
23
[DSA_LOOP_PHY_READ_OK ] = { "phy_read_ok" , },
41
24
[DSA_LOOP_PHY_READ_ERR ] = { "phy_read_err" , },
42
25
[DSA_LOOP_PHY_WRITE_OK ] = { "phy_write_ok" , },
43
26
[DSA_LOOP_PHY_WRITE_ERR ] = { "phy_write_err" , },
44
27
};
45
28
46
- struct dsa_loop_port {
47
- struct dsa_loop_mib_entry mib [__DSA_LOOP_CNT_MAX ];
48
- };
49
-
50
- #define DSA_LOOP_VLANS 5
51
-
52
- struct dsa_loop_priv {
53
- struct mii_bus * bus ;
54
- unsigned int port_base ;
55
- struct dsa_loop_vlan vlans [DSA_LOOP_VLANS ];
56
- struct net_device * netdev ;
57
- struct dsa_loop_port ports [DSA_MAX_PORTS ];
58
- u16 pvid ;
59
- };
60
-
61
29
static struct phy_device * phydevs [PHY_MAX_ADDR ];
62
30
63
31
static enum dsa_tag_protocol dsa_loop_get_protocol (struct dsa_switch * ds ,
@@ -191,7 +159,7 @@ dsa_loop_port_vlan_prepare(struct dsa_switch *ds, int port,
191
159
/* Just do a sleeping operation to make lockdep checks effective */
192
160
mdiobus_read (bus , ps -> port_base + port , MII_BMSR );
193
161
194
- if (vlan -> vid_end > DSA_LOOP_VLANS )
162
+ if (vlan -> vid_end > ARRAY_SIZE ( ps -> vlans ) )
195
163
return - ERANGE ;
196
164
197
165
return 0 ;
@@ -224,7 +192,7 @@ static void dsa_loop_port_vlan_add(struct dsa_switch *ds, int port,
224
192
}
225
193
226
194
if (pvid )
227
- ps -> pvid = vid ;
195
+ ps -> ports [ port ]. pvid = vid ;
228
196
}
229
197
230
198
static int dsa_loop_port_vlan_del (struct dsa_switch * ds , int port ,
@@ -234,7 +202,7 @@ static int dsa_loop_port_vlan_del(struct dsa_switch *ds, int port,
234
202
struct dsa_loop_priv * ps = ds -> priv ;
235
203
struct mii_bus * bus = ps -> bus ;
236
204
struct dsa_loop_vlan * vl ;
237
- u16 vid , pvid = ps -> pvid ;
205
+ u16 vid , pvid = ps -> ports [ port ]. pvid ;
238
206
239
207
/* Just do a sleeping operation to make lockdep checks effective */
240
208
mdiobus_read (bus , ps -> port_base + port , MII_BMSR );
@@ -252,11 +220,26 @@ static int dsa_loop_port_vlan_del(struct dsa_switch *ds, int port,
252
220
dev_dbg (ds -> dev , "%s: port: %d vlan: %d, %stagged, pvid: %d\n" ,
253
221
__func__ , port , vid , untagged ? "un" : "" , pvid );
254
222
}
255
- ps -> pvid = pvid ;
223
+ ps -> ports [port ].pvid = pvid ;
224
+
225
+ return 0 ;
226
+ }
227
+
228
+ static int dsa_loop_port_change_mtu (struct dsa_switch * ds , int port ,
229
+ int new_mtu )
230
+ {
231
+ struct dsa_loop_priv * priv = ds -> priv ;
232
+
233
+ priv -> ports [port ].mtu = new_mtu ;
256
234
257
235
return 0 ;
258
236
}
259
237
238
+ static int dsa_loop_port_max_mtu (struct dsa_switch * ds , int port )
239
+ {
240
+ return ETH_MAX_MTU ;
241
+ }
242
+
260
243
static const struct dsa_switch_ops dsa_loop_driver = {
261
244
.get_tag_protocol = dsa_loop_get_protocol ,
262
245
.setup = dsa_loop_setup ,
@@ -273,6 +256,8 @@ static const struct dsa_switch_ops dsa_loop_driver = {
273
256
.port_vlan_prepare = dsa_loop_port_vlan_prepare ,
274
257
.port_vlan_add = dsa_loop_port_vlan_add ,
275
258
.port_vlan_del = dsa_loop_port_vlan_del ,
259
+ .port_change_mtu = dsa_loop_port_change_mtu ,
260
+ .port_max_mtu = dsa_loop_port_max_mtu ,
276
261
};
277
262
278
263
static int dsa_loop_drv_probe (struct mdio_device * mdiodev )
@@ -290,7 +275,7 @@ static int dsa_loop_drv_probe(struct mdio_device *mdiodev)
290
275
return - ENOMEM ;
291
276
292
277
ds -> dev = & mdiodev -> dev ;
293
- ds -> num_ports = DSA_MAX_PORTS ;
278
+ ds -> num_ports = DSA_LOOP_NUM_PORTS ;
294
279
295
280
ps = devm_kzalloc (& mdiodev -> dev , sizeof (* ps ), GFP_KERNEL );
296
281
if (!ps )
0 commit comments