[PATCH v5 0/9] Introduce DSA Ethernet switch class and Felix driver

Vladimir Oltean olteanv at gmail.com
Tue Feb 16 22:19:27 CET 2021


From: Vladimir Oltean <vladimir.oltean at nxp.com>

DSA stands for Distributed Switch Architecture and it is a subsystem
introduced in the Linux kernel to support switches that:
- have an Ethernet link up to the CPU
- use some form of tagging to identify the source/destination port for
  Rx/Tx
- may be cascaded in tree-like structures.

DSA is described in depth here:
https://www.kernel.org/doc/Documentation/networking/dsa/dsa.txt

This patch set introduces a DSA class in U-Boot to support drivers of DSA
switches.  DSA drivers have to implement the following ops:
- enable/disable of switch ports,
- insert a tag in frames being transmitted, used by the switch to select
  the egress port,
- parse a tag in frames being received, used for Rx traffic.

DSA class code deals with presentation of switch ports as Ethernet
interfaces, deals with the master Ethernet device for I/O and helps with
parsing of the DT assuming the structure follows the DSA kernel binding.

Support for switch cascading is not included yet.

In the sandbox environment, the DSA sandbox driver, the switch ports and
master eth interface look like this:
=> dm tree
 Class     Index  Probed  Driver                Name
-----------------------------------------------------------
[...]
 eth           4  [ + ]   eth_sandbox           |-- dsa-test-eth
 dsa           0  [ + ]   dsa_sandbox           |-- dsa-test
 eth           5  [ + ]   dsa-port              |   |-- lan0
 eth           6  [ + ]   dsa-port              |   `-- lan1

=> setenv ethact lan1
=> ping 1.2.3.5
Using lan1 device
host 1.2.3.5 is alive
=>

This patch set also introduces a driver for the Ethernet switch integrated
into NXP LS1028A, called Felix.  The switch has 4 front panel ports, I/O
to/from it is done though an ENETC Ethernet interface and meta-data is
carried between the switch and the driver though an additional header
pre-pended to the original frame.
Network commands like tftp can be used on these front panel ports.  The
ports are disabled unless used so they do not cause issues on network
topologies that include loops.

Felix as seen on LS1028A RDB:
=> dm tree
 Class     Index  Probed  Driver                Name
-----------------------------------------------------------
[...]
 dsa           0  [ + ]   felix-switch          |   |-- felix-switch
 eth           4  [ + ]   dsa-port              |   |   |-- swp0
 eth           5  [ + ]   dsa-port              |   |   |-- swp1
 eth           6  [ + ]   dsa-port              |   |   |-- swp2
 eth           7  [ + ]   dsa-port              |   |   `-- swp3

=> mdio list
[...]
10 - Vitesse VSC8514 <--> swp0
11 - Vitesse VSC8514 <--> swp1
12 - Vitesse VSC8514 <--> swp2
13 - Vitesse VSC8514 <--> swp3

NOTE:
This patchset is a major rework of the dsa-class code since the last
submission from May 5th:
https://patchwork.ozlabs.org/project/uboot/cover/1588700588-8587-1-git-send-email-claudiu.manoil@nxp.com/
The basic concepts and data path operation (tagging) in the DSA class
code remain the same as in the initial patchset from Alex, however the
external API has been changed significantly (simplified), the driver
model integration has been improved to the point that the DSA class
code no longer needs to allocate extra memory internally (via malloc),
reduced memory footprint, internal state data moved from the external
API and internalized, cleaner external API, internal code reworked,
completely reworked DSA sandbox driver and unit tests for better coverage
and to integrate better with the eth sandbox driver and tests, etc.

v5:
Fix the DSA driver not probing in the sandbox, and the net_retry test
failing due to that:
- Made PHY_FIXED work with live OF.
- Made DSA user ports [ not just CPU ports as before ], and any other
  callers of dm_eth_phy_connect, work with fixed-link.

