]> git.baikalelectronics.ru Git - kernel.git/commit
net: phy: fix auto-negotiation stall due to unavailable interrupt
authorAlexander Kochetkov <al.kochet@gmail.com>
Thu, 20 Apr 2017 11:00:04 +0000 (14:00 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 26 Apr 2017 18:32:00 +0000 (14:32 -0400)
commit7a6387ca674932f116c6ebe5e26226739b10bc66
treef6abfba711996bbd96e8d60659837cfdaa906166
parent9d54a645f3df5fcf0b35fb6adaa61954a6367393
net: phy: fix auto-negotiation stall due to unavailable interrupt

The Ethernet link on an interrupt driven PHY was not coming up if the Ethernet
cable was plugged before the Ethernet interface was brought up.

The patch trigger PHY state machine to update link state if PHY was requested to
do auto-negotiation and auto-negotiation complete flag already set.

During power-up cycle the PHY do auto-negotiation, generate interrupt and set
auto-negotiation complete flag. Interrupt is handled by PHY state machine but
doesn't update link state because PHY is in PHY_READY state. After some time
MAC bring up, start and request PHY to do auto-negotiation. If there are no new
settings to advertise genphy_config_aneg() doesn't start PHY auto-negotiation.
PHY continue to stay in auto-negotiation complete state and doesn't fire
interrupt. At the same time PHY state machine expect that PHY started
auto-negotiation and is waiting for interrupt from PHY and it won't get it.

Fixes: 04b53e7e57e5 ("net: phy: Use interrupts when available in NOLINK state")
Signed-off-by: Alexander Kochetkov <al.kochet@gmail.com>
Cc: stable <stable@vger.kernel.org> # v4.9+
Tested-by: Roger Quadros <rogerq@ti.com>
Tested-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy.c
include/linux/phy.h