• Russell King (Oracle)'s avatar
    net: phy: fix regression with AX88772A PHY driver · 6a23c555
    Russell King (Oracle) authored
    Marek reports that a deadlock occurs with the AX88772A PHY used on the
    ASIX USB network driver:
    
    asix 1-1.4:1.0 (unnamed net_device) (uninitialized): PHY [usb-001:003:10] driver [Asix Electronics AX88772A] (irq=POLL)
    Asix Electronics AX88772A usb-001:003:10: attached PHY driver(mii_bus:phy_addr=usb-001:003:10, irq=POLL)
    asix 1-1.4:1.0 eth0: register 'asix' at usb-12110000.usb-1.4, ASIX AX88772 USB 2.0 Ethernet, a2:99:b6:cd:11:eb
    asix 1-1.4:1.0 eth0: configuring for phy/internal link mode
    
    ============================================
    WARNING: possible recursive locking detected
    6.6.0-rc1-00239-g8da77df6-dirty #13949 Not tainted
    --------------------------------------------
    kworker/3:3/71 is trying to acquire lock:
    c6c704cc (&dev->lock){+.+.}-{3:3}, at: phy_start_aneg+0x1c/0x38
    
    but task is already holding lock:
    c6c704cc (&dev->lock){+.+.}-{3:3}, at: phy_state_machine+0x100/0x2b8
    
    This is because we now consistently call phy_process_state_change()
    while holding phydev->lock, but the AX88772A PHY driver then goes on
    to call phy_start_aneg() which tries to grab the same lock - causing
    deadlock.
    
    Fix this by exporting the unlocked version, and use this in the PHY
    driver instead.
    Reported-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Fixes: ef113a60 ("net: phy: call phy_error_precise() while holding the lock")
    Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
    Link: https://lore.kernel.org/r/E1qiEFs-007g7b-Lq@rmk-PC.armlinux.org.ukSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    6a23c555
ax88796b.c 3.32 KB