Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: Add link between phy dev and mac dev

If the external phy used by current mac interface is
managed by another mac interface, it means that this
network port cannot work independently, especially
when the system suspends and resumes, the following
trace may appear, so we should create a device link
between phy dev and mac dev.

WARNING: CPU: 0 PID: 24 at drivers/net/phy/phy.c:983 phy_error+0x20/0x68
Modules linked in:
CPU: 0 PID: 24 Comm: kworker/0:2 Not tainted 6.1.0-rc3-00011-g5aaef24b5c6d-dirty #34
Hardware name: Freescale i.MX6 SoloX (Device Tree)
Workqueue: events_power_efficient phy_state_machine
unwind_backtrace from show_stack+0x10/0x14
show_stack from dump_stack_lvl+0x68/0x90
dump_stack_lvl from __warn+0xb4/0x24c
__warn from warn_slowpath_fmt+0x5c/0xd8
warn_slowpath_fmt from phy_error+0x20/0x68
phy_error from phy_state_machine+0x22c/0x23c
phy_state_machine from process_one_work+0x288/0x744
process_one_work from worker_thread+0x3c/0x500
worker_thread from kthread+0xf0/0x114
kthread from ret_from_fork+0x14/0x28
Exception stack(0xf0951fb0 to 0xf0951ff8)

Signed-off-by: Xiaolei Wang <xiaolei.wang@windriver.com>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20221130021216.1052230-1-xiaolei.wang@windriver.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Xiaolei Wang and committed by
Jakub Kicinski
bc66fa87 281f8203

+16
+12
drivers/net/phy/phy_device.c
··· 1512 1512 phy_resume(phydev); 1513 1513 phy_led_triggers_register(phydev); 1514 1514 1515 + /** 1516 + * If the external phy used by current mac interface is managed by 1517 + * another mac interface, so we should create a device link between 1518 + * phy dev and mac dev. 1519 + */ 1520 + if (phydev->mdio.bus->parent && dev->dev.parent != phydev->mdio.bus->parent) 1521 + phydev->devlink = device_link_add(dev->dev.parent, &phydev->mdio.dev, 1522 + DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS); 1523 + 1515 1524 return err; 1516 1525 1517 1526 error: ··· 1758 1749 struct net_device *dev = phydev->attached_dev; 1759 1750 struct module *ndev_owner = NULL; 1760 1751 struct mii_bus *bus; 1752 + 1753 + if (phydev->devlink) 1754 + device_link_del(phydev->devlink); 1761 1755 1762 1756 if (phydev->sysfs_links) { 1763 1757 if (dev)
+4
include/linux/phy.h
··· 529 529 * 530 530 * @mdio: MDIO bus this PHY is on 531 531 * @drv: Pointer to the driver for this PHY instance 532 + * @devlink: Create a link between phy dev and mac dev, if the external phy 533 + * used by current mac interface is managed by another mac interface. 532 534 * @phy_id: UID for this device found during discovery 533 535 * @c45_ids: 802.3-c45 Device Identifiers if is_c45. 534 536 * @is_c45: Set to true if this PHY uses clause 45 addressing. ··· 619 617 /* Information about the PHY type */ 620 618 /* And management functions */ 621 619 struct phy_driver *drv; 620 + 621 + struct device_link *devlink; 622 622 623 623 u32 phy_id; 624 624