netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next v2 00/11] complete Lynx mdio device handling
@ 2023-06-07 11:57 Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 01/11] net: dpaa2-mac: allow lynx PCS to manage mdiodev lifetime Russell King (Oracle)
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:57 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Hi,

This series completes the mdio device lifetime handling for Lynx PCS
users which do not create their own mdio device, but instead fetch
it using a firmware description - namely the DPAA2 and FMAN_MEMAC
drivers.

In a previous patch set, lynx_pcs_create() was modified to increase
the mdio device refcount, and lynx_pcs_destroy() to drop that
refcount.

The first two patches change these two drivers to put the reference
which they hold immediately after lynx_pcs_create(), effectively
handing the responsibility for maintaining the refcount to the Lynx
PCS driver.

A side effect of the first two patches is that lynx_get_mdio_device()
is no longer used, so patch 3 removes it.

Patch 4 adds a new helper - lynx_pcs_create_fwnode(), which creates
a Lynx PCS instance from the fwnode.

Patch 5 and 6 convert the two drivers to make use of this new helper,
which simply has to find the mdio device, and then create the Lynx
PCS from that.

With those conversions done, lynx_pcs_create() is no longer required
outside pcs-lynx.c, so remove it from public view.

Patch 8 we changes lynx_pcs_create() to return an error-pointer rather
than NULL to bring consistency to the return style, and means that we
can remove the NULL-to-error-pointer conversion from both
lynx_pcs_create_fwnode() and lynx_pcs_create_mdiodev().

Patch 9 adds a check for the fwnode being available, and returns an
-ENODEV error pointer if unavailable.

Patch 10 removes this check from DPAA2, detecting the error pointer
value to continue printing the helpful message.

Patch 11 removes this check from fman_memac, and in doing so fixes a
bug where if the node is unavailable, the reference count is not
dropped.

 drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c | 32 +++++++-------
 drivers/net/ethernet/freescale/fman/fman_memac.c | 18 ++------
 drivers/net/pcs/pcs-lynx.c                       | 54 +++++++++++++++++-------
 include/linux/pcs-lynx.h                         |  4 +-
 4 files changed, 58 insertions(+), 50 deletions(-)

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

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

* [PATCH net-next v2 01/11] net: dpaa2-mac: allow lynx PCS to manage mdiodev lifetime
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 02/11] net: fman_memac: allow lynx PCS to handle " Russell King (Oracle)
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Put the mdiodev after lynx_pcs_create() so that the Lynx PCS driver
can manage the lifetime of the mdiodev its using.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
index cb70855e2b9a..c0f7dd3b4ac1 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
@@ -271,9 +271,9 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac,
 	}
 
 	mac->pcs = lynx_pcs_create(mdiodev);
+	mdio_device_put(mdiodev);
 	if (!mac->pcs) {
 		netdev_err(mac->net_dev, "lynx_pcs_create() failed\n");
-		mdio_device_free(mdiodev);
 		return -ENOMEM;
 	}
 
@@ -285,10 +285,7 @@ static void dpaa2_pcs_destroy(struct dpaa2_mac *mac)
 	struct phylink_pcs *phylink_pcs = mac->pcs;
 
 	if (phylink_pcs) {
-		struct mdio_device *mdio = lynx_get_mdio_device(phylink_pcs);
-
 		lynx_pcs_destroy(phylink_pcs);
-		mdio_device_free(mdio);
 		mac->pcs = NULL;
 	}
 }
-- 
2.30.2


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

* [PATCH net-next v2 02/11] net: fman_memac: allow lynx PCS to handle mdiodev lifetime
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 01/11] net: dpaa2-mac: allow lynx PCS to manage mdiodev lifetime Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 03/11] net: pcs: lynx: remove lynx_get_mdio_device() Russell King (Oracle)
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Put the mdiodev after lynx_pcs_create() so that the Lynx PCS driver
can manage the lifetime of the mdiodev its using.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/ethernet/freescale/fman/fman_memac.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c
index 625c79d5636f..8f45caf4af12 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
@@ -976,14 +976,10 @@ static int memac_init(struct fman_mac *memac)
 
 static void pcs_put(struct phylink_pcs *pcs)
 {
-	struct mdio_device *mdiodev;
-
 	if (IS_ERR_OR_NULL(pcs))
 		return;
 
-	mdiodev = lynx_get_mdio_device(pcs);
 	lynx_pcs_destroy(pcs);
-	mdio_device_free(mdiodev);
 }
 
 static int memac_free(struct fman_mac *memac)
@@ -1055,8 +1051,7 @@ static struct phylink_pcs *memac_pcs_create(struct device_node *mac_node,
 		return ERR_PTR(-EPROBE_DEFER);
 
 	pcs = lynx_pcs_create(mdiodev);
-	if (!pcs)
-		mdio_device_free(mdiodev);
+	mdio_device_put(mdiodev);
 
 	return pcs;
 }
-- 
2.30.2


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

* [PATCH net-next v2 03/11] net: pcs: lynx: remove lynx_get_mdio_device()
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 01/11] net: dpaa2-mac: allow lynx PCS to manage mdiodev lifetime Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 02/11] net: fman_memac: allow lynx PCS to handle " Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 04/11] net: pcs: lynx: add lynx_pcs_create_fwnode() Russell King (Oracle)
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

lynx_get_mdio_device() is no longer necessary, let's remove it so the
lynx PCS code is always managing the lifetime of the mdiodev.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/pcs/pcs-lynx.c | 8 --------
 include/linux/pcs-lynx.h   | 2 --
 2 files changed, 10 deletions(-)

diff --git a/drivers/net/pcs/pcs-lynx.c b/drivers/net/pcs/pcs-lynx.c
index f04dc580ffb8..a90f74172f49 100644
--- a/drivers/net/pcs/pcs-lynx.c
+++ b/drivers/net/pcs/pcs-lynx.c
@@ -34,14 +34,6 @@ enum sgmii_speed {
 #define phylink_pcs_to_lynx(pl_pcs) container_of((pl_pcs), struct lynx_pcs, pcs)
 #define lynx_to_phylink_pcs(lynx) (&(lynx)->pcs)
 
-struct mdio_device *lynx_get_mdio_device(struct phylink_pcs *pcs)
-{
-	struct lynx_pcs *lynx = phylink_pcs_to_lynx(pcs);
-
-	return lynx->mdio;
-}
-EXPORT_SYMBOL(lynx_get_mdio_device);
-
 static void lynx_pcs_get_state_usxgmii(struct mdio_device *pcs,
 				       struct phylink_link_state *state)
 {
diff --git a/include/linux/pcs-lynx.h b/include/linux/pcs-lynx.h
index 885b59d10581..25f68a096bfe 100644
--- a/include/linux/pcs-lynx.h
+++ b/include/linux/pcs-lynx.h
@@ -9,8 +9,6 @@
 #include <linux/mdio.h>
 #include <linux/phylink.h>
 
-struct mdio_device *lynx_get_mdio_device(struct phylink_pcs *pcs);
-
 struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio);
 struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr);
 
-- 
2.30.2


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

* [PATCH net-next v2 04/11] net: pcs: lynx: add lynx_pcs_create_fwnode()
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (2 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 03/11] net: pcs: lynx: remove lynx_get_mdio_device() Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 05/11] net: dpaa2-mac: use lynx_pcs_create_fwnode() Russell King (Oracle)
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Add a helper to create a lynx PCS from a fwnode handle.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/pcs/pcs-lynx.c | 29 +++++++++++++++++++++++++++++
 include/linux/pcs-lynx.h   |  1 +
 2 files changed, 30 insertions(+)

diff --git a/drivers/net/pcs/pcs-lynx.c b/drivers/net/pcs/pcs-lynx.c
index a90f74172f49..b0907c67d469 100644
--- a/drivers/net/pcs/pcs-lynx.c
+++ b/drivers/net/pcs/pcs-lynx.c
@@ -353,6 +353,35 @@ struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr)
 }
 EXPORT_SYMBOL(lynx_pcs_create_mdiodev);
 
+struct phylink_pcs *lynx_pcs_create_fwnode(struct fwnode_handle *node)
+{
+	struct mdio_device *mdio;
+	struct phylink_pcs *pcs;
+
+	mdio = fwnode_mdio_find_device(node);
+	if (!mdio)
+		return ERR_PTR(-EPROBE_DEFER);
+
+	pcs = lynx_pcs_create(mdio);
+
+	/* Convert failure to create the PCS to an error pointer, so this
+	 * function has a consistent return value strategy.
+	 */
+	if (!pcs)
+		pcs = ERR_PTR(-ENOMEM);
+
+	/* lynx_create() has taken a refcount on the mdiodev if it was
+	 * successful. If lynx_create() fails, this will free the mdio
+	 * device here. In any case, we don't need to hold our reference
+	 * anymore, and putting it here will allow mdio_device_put() in
+	 * lynx_destroy() to automatically free the mdio device.
+	 */
+	mdio_device_put(mdio);
+
+	return pcs;
+}
+EXPORT_SYMBOL_GPL(lynx_pcs_create_fwnode);
+
 void lynx_pcs_destroy(struct phylink_pcs *pcs)
 {
 	struct lynx_pcs *lynx = phylink_pcs_to_lynx(pcs);
diff --git a/include/linux/pcs-lynx.h b/include/linux/pcs-lynx.h
index 25f68a096bfe..123e813df771 100644
--- a/include/linux/pcs-lynx.h
+++ b/include/linux/pcs-lynx.h
@@ -11,6 +11,7 @@
 
 struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio);
 struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr);
+struct phylink_pcs *lynx_pcs_create_fwnode(struct fwnode_handle *node);
 
 void lynx_pcs_destroy(struct phylink_pcs *pcs);
 
-- 
2.30.2


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

* [PATCH net-next v2 05/11] net: dpaa2-mac: use lynx_pcs_create_fwnode()
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (3 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 04/11] net: pcs: lynx: add lynx_pcs_create_fwnode() Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 06/11] net: fman_memac: " Russell King (Oracle)
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Use lynx_pcs_create_fwnode() to create a lynx PCS from a fwnode handle.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 .../net/ethernet/freescale/dpaa2/dpaa2-mac.c   | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
index c0f7dd3b4ac1..38e6208f9e1a 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
@@ -247,8 +247,8 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac,
 			    struct fwnode_handle *dpmac_node,
 			    int id)
 {
-	struct mdio_device *mdiodev;
 	struct fwnode_handle *node;
+	struct phylink_pcs *pcs;
 
 	node = fwnode_find_reference(dpmac_node, "pcs-handle", 0);
 	if (IS_ERR(node)) {
@@ -263,20 +263,22 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac,
 		return -ENODEV;
 	}
 
-	mdiodev = fwnode_mdio_find_device(node);
+	pcs = lynx_pcs_create_fwnode(node);
 	fwnode_handle_put(node);
-	if (!mdiodev) {
+
+	if (pcs == ERR_PTR(-EPROBE_DEFER)) {
 		netdev_dbg(mac->net_dev, "missing PCS device\n");
 		return -EPROBE_DEFER;
 	}
 
-	mac->pcs = lynx_pcs_create(mdiodev);
-	mdio_device_put(mdiodev);
-	if (!mac->pcs) {
-		netdev_err(mac->net_dev, "lynx_pcs_create() failed\n");
-		return -ENOMEM;
+	if (IS_ERR(pcs)) {
+		netdev_err(mac->net_dev,
+			   "lynx_pcs_create_fwnode() failed: %pe\n", pcs);
+		return PTR_ERR(pcs);
 	}
 
+	mac->pcs = pcs;
+
 	return 0;
 }
 
-- 
2.30.2


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

* [PATCH net-next v2 06/11] net: fman_memac: use lynx_pcs_create_fwnode()
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (4 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 05/11] net: dpaa2-mac: use lynx_pcs_create_fwnode() Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 07/11] net: pcs: lynx: make lynx_pcs_create() static Russell King (Oracle)
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Use lynx_pcs_create_fwnode() to create a lynx PCS from a fwnode handle.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/ethernet/freescale/fman/fman_memac.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c
index 8f45caf4af12..4fbdae996d05 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
@@ -1039,19 +1039,14 @@ static struct phylink_pcs *memac_pcs_create(struct device_node *mac_node,
 					    int index)
 {
 	struct device_node *node;
-	struct mdio_device *mdiodev = NULL;
 	struct phylink_pcs *pcs;
 
 	node = of_parse_phandle(mac_node, "pcsphy-handle", index);
-	if (node && of_device_is_available(node))
-		mdiodev = of_mdio_find_device(node);
-	of_node_put(node);
-
-	if (!mdiodev)
-		return ERR_PTR(-EPROBE_DEFER);
+	if (!node || !of_device_is_available(node))
+		return ERR_PTR(-ENODEV);
 
-	pcs = lynx_pcs_create(mdiodev);
-	mdio_device_put(mdiodev);
+	pcs = lynx_pcs_create_fwnode(of_fwnode_handle(node));
+	of_node_put(node);
 
 	return pcs;
 }
-- 
2.30.2


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

* [PATCH net-next v2 07/11] net: pcs: lynx: make lynx_pcs_create() static
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (5 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 06/11] net: fman_memac: " Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 08/11] net: pcs: lynx: change lynx_pcs_create() to return error-pointers Russell King (Oracle)
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

We no longer need to export lynx_pcs_create() for drivers to use as we
now have all the functionality we need in the two new creation helpers.
Remove the export and prototype, and make it static.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/pcs/pcs-lynx.c | 3 +--
 include/linux/pcs-lynx.h   | 1 -
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/net/pcs/pcs-lynx.c b/drivers/net/pcs/pcs-lynx.c
index b0907c67d469..b8c66137e28d 100644
--- a/drivers/net/pcs/pcs-lynx.c
+++ b/drivers/net/pcs/pcs-lynx.c
@@ -307,7 +307,7 @@ static const struct phylink_pcs_ops lynx_pcs_phylink_ops = {
 	.pcs_link_up = lynx_pcs_link_up,
 };
 
-struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio)
+static struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio)
 {
 	struct lynx_pcs *lynx;
 
@@ -322,7 +322,6 @@ struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio)
 
 	return lynx_to_phylink_pcs(lynx);
 }
-EXPORT_SYMBOL(lynx_pcs_create);
 
 struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr)
 {
diff --git a/include/linux/pcs-lynx.h b/include/linux/pcs-lynx.h
index 123e813df771..7958cccd16f2 100644
--- a/include/linux/pcs-lynx.h
+++ b/include/linux/pcs-lynx.h
@@ -9,7 +9,6 @@
 #include <linux/mdio.h>
 #include <linux/phylink.h>
 
-struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio);
 struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr);
 struct phylink_pcs *lynx_pcs_create_fwnode(struct fwnode_handle *node);
 
-- 
2.30.2


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

* [PATCH net-next v2 08/11] net: pcs: lynx: change lynx_pcs_create() to return error-pointers
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (6 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 07/11] net: pcs: lynx: make lynx_pcs_create() static Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 09/11] net: pcs: lynx: check that the fwnode is available prior to use Russell King (Oracle)
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Change lynx_pcs_create() to return an error-pointer on failure to
allocate memory, rather than returning NULL. This allows the removal
of the conversion in lynx_pcs_create_fwnode() and
lynx_pcs_create_mdiodev().

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/pcs/pcs-lynx.c | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)

diff --git a/drivers/net/pcs/pcs-lynx.c b/drivers/net/pcs/pcs-lynx.c
index b8c66137e28d..c2d01da40430 100644
--- a/drivers/net/pcs/pcs-lynx.c
+++ b/drivers/net/pcs/pcs-lynx.c
@@ -313,7 +313,7 @@ static struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio)
 
 	lynx = kzalloc(sizeof(*lynx), GFP_KERNEL);
 	if (!lynx)
-		return NULL;
+		return ERR_PTR(-ENOMEM);
 
 	mdio_device_get(mdio);
 	lynx->mdio = mdio;
@@ -334,12 +334,6 @@ struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr)
 
 	pcs = lynx_pcs_create(mdio);
 
-	/* Convert failure to create the PCS to an error pointer, so this
-	 * function has a consistent return value strategy.
-	 */
-	if (!pcs)
-		pcs = ERR_PTR(-ENOMEM);
-
 	/* lynx_create() has taken a refcount on the mdiodev if it was
 	 * successful. If lynx_create() fails, this will free the mdio
 	 * device here. In any case, we don't need to hold our reference
@@ -363,12 +357,6 @@ struct phylink_pcs *lynx_pcs_create_fwnode(struct fwnode_handle *node)
 
 	pcs = lynx_pcs_create(mdio);
 
-	/* Convert failure to create the PCS to an error pointer, so this
-	 * function has a consistent return value strategy.
-	 */
-	if (!pcs)
-		pcs = ERR_PTR(-ENOMEM);
-
 	/* lynx_create() has taken a refcount on the mdiodev if it was
 	 * successful. If lynx_create() fails, this will free the mdio
 	 * device here. In any case, we don't need to hold our reference
-- 
2.30.2


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

* [PATCH net-next v2 09/11] net: pcs: lynx: check that the fwnode is available prior to use
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (7 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 08/11] net: pcs: lynx: change lynx_pcs_create() to return error-pointers Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:58 ` [PATCH net-next v2 10/11] net: dpaa2: use pcs-lynx's check for fwnode availability Russell King (Oracle)
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Check that the fwnode is marked as available prior to trying to lookup
the PCS device, and return -ENODEV if unavailable. Document the return
codes from lynx_pcs_create_fwnode().

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/pcs/pcs-lynx.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/net/pcs/pcs-lynx.c b/drivers/net/pcs/pcs-lynx.c
index c2d01da40430..fca48ebf0b81 100644
--- a/drivers/net/pcs/pcs-lynx.c
+++ b/drivers/net/pcs/pcs-lynx.c
@@ -6,6 +6,7 @@
 #include <linux/mdio.h>
 #include <linux/phylink.h>
 #include <linux/pcs-lynx.h>
+#include <linux/property.h>
 
 #define SGMII_CLOCK_PERIOD_NS		8 /* PCS is clocked at 125 MHz */
 #define LINK_TIMER_VAL(ns)		((u32)((ns) / SGMII_CLOCK_PERIOD_NS))
