• Ben Hutchings's avatar
    3c59x: Fix deadlock in vortex_error() · 89b12fab
    Ben Hutchings authored
    This fixes a bug introduced in commit
    de847272
    "3c59x: Use fine-grained locks for MII and windowed register access".
    
    vortex_interrupt() holds vp->window_lock over multiple register
    accesses to reduce locking overhead.  However it also needs to call
    vortex_error() sometimes, and that uses the regular functions for
    access to windowed registers, which will try to acquire window_lock
    again.
    
    Therefore, drop window_lock around the call to vortex_error() and set
    the window afterward reacquiring the lock.  Since vortex_error() may
    call vortex_rx(), which *does* require its caller to hold window_lock,
    lift that call up into vortex_interrupt().  This also removes the
    potential for calling vortex_rx() on a later-generation NIC.
    
    Reported-and-tested-by: Jens Schüßler <jgs@trash.net> [in Debian's 2.6.32]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    89b12fab
3c59x.c 102 KB