diff mbox series

[2/2] dt-bindings: net: dsa: mediatek,mt7530: document MDIO-bus

Message ID 20230430112834.11520-2-mail@david-bauer.net (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series [1/2] mt7530: register OF node for internal MDIO bus | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Guessed tree name to be net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers warning 16 maintainers not CCed: kuba@kernel.org daniel@makrotopia.org dqfext@gmail.com pabeni@redhat.com robh+dt@kernel.org matthias.bgg@gmail.com krzysztof.kozlowski+dt@linaro.org Landen.Chao@mediatek.com andrew@lunn.ch olteanv@gmail.com davem@davemloft.net sean.wang@mediatek.com f.fainelli@gmail.com edumazet@google.com arinc.unal@arinc9.com angelogioacchino.delregno@collabora.com
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 12 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

David Bauer April 30, 2023, 11:28 a.m. UTC
Document the ability to add nodes for the MDIO bus connecting the
switch-internal PHYs.

Signed-off-by: David Bauer <mail@david-bauer.net>
---
 .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml        | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Arınç ÜNAL April 30, 2023, 12:34 p.m. UTC | #1
On 30.04.2023 14:28, David Bauer wrote:
> Document the ability to add nodes for the MDIO bus connecting the
> switch-internal PHYs.

This is quite interesting. Currently the PHY muxing feature for the 
MT7530 switch looks for some fake ethernet-phy definitions on the 
mdio-bus where the switch is also defined.

Looking at the binding here, there will be an mdio node under the switch 
node. This could be useful to define the ethernet-phys for PHY muxing 
here instead, so we don't waste the register addresses on the parent 
mdio-bus for fake things. It looks like this should work right out of 
the box. I will do some tests.

Are there any examples as to what to configure on the switch PHYs with 
this change?

> 
> Signed-off-by: David Bauer <mail@david-bauer.net>
> ---
>   .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml        | 6 ++++++
>   1 file changed, 6 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> index e532c6b795f4..50f8f83cc440 100644
> --- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> +++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> @@ -128,6 +128,12 @@ properties:
>         See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
>         details for the regulator setup on these boards.
>   
> +  mdio:
> +    $ref: /schemas/net/mdio.yaml#
> +    unevaluatedProperties: false
> +    description:
> +      Node for the internal MDIO bus connected to the embedded ethernet-PHYs.

Please set this property as false for mediatek,mt7988-switch as it 
doesn't use MDIO.

Arınç
Daniel Golle April 30, 2023, 12:44 p.m. UTC | #2
On Sun, Apr 30, 2023 at 03:34:43PM +0300, Arınç ÜNAL wrote:
> On 30.04.2023 14:28, David Bauer wrote:
> > Document the ability to add nodes for the MDIO bus connecting the
> > switch-internal PHYs.
> 
> This is quite interesting. Currently the PHY muxing feature for the MT7530
> switch looks for some fake ethernet-phy definitions on the mdio-bus where
> the switch is also defined.
> 
> Looking at the binding here, there will be an mdio node under the switch
> node. This could be useful to define the ethernet-phys for PHY muxing here
> instead, so we don't waste the register addresses on the parent mdio-bus for
> fake things. It looks like this should work right out of the box. I will do
> some tests.
> 
> Are there any examples as to what to configure on the switch PHYs with this
> change?
> 
> > 
> > Signed-off-by: David Bauer <mail@david-bauer.net>
> > ---
> >   .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml        | 6 ++++++
> >   1 file changed, 6 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > index e532c6b795f4..50f8f83cc440 100644
> > --- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > +++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > @@ -128,6 +128,12 @@ properties:
> >         See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
> >         details for the regulator setup on these boards.
> > +  mdio:
> > +    $ref: /schemas/net/mdio.yaml#
> > +    unevaluatedProperties: false
> > +    description:
> > +      Node for the internal MDIO bus connected to the embedded ethernet-PHYs.
> 
> Please set this property as false for mediatek,mt7988-switch as it doesn't
> use MDIO.

Well, quite the opposite is true. This change is **needed** on MT7988 as
the built-in 1GE PHYs of the MT7988 are connected to the (internal) MDIO
bus of the switch. And they do need calibration data assigned as nvmem
via device tree.

tl;dr: Despite not being connected via MDIO itself also MT7988 exposes an
internal MDIO bus for the switch PHYs.
Arınç ÜNAL April 30, 2023, 12:52 p.m. UTC | #3
On 30.04.2023 15:44, Daniel Golle wrote:
> On Sun, Apr 30, 2023 at 03:34:43PM +0300, Arınç ÜNAL wrote:
>> On 30.04.2023 14:28, David Bauer wrote:
>>> Document the ability to add nodes for the MDIO bus connecting the
>>> switch-internal PHYs.
>>
>> This is quite interesting. Currently the PHY muxing feature for the MT7530
>> switch looks for some fake ethernet-phy definitions on the mdio-bus where
>> the switch is also defined.
>>
>> Looking at the binding here, there will be an mdio node under the switch
>> node. This could be useful to define the ethernet-phys for PHY muxing here
>> instead, so we don't waste the register addresses on the parent mdio-bus for
>> fake things. It looks like this should work right out of the box. I will do
>> some tests.
>>
>> Are there any examples as to what to configure on the switch PHYs with this
>> change?
>>
>>>
>>> Signed-off-by: David Bauer <mail@david-bauer.net>
>>> ---
>>>    .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml        | 6 ++++++
>>>    1 file changed, 6 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
>>> index e532c6b795f4..50f8f83cc440 100644
>>> --- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
>>> +++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
>>> @@ -128,6 +128,12 @@ properties:
>>>          See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
>>>          details for the regulator setup on these boards.
>>> +  mdio:
>>> +    $ref: /schemas/net/mdio.yaml#
>>> +    unevaluatedProperties: false
>>> +    description:
>>> +      Node for the internal MDIO bus connected to the embedded ethernet-PHYs.
>>
>> Please set this property as false for mediatek,mt7988-switch as it doesn't
>> use MDIO.
> 
> Well, quite the opposite is true. This change is **needed** on MT7988 as
> the built-in 1GE PHYs of the MT7988 are connected to the (internal) MDIO
> bus of the switch. And they do need calibration data assigned as nvmem
> via device tree.
> 
> tl;dr: Despite not being connected via MDIO itself also MT7988 exposes an
> internal MDIO bus for the switch PHYs.

Got it, thanks.

Arınç
Arınç ÜNAL April 30, 2023, 12:53 p.m. UTC | #4
On 30.04.2023 14:28, David Bauer wrote:
> Document the ability to add nodes for the MDIO bus connecting the
> switch-internal PHYs.
> 
> Signed-off-by: David Bauer <mail@david-bauer.net>
> ---
>   .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml        | 6 ++++++
>   1 file changed, 6 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> index e532c6b795f4..50f8f83cc440 100644
> --- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> +++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> @@ -128,6 +128,12 @@ properties:
>         See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
>         details for the regulator setup on these boards.
>   
> +  mdio:
> +    $ref: /schemas/net/mdio.yaml#
> +    unevaluatedProperties: false
> +    description:
> +      Node for the internal MDIO bus connected to the embedded ethernet-PHYs.

Maybe saying "connected to the internal switch PHYs" would better 
explain this.

Arınç
Arınç ÜNAL April 30, 2023, 4:17 p.m. UTC | #5
On 30.04.2023 15:34, Arınç ÜNAL wrote:
> On 30.04.2023 14:28, David Bauer wrote:
>> Document the ability to add nodes for the MDIO bus connecting the
>> switch-internal PHYs.
> 
> This is quite interesting. Currently the PHY muxing feature for the 
> MT7530 switch looks for some fake ethernet-phy definitions on the 
> mdio-bus where the switch is also defined.
> 
> Looking at the binding here, there will be an mdio node under the switch 
> node. This could be useful to define the ethernet-phys for PHY muxing 
> here instead, so we don't waste the register addresses on the parent 
> mdio-bus for fake things. It looks like this should work right out of 
> the box. I will do some tests.

Once I start using the mdio node it forces me to define all the PHYs 
which were defined as ports.

[    4.159534] mt7530-mdio mdio-bus:1f lan0 (uninitialized): no phy at 1
[    4.166002] mt7530-mdio mdio-bus:1f lan0 (uninitialized): failed to 
connect to PHY: -ENODEV
[    4.174421] mt7530-mdio mdio-bus:1f lan0 (uninitialized): error -19 
setting up PHY for tree 0, switch 0, port 1
[    4.185236] mt7530-mdio mdio-bus:1f lan1 (uninitialized): no phy at 2
[    4.191753] mt7530-mdio mdio-bus:1f lan1 (uninitialized): failed to 
connect to PHY: -ENODEV
[    4.200150] mt7530-mdio mdio-bus:1f lan1 (uninitialized): error -19 
setting up PHY for tree 0, switch 0, port 2
[    4.210844] mt7530-mdio mdio-bus:1f lan2 (uninitialized): no phy at 3
[    4.217361] mt7530-mdio mdio-bus:1f lan2 (uninitialized): failed to 
connect to PHY: -ENODEV
[    4.225734] mt7530-mdio mdio-bus:1f lan2 (uninitialized): error -19 
setting up PHY for tree 0, switch 0, port 3
[    4.236394] mt7530-mdio mdio-bus:1f lan3 (uninitialized): no phy at 4
[    4.242901] mt7530-mdio mdio-bus:1f lan3 (uninitialized): failed to 
connect to PHY: -ENODEV
[    4.251297] mt7530-mdio mdio-bus:1f lan3 (uninitialized): error -19 
setting up PHY for tree 0, switch 0, port 4

We can either force defining the PHYs on the mdio node which would break 
the ABI, or forget about doing PHY muxing this way.

Arınç
Andrew Lunn April 30, 2023, 5:18 p.m. UTC | #6
On Sun, Apr 30, 2023 at 07:17:10PM +0300, Arınç ÜNAL wrote:
> On 30.04.2023 15:34, Arınç ÜNAL wrote:
> > On 30.04.2023 14:28, David Bauer wrote:
> > > Document the ability to add nodes for the MDIO bus connecting the
> > > switch-internal PHYs.
> > 
> > This is quite interesting. Currently the PHY muxing feature for the
> > MT7530 switch looks for some fake ethernet-phy definitions on the
> > mdio-bus where the switch is also defined.
> > 
> > Looking at the binding here, there will be an mdio node under the switch
> > node. This could be useful to define the ethernet-phys for PHY muxing
> > here instead, so we don't waste the register addresses on the parent
> > mdio-bus for fake things. It looks like this should work right out of
> > the box. I will do some tests.
> 
> Once I start using the mdio node it forces me to define all the PHYs which
> were defined as ports.

Try setting ds->slave_mii_bus to the MDIO bus you register via
of_mdiobus_register().

	Andrew
Arınç ÜNAL April 30, 2023, 6:28 p.m. UTC | #7
On 30.04.2023 20:18, Andrew Lunn wrote:
> On Sun, Apr 30, 2023 at 07:17:10PM +0300, Arınç ÜNAL wrote:
>> On 30.04.2023 15:34, Arınç ÜNAL wrote:
>>> On 30.04.2023 14:28, David Bauer wrote:
>>>> Document the ability to add nodes for the MDIO bus connecting the
>>>> switch-internal PHYs.
>>>
>>> This is quite interesting. Currently the PHY muxing feature for the
>>> MT7530 switch looks for some fake ethernet-phy definitions on the
>>> mdio-bus where the switch is also defined.
>>>
>>> Looking at the binding here, there will be an mdio node under the switch
>>> node. This could be useful to define the ethernet-phys for PHY muxing
>>> here instead, so we don't waste the register addresses on the parent
>>> mdio-bus for fake things. It looks like this should work right out of
>>> the box. I will do some tests.
>>
>> Once I start using the mdio node it forces me to define all the PHYs which
>> were defined as ports.
> 
> Try setting ds->slave_mii_bus to the MDIO bus you register via
> of_mdiobus_register().

That seems to be the case already, under mt7530_setup_mdio():

	bus = devm_mdiobus_alloc(dev);
	if (!bus)
		return -ENOMEM;

	ds->slave_mii_bus = bus;

The bus is registered with devm_of_mdiobus_register(), if that matters. 
(My current knowledge about OF or OF helpers for MDIO is next to nothing.)

The same behaviour is there.

Arınç
Andrew Lunn April 30, 2023, 6:48 p.m. UTC | #8
> > Try setting ds->slave_mii_bus to the MDIO bus you register via
> > of_mdiobus_register().
> 
> That seems to be the case already, under mt7530_setup_mdio():
> 
> 	bus = devm_mdiobus_alloc(dev);
> 	if (!bus)
> 		return -ENOMEM;
> 
> 	ds->slave_mii_bus = bus;
> 
> The bus is registered with devm_of_mdiobus_register(), if that matters. (My
> current knowledge about OF or OF helpers for MDIO is next to nothing.)
> 
> The same behaviour is there.

Maybe take a look at what is going on in dsa_slave_phy_setup() and
dsa_slave_phy_connect().

The way i understand it, is it first looks in DT to see if there is a
phy-handle, and if there is, it uses it. If not, it assumes there is a
1:1 mapping between port number and PHY address, and looks to see if a
PHY has been found on ds->slave_mii_bus at that address, and uses it.

So i don't think you need to list the PHY, the fallback should be
used.

	Andrew
Arınç ÜNAL April 30, 2023, 7:54 p.m. UTC | #9
On 30.04.2023 21:48, Andrew Lunn wrote:
>>> Try setting ds->slave_mii_bus to the MDIO bus you register via
>>> of_mdiobus_register().
>>
>> That seems to be the case already, under mt7530_setup_mdio():
>>
>> 	bus = devm_mdiobus_alloc(dev);
>> 	if (!bus)
>> 		return -ENOMEM;
>>
>> 	ds->slave_mii_bus = bus;
>>
>> The bus is registered with devm_of_mdiobus_register(), if that matters. (My
>> current knowledge about OF or OF helpers for MDIO is next to nothing.)
>>
>> The same behaviour is there.
> 
> Maybe take a look at what is going on in dsa_slave_phy_setup() and
> dsa_slave_phy_connect().
> 
> The way i understand it, is it first looks in DT to see if there is a
> phy-handle, and if there is, it uses it. If not, it assumes there is a
> 1:1 mapping between port number and PHY address, and looks to see if a
> PHY has been found on ds->slave_mii_bus at that address, and uses it.
> 
> So i don't think you need to list the PHY, the fallback should be
> used.

Thanks for pointing me in the right direction Andrew.

I applied this diff:

diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 389f33a12534..19d0c209e7e9 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -117,8 +117,12 @@ struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr)
  
  	mdiodev = bus->mdio_map[addr];
  
