Lines Matching refs:ds
114 struct dsa_switch *ds; in dsa_tree_find_port_by_node() local
119 ds = dst->ds[device]; in dsa_tree_find_port_by_node()
120 if (!ds) in dsa_tree_find_port_by_node()
123 for (port = 0; port < ds->num_ports; port++) { in dsa_tree_find_port_by_node()
124 dp = &ds->ports[port]; in dsa_tree_find_port_by_node()
136 struct dsa_switch *ds = dp->ds; in dsa_port_setup_routing_table() local
137 struct dsa_switch_tree *dst = ds->dst; in dsa_port_setup_routing_table()
150 ds->rtable[link_dp->ds->index] = dp->index; in dsa_port_setup_routing_table()
156 static bool dsa_switch_setup_routing_table(struct dsa_switch *ds) in dsa_switch_setup_routing_table() argument
163 ds->rtable[i] = DSA_RTABLE_NONE; in dsa_switch_setup_routing_table()
165 for (i = 0; i < ds->num_ports; i++) { in dsa_switch_setup_routing_table()
166 dp = &ds->ports[i]; in dsa_switch_setup_routing_table()
180 struct dsa_switch *ds; in dsa_tree_setup_routing_table() local
185 ds = dst->ds[device]; in dsa_tree_setup_routing_table()
186 if (!ds) in dsa_tree_setup_routing_table()
189 complete = dsa_switch_setup_routing_table(ds); in dsa_tree_setup_routing_table()
199 struct dsa_switch *ds; in dsa_tree_find_first_cpu() local
204 ds = dst->ds[device]; in dsa_tree_find_first_cpu()
205 if (!ds) in dsa_tree_find_first_cpu()
208 for (port = 0; port < ds->num_ports; port++) { in dsa_tree_find_first_cpu()
209 dp = &ds->ports[port]; in dsa_tree_find_first_cpu()
221 struct dsa_switch *ds; in dsa_tree_setup_default_cpu() local
234 ds = dst->ds[device]; in dsa_tree_setup_default_cpu()
235 if (!ds) in dsa_tree_setup_default_cpu()
238 for (port = 0; port < ds->num_ports; port++) { in dsa_tree_setup_default_cpu()
239 dp = &ds->ports[port]; in dsa_tree_setup_default_cpu()
257 struct dsa_switch *ds = dp->ds; in dsa_port_setup() local
258 struct dsa_switch_tree *dst = ds->dst; in dsa_port_setup()
264 struct devlink *dl = ds->devlink; in dsa_port_setup()
368 static int dsa_switch_setup(struct dsa_switch *ds) in dsa_switch_setup() argument
377 ds->phys_mii_mask |= dsa_user_ports(ds); in dsa_switch_setup()
382 ds->devlink = devlink_alloc(&dsa_devlink_ops, 0); in dsa_switch_setup()
383 if (!ds->devlink) in dsa_switch_setup()
386 err = devlink_register(ds->devlink, ds->dev); in dsa_switch_setup()
390 err = dsa_switch_register_notifier(ds); in dsa_switch_setup()
394 err = ds->ops->setup(ds); in dsa_switch_setup()
398 if (!ds->slave_mii_bus && ds->ops->phy_read) { in dsa_switch_setup()
399 ds->slave_mii_bus = devm_mdiobus_alloc(ds->dev); in dsa_switch_setup()
400 if (!ds->slave_mii_bus) { in dsa_switch_setup()
405 dsa_slave_mii_bus_init(ds); in dsa_switch_setup()
407 err = mdiobus_register(ds->slave_mii_bus); in dsa_switch_setup()
415 dsa_switch_unregister_notifier(ds); in dsa_switch_setup()
417 devlink_unregister(ds->devlink); in dsa_switch_setup()
419 devlink_free(ds->devlink); in dsa_switch_setup()
420 ds->devlink = NULL; in dsa_switch_setup()
425 static void dsa_switch_teardown(struct dsa_switch *ds) in dsa_switch_teardown() argument
427 if (ds->slave_mii_bus && ds->ops->phy_read) in dsa_switch_teardown()
428 mdiobus_unregister(ds->slave_mii_bus); in dsa_switch_teardown()
430 dsa_switch_unregister_notifier(ds); in dsa_switch_teardown()
432 if (ds->ops->teardown) in dsa_switch_teardown()
433 ds->ops->teardown(ds); in dsa_switch_teardown()
435 if (ds->devlink) { in dsa_switch_teardown()
436 devlink_unregister(ds->devlink); in dsa_switch_teardown()
437 devlink_free(ds->devlink); in dsa_switch_teardown()
438 ds->devlink = NULL; in dsa_switch_teardown()
445 struct dsa_switch *ds; in dsa_tree_setup_switches() local
451 ds = dst->ds[device]; in dsa_tree_setup_switches()
452 if (!ds) in dsa_tree_setup_switches()
455 err = dsa_switch_setup(ds); in dsa_tree_setup_switches()
459 for (port = 0; port < ds->num_ports; port++) { in dsa_tree_setup_switches()
460 dp = &ds->ports[port]; in dsa_tree_setup_switches()
472 dsa_port_teardown(&ds->ports[i]); in dsa_tree_setup_switches()
474 dsa_switch_teardown(ds); in dsa_tree_setup_switches()
478 ds = dst->ds[i]; in dsa_tree_setup_switches()
479 if (!ds) in dsa_tree_setup_switches()
482 for (port = 0; port < ds->num_ports; port++) { in dsa_tree_setup_switches()
483 dp = &ds->ports[port]; in dsa_tree_setup_switches()
488 dsa_switch_teardown(ds); in dsa_tree_setup_switches()
496 struct dsa_switch *ds; in dsa_tree_teardown_switches() local
501 ds = dst->ds[device]; in dsa_tree_teardown_switches()
502 if (!ds) in dsa_tree_teardown_switches()
505 for (port = 0; port < ds->num_ports; port++) { in dsa_tree_teardown_switches()
506 dp = &ds->ports[port]; in dsa_tree_teardown_switches()
511 dsa_switch_teardown(ds); in dsa_tree_teardown_switches()
594 dst->ds[index] = NULL; in dsa_tree_remove_switch()
599 struct dsa_switch *ds) in dsa_tree_add_switch() argument
601 unsigned int index = ds->index; in dsa_tree_add_switch()
604 if (dst->ds[index]) in dsa_tree_add_switch()
608 dst->ds[index] = ds; in dsa_tree_add_switch()
612 dst->ds[index] = NULL; in dsa_tree_add_switch()
639 struct dsa_switch *ds = dp->ds; in dsa_port_parse_cpu() local
640 struct dsa_switch_tree *dst = ds->dst; in dsa_port_parse_cpu()
644 tag_protocol = ds->ops->get_tag_protocol(ds, dp->index); in dsa_port_parse_cpu()
649 dev_warn(ds->dev, "No tagger for this switch\n"); in dsa_port_parse_cpu()
687 static int dsa_switch_parse_ports_of(struct dsa_switch *ds, in dsa_switch_parse_ports_of() argument
697 dev_err(ds->dev, "no ports child node found\n"); in dsa_switch_parse_ports_of()
706 if (reg >= ds->num_ports) { in dsa_switch_parse_ports_of()
711 dp = &ds->ports[reg]; in dsa_switch_parse_ports_of()
723 static int dsa_switch_parse_member_of(struct dsa_switch *ds, in dsa_switch_parse_member_of() argument
734 ds->index = m[1]; in dsa_switch_parse_member_of()
735 if (ds->index >= DSA_MAX_SWITCHES) in dsa_switch_parse_member_of()
738 ds->dst = dsa_tree_touch(m[0]); in dsa_switch_parse_member_of()
739 if (!ds->dst) in dsa_switch_parse_member_of()
745 static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) in dsa_switch_parse_of() argument
749 err = dsa_switch_parse_member_of(ds, dn); in dsa_switch_parse_of()
753 return dsa_switch_parse_ports_of(ds, dn); in dsa_switch_parse_of()
777 static int dsa_switch_parse_ports(struct dsa_switch *ds, in dsa_switch_parse_ports() argument
790 dp = &ds->ports[i]; in dsa_switch_parse_ports()
808 static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd) in dsa_switch_parse() argument
810 ds->cd = cd; in dsa_switch_parse()
815 ds->index = 0; in dsa_switch_parse()
816 ds->dst = dsa_tree_touch(0); in dsa_switch_parse()
817 if (!ds->dst) in dsa_switch_parse()
820 return dsa_switch_parse_ports(ds, cd); in dsa_switch_parse()
823 static int dsa_switch_add(struct dsa_switch *ds) in dsa_switch_add() argument
825 struct dsa_switch_tree *dst = ds->dst; in dsa_switch_add()
827 return dsa_tree_add_switch(dst, ds); in dsa_switch_add()
830 static int dsa_switch_probe(struct dsa_switch *ds) in dsa_switch_probe() argument
832 struct dsa_chip_data *pdata = ds->dev->platform_data; in dsa_switch_probe()
833 struct device_node *np = ds->dev->of_node; in dsa_switch_probe()
837 err = dsa_switch_parse_of(ds, np); in dsa_switch_probe()
839 err = dsa_switch_parse(ds, pdata); in dsa_switch_probe()
846 return dsa_switch_add(ds); in dsa_switch_probe()
851 struct dsa_switch *ds; in dsa_switch_alloc() local
854 ds = devm_kzalloc(dev, struct_size(ds, ports, n), GFP_KERNEL); in dsa_switch_alloc()
855 if (!ds) in dsa_switch_alloc()
858 ds->dev = dev; in dsa_switch_alloc()
859 ds->num_ports = n; in dsa_switch_alloc()
861 for (i = 0; i < ds->num_ports; ++i) { in dsa_switch_alloc()
862 ds->ports[i].index = i; in dsa_switch_alloc()
863 ds->ports[i].ds = ds; in dsa_switch_alloc()
866 return ds; in dsa_switch_alloc()
870 int dsa_register_switch(struct dsa_switch *ds) in dsa_register_switch() argument
875 err = dsa_switch_probe(ds); in dsa_register_switch()
876 dsa_tree_put(ds->dst); in dsa_register_switch()
883 static void dsa_switch_remove(struct dsa_switch *ds) in dsa_switch_remove() argument
885 struct dsa_switch_tree *dst = ds->dst; in dsa_switch_remove()
886 unsigned int index = ds->index; in dsa_switch_remove()
891 void dsa_unregister_switch(struct dsa_switch *ds) in dsa_unregister_switch() argument
894 dsa_switch_remove(ds); in dsa_unregister_switch()