Merge tag 'driver-core-5.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / net / dsa / dsa2.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * net/dsa/dsa2.c - Hardware switch handling, binding version 2
4  * Copyright (c) 2008-2009 Marvell Semiconductor
5  * Copyright (c) 2013 Florian Fainelli <florian@openwrt.org>
6  * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
7  */
8
9 #include <linux/device.h>
10 #include <linux/err.h>
11 #include <linux/list.h>
12 #include <linux/netdevice.h>
13 #include <linux/slab.h>
14 #include <linux/rtnetlink.h>
15 #include <linux/of.h>
16 #include <linux/of_net.h>
17 #include <net/devlink.h>
18
19 #include "dsa_priv.h"
20
21 static DEFINE_MUTEX(dsa2_mutex);
22 LIST_HEAD(dsa_tree_list);
23
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);
44
45 static struct dsa_switch_tree *dsa_tree_find(int index)
46 {
47         struct dsa_switch_tree *dst;
48
49         list_for_each_entry(dst, &dsa_tree_list, list)
50                 if (dst->index == index)
51                         return dst;
52
53         return NULL;
54 }
55
56 static struct dsa_switch_tree *dsa_tree_alloc(int index)
57 {
58         struct dsa_switch_tree *dst;
59
60         dst = kzalloc(sizeof(*dst), GFP_KERNEL);
61         if (!dst)
62                 return NULL;
63
64         dst->index = index;
65
66         INIT_LIST_HEAD(&dst->rtable);
67
68         INIT_LIST_HEAD(&dst->ports);
69
70         INIT_LIST_HEAD(&dst->list);
71         list_add_tail(&dst->list, &dsa_tree_list);
72
73         kref_init(&dst->refcount);
74
75         return dst;
76 }
77
78 static void dsa_tree_free(struct dsa_switch_tree *dst)
79 {
80         list_del(&dst->list);
81         kfree(dst);
82 }
83
84 static struct dsa_switch_tree *dsa_tree_get(struct dsa_switch_tree *dst)
85 {
86         if (dst)
87                 kref_get(&dst->refcount);
88
89         return dst;
90 }
91
92 static struct dsa_switch_tree *dsa_tree_touch(int index)
93 {
94         struct dsa_switch_tree *dst;
95
96         dst = dsa_tree_find(index);
97         if (dst)
98                 return dsa_tree_get(dst);
99         else
100                 return dsa_tree_alloc(index);
101 }
102
103 static void dsa_tree_release(struct kref *ref)
104 {
105         struct dsa_switch_tree *dst;
106
107         dst = container_of(ref, struct dsa_switch_tree, refcount);
108
109         dsa_tree_free(dst);
110 }
111
112 static void dsa_tree_put(struct dsa_switch_tree *dst)
113 {
114         if (dst)
115                 kref_put(&dst->refcount, dsa_tree_release);
116 }
117
118 static bool dsa_port_is_dsa(struct dsa_port *port)
119 {
120         return port->type == DSA_PORT_TYPE_DSA;
121 }
122
123 static bool dsa_port_is_cpu(struct dsa_port *port)
124 {
125         return port->type == DSA_PORT_TYPE_CPU;
126 }
127
128 static bool dsa_port_is_user(struct dsa_port *dp)
129 {
130         return dp->type == DSA_PORT_TYPE_USER;
131 }
132
133 static struct dsa_port *dsa_tree_find_port_by_node(struct dsa_switch_tree *dst,
134                                                    struct device_node *dn)
135 {
136         struct dsa_port *dp;
137
138         list_for_each_entry(dp, &dst->ports, list)
139                 if (dp->dn == dn)
140                         return dp;
141
142         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;
169 }
170
171 static bool dsa_port_setup_routing_table(struct dsa_port *dp)
172 {
173         struct dsa_switch *ds = dp->ds;
174         struct dsa_switch_tree *dst = ds->dst;
175         struct device_node *dn = dp->dn;
176         struct of_phandle_iterator it;
177         struct dsa_port *link_dp;
178         struct dsa_link *dl;
179         int err;
180
181         of_for_each_phandle(&it, err, dn, "link", NULL, 0) {
182                 link_dp = dsa_tree_find_port_by_node(dst, it.node);
183                 if (!link_dp) {
184                         of_node_put(it.node);
185                         return false;
186                 }
187
188                 dl = dsa_link_touch(dp, link_dp);
189                 if (!dl) {
190                         of_node_put(it.node);
191                         return false;
192                 }
193         }
194
195         return true;
196 }
197
198 static bool dsa_tree_setup_routing_table(struct dsa_switch_tree *dst)
199 {
200         bool complete = true;
201         struct dsa_port *dp;
202
203         list_for_each_entry(dp, &dst->ports, list) {
204                 if (dsa_port_is_dsa(dp)) {
205                         complete = dsa_port_setup_routing_table(dp);
206                         if (!complete)
207                                 break;
208                 }
209         }
210
211         return complete;
212 }
213
214 static struct dsa_port *dsa_tree_find_first_cpu(struct dsa_switch_tree *dst)
215 {
216         struct dsa_port *dp;
217
218         list_for_each_entry(dp, &dst->ports, list)
219                 if (dsa_port_is_cpu(dp))
220                         return dp;
221
222         return NULL;
223 }
224
225 static int dsa_tree_setup_default_cpu(struct dsa_switch_tree *dst)
226 {
227         struct dsa_port *cpu_dp, *dp;
228
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);
232                 return -EINVAL;
233         }
234
235         /* Assign the default CPU port to all ports of the fabric */
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;
239
240         return 0;
241 }
242
243 static void dsa_tree_teardown_default_cpu(struct dsa_switch_tree *dst)
244 {
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;
250 }
251
252 static int dsa_port_setup(struct dsa_port *dp)
253 {
254         struct devlink_port *dlp = &dp->devlink_port;
255         bool dsa_port_link_registered = false;
256         bool dsa_port_enabled = false;
257         int err = 0;
258
259         if (dp->setup)
260                 return 0;
261
262         switch (dp->type) {
263         case DSA_PORT_TYPE_UNUSED:
264                 dsa_port_disable(dp);
265                 break;
266         case DSA_PORT_TYPE_CPU:
267                 err = dsa_port_link_register_of(dp);
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
277                 break;
278         case DSA_PORT_TYPE_DSA:
279                 err = dsa_port_link_register_of(dp);
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
289                 break;
290         case DSA_PORT_TYPE_USER:
291                 dp->mac = of_get_mac_address(dp->dn);
292                 err = dsa_slave_create(dp);
293                 if (err)
294                         break;
295
296                 devlink_port_type_eth_set(dlp, dp->slave);
297                 break;
298         }
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;
308
309         return 0;
310 }
311
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
354 static void dsa_port_teardown(struct dsa_port *dp)
355 {
356         struct devlink_port *dlp = &dp->devlink_port;
357
358         if (!dp->setup)
359                 return;
360
361         devlink_port_type_clear(dlp);
362
363         switch (dp->type) {
364         case DSA_PORT_TYPE_UNUSED:
365                 break;
366         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;
371         case DSA_PORT_TYPE_DSA:
372                 dsa_port_disable(dp);
373                 dsa_port_link_unregister_of(dp);
374                 break;
375         case DSA_PORT_TYPE_USER:
376                 if (dp->slave) {
377                         dsa_slave_destroy(dp->slave);
378                         dp->slave = NULL;
379                 }
380                 break;
381         }
382
383         dp->setup = false;
384 }
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 };
410
411 static int dsa_switch_setup(struct dsa_switch *ds)
412 {
413         struct dsa_devlink_priv *dl_priv;
414         struct dsa_port *dp;
415         int err;
416
417         if (ds->setup)
418                 return 0;
419
420         /* Initialize ds->phys_mii_mask before registering the slave MDIO bus
421          * driver and before ops->setup() has run, since the switch drivers and
422          * the slave MDIO bus driver rely on these values for probing PHY
423          * devices or not
424          */
425         ds->phys_mii_mask |= dsa_user_ports(ds);
426
427         /* Add the switch to devlink before calling setup, so that setup can
428          * add dpipe tables
429          */
430         ds->devlink = devlink_alloc(&dsa_devlink_ops, sizeof(*dl_priv));
431         if (!ds->devlink)
432                 return -ENOMEM;
433         dl_priv = devlink_priv(ds->devlink);
434         dl_priv->ds = ds;
435
436         err = devlink_register(ds->devlink, ds->dev);
437         if (err)
438                 goto free_devlink;
439
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         }
450
451         err = dsa_switch_register_notifier(ds);
452         if (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);
460
461         if (!ds->slave_mii_bus && ds->ops->phy_read) {
462                 ds->slave_mii_bus = devm_mdiobus_alloc(ds->dev);
463                 if (!ds->slave_mii_bus) {
464                         err = -ENOMEM;
465                         goto unregister_notifier;
466                 }
467
468                 dsa_slave_mii_bus_init(ds);
469
470                 err = mdiobus_register(ds->slave_mii_bus);
471                 if (err < 0)
472                         goto unregister_notifier;
473         }
474
475         ds->setup = true;
476
477         return 0;
478
479 unregister_notifier:
480         dsa_switch_unregister_notifier(ds);
481 unregister_devlink_ports:
482         list_for_each_entry(dp, &ds->dst->ports, list)
483                 if (dp->ds == ds)
484                         dsa_port_devlink_teardown(dp);
485         devlink_unregister(ds->devlink);
486 free_devlink:
487         devlink_free(ds->devlink);
488         ds->devlink = NULL;
489
490         return err;
491 }
492
493 static void dsa_switch_teardown(struct dsa_switch *ds)
494 {
495         struct dsa_port *dp;
496
497         if (!ds->setup)
498                 return;
499
500         if (ds->slave_mii_bus && ds->ops->phy_read)
501                 mdiobus_unregister(ds->slave_mii_bus);
502
503         dsa_switch_unregister_notifier(ds);
504
505         if (ds->ops->teardown)
506                 ds->ops->teardown(ds);
507
508         if (ds->devlink) {
509                 list_for_each_entry(dp, &ds->dst->ports, list)
510                         if (dp->ds == ds)
511                                 dsa_port_devlink_teardown(dp);
512                 devlink_unregister(ds->devlink);
513                 devlink_free(ds->devlink);
514                 ds->devlink = NULL;
515         }
516
517         ds->setup = false;
518 }
519
520 static int dsa_tree_setup_switches(struct dsa_switch_tree *dst)
521 {
522         struct dsa_port *dp;
523         int err;
524
525         list_for_each_entry(dp, &dst->ports, list) {
526                 err = dsa_switch_setup(dp->ds);
527                 if (err)
528                         goto teardown;
529         }
530
531         list_for_each_entry(dp, &dst->ports, list) {
532                 err = dsa_port_setup(dp);
533                 if (err)
534                         continue;
535         }
536
537         return 0;
538
539 teardown:
540         list_for_each_entry(dp, &dst->ports, list)
541                 dsa_port_teardown(dp);
542
543         list_for_each_entry(dp, &dst->ports, list)
544                 dsa_switch_teardown(dp->ds);
545
546         return err;
547 }
548
549 static void dsa_tree_teardown_switches(struct dsa_switch_tree *dst)
550 {
551         struct dsa_port *dp;
552
553         list_for_each_entry(dp, &dst->ports, list)
554                 dsa_port_teardown(dp);
555
556         list_for_each_entry(dp, &dst->ports, list)
557                 dsa_switch_teardown(dp->ds);
558 }
559
560 static int dsa_tree_setup_master(struct dsa_switch_tree *dst)
561 {
562         struct dsa_port *dp;
563         int err;
564
565         list_for_each_entry(dp, &dst->ports, list) {
566                 if (dsa_port_is_cpu(dp)) {
567                         err = dsa_master_setup(dp->master, dp);
568                         if (err)
569                                 return err;
570                 }
571         }
572
573         return 0;
574 }
575
576 static void dsa_tree_teardown_master(struct dsa_switch_tree *dst)
577 {
578         struct dsa_port *dp;
579
580         list_for_each_entry(dp, &dst->ports, list)
581                 if (dsa_port_is_cpu(dp))
582                         dsa_master_teardown(dp->master);
583 }
584
585 static int dsa_tree_setup(struct dsa_switch_tree *dst)
586 {
587         bool complete;
588         int err;
589
590         if (dst->setup) {
591                 pr_err("DSA: tree %d already setup! Disjoint trees?\n",
592                        dst->index);
593                 return -EEXIST;
594         }
595
596         complete = dsa_tree_setup_routing_table(dst);
597         if (!complete)
598                 return 0;
599
600         err = dsa_tree_setup_default_cpu(dst);
601         if (err)
602                 return err;
603
604         err = dsa_tree_setup_switches(dst);
605         if (err)
606                 goto teardown_default_cpu;
607
608         err = dsa_tree_setup_master(dst);
609         if (err)
610                 goto teardown_switches;
611
612         dst->setup = true;
613
614         pr_info("DSA: tree %d setup\n", dst->index);
615
616         return 0;
617
618 teardown_switches:
619         dsa_tree_teardown_switches(dst);
620 teardown_default_cpu:
621         dsa_tree_teardown_default_cpu(dst);
622
623         return err;
624 }
625
626 static void dsa_tree_teardown(struct dsa_switch_tree *dst)
627 {
628         struct dsa_link *dl, *next;
629
630         if (!dst->setup)
631                 return;
632
633         dsa_tree_teardown_master(dst);
634
635         dsa_tree_teardown_switches(dst);
636
637         dsa_tree_teardown_default_cpu(dst);
638
639         list_for_each_entry_safe(dl, next, &dst->rtable, list) {
640                 list_del(&dl->list);
641                 kfree(dl);
642         }
643
644         pr_info("DSA: tree %d torn down\n", dst->index);
645
646         dst->setup = false;
647 }
648
649 static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index)
650 {
651         struct dsa_switch_tree *dst = ds->dst;
652         struct dsa_port *dp;
653
654         list_for_each_entry(dp, &dst->ports, list)
655                 if (dp->ds == ds && dp->index == index)
656                         return dp;
657
658         dp = kzalloc(sizeof(*dp), GFP_KERNEL);
659         if (!dp)
660                 return NULL;
661
662         dp->ds = ds;
663         dp->index = index;
664
665         INIT_LIST_HEAD(&dp->list);
666         list_add_tail(&dp->list, &dst->ports);
667
668         return dp;
669 }
670
671 static int dsa_port_parse_user(struct dsa_port *dp, const char *name)
672 {
673         if (!name)
674                 name = "eth%d";
675
676         dp->type = DSA_PORT_TYPE_USER;
677         dp->name = name;
678
679         return 0;
680 }
681
682 static int dsa_port_parse_dsa(struct dsa_port *dp)
683 {
684         dp->type = DSA_PORT_TYPE_DSA;
685
686         return 0;
687 }
688
689 static enum dsa_tag_protocol dsa_get_tag_protocol(struct dsa_port *dp,
690                                                   struct net_device *master)
691 {
692         enum dsa_tag_protocol tag_protocol = DSA_TAG_PROTO_NONE;
693         struct dsa_switch *mds, *ds = dp->ds;
694         unsigned int mdp_upstream;
695         struct dsa_port *mdp;
696
697         /* It is possible to stack DSA switches onto one another when that
698          * happens the switch driver may want to know if its tagging protocol
699          * is going to work in such a configuration.
700          */
701         if (dsa_slave_dev_check(master)) {
702                 mdp = dsa_slave_to_port(master);
703                 mds = mdp->ds;
704                 mdp_upstream = dsa_upstream_port(mds, mdp->index);
705                 tag_protocol = mds->ops->get_tag_protocol(mds, mdp_upstream,
706                                                           DSA_TAG_PROTO_NONE);
707         }
708
709         /* If the master device is not itself a DSA slave in a disjoint DSA
710          * tree, then return immediately.
711          */
712         return ds->ops->get_tag_protocol(ds, dp->index, tag_protocol);
713 }
714
715 static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master)
716 {
717         struct dsa_switch *ds = dp->ds;
718         struct dsa_switch_tree *dst = ds->dst;
719         const struct dsa_device_ops *tag_ops;
720         enum dsa_tag_protocol tag_protocol;
721
722         tag_protocol = dsa_get_tag_protocol(dp, master);
723         tag_ops = dsa_tag_driver_get(tag_protocol);
724         if (IS_ERR(tag_ops)) {
725                 if (PTR_ERR(tag_ops) == -ENOPROTOOPT)
726                         return -EPROBE_DEFER;
727                 dev_warn(ds->dev, "No tagger for this switch\n");
728                 dp->master = NULL;
729                 return PTR_ERR(tag_ops);
730         }
731
732         dp->master = master;
733         dp->type = DSA_PORT_TYPE_CPU;
734         dp->filter = tag_ops->filter;
735         dp->rcv = tag_ops->rcv;
736         dp->tag_ops = tag_ops;
737         dp->dst = dst;
738
739         return 0;
740 }
741
742 static int dsa_port_parse_of(struct dsa_port *dp, struct device_node *dn)
743 {
744         struct device_node *ethernet = of_parse_phandle(dn, "ethernet", 0);
745         const char *name = of_get_property(dn, "label", NULL);
746         bool link = of_property_read_bool(dn, "link");
747
748         dp->dn = dn;
749
750         if (ethernet) {
751                 struct net_device *master;
752
753                 master = of_find_net_device_by_node(ethernet);
754                 if (!master)
755                         return -EPROBE_DEFER;
756
757                 return dsa_port_parse_cpu(dp, master);
758         }
759
760         if (link)
761                 return dsa_port_parse_dsa(dp);
762
763         return dsa_port_parse_user(dp, name);
764 }
765
766 static int dsa_switch_parse_ports_of(struct dsa_switch *ds,
767                                      struct device_node *dn)
768 {
769         struct device_node *ports, *port;
770         struct dsa_port *dp;
771         int err = 0;
772         u32 reg;
773
774         ports = of_get_child_by_name(dn, "ports");
775         if (!ports) {
776                 /* The second possibility is "ethernet-ports" */
777                 ports = of_get_child_by_name(dn, "ethernet-ports");
778                 if (!ports) {
779                         dev_err(ds->dev, "no ports child node found\n");
780                         return -EINVAL;
781                 }
782         }
783
784         for_each_available_child_of_node(ports, port) {
785                 err = of_property_read_u32(port, "reg", &reg);
786                 if (err)
787                         goto out_put_node;
788
789                 if (reg >= ds->num_ports) {
790                         err = -EINVAL;
791                         goto out_put_node;
792                 }
793
794                 dp = dsa_to_port(ds, reg);
795
796                 err = dsa_port_parse_of(dp, port);
797                 if (err)
798                         goto out_put_node;
799         }
800
801 out_put_node:
802         of_node_put(ports);
803         return err;
804 }
805
806 static int dsa_switch_parse_member_of(struct dsa_switch *ds,
807                                       struct device_node *dn)
808 {
809         u32 m[2] = { 0, 0 };
810         int sz;
811
812         /* Don't error out if this optional property isn't found */
813         sz = of_property_read_variable_u32_array(dn, "dsa,member", m, 2, 2);
814         if (sz < 0 && sz != -EINVAL)
815                 return sz;
816
817         ds->index = m[1];
818
819         ds->dst = dsa_tree_touch(m[0]);
820         if (!ds->dst)
821                 return -ENOMEM;
822
823         return 0;
824 }
825
826 static int dsa_switch_touch_ports(struct dsa_switch *ds)
827 {
828         struct dsa_port *dp;
829         int port;
830
831         for (port = 0; port < ds->num_ports; port++) {
832                 dp = dsa_port_touch(ds, port);
833                 if (!dp)
834                         return -ENOMEM;
835         }
836
837         return 0;
838 }
839
840 static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn)
841 {
842         int err;
843
844         err = dsa_switch_parse_member_of(ds, dn);
845         if (err)
846                 return err;
847
848         err = dsa_switch_touch_ports(ds);
849         if (err)
850                 return err;
851
852         return dsa_switch_parse_ports_of(ds, dn);
853 }
854
855 static int dsa_port_parse(struct dsa_port *dp, const char *name,
856                           struct device *dev)
857 {
858         if (!strcmp(name, "cpu")) {
859                 struct net_device *master;
860
861                 master = dsa_dev_to_net_device(dev);
862                 if (!master)
863                         return -EPROBE_DEFER;
864
865                 dev_put(master);
866
867                 return dsa_port_parse_cpu(dp, master);
868         }
869
870         if (!strcmp(name, "dsa"))
871                 return dsa_port_parse_dsa(dp);
872
873         return dsa_port_parse_user(dp, name);
874 }
875
876 static int dsa_switch_parse_ports(struct dsa_switch *ds,
877                                   struct dsa_chip_data *cd)
878 {
879         bool valid_name_found = false;
880         struct dsa_port *dp;
881         struct device *dev;
882         const char *name;
883         unsigned int i;
884         int err;
885
886         for (i = 0; i < DSA_MAX_PORTS; i++) {
887                 name = cd->port_names[i];
888                 dev = cd->netdev[i];
889                 dp = dsa_to_port(ds, i);
890
891                 if (!name)
892                         continue;
893
894                 err = dsa_port_parse(dp, name, dev);
895                 if (err)
896                         return err;
897
898                 valid_name_found = true;
899         }
900
901         if (!valid_name_found && i == DSA_MAX_PORTS)
902                 return -EINVAL;
903
904         return 0;
905 }
906
907 static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd)
908 {
909         int err;
910
911         ds->cd = cd;
912
913         /* We don't support interconnected switches nor multiple trees via
914          * platform data, so this is the unique switch of the tree.
915          */
916         ds->index = 0;
917         ds->dst = dsa_tree_touch(0);
918         if (!ds->dst)
919                 return -ENOMEM;
920
921         err = dsa_switch_touch_ports(ds);
922         if (err)
923                 return err;
924
925         return dsa_switch_parse_ports(ds, cd);
926 }
927
928 static void dsa_switch_release_ports(struct dsa_switch *ds)
929 {
930         struct dsa_switch_tree *dst = ds->dst;
931         struct dsa_port *dp, *next;
932
933         list_for_each_entry_safe(dp, next, &dst->ports, list) {
934                 if (dp->ds != ds)
935                         continue;
936                 list_del(&dp->list);
937                 kfree(dp);
938         }
939 }
940
941 static int dsa_switch_probe(struct dsa_switch *ds)
942 {
943         struct dsa_switch_tree *dst;
944         struct dsa_chip_data *pdata;
945         struct device_node *np;
946         int err;
947
948         if (!ds->dev)
949                 return -ENODEV;
950
951         pdata = ds->dev->platform_data;
952         np = ds->dev->of_node;
953
954         if (!ds->num_ports)
955                 return -EINVAL;
956
957         if (np) {
958                 err = dsa_switch_parse_of(ds, np);
959                 if (err)
960                         dsa_switch_release_ports(ds);
961         } else if (pdata) {
962                 err = dsa_switch_parse(ds, pdata);
963                 if (err)
964                         dsa_switch_release_ports(ds);
965         } else {
966                 err = -ENODEV;
967         }
968
969         if (err)
970                 return err;
971
972         dst = ds->dst;
973         dsa_tree_get(dst);
974         err = dsa_tree_setup(dst);
975         if (err) {
976                 dsa_switch_release_ports(ds);
977                 dsa_tree_put(dst);
978         }
979
980         return err;
981 }
982
983 int dsa_register_switch(struct dsa_switch *ds)
984 {
985         int err;
986
987         mutex_lock(&dsa2_mutex);
988         err = dsa_switch_probe(ds);
989         dsa_tree_put(ds->dst);
990         mutex_unlock(&dsa2_mutex);
991
992         return err;
993 }
994 EXPORT_SYMBOL_GPL(dsa_register_switch);
995
996 static void dsa_switch_remove(struct dsa_switch *ds)
997 {
998         struct dsa_switch_tree *dst = ds->dst;
999
1000         dsa_tree_teardown(dst);
1001         dsa_switch_release_ports(ds);
1002         dsa_tree_put(dst);
1003 }
1004
1005 void dsa_unregister_switch(struct dsa_switch *ds)
1006 {
1007         mutex_lock(&dsa2_mutex);
1008         dsa_switch_remove(ds);
1009         mutex_unlock(&dsa2_mutex);
1010 }
1011 EXPORT_SYMBOL_GPL(dsa_unregister_switch);