-	if (!mdiodev)
+	if (!mdiodev) {
+		dev_info(&bus->dev, "mdio device doesn't exist\n");
  		return NULL;
+	}
+
+	dev_info(&bus->dev, "mdio device exists\n");
  
  	if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY))
  		return NULL;
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 165bb2cb8431..0be408e32a76 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -2487,6 +2487,7 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev)
  		/* We could not connect to a designated PHY or SFP, so try to
  		 * use the switch internal MDIO bus instead
  		 */
+		netdev_err(slave_dev, "using switch's internal MDIO bus\n");
  		ret = dsa_slave_phy_connect(slave_dev, dp->index, phy_flags);
  	}
  	if (ret) {

With or without this patch, the switch's internal MDIO bus is used to set
up the PHYs.

DT that defines ethphy0 only, without this patch applied:

[    4.660784] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
[    4.669026] mdio_bus mt7530-0: mdio device exists
[    4.677693] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.693238] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
[    4.701589] mdio_bus mt7530-0: mdio device exists
[    4.707101] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.718550] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
[    4.726856] mdio_bus mt7530-0: mdio device exists
[    4.732384] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.743822] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
[    4.752154] mdio_bus mt7530-0: mdio device exists
[    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.769099] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
[    4.781872] mdio_bus mt7530-0: mdio device exists
[    4.787413] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)

