• Claudiu Manoil's avatar
    gianfar: Separate out the Tx interrupt handling (Tx NAPI) · aeb12c5e
    Claudiu Manoil authored
    There are some concurrency issues on devices w/ 2 CPUs related
    to the handling of Rx and Tx interrupts.  eTSEC has separate
    interrupt lines for Rx and Tx but a single imask register
    to mask these interrupts and a single NAPI instance to handle
    both Rx and Tx work.  As a result, the Rx and Tx ISRs are
    identical, both are invoking gfar_schedule_cleanup(), however
    both handlers can be entered at the same time when the Rx and
    Tx interrupts are taken by different CPUs.  In this case
    spurrious interrupts (SPU) show up (in /proc/interrupts)
    indicating a concurrency issue.  Also, Tx overruns followed
    by Tx timeout have been observed under heavy Tx traffic load.
    
    To address these issues, the schedule cleanup ISR part has
    been changed to handle the Rx and Tx interrupts independently.
    The patch adds a separate NAPI poll routine for Tx cleanup to
    be triggerred independently by the Tx confirmation interrupts
    only.  Existing poll functions are modified to handle only
    the Rx path processing.  The Tx poll routine does not need a
    budget, since Tx processing doesn't consume NAPI budget, and
    hence it is registered with minimum NAPI weight.
    NAPI scheduling does not require locking since there are
    different NAPI instances between the Rx and Tx confirmation
    paths now.
    So, the patch fixes the occurence of spurrious Rx/Tx interrupts.
    Tx overruns also occur less frequently now.
    Signed-off-by: default avatarClaudiu Manoil <claudiu.manoil@freescale.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    aeb12c5e
gianfar.h 39.2 KB