Message ID | 20161217182119.4037-3-martin.blumenstingl@googlemail.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Sat, 17 Dec 2016 19:21:19 +0100 > Prior to this patch we were using a hardcoded RGMII TX clock delay of > 2ns (= 1/4 cycle of the 125MHz RGMII TX clock). This value works for > many boards, but unfortunately not for all (due to the way the actual > circuit is designed, sometimes because the TX delay is enabled in the > PHY, etc.). Making the TX delay on the MAC side configurable allows us > to support all possible hardware combinations. > > This allows fixing a compatibility issue on some boards, where the > RTL8211F PHY is configured to generate the TX delay. We can now turn > off the TX delay in the MAC, because otherwise we would be applying the > delay twice (which results in non-working TX traffic). > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > Tested-by: Neil Armstrong <narmstrong@baylibre.com> Is this really the safest thing to do? If you say the existing hard-coded setting of 1/4 cycle works on most boards, and what you're trying to do is override it with an OF property value for boards where the existing setting does not work, then you _must_ use a default value that corresponds to what the existing code does not when you don't see this new OF property. So please retain the current behavior of the 1/4 cycle TX delay setting when you don't see the amlogic,tx-delay-ns property. I really think you risk breaking existing boards by not doing so, unless you can have this patch tested on every such board that exists and I don't think you really can feasibly and rigorously do that. Thanks.
On Sun, Dec 18, 2016 at 4:49 PM, David Miller <davem@davemloft.net> wrote: > From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > Date: Sat, 17 Dec 2016 19:21:19 +0100 > >> Prior to this patch we were using a hardcoded RGMII TX clock delay of >> 2ns (= 1/4 cycle of the 125MHz RGMII TX clock). This value works for >> many boards, but unfortunately not for all (due to the way the actual >> circuit is designed, sometimes because the TX delay is enabled in the >> PHY, etc.). Making the TX delay on the MAC side configurable allows us >> to support all possible hardware combinations. >> >> This allows fixing a compatibility issue on some boards, where the >> RTL8211F PHY is configured to generate the TX delay. We can now turn >> off the TX delay in the MAC, because otherwise we would be applying the >> delay twice (which results in non-working TX traffic). >> >> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >> Tested-by: Neil Armstrong <narmstrong@baylibre.com> > > Is this really the safest thing to do? > > If you say the existing hard-coded setting of 1/4 cycle works on most > boards, and what you're trying to do is override it with an OF > property value for boards where the existing setting does not work, > then you _must_ use a default value that corresponds to what the > existing code does not when you don't see this new OF property. it's a bit more complicated in reality: 1/4 cycle works when the TX delay of the RTL8211F PHY is turned off (until recently it was always enabled for phy-mode RGMII). > So please retain the current behavior of the 1/4 cycle TX delay > setting when you don't see the amlogic,tx-delay-ns property. > > I really think you risk breaking existing boards by not doing so, > unless you can have this patch tested on every such board that exists > and I don't think you really can feasibly and rigorously do that. there's a patch in my follow-up series which adds the 2ns to the .dts for all RGMII based boards: [0] (and I would keep these even if we had a default value, just to make it explicit and thus easier to understand for other people). however, we can add the 2ns default back (I can do this if you want - Rob Herring was unhappy with the missing documentation of this default value [1] - so note to myself: take care of that as well). but then we have to decide when to apply this default value: only when we're in RGMII mode or also in any of the RGMII_*ID modes? please let me know how we should proceed Regards, Martin [0] http://lists.infradead.org/pipermail/linux-amlogic/2016-December/001838.html [1] http://lists.infradead.org/pipermail/linux-amlogic/2016-November/001817.html
Hi David, On Sun, Dec 18, 2016 at 5:13 PM, Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote: > On Sun, Dec 18, 2016 at 4:49 PM, David Miller <davem@davemloft.net> wrote: >> From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >> Date: Sat, 17 Dec 2016 19:21:19 +0100 >> >>> Prior to this patch we were using a hardcoded RGMII TX clock delay of >>> 2ns (= 1/4 cycle of the 125MHz RGMII TX clock). This value works for >>> many boards, but unfortunately not for all (due to the way the actual >>> circuit is designed, sometimes because the TX delay is enabled in the >>> PHY, etc.). Making the TX delay on the MAC side configurable allows us >>> to support all possible hardware combinations. >>> >>> This allows fixing a compatibility issue on some boards, where the >>> RTL8211F PHY is configured to generate the TX delay. We can now turn >>> off the TX delay in the MAC, because otherwise we would be applying the >>> delay twice (which results in non-working TX traffic). >>> >>> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >>> Tested-by: Neil Armstrong <narmstrong@baylibre.com> >> >> Is this really the safest thing to do? >> >> If you say the existing hard-coded setting of 1/4 cycle works on most >> boards, and what you're trying to do is override it with an OF >> property value for boards where the existing setting does not work, >> then you _must_ use a default value that corresponds to what the >> existing code does not when you don't see this new OF property. > it's a bit more complicated in reality: 1/4 cycle works when the TX > delay of the RTL8211F PHY is turned off (until recently it was always > enabled for phy-mode RGMII). > >> So please retain the current behavior of the 1/4 cycle TX delay >> setting when you don't see the amlogic,tx-delay-ns property. >> >> I really think you risk breaking existing boards by not doing so, >> unless you can have this patch tested on every such board that exists >> and I don't think you really can feasibly and rigorously do that. > there's a patch in my follow-up series which adds the 2ns to the .dts > for all RGMII based boards: [0] (and I would keep these even if we had > a default value, just to make it explicit and thus easier to > understand for other people). > however, we can add the 2ns default back (I can do this if you want - > Rob Herring was unhappy with the missing documentation of this default > value [1] - so note to myself: take care of that as well). but then we > have to decide when to apply this default value: only when we're in > RGMII mode or also in any of the RGMII_*ID modes? > > please let me know how we should proceed gentle ping - what is your opinion on this? Regards, Martin
Hi David, On Sun, Dec 18, 2016 at 5:13 PM, Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote: > On Sun, Dec 18, 2016 at 4:49 PM, David Miller <davem@davemloft.net> wrote: >> From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >> Date: Sat, 17 Dec 2016 19:21:19 +0100 >> >>> Prior to this patch we were using a hardcoded RGMII TX clock delay of >>> 2ns (= 1/4 cycle of the 125MHz RGMII TX clock). This value works for >>> many boards, but unfortunately not for all (due to the way the actual >>> circuit is designed, sometimes because the TX delay is enabled in the >>> PHY, etc.). Making the TX delay on the MAC side configurable allows us >>> to support all possible hardware combinations. >>> >>> This allows fixing a compatibility issue on some boards, where the >>> RTL8211F PHY is configured to generate the TX delay. We can now turn >>> off the TX delay in the MAC, because otherwise we would be applying the >>> delay twice (which results in non-working TX traffic). >>> >>> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >>> Tested-by: Neil Armstrong <narmstrong@baylibre.com> >> >> Is this really the safest thing to do? >> >> If you say the existing hard-coded setting of 1/4 cycle works on most >> boards, and what you're trying to do is override it with an OF >> property value for boards where the existing setting does not work, >> then you _must_ use a default value that corresponds to what the >> existing code does not when you don't see this new OF property. > it's a bit more complicated in reality: 1/4 cycle works when the TX > delay of the RTL8211F PHY is turned off (until recently it was always > enabled for phy-mode RGMII). > >> So please retain the current behavior of the 1/4 cycle TX delay >> setting when you don't see the amlogic,tx-delay-ns property. >> >> I really think you risk breaking existing boards by not doing so, >> unless you can have this patch tested on every such board that exists >> and I don't think you really can feasibly and rigorously do that. > there's a patch in my follow-up series which adds the 2ns to the .dts > for all RGMII based boards: [0] (and I would keep these even if we had > a default value, just to make it explicit and thus easier to > understand for other people). > however, we can add the 2ns default back (I can do this if you want - > Rob Herring was unhappy with the missing documentation of this default > value [1] - so note to myself: take care of that as well). but then we > have to decide when to apply this default value: only when we're in > RGMII mode or also in any of the RGMII_*ID modes? could you please let me know if I should add a a fallback (2ns which was the old hardcoded value) to the driver or if I should simply leave it out (that's the way it is right now). I'm fine with either way, I would just like to avoid duplicate work. So please let me know how you prefer it. Regards, Martin
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index ffaed1f35efe..db970cd6600f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -35,10 +35,6 @@ #define PRG_ETH0_TXDLY_SHIFT 5 #define PRG_ETH0_TXDLY_MASK GENMASK(6, 5) -#define PRG_ETH0_TXDLY_OFF (0x0 << PRG_ETH0_TXDLY_SHIFT) -#define PRG_ETH0_TXDLY_QUARTER (0x1 << PRG_ETH0_TXDLY_SHIFT) -#define PRG_ETH0_TXDLY_HALF (0x2 << PRG_ETH0_TXDLY_SHIFT) -#define PRG_ETH0_TXDLY_THREE_QUARTERS (0x3 << PRG_ETH0_TXDLY_SHIFT) /* divider for the result of m250_sel */ #define PRG_ETH0_CLK_M250_DIV_SHIFT 7 @@ -69,6 +65,8 @@ struct meson8b_dwmac { struct clk_divider m25_div; struct clk *m25_div_clk; + + u32 tx_delay_ns; }; static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, @@ -179,6 +177,7 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) { int ret; unsigned long clk_rate; + u8 tx_dly_val; switch (dwmac->phy_mode) { case PHY_INTERFACE_MODE_RGMII: @@ -196,9 +195,13 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_INVERTED_RMII_CLK, 0); - /* TX clock delay - all known boards use a 1/4 cycle delay */ + /* TX clock delay in ns = "8ns / 4 * tx_dly_val" (where + * 8ns are exactly one cycle of the 125MHz RGMII TX clock): + * 0ns = 0x0, 2ns = 0x1, 4ns = 0x2, 6ns = 0x3 + */ + tx_dly_val = dwmac->tx_delay_ns >> 1; meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, - PRG_ETH0_TXDLY_QUARTER); + tx_dly_val << PRG_ETH0_TXDLY_SHIFT); break; case PHY_INTERFACE_MODE_RMII: @@ -282,6 +285,12 @@ static int meson8b_dwmac_probe(struct platform_device *pdev) dev_err(&pdev->dev, "missing phy-mode property\n"); ret = -EINVAL; goto err_remove_config_dt; + } else if (dwmac->phy_mode != PHY_INTERFACE_MODE_RMII) { + /* ignore errors as this is an optional property - by default + * we assume a TX delay of 0ns. + */ + of_property_read_u32(pdev->dev.of_node, "amlogic,tx-delay-ns", + &dwmac->tx_delay_ns); } ret = meson8b_init_clk(dwmac);