Same DT but with this patch applied:

[    4.621547] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
[    4.631524] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
[    4.639764] mdio_bus mt7530-0: mdio device exists
[    4.647770] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.663898] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
[    4.672253] mdio_bus mt7530-0: mdio device doesn't exist
[    4.677597] mt7530-mdio mdio-bus:1f lan0 (uninitialized): no phy at 1
[    4.684053] mt7530-mdio mdio-bus:1f lan0 (uninitialized): failed to connect to PHY: -ENODEV
[    4.692435] mt7530-mdio mdio-bus:1f lan0 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 1
[    4.703087] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
[    4.711408] mdio_bus mt7530-0: mdio device doesn't exist
[    4.716731] mt7530-mdio mdio-bus:1f lan1 (uninitialized): no phy at 2
[    4.723214] mt7530-mdio mdio-bus:1f lan1 (uninitialized): failed to connect to PHY: -ENODEV
[    4.731597] mt7530-mdio mdio-bus:1f lan1 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 2
[    4.742199] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
[    4.755431] mdio_bus mt7530-0: mdio device doesn't exist
[    4.760793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): no phy at 3
[    4.767263] mt7530-mdio mdio-bus:1f lan2 (uninitialized): failed to connect to PHY: -ENODEV
[    4.775632] mt7530-mdio mdio-bus:1f lan2 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 3
[    4.786270] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
[    4.794591] mdio_bus mt7530-0: mdio device doesn't exist
[    4.799944] mt7530-mdio mdio-bus:1f lan3 (uninitialized): no phy at 4
[    4.806397] mt7530-mdio mdio-bus:1f lan3 (uninitialized): failed to connect to PHY: -ENODEV
[    4.814782] mt7530-mdio mdio-bus:1f lan3 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 4

