lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 058/244] net: phy: Warn about incorrect mdio_bus_phy_resume() state
    Date
    From: Florian Fainelli <f.fainelli@gmail.com>

    commit 744d23c71af39c7dc77ac7c3cac87ae86a181a85 upstream.

    Calling mdio_bus_phy_resume() with neither the PHY state machine set to
    PHY_HALTED nor phydev->mac_managed_pm set to true is a good indication
    that we can produce a race condition looking like this:

    CPU0 CPU1
    bcmgenet_resume
    -> phy_resume
    -> phy_init_hw
    -> phy_start
    -> phy_resume
    phy_start_aneg()
    mdio_bus_phy_resume
    -> phy_resume
    -> phy_write(..., BMCR_RESET)
    -> usleep() -> phy_read()

    with the phy_resume() function triggering a PHY behavior that might have
    to be worked around with (see bf8bfc4336f7 ("net: phy: broadcom: Fix
    brcm_fet_config_init()") for instance) that ultimately leads to an error
    reading from the PHY.

    Fixes: fba863b81604 ("net: phy: make PHY PM ops a no-op if MAC driver manages PHY PM")
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Link: https://lore.kernel.org/r/20220801233403.258871-1-f.fainelli@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/phy/phy_device.c | 6 ++++++
    1 file changed, 6 insertions(+)

    --- a/drivers/net/phy/phy_device.c
    +++ b/drivers/net/phy/phy_device.c
    @@ -315,6 +315,12 @@ static __maybe_unused int mdio_bus_phy_r

    phydev->suspended_by_mdio_bus = 0;

    + /* If we managed to get here with the PHY state machine in a state other
    + * than PHY_HALTED this is an indication that something went wrong and
    + * we should most likely be using MAC managed PM and we are not.
    + */
    + WARN_ON(phydev->state != PHY_HALTED && !phydev->mac_managed_pm);
    +
    ret = phy_init_hw(phydev);
    if (ret < 0)
    return ret;

    \
     
     \ /
      Last update: 2022-08-23 11:51    [W:4.063 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site