LKML Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH 1/2] dt-bindings: net: lpc-eth: document optional properties
@ 2019-10-10 20:45 Alexandre Belloni
  2019-10-10 20:45 ` [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree Alexandre Belloni
  0 siblings, 1 reply; 6+ messages in thread
From: Alexandre Belloni @ 2019-10-10 20:45 UTC (permalink / raw)
  To: David S . Miller
  Cc: Vladimir Zapolskiy, Sylvain Lemieux, netdev, linux-kernel,
	linux-arm-kernel, Alexandre Belloni

The Ethernet controller is also an mdio controller, to be able to parse
children (phys for example), #address-cells and #size-cells must be
present.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 Documentation/devicetree/bindings/net/lpc-eth.txt | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/lpc-eth.txt b/Documentation/devicetree/bindings/net/lpc-eth.txt
index b92e927808b6..53884555db05 100644
--- a/Documentation/devicetree/bindings/net/lpc-eth.txt
+++ b/Documentation/devicetree/bindings/net/lpc-eth.txt
@@ -9,6 +9,8 @@ Optional properties:
 - phy-mode: See ethernet.txt file in the same directory. If the property is
   absent, "rmii" is assumed.
 - use-iram: Use LPC32xx internal SRAM (IRAM) for DMA buffering
+- #address-cells: should be present when child phy is decribed. Must be 1.
+- #size-cells: should be present when child phy is decribed. Must be 0.
 
 Example:
 
-- 
2.21.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree
  2019-10-10 20:45 [PATCH 1/2] dt-bindings: net: lpc-eth: document optional properties Alexandre Belloni
@ 2019-10-10 20:45 ` Alexandre Belloni
  2019-10-14 23:45   ` Andrew Lunn
                     ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Alexandre Belloni @ 2019-10-10 20:45 UTC (permalink / raw)
  To: David S . Miller
  Cc: Vladimir Zapolskiy, Sylvain Lemieux, netdev, linux-kernel,
	linux-arm-kernel, Alexandre Belloni

When connected to a micrel phy, phy_find_first doesn't work properly
because the first phy found is on address 0, the broadcast address but, the
first thing the phy driver is doing is disabling this broadcast address.
The phy is then available only on address 1 but the mdio driver doesn't
know about it.

Instead, register the mdio bus using of_mdiobus_register and try to find
the phy description in device tree before falling back to phy_find_first.

This ultimately also allows to describe the interrupt the phy is connected
to.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
---
 drivers/net/ethernet/nxp/lpc_eth.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c
index 141571e2ec11..fdcaf70151d4 100644
--- a/drivers/net/ethernet/nxp/lpc_eth.c
+++ b/drivers/net/ethernet/nxp/lpc_eth.c
@@ -15,6 +15,7 @@
 #include <linux/etherdevice.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_mdio.h>
 #include <linux/of_net.h>
 #include <linux/phy.h>
 #include <linux/platform_device.h>
@@ -391,6 +392,7 @@ struct rx_status_t {
 struct netdata_local {
 	struct platform_device	*pdev;
 	struct net_device	*ndev;
+	struct device_node	*phy_node;
 	spinlock_t		lock;
 	void __iomem		*net_base;
 	u32			msg_enable;
@@ -749,22 +751,26 @@ static void lpc_handle_link_change(struct net_device *ndev)
 static int lpc_mii_probe(struct net_device *ndev)
 {
 	struct netdata_local *pldat = netdev_priv(ndev);
-	struct phy_device *phydev = phy_find_first(pldat->mii_bus);
-
-	if (!phydev) {
-		netdev_err(ndev, "no PHY found\n");
-		return -ENODEV;
-	}
+	struct phy_device *phydev;
 
 	/* Attach to the PHY */
 	if (lpc_phy_interface_mode(&pldat->pdev->dev) == PHY_INTERFACE_MODE_MII)
 		netdev_info(ndev, "using MII interface\n");
 	else
 		netdev_info(ndev, "using RMII interface\n");
+
+	if (pldat->phy_node)
+		phydev =  of_phy_find_device(pldat->phy_node);
+	else
+		phydev = phy_find_first(pldat->mii_bus);
+	if (!phydev) {
+		netdev_err(ndev, "no PHY found\n");
+		return -ENODEV;
+	}
+
 	phydev = phy_connect(ndev, phydev_name(phydev),
 			     &lpc_handle_link_change,
 			     lpc_phy_interface_mode(&pldat->pdev->dev));
-
 	if (IS_ERR(phydev)) {
 		netdev_err(ndev, "Could not attach to PHY\n");
 		return PTR_ERR(phydev);
@@ -812,7 +818,7 @@ static int lpc_mii_init(struct netdata_local *pldat)
 
 	platform_set_drvdata(pldat->pdev, pldat->mii_bus);
 
-	if (mdiobus_register(pldat->mii_bus))
+	if (of_mdiobus_register(pldat->mii_bus, pldat->pdev->dev.of_node))
 		goto err_out_unregister_bus;
 
 	if (lpc_mii_probe(pldat->ndev) != 0)
@@ -1345,6 +1351,8 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
 	netdev_dbg(ndev, "DMA buffer V address :0x%p\n",
 			pldat->dma_buff_base_v);
 
+	pldat->phy_node = of_parse_phandle(np, "phy-handle", 0);
+
 	/* Get MAC address from current HW setting (POR state is all zeros) */
 	__lpc_get_mac(pldat, ndev->dev_addr);
 
-- 
2.21.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree
  2019-10-10 20:45 ` [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree Alexandre Belloni
@ 2019-10-14 23:45   ` Andrew Lunn
  2019-10-16  0:22   ` David Miller
  2019-10-16 18:23   ` David Miller
  2 siblings, 0 replies; 6+ messages in thread
From: Andrew Lunn @ 2019-10-14 23:45 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: David S . Miller, netdev, linux-kernel, Vladimir Zapolskiy,
	Sylvain Lemieux, linux-arm-kernel

On Thu, Oct 10, 2019 at 10:45:30PM +0200, Alexandre Belloni wrote:
> When connected to a micrel phy, phy_find_first doesn't work properly
> because the first phy found is on address 0, the broadcast address but, the
> first thing the phy driver is doing is disabling this broadcast address.
> The phy is then available only on address 1 but the mdio driver doesn't
> know about it.
> 
> Instead, register the mdio bus using of_mdiobus_register and try to find
> the phy description in device tree before falling back to phy_find_first.
> 
> This ultimately also allows to describe the interrupt the phy is connected
> to.
> 
> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

Hi Alexandre

>  
> -	if (mdiobus_register(pldat->mii_bus))
> +	if (of_mdiobus_register(pldat->mii_bus, pldat->pdev->dev.of_node))
>  		goto err_out_unregister_bus;

It is normal to use a container node 'mdio' in the ethernet node to
contain the PHY nodes. If you don't do this, you run into issues when
you have Ethernet switches on the MDIO bus.

    Andrew

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree
  2019-10-10 20:45 ` [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree Alexandre Belloni
  2019-10-14 23:45   ` Andrew Lunn
@ 2019-10-16  0:22   ` David Miller
  2019-10-16 18:23   ` David Miller
  2 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2019-10-16  0:22 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: vz, slemieux.tyco, netdev, linux-kernel, linux-arm-kernel

From: Alexandre Belloni <alexandre.belloni@bootlin.com>
Date: Thu, 10 Oct 2019 22:45:30 +0200

> When connected to a micrel phy, phy_find_first doesn't work properly
> because the first phy found is on address 0, the broadcast address but, the
> first thing the phy driver is doing is disabling this broadcast address.
> The phy is then available only on address 1 but the mdio driver doesn't
> know about it.
> 
> Instead, register the mdio bus using of_mdiobus_register and try to find
> the phy description in device tree before falling back to phy_find_first.
> 
> This ultimately also allows to describe the interrupt the phy is connected
> to.
> 
> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

Please respond to Andrew's feedback.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree
  2019-10-10 20:45 ` [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree Alexandre Belloni
  2019-10-14 23:45   ` Andrew Lunn
  2019-10-16  0:22   ` David Miller
@ 2019-10-16 18:23   ` David Miller
  2019-10-16 19:14     ` Alexandre Belloni
  2 siblings, 1 reply; 6+ messages in thread
From: David Miller @ 2019-10-16 18:23 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: vz, slemieux.tyco, netdev, linux-kernel, linux-arm-kernel

From: Alexandre Belloni <alexandre.belloni@bootlin.com>
Date: Thu, 10 Oct 2019 22:45:30 +0200

> When connected to a micrel phy, phy_find_first doesn't work properly
> because the first phy found is on address 0, the broadcast address but, the
> first thing the phy driver is doing is disabling this broadcast address.
> The phy is then available only on address 1 but the mdio driver doesn't
> know about it.
> 
> Instead, register the mdio bus using of_mdiobus_register and try to find
> the phy description in device tree before falling back to phy_find_first.
> 
> This ultimately also allows to describe the interrupt the phy is connected
> to.
> 
> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

I asked you to address Andrew's feedback.

You can't let this sit for days like that.

Therefore, I'm dropping your patches.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree
  2019-10-16 18:23   ` David Miller
@ 2019-10-16 19:14     ` Alexandre Belloni
  0 siblings, 0 replies; 6+ messages in thread
From: Alexandre Belloni @ 2019-10-16 19:14 UTC (permalink / raw)
  To: David Miller; +Cc: vz, slemieux.tyco, netdev, linux-kernel, linux-arm-kernel

Hi,

On 16/10/2019 14:23:59-0400, David Miller wrote:
> From: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Date: Thu, 10 Oct 2019 22:45:30 +0200
> 
> > When connected to a micrel phy, phy_find_first doesn't work properly
> > because the first phy found is on address 0, the broadcast address but, the
> > first thing the phy driver is doing is disabling this broadcast address.
> > The phy is then available only on address 1 but the mdio driver doesn't
> > know about it.
> > 
> > Instead, register the mdio bus using of_mdiobus_register and try to find
> > the phy description in device tree before falling back to phy_find_first.
> > 
> > This ultimately also allows to describe the interrupt the phy is connected
> > to.
> > 
> > Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> 
> I asked you to address Andrew's feedback.
> 
> You can't let this sit for days like that.
> 
> Therefore, I'm dropping your patches.

I'm planning to send a v2 to address that but I didn't have time to test
today.

-- 
Alexandre Belloni, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, back to index

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-10 20:45 [PATCH 1/2] dt-bindings: net: lpc-eth: document optional properties Alexandre Belloni
2019-10-10 20:45 ` [PATCH 2/2] net: lpc_eth: parse phy nodes from device tree Alexandre Belloni
2019-10-14 23:45   ` Andrew Lunn
2019-10-16  0:22   ` David Miller
2019-10-16 18:23   ` David Miller
2019-10-16 19:14     ` Alexandre Belloni

LKML Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git
	git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git
	git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git
	git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git
	git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git
	git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git
	git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git
	git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \
		linux-kernel@vger.kernel.org linux-kernel@archiver.kernel.org
	public-inbox-index lkml

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel


AGPL code for this site: git clone https://public-inbox.org/ public-inbox