• Andrew Halaney's avatar
    net: phy: mdio_device: Reset device only when necessary · df16c1c5
    Andrew Halaney authored
    Currently the phy reset sequence is as shown below for a
    devicetree described mdio phy on boot:
    
    1. Assert the phy_device's reset as part of registering
    2. Deassert the phy_device's reset as part of registering
    3. Deassert the phy_device's reset as part of phy_probe
    4. Deassert the phy_device's reset as part of phy_hw_init
    
    The extra two deasserts include waiting the deassert delay afterwards,
    which is adding unnecessary delay.
    
    This applies to both possible types of resets (reset controller
    reference and a reset gpio) that can be used.
    
    Here's some snipped tracing output using the following command line
    params "trace_event=gpio:* trace_options=stacktrace" illustrating
    the reset handling and where its coming from:
    
        /* Assert */
           systemd-udevd-283     [002] .....     6.780434: gpio_value: 544 set 0
           systemd-udevd-283     [002] .....     6.783849: <stack trace>
         => gpiod_set_raw_value_commit
         => gpiod_set_value_nocheck
         => gpiod_set_value_cansleep
         => mdio_device_reset
         => mdiobus_register_device
         => phy_device_register
         => fwnode_mdiobus_phy_device_register
         => fwnode_mdiobus_register_phy
         => __of_mdiobus_register
         => stmmac_mdio_register
         => stmmac_dvr_probe
         => stmmac_pltfr_probe
         => devm_stmmac_pltfr_probe
         => qcom_ethqos_probe
         => platform_probe
    
        /* Deassert */
           systemd-udevd-283     [002] .....     6.802480: gpio_value: 544 set 1
           systemd-udevd-283     [002] .....     6.805886: <stack trace>
         => gpiod_set_raw_value_commit
         => gpiod_set_value_nocheck
         => gpiod_set_value_cansleep
         => mdio_device_reset
         => phy_device_register
         => fwnode_mdiobus_phy_device_register
         => fwnode_mdiobus_register_phy
         => __of_mdiobus_register
         => stmmac_mdio_register
         => stmmac_dvr_probe
         => stmmac_pltfr_probe
         => devm_stmmac_pltfr_probe
         => qcom_ethqos_probe
         => platform_probe
    
        /* Deassert */
           systemd-udevd-283     [002] .....     6.882601: gpio_value: 544 set 1
           systemd-udevd-283     [002] .....     6.886014: <stack trace>
         => gpiod_set_raw_value_commit
         => gpiod_set_value_nocheck
         => gpiod_set_value_cansleep
         => mdio_device_reset
         => phy_probe
         => really_probe
         => __driver_probe_device
         => driver_probe_device
         => __device_attach_driver
         => bus_for_each_drv
         => __device_attach
         => device_initial_probe
         => bus_probe_device
         => device_add
         => phy_device_register
         => fwnode_mdiobus_phy_device_register
         => fwnode_mdiobus_register_phy
         => __of_mdiobus_register
         => stmmac_mdio_register
         => stmmac_dvr_probe
         => stmmac_pltfr_probe
         => devm_stmmac_pltfr_probe
         => qcom_ethqos_probe
         => platform_probe
    
        /* Deassert */
          NetworkManager-477     [000] .....     7.023144: gpio_value: 544 set 1
          NetworkManager-477     [000] .....     7.026596: <stack trace>
         => gpiod_set_raw_value_commit
         => gpiod_set_value_nocheck
         => gpiod_set_value_cansleep
         => mdio_device_reset
         => phy_init_hw
         => phy_attach_direct
         => phylink_fwnode_phy_connect
         => __stmmac_open
         => stmmac_open
    
    There's a lot of paths where the device is getting its reset
    asserted and deasserted. Let's track the state and only actually
    do the assert/deassert when it changes.
    Reported-by: default avatarSagar Cheluvegowda <quic_scheluve@quicinc.com>
    Signed-off-by: default avatarAndrew Halaney <ahalaney@redhat.com>
    Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
    Link: https://lore.kernel.org/r/20231127-net-phy-reset-once-v2-1-448e8658779e@redhat.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    df16c1c5
mdio_device.c 5.37 KB