mbox series

[v6,00/11] net: stmmac: dwmac-sun8i: Handle integrated PHY

Message ID 20170927073414.17361-1-clabbe.montjoie@gmail.com
Headers show
Series net: stmmac: dwmac-sun8i: Handle integrated PHY | expand

Message

Corentin Labbe Sept. 27, 2017, 7:34 a.m. UTC
Hello

The current way to find if the PHY is internal is to compare DT phy-mode
and emac_variant/internal_phy.
But it will negate a possible future SoC where an external PHY use the
same phy mode than the integrated one.

This patchs series adds a new way to find if the PHY is integrated, via
the phy-is-integrated DT property.

Since it exists both integrated and external ethernet-phy@1, they are merged in
the final DTB and so share all properties.
For avoiding this, and better represent the reality, we use a MDIO mux.

The first try was to create a new MDIO mux "mdio-mux-syscon".
mdio-mux-syscon working the same way than mdio-mux-mmioreg with the exception
that the register is used via syscon/regmap.
But this solution does not work for two reason:
- changing the MDIO selection need the reset of MAC which cannot be done by the
        mdio-mux-syscon driver
- There were driver loading order problem:
        - mdio-mux-syscon needing that stmmac register the parent MDIO
        - stmmac needing that child MDIO was registered just after registering parent MDIO

So we cannot use any external MDIO-mux.

The final solution was to represent a mdio-mux and let the MAC handle all things.
Note that phy-is-integrated is still needed (even if we use a MDIO mux) since
some properties apply only on integrated PHY and we need to know the final MDIO
bus in mdio_mux_syscon_switch_fn().

Since DT bits was reverted in 4.13, this patch series include the revert of the revert.
So
- the first four patchs bring back DT/stmmac stuff that was in 4.13 (and reverted)
- fifth patch document how DT MDIO mux is implemented
- patch 6 and 7 modify DT
- patch 8, 9, 10 Modify stmmac according to the new bindings