DT without the mdio node defined, with this patch applied:

[    4.650766] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
[    4.660687] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
[    4.668937] mdio_bus mt7530-0: mdio device exists
[    4.677787] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.693165] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
[    4.701517] mdio_bus mt7530-0: mdio device exists
[    4.707029] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.718469] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
[    4.726773] mdio_bus mt7530-0: mdio device exists
[    4.732322] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.743793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
[    4.752143] mdio_bus mt7530-0: mdio device exists
[    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
[    4.769105] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
[    4.781905] mdio_bus mt7530-0: mdio device exists
[    4.787459] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)

This is how I define it, mind you no phandles.

switch@1f {
	...
	mdio {
		#address-cells = <0x01>;
		#size-cells = <0x00>;

		ethernet-phy@0 {
			reg = <0x00>;
		};
	};
};

Like you said, if the mdio node is not defined, the driver will assume 1:1
mapping. If not, it will need all the PHYs to be defined on the mdio node
along with on the ports node. Hence back to my original statement, we can
either force defining the PHYs on the mdio node which would break the ABI,
or forget about doing PHY muxing this way.

There are no MDIO operations needed on the PHYs for the PHY muxing anyway,
so I'd rather do this some other way.

Thanks for the help.

Arınç
Andrew Lunn April 30, 2023, 8:41 p.m. UTC | #10
On Sun, Apr 30, 2023 at 10:54:50PM +0300, Arınç ÜNAL wrote:
> On 30.04.2023 21:48, Andrew Lunn wrote:
> > > > Try setting ds->slave_mii_bus to the MDIO bus you register via
> > > > of_mdiobus_register().
> > > 
> > > That seems to be the case already, under mt7530_setup_mdio():
> > > 
> > > 	bus = devm_mdiobus_alloc(dev);
> > > 	if (!bus)
> > > 		return -ENOMEM;
> > > 
> > > 	ds->slave_mii_bus = bus;
> > > 
> > > The bus is registered with devm_of_mdiobus_register(), if that matters. (My
> > > current knowledge about OF or OF helpers for MDIO is next to nothing.)
> > > 
> > > The same behaviour is there.
> > 
> > Maybe take a look at what is going on in dsa_slave_phy_setup() and
> > dsa_slave_phy_connect().
> > 
> > The way i understand it, is it first looks in DT to see if there is a
> > phy-handle, and if there is, it uses it. If not, it assumes there is a
> > 1:1 mapping between port number and PHY address, and looks to see if a
> > PHY has been found on ds->slave_mii_bus at that address, and uses it.
> > 
> > So i don't think you need to list the PHY, the fallback should be
> > used.
> 
> Thanks for pointing me in the right direction Andrew.
> 
> I applied this diff:
> 
> diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
> index 389f33a12534..19d0c209e7e9 100644
> --- a/drivers/net/phy/mdio_bus.c
> +++ b/drivers/net/phy/mdio_bus.c
> @@ -117,8 +117,12 @@ struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr)
>  	mdiodev = bus->mdio_map[addr];
> -	if (!mdiodev)
> +	if (!mdiodev) {
> +		dev_info(&bus->dev, "mdio device doesn't exist\n");
>  		return NULL;
> +	}
> +
> +	dev_info(&bus->dev, "mdio device exists\n");
>  	if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY))
>  		return NULL;
> diff --git a/net/dsa/slave.c b/net/dsa/slave.c
> index 165bb2cb8431..0be408e32a76 100644
> --- a/net/dsa/slave.c
> +++ b/net/dsa/slave.c
> @@ -2487,6 +2487,7 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev)
>  		/* We could not connect to a designated PHY or SFP, so try to
>  		 * use the switch internal MDIO bus instead
>  		 */
> +		netdev_err(slave_dev, "using switch's internal MDIO bus\n");
>  		ret = dsa_slave_phy_connect(slave_dev, dp->index, phy_flags);
>  	}
>  	if (ret) {
> 
> With or without this patch, the switch's internal MDIO bus is used to set
> up the PHYs.
> 
> DT that defines ethphy0 only, without this patch applied:
> 
> [    4.660784] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
> [    4.669026] mdio_bus mt7530-0: mdio device exists
> [    4.677693] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.693238] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
> [    4.701589] mdio_bus mt7530-0: mdio device exists
> [    4.707101] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.718550] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
> [    4.726856] mdio_bus mt7530-0: mdio device exists
> [    4.732384] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.743822] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
> [    4.752154] mdio_bus mt7530-0: mdio device exists
> [    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.769099] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
> [    4.781872] mdio_bus mt7530-0: mdio device exists
> [    4.787413] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)
> 
> Same DT but with this patch applied:
> 
> [    4.621547] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
> [    4.631524] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
> [    4.639764] mdio_bus mt7530-0: mdio device exists
> [    4.647770] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.663898] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
> [    4.672253] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.677597] mt7530-mdio mdio-bus:1f lan0 (uninitialized): no phy at 1
> [    4.684053] mt7530-mdio mdio-bus:1f lan0 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.692435] mt7530-mdio mdio-bus:1f lan0 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 1
> [    4.703087] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
> [    4.711408] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.716731] mt7530-mdio mdio-bus:1f lan1 (uninitialized): no phy at 2
> [    4.723214] mt7530-mdio mdio-bus:1f lan1 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.731597] mt7530-mdio mdio-bus:1f lan1 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 2
> [    4.742199] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
> [    4.755431] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.760793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): no phy at 3
> [    4.767263] mt7530-mdio mdio-bus:1f lan2 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.775632] mt7530-mdio mdio-bus:1f lan2 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 3
> [    4.786270] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
> [    4.794591] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.799944] mt7530-mdio mdio-bus:1f lan3 (uninitialized): no phy at 4
> [    4.806397] mt7530-mdio mdio-bus:1f lan3 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.814782] mt7530-mdio mdio-bus:1f lan3 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 4
> 
> DT without the mdio node defined, with this patch applied:
> 
> [    4.650766] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
> [    4.660687] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
> [    4.668937] mdio_bus mt7530-0: mdio device exists
> [    4.677787] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.693165] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
> [    4.701517] mdio_bus mt7530-0: mdio device exists
> [    4.707029] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.718469] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
> [    4.726773] mdio_bus mt7530-0: mdio device exists
> [    4.732322] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.743793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
> [    4.752143] mdio_bus mt7530-0: mdio device exists
> [    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.769105] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
> [    4.781905] mdio_bus mt7530-0: mdio device exists
> [    4.787459] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)
> 
> This is how I define it, mind you no phandles.
> 
> switch@1f {
> 	...
> 	mdio {
> 		#address-cells = <0x01>;
> 		#size-cells = <0x00>;
> 
> 		ethernet-phy@0 {
> 			reg = <0x00>;
> 		};
> 	};
> };
> 
> Like you said, if the mdio node is not defined, the driver will assume 1:1
> mapping. If not, it will need all the PHYs to be defined on the mdio node
> along with on the ports node. Hence back to my original statement, we can
> either force defining the PHYs on the mdio node which would break the ABI,
> or forget about doing PHY muxing this way.
> 
> There are no MDIO operations needed on the PHYs for the PHY muxing anyway,
> so I'd rather do this some other way.

