Hi Saravana, On Wed, Jul 13, 2022 at 3:40 AM Saravana Kannan <saravanak@xxxxxxxxxx> wrote: > On Tue, Jul 5, 2022 at 2:11 AM Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> wrote: > > On Wed, Jun 1, 2022 at 2:44 PM Saravana Kannan <saravanak@xxxxxxxxxx> wrote: > > > Now that fw_devlink=on by default and fw_devlink supports interrupt > > > properties, the execution will never get to the point where > > > driver_deferred_probe_check_state() is called before the supplier has > > > probed successfully or before deferred probe timeout has expired. > > > > > > So, delete the call and replace it with -ENODEV. > > > > > > Signed-off-by: Saravana Kannan <saravanak@xxxxxxxxxx> > > > > Thanks for your patch, which is now commit f8217275b57aa48d ("net: > > mdio: Delete usage of driver_deferred_probe_check_state()") in > > driver-core/driver-core-next. > > > > Seems like I missed something when providing my T-b for this series, > > sorry for that. > > > arch/arm/boot/dts/r8a7791-koelsch.dts has: > > > > ðer { > > pinctrl-0 = <ðer_pins>, <&phy1_pins>; > > pinctrl-names = "default"; > > > > phy-handle = <&phy1>; > > renesas,ether-link-active-low; > > status = "okay"; > > > > phy1: ethernet-phy@1 { > > compatible = "ethernet-phy-id0022.1537", > > "ethernet-phy-ieee802.3-c22"; > > reg = <1>; > > interrupt-parent = <&irqc0>; > > interrupts = <0 IRQ_TYPE_LEVEL_LOW>; > > micrel,led-mode = <1>; > > reset-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>; > > }; > > }; > > > > Despite the interrupts property, ðer is now probed before irqc0 > > (interrupt-controller@e61c0000 in arch/arm/boot/dts/r8a7791.dtsi), > > causing the PHY not finding its interrupt, and resorting to polling: > > I'd still expect the device link to have been created properly for > this phy device. Could you enable the logging in device_link_add() to > check the link is created between the phy and the IRQ? > > My guess is that this probably has something to do with phys being > attached to drivers differently. Comparison of dmesg before/after enabling debugging, for related nodes: +interrupt-controller@e61c0000 Linked as a fwnode consumer to clock-controller@e6150000 +pmic@58 Linked as a fwnode consumer to interrupt-controller@e61c0000 +regulator@68 Linked as a fwnode consumer to interrupt-controller@e61c0000 Other user of irqc +ethernet@ee700000 Linked as a fwnode consumer to clock-controller@e6150000 +ethernet@ee700000 Linked as a fwnode consumer to pinctrl@e6060000 +ethernet-phy@1 Linked as a fwnode consumer to interrupt-controller@e61c0000 +ethernet-phy@1 Linked as a fwnode consumer to gpio@e6055000 PHY linked correctly to consumers +device: 'e61c0000.interrupt-controller': device_add +device: 'platform:e6150000.clock-controller--platform:e61c0000.interrupt-controller': device_add +devices_kset: Moving e61c0000.interrupt-controller to end of list +platform e61c0000.interrupt-controller: Linked as a consumer to e6150000.clock-controller +interrupt-controller@e61c0000 Dropping the fwnode link to clock-controller@e6150000 +platform e61c0000.interrupt-controller: error -EPROBE_DEFER: supplier e6150000.clock-controller not ready Tried to probe irqc (why? consumer not ready), deferred. +device: 'platform:e61c0000.interrupt-controller--platform:e60b0000.i2c': device_add +platform e60b0000.i2c: Linked as a sync state only consumer to e61c0000.interrupt-controller I guess sync state means through other (child) consumers (pmic, regulator) above? +device: 'ee700000.ethernet': device_add +device: 'platform:e6060000.pinctrl--platform:ee700000.ethernet': device_add +devices_kset: Moving ee700000.ethernet to end of list +platform ee700000.ethernet: Linked as a consumer to e6060000.pinctrl +ethernet@ee700000 Dropping the fwnode link to pinctrl@e6060000 +device: 'platform:e6150000.clock-controller--platform:ee700000.ethernet': device_add +devices_kset: Moving ee700000.ethernet to end of list +platform ee700000.ethernet: Linked as a consumer to e6150000.clock-controller +ethernet@ee700000 Dropping the fwnode link to clock-controller@e6150000 +device: 'platform:e6055000.gpio--platform:ee700000.ethernet': device_add +platform ee700000.ethernet: Linked as a sync state only consumer to e6055000.gpio +device: 'platform:e61c0000.interrupt-controller--platform:ee700000.ethernet': device_add +platform ee700000.ethernet: Linked as a sync state only consumer to e61c0000.interrupt-controller Hence linking ethernet to child (phy) consumers. +device: 'ee700000.ethernet-ffffffff': device_add Probing ethernet... libphy: fwnode_get_phy_id: fwnode /soc/ethernet@ee700000/ethernet-phy@1 phy_id = 0x00221537 libphy: fwnode_get_phy_id: fwnode /soc/ethernet@ee700000/ethernet-phy@1 phy_id = 0x00221537 +fwnode_mdiobus_phy_device_register: fwnode_irq_get() returned -517 +fwnode_mdiobus_phy_device_register: ignoring -EPROBE_DEFER This is the part that got changed by this patch. +device: 'ee700000.ethernet-ffffffff:01': device_add +device: 'platform:e6055000.gpio--mdio_bus:ee700000.ethernet-ffffffff:01': device_add +devices_kset: Moving ee700000.ethernet-ffffffff:01 to end of list +mdio_bus ee700000.ethernet-ffffffff:01: Linked as a consumer to e6055000.gpio +ethernet-phy@1 Dropping the fwnode link to gpio@e6055000 +device: 'platform:e61c0000.interrupt-controller--mdio_bus:ee700000.ethernet-ffffffff:01': device_add +devices_kset: Moving ee700000.ethernet-ffffffff:01 to end of list +mdio_bus ee700000.ethernet-ffffffff:01: Linked as a consumer to e61c0000.interrupt-controller +ethernet-phy@1 Dropping the fwnode link to interrupt-controller@e61c0000 +mdio_bus ee700000.ethernet-ffffffff:01: error -EPROBE_DEFER: supplier e61c0000.interrupt-controller not ready Why was ethernet probed this early? We knew the supplier of the phy was still missing? +device: 'eth1': device_add sh-eth ee700000.ethernet eth1: Base address at 0xee700000, 2e:09:0a:00:6d:85, IRQ 104. +sh-eth ee700000.ethernet: Dropping the link to e6055000.gpio +device: 'platform:e6055000.gpio--platform:ee700000.ethernet': device_unregister +sh-eth ee700000.ethernet: Dropping the link to e61c0000.interrupt-controller +device: 'platform:e61c0000.interrupt-controller--platform:ee700000.ethernet': device_unregister +devices_kset: Moving e61c0000.interrupt-controller to end of list +devices_kset: Moving ee700000.ethernet-ffffffff:01 to end of list renesas_irqc e61c0000.interrupt-controller: driving 10 irqs Finally, irqc is probed. +device: '6-0058': device_add +device: 'platform:e61c0000.interrupt-controller--i2c:6-0058': device_add +devices_kset: Moving 6-0058 to end of list +i2c 6-0058: Linked as a consumer to e61c0000.interrupt-controller +pmic@58 Dropping the fwnode link to interrupt-controller@e61c0000 +device: '6-0068': device_add +device: 'platform:e61c0000.interrupt-controller--i2c:6-0068': device_add +devices_kset: Moving 6-0068 to end of list +i2c 6-0068: Linked as a consumer to e61c0000.interrupt-controller +regulator@68 Dropping the fwnode link to interrupt-controller@e61c0000 Propagating other irqc suppliers to the parent of their consumers +i2c-sh_mobile e60b0000.i2c: Dropping the link to e61c0000.interrupt-controller +device: 'platform:e61c0000.interrupt-controller--platform:e60b0000.i2c': device_unregister +devices_kset: Moving ee700000.ethernet-ffffffff:01 to end of list Micrel KSZ8041RNLI ee700000.ethernet-ffffffff:01: attached PHY driver (mii_bus:phy_addr=ee700000.ethernet-ffffffff:01, irq=POLL) sh-eth ee700000.ethernet eth1: Link is Up - 100Mbps/Full - flow control off Sending DHCP requests ., OK > > -Micrel KSZ8041RNLI ee700000.ethernet-ffffffff:01: attached PHY > > driver (mii_bus:phy_addr=ee700000.ethernet-ffffffff:01, irq=185) > > +Micrel KSZ8041RNLI ee700000.ethernet-ffffffff:01: attached PHY > > driver (mii_bus:phy_addr=ee700000.ethernet-ffffffff:01, irq=POLL) > > Can you drop a WARN() where this is printed to get the stack trace to > check my hypothesis? That didn't help much, as this is the messenger, not the cause. Thanks! Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds