• J
    lan78xx: Fix race conditions in suspend/resume handling · 5f4cc6e2
    John Efstathiades 提交于
    If the interface is given an IP address while the device is
    suspended (as a result of an auto-suspend event) there is a race
    between lan78xx_resume() and lan78xx_open() that can result in an
    exception or failure to handle incoming packets. The following
    changes fix this problem.
    
    Introduce a mutex to serialise operations in the network interface
    open and stop entry points with respect to the USB driver suspend
    and resume entry points.
    
    Move Tx and Rx data path start/stop to lan78xx_start() and
    lan78xx_stop() respectively and flush the packet FIFOs before
    starting the Tx and Rx data paths. This prevents the MAC and FIFOs
    getting out of step and delivery of malformed packets to the network
    stack.
    
    Stop processing of received packets before disconnecting the
    PHY from the MAC to prevent a kernel exception caused by handling
    packets after the PHY device has been removed.
    
    Refactor device auto-suspend code to make it consistent with the
    the system suspend code and make the suspend handler easier to read.
    
    Add new code to stop wake-on-lan packets or PHY events resuming the
    host or device from suspend if the device has not been opened
    (typically after an IP address is assigned).
    
    This patch is dependent on changes to lan78xx_suspend() and
    lan78xx_resume() introduced in the previous patch of this patch set.
    Signed-off-by: NJohn Efstathiades <john.efstathiades@pebblebay.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    5f4cc6e2
lan78xx.c 110.2 KB