The problem is __of_mdiobus_register() :-(

If there is a node in DT, the scanning of all addresses is
disabled. It looks at just the addresses listed in DT. Plain
mdiobus_register() by default looks at all addresses to discover if a
PHY is there.

Hence when slave.c tries to connect to the PHY, only the PHY you
listed in DT has been found.

I don't see a way around this, at least not without adding a new
variant of of_mdiobus_register which combined DT with a bus scan.

	Andrew
David Bauer May 1, 2023, 9:22 a.m. UTC | #11
Hi Arinc,

thanks for spotting this issue.

On 4/30/23 21:54, Arınç ÜNAL wrote:
> On 30.04.2023 21:48, Andrew Lunn wrote:
>>>> Try setting ds->slave_mii_bus to the MDIO bus you register via
>>>> of_mdiobus_register().
>>>
>>> That seems to be the case already, under mt7530_setup_mdio():
>>>
>>>     bus = devm_mdiobus_alloc(dev);
>>>     if (!bus)
>>>         return -ENOMEM;
>>>
>>>     ds->slave_mii_bus = bus;
>>>
>>> The bus is registered with devm_of_mdiobus_register(), if that matters. (My
>>> current knowledge about OF or OF helpers for MDIO is next to nothing.)
>>>
>>> The same behaviour is there.
>>
>> Maybe take a look at what is going on in dsa_slave_phy_setup() and
>> dsa_slave_phy_connect().
>>
>> The way i understand it, is it first looks in DT to see if there is a
>> phy-handle, and if there is, it uses it. If not, it assumes there is a
>> 1:1 mapping between port number and PHY address, and looks to see if a
>> PHY has been found on ds->slave_mii_bus at that address, and uses it.
>>
>> So i don't think you need to list the PHY, the fallback should be
>> used.
> 
> Thanks for pointing me in the right direction Andrew.
> 
> I applied this diff:
> 
> diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
> index 389f33a12534..19d0c209e7e9 100644
> --- a/drivers/net/phy/mdio_bus.c
> +++ b/drivers/net/phy/mdio_bus.c
> @@ -117,8 +117,12 @@ struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr)
> 
>       mdiodev = bus->mdio_map[addr];
> 
> -    if (!mdiodev)
> +    if (!mdiodev) {
> +        dev_info(&bus->dev, "mdio device doesn't exist\n");
>           return NULL;
> +    }
> +
> +    dev_info(&bus->dev, "mdio device exists\n");
> 
>       if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY))
>           return NULL;
> diff --git a/net/dsa/slave.c b/net/dsa/slave.c
> index 165bb2cb8431..0be408e32a76 100644
> --- a/net/dsa/slave.c
> +++ b/net/dsa/slave.c
> @@ -2487,6 +2487,7 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev)
>           /* We could not connect to a designated PHY or SFP, so try to
>            * use the switch internal MDIO bus instead
>            */
> +        netdev_err(slave_dev, "using switch's internal MDIO bus\n");
>           ret = dsa_slave_phy_connect(slave_dev, dp->index, phy_flags);
>       }
>       if (ret) {
> 
> With or without this patch, the switch's internal MDIO bus is used to set
> up the PHYs.
> 
> DT that defines ethphy0 only, without this patch applied:
> 
> [    4.660784] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
> [    4.669026] mdio_bus mt7530-0: mdio device exists
> [    4.677693] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.693238] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
> [    4.701589] mdio_bus mt7530-0: mdio device exists
> [    4.707101] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.718550] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
> [    4.726856] mdio_bus mt7530-0: mdio device exists
> [    4.732384] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.743822] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
> [    4.752154] mdio_bus mt7530-0: mdio device exists
> [    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.769099] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
> [    4.781872] mdio_bus mt7530-0: mdio device exists
> [    4.787413] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)
> 
> Same DT but with this patch applied:
> 
> [    4.621547] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
> [    4.631524] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
> [    4.639764] mdio_bus mt7530-0: mdio device exists
> [    4.647770] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.663898] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
> [    4.672253] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.677597] mt7530-mdio mdio-bus:1f lan0 (uninitialized): no phy at 1
> [    4.684053] mt7530-mdio mdio-bus:1f lan0 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.692435] mt7530-mdio mdio-bus:1f lan0 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 1
> [    4.703087] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
> [    4.711408] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.716731] mt7530-mdio mdio-bus:1f lan1 (uninitialized): no phy at 2
> [    4.723214] mt7530-mdio mdio-bus:1f lan1 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.731597] mt7530-mdio mdio-bus:1f lan1 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 2
> [    4.742199] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
> [    4.755431] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.760793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): no phy at 3
> [    4.767263] mt7530-mdio mdio-bus:1f lan2 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.775632] mt7530-mdio mdio-bus:1f lan2 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 3
> [    4.786270] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
> [    4.794591] mdio_bus mt7530-0: mdio device doesn't exist
> [    4.799944] mt7530-mdio mdio-bus:1f lan3 (uninitialized): no phy at 4
> [    4.806397] mt7530-mdio mdio-bus:1f lan3 (uninitialized): failed to connect to PHY: -ENODEV
> [    4.814782] mt7530-mdio mdio-bus:1f lan3 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 4
> 
> DT without the mdio node defined, with this patch applied:
> 
> [    4.650766] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
> [    4.660687] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
> [    4.668937] mdio_bus mt7530-0: mdio device exists
> [    4.677787] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.693165] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
> [    4.701517] mdio_bus mt7530-0: mdio device exists
> [    4.707029] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.718469] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
> [    4.726773] mdio_bus mt7530-0: mdio device exists
> [    4.732322] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.743793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
> [    4.752143] mdio_bus mt7530-0: mdio device exists
> [    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
> [    4.769105] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
> [    4.781905] mdio_bus mt7530-0: mdio device exists
> [    4.787459] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)
> 
> This is how I define it, mind you no phandles.
> 
> switch@1f {
>      ...
>      mdio {
>          #address-cells = <0x01>;
>          #size-cells = <0x00>;
> 
>          ethernet-phy@0 {
>              reg = <0x00>;
>          };
>      };
> };
> 
> Like you said, if the mdio node is not defined, the driver will assume 1:1
> mapping. If not, it will need all the PHYs to be defined on the mdio node
> along with on the ports node. Hence back to my original statement, we can
> either force defining the PHYs on the mdio node which would break the ABI,
> or forget about doing PHY muxing this way.

