1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Handling of a single switch chip, part of a switch fabric 4 * 5 * Copyright (c) 2017 Savoir-faire Linux Inc. 6 * Vivien Didelot <vivien.didelot@savoirfairelinux.com> 7 */ 8 9 #include <linux/if_bridge.h> 10 #include <linux/netdevice.h> 11 #include <linux/notifier.h> 12 #include <linux/if_vlan.h> 13 #include <net/switchdev.h> 14 15 #include "dsa.h" 16 #include "netlink.h" 17 #include "port.h" 18 #include "switch.h" 19 #include "tag_8021q.h" 20 #include "trace.h" 21 #include "user.h" 22 23 static unsigned int dsa_switch_fastest_ageing_time(struct dsa_switch *ds, 24 unsigned int ageing_time) 25 { 26 struct dsa_port *dp; 27 28 dsa_switch_for_each_port(dp, ds) 29 if (dp->ageing_time && dp->ageing_time < ageing_time) 30 ageing_time = dp->ageing_time; 31 32 return ageing_time; 33 } 34 35 static int dsa_switch_ageing_time(struct dsa_switch *ds, 36 struct dsa_notifier_ageing_time_info *info) 37 { 38 unsigned int ageing_time = info->ageing_time; 39 40 if (ds->ageing_time_min && ageing_time < ds->ageing_time_min) 41 return -ERANGE; 42 43 if (ds->ageing_time_max && ageing_time > ds->ageing_time_max) 44 return -ERANGE; 45 46 /* Program the fastest ageing time in case of multiple bridges */ 47 ageing_time = dsa_switch_fastest_ageing_time(ds, ageing_time); 48 49 if (ds->ops->set_ageing_time) 50 return ds->ops->set_ageing_time(ds, ageing_time); 51 52 return 0; 53 } 54 55 static bool dsa_port_mtu_match(struct dsa_port *dp, 56 struct dsa_notifier_mtu_info *info) 57 { 58 return dp == info->dp || dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp); 59 } 60 61 static int dsa_switch_mtu(struct dsa_switch *ds, 62 struct dsa_notifier_mtu_info *info) 63 { 64 struct dsa_port *dp; 65 int ret; 66 67 if (!ds->ops->port_change_mtu) 68 return -EOPNOTSUPP; 69 70 dsa_switch_for_each_port(dp, ds) { 71 if (dsa_port_mtu_match(dp, info)) { 72 ret = ds->ops->port_change_mtu(ds, dp->index, 73 info->mtu); 74 if (ret) 75 return ret; 76 } 77 } 78 79 return 0; 80 } 81 82 static int dsa_switch_bridge_join(struct dsa_switch *ds, 83 struct dsa_notifier_bridge_info *info) 84 { 85 int err; 86 87 if (info->dp->ds == ds) { 88 if (!ds->ops->port_bridge_join) 89 return -EOPNOTSUPP; 90 91 err = ds->ops->port_bridge_join(ds, info->dp->index, 92 info->bridge, 93 &info->tx_fwd_offload, 94 info->extack); 95 if (err) 96 return err; 97 } 98 99 if (info->dp->ds != ds && ds->ops->crosschip_bridge_join) { 100 err = ds->ops->crosschip_bridge_join(ds, 101 info->dp->ds->dst->index, 102 info->dp->ds->index, 103 info->dp->index, 104 info->bridge, 105 info->extack); 106 if (err) 107 return err; 108 } 109 110 return 0; 111 } 112 113 static int dsa_switch_bridge_leave(struct dsa_switch *ds, 114 struct dsa_notifier_bridge_info *info) 115 { 116 if (info->dp->ds == ds && ds->ops->port_bridge_leave) 117 ds->ops->port_bridge_leave(ds, info->dp->index, info->bridge); 118 119 if (info->dp->ds != ds && ds->ops->crosschip_bridge_leave) 120 ds->ops->crosschip_bridge_leave(ds, info->dp->ds->dst->index, 121 info->dp->ds->index, 122 info->dp->index, 123 info->bridge); 124 125 return 0; 126 } 127 128 /* Matches for all upstream-facing ports (the CPU port and all upstream-facing 129 * DSA links) that sit between the targeted port on which the notifier was 130 * emitted and its dedicated CPU port. 131 */ 132 static bool dsa_port_host_address_match(struct dsa_port *dp, 133 const struct dsa_port *targeted_dp) 134 { 135 struct dsa_port *cpu_dp = targeted_dp->cpu_dp; 136 137 if (dsa_switch_is_upstream_of(dp->ds, targeted_dp->ds)) 138 return dp->index == dsa_towards_port(dp->ds, cpu_dp->ds->index, 139 cpu_dp->index); 140 141 return false; 142 } 143 144 static struct dsa_mac_addr *dsa_mac_addr_find(struct list_head *addr_list, 145 const unsigned char *addr, u16 vid, 146 struct dsa_db db) 147 { 148 struct dsa_mac_addr *a; 149 150 list_for_each_entry(a, addr_list, list) 151 if (ether_addr_equal(a->addr, addr) && a->vid == vid && 152 dsa_db_equal(&a->db, &db)) 153 return a; 154 155 return NULL; 156 } 157 158 static int dsa_port_do_mdb_add(struct dsa_port *dp, 159 const struct switchdev_obj_port_mdb *mdb, 160 struct dsa_db db) 161 { 162 struct dsa_switch *ds = dp->ds; 163 struct dsa_mac_addr *a; 164 int port = dp->index; 165 int err = 0; 166 167 /* No need to bother with refcounting for user ports */ 168 if (!(dsa_port_is_cpu(dp) || dsa_port_is_dsa(dp))) { 169 err = ds->ops->port_mdb_add(ds, port, mdb, db); 170 trace_dsa_mdb_add_hw(dp, mdb->addr, mdb->vid, &db, err); 171 172 return err; 173 } 174 175 mutex_lock(&dp->addr_lists_lock); 176 177 a = dsa_mac_addr_find(&dp->mdbs, mdb->addr, mdb->vid, db); 178 if (a) { 179 refcount_inc(&a->refcount); 180 trace_dsa_mdb_add_bump(dp, mdb->addr, mdb->vid, &db, 181 &a->refcount); 182 goto out; 183 } 184 185 a = kzalloc(sizeof(*a), GFP_KERNEL); 186 if (!a) { 187 err = -ENOMEM; 188 goto out; 189 } 190 191 err = ds->ops->port_mdb_add(ds, port, mdb, db); 192 trace_dsa_mdb_add_hw(dp, mdb->addr, mdb->vid, &db, err); 193 if (err) { 194 kfree(a); 195 goto out; 196 } 197 198 ether_addr_copy(a->addr, mdb->addr); 199 a->vid = mdb->vid; 200 a->db = db; 201 refcount_set(&a->refcount, 1); 202 list_add_tail(&a->list, &dp->mdbs); 203 204 out: 205 mutex_unlock(&dp->addr_lists_lock); 206 207 return err; 208 } 209 210 static int dsa_port_do_mdb_del(struct dsa_port *dp, 211 const struct switchdev_obj_port_mdb *mdb, 212 struct dsa_db db) 213 { 214 struct dsa_switch *ds = dp->ds; 215 struct dsa_mac_addr *a; 216 int port = dp->index; 217 int err = 0; 218 219 /* No need to bother with refcounting for user ports */ 220 if (!(dsa_port_is_cpu(dp) || dsa_port_is_dsa(dp))) { 221 err = ds->ops->port_mdb_del(ds, port, mdb, db); 222 trace_dsa_mdb_del_hw(dp, mdb->addr, mdb->vid, &db, err); 223 224 return err; 225 } 226 227 mutex_lock(&dp->addr_lists_lock); 228 229 a = dsa_mac_addr_find(&dp->mdbs, mdb->addr, mdb->vid, db); 230 if (!a) { 231 trace_dsa_mdb_del_not_found(dp, mdb->addr, mdb->vid, &db); 232 err = -ENOENT; 233 goto out; 234 } 235 236 if (!refcount_dec_and_test(&a->refcount)) { 237 trace_dsa_mdb_del_drop(dp, mdb->addr, mdb->vid, &db, 238 &a->refcount); 239 goto out; 240 } 241 242 err = ds->ops->port_mdb_del(ds, port, mdb, db); 243 trace_dsa_mdb_del_hw(dp, mdb->addr, mdb->vid, &db, err); 244 if (err) { 245 refcount_set(&a->refcount, 1); 246 goto out; 247 } 248 249 list_del(&a->list); 250 kfree(a); 251 252 out: 253 mutex_unlock(&dp->addr_lists_lock); 254 255 return err; 256 } 257 258 static int dsa_port_do_fdb_add(struct dsa_port *dp, const unsigned char *addr, 259 u16 vid, struct dsa_db db) 260 { 261 struct dsa_switch *ds = dp->ds; 262 struct dsa_mac_addr *a; 263 int port = dp->index; 264 int err = 0; 265 266 /* No need to bother with refcounting for user ports */ 267 if (!(dsa_port_is_cpu(dp) || dsa_port_is_dsa(dp))) { 268 err = ds->ops->port_fdb_add(ds, port, addr, vid, db); 269 trace_dsa_fdb_add_hw(dp, addr, vid, &db, err); 270 271 return err; 272 } 273 274 mutex_lock(&dp->addr_lists_lock); 275 276 a = dsa_mac_addr_find(&dp->fdbs, addr, vid, db); 277 if (a) { 278 refcount_inc(&a->refcount); 279 trace_dsa_fdb_add_bump(dp, addr, vid, &db, &a->refcount); 280 goto out; 281 } 282 283 a = kzalloc(sizeof(*a), GFP_KERNEL); 284 if (!a) { 285 err = -ENOMEM; 286 goto out; 287 } 288 289 err = ds->ops->port_fdb_add(ds, port, addr, vid, db); 290 trace_dsa_fdb_add_hw(dp, addr, vid, &db, err); 291 if (err) { 292 kfree(a); 293 goto out; 294 } 295 296 ether_addr_copy(a->addr, addr); 297 a->vid = vid; 298 a->db = db; 299 refcount_set(&a->refcount, 1); 300 list_add_tail(&a->list, &dp->fdbs); 301 302 out: 303 mutex_unlock(&dp->addr_lists_lock); 304 305 return err; 306 } 307 308 static int dsa_port_do_fdb_del(struct dsa_port *dp, const unsigned char *addr, 309 u16 vid, struct dsa_db db) 310 { 311 struct dsa_switch *ds = dp->ds; 312 struct dsa_mac_addr *a; 313 int port = dp->index; 314 int err = 0; 315 316 /* No need to bother with refcounting for user ports */ 317 if (!(dsa_port_is_cpu(dp) || dsa_port_is_dsa(dp))) { 318 err = ds->ops->port_fdb_del(ds, port, addr, vid, db); 319 trace_dsa_fdb_del_hw(dp, addr, vid, &db, err); 320 321 return err; 322 } 323 324 mutex_lock(&dp->addr_lists_lock); 325 326 a = dsa_mac_addr_find(&dp->fdbs, addr, vid, db); 327 if (!a) { 328 trace_dsa_fdb_del_not_found(dp, addr, vid, &db); 329 err = -ENOENT; 330 goto out; 331 } 332 333 if (!refcount_dec_and_test(&a->refcount)) { 334 trace_dsa_fdb_del_drop(dp, addr, vid, &db, &a->refcount); 335 goto out; 336 } 337 338 err = ds->ops->port_fdb_del(ds, port, addr, vid, db); 339 trace_dsa_fdb_del_hw(dp, addr, vid, &db, err); 340 if (err) { 341 refcount_set(&a->refcount, 1); 342 goto out; 343 } 344 345 list_del(&a->list); 346 kfree(a); 347 348 out: 349 mutex_unlock(&dp->addr_lists_lock); 350 351 return err; 352 } 353 354 static int dsa_switch_do_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag *lag, 355 const unsigned char *addr, u16 vid, 356 struct dsa_db db) 357 { 358 struct dsa_mac_addr *a; 359 int err = 0; 360 361 mutex_lock(&lag->fdb_lock); 362 363 a = dsa_mac_addr_find(&lag->fdbs, addr, vid, db); 364 if (a) { 365 refcount_inc(&a->refcount); 366 trace_dsa_lag_fdb_add_bump(lag->dev, addr, vid, &db, 367 &a->refcount); 368 goto out; 369 } 370 371 a = kzalloc(sizeof(*a), GFP_KERNEL); 372 if (!a) { 373 err = -ENOMEM; 374 goto out; 375 } 376 377 err = ds->ops->lag_fdb_add(ds, *lag, addr, vid, db); 378 trace_dsa_lag_fdb_add_hw(lag->dev, addr, vid, &db, err); 379 if (err) { 380 kfree(a); 381 goto out; 382 } 383 384 ether_addr_copy(a->addr, addr); 385 a->vid = vid; 386 a->db = db; 387 refcount_set(&a->refcount, 1); 388 list_add_tail(&a->list, &lag->fdbs); 389 390 out: 391 mutex_unlock(&lag->fdb_lock); 392 393 return err; 394 } 395 396 static int dsa_switch_do_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag *lag, 397 const unsigned char *addr, u16 vid, 398 struct dsa_db db) 399 { 400 struct dsa_mac_addr *a; 401 int err = 0; 402 403 mutex_lock(&lag->fdb_lock); 404 405 a = dsa_mac_addr_find(&lag->fdbs, addr, vid, db); 406 if (!a) { 407 trace_dsa_lag_fdb_del_not_found(lag->dev, addr, vid, &db); 408 err = -ENOENT; 409 goto out; 410 } 411 412 if (!refcount_dec_and_test(&a->refcount)) { 413 trace_dsa_lag_fdb_del_drop(lag->dev, addr, vid, &db, 414 &a->refcount); 415 goto out; 416 } 417 418 err = ds->ops->lag_fdb_del(ds, *lag, addr, vid, db); 419 trace_dsa_lag_fdb_del_hw(lag->dev, addr, vid, &db, err); 420 if (err) { 421 refcount_set(&a->refcount, 1); 422 goto out; 423 } 424 425 list_del(&a->list); 426 kfree(a); 427 428 out: 429 mutex_unlock(&lag->fdb_lock); 430 431 return err; 432 } 433 434 static int dsa_switch_host_fdb_add(struct dsa_switch *ds, 435 struct dsa_notifier_fdb_info *info) 436 { 437 struct dsa_port *dp; 438 int err = 0; 439 440 if (!ds->ops->port_fdb_add) 441 return -EOPNOTSUPP; 442 443 dsa_switch_for_each_port(dp, ds) { 444 if (dsa_port_host_address_match(dp, info->dp)) { 445 if (dsa_port_is_cpu(dp) && info->dp->cpu_port_in_lag) { 446 err = dsa_switch_do_lag_fdb_add(ds, dp->lag, 447 info->addr, 448 info->vid, 449 info->db); 450 } else { 451 err = dsa_port_do_fdb_add(dp, info->addr, 452 info->vid, info->db); 453 } 454 if (err) 455 break; 456 } 457 } 458 459 return err; 460 } 461 462 static int dsa_switch_host_fdb_del(struct dsa_switch *ds, 463 struct dsa_notifier_fdb_info *info) 464 { 465 struct dsa_port *dp; 466 int err = 0; 467 468 if (!ds->ops->port_fdb_del) 469 return -EOPNOTSUPP; 470 471 dsa_switch_for_each_port(dp, ds) { 472 if (dsa_port_host_address_match(dp, info->dp)) { 473 if (dsa_port_is_cpu(dp) && info->dp->cpu_port_in_lag) { 474 err = dsa_switch_do_lag_fdb_del(ds, dp->lag, 475 info->addr, 476 info->vid, 477 info->db); 478 } else { 479 err = dsa_port_do_fdb_del(dp, info->addr, 480 info->vid, info->db); 481 } 482 if (err) 483 break; 484 } 485 } 486 487 return err; 488 } 489 490 static int dsa_switch_fdb_add(struct dsa_switch *ds, 491 struct dsa_notifier_fdb_info *info) 492 { 493 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); 494 struct dsa_port *dp = dsa_to_port(ds, port); 495 496 if (!ds->ops->port_fdb_add) 497 return -EOPNOTSUPP; 498 499 return dsa_port_do_fdb_add(dp, info->addr, info->vid, info->db); 500 } 501 502 static int dsa_switch_fdb_del(struct dsa_switch *ds, 503 struct dsa_notifier_fdb_info *info) 504 { 505 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); 506 struct dsa_port *dp = dsa_to_port(ds, port); 507 508 if (!ds->ops->port_fdb_del) 509 return -EOPNOTSUPP; 510 511 return dsa_port_do_fdb_del(dp, info->addr, info->vid, info->db); 512 } 513 514 static int dsa_switch_lag_fdb_add(struct dsa_switch *ds, 515 struct dsa_notifier_lag_fdb_info *info) 516 { 517 struct dsa_port *dp; 518 519 if (!ds->ops->lag_fdb_add) 520 return -EOPNOTSUPP; 521 522 /* Notify switch only if it has a port in this LAG */ 523 dsa_switch_for_each_port(dp, ds) 524 if (dsa_port_offloads_lag(dp, info->lag)) 525 return dsa_switch_do_lag_fdb_add(ds, info->lag, 526 info->addr, info->vid, 527 info->db); 528 529 return 0; 530 } 531 532 static int dsa_switch_lag_fdb_del(struct dsa_switch *ds, 533 struct dsa_notifier_lag_fdb_info *info) 534 { 535 struct dsa_port *dp; 536 537 if (!ds->ops->lag_fdb_del) 538 return -EOPNOTSUPP; 539 540 /* Notify switch only if it has a port in this LAG */ 541 dsa_switch_for_each_port(dp, ds) 542 if (dsa_port_offloads_lag(dp, info->lag)) 543 return dsa_switch_do_lag_fdb_del(ds, info->lag, 544 info->addr, info->vid, 545 info->db); 546 547 return 0; 548 } 549 550 static int dsa_switch_lag_change(struct dsa_switch *ds, 551 struct dsa_notifier_lag_info *info) 552 { 553 if (info->dp->ds == ds && ds->ops->port_lag_change) 554 return ds->ops->port_lag_change(ds, info->dp->index); 555 556 if (info->dp->ds != ds && ds->ops->crosschip_lag_change) 557 return ds->ops->crosschip_lag_change(ds, info->dp->ds->index, 558 info->dp->index); 559 560 return 0; 561 } 562 563 static int dsa_switch_lag_join(struct dsa_switch *ds, 564 struct dsa_notifier_lag_info *info) 565 { 566 if (info->dp->ds == ds && ds->ops->port_lag_join) 567 return ds->ops->port_lag_join(ds, info->dp->index, info->lag, 568 info->info, info->extack); 569 570 if (info->dp->ds != ds && ds->ops->crosschip_lag_join) 571 return ds->ops->crosschip_lag_join(ds, info->dp->ds->index, 572 info->dp->index, info->lag, 573 info->info, info->extack); 574 575 return -EOPNOTSUPP; 576 } 577 578 static int dsa_switch_lag_leave(struct dsa_switch *ds, 579 struct dsa_notifier_lag_info *info) 580 { 581 if (info->dp->ds == ds && ds->ops->port_lag_leave) 582 return ds->ops->port_lag_leave(ds, info->dp->index, info->lag); 583 584 if (info->dp->ds != ds && ds->ops->crosschip_lag_leave) 585 return ds->ops->crosschip_lag_leave(ds, info->dp->ds->index, 586 info->dp->index, info->lag); 587 588 return -EOPNOTSUPP; 589 } 590 591 static int dsa_switch_mdb_add(struct dsa_switch *ds, 592 struct dsa_notifier_mdb_info *info) 593 { 594 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); 595 struct dsa_port *dp = dsa_to_port(ds, port); 596 597 if (!ds->ops->port_mdb_add) 598 return -EOPNOTSUPP; 599 600 return dsa_port_do_mdb_add(dp, info->mdb, info->db); 601 } 602 603 static int dsa_switch_mdb_del(struct dsa_switch *ds, 604 struct dsa_notifier_mdb_info *info) 605 { 606 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); 607 struct dsa_port *dp = dsa_to_port(ds, port); 608 609 if (!ds->ops->port_mdb_del) 610 return -EOPNOTSUPP; 611 612 return dsa_port_do_mdb_del(dp, info->mdb, info->db); 613 } 614 615 static int dsa_switch_host_mdb_add(struct dsa_switch *ds, 616 struct dsa_notifier_mdb_info *info) 617 { 618 struct dsa_port *dp; 619 int err = 0; 620 621 if (!ds->ops->port_mdb_add) 622 return -EOPNOTSUPP; 623 624 dsa_switch_for_each_port(dp, ds) { 625 if (dsa_port_host_address_match(dp, info->dp)) { 626 err = dsa_port_do_mdb_add(dp, info->mdb, info->db); 627 if (err) 628 break; 629 } 630 } 631 632 return err; 633 } 634 635 static int dsa_switch_host_mdb_del(struct dsa_switch *ds, 636 struct dsa_notifier_mdb_info *info) 637 { 638 struct dsa_port *dp; 639 int err = 0; 640 641 if (!ds->ops->port_mdb_del) 642 return -EOPNOTSUPP; 643 644 dsa_switch_for_each_port(dp, ds) { 645 if (dsa_port_host_address_match(dp, info->dp)) { 646 err = dsa_port_do_mdb_del(dp, info->mdb, info->db); 647 if (err) 648 break; 649 } 650 } 651 652 return err; 653 } 654 655 /* Port VLANs match on the targeted port and on all DSA ports */ 656 static bool dsa_port_vlan_match(struct dsa_port *dp, 657 struct dsa_notifier_vlan_info *info) 658 { 659 return dsa_port_is_dsa(dp) || dp == info->dp; 660 } 661 662 /* Host VLANs match on the targeted port's CPU port, and on all DSA ports 663 * (upstream and downstream) of that switch and its upstream switches. 664 */ 665 static bool dsa_port_host_vlan_match(struct dsa_port *dp, 666 const struct dsa_port *targeted_dp) 667 { 668 struct dsa_port *cpu_dp = targeted_dp->cpu_dp; 669 670 if (dsa_switch_is_upstream_of(dp->ds, targeted_dp->ds)) 671 return dsa_port_is_dsa(dp) || dp == cpu_dp; 672 673 return false; 674 } 675 676 struct dsa_vlan *dsa_vlan_find(struct list_head *vlan_list, 677 const struct switchdev_obj_port_vlan *vlan) 678 { 679 struct dsa_vlan *v; 680 681 list_for_each_entry(v, vlan_list, list) 682 if (v->vid == vlan->vid) 683 return v; 684 685 return NULL; 686 } 687 688 static int dsa_port_do_vlan_add(struct dsa_port *dp, 689 const struct switchdev_obj_port_vlan *vlan, 690 struct netlink_ext_ack *extack) 691 { 692 struct dsa_switch *ds = dp->ds; 693 int port = dp->index; 694 struct dsa_vlan *v; 695 int err = 0; 696 697 /* No need to bother with refcounting for user ports. */ 698 if (!(dsa_port_is_cpu(dp) || dsa_port_is_dsa(dp))) { 699 err = ds->ops->port_vlan_add(ds, port, vlan, extack); 700 trace_dsa_vlan_add_hw(dp, vlan, err); 701 702 return err; 703 } 704 705 /* No need to propagate on shared ports the existing VLANs that were 706 * re-notified after just the flags have changed. This would cause a 707 * refcount bump which we need to avoid, since it unbalances the 708 * additions with the deletions. 709 */ 710 if (vlan->changed) 711 return 0; 712 713 mutex_lock(&dp->vlans_lock); 714 715 v = dsa_vlan_find(&dp->vlans, vlan); 716 if (v) { 717 refcount_inc(&v->refcount); 718 trace_dsa_vlan_add_bump(dp, vlan, &v->refcount); 719 goto out; 720 } 721 722 v = kzalloc(sizeof(*v), GFP_KERNEL); 723 if (!v) { 724 err = -ENOMEM; 725 goto out; 726 } 727 728 err = ds->ops->port_vlan_add(ds, port, vlan, extack); 729 trace_dsa_vlan_add_hw(dp, vlan, err); 730 if (err) { 731 kfree(v); 732 goto out; 733 } 734 735 v->vid = vlan->vid; 736 refcount_set(&v->refcount, 1); 737 list_add_tail(&v->list, &dp->vlans); 738 739 out: 740 mutex_unlock(&dp->vlans_lock); 741 742 return err; 743 } 744 745 static int dsa_port_do_vlan_del(struct dsa_port *dp, 746 const struct switchdev_obj_port_vlan *vlan) 747 { 748 struct dsa_switch *ds = dp->ds; 749 int port = dp->index; 750 struct dsa_vlan *v; 751 int err = 0; 752 753 /* No need to bother with refcounting for user ports */ 754 if (!(dsa_port_is_cpu(dp) || dsa_port_is_dsa(dp))) { 755 err = ds->ops->port_vlan_del(ds, port, vlan); 756 trace_dsa_vlan_del_hw(dp, vlan, err); 757 758 return err; 759 } 760 761 mutex_lock(&dp->vlans_lock); 762 763 v = dsa_vlan_find(&dp->vlans, vlan); 764 if (!v) { 765 trace_dsa_vlan_del_not_found(dp, vlan); 766 err = -ENOENT; 767 goto out; 768 } 769 770 if (!refcount_dec_and_test(&v->refcount)) { 771 trace_dsa_vlan_del_drop(dp, vlan, &v->refcount); 772 goto out; 773 } 774 775 err = ds->ops->port_vlan_del(ds, port, vlan); 776 trace_dsa_vlan_del_hw(dp, vlan, err); 777 if (err) { 778 refcount_set(&v->refcount, 1); 779 goto out; 780 } 781 782 list_del(&v->list); 783 kfree(v); 784 785 out: 786 mutex_unlock(&dp->vlans_lock); 787 788 return err; 789 } 790 791 static int dsa_switch_vlan_add(struct dsa_switch *ds, 792 struct dsa_notifier_vlan_info *info) 793 { 794 struct dsa_port *dp; 795 int err; 796 797 if (!ds->ops->port_vlan_add) 798 return -EOPNOTSUPP; 799 800 dsa_switch_for_each_port(dp, ds) { 801 if (dsa_port_vlan_match(dp, info)) { 802 err = dsa_port_do_vlan_add(dp, info->vlan, 803 info->extack); 804 if (err) 805 return err; 806 } 807 } 808 809 return 0; 810 } 811 812 static int dsa_switch_vlan_del(struct dsa_switch *ds, 813 struct dsa_notifier_vlan_info *info) 814 { 815 struct dsa_port *dp; 816 int err; 817 818 if (!ds->ops->port_vlan_del) 819 return -EOPNOTSUPP; 820 821 dsa_switch_for_each_port(dp, ds) { 822 if (dsa_port_vlan_match(dp, info)) { 823 err = dsa_port_do_vlan_del(dp, info->vlan); 824 if (err) 825 return err; 826 } 827 } 828 829 return 0; 830 } 831 832 static int dsa_switch_host_vlan_add(struct dsa_switch *ds, 833 struct dsa_notifier_vlan_info *info) 834 { 835 struct dsa_port *dp; 836 int err; 837 838 if (!ds->ops->port_vlan_add) 839 return -EOPNOTSUPP; 840 841 dsa_switch_for_each_port(dp, ds) { 842 if (dsa_port_host_vlan_match(dp, info->dp)) { 843 err = dsa_port_do_vlan_add(dp, info->vlan, 844 info->extack); 845 if (err) 846 return err; 847 } 848 } 849 850 return 0; 851 } 852 853 static int dsa_switch_host_vlan_del(struct dsa_switch *ds, 854 struct dsa_notifier_vlan_info *info) 855 { 856 struct dsa_port *dp; 857 int err; 858 859 if (!ds->ops->port_vlan_del) 860 return -EOPNOTSUPP; 861 862 dsa_switch_for_each_port(dp, ds) { 863 if (dsa_port_host_vlan_match(dp, info->dp)) { 864 err = dsa_port_do_vlan_del(dp, info->vlan); 865 if (err) 866 return err; 867 } 868 } 869 870 return 0; 871 } 872 873 static int dsa_switch_change_tag_proto(struct dsa_switch *ds, 874 struct dsa_notifier_tag_proto_info *info) 875 { 876 const struct dsa_device_ops *tag_ops = info->tag_ops; 877 struct dsa_port *dp, *cpu_dp; 878 int err; 879 880 if (!ds->ops->change_tag_protocol) 881 return -EOPNOTSUPP; 882 883 ASSERT_RTNL(); 884 885 err = ds->ops->change_tag_protocol(ds, tag_ops->proto); 886 if (err) 887 return err; 888 889 dsa_switch_for_each_cpu_port(cpu_dp, ds) 890 dsa_port_set_tag_protocol(cpu_dp, tag_ops); 891 892 /* Now that changing the tag protocol can no longer fail, let's update 893 * the remaining bits which are "duplicated for faster access", and the 894 * bits that depend on the tagger, such as the MTU. 895 */ 896 dsa_switch_for_each_user_port(dp, ds) { 897 struct net_device *user = dp->user; 898 899 dsa_user_setup_tagger(user); 900 901 /* rtnl_mutex is held in dsa_tree_change_tag_proto */ 902 dsa_user_change_mtu(user, user->mtu); 903 } 904 905 return 0; 906 } 907 908 /* We use the same cross-chip notifiers to inform both the tagger side, as well 909 * as the switch side, of connection and disconnection events. 910 * Since ds->tagger_data is owned by the tagger, it isn't a hard error if the 911 * switch side doesn't support connecting to this tagger, and therefore, the 912 * fact that we don't disconnect the tagger side doesn't constitute a memory 913 * leak: the tagger will still operate with persistent per-switch memory, just 914 * with the switch side unconnected to it. What does constitute a hard error is 915 * when the switch side supports connecting but fails. 916 */ 917 static int 918 dsa_switch_connect_tag_proto(struct dsa_switch *ds, 919 struct dsa_notifier_tag_proto_info *info) 920 { 921 const struct dsa_device_ops *tag_ops = info->tag_ops; 922 int err; 923 924 /* Notify the new tagger about the connection to this switch */ 925 if (tag_ops->connect) { 926 err = tag_ops->connect(ds); 927 if (err) 928 return err; 929 } 930 931 if (!ds->ops->connect_tag_protocol) 932 return -EOPNOTSUPP; 933 934 /* Notify the switch about the connection to the new tagger */ 935 err = ds->ops->connect_tag_protocol(ds, tag_ops->proto); 936 if (err) { 937 /* Revert the new tagger's connection to this tree */ 938 if (tag_ops->disconnect) 939 tag_ops->disconnect(ds); 940 return err; 941 } 942 943 return 0; 944 } 945 946 static int 947 dsa_switch_disconnect_tag_proto(struct dsa_switch *ds, 948 struct dsa_notifier_tag_proto_info *info) 949 { 950 const struct dsa_device_ops *tag_ops = info->tag_ops; 951 952 /* Notify the tagger about the disconnection from this switch */ 953 if (tag_ops->disconnect && ds->tagger_data) 954 tag_ops->disconnect(ds); 955 956 /* No need to notify the switch, since it shouldn't have any 957 * resources to tear down 958 */ 959 return 0; 960 } 961 962 static int 963 dsa_switch_conduit_state_change(struct dsa_switch *ds, 964 struct dsa_notifier_conduit_state_info *info) 965 { 966 if (!ds->ops->conduit_state_change) 967 return 0; 968 969 ds->ops->conduit_state_change(ds, info->conduit, info->operational); 970 971 return 0; 972 } 973 974 static int dsa_switch_event(struct notifier_block *nb, 975 unsigned long event, void *info) 976 { 977 struct dsa_switch *ds = container_of(nb, struct dsa_switch, nb); 978 int err; 979 980 switch (event) { 981 case DSA_NOTIFIER_AGEING_TIME: 982 err = dsa_switch_ageing_time(ds, info); 983 break; 984 case DSA_NOTIFIER_BRIDGE_JOIN: 985 err = dsa_switch_bridge_join(ds, info); 986 break; 987 case DSA_NOTIFIER_BRIDGE_LEAVE: 988 err = dsa_switch_bridge_leave(ds, info); 989 break; 990 case DSA_NOTIFIER_FDB_ADD: 991 err = dsa_switch_fdb_add(ds, info); 992 break; 993 case DSA_NOTIFIER_FDB_DEL: 994 err = dsa_switch_fdb_del(ds, info); 995 break; 996 case DSA_NOTIFIER_HOST_FDB_ADD: 997 err = dsa_switch_host_fdb_add(ds, info); 998 break; 999 case DSA_NOTIFIER_HOST_FDB_DEL: 1000 err = dsa_switch_host_fdb_del(ds, info); 1001 break; 1002 case DSA_NOTIFIER_LAG_FDB_ADD: 1003 err = dsa_switch_lag_fdb_add(ds, info); 1004 break; 1005 case DSA_NOTIFIER_LAG_FDB_DEL: 1006 err = dsa_switch_lag_fdb_del(ds, info); 1007 break; 1008 case DSA_NOTIFIER_LAG_CHANGE: 1009 err = dsa_switch_lag_change(ds, info); 1010 break; 1011 case DSA_NOTIFIER_LAG_JOIN: 1012 err = dsa_switch_lag_join(ds, info); 1013 break; 1014 case DSA_NOTIFIER_LAG_LEAVE: 1015 err = dsa_switch_lag_leave(ds, info); 1016 break; 1017 case DSA_NOTIFIER_MDB_ADD: 1018 err = dsa_switch_mdb_add(ds, info); 1019 break; 1020 case DSA_NOTIFIER_MDB_DEL: 1021 err = dsa_switch_mdb_del(ds, info); 1022 break; 1023 case DSA_NOTIFIER_HOST_MDB_ADD: 1024 err = dsa_switch_host_mdb_add(ds, info); 1025 break; 1026 case DSA_NOTIFIER_HOST_MDB_DEL: 1027 err = dsa_switch_host_mdb_del(ds, info); 1028 break; 1029 case DSA_NOTIFIER_VLAN_ADD: 1030 err = dsa_switch_vlan_add(ds, info); 1031 break; 1032 case DSA_NOTIFIER_VLAN_DEL: 1033 err = dsa_switch_vlan_del(ds, info); 1034 break; 1035 case DSA_NOTIFIER_HOST_VLAN_ADD: 1036 err = dsa_switch_host_vlan_add(ds, info); 1037 break; 1038 case DSA_NOTIFIER_HOST_VLAN_DEL: 1039 err = dsa_switch_host_vlan_del(ds, info); 1040 break; 1041 case DSA_NOTIFIER_MTU: 1042 err = dsa_switch_mtu(ds, info); 1043 break; 1044 case DSA_NOTIFIER_TAG_PROTO: 1045 err = dsa_switch_change_tag_proto(ds, info); 1046 break; 1047 case DSA_NOTIFIER_TAG_PROTO_CONNECT: 1048 err = dsa_switch_connect_tag_proto(ds, info); 1049 break; 1050 case DSA_NOTIFIER_TAG_PROTO_DISCONNECT: 1051 err = dsa_switch_disconnect_tag_proto(ds, info); 1052 break; 1053 case DSA_NOTIFIER_TAG_8021Q_VLAN_ADD: 1054 err = dsa_switch_tag_8021q_vlan_add(ds, info); 1055 break; 1056 case DSA_NOTIFIER_TAG_8021Q_VLAN_DEL: 1057 err = dsa_switch_tag_8021q_vlan_del(ds, info); 1058 break; 1059 case DSA_NOTIFIER_CONDUIT_STATE_CHANGE: 1060 err = dsa_switch_conduit_state_change(ds, info); 1061 break; 1062 default: 1063 err = -EOPNOTSUPP; 1064 break; 1065 } 1066 1067 if (err) 1068 dev_dbg(ds->dev, "breaking chain for DSA event %lu (%d)\n", 1069 event, err); 1070 1071 return notifier_from_errno(err); 1072 } 1073 1074 /** 1075 * dsa_tree_notify - Execute code for all switches in a DSA switch tree. 1076 * @dst: collection of struct dsa_switch devices to notify. 1077 * @e: event, must be of type DSA_NOTIFIER_* 1078 * @v: event-specific value. 1079 * 1080 * Given a struct dsa_switch_tree, this can be used to run a function once for 1081 * each member DSA switch. The other alternative of traversing the tree is only 1082 * through its ports list, which does not uniquely list the switches. 1083 */ 1084 int dsa_tree_notify(struct dsa_switch_tree *dst, unsigned long e, void *v) 1085 { 1086 struct raw_notifier_head *nh = &dst->nh; 1087 int err; 1088 1089 err = raw_notifier_call_chain(nh, e, v); 1090 1091 return notifier_to_errno(err); 1092 } 1093 1094 /** 1095 * dsa_broadcast - Notify all DSA trees in the system. 1096 * @e: event, must be of type DSA_NOTIFIER_* 1097 * @v: event-specific value. 1098 * 1099 * Can be used to notify the switching fabric of events such as cross-chip 1100 * bridging between disjoint trees (such as islands of tagger-compatible 1101 * switches bridged by an incompatible middle switch). 1102 * 1103 * WARNING: this function is not reliable during probe time, because probing 1104 * between trees is asynchronous and not all DSA trees might have probed. 1105 */ 1106 int dsa_broadcast(unsigned long e, void *v) 1107 { 1108 struct dsa_switch_tree *dst; 1109 int err = 0; 1110 1111 list_for_each_entry(dst, &dsa_tree_list, list) { 1112 err = dsa_tree_notify(dst, e, v); 1113 if (err) 1114 break; 1115 } 1116 1117 return err; 1118 } 1119 1120 int dsa_switch_register_notifier(struct dsa_switch *ds) 1121 { 1122 ds->nb.notifier_call = dsa_switch_event; 1123 1124 return raw_notifier_chain_register(&ds->dst->nh, &ds->nb); 1125 } 1126 1127 void dsa_switch_unregister_notifier(struct dsa_switch *ds) 1128 { 1129 int err; 1130 1131 err = raw_notifier_chain_unregister(&ds->dst->nh, &ds->nb); 1132 if (err) 1133 dev_err(ds->dev, "failed to unregister notifier (%d)\n", err); 1134 } 1135
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.