I have let patch splited for easy review. (for seeing what's new)
But the final serie could have some patch squashed if someone want.
Like squashing patch and 2 and 5 (documentation)

Since DT worked well in 4.13, could it be targeted for 4.14 ?
If necessary I could split this serie in two:
- bring back A64/A83T (patchs 1, 2, 4, 7, 9)
- add MXIO-mux and H3 (patchs 3, 4, 5, 6, 8, 10)

Regards

Changes since v5:
- reordered patch 1 and 2
- mdio-mux node is now a mdio's child
- added patch 11 for removing unnecessary scan of mdio-mux

Changes since v4:
- Update documentation for new bindings
- Added 4 patchs for bring back reverted stuff of 4.13
- dwmac-sun8i now handle mdio-mux
- MDIO use now compatible = "snps,dwmac-mdio";

Changes since v3:
- Added a patch for handling fixed-link
- Updated documentation

Changes since v2:
- Add a MDIO mux for creating distinction between integrated and external MDIO.
- phy-is-integrated is not set in dtsi.

Changes since v1:
- Dropped phy-is-integrated documentation patch since another same patch was already merged
- Moved phy-is-integrated from SoC dtsi to final board DT.

Corentin Labbe (11):
  dt-bindings: net: Restore sun8i dwmac binding
  arm: dts: sunxi: Restore EMAC changes
  arm64: dts: allwinner: Restore EMAC changes
  net: stmmac: sun8i: Restore the compatibles
  dt-bindings: net: dwmac-sun8i: update documentation about integrated
    PHY
  ARM: dts: sunxi: h3/h5: represent the mdio switch used by
    sun8i-h3-emac
  arm64: dts: allwinner: add snps,dwmac-mdio compatible to emac/mdio
  net: stmmac: snps,dwmac-mdio MDIOs are automatically registered
  net: stmmac: dwmac-sun8i: choose internal PHY via phy-is-integrated
  net: stmmac: dwmac-sun8i: Handle integrated/external MDIOs
  of: mdio: Prevent of_mdiobus_register from scanning mdio-mux nodes

 .../devicetree/bindings/net/dwmac-sun8i.txt        | 198 +++++++++++++++++++++
 arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts  |   9 +
 arch/arm/boot/dts/sun8i-h3-bananapi-m2-plus.dts    |  19 ++
 arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts          |   7 +
 arch/arm/boot/dts/sun8i-h3-orangepi-2.dts          |   8 +
 arch/arm/boot/dts/sun8i-h3-orangepi-one.dts        |   8 +
 arch/arm/boot/dts/sun8i-h3-orangepi-pc-plus.dts    |   5 +
 arch/arm/boot/dts/sun8i-h3-orangepi-pc.dts         |   8 +
 arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts       |  22 +++
 arch/arm/boot/dts/sun8i-h3-orangepi-plus2e.dts     |  16 ++
 arch/arm/boot/dts/sunxi-h3-h5.dtsi                 |  45 +++++
 .../boot/dts/allwinner/sun50i-a64-bananapi-m64.dts |  16 ++
 .../boot/dts/allwinner/sun50i-a64-pine64-plus.dts  |  15 ++
 .../arm64/boot/dts/allwinner/sun50i-a64-pine64.dts |  17 ++
 .../dts/allwinner/sun50i-a64-sopine-baseboard.dts  |  16 ++
 arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi      |  21 +++
 .../boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts   |  17 ++
 .../boot/dts/allwinner/sun50i-h5-orangepi-pc2.dts  |  17 ++
 .../dts/allwinner/sun50i-h5-orangepi-prime.dts     |  17 ++
 drivers/net/ethernet/stmicro/stmmac/Kconfig        |   1 +
 drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c  | 140 ++++++++++++---
 .../net/ethernet/stmicro/stmmac/stmmac_platform.c  |   4 -
 drivers/of/of_mdio.c                               |  10 ++
 23 files changed, 611 insertions(+), 25 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/dwmac-sun8i.txt

Comments

Maxime Ripard Sept. 27, 2017, 10:16 a.m. UTC | #1
On Wed, Sep 27, 2017 at 07:34:09AM +0000, Corentin Labbe wrote:
> Since dwmac-sun8i could use either an integrated PHY or an external PHY
> (which could be at same MDIO address), we need to represent this selection
> by a MDIO switch.
> 
> Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com>
> ---
>  arch/arm/boot/dts/sunxi-h3-h5.dtsi | 31 +++++++++++++++++++++++++------
>  1 file changed, 25 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm/boot/dts/sunxi-h3-h5.dtsi b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
> index 3b7d953429a6..a8e9b8f378ba 100644
> --- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi
> +++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
> @@ -422,14 +422,33 @@
>  			#size-cells = <0>;
>  			status = "disabled";
>  
> -			mdio: mdio {
> +			mdio0: mdio {
>  				#address-cells = <1>;
>  				#size-cells = <0>;
> -				int_mii_phy: ethernet-phy@1 {
> -					compatible = "ethernet-phy-ieee802.3-c22";
> -					reg = <1>;
> -					clocks = <&ccu CLK_BUS_EPHY>;
> -					resets = <&ccu RST_BUS_EPHY>;
> +				compatible = "snps,dwmac-mdio";
> +
> +				mdio-mux {
> +					compatible = "mdio-mux";
> +					#address-cells = <1>;
> +					#size-cells = <0>;

Newline

> +					/* Only one MDIO is usable at the time */
> +					internal_mdio: mdio@1 {
> +						reg = <1>;
> +						#address-cells = <1>;
> +						#size-cells = <0>;

Newline

> +						int_mii_phy: ethernet-phy@1 {
> +							compatible = "ethernet-phy-ieee802.3-c22";
> +							reg = <1>;
> +							clocks = <&ccu CLK_BUS_EPHY>;
> +							resets = <&ccu RST_BUS_EPHY>;
> +							phy-is-integrated;
> +						};
> +					};

Newline

> +					mdio: mdio@2 {

This is quite confusing. Why not call the label external_mdio?

Thanks
Corentin Labbe Sept. 27, 2017, 1:47 p.m. UTC | #2
On Wed, Sep 27, 2017 at 12:16:22PM +0200, Maxime Ripard wrote:
> On Wed, Sep 27, 2017 at 07:34:09AM +0000, Corentin Labbe wrote:
> > Since dwmac-sun8i could use either an integrated PHY or an external PHY
> > (which could be at same MDIO address), we need to represent this selection
> > by a MDIO switch.
> > 
> > Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com>
> > ---
> >  arch/arm/boot/dts/sunxi-h3-h5.dtsi | 31 +++++++++++++++++++++++++------
> >  1 file changed, 25 insertions(+), 6 deletions(-)
> > 
> > diff --git a/arch/arm/boot/dts/sunxi-h3-h5.dtsi b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
> > index 3b7d953429a6..a8e9b8f378ba 100644
> > --- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi
> > +++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
> > @@ -422,14 +422,33 @@
> >  			#size-cells = <0>;
> >  			status = "disabled";
> >  
> > -			mdio: mdio {
> > +			mdio0: mdio {
> >  				#address-cells = <1>;
> >  				#size-cells = <0>;
> > -				int_mii_phy: ethernet-phy@1 {
> > -					compatible = "ethernet-phy-ieee802.3-c22";
> > -					reg = <1>;
> > -					clocks = <&ccu CLK_BUS_EPHY>;
> > -					resets = <&ccu RST_BUS_EPHY>;
> > +				compatible = "snps,dwmac-mdio";
> > +
> > +				mdio-mux {
> > +					compatible = "mdio-mux";
> > +					#address-cells = <1>;
> > +					#size-cells = <0>;
> 
> Newline
> 
> > +					/* Only one MDIO is usable at the time */
> > +					internal_mdio: mdio@1 {
> > +						reg = <1>;
> > +						#address-cells = <1>;
> > +						#size-cells = <0>;
> 
> Newline
> 
> > +						int_mii_phy: ethernet-phy@1 {
> > +							compatible = "ethernet-phy-ieee802.3-c22";
> > +							reg = <1>;
> > +							clocks = <&ccu CLK_BUS_EPHY>;
> > +							resets = <&ccu RST_BUS_EPHY>;
> > +							phy-is-integrated;
> > +						};
> > +					};
> 
> Newline
> 
> > +					mdio: mdio@2 {
> 
> This is quite confusing. Why not call the label external_mdio?
> 

I will do it. (at origin I was not changing it for limiting changes on board with external PHY, but now all DT are reverted, it will be easy)

Regards
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andrew Lunn Sept. 27, 2017, 2:12 p.m. UTC | #3
On Wed, Sep 27, 2017 at 09:34:14AM +0200, Corentin Labbe wrote:
> Each child node of an MDIO node is scanned as a PHY when calling
> of_mdiobus_register() givint the following result:
> [   18.175379] mdio_bus stmmac-0: /soc/ethernet@1c30000/mdio/mdio-mux has invalid PHY address
> [   18.175408] mdio_bus stmmac-0: scan phy mdio-mux at address 0
> [   18.175450] mdio_bus stmmac-0: scan phy mdio-mux at address 1
> [...]
> [   18.176420] mdio_bus stmmac-0: scan phy mdio-mux at address 30
> [   18.176452] mdio_bus stmmac-0: scan phy mdio-mux at address 31
> 
> Since mdio-mux nodes are not PHY, this patch a way to to not scan
> them.

Hi Corentin

I still don't like this, but ...

> 
> Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com>
> ---
>  drivers/of/of_mdio.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
> index d94dd8b77abd..d90ddb0d90f2 100644
> --- a/drivers/of/of_mdio.c
> +++ b/drivers/of/of_mdio.c
> @@ -190,6 +190,10 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
>  	struct device_node *child;
>  	bool scanphys = false;
>  	int addr, rc;
> +	static const struct of_device_id do_not_scan[] = {
> +		{ .compatible = "mdio-mux" },
> +		{}
> +	};

Please rename this to some less generic. What i don't want is other
compatible strings added here. We want to make the exception for
muxes, but nothing else. So something like compatible_muxes?

       Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Florian Fainelli Sept. 28, 2017, 4:50 a.m. UTC | #4
On 09/27/2017 07:12 AM, Andrew Lunn wrote:
> On Wed, Sep 27, 2017 at 09:34:14AM +0200, Corentin Labbe wrote:
>> Each child node of an MDIO node is scanned as a PHY when calling
>> of_mdiobus_register() givint the following result:
>> [   18.175379] mdio_bus stmmac-0: /soc/ethernet@1c30000/mdio/mdio-mux has invalid PHY address
>> [   18.175408] mdio_bus stmmac-0: scan phy mdio-mux at address 0
>> [   18.175450] mdio_bus stmmac-0: scan phy mdio-mux at address 1
>> [...]
>> [   18.176420] mdio_bus stmmac-0: scan phy mdio-mux at address 30
>> [   18.176452] mdio_bus stmmac-0: scan phy mdio-mux at address 31
>>
>> Since mdio-mux nodes are not PHY, this patch a way to to not scan
>> them.
> 
> Hi Corentin
> 
> I still don't like this, but ...

Me neither, even more so as I don't understand the reasoning behind
putting the mux as a child node of the MDIO bus controller in the first
place.

Also, you need to re-order patches such that this patch comes before the
DTS changes.

> 
>>
>> Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com>
>> ---
>>  drivers/of/of_mdio.c | 10 ++++++++++
>>  1 file changed, 10 insertions(+)
>>
>> diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
>> index d94dd8b77abd..d90ddb0d90f2 100644
>> --- a/drivers/of/of_mdio.c
>> +++ b/drivers/of/of_mdio.c
>> @@ -190,6 +190,10 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
>>  	struct device_node *child;
>>  	bool scanphys = false;
>>  	int addr, rc;
>> +	static const struct of_device_id do_not_scan[] = {
>> +		{ .compatible = "mdio-mux" },
>> +		{}
>> +	};
> 
> Please rename this to some less generic. What i don't want is other
> compatible strings added here. We want to make the exception for
> muxes, but nothing else. So something like compatible_muxes?
> 
>        Andrew
>
Rob Herring Oct. 5, 2017, 10:09 p.m. UTC | #5
On Wed, Sep 27, 2017 at 09:50:46PM -0700, Florian Fainelli wrote:
> 
> 
> On 09/27/2017 07:12 AM, Andrew Lunn wrote:
> > On Wed, Sep 27, 2017 at 09:34:14AM +0200, Corentin Labbe wrote:
> >> Each child node of an MDIO node is scanned as a PHY when calling
> >> of_mdiobus_register() givint the following result:
> >> [   18.175379] mdio_bus stmmac-0: /soc/ethernet@1c30000/mdio/mdio-mux has invalid PHY address
> >> [   18.175408] mdio_bus stmmac-0: scan phy mdio-mux at address 0
> >> [   18.175450] mdio_bus stmmac-0: scan phy mdio-mux at address 1
> >> [...]
> >> [   18.176420] mdio_bus stmmac-0: scan phy mdio-mux at address 30
> >> [   18.176452] mdio_bus stmmac-0: scan phy mdio-mux at address 31
> >>
> >> Since mdio-mux nodes are not PHY, this patch a way to to not scan
> >> them.
> > 
> > Hi Corentin
> > 
> > I still don't like this, but ...
> 
> Me neither, even more so as I don't understand the reasoning behind
> putting the mux as a child node of the MDIO bus controller in the first
> place.

If no one agrees with me, then you shouldn't just accept my answers. I'm 
not always right.

Looking at this some more, why can't mdio-mux-mmio be used? Then there 
is nothing to review or discuss. If you want to extend that then make it 
clear this is just extending/inheriting already defined bindings.

That being said, if we were starting over I would probably do mux 
designs differently with DT hierarchy reflecting the mux hierarchy, but 
that ship has sailed.

Rob
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andrew Lunn Oct. 5, 2017, 10:21 p.m. UTC | #6
> Looking at this some more, why can't mdio-mux-mmio be used?

Hi Rob

That was my first thought. And then i dug into the details. The mux is
more than just a couple of bits in an address space. Clocks needs to
be enabled/disabled, and the MAC needs a reset, when the mux changes.
So the mux needs intimate knowledge of MAC.

   Andrew
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html