v4:
- Implemented the TODO for having a phy_device on the CPU port.
- Enabled CONFIG_PHY_FIXED which is a new dependency of CONFIG_DM_DSA.

v3:
- Removed all infrastructure associated with dsa_foreach_port, which
  is no longer needed.
- Only inherit the DSA master's MAC address if the environment does not
  already have a specific MAC address that should be used for the DSA
  port.
- Be compatible with the new "ethernet-ports" container name which has
  been introduced in the Linux kernel as commit 85e05d263ed2 ("net: dsa:
  of: Allow ethernet-ports as encapsulating node") in v5.9.
- Fixed the felix driver not getting its ports initialized, due to
  dsa_foreach_port() being actually unusable when called from the probe
  function of the DSA udevice - the eth port udevices are _not_ yet
  probed at that point. We are now initializing all ports from the
  .port_enable() callback of each eth udevice.
- Deleted the unit tests associated with the infrastructure for
  dsa_foreach_port, since that function no longer exists.
- Enabled the config options for the Kontron LS1028A board too.

v2: Switch node structure defined in dtsi now consistent with the Linux
switch node definition. Moved aliases from dtsi to the RDB dts to
minimize impact on other boards (and for improved flexibility).

Alex Marginean (3):
  drivers: net: add Felix DSA switch driver
  arm: dts: ls1028a: add Ethernet switch node and dependencies
  configs: ls1028a: enable the Ethernet switch driver

Claudiu Manoil (2):
  net: introduce DSA class for Ethernet switches
  sandbox: add a DSA sandbox driver and unit test

Vladimir Oltean (4):
  net: phy: fixed: be compatible with live OF tree
  net: phy: fixed: support speeds of 2500 and 10000
  net: phy: introduce fixed_phy_create for DSA CPU ports
  net: mdio: teach dm_eth_connect_phy_handle to connect to fixed PHY

 arch/Kconfig                                 |   2 +
 arch/arm/dts/fsl-ls1028a-rdb.dts             |  64 +++
 arch/arm/dts/fsl-ls1028a.dtsi                |  55 ++-
 arch/sandbox/dts/test.dts                    |  48 ++
 configs/kontron_sl28_defconfig               |   3 +
 configs/ls1028aqds_tfa_SECURE_BOOT_defconfig |   3 +
 configs/ls1028aqds_tfa_defconfig             |   3 +
 configs/ls1028ardb_tfa_SECURE_BOOT_defconfig |   3 +
 configs/ls1028ardb_tfa_defconfig             |   3 +
 drivers/net/Kconfig                          |  24 +
 drivers/net/Makefile                         |   1 +
 drivers/net/dsa_sandbox.c                    | 179 +++++++
 drivers/net/fsl_enetc.h                      |   5 +
 drivers/net/mscc_eswitch/Kconfig             |   8 +
 drivers/net/mscc_eswitch/Makefile            |   1 +
 drivers/net/mscc_eswitch/felix_switch.c      | 414 ++++++++++++++++
 drivers/net/phy/fixed.c                      |  34 +-
 drivers/net/phy/phy.c                        |  59 ++-
 include/configs/sandbox.h                    |   2 +
 include/dm/uclass-id.h                       |   1 +
 include/net.h                                |   6 +
 include/net/dsa.h                            | 165 +++++++
 include/phy.h                                |  21 +
 net/Makefile                                 |   1 +
 net/dsa-uclass.c                             | 478 +++++++++++++++++++
 net/mdio-uclass.c                            |  12 +-
 test/dm/Makefile                             |   1 +
 test/dm/dsa.c                                |  82 ++++
 test/dm/eth.c                                |  10 +-
 29 files changed, 1660 insertions(+), 28 deletions(-)
 create mode 100644 drivers/net/dsa_sandbox.c
 create mode 100644 drivers/net/mscc_eswitch/felix_switch.c
 create mode 100644 include/net/dsa.h
 create mode 100644 net/dsa-uclass.c
 create mode 100644 test/dm/dsa.c

-- 
2.25.1



More information about the U-Boot mailing list