• B
    3c503: Fix IRQ probing · b0cf4dfb
    Ben Hutchings 提交于
    The driver attempts to select an IRQ for the NIC automatically by
    testing which of the supported IRQs are available and then probing
    each available IRQ with probe_irq_{on,off}().  There are obvious race
    conditions here, besides which:
    1. The test for availability is done by passing a NULL handler, which
       now always returns -EINVAL, thus the device cannot be opened:
       <http://bugs.debian.org/566522>
    2. probe_irq_off() will report only the first ISA IRQ handled,
       potentially leading to a false negative.
    
    There was another bug that meant it ignored all error codes from
    request_irq() except -EBUSY, so it would 'succeed' despite this
    (possibly causing conflicts with other ISA devices).  This was fixed
    by ab08999d 'WARNING: some
    request_irq() failures ignored in el2_open()', which exposed bug 1.
    
    This patch:
    1. Replaces the use of probe_irq_{on,off}() with a real interrupt handler
    2. Adds a delay before checking the interrupt-seen flag
    3. Disables interrupts on all failure paths
    4. Distinguishes error codes from the second request_irq() call,
       consistently with the first
    
    Compile-tested only.
    Signed-off-by: NBen Hutchings <ben@decadent.org.uk>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    b0cf4dfb
3c503.c 22.2 KB