• Matthew Wilcox's avatar
    PCI: Fix the NIU MSI-X problem in a better way · f598282f
    Matthew Wilcox authored
    The previous MSI-X fix (8d181018) had
    three bugs.  First, it didn't move the write that disabled the vector.
    This led to writing garbage to the MSI-X vector (spotted by Michael
    Ellerman).  It didn't fix the PCI resume case, and it had a race window
    where the device could generate an interrupt before the MSI-X registers
    were programmed (leading to a DMA to random addresses).
    
    Fortunately, the MSI-X capability has a bit to mask all the vectors.
    By setting this bit instead of clearing the enable bit, we can ensure
    the device will not generate spurious interrupts.  Since the capability
    is now enabled, the NIU device will not have a problem with the reads
    and writes to the MSI-X registers being in the original order in the code.
    Signed-off-by: default avatarMatthew Wilcox <willy@linux.intel.com>
    Reviewed-by: default avatarHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    f598282f
msi.c 20.6 KB