hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/dsa/dsa2.c
....@@ -1,13 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * net/dsa/dsa2.c - Hardware switch handling, binding version 2
34 * Copyright (c) 2008-2009 Marvell Semiconductor
45 * Copyright (c) 2013 Florian Fainelli <florian@openwrt.org>
56 * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License as published by
9
- * the Free Software Foundation; either version 2 of the License, or
10
- * (at your option) any later version.
117 */
128
139 #include <linux/device.h>
....@@ -18,14 +14,33 @@
1814 #include <linux/rtnetlink.h>
1915 #include <linux/of.h>
2016 #include <linux/of_net.h>
17
+#include <net/devlink.h>
2118
2219 #include "dsa_priv.h"
2320
24
-static LIST_HEAD(dsa_tree_list);
2521 static DEFINE_MUTEX(dsa2_mutex);
22
+LIST_HEAD(dsa_tree_list);
2623
27
-static const struct devlink_ops dsa_devlink_ops = {
28
-};
24
+struct dsa_switch *dsa_switch_find(int tree_index, int sw_index)
25
+{
26
+ struct dsa_switch_tree *dst;
27
+ struct dsa_port *dp;
28
+
29
+ list_for_each_entry(dst, &dsa_tree_list, list) {
30
+ if (dst->index != tree_index)
31
+ continue;
32
+
33
+ list_for_each_entry(dp, &dst->ports, list) {
34
+ if (dp->ds->index != sw_index)
35
+ continue;
36
+
37
+ return dp->ds;
38
+ }
39
+ }
40
+
41
+ return NULL;
42
+}
43
+EXPORT_SYMBOL_GPL(dsa_switch_find);
2944
3045 static struct dsa_switch_tree *dsa_tree_find(int index)
3146 {
....@@ -47,6 +62,10 @@
4762 return NULL;
4863
4964 dst->index = index;
65
+
66
+ INIT_LIST_HEAD(&dst->rtable);
67
+
68
+ INIT_LIST_HEAD(&dst->ports);
5069
5170 INIT_LIST_HEAD(&dst->list);
5271 list_add_tail(&dst->list, &dsa_tree_list);
....@@ -114,24 +133,39 @@
114133 static struct dsa_port *dsa_tree_find_port_by_node(struct dsa_switch_tree *dst,
115134 struct device_node *dn)
116135 {
117
- struct dsa_switch *ds;
118136 struct dsa_port *dp;
119
- int device, port;
120137
121
- for (device = 0; device < DSA_MAX_SWITCHES; device++) {
122
- ds = dst->ds[device];
123
- if (!ds)
124
- continue;
125
-
126
- for (port = 0; port < ds->num_ports; port++) {
127
- dp = &ds->ports[port];
128
-
129
- if (dp->dn == dn)
130
- return dp;
131
- }
132
- }
138
+ list_for_each_entry(dp, &dst->ports, list)
139
+ if (dp->dn == dn)
140
+ return dp;
133141
134142 return NULL;
143
+}
144
+
145
+static struct dsa_link *dsa_link_touch(struct dsa_port *dp,
146
+ struct dsa_port *link_dp)
147
+{
148
+ struct dsa_switch *ds = dp->ds;
149
+ struct dsa_switch_tree *dst;
150
+ struct dsa_link *dl;
151
+
152
+ dst = ds->dst;
153
+
154
+ list_for_each_entry(dl, &dst->rtable, list)
155
+ if (dl->dp == dp && dl->link_dp == link_dp)
156
+ return dl;
157
+
158
+ dl = kzalloc(sizeof(*dl), GFP_KERNEL);
159
+ if (!dl)
160
+ return NULL;
161
+
162
+ dl->dp = dp;
163
+ dl->link_dp = link_dp;
164
+
165
+ INIT_LIST_HEAD(&dl->list);
166
+ list_add_tail(&dl->list, &dst->rtable);
167
+
168
+ return dl;
135169 }
136170
137171 static bool dsa_port_setup_routing_table(struct dsa_port *dp)
....@@ -141,6 +175,7 @@
141175 struct device_node *dn = dp->dn;
142176 struct of_phandle_iterator it;
143177 struct dsa_port *link_dp;
178
+ struct dsa_link *dl;
144179 int err;
145180
146181 of_for_each_phandle(&it, err, dn, "link", NULL, 0) {
....@@ -150,24 +185,22 @@
150185 return false;
151186 }
152187
153
- ds->rtable[link_dp->ds->index] = dp->index;
188
+ dl = dsa_link_touch(dp, link_dp);
189
+ if (!dl) {
190
+ of_node_put(it.node);
191
+ return false;
192
+ }
154193 }
155194
156195 return true;
157196 }
158197
159
-static bool dsa_switch_setup_routing_table(struct dsa_switch *ds)
198
+static bool dsa_tree_setup_routing_table(struct dsa_switch_tree *dst)
160199 {
161200 bool complete = true;
162201 struct dsa_port *dp;
163
- int i;
164202
165
- for (i = 0; i < DSA_MAX_SWITCHES; i++)
166
- ds->rtable[i] = DSA_RTABLE_NONE;
167
-
168
- for (i = 0; i < ds->num_ports; i++) {
169
- dp = &ds->ports[i];
170
-
203
+ list_for_each_entry(dp, &dst->ports, list) {
171204 if (dsa_port_is_dsa(dp)) {
172205 complete = dsa_port_setup_routing_table(dp);
173206 if (!complete)
....@@ -178,156 +211,165 @@
178211 return complete;
179212 }
180213
181
-static bool dsa_tree_setup_routing_table(struct dsa_switch_tree *dst)
182
-{
183
- struct dsa_switch *ds;
184
- bool complete = true;
185
- int device;
186
-
187
- for (device = 0; device < DSA_MAX_SWITCHES; device++) {
188
- ds = dst->ds[device];
189
- if (!ds)
190
- continue;
191
-
192
- complete = dsa_switch_setup_routing_table(ds);
193
- if (!complete)
194
- break;
195
- }
196
-
197
- return complete;
198
-}
199
-
200214 static struct dsa_port *dsa_tree_find_first_cpu(struct dsa_switch_tree *dst)
201215 {
202
- struct dsa_switch *ds;
203216 struct dsa_port *dp;
204
- int device, port;
205217
206
- for (device = 0; device < DSA_MAX_SWITCHES; device++) {
207
- ds = dst->ds[device];
208
- if (!ds)
209
- continue;
210
-
211
- for (port = 0; port < ds->num_ports; port++) {
212
- dp = &ds->ports[port];
213
-
214
- if (dsa_port_is_cpu(dp))
215
- return dp;
216
- }
217
- }
218
+ list_for_each_entry(dp, &dst->ports, list)
219
+ if (dsa_port_is_cpu(dp))
220
+ return dp;
218221
219222 return NULL;
220223 }
221224
222225 static int dsa_tree_setup_default_cpu(struct dsa_switch_tree *dst)
223226 {
224
- struct dsa_switch *ds;
225
- struct dsa_port *dp;
226
- int device, port;
227
+ struct dsa_port *cpu_dp, *dp;
227228
228
- /* DSA currently only supports a single CPU port */
229
- dst->cpu_dp = dsa_tree_find_first_cpu(dst);
230
- if (!dst->cpu_dp) {
231
- pr_warn("Tree has no master device\n");
229
+ cpu_dp = dsa_tree_find_first_cpu(dst);
230
+ if (!cpu_dp) {
231
+ pr_err("DSA: tree %d has no CPU port\n", dst->index);
232232 return -EINVAL;
233233 }
234234
235235 /* Assign the default CPU port to all ports of the fabric */
236
- for (device = 0; device < DSA_MAX_SWITCHES; device++) {
237
- ds = dst->ds[device];
238
- if (!ds)
239
- continue;
240
-
241
- for (port = 0; port < ds->num_ports; port++) {
242
- dp = &ds->ports[port];
243
-
244
- if (dsa_port_is_user(dp) || dsa_port_is_dsa(dp))
245
- dp->cpu_dp = dst->cpu_dp;
246
- }
247
- }
236
+ list_for_each_entry(dp, &dst->ports, list)
237
+ if (dsa_port_is_user(dp) || dsa_port_is_dsa(dp))
238
+ dp->cpu_dp = cpu_dp;
248239
249240 return 0;
250241 }
251242
252243 static void dsa_tree_teardown_default_cpu(struct dsa_switch_tree *dst)
253244 {
254
- /* DSA currently only supports a single CPU port */
255
- dst->cpu_dp = NULL;
245
+ struct dsa_port *dp;
246
+
247
+ list_for_each_entry(dp, &dst->ports, list)
248
+ if (dsa_port_is_user(dp) || dsa_port_is_dsa(dp))
249
+ dp->cpu_dp = NULL;
256250 }
257251
258252 static int dsa_port_setup(struct dsa_port *dp)
259253 {
260
- struct dsa_switch *ds = dp->ds;
254
+ struct devlink_port *dlp = &dp->devlink_port;
255
+ bool dsa_port_link_registered = false;
256
+ bool dsa_port_enabled = false;
261257 int err = 0;
262258
263
- memset(&dp->devlink_port, 0, sizeof(dp->devlink_port));
264
- dp->mac = of_get_mac_address(dp->dn);
265
-
266
- if (dp->type != DSA_PORT_TYPE_UNUSED)
267
- err = devlink_port_register(ds->devlink, &dp->devlink_port,
268
- dp->index);
269
- if (err)
270
- return err;
259
+ if (dp->setup)
260
+ return 0;
271261
272262 switch (dp->type) {
273263 case DSA_PORT_TYPE_UNUSED:
264
+ dsa_port_disable(dp);
274265 break;
275266 case DSA_PORT_TYPE_CPU:
276
- /* dp->index is used now as port_number. However
277
- * CPU ports should have separate numbering
278
- * independent from front panel port numbers.
279
- */
280
- devlink_port_attrs_set(&dp->devlink_port,
281
- DEVLINK_PORT_FLAVOUR_CPU,
282
- dp->index, false, 0);
283267 err = dsa_port_link_register_of(dp);
284
- if (err) {
285
- dev_err(ds->dev, "failed to setup link for port %d.%d\n",
286
- ds->index, dp->index);
287
- return err;
288
- }
268
+ if (err)
269
+ break;
270
+ dsa_port_link_registered = true;
271
+
272
+ err = dsa_port_enable(dp, NULL);
273
+ if (err)
274
+ break;
275
+ dsa_port_enabled = true;
276
+
289277 break;
290278 case DSA_PORT_TYPE_DSA:
291
- /* dp->index is used now as port_number. However
292
- * DSA ports should have separate numbering
293
- * independent from front panel port numbers.
294
- */
295
- devlink_port_attrs_set(&dp->devlink_port,
296
- DEVLINK_PORT_FLAVOUR_DSA,
297
- dp->index, false, 0);
298279 err = dsa_port_link_register_of(dp);
299
- if (err) {
300
- dev_err(ds->dev, "failed to setup link for port %d.%d\n",
301
- ds->index, dp->index);
302
- return err;
303
- }
280
+ if (err)
281
+ break;
282
+ dsa_port_link_registered = true;
283
+
284
+ err = dsa_port_enable(dp, NULL);
285
+ if (err)
286
+ break;
287
+ dsa_port_enabled = true;
288
+
304289 break;
305290 case DSA_PORT_TYPE_USER:
306
- devlink_port_attrs_set(&dp->devlink_port,
307
- DEVLINK_PORT_FLAVOUR_PHYSICAL,
308
- dp->index, false, 0);
291
+ dp->mac = of_get_mac_address(dp->dn);
309292 err = dsa_slave_create(dp);
310293 if (err)
311
- dev_err(ds->dev, "failed to create slave for port %d.%d\n",
312
- ds->index, dp->index);
313
- else
314
- devlink_port_type_eth_set(&dp->devlink_port, dp->slave);
294
+ break;
295
+
296
+ devlink_port_type_eth_set(dlp, dp->slave);
315297 break;
316298 }
299
+
300
+ if (err && dsa_port_enabled)
301
+ dsa_port_disable(dp);
302
+ if (err && dsa_port_link_registered)
303
+ dsa_port_link_unregister_of(dp);
304
+ if (err)
305
+ return err;
306
+
307
+ dp->setup = true;
317308
318309 return 0;
319310 }
320311
312
+static int dsa_port_devlink_setup(struct dsa_port *dp)
313
+{
314
+ struct devlink_port *dlp = &dp->devlink_port;
315
+ struct dsa_switch_tree *dst = dp->ds->dst;
316
+ struct devlink_port_attrs attrs = {};
317
+ struct devlink *dl = dp->ds->devlink;
318
+ const unsigned char *id;
319
+ unsigned char len;
320
+ int err;
321
+
322
+ id = (const unsigned char *)&dst->index;
323
+ len = sizeof(dst->index);
324
+
325
+ attrs.phys.port_number = dp->index;
326
+ memcpy(attrs.switch_id.id, id, len);
327
+ attrs.switch_id.id_len = len;
328
+ memset(dlp, 0, sizeof(*dlp));
329
+
330
+ switch (dp->type) {
331
+ case DSA_PORT_TYPE_UNUSED:
332
+ attrs.flavour = DEVLINK_PORT_FLAVOUR_UNUSED;
333
+ break;
334
+ case DSA_PORT_TYPE_CPU:
335
+ attrs.flavour = DEVLINK_PORT_FLAVOUR_CPU;
336
+ break;
337
+ case DSA_PORT_TYPE_DSA:
338
+ attrs.flavour = DEVLINK_PORT_FLAVOUR_DSA;
339
+ break;
340
+ case DSA_PORT_TYPE_USER:
341
+ attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
342
+ break;
343
+ }
344
+
345
+ devlink_port_attrs_set(dlp, &attrs);
346
+ err = devlink_port_register(dl, dlp, dp->index);
347
+
348
+ if (!err)
349
+ dp->devlink_port_setup = true;
350
+
351
+ return err;
352
+}
353
+
321354 static void dsa_port_teardown(struct dsa_port *dp)
322355 {
323
- if (dp->type != DSA_PORT_TYPE_UNUSED)
324
- devlink_port_unregister(&dp->devlink_port);
356
+ struct devlink_port *dlp = &dp->devlink_port;
357
+
358
+ if (!dp->setup)
359
+ return;
360
+
361
+ devlink_port_type_clear(dlp);
325362
326363 switch (dp->type) {
327364 case DSA_PORT_TYPE_UNUSED:
328365 break;
329366 case DSA_PORT_TYPE_CPU:
367
+ dsa_port_disable(dp);
368
+ dsa_tag_driver_put(dp->tag_ops);
369
+ dsa_port_link_unregister_of(dp);
370
+ break;
330371 case DSA_PORT_TYPE_DSA:
372
+ dsa_port_disable(dp);
331373 dsa_port_link_unregister_of(dp);
332374 break;
333375 case DSA_PORT_TYPE_USER:
....@@ -337,11 +379,43 @@
337379 }
338380 break;
339381 }
382
+
383
+ dp->setup = false;
340384 }
385
+
386
+static void dsa_port_devlink_teardown(struct dsa_port *dp)
387
+{
388
+ struct devlink_port *dlp = &dp->devlink_port;
389
+
390
+ if (dp->devlink_port_setup)
391
+ devlink_port_unregister(dlp);
392
+ dp->devlink_port_setup = false;
393
+}
394
+
395
+static int dsa_devlink_info_get(struct devlink *dl,
396
+ struct devlink_info_req *req,
397
+ struct netlink_ext_ack *extack)
398
+{
399
+ struct dsa_switch *ds = dsa_devlink_to_ds(dl);
400
+
401
+ if (ds->ops->devlink_info_get)
402
+ return ds->ops->devlink_info_get(ds, req, extack);
403
+
404
+ return -EOPNOTSUPP;
405
+}
406
+
407
+static const struct devlink_ops dsa_devlink_ops = {
408
+ .info_get = dsa_devlink_info_get,
409
+};
341410
342411 static int dsa_switch_setup(struct dsa_switch *ds)
343412 {
413
+ struct dsa_devlink_priv *dl_priv;
414
+ struct dsa_port *dp;
344415 int err;
416
+
417
+ if (ds->setup)
418
+ return 0;
345419
346420 /* Initialize ds->phys_mii_mask before registering the slave MDIO bus
347421 * driver and before ops->setup() has run, since the switch drivers and
....@@ -353,72 +427,159 @@
353427 /* Add the switch to devlink before calling setup, so that setup can
354428 * add dpipe tables
355429 */
356
- ds->devlink = devlink_alloc(&dsa_devlink_ops, 0);
430
+ ds->devlink = devlink_alloc(&dsa_devlink_ops, sizeof(*dl_priv));
357431 if (!ds->devlink)
358432 return -ENOMEM;
433
+ dl_priv = devlink_priv(ds->devlink);
434
+ dl_priv->ds = ds;
359435
360436 err = devlink_register(ds->devlink, ds->dev);
361437 if (err)
362
- return err;
438
+ goto free_devlink;
363439
364
- err = ds->ops->setup(ds);
365
- if (err < 0)
366
- return err;
440
+ /* Setup devlink port instances now, so that the switch
441
+ * setup() can register regions etc, against the ports
442
+ */
443
+ list_for_each_entry(dp, &ds->dst->ports, list) {
444
+ if (dp->ds == ds) {
445
+ err = dsa_port_devlink_setup(dp);
446
+ if (err)
447
+ goto unregister_devlink_ports;
448
+ }
449
+ }
367450
368451 err = dsa_switch_register_notifier(ds);
369452 if (err)
370
- return err;
453
+ goto unregister_devlink_ports;
454
+
455
+ err = ds->ops->setup(ds);
456
+ if (err < 0)
457
+ goto unregister_notifier;
458
+
459
+ devlink_params_publish(ds->devlink);
371460
372461 if (!ds->slave_mii_bus && ds->ops->phy_read) {
373
- ds->slave_mii_bus = devm_mdiobus_alloc(ds->dev);
374
- if (!ds->slave_mii_bus)
375
- return -ENOMEM;
462
+ ds->slave_mii_bus = mdiobus_alloc();
463
+ if (!ds->slave_mii_bus) {
464
+ err = -ENOMEM;
465
+ goto teardown;
466
+ }
376467
377468 dsa_slave_mii_bus_init(ds);
378469
379470 err = mdiobus_register(ds->slave_mii_bus);
380471 if (err < 0)
381
- return err;
472
+ goto free_slave_mii_bus;
382473 }
383474
475
+ ds->setup = true;
476
+
384477 return 0;
478
+
479
+free_slave_mii_bus:
480
+ if (ds->slave_mii_bus && ds->ops->phy_read)
481
+ mdiobus_free(ds->slave_mii_bus);
482
+teardown:
483
+ if (ds->ops->teardown)
484
+ ds->ops->teardown(ds);
485
+unregister_notifier:
486
+ dsa_switch_unregister_notifier(ds);
487
+unregister_devlink_ports:
488
+ list_for_each_entry(dp, &ds->dst->ports, list)
489
+ if (dp->ds == ds)
490
+ dsa_port_devlink_teardown(dp);
491
+ devlink_unregister(ds->devlink);
492
+free_devlink:
493
+ devlink_free(ds->devlink);
494
+ ds->devlink = NULL;
495
+
496
+ return err;
385497 }
386498
387499 static void dsa_switch_teardown(struct dsa_switch *ds)
388500 {
389
- if (ds->slave_mii_bus && ds->ops->phy_read)
501
+ struct dsa_port *dp;
502
+
503
+ if (!ds->setup)
504
+ return;
505
+
506
+ if (ds->slave_mii_bus && ds->ops->phy_read) {
390507 mdiobus_unregister(ds->slave_mii_bus);
508
+ mdiobus_free(ds->slave_mii_bus);
509
+ ds->slave_mii_bus = NULL;
510
+ }
391511
392512 dsa_switch_unregister_notifier(ds);
393513
514
+ if (ds->ops->teardown)
515
+ ds->ops->teardown(ds);
516
+
394517 if (ds->devlink) {
518
+ list_for_each_entry(dp, &ds->dst->ports, list)
519
+ if (dp->ds == ds)
520
+ dsa_port_devlink_teardown(dp);
395521 devlink_unregister(ds->devlink);
396522 devlink_free(ds->devlink);
397523 ds->devlink = NULL;
398524 }
399525
526
+ ds->setup = false;
400527 }
401528
402529 static int dsa_tree_setup_switches(struct dsa_switch_tree *dst)
403530 {
404
- struct dsa_switch *ds;
405531 struct dsa_port *dp;
406
- int device, port;
407532 int err;
408533
409
- for (device = 0; device < DSA_MAX_SWITCHES; device++) {
410
- ds = dst->ds[device];
411
- if (!ds)
412
- continue;
413
-
414
- err = dsa_switch_setup(ds);
534
+ list_for_each_entry(dp, &dst->ports, list) {
535
+ err = dsa_switch_setup(dp->ds);
415536 if (err)
537
+ goto teardown;
538
+ }
539
+
540
+ list_for_each_entry(dp, &dst->ports, list) {
541
+ err = dsa_port_setup(dp);
542
+ if (err) {
543
+ dsa_port_devlink_teardown(dp);
544
+ dp->type = DSA_PORT_TYPE_UNUSED;
545
+ err = dsa_port_devlink_setup(dp);
546
+ if (err)
547
+ goto teardown;
416548 continue;
549
+ }
550
+ }
417551
418
- for (port = 0; port < ds->num_ports; port++) {
419
- dp = &ds->ports[port];
552
+ return 0;
420553
421
- err = dsa_port_setup(dp);
554
+teardown:
555
+ list_for_each_entry(dp, &dst->ports, list)
556
+ dsa_port_teardown(dp);
557
+
558
+ list_for_each_entry(dp, &dst->ports, list)
559
+ dsa_switch_teardown(dp->ds);
560
+
561
+ return err;
562
+}
563
+
564
+static void dsa_tree_teardown_switches(struct dsa_switch_tree *dst)
565
+{
566
+ struct dsa_port *dp;
567
+
568
+ list_for_each_entry(dp, &dst->ports, list)
569
+ dsa_port_teardown(dp);
570
+
571
+ list_for_each_entry(dp, &dst->ports, list)
572
+ dsa_switch_teardown(dp->ds);
573
+}
574
+
575
+static int dsa_tree_setup_master(struct dsa_switch_tree *dst)
576
+{
577
+ struct dsa_port *dp;
578
+ int err;
579
+
580
+ list_for_each_entry(dp, &dst->ports, list) {
581
+ if (dsa_port_is_cpu(dp)) {
582
+ err = dsa_master_setup(dp->master, dp);
422583 if (err)
423584 return err;
424585 }
....@@ -427,42 +588,13 @@
427588 return 0;
428589 }
429590
430
-static void dsa_tree_teardown_switches(struct dsa_switch_tree *dst)
431
-{
432
- struct dsa_switch *ds;
433
- struct dsa_port *dp;
434
- int device, port;
435
-
436
- for (device = 0; device < DSA_MAX_SWITCHES; device++) {
437
- ds = dst->ds[device];
438
- if (!ds)
439
- continue;
440
-
441
- for (port = 0; port < ds->num_ports; port++) {
442
- dp = &ds->ports[port];
443
-
444
- dsa_port_teardown(dp);
445
- }
446
-
447
- dsa_switch_teardown(ds);
448
- }
449
-}
450
-
451
-static int dsa_tree_setup_master(struct dsa_switch_tree *dst)
452
-{
453
- struct dsa_port *cpu_dp = dst->cpu_dp;
454
- struct net_device *master = cpu_dp->master;
455
-
456
- /* DSA currently supports a single pair of CPU port and master device */
457
- return dsa_master_setup(master, cpu_dp);
458
-}
459
-
460591 static void dsa_tree_teardown_master(struct dsa_switch_tree *dst)
461592 {
462
- struct dsa_port *cpu_dp = dst->cpu_dp;
463
- struct net_device *master = cpu_dp->master;
593
+ struct dsa_port *dp;
464594
465
- return dsa_master_teardown(master);
595
+ list_for_each_entry(dp, &dst->ports, list)
596
+ if (dsa_port_is_cpu(dp))
597
+ dsa_master_teardown(dp->master);
466598 }
467599
468600 static int dsa_tree_setup(struct dsa_switch_tree *dst)
....@@ -486,21 +618,30 @@
486618
487619 err = dsa_tree_setup_switches(dst);
488620 if (err)
489
- return err;
621
+ goto teardown_default_cpu;
490622
491623 err = dsa_tree_setup_master(dst);
492624 if (err)
493
- return err;
625
+ goto teardown_switches;
494626
495627 dst->setup = true;
496628
497629 pr_info("DSA: tree %d setup\n", dst->index);
498630
499631 return 0;
632
+
633
+teardown_switches:
634
+ dsa_tree_teardown_switches(dst);
635
+teardown_default_cpu:
636
+ dsa_tree_teardown_default_cpu(dst);
637
+
638
+ return err;
500639 }
501640
502641 static void dsa_tree_teardown(struct dsa_switch_tree *dst)
503642 {
643
+ struct dsa_link *dl, *next;
644
+
504645 if (!dst->setup)
505646 return;
506647
....@@ -510,37 +651,36 @@
510651
511652 dsa_tree_teardown_default_cpu(dst);
512653
654
+ list_for_each_entry_safe(dl, next, &dst->rtable, list) {
655
+ list_del(&dl->list);
656
+ kfree(dl);
657
+ }
658
+
513659 pr_info("DSA: tree %d torn down\n", dst->index);
514660
515661 dst->setup = false;
516662 }
517663
518
-static void dsa_tree_remove_switch(struct dsa_switch_tree *dst,
519
- unsigned int index)
664
+static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index)
520665 {
521
- dsa_tree_teardown(dst);
666
+ struct dsa_switch_tree *dst = ds->dst;
667
+ struct dsa_port *dp;
522668
523
- dst->ds[index] = NULL;
524
- dsa_tree_put(dst);
525
-}
669
+ list_for_each_entry(dp, &dst->ports, list)
670
+ if (dp->ds == ds && dp->index == index)
671
+ return dp;
526672
527
-static int dsa_tree_add_switch(struct dsa_switch_tree *dst,
528
- struct dsa_switch *ds)
529
-{
530
- unsigned int index = ds->index;
531
- int err;
673
+ dp = kzalloc(sizeof(*dp), GFP_KERNEL);
674
+ if (!dp)
675
+ return NULL;
532676
533
- if (dst->ds[index])
534
- return -EBUSY;
677
+ dp->ds = ds;
678
+ dp->index = index;
535679
536
- dsa_tree_get(dst);
537
- dst->ds[index] = ds;
680
+ INIT_LIST_HEAD(&dp->list);
681
+ list_add_tail(&dp->list, &dst->ports);
538682
539
- err = dsa_tree_setup(dst);
540
- if (err)
541
- dsa_tree_remove_switch(dst, index);
542
-
543
- return err;
683
+ return dp;
544684 }
545685
546686 static int dsa_port_parse_user(struct dsa_port *dp, const char *name)
....@@ -561,6 +701,32 @@
561701 return 0;
562702 }
563703
704
+static enum dsa_tag_protocol dsa_get_tag_protocol(struct dsa_port *dp,
705
+ struct net_device *master)
706
+{
707
+ enum dsa_tag_protocol tag_protocol = DSA_TAG_PROTO_NONE;
708
+ struct dsa_switch *mds, *ds = dp->ds;
709
+ unsigned int mdp_upstream;
710
+ struct dsa_port *mdp;
711
+
712
+ /* It is possible to stack DSA switches onto one another when that
713
+ * happens the switch driver may want to know if its tagging protocol
714
+ * is going to work in such a configuration.
715
+ */
716
+ if (dsa_slave_dev_check(master)) {
717
+ mdp = dsa_slave_to_port(master);
718
+ mds = mdp->ds;
719
+ mdp_upstream = dsa_upstream_port(mds, mdp->index);
720
+ tag_protocol = mds->ops->get_tag_protocol(mds, mdp_upstream,
721
+ DSA_TAG_PROTO_NONE);
722
+ }
723
+
724
+ /* If the master device is not itself a DSA slave in a disjoint DSA
725
+ * tree, then return immediately.
726
+ */
727
+ return ds->ops->get_tag_protocol(ds, dp->index, tag_protocol);
728
+}
729
+
564730 static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master)
565731 {
566732 struct dsa_switch *ds = dp->ds;
....@@ -568,17 +734,21 @@
568734 const struct dsa_device_ops *tag_ops;
569735 enum dsa_tag_protocol tag_protocol;
570736
571
- tag_protocol = ds->ops->get_tag_protocol(ds, dp->index);
572
- tag_ops = dsa_resolve_tag_protocol(tag_protocol);
737
+ tag_protocol = dsa_get_tag_protocol(dp, master);
738
+ tag_ops = dsa_tag_driver_get(tag_protocol);
573739 if (IS_ERR(tag_ops)) {
740
+ if (PTR_ERR(tag_ops) == -ENOPROTOOPT)
741
+ return -EPROBE_DEFER;
574742 dev_warn(ds->dev, "No tagger for this switch\n");
743
+ dp->master = NULL;
575744 return PTR_ERR(tag_ops);
576745 }
577746
747
+ dp->master = master;
578748 dp->type = DSA_PORT_TYPE_CPU;
749
+ dp->filter = tag_ops->filter;
579750 dp->rcv = tag_ops->rcv;
580751 dp->tag_ops = tag_ops;
581
- dp->master = master;
582752 dp->dst = dst;
583753
584754 return 0;
....@@ -596,6 +766,7 @@
596766 struct net_device *master;
597767
598768 master = of_find_net_device_by_node(ethernet);
769
+ of_node_put(ethernet);
599770 if (!master)
600771 return -EPROBE_DEFER;
601772
....@@ -613,31 +784,39 @@
613784 {
614785 struct device_node *ports, *port;
615786 struct dsa_port *dp;
787
+ int err = 0;
616788 u32 reg;
617
- int err;
618789
619790 ports = of_get_child_by_name(dn, "ports");
620791 if (!ports) {
621
- dev_err(ds->dev, "no ports child node found\n");
622
- return -EINVAL;
792
+ /* The second possibility is "ethernet-ports" */
793
+ ports = of_get_child_by_name(dn, "ethernet-ports");
794
+ if (!ports) {
795
+ dev_err(ds->dev, "no ports child node found\n");
796
+ return -EINVAL;
797
+ }
623798 }
624799
625800 for_each_available_child_of_node(ports, port) {
626801 err = of_property_read_u32(port, "reg", &reg);
627802 if (err)
628
- return err;
803
+ goto out_put_node;
629804
630
- if (reg >= ds->num_ports)
631
- return -EINVAL;
805
+ if (reg >= ds->num_ports) {
806
+ err = -EINVAL;
807
+ goto out_put_node;
808
+ }
632809
633
- dp = &ds->ports[reg];
810
+ dp = dsa_to_port(ds, reg);
634811
635812 err = dsa_port_parse_of(dp, port);
636813 if (err)
637
- return err;
814
+ goto out_put_node;
638815 }
639816
640
- return 0;
817
+out_put_node:
818
+ of_node_put(ports);
819
+ return err;
641820 }
642821
643822 static int dsa_switch_parse_member_of(struct dsa_switch *ds,
....@@ -652,12 +831,24 @@
652831 return sz;
653832
654833 ds->index = m[1];
655
- if (ds->index >= DSA_MAX_SWITCHES)
656
- return -EINVAL;
657834
658835 ds->dst = dsa_tree_touch(m[0]);
659836 if (!ds->dst)
660837 return -ENOMEM;
838
+
839
+ return 0;
840
+}
841
+
842
+static int dsa_switch_touch_ports(struct dsa_switch *ds)
843
+{
844
+ struct dsa_port *dp;
845
+ int port;
846
+
847
+ for (port = 0; port < ds->num_ports; port++) {
848
+ dp = dsa_port_touch(ds, port);
849
+ if (!dp)
850
+ return -ENOMEM;
851
+ }
661852
662853 return 0;
663854 }
....@@ -667,6 +858,10 @@
667858 int err;
668859
669860 err = dsa_switch_parse_member_of(ds, dn);
861
+ if (err)
862
+ return err;
863
+
864
+ err = dsa_switch_touch_ports(ds);
670865 if (err)
671866 return err;
672867
....@@ -707,7 +902,7 @@
707902 for (i = 0; i < DSA_MAX_PORTS; i++) {
708903 name = cd->port_names[i];
709904 dev = cd->netdev[i];
710
- dp = &ds->ports[i];
905
+ dp = dsa_to_port(ds, i);
711906
712907 if (!name)
713908 continue;
....@@ -727,6 +922,8 @@
727922
728923 static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd)
729924 {
925
+ int err;
926
+
730927 ds->cd = cd;
731928
732929 /* We don't support interconnected switches nor multiple trees via
....@@ -737,70 +934,67 @@
737934 if (!ds->dst)
738935 return -ENOMEM;
739936
937
+ err = dsa_switch_touch_ports(ds);
938
+ if (err)
939
+ return err;
940
+
740941 return dsa_switch_parse_ports(ds, cd);
741942 }
742943
743
-static int dsa_switch_add(struct dsa_switch *ds)
944
+static void dsa_switch_release_ports(struct dsa_switch *ds)
744945 {
745946 struct dsa_switch_tree *dst = ds->dst;
947
+ struct dsa_port *dp, *next;
746948
747
- return dsa_tree_add_switch(dst, ds);
949
+ list_for_each_entry_safe(dp, next, &dst->ports, list) {
950
+ if (dp->ds != ds)
951
+ continue;
952
+ list_del(&dp->list);
953
+ kfree(dp);
954
+ }
748955 }
749956
750957 static int dsa_switch_probe(struct dsa_switch *ds)
751958 {
752
- struct dsa_chip_data *pdata = ds->dev->platform_data;
753
- struct device_node *np = ds->dev->of_node;
959
+ struct dsa_switch_tree *dst;
960
+ struct dsa_chip_data *pdata;
961
+ struct device_node *np;
754962 int err;
755963
756
- if (np)
964
+ if (!ds->dev)
965
+ return -ENODEV;
966
+
967
+ pdata = ds->dev->platform_data;
968
+ np = ds->dev->of_node;
969
+
970
+ if (!ds->num_ports)
971
+ return -EINVAL;
972
+
973
+ if (np) {
757974 err = dsa_switch_parse_of(ds, np);
758
- else if (pdata)
975
+ if (err)
976
+ dsa_switch_release_ports(ds);
977
+ } else if (pdata) {
759978 err = dsa_switch_parse(ds, pdata);
760
- else
979
+ if (err)
980
+ dsa_switch_release_ports(ds);
981
+ } else {
761982 err = -ENODEV;
983
+ }
762984
763985 if (err)
764986 return err;
765987
766
- return dsa_switch_add(ds);
767
-}
768
-
769
-struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n)
770
-{
771
- size_t size = sizeof(struct dsa_switch) + n * sizeof(struct dsa_port);
772
- struct dsa_switch *ds;
773
- int i;
774
-
775
- ds = devm_kzalloc(dev, size, GFP_KERNEL);
776
- if (!ds)
777
- return NULL;
778
-
779
- /* We avoid allocating memory outside dsa_switch
780
- * if it is not needed.
781
- */
782
- if (n <= sizeof(ds->_bitmap) * 8) {
783
- ds->bitmap = &ds->_bitmap;
784
- } else {
785
- ds->bitmap = devm_kcalloc(dev,
786
- BITS_TO_LONGS(n),
787
- sizeof(unsigned long),
788
- GFP_KERNEL);
789
- if (unlikely(!ds->bitmap))
790
- return NULL;
988
+ dst = ds->dst;
989
+ dsa_tree_get(dst);
990
+ err = dsa_tree_setup(dst);
991
+ if (err) {
992
+ dsa_switch_release_ports(ds);
993
+ dsa_tree_put(dst);
791994 }
792995
793
- ds->dev = dev;
794
- ds->num_ports = n;
795
-
796
- for (i = 0; i < ds->num_ports; ++i) {
797
- ds->ports[i].index = i;
798
- ds->ports[i].ds = ds;
799
- }
800
-
801
- return ds;
996
+ return err;
802997 }
803
-EXPORT_SYMBOL_GPL(dsa_switch_alloc);
804998
805999 int dsa_register_switch(struct dsa_switch *ds)
8061000 {
....@@ -818,9 +1012,10 @@
8181012 static void dsa_switch_remove(struct dsa_switch *ds)
8191013 {
8201014 struct dsa_switch_tree *dst = ds->dst;
821
- unsigned int index = ds->index;
8221015
823
- dsa_tree_remove_switch(dst, index);
1016
+ dsa_tree_teardown(dst);
1017
+ dsa_switch_release_ports(ds);
1018
+ dsa_tree_put(dst);
8241019 }
8251020
8261021 void dsa_unregister_switch(struct dsa_switch *ds)