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 ---