While i was not aware of this side effect, I don't see how this breaks the ABI.

Existing device-trees not defining the MDIO node will still continue to work.

Wouldn't we just skip the whole issue by documenting the need for defining all PHYs
used on the switch when defining the MDIO bus?

Best
David

> 
> There are no MDIO operations needed on the PHYs for the PHY muxing anyway,
> so I'd rather do this some other way.
> 
> Thanks for the help.
> 
> Arınç
Arınç ÜNAL May 1, 2023, 9:28 a.m. UTC | #12
On 1.05.2023 12:22, David Bauer wrote:
> Hi Arinc,
> 
> thanks for spotting this issue.
> 
> On 4/30/23 21:54, Arınç ÜNAL wrote:
>> On 30.04.2023 21:48, Andrew Lunn wrote:
>>>>> Try setting ds->slave_mii_bus to the MDIO bus you register via
>>>>> of_mdiobus_register().
>>>>
>>>> That seems to be the case already, under mt7530_setup_mdio():
>>>>
>>>>     bus = devm_mdiobus_alloc(dev);
>>>>     if (!bus)
>>>>         return -ENOMEM;
>>>>
>>>>     ds->slave_mii_bus = bus;
>>>>
>>>> The bus is registered with devm_of_mdiobus_register(), if that matters. (My
>>>> current knowledge about OF or OF helpers for MDIO is next to nothing.)
>>>>
>>>> The same behaviour is there.
>>>
>>> Maybe take a look at what is going on in dsa_slave_phy_setup() and
>>> dsa_slave_phy_connect().
>>>
>>> The way i understand it, is it first looks in DT to see if there is a
>>> phy-handle, and if there is, it uses it. If not, it assumes there is a
>>> 1:1 mapping between port number and PHY address, and looks to see if a
>>> PHY has been found on ds->slave_mii_bus at that address, and uses it.
>>>
>>> So i don't think you need to list the PHY, the fallback should be
>>> used.
>>
>> Thanks for pointing me in the right direction Andrew.
>>
>> I applied this diff:
>>
>> diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
>> index 389f33a12534..19d0c209e7e9 100644
>> --- a/drivers/net/phy/mdio_bus.c
>> +++ b/drivers/net/phy/mdio_bus.c
>> @@ -117,8 +117,12 @@ struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr)
>>
>>       mdiodev = bus->mdio_map[addr];
>>
>> -    if (!mdiodev)
>> +    if (!mdiodev) {
>> +        dev_info(&bus->dev, "mdio device doesn't exist\n");
>>           return NULL;
>> +    }
>> +
>> +    dev_info(&bus->dev, "mdio device exists\n");
>>
>>       if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY))
>>           return NULL;
>> diff --git a/net/dsa/slave.c b/net/dsa/slave.c
>> index 165bb2cb8431..0be408e32a76 100644
>> --- a/net/dsa/slave.c
>> +++ b/net/dsa/slave.c
>> @@ -2487,6 +2487,7 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev)
>>           /* We could not connect to a designated PHY or SFP, so try to
>>            * use the switch internal MDIO bus instead
>>            */
>> +        netdev_err(slave_dev, "using switch's internal MDIO bus\n");
>>           ret = dsa_slave_phy_connect(slave_dev, dp->index, phy_flags);
>>       }
>>       if (ret) {
>>
>> With or without this patch, the switch's internal MDIO bus is used to set
>> up the PHYs.
>>
>> DT that defines ethphy0 only, without this patch applied:
>>
>> [    4.660784] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
>> [    4.669026] mdio_bus mt7530-0: mdio device exists
>> [    4.677693] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.693238] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
>> [    4.701589] mdio_bus mt7530-0: mdio device exists
>> [    4.707101] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.718550] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
>> [    4.726856] mdio_bus mt7530-0: mdio device exists
>> [    4.732384] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.743822] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
>> [    4.752154] mdio_bus mt7530-0: mdio device exists
>> [    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.769099] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
>> [    4.781872] mdio_bus mt7530-0: mdio device exists
>> [    4.787413] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)
>>
>> Same DT but with this patch applied:
>>
>> [    4.621547] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
>> [    4.631524] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
>> [    4.639764] mdio_bus mt7530-0: mdio device exists
>> [    4.647770] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.663898] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
>> [    4.672253] mdio_bus mt7530-0: mdio device doesn't exist
>> [    4.677597] mt7530-mdio mdio-bus:1f lan0 (uninitialized): no phy at 1
>> [    4.684053] mt7530-mdio mdio-bus:1f lan0 (uninitialized): failed to connect to PHY: -ENODEV
>> [    4.692435] mt7530-mdio mdio-bus:1f lan0 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 1
>> [    4.703087] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
>> [    4.711408] mdio_bus mt7530-0: mdio device doesn't exist
>> [    4.716731] mt7530-mdio mdio-bus:1f lan1 (uninitialized): no phy at 2
>> [    4.723214] mt7530-mdio mdio-bus:1f lan1 (uninitialized): failed to connect to PHY: -ENODEV
>> [    4.731597] mt7530-mdio mdio-bus:1f lan1 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 2
>> [    4.742199] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
>> [    4.755431] mdio_bus mt7530-0: mdio device doesn't exist
>> [    4.760793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): no phy at 3
>> [    4.767263] mt7530-mdio mdio-bus:1f lan2 (uninitialized): failed to connect to PHY: -ENODEV
>> [    4.775632] mt7530-mdio mdio-bus:1f lan2 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 3
>> [    4.786270] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
>> [    4.794591] mdio_bus mt7530-0: mdio device doesn't exist
>> [    4.799944] mt7530-mdio mdio-bus:1f lan3 (uninitialized): no phy at 4
>> [    4.806397] mt7530-mdio mdio-bus:1f lan3 (uninitialized): failed to connect to PHY: -ENODEV
>> [    4.814782] mt7530-mdio mdio-bus:1f lan3 (uninitialized): error -19 setting up PHY for tree 0, switch 0, port 4
>>
>> DT without the mdio node defined, with this patch applied:
>>
>> [    4.650766] mt7530-mdio mdio-bus:1f: configuring for fixed/trgmii link mode
>> [    4.660687] mt7530-mdio mdio-bus:1f wan (uninitialized): using switch's internal MDIO bus
>> [    4.668937] mdio_bus mt7530-0: mdio device exists
>> [    4.677787] mt7530-mdio mdio-bus:1f wan (uninitialized): PHY [mt7530-0:00] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.693165] mt7530-mdio mdio-bus:1f lan0 (uninitialized): using switch's internal MDIO bus
>> [    4.701517] mdio_bus mt7530-0: mdio device exists
>> [    4.707029] mt7530-mdio mdio-bus:1f lan0 (uninitialized): PHY [mt7530-0:01] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.718469] mt7530-mdio mdio-bus:1f lan1 (uninitialized): using switch's internal MDIO bus
>> [    4.726773] mdio_bus mt7530-0: mdio device exists
>> [    4.732322] mt7530-mdio mdio-bus:1f lan1 (uninitialized): PHY [mt7530-0:02] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.743793] mt7530-mdio mdio-bus:1f lan2 (uninitialized): using switch's internal MDIO bus
>> [    4.752143] mdio_bus mt7530-0: mdio device exists
>> [    4.757662] mt7530-mdio mdio-bus:1f lan2 (uninitialized): PHY [mt7530-0:03] driver [MediaTek MT7530 PHY] (irq=POLL)
>> [    4.769105] mt7530-mdio mdio-bus:1f lan3 (uninitialized): using switch's internal MDIO bus
>> [    4.781905] mdio_bus mt7530-0: mdio device exists
>> [    4.787459] mt7530-mdio mdio-bus:1f lan3 (uninitialized): PHY [mt7530-0:04] driver [MediaTek MT7530 PHY] (irq=POLL)
>>
>> This is how I define it, mind you no phandles.
>>
>> switch@1f {
>>      ...
>>      mdio {
>>          #address-cells = <0x01>;
>>          #size-cells = <0x00>;
>>
>>          ethernet-phy@0 {
>>              reg = <0x00>;
>>          };
>>      };
>> };
>>
>> Like you said, if the mdio node is not defined, the driver will assume 1:1
>> mapping. If not, it will need all the PHYs to be defined on the mdio node
>> along with on the ports node. Hence back to my original statement, we can
>> either force defining the PHYs on the mdio node which would break the ABI,
>> or forget about doing PHY muxing this way.
> 
> While i was not aware of this side effect, I don't see how this breaks the ABI.

Your patch doesn't break it, my then-intention of doing PHY muxing by
utilising this would. Your first patch is perfectly fine as is.

> 
> Existing device-trees not defining the MDIO node will still continue to work.

Agreed, I also confirmed this with my test above.

> 
> Wouldn't we just skip the whole issue by documenting the need for defining all PHYs
> used on the switch when defining the MDIO bus?

Good idea, please do that.

Arınç
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
index e532c6b795f4..50f8f83cc440 100644
--- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
@@ -128,6 +128,12 @@  properties:
       See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
       details for the regulator setup on these boards.
 
+  mdio:
+    $ref: /schemas/net/mdio.yaml#
+    unevaluatedProperties: false
+    description:
+      Node for the internal MDIO bus connected to the embedded ethernet-PHYs.
+
   mediatek,mcm:
     type: boolean
     description: