diff mbox series

net: axiemac: use a phandle to reference pcs_phy

Message ID 20220316075953.61398-1-andy.chiu@sifive.com (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series net: axiemac: use a phandle to reference pcs_phy | expand

Checks

Context Check Description
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 2 this patch: 2
netdev/cc_maintainers fail 2 blamed authors not CCed: robert.hancock@calian.com radhey.shyam.pandey@xilinx.com; 6 maintainers not CCed: linux-riscv@lists.infradead.org paul.walmsley@sifive.com palmer@dabbelt.com radhey.shyam.pandey@xilinx.com linux-arm-kernel@lists.infradead.org robert.hancock@calian.com
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 2 this patch: 2
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 18 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Andy Chiu March 16, 2022, 7:59 a.m. UTC
The `of_mdio_find_device()` would get a reference to `mdio_device` by
a given device tree node. Thus, getting a reference to the internal
PCS/PMA PHY by `lp->phy_node` is incorrect since "phy-handle" in the DT
sould point to the external PHY. This incorrect use of "phy-hanlde"
would cause a problem when the driver called `phylink_of_phy_connect()`,
where it would use "phy-handle" in the DT to connect the external PHY.
To fix it, we could add a phandle, "pcs-phy", in the DT so that it would
point to the internal PHY. And the driver would get the correct address
of PCS/PHY.

Fixes: 1a02556086fc (net: axienet: Properly handle PCS/PMA PHY for 1000BaseX mode)
Signed-off-by: Andy Chiu <andy.chiu@sifive.com>
Reviewed-by: Greentime Hu <greentime.hu@sifive.com>
---
 drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

Comments

Andrew Lunn March 16, 2022, 12:45 p.m. UTC | #1
On Wed, Mar 16, 2022 at 03:59:53PM +0800, Andy Chiu wrote:
> The `of_mdio_find_device()` would get a reference to `mdio_device` by
> a given device tree node. Thus, getting a reference to the internal
> PCS/PMA PHY by `lp->phy_node` is incorrect since "phy-handle" in the DT
> sould point to the external PHY. This incorrect use of "phy-hanlde"
> would cause a problem when the driver called `phylink_of_phy_connect()`,
> where it would use "phy-handle" in the DT to connect the external PHY.
> To fix it, we could add a phandle, "pcs-phy", in the DT so that it would
> point to the internal PHY. And the driver would get the correct address
> of PCS/PHY.
> 
> Fixes: 1a02556086fc (net: axienet: Properly handle PCS/PMA PHY for 1000BaseX mode)
> Signed-off-by: Andy Chiu <andy.chiu@sifive.com>
> Reviewed-by: Greentime Hu <greentime.hu@sifive.com>
> ---
>  drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
> index 6fd5157f0a6d..293189aab4e6 100644
> --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
> +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
> @@ -2073,12 +2073,15 @@ static int axienet_probe(struct platform_device *pdev)
>  	}
>  	if (lp->phy_mode == PHY_INTERFACE_MODE_SGMII ||
>  	    lp->phy_mode == PHY_INTERFACE_MODE_1000BASEX) {
> -		if (!lp->phy_node) {
> -			dev_err(&pdev->dev, "phy-handle required for 1000BaseX/SGMII\n");
> +		np = of_parse_phandle(pdev->dev.of_node, "pcs-phy", 0);

Other drivers call this pcs-handle. Please be consistent with them.

You also should update the binding document with this new property.

	Andrew
Jakub Kicinski March 16, 2022, 8:04 p.m. UTC | #2
On Wed, 16 Mar 2022 15:59:53 +0800 Andy Chiu wrote:
> Fixes: 1a02556086fc (net: axienet: Properly handle PCS/PMA PHY for 1000BaseX mode)

Please make sure to CC the maintainer of the driver. You also ate an
"m" at the end of Robert's address.
Robert Hancock March 16, 2022, 9:14 p.m. UTC | #3
Re: https://lore.kernel.org/all/20220316075953.61398-1-andy.chiu@sifive.com/
(looks like I was CCed with the wrong email):

I think we likely need something similar to this for the use case (I assume)
you have, where there's an external SGMII PHY as well as the internal PCS/PMA
PHY which both need to be configured. However, we (and possibly others) already
have some cases where the core is connected to an SFP cage, phy-handle points
to the internal PCS/PMA PHY, and the external PHY - if one exists at all - is
not in the device tree because it would be on an SFP module.

Also, as Jakub mentioned, it looks like other drivers like dpaa2 use pcs-handle 
for this.

Possibly something like: in the 1000Base-X or SGMII modes, if pcs-handle is
set, then use that as the PCS node, otherwise fall back to assuming phy-handle
points to the PCS. It should not require that both are present, since even in
the pure SGMII case, the PHY could still be supplied by an SFP module
downstream.
Andy Chiu March 17, 2022, 9:10 a.m. UTC | #4
Thanks for the kind help and suggestions.

I will submit the v2 patchset with an updated flow that supports both
cases, and include a binding document. And use the correct mail
address.

Regards,
Andy

On Thu, Mar 17, 2022 at 5:15 AM Robert Hancock
<robert.hancock@calian.com> wrote:
>
> Re: https://lore.kernel.org/all/20220316075953.61398-1-andy.chiu@sifive.com/
> (looks like I was CCed with the wrong email):
>
> I think we likely need something similar to this for the use case (I assume)
> you have, where there's an external SGMII PHY as well as the internal PCS/PMA
> PHY which both need to be configured. However, we (and possibly others) already
> have some cases where the core is connected to an SFP cage, phy-handle points
> to the internal PCS/PMA PHY, and the external PHY - if one exists at all - is
> not in the device tree because it would be on an SFP module.
>
> Also, as Jakub mentioned, it looks like other drivers like dpaa2 use pcs-handle
> for this.
>
> Possibly something like: in the 1000Base-X or SGMII modes, if pcs-handle is
> set, then use that as the PCS node, otherwise fall back to assuming phy-handle
> points to the PCS. It should not require that both are present, since even in
> the pure SGMII case, the PHY could still be supplied by an SFP module
> downstream.
>
> --
> Robert Hancock
> Senior Hardware Designer, Calian Advanced Technologies
> www.calian.com
diff mbox series

Patch

diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index 6fd5157f0a6d..293189aab4e6 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -2073,12 +2073,15 @@  static int axienet_probe(struct platform_device *pdev)
 	}
 	if (lp->phy_mode == PHY_INTERFACE_MODE_SGMII ||
 	    lp->phy_mode == PHY_INTERFACE_MODE_1000BASEX) {
-		if (!lp->phy_node) {
-			dev_err(&pdev->dev, "phy-handle required for 1000BaseX/SGMII\n");
+		np = of_parse_phandle(pdev->dev.of_node, "pcs-phy", 0);
+		if (!lp->phy_node || !np) {
+			dev_err(&pdev->dev, "phy-handle and pcs-phy are required for 1000BaseX/SGMII\n");
+			of_node_put(np);
 			ret = -EINVAL;
 			goto cleanup_mdio;
 		}
-		lp->pcs_phy = of_mdio_find_device(lp->phy_node);
+		lp->pcs_phy = of_mdio_find_device(np);
+		of_node_put(np);
 		if (!lp->pcs_phy) {
 			ret = -EPROBE_DEFER;
 			goto cleanup_mdio;