chip.c (41fb0cf1bced59c1fe178cf6cc9f716b5da9e40e) | chip.c (d3eed0e57d5d1bcbf1bd60f83a4adfe7d7b8dd9c) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Marvell 88e6xxx Ethernet switch single-chip support 4 * 5 * Copyright (c) 2008 Marvell Semiconductor 6 * 7 * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch> 8 * --- 2396 unchanged lines hidden (view full) --- 2405 mv88e6xxx_reg_lock(chip); 2406 err = mv88e6xxx_port_db_dump(chip, port, cb, data); 2407 mv88e6xxx_reg_unlock(chip); 2408 2409 return err; 2410} 2411 2412static int mv88e6xxx_bridge_map(struct mv88e6xxx_chip *chip, | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Marvell 88e6xxx Ethernet switch single-chip support 4 * 5 * Copyright (c) 2008 Marvell Semiconductor 6 * 7 * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch> 8 * --- 2396 unchanged lines hidden (view full) --- 2405 mv88e6xxx_reg_lock(chip); 2406 err = mv88e6xxx_port_db_dump(chip, port, cb, data); 2407 mv88e6xxx_reg_unlock(chip); 2408 2409 return err; 2410} 2411 2412static int mv88e6xxx_bridge_map(struct mv88e6xxx_chip *chip, |
2413 struct net_device *br) | 2413 struct dsa_bridge bridge) |
2414{ 2415 struct dsa_switch *ds = chip->ds; 2416 struct dsa_switch_tree *dst = ds->dst; 2417 struct dsa_port *dp; 2418 int err; 2419 2420 list_for_each_entry(dp, &dst->ports, list) { | 2414{ 2415 struct dsa_switch *ds = chip->ds; 2416 struct dsa_switch_tree *dst = ds->dst; 2417 struct dsa_port *dp; 2418 int err; 2419 2420 list_for_each_entry(dp, &dst->ports, list) { |
2421 if (dsa_port_bridge_dev_get(dp) == br) { | 2421 if (dsa_port_offloads_bridge(dp, &bridge)) { |
2422 if (dp->ds == ds) { 2423 /* This is a local bridge group member, 2424 * remap its Port VLAN Map. 2425 */ 2426 err = mv88e6xxx_port_vlan_map(chip, dp->index); 2427 if (err) 2428 return err; 2429 } else { --- 7 unchanged lines hidden (view full) --- 2437 } 2438 } 2439 } 2440 2441 return 0; 2442} 2443 2444static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, | 2422 if (dp->ds == ds) { 2423 /* This is a local bridge group member, 2424 * remap its Port VLAN Map. 2425 */ 2426 err = mv88e6xxx_port_vlan_map(chip, dp->index); 2427 if (err) 2428 return err; 2429 } else { --- 7 unchanged lines hidden (view full) --- 2437 } 2438 } 2439 } 2440 2441 return 0; 2442} 2443 2444static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, |
2445 struct net_device *br) | 2445 struct dsa_bridge bridge) |
2446{ 2447 struct mv88e6xxx_chip *chip = ds->priv; 2448 int err; 2449 2450 mv88e6xxx_reg_lock(chip); 2451 | 2446{ 2447 struct mv88e6xxx_chip *chip = ds->priv; 2448 int err; 2449 2450 mv88e6xxx_reg_lock(chip); 2451 |
2452 err = mv88e6xxx_bridge_map(chip, br); | 2452 err = mv88e6xxx_bridge_map(chip, bridge); |
2453 if (err) 2454 goto unlock; 2455 2456 err = mv88e6xxx_port_commit_pvid(chip, port); 2457 if (err) 2458 goto unlock; 2459 2460unlock: 2461 mv88e6xxx_reg_unlock(chip); 2462 2463 return err; 2464} 2465 2466static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port, | 2453 if (err) 2454 goto unlock; 2455 2456 err = mv88e6xxx_port_commit_pvid(chip, port); 2457 if (err) 2458 goto unlock; 2459 2460unlock: 2461 mv88e6xxx_reg_unlock(chip); 2462 2463 return err; 2464} 2465 2466static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port, |
2467 struct net_device *br) | 2467 struct dsa_bridge bridge) |
2468{ 2469 struct mv88e6xxx_chip *chip = ds->priv; 2470 int err; 2471 2472 mv88e6xxx_reg_lock(chip); 2473 | 2468{ 2469 struct mv88e6xxx_chip *chip = ds->priv; 2470 int err; 2471 2472 mv88e6xxx_reg_lock(chip); 2473 |
2474 if (mv88e6xxx_bridge_map(chip, br) || | 2474 if (mv88e6xxx_bridge_map(chip, bridge) || |
2475 mv88e6xxx_port_vlan_map(chip, port)) 2476 dev_err(ds->dev, "failed to remap in-chip Port VLAN\n"); 2477 2478 err = mv88e6xxx_port_commit_pvid(chip, port); 2479 if (err) 2480 dev_err(ds->dev, 2481 "port %d failed to restore standalone pvid: %pe\n", 2482 port, ERR_PTR(err)); 2483 2484 mv88e6xxx_reg_unlock(chip); 2485} 2486 2487static int mv88e6xxx_crosschip_bridge_join(struct dsa_switch *ds, 2488 int tree_index, int sw_index, | 2475 mv88e6xxx_port_vlan_map(chip, port)) 2476 dev_err(ds->dev, "failed to remap in-chip Port VLAN\n"); 2477 2478 err = mv88e6xxx_port_commit_pvid(chip, port); 2479 if (err) 2480 dev_err(ds->dev, 2481 "port %d failed to restore standalone pvid: %pe\n", 2482 port, ERR_PTR(err)); 2483 2484 mv88e6xxx_reg_unlock(chip); 2485} 2486 2487static int mv88e6xxx_crosschip_bridge_join(struct dsa_switch *ds, 2488 int tree_index, int sw_index, |
2489 int port, struct net_device *br) | 2489 int port, struct dsa_bridge bridge) |
2490{ 2491 struct mv88e6xxx_chip *chip = ds->priv; 2492 int err; 2493 2494 if (tree_index != ds->dst->index) 2495 return 0; 2496 2497 mv88e6xxx_reg_lock(chip); 2498 err = mv88e6xxx_pvt_map(chip, sw_index, port); 2499 mv88e6xxx_reg_unlock(chip); 2500 2501 return err; 2502} 2503 2504static void mv88e6xxx_crosschip_bridge_leave(struct dsa_switch *ds, 2505 int tree_index, int sw_index, | 2490{ 2491 struct mv88e6xxx_chip *chip = ds->priv; 2492 int err; 2493 2494 if (tree_index != ds->dst->index) 2495 return 0; 2496 2497 mv88e6xxx_reg_lock(chip); 2498 err = mv88e6xxx_pvt_map(chip, sw_index, port); 2499 mv88e6xxx_reg_unlock(chip); 2500 2501 return err; 2502} 2503 2504static void mv88e6xxx_crosschip_bridge_leave(struct dsa_switch *ds, 2505 int tree_index, int sw_index, |
2506 int port, struct net_device *br) | 2506 int port, struct dsa_bridge bridge) |
2507{ 2508 struct mv88e6xxx_chip *chip = ds->priv; 2509 2510 if (tree_index != ds->dst->index) 2511 return; 2512 2513 mv88e6xxx_reg_lock(chip); 2514 if (mv88e6xxx_pvt_map(chip, sw_index, port)) --- 15 unchanged lines hidden (view full) --- 2530 mv88e6xxx_reg_lock(chip); 2531 err = mv88e6xxx_pvt_map(chip, dev, 0); 2532 mv88e6xxx_reg_unlock(chip); 2533 2534 return err; 2535} 2536 2537static int mv88e6xxx_bridge_tx_fwd_offload(struct dsa_switch *ds, int port, | 2507{ 2508 struct mv88e6xxx_chip *chip = ds->priv; 2509 2510 if (tree_index != ds->dst->index) 2511 return; 2512 2513 mv88e6xxx_reg_lock(chip); 2514 if (mv88e6xxx_pvt_map(chip, sw_index, port)) --- 15 unchanged lines hidden (view full) --- 2530 mv88e6xxx_reg_lock(chip); 2531 err = mv88e6xxx_pvt_map(chip, dev, 0); 2532 mv88e6xxx_reg_unlock(chip); 2533 2534 return err; 2535} 2536 2537static int mv88e6xxx_bridge_tx_fwd_offload(struct dsa_switch *ds, int port, |
2538 struct net_device *br, 2539 unsigned int bridge_num) | 2538 struct dsa_bridge bridge) |
2540{ | 2539{ |
2541 return mv88e6xxx_map_virtual_bridge_to_pvt(ds, bridge_num); | 2540 return mv88e6xxx_map_virtual_bridge_to_pvt(ds, bridge.num); |
2542} 2543 2544static void mv88e6xxx_bridge_tx_fwd_unoffload(struct dsa_switch *ds, int port, | 2541} 2542 2543static void mv88e6xxx_bridge_tx_fwd_unoffload(struct dsa_switch *ds, int port, |
2545 struct net_device *br, 2546 unsigned int bridge_num) | 2544 struct dsa_bridge bridge) |
2547{ 2548 int err; 2549 | 2545{ 2546 int err; 2547 |
2550 err = mv88e6xxx_map_virtual_bridge_to_pvt(ds, bridge_num); | 2548 err = mv88e6xxx_map_virtual_bridge_to_pvt(ds, bridge.num); |
2551 if (err) { 2552 dev_err(ds->dev, "failed to remap cross-chip Port VLAN: %pe\n", 2553 ERR_PTR(err)); 2554 } 2555} 2556 2557static int mv88e6xxx_software_reset(struct mv88e6xxx_chip *chip) 2558{ --- 4011 unchanged lines hidden --- | 2549 if (err) { 2550 dev_err(ds->dev, "failed to remap cross-chip Port VLAN: %pe\n", 2551 ERR_PTR(err)); 2552 } 2553} 2554 2555static int mv88e6xxx_software_reset(struct mv88e6xxx_chip *chip) 2556{ --- 4011 unchanged lines hidden --- |