Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.17-rc6 790 lines 16 kB view raw
1/* 2 * net/dsa/dsa2.c - Hardware switch handling, binding version 2 3 * Copyright (c) 2008-2009 Marvell Semiconductor 4 * Copyright (c) 2013 Florian Fainelli <florian@openwrt.org> 5 * 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. 11 */ 12 13#include <linux/device.h> 14#include <linux/err.h> 15#include <linux/list.h> 16#include <linux/netdevice.h> 17#include <linux/slab.h> 18#include <linux/rtnetlink.h> 19#include <linux/of.h> 20#include <linux/of_net.h> 21 22#include "dsa_priv.h" 23 24static LIST_HEAD(dsa_tree_list); 25static DEFINE_MUTEX(dsa2_mutex); 26 27static const struct devlink_ops dsa_devlink_ops = { 28}; 29 30static struct dsa_switch_tree *dsa_tree_find(int index) 31{ 32 struct dsa_switch_tree *dst; 33 34 list_for_each_entry(dst, &dsa_tree_list, list) 35 if (dst->index == index) 36 return dst; 37 38 return NULL; 39} 40 41static struct dsa_switch_tree *dsa_tree_alloc(int index) 42{ 43 struct dsa_switch_tree *dst; 44 45 dst = kzalloc(sizeof(*dst), GFP_KERNEL); 46 if (!dst) 47 return NULL; 48 49 dst->index = index; 50 51 INIT_LIST_HEAD(&dst->list); 52 list_add_tail(&dsa_tree_list, &dst->list); 53 54 kref_init(&dst->refcount); 55 56 return dst; 57} 58 59static void dsa_tree_free(struct dsa_switch_tree *dst) 60{ 61 list_del(&dst->list); 62 kfree(dst); 63} 64 65static struct dsa_switch_tree *dsa_tree_get(struct dsa_switch_tree *dst) 66{ 67 if (dst) 68 kref_get(&dst->refcount); 69 70 return dst; 71} 72 73static struct dsa_switch_tree *dsa_tree_touch(int index) 74{ 75 struct dsa_switch_tree *dst; 76 77 dst = dsa_tree_find(index); 78 if (dst) 79 return dsa_tree_get(dst); 80 else 81 return dsa_tree_alloc(index); 82} 83 84static void dsa_tree_release(struct kref *ref) 85{ 86 struct dsa_switch_tree *dst; 87 88 dst = container_of(ref, struct dsa_switch_tree, refcount); 89 90 dsa_tree_free(dst); 91} 92 93static void dsa_tree_put(struct dsa_switch_tree *dst) 94{ 95 if (dst) 96 kref_put(&dst->refcount, dsa_tree_release); 97} 98 99static bool dsa_port_is_dsa(struct dsa_port *port) 100{ 101 return port->type == DSA_PORT_TYPE_DSA; 102} 103 104static bool dsa_port_is_cpu(struct dsa_port *port) 105{ 106 return port->type == DSA_PORT_TYPE_CPU; 107} 108 109static bool dsa_port_is_user(struct dsa_port *dp) 110{ 111 return dp->type == DSA_PORT_TYPE_USER; 112} 113 114static struct dsa_port *dsa_tree_find_port_by_node(struct dsa_switch_tree *dst, 115 struct device_node *dn) 116{ 117 struct dsa_switch *ds; 118 struct dsa_port *dp; 119 int device, port; 120 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 } 133 134 return NULL; 135} 136 137static bool dsa_port_setup_routing_table(struct dsa_port *dp) 138{ 139 struct dsa_switch *ds = dp->ds; 140 struct dsa_switch_tree *dst = ds->dst; 141 struct device_node *dn = dp->dn; 142 struct of_phandle_iterator it; 143 struct dsa_port *link_dp; 144 int err; 145 146 of_for_each_phandle(&it, err, dn, "link", NULL, 0) { 147 link_dp = dsa_tree_find_port_by_node(dst, it.node); 148 if (!link_dp) { 149 of_node_put(it.node); 150 return false; 151 } 152 153 ds->rtable[link_dp->ds->index] = dp->index; 154 } 155 156 return true; 157} 158 159static bool dsa_switch_setup_routing_table(struct dsa_switch *ds) 160{ 161 bool complete = true; 162 struct dsa_port *dp; 163 int i; 164 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 171 if (dsa_port_is_dsa(dp)) { 172 complete = dsa_port_setup_routing_table(dp); 173 if (!complete) 174 break; 175 } 176 } 177 178 return complete; 179} 180 181static 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 200static struct dsa_port *dsa_tree_find_first_cpu(struct dsa_switch_tree *dst) 201{ 202 struct dsa_switch *ds; 203 struct dsa_port *dp; 204 int device, port; 205 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 219 return NULL; 220} 221 222static int dsa_tree_setup_default_cpu(struct dsa_switch_tree *dst) 223{ 224 struct dsa_switch *ds; 225 struct dsa_port *dp; 226 int device, port; 227 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"); 232 return -EINVAL; 233 } 234 235 /* 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 } 248 249 return 0; 250} 251 252static void dsa_tree_teardown_default_cpu(struct dsa_switch_tree *dst) 253{ 254 /* DSA currently only supports a single CPU port */ 255 dst->cpu_dp = NULL; 256} 257 258static int dsa_port_setup(struct dsa_port *dp) 259{ 260 struct dsa_switch *ds = dp->ds; 261 int err; 262 263 memset(&dp->devlink_port, 0, sizeof(dp->devlink_port)); 264 265 err = devlink_port_register(ds->devlink, &dp->devlink_port, dp->index); 266 if (err) 267 return err; 268 269 switch (dp->type) { 270 case DSA_PORT_TYPE_UNUSED: 271 break; 272 case DSA_PORT_TYPE_CPU: 273 case DSA_PORT_TYPE_DSA: 274 err = dsa_port_link_register_of(dp); 275 if (err) { 276 dev_err(ds->dev, "failed to setup link for port %d.%d\n", 277 ds->index, dp->index); 278 return err; 279 } 280 break; 281 case DSA_PORT_TYPE_USER: 282 err = dsa_slave_create(dp); 283 if (err) 284 dev_err(ds->dev, "failed to create slave for port %d.%d\n", 285 ds->index, dp->index); 286 else 287 devlink_port_type_eth_set(&dp->devlink_port, dp->slave); 288 break; 289 } 290 291 return 0; 292} 293 294static void dsa_port_teardown(struct dsa_port *dp) 295{ 296 devlink_port_unregister(&dp->devlink_port); 297 298 switch (dp->type) { 299 case DSA_PORT_TYPE_UNUSED: 300 break; 301 case DSA_PORT_TYPE_CPU: 302 case DSA_PORT_TYPE_DSA: 303 dsa_port_link_unregister_of(dp); 304 break; 305 case DSA_PORT_TYPE_USER: 306 if (dp->slave) { 307 dsa_slave_destroy(dp->slave); 308 dp->slave = NULL; 309 } 310 break; 311 } 312} 313 314static int dsa_switch_setup(struct dsa_switch *ds) 315{ 316 int err; 317 318 /* Initialize ds->phys_mii_mask before registering the slave MDIO bus 319 * driver and before ops->setup() has run, since the switch drivers and 320 * the slave MDIO bus driver rely on these values for probing PHY 321 * devices or not 322 */ 323 ds->phys_mii_mask |= dsa_user_ports(ds); 324 325 /* Add the switch to devlink before calling setup, so that setup can 326 * add dpipe tables 327 */ 328 ds->devlink = devlink_alloc(&dsa_devlink_ops, 0); 329 if (!ds->devlink) 330 return -ENOMEM; 331 332 err = devlink_register(ds->devlink, ds->dev); 333 if (err) 334 return err; 335 336 err = ds->ops->setup(ds); 337 if (err < 0) 338 return err; 339 340 err = dsa_switch_register_notifier(ds); 341 if (err) 342 return err; 343 344 if (!ds->slave_mii_bus && ds->ops->phy_read) { 345 ds->slave_mii_bus = devm_mdiobus_alloc(ds->dev); 346 if (!ds->slave_mii_bus) 347 return -ENOMEM; 348 349 dsa_slave_mii_bus_init(ds); 350 351 err = mdiobus_register(ds->slave_mii_bus); 352 if (err < 0) 353 return err; 354 } 355 356 return 0; 357} 358 359static void dsa_switch_teardown(struct dsa_switch *ds) 360{ 361 if (ds->slave_mii_bus && ds->ops->phy_read) 362 mdiobus_unregister(ds->slave_mii_bus); 363 364 dsa_switch_unregister_notifier(ds); 365 366 if (ds->devlink) { 367 devlink_unregister(ds->devlink); 368 devlink_free(ds->devlink); 369 ds->devlink = NULL; 370 } 371 372} 373 374static int dsa_tree_setup_switches(struct dsa_switch_tree *dst) 375{ 376 struct dsa_switch *ds; 377 struct dsa_port *dp; 378 int device, port; 379 int err; 380 381 for (device = 0; device < DSA_MAX_SWITCHES; device++) { 382 ds = dst->ds[device]; 383 if (!ds) 384 continue; 385 386 err = dsa_switch_setup(ds); 387 if (err) 388 return err; 389 390 for (port = 0; port < ds->num_ports; port++) { 391 dp = &ds->ports[port]; 392 393 err = dsa_port_setup(dp); 394 if (err) 395 return err; 396 } 397 } 398 399 return 0; 400} 401 402static void dsa_tree_teardown_switches(struct dsa_switch_tree *dst) 403{ 404 struct dsa_switch *ds; 405 struct dsa_port *dp; 406 int device, port; 407 408 for (device = 0; device < DSA_MAX_SWITCHES; device++) { 409 ds = dst->ds[device]; 410 if (!ds) 411 continue; 412 413 for (port = 0; port < ds->num_ports; port++) { 414 dp = &ds->ports[port]; 415 416 dsa_port_teardown(dp); 417 } 418 419 dsa_switch_teardown(ds); 420 } 421} 422 423static int dsa_tree_setup_master(struct dsa_switch_tree *dst) 424{ 425 struct dsa_port *cpu_dp = dst->cpu_dp; 426 struct net_device *master = cpu_dp->master; 427 428 /* DSA currently supports a single pair of CPU port and master device */ 429 return dsa_master_setup(master, cpu_dp); 430} 431 432static void dsa_tree_teardown_master(struct dsa_switch_tree *dst) 433{ 434 struct dsa_port *cpu_dp = dst->cpu_dp; 435 struct net_device *master = cpu_dp->master; 436 437 return dsa_master_teardown(master); 438} 439 440static int dsa_tree_setup(struct dsa_switch_tree *dst) 441{ 442 bool complete; 443 int err; 444 445 if (dst->setup) { 446 pr_err("DSA: tree %d already setup! Disjoint trees?\n", 447 dst->index); 448 return -EEXIST; 449 } 450 451 complete = dsa_tree_setup_routing_table(dst); 452 if (!complete) 453 return 0; 454 455 err = dsa_tree_setup_default_cpu(dst); 456 if (err) 457 return err; 458 459 err = dsa_tree_setup_switches(dst); 460 if (err) 461 return err; 462 463 err = dsa_tree_setup_master(dst); 464 if (err) 465 return err; 466 467 dst->setup = true; 468 469 pr_info("DSA: tree %d setup\n", dst->index); 470 471 return 0; 472} 473 474static void dsa_tree_teardown(struct dsa_switch_tree *dst) 475{ 476 if (!dst->setup) 477 return; 478 479 dsa_tree_teardown_master(dst); 480 481 dsa_tree_teardown_switches(dst); 482 483 dsa_tree_teardown_default_cpu(dst); 484 485 pr_info("DSA: tree %d torn down\n", dst->index); 486 487 dst->setup = false; 488} 489 490static void dsa_tree_remove_switch(struct dsa_switch_tree *dst, 491 unsigned int index) 492{ 493 dsa_tree_teardown(dst); 494 495 dst->ds[index] = NULL; 496 dsa_tree_put(dst); 497} 498 499static int dsa_tree_add_switch(struct dsa_switch_tree *dst, 500 struct dsa_switch *ds) 501{ 502 unsigned int index = ds->index; 503 int err; 504 505 if (dst->ds[index]) 506 return -EBUSY; 507 508 dsa_tree_get(dst); 509 dst->ds[index] = ds; 510 511 err = dsa_tree_setup(dst); 512 if (err) 513 dsa_tree_remove_switch(dst, index); 514 515 return err; 516} 517 518static int dsa_port_parse_user(struct dsa_port *dp, const char *name) 519{ 520 if (!name) 521 name = "eth%d"; 522 523 dp->type = DSA_PORT_TYPE_USER; 524 dp->name = name; 525 526 return 0; 527} 528 529static int dsa_port_parse_dsa(struct dsa_port *dp) 530{ 531 dp->type = DSA_PORT_TYPE_DSA; 532 533 return 0; 534} 535 536static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master) 537{ 538 struct dsa_switch *ds = dp->ds; 539 struct dsa_switch_tree *dst = ds->dst; 540 const struct dsa_device_ops *tag_ops; 541 enum dsa_tag_protocol tag_protocol; 542 543 tag_protocol = ds->ops->get_tag_protocol(ds, dp->index); 544 tag_ops = dsa_resolve_tag_protocol(tag_protocol); 545 if (IS_ERR(tag_ops)) { 546 dev_warn(ds->dev, "No tagger for this switch\n"); 547 return PTR_ERR(tag_ops); 548 } 549 550 dp->type = DSA_PORT_TYPE_CPU; 551 dp->rcv = tag_ops->rcv; 552 dp->tag_ops = tag_ops; 553 dp->master = master; 554 dp->dst = dst; 555 556 return 0; 557} 558 559static int dsa_port_parse_of(struct dsa_port *dp, struct device_node *dn) 560{ 561 struct device_node *ethernet = of_parse_phandle(dn, "ethernet", 0); 562 const char *name = of_get_property(dn, "label", NULL); 563 bool link = of_property_read_bool(dn, "link"); 564 565 dp->dn = dn; 566 567 if (ethernet) { 568 struct net_device *master; 569 570 master = of_find_net_device_by_node(ethernet); 571 if (!master) 572 return -EPROBE_DEFER; 573 574 return dsa_port_parse_cpu(dp, master); 575 } 576 577 if (link) 578 return dsa_port_parse_dsa(dp); 579 580 return dsa_port_parse_user(dp, name); 581} 582 583static int dsa_switch_parse_ports_of(struct dsa_switch *ds, 584 struct device_node *dn) 585{ 586 struct device_node *ports, *port; 587 struct dsa_port *dp; 588 u32 reg; 589 int err; 590 591 ports = of_get_child_by_name(dn, "ports"); 592 if (!ports) { 593 dev_err(ds->dev, "no ports child node found\n"); 594 return -EINVAL; 595 } 596 597 for_each_available_child_of_node(ports, port) { 598 err = of_property_read_u32(port, "reg", &reg); 599 if (err) 600 return err; 601 602 if (reg >= ds->num_ports) 603 return -EINVAL; 604 605 dp = &ds->ports[reg]; 606 607 err = dsa_port_parse_of(dp, port); 608 if (err) 609 return err; 610 } 611 612 return 0; 613} 614 615static int dsa_switch_parse_member_of(struct dsa_switch *ds, 616 struct device_node *dn) 617{ 618 u32 m[2] = { 0, 0 }; 619 int sz; 620 621 /* Don't error out if this optional property isn't found */ 622 sz = of_property_read_variable_u32_array(dn, "dsa,member", m, 2, 2); 623 if (sz < 0 && sz != -EINVAL) 624 return sz; 625 626 ds->index = m[1]; 627 if (ds->index >= DSA_MAX_SWITCHES) 628 return -EINVAL; 629 630 ds->dst = dsa_tree_touch(m[0]); 631 if (!ds->dst) 632 return -ENOMEM; 633 634 return 0; 635} 636 637static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *dn) 638{ 639 int err; 640 641 err = dsa_switch_parse_member_of(ds, dn); 642 if (err) 643 return err; 644 645 return dsa_switch_parse_ports_of(ds, dn); 646} 647 648static int dsa_port_parse(struct dsa_port *dp, const char *name, 649 struct device *dev) 650{ 651 if (!strcmp(name, "cpu")) { 652 struct net_device *master; 653 654 master = dsa_dev_to_net_device(dev); 655 if (!master) 656 return -EPROBE_DEFER; 657 658 dev_put(master); 659 660 return dsa_port_parse_cpu(dp, master); 661 } 662 663 if (!strcmp(name, "dsa")) 664 return dsa_port_parse_dsa(dp); 665 666 return dsa_port_parse_user(dp, name); 667} 668 669static int dsa_switch_parse_ports(struct dsa_switch *ds, 670 struct dsa_chip_data *cd) 671{ 672 bool valid_name_found = false; 673 struct dsa_port *dp; 674 struct device *dev; 675 const char *name; 676 unsigned int i; 677 int err; 678 679 for (i = 0; i < DSA_MAX_PORTS; i++) { 680 name = cd->port_names[i]; 681 dev = cd->netdev[i]; 682 dp = &ds->ports[i]; 683 684 if (!name) 685 continue; 686 687 err = dsa_port_parse(dp, name, dev); 688 if (err) 689 return err; 690 691 valid_name_found = true; 692 } 693 694 if (!valid_name_found && i == DSA_MAX_PORTS) 695 return -EINVAL; 696 697 return 0; 698} 699 700static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd) 701{ 702 ds->cd = cd; 703 704 /* We don't support interconnected switches nor multiple trees via 705 * platform data, so this is the unique switch of the tree. 706 */ 707 ds->index = 0; 708 ds->dst = dsa_tree_touch(0); 709 if (!ds->dst) 710 return -ENOMEM; 711 712 return dsa_switch_parse_ports(ds, cd); 713} 714 715static int dsa_switch_add(struct dsa_switch *ds) 716{ 717 struct dsa_switch_tree *dst = ds->dst; 718 719 return dsa_tree_add_switch(dst, ds); 720} 721 722static int dsa_switch_probe(struct dsa_switch *ds) 723{ 724 struct dsa_chip_data *pdata = ds->dev->platform_data; 725 struct device_node *np = ds->dev->of_node; 726 int err; 727 728 if (np) 729 err = dsa_switch_parse_of(ds, np); 730 else if (pdata) 731 err = dsa_switch_parse(ds, pdata); 732 else 733 err = -ENODEV; 734 735 if (err) 736 return err; 737 738 return dsa_switch_add(ds); 739} 740 741struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n) 742{ 743 size_t size = sizeof(struct dsa_switch) + n * sizeof(struct dsa_port); 744 struct dsa_switch *ds; 745 int i; 746 747 ds = devm_kzalloc(dev, size, GFP_KERNEL); 748 if (!ds) 749 return NULL; 750 751 ds->dev = dev; 752 ds->num_ports = n; 753 754 for (i = 0; i < ds->num_ports; ++i) { 755 ds->ports[i].index = i; 756 ds->ports[i].ds = ds; 757 } 758 759 return ds; 760} 761EXPORT_SYMBOL_GPL(dsa_switch_alloc); 762 763int dsa_register_switch(struct dsa_switch *ds) 764{ 765 int err; 766 767 mutex_lock(&dsa2_mutex); 768 err = dsa_switch_probe(ds); 769 dsa_tree_put(ds->dst); 770 mutex_unlock(&dsa2_mutex); 771 772 return err; 773} 774EXPORT_SYMBOL_GPL(dsa_register_switch); 775 776static void dsa_switch_remove(struct dsa_switch *ds) 777{ 778 struct dsa_switch_tree *dst = ds->dst; 779 unsigned int index = ds->index; 780 781 dsa_tree_remove_switch(dst, index); 782} 783 784void dsa_unregister_switch(struct dsa_switch *ds) 785{ 786 mutex_lock(&dsa2_mutex); 787 dsa_switch_remove(ds); 788 mutex_unlock(&dsa2_mutex); 789} 790EXPORT_SYMBOL_GPL(dsa_unregister_switch);