Re: [PATCH net-next 17/17] dt-bindings: net: dsa: Add documentation for NXP SJA1105 driver
From: Vladimir Oltean
Date: Wed Apr 03 2019 - 05:53:20 EST
On 4/3/19 12:38 AM, Andrew Lunn wrote:
+Optional properties:
+
+- sja1105,mac-mode, sja1105,phy-mode: Boolean properties that can be assigned
+ under each port node that is MII or RMII (has no effect for RGMII). By
+ default (unless otherwise specified) a port is configured as MAC if it is
+ driving a PHY (phy-handle is present) or as PHY if it is PHY-less (fixed-link
+ specified, presumably because it is connected to a MAC). These properties
+ are required in the case where SJA1105 ports are at both ends of an MII/RMII
+ PHY-less setup. One end would need to have sja1105,mac-mode, while the other
+ sja1105,phy-mode.
Hi Vladimir
phy-mode has a well known meaning, indicating mii, gmii, sqmii, rmii,
rxaud, etc.
The meaning here is quite different. To maybe avoid confusion, could
we flip the name around?
sja1105,mode-mac and sja1105,mode-phy?
Hi Andrew,
I agree the clash of words is confusing.
Which one of "sja1105,mode-phy", "sja1105,type-phy", "sja1105,role-phy"
sounds easier to digest?
+ port@4 {
+ /* Internal port connected to eth2 */
+ ethernet = <&enet2>;
+ phy-mode = "rgmii";
+ reg = <4>;
+ /* Implicit "sja1105,phy-mode;" */
+ fixed-link {
+ speed = <1000>;
+ full-duplex;
+ };
+ };
+ };
+ };
+};
+&enet2 {
+ phy-connection-type = "rgmii";
You don't see this used much, phy-mode is preferred. Do you have a
reason for this?
No particular reason for using phy-connection-type. It is just a
copy-pasta from the (not yet submitted) ls1021a-tsn.dts that I'm using
to test the driver on.
The other LS1021A DTS files were already using this notation, so that's
how it got there. But the gianfar driver works just as well with
phy-mode, so maybe I will send another patch for converting the existing
notations when I submit the new board DTS too.
Also, you have the MAC using RGMII and the port using RGMII. Neither
is inserting delays. That implies the delays are added by the track
layout of the PCB. It would be good to add a comment about
this. Anybody copying this using a design without the delays via PCB
are probably going to get it wrong to start with and not realise they
need to change one end to RGMII-ID.
You've hit the nail on the head with this excellent comment.
So the second-generation switches (P/Q/R/S) have addressed this hardware
limitation and do provide some tunable delay lines for RGMII.
But on the LS1021A-TSN, which is using a first-generation T chip, the
RGMII delays for correct sample/hold times are obtained through ~50cm
copper wires, since the LS1021 cannot apply them internally either.
https://www.nxp.com/docs/en/data-sheet/SJA1105.pdf
Section 6.2.3 RGMII signaling and encoding
Note that RGMII requires an external delay of between 1.5 ns and 2 ns
on TXC and RXC.
So it sounds like the switch only supports PHY_INTERFACE_MODE_RGMII.
If the port is in MAC mode, you should pass this phy-mode to the PHY
when you connect to it. The PHY can then add the delay if needed.
If however, the port is in PHY mode, and it is asked to do RGMII other
than PHY_INTERFACE_MODE_RGMII, you should report an error. It cannot
do it.
I expect that next week I will be able to get a reworked LS1021A-TSN
board with a second-generation switch, and the delay wires removed.
Using that, I can at least add support for the tunable delay lines in a
fashion similar to what you're suggesting.
But since you brought this up, let me point out some complications I see:
* I think the way this works is that phy_attach_direct populates
phydev->interface based on the MAC's DT bindings. Then the PHY driver is
supposed to apply internal delays based on that. But this shadows the
MAC's own ability to add internal delays based on the same DT bindings.
You told me to pass the internal delay settings to the PHY if
"sja1105,mode-mac" is (implicitly or explicitly) specified, or otherwise
("sja1105,mode-phy"), take the internal delay settings and apply them
myself (if the switch revision supports this). But in the latter case,
should I mask off the RGMII_*ID modes and convert everything to RGMII
when doing the of_phy_connect (to ensure that at the other end nobody
will add the internal delays twice)? I know the theory but I have never
actually seen a MAC driver apply the internal delay settings. And even
in my case I'm a bit surprised that there isn't a more generic mechanism
to specify this and that I have to rely on custom DT bindings.
* The 2 groups of devices (E, T, P, Q) and (R, S) are pin-compatible
with one another, and in principle hot-swappable. Initially I had
explicit "compatible" properties for each device model, but with the
code for device_id detection, this became a bit redundant so I just made
everything "nxp,sja1105". But with the different RGMII internal delay
capabilities, and later on with SGMII support (R, S), some differences
at the DT level will become apparent. For example my T -> Q swap on the
LS1021A-TSN board will require a DT change for the internal delay
settings. How should I handle the "compatible" property for this driver?
Thanks
Andrew
Thank you,
-Vladimir