From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:06
This patch set provides ACPI support to DPAA2 network drivers.
It also introduces new fwnode based APIs to support phylink and phy
layers
Following functions are defined:
phylink_fwnode_phy_connect()
fwnode_mdiobus_register_phy()
fwnode_mdiobus_register()
fwnode_get_phy_id()
fwnode_phy_find_device()
device_phy_find_device()
fwnode_get_phy_node()
fwnode_mdio_find_device()
acpi_get_local_address()
First one helps in connecting phy to phylink instance.
Next three helps in getting phy_id and registering phy to mdiobus
Next two help in finding a phy on a mdiobus.
Next one helps in getting phy_node from a fwnode.
Last one is used to get local address from _ADR object.
Corresponding OF functions are refactored.
Tested-on: LX2160ARDB
Changes in v7:
- correct fwnode_mdio_find_device() description
- check NULL in unregister_mii_timestamper()
- Call unregister_mii_timestamper() without NULL check
- Create fwnode_mdio.c and move fwnode_mdiobus_register_phy()
- include fwnode_mdio.h
- Include headers directly used in acpi_mdio.c
- Move fwnode_mdiobus_register() to fwnode_mdio.c
- Include fwnode_mdio.h
- Alphabetically sort header inclusions
- remove unnecassary checks
Changes in v6:
- Minor cleanup
- fix warning for function parameter of fwnode_mdio_find_device()
- Initialize mii_ts to NULL
- use GENMASK() and ACPI_COMPANION_SET()
- some cleanup
- remove unwanted header inclusion
- remove OF check for fixed-link
- use dev_fwnode()
- remove useless else
- replace of_device_is_available() to fwnode_device_is_available()
Changes in v5:
- More cleanup
- Replace fwnode_get_id() with acpi_get_local_address()
- add missing MODULE_LICENSE()
- replace fwnode_get_id() with OF and ACPI function calls
- replace fwnode_get_id() with OF and ACPI function calls
Changes in v4:
- More cleanup
- Improve code structure to handle all cases
- Remove redundant else from fwnode_mdiobus_register()
- Cleanup xgmac_mdio_probe()
- call phy_device_free() before returning
Changes in v3:
- Add more info on legacy DT properties "phy" and "phy-device"
- Redefine fwnode_phy_find_device() to follow of_phy_find_device()
- Use traditional comparison pattern
- Use GENMASK
- Modified to retrieve reg property value for ACPI as well
- Resolved compilation issue with CONFIG_ACPI = n
- Added more info into documentation
- Use acpi_mdiobus_register()
- Avoid unnecessary line removal
- Remove unused inclusion of acpi.h
Changes in v2:
- Updated with more description in document
- use reverse christmas tree ordering for local variables
- Refactor OF functions to use fwnode functions
Calvin Johnson (16):
Documentation: ACPI: DSD: Document MDIO PHY
net: phy: Introduce fwnode_mdio_find_device()
net: phy: Introduce phy related fwnode functions
of: mdio: Refactor of_phy_find_device()
net: phy: Introduce fwnode_get_phy_id()
of: mdio: Refactor of_get_phy_id()
net: mii_timestamper: check NULL in unregister_mii_timestamper()
net: mdiobus: Introduce fwnode_mdiobus_register_phy()
of: mdio: Refactor of_mdiobus_register_phy()
ACPI: utils: Introduce acpi_get_local_address()
net: mdio: Add ACPI support code for mdio
net: mdiobus: Introduce fwnode_mdiobus_register()
net/fsl: Use fwnode_mdiobus_register()
net: phylink: introduce phylink_fwnode_phy_connect()
net: phylink: Refactor phylink_of_phy_connect()
net: dpaa2-mac: Add ACPI support for DPAA2 MAC driver
Documentation/firmware-guide/acpi/dsd/phy.rst | 133 ++++++++++++++++++
MAINTAINERS | 2 +
drivers/acpi/utils.c | 14 ++
.../net/ethernet/freescale/dpaa2/dpaa2-mac.c | 84 ++++++-----
drivers/net/ethernet/freescale/xgmac_mdio.c | 22 +--
drivers/net/mdio/Kconfig | 16 +++
drivers/net/mdio/Makefile | 4 +-
drivers/net/mdio/acpi_mdio.c | 56 ++++++++
drivers/net/mdio/fwnode_mdio.c | 98 +++++++++++++
drivers/net/mdio/of_mdio.c | 80 +----------
drivers/net/phy/mii_timestamper.c | 3 +
drivers/net/phy/phy_device.c | 109 +++++++++++++-
drivers/net/phy/phylink.c | 41 ++++--
include/linux/acpi.h | 7 +
include/linux/acpi_mdio.h | 25 ++++
include/linux/fwnode_mdio.h | 29 ++++
include/linux/of_mdio.h | 6 +-
include/linux/phy.h | 31 ++++
include/linux/phylink.h | 3 +
19 files changed, 631 insertions(+), 132 deletions(-)
create mode 100644 Documentation/firmware-guide/acpi/dsd/phy.rst
create mode 100644 drivers/net/mdio/acpi_mdio.c
create mode 100644 drivers/net/mdio/fwnode_mdio.c
create mode 100644 include/linux/acpi_mdio.h
create mode 100644 include/linux/fwnode_mdio.h
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-11 06:21:34
Introduce ACPI mechanism to get PHYs registered on a MDIO bus and
provide them to be connected to MAC.
Describe properties "phy-handle" and "phy-mode".
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6:
- Minor cleanup
Changes in v5:
- More cleanup
Changes in v4:
- More cleanup
Changes in v3: None
Changes in v2:
- Updated with more description in document
Documentation/firmware-guide/acpi/dsd/phy.rst | 133 ++++++++++++++++++
1 file changed, 133 insertions(+)
create mode 100644 Documentation/firmware-guide/acpi/dsd/phy.rst
@@ -0,0 +1,133 @@+.. SPDX-License-Identifier: GPL-2.0++=========================+MDIO bus and PHYs in ACPI+=========================++The PHYs on an MDIO bus [1] are probed and registered using+fwnode_mdiobus_register_phy().++Later, for connecting these PHYs to their respective MACs, the PHYs registered+on the MDIO bus have to be referenced.++This document introduces two _DSD properties that are to be used+for connecting PHYs on the MDIO bus [3] to the MAC layer.++These properties are defined in accordance with the "Device+Properties UUID For _DSD" [2] document and the+daffd814-6eba-4d8c-8a91-bc9bbf4aa301 UUID must be used in the Device+Data Descriptors containing them.++phy-handle+----------+For each MAC node, a device property "phy-handle" is used to reference+the PHY that is registered on an MDIO bus. This is mandatory for+network interfaces that have PHYs connected to MAC via MDIO bus.++During the MDIO bus driver initialization, PHYs on this bus are probed+using the _ADR object as shown below and are registered on the MDIO bus.++::+ Scope(\_SB.MDI0)+ {+ Device(PHY1) {+ Name (_ADR, 0x1)+ } // end of PHY1++ Device(PHY2) {+ Name (_ADR, 0x2)+ } // end of PHY2+ }++Later, during the MAC driver initialization, the registered PHY devices+have to be retrieved from the MDIO bus. For this, the MAC driver needs+references to the previously registered PHYs which are provided+as device object references (e.g. \_SB.MDI0.PHY1).++phy-mode+--------+The "phy-mode" _DSD property is used to describe the connection to+the PHY. The valid values for "phy-mode" are defined in [4].++The following ASL example illustrates the usage of these properties.++DSDT entry for MDIO node+------------------------++The MDIO bus has an SoC component (MDIO controller) and a platform+component (PHYs on the MDIO bus).++a) Silicon Component+This node describes the MDIO controller, MDI0+---------------------------------------------+::+ Scope(_SB)+ {+ Device(MDI0) {+ Name(_HID, "NXP0006")+ Name(_CCA, 1)+ Name(_UID, 0)+ Name(_CRS, ResourceTemplate() {+ Memory32Fixed(ReadWrite, MDI0_BASE, MDI_LEN)+ Interrupt(ResourceConsumer, Level, ActiveHigh, Shared)+ {+ MDI0_IT+ }+ }) // end of _CRS for MDI0+ } // end of MDI0+ }++b) Platform Component+The PHY1 and PHY2 nodes represent the PHYs connected to MDIO bus MDI0+---------------------------------------------------------------------+::+ Scope(\_SB.MDI0)+ {+ Device(PHY1) {+ Name (_ADR, 0x1)+ } // end of PHY1++ Device(PHY2) {+ Name (_ADR, 0x2)+ } // end of PHY2+ }++DSDT entries representing MAC nodes+-----------------------------------++Below are the MAC nodes where PHY nodes are referenced.+phy-mode and phy-handle are used as explained earlier.+------------------------------------------------------+::+ Scope(\_SB.MCE0.PR17)+ {+ Name (_DSD, Package () {+ ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),+ Package () {+ Package (2) {"phy-mode", "rgmii-id"},+ Package (2) {"phy-handle", \_SB.MDI0.PHY1}+ }+ })+ }++ Scope(\_SB.MCE0.PR18)+ {+ Name (_DSD, Package () {+ ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),+ Package () {+ Package (2) {"phy-mode", "rgmii-id"},+ Package (2) {"phy-handle", \_SB.MDI0.PHY2}}+ }+ })+ }++References+==========++[1] Documentation/networking/phy.rst++[2] https://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf++[3] Documentation/firmware-guide/acpi/DSD-properties-rules.rst++[4] Documentation/devicetree/bindings/net/ethernet-controller.yaml
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:07
Define fwnode_mdio_find_device() to get a pointer to the
mdio_device from fwnode passed to the function.
Refactor of_mdio_find_device() to use fwnode_mdio_find_device().
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- correct fwnode_mdio_find_device() description
Changes in v6:
- fix warning for function parameter of fwnode_mdio_find_device()
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 11 +----------
drivers/net/phy/phy_device.c | 23 +++++++++++++++++++++++
include/linux/phy.h | 6 ++++++
3 files changed, 30 insertions(+), 10 deletions(-)
On Wed, Mar 10, 2021 at 10:21 PM Calvin Johnson
[off-list ref] wrote:
quoted hunk
Define fwnode_mdio_find_device() to get a pointer to the
mdio_device from fwnode passed to the function.
Refactor of_mdio_find_device() to use fwnode_mdio_find_device().
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- correct fwnode_mdio_find_device() description
Changes in v6:
- fix warning for function parameter of fwnode_mdio_find_device()
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 11 +----------
drivers/net/phy/phy_device.c | 23 +++++++++++++++++++++++
include/linux/phy.h | 6 ++++++
3 files changed, 30 insertions(+), 10 deletions(-)
Sorry about the late review, but can you look into using
get_dev_from_fwnode()? As long as you aren't registering two devices
for the same fwnode, it's an O(1) operation instead of having to loop
through a list of devices in a bus. You can check the returned
device's bus type if you aren't sure about not registering two devices
with the same fw_node and then fall back to this looping.
-Saravana
quoted hunk
+ if (!d)
+ return NULL;
+
+ return to_mdio_device(d);
+}
+EXPORT_SYMBOL(fwnode_mdio_find_device);
+
/**
* phy_probe - probe and init a PHY device
* @dev: device to probe and init
From: Calvin Johnson <hidden> Date: 2021-03-11 17:00:04
On Wed, Mar 10, 2021 at 10:50:57PM -0800, Saravana Kannan wrote:
On Wed, Mar 10, 2021 at 10:21 PM Calvin Johnson
[off-list ref] wrote:
quoted
Define fwnode_mdio_find_device() to get a pointer to the
mdio_device from fwnode passed to the function.
Refactor of_mdio_find_device() to use fwnode_mdio_find_device().
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- correct fwnode_mdio_find_device() description
Changes in v6:
- fix warning for function parameter of fwnode_mdio_find_device()
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 11 +----------
drivers/net/phy/phy_device.c | 23 +++++++++++++++++++++++
include/linux/phy.h | 6 ++++++
3 files changed, 30 insertions(+), 10 deletions(-)
Sorry about the late review, but can you look into using
get_dev_from_fwnode()? As long as you aren't registering two devices
for the same fwnode, it's an O(1) operation instead of having to loop
through a list of devices in a bus. You can check the returned
device's bus type if you aren't sure about not registering two devices
with the same fw_node and then fall back to this looping.
I think it is better to keep it simple and clear with
bus_find_device_by_fwnode() instead of the additional code that comes
with get_dev_from_fwnode() until it has clear advantage over the former.
regards
Calvin
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:07
Define fwnode_phy_find_device() to iterate an mdiobus and find the
phy device of the provided phy fwnode. Additionally define
device_phy_find_device() to find phy device of provided device.
Define fwnode_get_phy_node() to get phy_node using named reference.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3:
- Add more info on legacy DT properties "phy" and "phy-device"
- Redefine fwnode_phy_find_device() to follow of_phy_find_device()
Changes in v2:
- use reverse christmas tree ordering for local variables
drivers/net/phy/phy_device.c | 62 ++++++++++++++++++++++++++++++++++++
include/linux/phy.h | 20 ++++++++++++
2 files changed, 82 insertions(+)
@@ -2842,6 +2843,67 @@ struct mdio_device *fwnode_mdio_find_device(struct fwnode_handle *fwnode)}EXPORT_SYMBOL(fwnode_mdio_find_device);+/**+*fwnode_phy_find_device-Forprovidedphy_fwnode,findphy_device.+*+*@phy_fwnode:Pointertothephy'sfwnode.+*+*Ifsuccessful,returnsapointertothephy_devicewiththeembedded+*structdevicerefcountincrementedbyone,orNULLonfailure.+*/+structphy_device*fwnode_phy_find_device(structfwnode_handle*phy_fwnode)+{+structmdio_device*mdiodev;++mdiodev=fwnode_mdio_find_device(phy_fwnode);+if(!mdiodev)+returnNULL;++if(mdiodev->flags&MDIO_DEVICE_FLAG_PHY)+returnto_phy_device(&mdiodev->dev);++put_device(&mdiodev->dev);++returnNULL;+}+EXPORT_SYMBOL(fwnode_phy_find_device);++/**+*device_phy_find_device-Forthegivendevice,getthephy_device+*@dev:Pointertothegivendevice+*+*Referreturnconditionsoffwnode_phy_find_device().+*/+structphy_device*device_phy_find_device(structdevice*dev)+{+returnfwnode_phy_find_device(dev_fwnode(dev));+}+EXPORT_SYMBOL_GPL(device_phy_find_device);++/**+*fwnode_get_phy_node-Getthephy_nodeusingthenamedreference.+*@fwnode:Pointertofwnodefromwhichphy_nodehastobeobtained.+*+*Referreturnconditionsoffwnode_find_reference().+*ForACPI,only"phy-handle"issupported.LegacyDTproperties"phy"+*and"phy-device"arenotsupportedinACPI.DTsupportsallthethree+*namedreferencestothephynode.+*/+structfwnode_handle*fwnode_get_phy_node(structfwnode_handle*fwnode)+{+structfwnode_handle*phy_node;++/* Only phy-handle is used for ACPI */+phy_node=fwnode_find_reference(fwnode,"phy-handle",0);+if(is_acpi_node(fwnode)||!IS_ERR(phy_node))+returnphy_node;+phy_node=fwnode_find_reference(fwnode,"phy",0);+if(IS_ERR(phy_node))+phy_node=fwnode_find_reference(fwnode,"phy-device",0);+returnphy_node;+}+EXPORT_SYMBOL_GPL(fwnode_get_phy_node);+/***phy_probe-probeandinitaPHYdevice*@dev:devicetoprobeandinit
From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:07
Refactor of_phy_find_device() to use fwnode_phy_find_device().
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
From: Daniel Thompson <hidden> Date: 2021-03-16 19:18:33
On Thu, Mar 11, 2021 at 11:49:59AM +0530, Calvin Johnson wrote:
Refactor of_phy_find_device() to use fwnode_phy_find_device().
Signed-off-by: Calvin Johnson <redacted>
This patch series is provoking depmod dependency cycles for me and
it bisected down to this patch (although I think later patches in
the series add further cycles).
The problems emerge when running modules_install either directly or
indirectly via packaging rules such as bindeb-pkg.
~~~
make -j16 INSTALL_MOD_PATH=$PWD/modules modules_install
...
INSTALL sound/usb/misc/snd-ua101.ko
INSTALL sound/usb/snd-usb-audio.ko
INSTALL sound/usb/snd-usbmidi-lib.ko
INSTALL sound/xen/snd_xen_front.ko
DEPMOD 5.12.0-rc3-00009-g1fda33bf463d
depmod: ERROR: Cycle detected: fwnode_mdio -> of_mdio -> fwnode_mdio
depmod: ERROR: Found 2 modules in dependency cycles!
~~~
Kconfig can be found here:
https://gist.github.com/daniel-thompson/6a7d224f3d3950ffa3f63f979b636474
This Kconfig file is for a highly modular kernel derived from the Debian
5.10 arm64 kernel config. I was not able to reproduce using the defconfig
kernel for arm64.
Daniel.
quoted hunk
---
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
From: Calvin Johnson <hidden> Date: 2021-03-17 08:46:26
Hi Daniel,
On Tue, Mar 16, 2021 at 07:17:19PM +0000, Daniel Thompson wrote:
On Thu, Mar 11, 2021 at 11:49:59AM +0530, Calvin Johnson wrote:
quoted
Refactor of_phy_find_device() to use fwnode_phy_find_device().
Signed-off-by: Calvin Johnson <redacted>
This patch series is provoking depmod dependency cycles for me and
it bisected down to this patch (although I think later patches in
the series add further cycles).
The problems emerge when running modules_install either directly or
indirectly via packaging rules such as bindeb-pkg.
~~~
make -j16 INSTALL_MOD_PATH=$PWD/modules modules_install
...
INSTALL sound/usb/misc/snd-ua101.ko
INSTALL sound/usb/snd-usb-audio.ko
INSTALL sound/usb/snd-usbmidi-lib.ko
INSTALL sound/xen/snd_xen_front.ko
DEPMOD 5.12.0-rc3-00009-g1fda33bf463d
depmod: ERROR: Cycle detected: fwnode_mdio -> of_mdio -> fwnode_mdio
depmod: ERROR: Found 2 modules in dependency cycles!
~~~
Kconfig can be found here:
https://gist.github.com/daniel-thompson/6a7d224f3d3950ffa3f63f979b636474
This Kconfig file is for a highly modular kernel derived from the Debian
5.10 arm64 kernel config. I was not able to reproduce using the defconfig
kernel for arm64.
Thanks for catching this. I'm able to reproduce the issue and will fix it.
By the way, is there any integration tool/mechanism out there to which I can
submit the patch series and build for various possible configs like these?
Thanks
Calvin
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Daniel Thompson <hidden> Date: 2021-03-19 11:22:14
On Wed, Mar 17, 2021 at 02:15:20PM +0530, Calvin Johnson wrote:
Hi Daniel,
On Tue, Mar 16, 2021 at 07:17:19PM +0000, Daniel Thompson wrote:
quoted
On Thu, Mar 11, 2021 at 11:49:59AM +0530, Calvin Johnson wrote:
quoted
Refactor of_phy_find_device() to use fwnode_phy_find_device().
Signed-off-by: Calvin Johnson <redacted>
This patch series is provoking depmod dependency cycles for me and
it bisected down to this patch (although I think later patches in
the series add further cycles).
The problems emerge when running modules_install either directly or
indirectly via packaging rules such as bindeb-pkg.
~~~
make -j16 INSTALL_MOD_PATH=$PWD/modules modules_install
...
INSTALL sound/usb/misc/snd-ua101.ko
INSTALL sound/usb/snd-usb-audio.ko
INSTALL sound/usb/snd-usbmidi-lib.ko
INSTALL sound/xen/snd_xen_front.ko
DEPMOD 5.12.0-rc3-00009-g1fda33bf463d
depmod: ERROR: Cycle detected: fwnode_mdio -> of_mdio -> fwnode_mdio
depmod: ERROR: Found 2 modules in dependency cycles!
~~~
Kconfig can be found here:
https://gist.github.com/daniel-thompson/6a7d224f3d3950ffa3f63f979b636474
This Kconfig file is for a highly modular kernel derived from the Debian
5.10 arm64 kernel config. I was not able to reproduce using the defconfig
kernel for arm64.
Thanks for catching this. I'm able to reproduce the issue and will fix it.
By the way, is there any integration tool/mechanism out there to which I can
submit the patch series and build for various possible configs like these?
Not sure which autotester would be most likely to pick this up.
This issue is slightly unusual because it broke the install rather then
the build... and lots of people (including me) primarily run build
tests ;-) .
Anyhow, I guess the best way to pick up module problems like this is
going to be an `allmodconfig` build followed up with `rm -rf modtest;
make modules_install INSTALL_MOD_PATH=$PWD/modtest`.
Daniel.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-23 05:28:51
On Fri, Mar 19, 2021 at 11:21:15AM +0000, Daniel Thompson wrote:
On Wed, Mar 17, 2021 at 02:15:20PM +0530, Calvin Johnson wrote:
quoted
Hi Daniel,
On Tue, Mar 16, 2021 at 07:17:19PM +0000, Daniel Thompson wrote:
quoted
On Thu, Mar 11, 2021 at 11:49:59AM +0530, Calvin Johnson wrote:
quoted
Refactor of_phy_find_device() to use fwnode_phy_find_device().
Signed-off-by: Calvin Johnson <redacted>
This patch series is provoking depmod dependency cycles for me and
it bisected down to this patch (although I think later patches in
the series add further cycles).
The problems emerge when running modules_install either directly or
indirectly via packaging rules such as bindeb-pkg.
~~~
make -j16 INSTALL_MOD_PATH=$PWD/modules modules_install
...
INSTALL sound/usb/misc/snd-ua101.ko
INSTALL sound/usb/snd-usb-audio.ko
INSTALL sound/usb/snd-usbmidi-lib.ko
INSTALL sound/xen/snd_xen_front.ko
DEPMOD 5.12.0-rc3-00009-g1fda33bf463d
depmod: ERROR: Cycle detected: fwnode_mdio -> of_mdio -> fwnode_mdio
depmod: ERROR: Found 2 modules in dependency cycles!
~~~
Kconfig can be found here:
https://gist.github.com/daniel-thompson/6a7d224f3d3950ffa3f63f979b636474
This Kconfig file is for a highly modular kernel derived from the Debian
5.10 arm64 kernel config. I was not able to reproduce using the defconfig
kernel for arm64.
Thanks for catching this. I'm able to reproduce the issue and will fix it.
By the way, is there any integration tool/mechanism out there to which I can
submit the patch series and build for various possible configs like these?
Not sure which autotester would be most likely to pick this up.
This issue is slightly unusual because it broke the install rather then
the build... and lots of people (including me) primarily run build
tests ;-) .
Anyhow, I guess the best way to pick up module problems like this is
going to be an `allmodconfig` build followed up with `rm -rf modtest;
make modules_install INSTALL_MOD_PATH=$PWD/modtest`.
Thanks Daniel for the info.
To resolve this issue, I need to add more fwnode MDIO functions.
I'm working on these. Meanwhile, will separately send out two patches
that got Reviewed-by tag.
Regards
Calvin
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:07
Extract phy_id from compatible string. This will be used by
fwnode_mdiobus_register_phy() to create phy device using the
phy_id.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3:
- Use traditional comparison pattern
- Use GENMASK
Changes in v2: None
drivers/net/phy/phy_device.c | 21 +++++++++++++++++++++
include/linux/phy.h | 5 +++++
2 files changed, 26 insertions(+)
@@ -817,6 +817,27 @@ static int get_phy_c22_id(struct mii_bus *bus, int addr, u32 *phy_id)return0;}+/* Extract the phy ID from the compatible string of the form+*ethernet-phy-idAAAA.BBBB.+*/+intfwnode_get_phy_id(structfwnode_handle*fwnode,u32*phy_id)+{+unsignedintupper,lower;+constchar*cp;+intret;++ret=fwnode_property_read_string(fwnode,"compatible",&cp);+if(ret)+returnret;++if(sscanf(cp,"ethernet-phy-id%4x.%4x",&upper,&lower)!=2)+return-EINVAL;++*phy_id=((upper&GENMASK(15,0))<<16)|(lower&GENMASK(15,0));+return0;+}+EXPORT_SYMBOL(fwnode_get_phy_id);+/***get_phy_device-readsthespecifiedPHYdeviceandreturnsits@phy_device*struct
From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:39
With the introduction of fwnode_get_phy_id(), refactor of_get_phy_id()
to use fwnode equivalent.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:40
Callers of unregister_mii_timestamper() currently check for NULL
value of mii_ts before calling it.
Place the NULL check inside unregister_mii_timestamper() and update
the callers accordingly.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- check NULL in unregister_mii_timestamper()
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 6 ++----
drivers/net/phy/mii_timestamper.c | 3 +++
drivers/net/phy/phy_device.c | 3 +--
3 files changed, 6 insertions(+), 6 deletions(-)
From: Andy Shevchenko <hidden> Date: 2021-03-11 12:06:05
On Thu, Mar 11, 2021 at 8:21 AM Calvin Johnson
[off-list ref] wrote:
Callers of unregister_mii_timestamper() currently check for NULL
value of mii_ts before calling it.
Place the NULL check inside unregister_mii_timestamper() and update
the callers accordingly
FWIW,
Reviewed-by: Andy Shevchenko <redacted>
(Don't remember if it has been suggested by somebody, in that case
perhaps Suggested-by?)
quoted hunk
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- check NULL in unregister_mii_timestamper()
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 6 ++----
drivers/net/phy/mii_timestamper.c | 3 +++
drivers/net/phy/phy_device.c | 3 +--
3 files changed, 6 insertions(+), 6 deletions(-)
From: Calvin Johnson <hidden> Date: 2021-03-11 17:04:18
On Thu, Mar 11, 2021 at 02:04:48PM +0200, Andy Shevchenko wrote:
On Thu, Mar 11, 2021 at 8:21 AM Calvin Johnson
[off-list ref] wrote:
quoted
Callers of unregister_mii_timestamper() currently check for NULL
value of mii_ts before calling it.
Place the NULL check inside unregister_mii_timestamper() and update
the callers accordingly
FWIW,
Reviewed-by: Andy Shevchenko <redacted>
(Don't remember if it has been suggested by somebody, in that case
perhaps Suggested-by?)
From: Calvin Johnson <hidden> Date: 2021-03-11 06:22:41
Introduce fwnode_mdiobus_register_phy() to register PHYs on the
mdiobus. From the compatible string, identify whether the PHY is
c45 and based on this create a PHY device instance which is
registered on the mdiobus.
uninitialized symbol 'mii_ts'
Reported-by: kernel test robot <redacted>
Reported-by: Dan Carpenter <redacted>
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Call unregister_mii_timestamper() without NULL check
- Create fwnode_mdio.c and move fwnode_mdiobus_register_phy()
Changes in v6:
- Initialize mii_ts to NULL
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
MAINTAINERS | 1 +
drivers/net/mdio/Kconfig | 9 ++++
drivers/net/mdio/Makefile | 3 +-
drivers/net/mdio/fwnode_mdio.c | 77 ++++++++++++++++++++++++++++++++++
drivers/net/mdio/of_mdio.c | 3 +-
include/linux/fwnode_mdio.h | 24 +++++++++++
include/linux/of_mdio.h | 6 ++-
7 files changed, 120 insertions(+), 3 deletions(-)
create mode 100644 drivers/net/mdio/fwnode_mdio.c
create mode 100644 include/linux/fwnode_mdio.h
@@ -1,7 +1,8 @@# SPDX-License-Identifier: GPL-2.0# Makefile for Linux MDIO bus drivers-obj-$(CONFIG_OF_MDIO)+=of_mdio.o+obj-$(CONFIG_FWNODE_MDIO)+=fwnode_mdio.o+obj-$(CONFIG_OF_MDIO)+=of_mdio.oobj-$(CONFIG_MDIO_ASPEED)+=mdio-aspeed.oobj-$(CONFIG_MDIO_BCM_IPROC)+=mdio-bcm-iproc.o
@@ -0,0 +1,77 @@+// SPDX-License-Identifier: GPL-2.0-only+/*+*fwnodehelpersfortheMDIO(EthernetPHY)API+*+*ThisfileprovideshelperfunctionsforextractingPHYdeviceinformation+*outofthefwnodeandusingittopopulateanmii_bus.+*/++#include<linux/acpi.h>+#include<linux/of.h>+#include<linux/of_mdio.h>+#include<linux/phy.h>++MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");+MODULE_LICENSE("GPL");++intfwnode_mdiobus_register_phy(structmii_bus*bus,+structfwnode_handle*child,u32addr)+{+structmii_timestamper*mii_ts=NULL;+structphy_device*phy;+boolis_c45=false;+u32phy_id;+intrc;++if(is_of_node(child)){+mii_ts=of_find_mii_timestamper(to_of_node(child));+if(IS_ERR(mii_ts))+returnPTR_ERR(mii_ts);+}++rc=fwnode_property_match_string(child,"compatible","ethernet-phy-ieee802.3-c45");+if(rc>=0)+is_c45=true;++if(is_c45||fwnode_get_phy_id(child,&phy_id))+phy=get_phy_device(bus,addr,is_c45);+else+phy=phy_device_create(bus,addr,phy_id,0,NULL);+if(IS_ERR(phy)){+unregister_mii_timestamper(mii_ts);+returnPTR_ERR(phy);+}++if(is_acpi_node(child)){+phy->irq=bus->irq[addr];++/* Associate the fwnode with the device structure so it+*canbelookeduplater.+*/+phy->mdio.dev.fwnode=child;++/* All data is now stored in the phy struct, so register it */+rc=phy_device_register(phy);+if(rc){+phy_device_free(phy);+fwnode_handle_put(phy->mdio.dev.fwnode);+returnrc;+}+}elseif(is_of_node(child)){+rc=of_mdiobus_phy_device_register(bus,phy,to_of_node(child),addr);+if(rc){+unregister_mii_timestamper(mii_ts);+phy_device_free(phy);+returnrc;+}+}++/* phy->mii_ts may already be defined by the PHY driver. A+*mii_timestamperprobedviathedevicetreewillstillhave+*precedence.+*/+if(mii_ts)+phy->mii_ts=mii_ts;+return0;+}+EXPORT_SYMBOL(fwnode_mdiobus_register_phy);
From: Andy Shevchenko <hidden> Date: 2021-03-11 12:10:51
On Thu, Mar 11, 2021 at 8:21 AM Calvin Johnson
[off-list ref] wrote:
Introduce fwnode_mdiobus_register_phy() to register PHYs on the
mdiobus. From the compatible string, identify whether the PHY is
c45 and based on this create a PHY device instance which is
registered on the mdiobus.
uninitialized symbol 'mii_ts'
Reported-by: kernel test robot <redacted>
Reported-by: Dan Carpenter <redacted>
I don't think it's important to have it in a history of Git. I would
move this after the cutter '---' line below.
quoted hunk
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Call unregister_mii_timestamper() without NULL check
- Create fwnode_mdio.c and move fwnode_mdiobus_register_phy()
Changes in v6:
- Initialize mii_ts to NULL
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
MAINTAINERS | 1 +
drivers/net/mdio/Kconfig | 9 ++++
drivers/net/mdio/Makefile | 3 +-
drivers/net/mdio/fwnode_mdio.c | 77 ++++++++++++++++++++++++++++++++++
drivers/net/mdio/of_mdio.c | 3 +-
include/linux/fwnode_mdio.h | 24 +++++++++++
include/linux/of_mdio.h | 6 ++-
7 files changed, 120 insertions(+), 3 deletions(-)
create mode 100644 drivers/net/mdio/fwnode_mdio.c
create mode 100644 include/linux/fwnode_mdio.h
Wouldn't be better to have
depends on (ACPI || OF) || COMPILE_TEST
And honestly I don't understand it in either (AND or OR) variant. Why
do you need a dependency like this for fwnode API?
Moreover dependencies don't work for "selectable only" items.
quoted hunk
+ depends on PHYLIB
+ select FIXED_PHY
+ help
+ FWNODE MDIO bus (Ethernet PHY) accessors
+
config OF_MDIO
def_tristate PHYLIB
depends on OF
@@ -1,7 +1,8 @@# SPDX-License-Identifier: GPL-2.0# Makefile for Linux MDIO bus drivers-obj-$(CONFIG_OF_MDIO)+=of_mdio.o+obj-$(CONFIG_FWNODE_MDIO)+=fwnode_mdio.o+obj-$(CONFIG_OF_MDIO)+=of_mdio.oobj-$(CONFIG_MDIO_ASPEED)+=mdio-aspeed.oobj-$(CONFIG_MDIO_BCM_IPROC)+=mdio-bcm-iproc.o
@@ -0,0 +1,77 @@+// SPDX-License-Identifier: GPL-2.0-only+/*+*fwnodehelpersfortheMDIO(EthernetPHY)API+*+*ThisfileprovideshelperfunctionsforextractingPHYdeviceinformation+*outofthefwnodeandusingittopopulateanmii_bus.+*/++#include<linux/acpi.h>+#include<linux/of.h>+#include<linux/of_mdio.h>+#include<linux/phy.h>++MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");+MODULE_LICENSE("GPL");++intfwnode_mdiobus_register_phy(structmii_bus*bus,+structfwnode_handle*child,u32addr)+{+structmii_timestamper*mii_ts=NULL;+structphy_device*phy;+boolis_c45=false;+u32phy_id;+intrc;++if(is_of_node(child)){+mii_ts=of_find_mii_timestamper(to_of_node(child));+if(IS_ERR(mii_ts))+returnPTR_ERR(mii_ts);+}++rc=fwnode_property_match_string(child,"compatible","ethernet-phy-ieee802.3-c45");+if(rc>=0)+is_c45=true;++if(is_c45||fwnode_get_phy_id(child,&phy_id))+phy=get_phy_device(bus,addr,is_c45);+else+phy=phy_device_create(bus,addr,phy_id,0,NULL);+if(IS_ERR(phy)){+unregister_mii_timestamper(mii_ts);+returnPTR_ERR(phy);+}++if(is_acpi_node(child)){+phy->irq=bus->irq[addr];++/* Associate the fwnode with the device structure so it+*canbelookeduplater.+*/+phy->mdio.dev.fwnode=child;++/* All data is now stored in the phy struct, so register it */+rc=phy_device_register(phy);+if(rc){+phy_device_free(phy);+fwnode_handle_put(phy->mdio.dev.fwnode);+returnrc;+}+}elseif(is_of_node(child)){+rc=of_mdiobus_phy_device_register(bus,phy,to_of_node(child),addr);+if(rc){+unregister_mii_timestamper(mii_ts);+phy_device_free(phy);+returnrc;+}+}++/* phy->mii_ts may already be defined by the PHY driver. A+*mii_timestamperprobedviathedevicetreewillstillhave+*precedence.+*/+if(mii_ts)+phy->mii_ts=mii_ts;+return0;+}+EXPORT_SYMBOL(fwnode_mdiobus_register_phy);
From: Calvin Johnson <hidden> Date: 2021-03-11 18:01:24
On Thu, Mar 11, 2021 at 02:09:37PM +0200, Andy Shevchenko wrote:
On Thu, Mar 11, 2021 at 8:21 AM Calvin Johnson
[off-list ref] wrote:
quoted
Introduce fwnode_mdiobus_register_phy() to register PHYs on the
mdiobus. From the compatible string, identify whether the PHY is
c45 and based on this create a PHY device instance which is
registered on the mdiobus.
quoted
uninitialized symbol 'mii_ts'
Reported-by: kernel test robot <redacted>
Reported-by: Dan Carpenter <redacted>
I don't think it's important to have it in a history of Git. I would
move this after the cutter '---' line below.
Sorry. I thought I had removed it. Will definitely take care next time.
quoted
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Call unregister_mii_timestamper() without NULL check
- Create fwnode_mdio.c and move fwnode_mdiobus_register_phy()
Changes in v6:
- Initialize mii_ts to NULL
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
MAINTAINERS | 1 +
drivers/net/mdio/Kconfig | 9 ++++
drivers/net/mdio/Makefile | 3 +-
drivers/net/mdio/fwnode_mdio.c | 77 ++++++++++++++++++++++++++++++++++
drivers/net/mdio/of_mdio.c | 3 +-
include/linux/fwnode_mdio.h | 24 +++++++++++
include/linux/of_mdio.h | 6 ++-
7 files changed, 120 insertions(+), 3 deletions(-)
create mode 100644 drivers/net/mdio/fwnode_mdio.c
create mode 100644 include/linux/fwnode_mdio.h
What do you mean by "selectable only" item here? Can you please point to some
other example?
quoted
+ depends on ACPI
+ depends on OF
Wouldn't be better to have
depends on (ACPI || OF) || COMPILE_TEST
And honestly I don't understand it in either (AND or OR) variant. Why
do you need a dependency like this for fwnode API?
Here, fwnode_mdiobus_register_phy() uses objects from both ACPI and OF.
Moreover dependencies don't work for "selectable only" items.
quoted
+ depends on PHYLIB
+ select FIXED_PHY
+ help
+ FWNODE MDIO bus (Ethernet PHY) accessors
+
config OF_MDIO
def_tristate PHYLIB
depends on OF
@@ -1,7 +1,8 @@# SPDX-License-Identifier: GPL-2.0# Makefile for Linux MDIO bus drivers-obj-$(CONFIG_OF_MDIO)+=of_mdio.o+obj-$(CONFIG_FWNODE_MDIO)+=fwnode_mdio.o+obj-$(CONFIG_OF_MDIO)+=of_mdio.oobj-$(CONFIG_MDIO_ASPEED)+=mdio-aspeed.oobj-$(CONFIG_MDIO_BCM_IPROC)+=mdio-bcm-iproc.o
@@ -0,0 +1,77 @@+// SPDX-License-Identifier: GPL-2.0-only+/*+*fwnodehelpersfortheMDIO(EthernetPHY)API+*+*ThisfileprovideshelperfunctionsforextractingPHYdeviceinformation+*outofthefwnodeandusingittopopulateanmii_bus.+*/++#include<linux/acpi.h>+#include<linux/of.h>+#include<linux/of_mdio.h>+#include<linux/phy.h>++MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");+MODULE_LICENSE("GPL");++intfwnode_mdiobus_register_phy(structmii_bus*bus,+structfwnode_handle*child,u32addr)+{+structmii_timestamper*mii_ts=NULL;+structphy_device*phy;+boolis_c45=false;+u32phy_id;+intrc;++if(is_of_node(child)){+mii_ts=of_find_mii_timestamper(to_of_node(child));+if(IS_ERR(mii_ts))+returnPTR_ERR(mii_ts);+}++rc=fwnode_property_match_string(child,"compatible","ethernet-phy-ieee802.3-c45");+if(rc>=0)+is_c45=true;++if(is_c45||fwnode_get_phy_id(child,&phy_id))+phy=get_phy_device(bus,addr,is_c45);+else+phy=phy_device_create(bus,addr,phy_id,0,NULL);+if(IS_ERR(phy)){+unregister_mii_timestamper(mii_ts);+returnPTR_ERR(phy);+}++if(is_acpi_node(child)){+phy->irq=bus->irq[addr];++/* Associate the fwnode with the device structure so it+*canbelookeduplater.+*/+phy->mdio.dev.fwnode=child;++/* All data is now stored in the phy struct, so register it */+rc=phy_device_register(phy);+if(rc){+phy_device_free(phy);+fwnode_handle_put(phy->mdio.dev.fwnode);+returnrc;+}+}elseif(is_of_node(child)){+rc=of_mdiobus_phy_device_register(bus,phy,to_of_node(child),addr);+if(rc){+unregister_mii_timestamper(mii_ts);+phy_device_free(phy);+returnrc;+}+}++/* phy->mii_ts may already be defined by the PHY driver. A+*mii_timestamperprobedviathedevicetreewillstillhave+*precedence.+*/+if(mii_ts)+phy->mii_ts=mii_ts;+return0;+}+EXPORT_SYMBOL(fwnode_mdiobus_register_phy);
From: Andy Shevchenko <hidden> Date: 2021-03-11 18:15:51
On Thu, Mar 11, 2021 at 8:00 PM Calvin Johnson
[off-list ref] wrote:
On Thu, Mar 11, 2021 at 02:09:37PM +0200, Andy Shevchenko wrote:
quoted
On Thu, Mar 11, 2021 at 8:21 AM Calvin Johnson
[off-list ref] wrote:
...
quoted
quoted
+config FWNODE_MDIO
+ def_tristate PHYLIB
(Seems "selectable only" item)
What do you mean by "selectable only" item here? Can you please point to some
other example?
The Kconfig sections without descriptions are not user-visible.
No user can run menuconfig and check a box with "I want this to be compiled".
tristate // selectable-only
tristate "bla bla bla" // user visible and selectable
quoted
quoted
+ depends on ACPI
+ depends on OF
Wouldn't be better to have
depends on (ACPI || OF) || COMPILE_TEST
And honestly I don't understand it in either (AND or OR) variant. Why
do you need a dependency like this for fwnode API?
Here, fwnode_mdiobus_register_phy() uses objects from both ACPI and OF.
APIs? Calls? What really fails if we have !ACPI and / or !OF?
quoted
Moreover dependencies don't work for "selectable only" items.
From: Calvin Johnson <hidden> Date: 2021-03-11 06:23:10
Refactor of_mdiobus_register_phy() to use fwnode_mdiobus_register_phy().
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- include fwnode_mdio.h
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/mdio/of_mdio.c | 39 ++------------------------------------
1 file changed, 2 insertions(+), 37 deletions(-)
@@ -98,43 +99,7 @@ EXPORT_SYMBOL(of_mdiobus_phy_device_register);staticintof_mdiobus_register_phy(structmii_bus*mdio,structdevice_node*child,u32addr){-structmii_timestamper*mii_ts;-structphy_device*phy;-boolis_c45;-intrc;-u32phy_id;--mii_ts=of_find_mii_timestamper(child);-if(IS_ERR(mii_ts))-returnPTR_ERR(mii_ts);--is_c45=of_device_is_compatible(child,-"ethernet-phy-ieee802.3-c45");--if(!is_c45&&!of_get_phy_id(child,&phy_id))-phy=phy_device_create(mdio,addr,phy_id,0,NULL);-else-phy=get_phy_device(mdio,addr,is_c45);-if(IS_ERR(phy)){-unregister_mii_timestamper(mii_ts);-returnPTR_ERR(phy);-}--rc=of_mdiobus_phy_device_register(mdio,phy,child,addr);-if(rc){-unregister_mii_timestamper(mii_ts);-phy_device_free(phy);-returnrc;-}--/* phy->mii_ts may already be defined by the PHY driver. A-*mii_timestamperprobedviathedevicetreewillstillhave-*precedence.-*/-if(mii_ts)-phy->mii_ts=mii_ts;--return0;+returnfwnode_mdiobus_register_phy(mdio,of_fwnode_handle(child),addr);}staticintof_mdiobus_register_device(structmii_bus*mdio,
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-11 06:23:10
Introduce a wrapper around the _ADR evaluation.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6: None
Changes in v5:
- Replace fwnode_get_id() with acpi_get_local_address()
Changes in v4:
- Improve code structure to handle all cases
Changes in v3:
- Modified to retrieve reg property value for ACPI as well
- Resolved compilation issue with CONFIG_ACPI = n
- Added more info into documentation
Changes in v2: None
drivers/acpi/utils.c | 14 ++++++++++++++
include/linux/acpi.h | 7 +++++++
2 files changed, 21 insertions(+)
From: Andy Shevchenko <hidden> Date: 2021-03-11 12:11:53
On Thu, Mar 11, 2021 at 8:22 AM Calvin Johnson
[off-list ref] wrote:
Introduce a wrapper around the _ADR evaluation.
Reviewed-by: Andy Shevchenko <redacted>
quoted hunk
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6: None
Changes in v5:
- Replace fwnode_get_id() with acpi_get_local_address()
Changes in v4:
- Improve code structure to handle all cases
Changes in v3:
- Modified to retrieve reg property value for ACPI as well
- Resolved compilation issue with CONFIG_ACPI = n
- Added more info into documentation
Changes in v2: None
drivers/acpi/utils.c | 14 ++++++++++++++
include/linux/acpi.h | 7 +++++++
2 files changed, 21 insertions(+)
From: Calvin Johnson <hidden> Date: 2021-03-11 06:23:10
Define acpi_mdiobus_register() to Register mii_bus and create PHYs for
each ACPI child node.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Include headers directly used in acpi_mdio.c
Changes in v6:
- use GENMASK() and ACPI_COMPANION_SET()
- some cleanup
- remove unwanted header inclusion
Changes in v5:
- add missing MODULE_LICENSE()
- replace fwnode_get_id() with OF and ACPI function calls
Changes in v4: None
Changes in v3: None
Changes in v2: None
MAINTAINERS | 1 +
drivers/net/mdio/Kconfig | 7 +++++
drivers/net/mdio/Makefile | 1 +
drivers/net/mdio/acpi_mdio.c | 56 ++++++++++++++++++++++++++++++++++++
include/linux/acpi_mdio.h | 25 ++++++++++++++++
5 files changed, 90 insertions(+)
create mode 100644 drivers/net/mdio/acpi_mdio.c
create mode 100644 include/linux/acpi_mdio.h
@@ -1,6 +1,7 @@# SPDX-License-Identifier: GPL-2.0# Makefile for Linux MDIO bus drivers+obj-$(CONFIG_ACPI_MDIO)+=acpi_mdio.oobj-$(CONFIG_FWNODE_MDIO)+=fwnode_mdio.oobj-$(CONFIG_OF_MDIO)+=of_mdio.o
@@ -0,0 +1,56 @@+// SPDX-License-Identifier: GPL-2.0-only+/*+*ACPIhelpersfortheMDIO(EthernetPHY)API+*+*ThisfileprovideshelperfunctionsforextractingPHYdeviceinformation+*outoftheACPIASLandusingittopopulateanmii_bus.+*/++#include<linux/acpi.h>+#include<linux/acpi_mdio.h>+#include<linux/bits.h>+#include<linux/dev_printk.h>+#include<linux/fwnode_mdio.h>+#include<linux/module.h>+#include<linux/types.h>++MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");+MODULE_LICENSE("GPL");++/**+*acpi_mdiobus_register-Registermii_busandcreatePHYsfromtheACPIASL.+*@mdio:pointertomii_busstructure+*@fwnode:pointertofwnodeofMDIObus.+*+*Thisfunctionregistersthemii_busstructureandregistersaphy_device+*foreachchildnodeof@fwnode.+*/+intacpi_mdiobus_register(structmii_bus*mdio,structfwnode_handle*fwnode)+{+structfwnode_handle*child;+u32addr;+intret;++/* Mask out all PHYs from auto probing. */+mdio->phy_mask=GENMASK(31,0);+ret=mdiobus_register(mdio);+if(ret)+returnret;++ACPI_COMPANION_SET(&mdio->dev,to_acpi_device_node(fwnode));++/* Loop over the child nodes and register a phy_device for each PHY */+fwnode_for_each_child_node(fwnode,child){+ret=acpi_get_local_address(ACPI_HANDLE_FWNODE(child),&addr);+if(ret||addr>=PHY_MAX_ADDR)+continue;++ret=fwnode_mdiobus_register_phy(mdio,child,addr);+if(ret==-ENODEV)+dev_err(&mdio->dev,+"MDIO device at address %d is missing.\n",+addr);+}+return0;+}+EXPORT_SYMBOL(acpi_mdiobus_register);
From: Andy Shevchenko <hidden> Date: 2021-03-11 12:15:37
On Thu, Mar 11, 2021 at 8:22 AM Calvin Johnson
[off-list ref] wrote:
quoted hunk
Define acpi_mdiobus_register() to Register mii_bus and create PHYs for
each ACPI child node.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Include headers directly used in acpi_mdio.c
Changes in v6:
- use GENMASK() and ACPI_COMPANION_SET()
- some cleanup
- remove unwanted header inclusion
Changes in v5:
- add missing MODULE_LICENSE()
- replace fwnode_get_id() with OF and ACPI function calls
Changes in v4: None
Changes in v3: None
Changes in v2: None
MAINTAINERS | 1 +
drivers/net/mdio/Kconfig | 7 +++++
drivers/net/mdio/Makefile | 1 +
drivers/net/mdio/acpi_mdio.c | 56 ++++++++++++++++++++++++++++++++++++
include/linux/acpi_mdio.h | 25 ++++++++++++++++
5 files changed, 90 insertions(+)
create mode 100644 drivers/net/mdio/acpi_mdio.c
create mode 100644 include/linux/acpi_mdio.h
Same issue, they are no-ops.
I guess you have to surround OF and ACPI and FWNODE variants by
if PHYLIB
...
endif
This will be an equivalent to depends on PHYLIB
and put this into Makefile
ifneq ($(CONFIG_ACPI),)
obj-$(CONFIG_PHYLIB) += acpi_mdio.o
endif
This will give you the rest, i.e. default PHYLIB + depends on ACPI
Similar for OF
quoted hunk
+ help
+ ACPI MDIO bus (Ethernet PHY) accessors
+
if MDIO_BUS
config MDIO_DEVRES
@@ -1,6 +1,7 @@# SPDX-License-Identifier: GPL-2.0# Makefile for Linux MDIO bus drivers+obj-$(CONFIG_ACPI_MDIO)+=acpi_mdio.oobj-$(CONFIG_FWNODE_MDIO)+=fwnode_mdio.oobj-$(CONFIG_OF_MDIO)+=of_mdio.o
@@ -0,0 +1,56 @@+// SPDX-License-Identifier: GPL-2.0-only+/*+*ACPIhelpersfortheMDIO(EthernetPHY)API+*+*ThisfileprovideshelperfunctionsforextractingPHYdeviceinformation+*outoftheACPIASLandusingittopopulateanmii_bus.+*/++#include<linux/acpi.h>+#include<linux/acpi_mdio.h>+#include<linux/bits.h>+#include<linux/dev_printk.h>+#include<linux/fwnode_mdio.h>+#include<linux/module.h>+#include<linux/types.h>++MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");+MODULE_LICENSE("GPL");++/**+*acpi_mdiobus_register-Registermii_busandcreatePHYsfromtheACPIASL.+*@mdio:pointertomii_busstructure+*@fwnode:pointertofwnodeofMDIObus.+*+*Thisfunctionregistersthemii_busstructureandregistersaphy_device+*foreachchildnodeof@fwnode.+*/+intacpi_mdiobus_register(structmii_bus*mdio,structfwnode_handle*fwnode)+{+structfwnode_handle*child;+u32addr;+intret;++/* Mask out all PHYs from auto probing. */+mdio->phy_mask=GENMASK(31,0);+ret=mdiobus_register(mdio);+if(ret)+returnret;++ACPI_COMPANION_SET(&mdio->dev,to_acpi_device_node(fwnode));++/* Loop over the child nodes and register a phy_device for each PHY */+fwnode_for_each_child_node(fwnode,child){+ret=acpi_get_local_address(ACPI_HANDLE_FWNODE(child),&addr);+if(ret||addr>=PHY_MAX_ADDR)+continue;++ret=fwnode_mdiobus_register_phy(mdio,child,addr);+if(ret==-ENODEV)+dev_err(&mdio->dev,+"MDIO device at address %d is missing.\n",+addr);+}+return0;+}+EXPORT_SYMBOL(acpi_mdiobus_register);
From: Calvin Johnson <hidden> Date: 2021-03-15 10:23:17
On Thu, Mar 11, 2021 at 02:14:37PM +0200, Andy Shevchenko wrote:
On Thu, Mar 11, 2021 at 8:22 AM Calvin Johnson
[off-list ref] wrote:
quoted
Define acpi_mdiobus_register() to Register mii_bus and create PHYs for
each ACPI child node.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Include headers directly used in acpi_mdio.c
Changes in v6:
- use GENMASK() and ACPI_COMPANION_SET()
- some cleanup
- remove unwanted header inclusion
Changes in v5:
- add missing MODULE_LICENSE()
- replace fwnode_get_id() with OF and ACPI function calls
Changes in v4: None
Changes in v3: None
Changes in v2: None
MAINTAINERS | 1 +
drivers/net/mdio/Kconfig | 7 +++++
drivers/net/mdio/Makefile | 1 +
drivers/net/mdio/acpi_mdio.c | 56 ++++++++++++++++++++++++++++++++++++
include/linux/acpi_mdio.h | 25 ++++++++++++++++
5 files changed, 90 insertions(+)
create mode 100644 drivers/net/mdio/acpi_mdio.c
create mode 100644 include/linux/acpi_mdio.h
Same issue, they are no-ops.
I guess you have to surround OF and ACPI and FWNODE variants by
if PHYLIB
...
endif
This will be an equivalent to depends on PHYLIB
and put this into Makefile
ifneq ($(CONFIG_ACPI),)
obj-$(CONFIG_PHYLIB) += acpi_mdio.o
endif
This will give you the rest, i.e. default PHYLIB + depends on ACPI
Similar for OF
I checked the effect of y/n/m choice of PHYLIB on FWNODE_MDIO.
As expected with def_tristate, whenever PHYLIB changes to y/n/m corresponding
change is reflected on FWNODE_MDIO, also considering the state of other
depending CONFIGS like OF and ACPI.
Symbol: FWNODE_MDIO [=n]
│
│ Type : tristate
│
│ Defined at drivers/net/mdio/Kconfig:22
│
│ Depends on: NETDEVICES [=y] && MDIO_DEVICE [=y] && ACPI [=y] && OF [=y] &&
PHYLIB [=n] │
│ Selects: FIXED_PHY [=n]
Effect is similar for ACPI_MDIO and OF_MDIO.
So instead of above proposed method, I think what you proposed in your earlier
email, i.e, "depends on (ACPI || OF) || COMPILE_TEST" seems to be better for
FWNODE_MDIO.
Shall we go ahead with this?
Regards
Calvin
quoted
+ help
+ ACPI MDIO bus (Ethernet PHY) accessors
+
if MDIO_BUS
config MDIO_DEVRES
@@ -1,6 +1,7 @@# SPDX-License-Identifier: GPL-2.0# Makefile for Linux MDIO bus drivers+obj-$(CONFIG_ACPI_MDIO)+=acpi_mdio.oobj-$(CONFIG_FWNODE_MDIO)+=fwnode_mdio.oobj-$(CONFIG_OF_MDIO)+=of_mdio.o
@@ -0,0 +1,56 @@+// SPDX-License-Identifier: GPL-2.0-only+/*+*ACPIhelpersfortheMDIO(EthernetPHY)API+*+*ThisfileprovideshelperfunctionsforextractingPHYdeviceinformation+*outoftheACPIASLandusingittopopulateanmii_bus.+*/++#include<linux/acpi.h>+#include<linux/acpi_mdio.h>+#include<linux/bits.h>+#include<linux/dev_printk.h>+#include<linux/fwnode_mdio.h>+#include<linux/module.h>+#include<linux/types.h>++MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");+MODULE_LICENSE("GPL");++/**+*acpi_mdiobus_register-Registermii_busandcreatePHYsfromtheACPIASL.+*@mdio:pointertomii_busstructure+*@fwnode:pointertofwnodeofMDIObus.+*+*Thisfunctionregistersthemii_busstructureandregistersaphy_device+*foreachchildnodeof@fwnode.+*/+intacpi_mdiobus_register(structmii_bus*mdio,structfwnode_handle*fwnode)+{+structfwnode_handle*child;+u32addr;+intret;++/* Mask out all PHYs from auto probing. */+mdio->phy_mask=GENMASK(31,0);+ret=mdiobus_register(mdio);+if(ret)+returnret;++ACPI_COMPANION_SET(&mdio->dev,to_acpi_device_node(fwnode));++/* Loop over the child nodes and register a phy_device for each PHY */+fwnode_for_each_child_node(fwnode,child){+ret=acpi_get_local_address(ACPI_HANDLE_FWNODE(child),&addr);+if(ret||addr>=PHY_MAX_ADDR)+continue;++ret=fwnode_mdiobus_register_phy(mdio,child,addr);+if(ret==-ENODEV)+dev_err(&mdio->dev,+"MDIO device at address %d is missing.\n",+addr);+}+return0;+}+EXPORT_SYMBOL(acpi_mdiobus_register);
From: Calvin Johnson <hidden> Date: 2021-03-11 06:23:10
Introduce fwnode_mdiobus_register() to register PHYs on the mdiobus.
If the fwnode is DT node, then call of_mdiobus_register().
If it is an ACPI node, then call acpi_mdiobus_register().
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Move fwnode_mdiobus_register() to fwnode_mdio.c
Changes in v6: None
Changes in v5: None
Changes in v4:
- Remove redundant else from fwnode_mdiobus_register()
Changes in v3:
- Use acpi_mdiobus_register()
Changes in v2: None
drivers/net/mdio/fwnode_mdio.c | 21 +++++++++++++++++++++
include/linux/fwnode_mdio.h | 5 +++++
2 files changed, 26 insertions(+)
From: Calvin Johnson <hidden> Date: 2021-03-11 06:23:41
fwnode_mdiobus_register() internally takes care of both DT
and ACPI cases to register mdiobus. Replace existing
of_mdiobus_register() with fwnode_mdiobus_register().
Note: For both ACPI and DT cases, endianness of MDIO controller
need to be specified using "little-endian" property.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- Include fwnode_mdio.h
- Alphabetically sort header inclusions
Changes in v6: None
Changes in v5: None
Changes in v4:
- Cleanup xgmac_mdio_probe()
Changes in v3:
- Avoid unnecessary line removal
- Remove unused inclusion of acpi.h
Changes in v2: None
drivers/net/ethernet/freescale/xgmac_mdio.c | 22 ++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
@@ -11,15 +12,16 @@*kind,whetherexpressorimplied.*/-#include<linux/kernel.h>-#include<linux/slab.h>+#include<linux/fwnode_mdio.h>#include<linux/interrupt.h>-#include<linux/module.h>-#include<linux/phy.h>+#include<linux/kernel.h>#include<linux/mdio.h>+#include<linux/module.h>#include<linux/of_address.h>-#include<linux/of_platform.h>#include<linux/of_mdio.h>+#include<linux/of_platform.h>+#include<linux/phy.h>+#include<linux/slab.h>/* Number of microseconds to wait for a register to respond */#define TIMEOUT 1000
@@ -243,10 +245,9 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum)staticintxgmac_mdio_probe(structplatform_device*pdev){-structdevice_node*np=pdev->dev.of_node;-structmii_bus*bus;-structresource*res;structmdio_fsl_priv*priv;+structresource*res;+structmii_bus*bus;intret;/* In DPAA-1, MDIO is one of the many FMan sub-devices. The FMan
@@ -279,13 +280,16 @@ static int xgmac_mdio_probe(struct platform_device *pdev)gotoerr_ioremap;}+/* For both ACPI and DT cases, endianness of MDIO controller+*needstobespecifiedusing"little-endian"property.+*/priv->is_little_endian=device_property_read_bool(&pdev->dev,"little-endian");priv->has_a011043=device_property_read_bool(&pdev->dev,"fsl,erratum-a011043");-ret=of_mdiobus_register(bus,np);+ret=fwnode_mdiobus_register(bus,pdev->dev.fwnode);if(ret){dev_err(&pdev->dev,"cannot register MDIO bus\n");gotoerr_registration;
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-11 06:23:42
Define phylink_fwnode_phy_connect() to connect phy specified by
a fwnode to a phylink instance.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6:
- remove OF check for fixed-link
Changes in v5: None
Changes in v4:
- call phy_device_free() before returning
Changes in v3: None
Changes in v2: None
drivers/net/phy/phylink.c | 54 +++++++++++++++++++++++++++++++++++++++
include/linux/phylink.h | 3 +++
2 files changed, 57 insertions(+)
@@ -1124,6 +1125,59 @@ int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn,}EXPORT_SYMBOL_GPL(phylink_of_phy_connect);+/**+*phylink_fwnode_phy_connect()-connectthePHYspecifiedinthefwnode.+*@pl:apointertoa&structphylinkreturnedfromphylink_create()+*@fwnode:apointertoa&structfwnode_handle.+*@flags:PHY-specificflagstocommunicatetothePHYdevicedriver+*+*Connectthephyspecified@fwnodetothephylinkinstancespecified+*by@pl.+*+*Returns0onsuccessoranegativeerrno.+*/+intphylink_fwnode_phy_connect(structphylink*pl,+structfwnode_handle*fwnode,+u32flags)+{+structfwnode_handle*phy_fwnode;+structphy_device*phy_dev;+intret;++/* Fixed links and 802.3z are handled without needing a PHY */+if(pl->cfg_link_an_mode==MLO_AN_FIXED||+(pl->cfg_link_an_mode==MLO_AN_INBAND&&+phy_interface_mode_is_8023z(pl->link_interface)))+return0;++phy_fwnode=fwnode_get_phy_node(fwnode);+if(IS_ERR(phy_fwnode)){+if(pl->cfg_link_an_mode==MLO_AN_PHY)+return-ENODEV;+return0;+}++phy_dev=fwnode_phy_find_device(phy_fwnode);+/* We're done with the phy_node handle */+fwnode_handle_put(phy_fwnode);+if(!phy_dev)+return-ENODEV;++ret=phy_attach_direct(pl->netdev,phy_dev,flags,+pl->link_interface);+if(ret){+phy_device_free(phy_dev);+returnret;+}++ret=phylink_bringup_phy(pl,phy_dev,pl->link_config.interface);+if(ret)+phy_detach(phy_dev);++returnret;+}+EXPORT_SYMBOL_GPL(phylink_fwnode_phy_connect);+/***phylink_disconnect_phy()-disconnectanyPHYattachedtothephylink*instance.
From: Calvin Johnson <hidden> Date: 2021-03-11 06:23:42
Refactor phylink_of_phy_connect() to use phylink_fwnode_phy_connect().
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/net/phy/phylink.c | 39 +--------------------------------------
1 file changed, 1 insertion(+), 38 deletions(-)
@@ -1084,44 +1084,7 @@ EXPORT_SYMBOL_GPL(phylink_connect_phy);intphylink_of_phy_connect(structphylink*pl,structdevice_node*dn,u32flags){-structdevice_node*phy_node;-structphy_device*phy_dev;-intret;--/* Fixed links and 802.3z are handled without needing a PHY */-if(pl->cfg_link_an_mode==MLO_AN_FIXED||-(pl->cfg_link_an_mode==MLO_AN_INBAND&&-phy_interface_mode_is_8023z(pl->link_interface)))-return0;--phy_node=of_parse_phandle(dn,"phy-handle",0);-if(!phy_node)-phy_node=of_parse_phandle(dn,"phy",0);-if(!phy_node)-phy_node=of_parse_phandle(dn,"phy-device",0);--if(!phy_node){-if(pl->cfg_link_an_mode==MLO_AN_PHY)-return-ENODEV;-return0;-}--phy_dev=of_phy_find_device(phy_node);-/* We're done with the phy_node handle */-of_node_put(phy_node);-if(!phy_dev)-return-ENODEV;--ret=phy_attach_direct(pl->netdev,phy_dev,flags,-pl->link_interface);-if(ret)-returnret;--ret=phylink_bringup_phy(pl,phy_dev,pl->link_config.interface);-if(ret)-phy_detach(phy_dev);--returnret;+returnphylink_fwnode_phy_connect(pl,of_fwnode_handle(dn),flags);}EXPORT_SYMBOL_GPL(phylink_of_phy_connect);
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Calvin Johnson <hidden> Date: 2021-03-11 06:24:13
Modify dpaa2_mac_get_node() to get the dpmac fwnode from either
DT or ACPI.
Modify dpaa2_mac_get_if_mode() to get interface mode from dpmac_node
which is a fwnode.
Modify dpaa2_pcs_create() to create pcs from dpmac_node fwnode.
Modify dpaa2_mac_connect() to support ACPI along with DT.
Signed-off-by: Calvin Johnson <redacted>
---
Changes in v7:
- remove unnecassary checks
Changes in v6:
- use dev_fwnode()
- remove useless else
- replace of_device_is_available() to fwnode_device_is_available()
Changes in v5:
- replace fwnode_get_id() with OF and ACPI function calls
Changes in v4: None
Changes in v3: None
Changes in v2:
- Refactor OF functions to use fwnode functions
.../net/ethernet/freescale/dpaa2/dpaa2-mac.c | 84 +++++++++++--------
1 file changed, 50 insertions(+), 34 deletions(-)
@@ -34,39 +37,51 @@ static int phy_mode(enum dpmac_eth_if eth_if, phy_interface_t *if_mode)return0;}-/* Caller must call of_node_put on the returned value */-staticstructdevice_node*dpaa2_mac_get_node(u16dpmac_id)+staticstructfwnode_handle*dpaa2_mac_get_node(structdevice*dev,+u16dpmac_id){-structdevice_node*dpmacs,*dpmac=NULL;-u32id;+structfwnode_handle*fwnode,*parent,*child=NULL;+structdevice_node*dpmacs=NULL;interr;+u32id;-dpmacs=of_find_node_by_name(NULL,"dpmacs");-if(!dpmacs)-returnNULL;+fwnode=dev_fwnode(dev->parent);+if(is_of_node(fwnode)){+dpmacs=of_find_node_by_name(NULL,"dpmacs");+if(!dpmacs)+returnNULL;+parent=of_fwnode_handle(dpmacs);+}elseif(is_acpi_node(fwnode)){+parent=fwnode;+}-while((dpmac=of_get_next_child(dpmacs,dpmac))!=NULL){-err=of_property_read_u32(dpmac,"reg",&id);+fwnode_for_each_child_node(parent,child){+err=-EINVAL;+if(is_acpi_device_node(child))+err=acpi_get_local_address(ACPI_HANDLE_FWNODE(child),&id);+elseif(is_of_node(child))+err=of_property_read_u32(to_of_node(child),"reg",&id);if(err)continue;-if(id==dpmac_id)-break;-}+if(id==dpmac_id){+of_node_put(dpmacs);+returnchild;+}+}of_node_put(dpmacs);--returndpmac;+returnNULL;}-staticintdpaa2_mac_get_if_mode(structdevice_node*node,+staticintdpaa2_mac_get_if_mode(structfwnode_handle*dpmac_node,structdpmac_attrattr){phy_interface_tif_mode;interr;-err=of_get_phy_mode(node,&if_mode);-if(!err)-returnif_mode;+err=fwnode_get_phy_mode(dpmac_node);+if(err>0)+returnerr;err=phy_mode(attr.eth_if,&if_mode);if(!err)
@@ -235,26 +250,27 @@ static const struct phylink_mac_ops dpaa2_mac_phylink_ops = {};staticintdpaa2_pcs_create(structdpaa2_mac*mac,-structdevice_node*dpmac_node,intid)+structfwnode_handle*dpmac_node,+intid){structmdio_device*mdiodev;-structdevice_node*node;+structfwnode_handle*node;-node=of_parse_phandle(dpmac_node,"pcs-handle",0);-if(!node){+node=fwnode_find_reference(dpmac_node,"pcs-handle",0);+if(IS_ERR(node)){/* do not error out on old DTS files */netdev_warn(mac->net_dev,"pcs-handle node not found\n");return0;}-if(!of_device_is_available(node)){+if(!fwnode_device_is_available(node)){netdev_err(mac->net_dev,"pcs-handle node not available\n");-of_node_put(node);+fwnode_handle_put(node);return-ENODEV;}-mdiodev=of_mdio_find_device(node);-of_node_put(node);+mdiodev=fwnode_mdio_find_device(node);+fwnode_handle_put(node);if(!mdiodev)return-EPROBE_DEFER;