• Doug Berger's avatar
    net: bcmgenet: protect stop from timeout · 09e805d2
    Doug Berger authored
    A timing hazard exists when the network interface is stopped that
    allows a watchdog timeout to be processed by a separate core in
    parallel. This creates the potential for the timeout handler to
    wake the queues while the driver is shutting down, or access
    registers after their clocks have been removed.
    
    The more common case is that the watchdog timeout will produce a
    warning message which doesn't lead to a crash. The chances of this
    are greatly increased by the fact that bcmgenet_netif_stop stops
    the transmit queues which can easily precipitate a watchdog time-
    out because of stale trans_start data in the queues.
    
    This commit corrects the behavior by ensuring that the watchdog
    timeout is disabled before enterring bcmgenet_netif_stop. There
    are currently only two users of the bcmgenet_netif_stop function:
    close and suspend.
    
    The close case already handles the issue by exiting the RUNNING
    state before invoking the driver close service.
    
    The suspend case now performs the netif_device_detach to exit the
    PRESENT state before the call to bcmgenet_netif_stop rather than
    after it.
    
    These behaviors prevent any future scheduling of the driver timeout
    service during the window. The netif_tx_stop_all_queues function
    in bcmgenet_netif_stop is replaced with netif_tx_disable to ensure
    synchronization with any transmit or timeout threads that may
    already be executing on other cores.
    
    For symmetry, the netif_device_attach call upon resume is moved to
    after the call to bcmgenet_netif_start. Since it wakes the transmit
    queues it is not necessary to invoke netif_tx_start_all_queues from
    bcmgenet_netif_start so it is moved into the driver open service.
    
    Fixes: 1c1008c7 ("net: bcmgenet: add main driver file")
    Signed-off-by: default avatarDoug Berger <opendmb@gmail.com>
    Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    09e805d2
bcmgenet.c 98 KB