@@ -346,11 +347,24 @@ struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr)
 }
 EXPORT_SYMBOL(lynx_pcs_create_mdiodev);
 
+/*
+ * lynx_pcs_create_fwnode() creates a lynx PCS instance from the fwnode
+ * device indicated by node.
+ *
+ * Returns:
+ *  -ENODEV if the fwnode is marked unavailable
+ *  -EPROBE_DEFER if we fail to find the device
+ *  -ENOMEM if we fail to allocate memory
+ *  pointer to a phylink_pcs on success
+ */
 struct phylink_pcs *lynx_pcs_create_fwnode(struct fwnode_handle *node)
 {
 	struct mdio_device *mdio;
 	struct phylink_pcs *pcs;
 
+	if (!fwnode_device_is_available(node))
+		return ERR_PTR(-ENODEV);
+
 	mdio = fwnode_mdio_find_device(node);
 	if (!mdio)
 		return ERR_PTR(-EPROBE_DEFER);
-- 
2.30.2


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

* [PATCH net-next v2 10/11] net: dpaa2: use pcs-lynx's check for fwnode availability
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (8 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 09/11] net: pcs: lynx: check that the fwnode is available prior to use Russell King (Oracle)
@ 2023-06-07 11:58 ` Russell King (Oracle)
  2023-06-07 11:59 ` [PATCH net-next v2 11/11] net: fman_memac: " Russell King (Oracle)
  2023-06-09  2:30 ` [PATCH net-next v2 00/11] complete Lynx mdio device handling patchwork-bot+netdevbpf
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:58 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Use pcs-lynx's check rather than our own when determining if the device
is available.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
index 38e6208f9e1a..d860d9fe73af 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
@@ -257,12 +257,6 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac,
 		return 0;
 	}
 
-	if (!fwnode_device_is_available(node)) {
-		netdev_err(mac->net_dev, "pcs-handle node not available\n");
-		fwnode_handle_put(node);
-		return -ENODEV;
-	}
-
 	pcs = lynx_pcs_create_fwnode(node);
 	fwnode_handle_put(node);
 
@@ -271,6 +265,11 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac,
 		return -EPROBE_DEFER;
 	}
 
+	if (pcs == ERR_PTR(-ENODEV)) {
+		netdev_err(mac->net_dev, "pcs-handle node not available\n");
+		return PTR_ERR(pcs);
+	}
+
 	if (IS_ERR(pcs)) {
 		netdev_err(mac->net_dev,
 			   "lynx_pcs_create_fwnode() failed: %pe\n", pcs);
-- 
2.30.2


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

* [PATCH net-next v2 11/11] net: fman_memac: use pcs-lynx's check for fwnode availability
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (9 preceding siblings ...)
  2023-06-07 11:58 ` [PATCH net-next v2 10/11] net: dpaa2: use pcs-lynx's check for fwnode availability Russell King (Oracle)
@ 2023-06-07 11:59 ` Russell King (Oracle)
  2023-06-09  2:30 ` [PATCH net-next v2 00/11] complete Lynx mdio device handling patchwork-bot+netdevbpf
  11 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2023-06-07 11:59 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: David S. Miller, Eric Dumazet, Ioana Ciornei, Jakub Kicinski,
	Madalin Bucur, netdev, Paolo Abeni, Sean Anderson

Use pcs-lynx's check rather than our own when determining if the device
is available. This fixes a bug where the reference gained by
of_parse_phandle() is not dropped if the device is not available.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/ethernet/freescale/fman/fman_memac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c
index 4fbdae996d05..3b75cc543be9 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
@@ -1042,7 +1042,7 @@ static struct phylink_pcs *memac_pcs_create(struct device_node *mac_node,
 	struct phylink_pcs *pcs;
 
 	node = of_parse_phandle(mac_node, "pcsphy-handle", index);
-	if (!node || !of_device_is_available(node))
+	if (!node)
 		return ERR_PTR(-ENODEV);
 
 	pcs = lynx_pcs_create_fwnode(of_fwnode_handle(node));
-- 
2.30.2


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

* Re: [PATCH net-next v2 00/11] complete Lynx mdio device handling
  2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
                   ` (10 preceding siblings ...)
  2023-06-07 11:59 ` [PATCH net-next v2 11/11] net: fman_memac: " Russell King (Oracle)
@ 2023-06-09  2:30 ` patchwork-bot+netdevbpf
  11 siblings, 0 replies; 13+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-06-09  2:30 UTC (permalink / raw)
  To: Russell King
  Cc: andrew, hkallweit1, davem, edumazet, ioana.ciornei, kuba,
	madalin.bucur, netdev, pabeni, sean.anderson

Hello:

This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Wed, 7 Jun 2023 12:57:47 +0100 you wrote:
> Hi,
> 
> This series completes the mdio device lifetime handling for Lynx PCS
> users which do not create their own mdio device, but instead fetch
> it using a firmware description - namely the DPAA2 and FMAN_MEMAC
> drivers.
> 
> [...]

Here is the summary with links:
  - [net-next,v2,01/11] net: dpaa2-mac: allow lynx PCS to manage mdiodev lifetime
    https://git.kernel.org/netdev/net-next/c/6c79a9c8b1f3
  - [net-next,v2,02/11] net: fman_memac: allow lynx PCS to handle mdiodev lifetime
    https://git.kernel.org/netdev/net-next/c/d7b6ea1a14e4
  - [net-next,v2,03/11] net: pcs: lynx: remove lynx_get_mdio_device()
    https://git.kernel.org/netdev/net-next/c/b3b984dc0ba6
  - [net-next,v2,04/11] net: pcs: lynx: add lynx_pcs_create_fwnode()
    https://git.kernel.org/netdev/net-next/c/6e1a12821d34
  - [net-next,v2,05/11] net: dpaa2-mac: use lynx_pcs_create_fwnode()
    https://git.kernel.org/netdev/net-next/c/595fa7634d71
  - [net-next,v2,06/11] net: fman_memac: use lynx_pcs_create_fwnode()
    https://git.kernel.org/netdev/net-next/c/929a629c211f
  - [net-next,v2,07/11] net: pcs: lynx: make lynx_pcs_create() static
    https://git.kernel.org/netdev/net-next/c/84e476b876d9
  - [net-next,v2,08/11] net: pcs: lynx: change lynx_pcs_create() to return error-pointers
    https://git.kernel.org/netdev/net-next/c/05b606b88452
  - [net-next,v2,09/11] net: pcs: lynx: check that the fwnode is available prior to use
    https://git.kernel.org/netdev/net-next/c/d143898c6d7b
  - [net-next,v2,10/11] net: dpaa2: use pcs-lynx's check for fwnode availability
    https://git.kernel.org/netdev/net-next/c/8c1d0b339d67
  - [net-next,v2,11/11] net: fman_memac: use pcs-lynx's check for fwnode availability
    https://git.kernel.org/netdev/net-next/c/32fc30353f7c

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

end of thread, other threads:[~2023-06-09  2:30 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-07 11:57 [PATCH net-next v2 00/11] complete Lynx mdio device handling Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 01/11] net: dpaa2-mac: allow lynx PCS to manage mdiodev lifetime Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 02/11] net: fman_memac: allow lynx PCS to handle " Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 03/11] net: pcs: lynx: remove lynx_get_mdio_device() Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 04/11] net: pcs: lynx: add lynx_pcs_create_fwnode() Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 05/11] net: dpaa2-mac: use lynx_pcs_create_fwnode() Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 06/11] net: fman_memac: " Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 07/11] net: pcs: lynx: make lynx_pcs_create() static Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 08/11] net: pcs: lynx: change lynx_pcs_create() to return error-pointers Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 09/11] net: pcs: lynx: check that the fwnode is available prior to use Russell King (Oracle)
2023-06-07 11:58 ` [PATCH net-next v2 10/11] net: dpaa2: use pcs-lynx's check for fwnode availability Russell King (Oracle)
2023-06-07 11:59 ` [PATCH net-next v2 11/11] net: fman_memac: " Russell King (Oracle)
2023-06-09  2:30 ` [PATCH net-next v2 00/11] complete Lynx mdio device handling patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).