| Microchip Ocelot switch driver family |
| ===================================== |
| |
| Felix |
| ----- |
| |
| Currently the switches supported by the felix driver are: |
| |
| - VSC9959 (Felix) |
| - VSC9953 (Seville) |
| |
| The VSC9959 switch is found in the NXP LS1028A. It is a PCI device, part of the |
| larger ENETC root complex. As a result, the ethernet-switch node is a sub-node |
| of the PCIe root complex node and its "reg" property conforms to the parent |
| node bindings: |
| |
| * reg: Specifies PCIe Device Number and Function Number of the endpoint device, |
| in this case for the Ethernet L2Switch it is PF5 (of device 0, bus 0). |
| |
| It does not require a "compatible" string. |
| |
| The interrupt line is used to signal availability of PTP TX timestamps and for |
| TSN frame preemption. |
| |
| For the external switch ports, depending on board configuration, "phy-mode" and |
| "phy-handle" are populated by board specific device tree instances. Ports 4 and |
| 5 are fixed as internal ports in the NXP LS1028A instantiation. |
| |
| The CPU port property ("ethernet") configures the feature called "NPI port" in |
| the Ocelot hardware core. The CPU port in Ocelot is a set of queues, which are |
| connected, in the Node Processor Interface (NPI) mode, to an Ethernet port. |
| By default, in fsl-ls1028a.dtsi, the NPI port is assigned to the internal |
| 2.5Gbps port@4, but can be moved to the 1Gbps port@5, depending on the specific |
| use case. Moving the NPI port to an external switch port is hardware possible, |
| but there is no platform support for the Linux system on the LS1028A chip to |
| operate as an entire slave DSA chip. NPI functionality (and therefore DSA |
| tagging) is supported on a single port at a time. |
| |
| Any port can be disabled (and in fsl-ls1028a.dtsi, they are indeed all disabled |
| by default, and should be enabled on a per-board basis). But if any external |
| switch port is enabled at all, the ENETC PF2 (enetc_port2) should be enabled as |
| well, regardless of whether it is configured as the DSA master or not. This is |
| because the Felix PHYLINK implementation accesses the MAC PCS registers, which |
| in hardware truly belong to the ENETC port #2 and not to Felix. |
| |
| Supported PHY interface types (appropriate SerDes protocol setting changes are |
| needed in the RCW binary): |
| |
| * phy_mode = "internal": on ports 4 and 5 |
| * phy_mode = "sgmii": on ports 0, 1, 2, 3 |
| * phy_mode = "qsgmii": on ports 0, 1, 2, 3 |
| * phy_mode = "usxgmii": on ports 0, 1, 2, 3 |
| * phy_mode = "2500base-x": on ports 0, 1, 2, 3 |
| |
| For the rest of the device tree binding definitions, which are standard DSA and |
| PCI, refer to the following documents: |
| |
| Documentation/devicetree/bindings/net/dsa/dsa.txt |
| Documentation/devicetree/bindings/pci/pci.txt |
| |
| Example: |
| |
| &soc { |
| pcie@1f0000000 { /* Integrated Endpoint Root Complex */ |
| ethernet-switch@0,5 { |
| reg = <0x000500 0 0 0 0>; |
| /* IEP INT_B */ |
| interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>; |
| |
| ports { |
| #address-cells = <1>; |
| #size-cells = <0>; |
| |
| /* External ports */ |
| port@0 { |
| reg = <0>; |
| label = "swp0"; |
| }; |
| |
| port@1 { |
| reg = <1>; |
| label = "swp1"; |
| }; |
| |
| port@2 { |
| reg = <2>; |
| label = "swp2"; |
| }; |
| |
| port@3 { |
| reg = <3>; |
| label = "swp3"; |
| }; |
| |
| /* Tagging CPU port */ |
| port@4 { |
| reg = <4>; |
| ethernet = <&enetc_port2>; |
| phy-mode = "internal"; |
| |
| fixed-link { |
| speed = <2500>; |
| full-duplex; |
| }; |
| }; |
| |
| /* Non-tagging CPU port */ |
| port@5 { |
| reg = <5>; |
| phy-mode = "internal"; |
| status = "disabled"; |
| |
| fixed-link { |
| speed = <1000>; |
| full-duplex; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| |
| The VSC9953 switch is found inside NXP T1040. It is a platform device with the |
| following required properties: |
| |
| - compatible: |
| Must be "mscc,vsc9953-switch". |
| |
| Supported PHY interface types (appropriate SerDes protocol setting changes are |
| needed in the RCW binary): |
| |
| * phy_mode = "internal": on ports 8 and 9 |
| * phy_mode = "sgmii": on ports 0, 1, 2, 3, 4, 5, 6, 7 |
| * phy_mode = "qsgmii": on ports 0, 1, 2, 3, 4, 5, 6, 7 |
| |
| Example: |
| |
| &soc { |
| ethernet-switch@800000 { |
| #address-cells = <0x1>; |
| #size-cells = <0x0>; |
| compatible = "mscc,vsc9953-switch"; |
| little-endian; |
| reg = <0x800000 0x290000>; |
| |
| ports { |
| #address-cells = <0x1>; |
| #size-cells = <0x0>; |
| |
| port@0 { |
| reg = <0x0>; |
| label = "swp0"; |
| }; |
| |
| port@1 { |
| reg = <0x1>; |
| label = "swp1"; |
| }; |
| |
| port@2 { |
| reg = <0x2>; |
| label = "swp2"; |
| }; |
| |
| port@3 { |
| reg = <0x3>; |
| label = "swp3"; |
| }; |
| |
| port@4 { |
| reg = <0x4>; |
| label = "swp4"; |
| }; |
| |
| port@5 { |
| reg = <0x5>; |
| label = "swp5"; |
| }; |
| |
| port@6 { |
| reg = <0x6>; |
| label = "swp6"; |
| }; |
| |
| port@7 { |
| reg = <0x7>; |
| label = "swp7"; |
| }; |
| |
| port@8 { |
| reg = <0x8>; |
| phy-mode = "internal"; |
| ethernet = <&enet0>; |
| |
| fixed-link { |
| speed = <2500>; |
| full-duplex; |
| }; |
| }; |
| |
| port@9 { |
| reg = <0x9>; |
| phy-mode = "internal"; |
| status = "disabled"; |
| |
| fixed-link { |
| speed = <2500>; |
| full-duplex; |
| }; |
| }; |
| }; |
| }; |
| }; |