• Hidetoshi Seto's avatar
    PCI MSI: Fix restoration of MSI/MSI-X mask states in suspend/resume · 12abb8ba
    Hidetoshi Seto authored
    There are 2 problems on mask states in suspend/resume.
    
    [1]:
    It is better to restore the mask states of MSI/MSI-X to initial states
    (MSI is unmasked, MSI-X is masked) when we release the device.
    The pci_msi_shutdown() does the restoration of mask states for MSI,
    while the msi_free_irqs() does it for MSI-X.  In other words, in the
    "disable" path both of MSI and MSI-X are handled, but in the "shutdown"
    path only MSI is handled.
    
    MSI:
       pci_disable_msi()
          => pci_msi_shutdown()
             [ mask states for MSI restored ]
             => msi_set_enable(dev, pos, 0);
          => msi_free_irqs()
    
    MSI-X:
       pci_disable_msix()
          => pci_msix_shutdown()
             => msix_set_enable(dev, 0);
          => msix_free_all_irqs
             => msi_free_irqs()
                [ mask states for MSI-X restored ]
    
    This patch moves the masking for MSI-X from msi_free_irqs() to
    pci_msix_shutdown().
    
    This change has some positive side effects:
     - It prevents OS from touching mask states before reading preserved
       bits in the register, which can be happen if msi_free_irqs() is
       called from error path in msix_capability_init().
     - It also prevents touching the register after turning off MSI-X in
       "disable" path, which can be a problem on some devices.
    
    [2]:
    We have cache of the mask state in msi_desc, which is automatically
    updated when msi/msix_mask_irq() is called.  This cached states are
    used for the resume.
    
    But since what need to be restored in the resume is the states before
    the shutdown on the suspend, calling msi/msix_mask_irq() from
    pci_msi/msix_shutdown() is not appropriate.
    
    This patch introduces __msi/msix_mask_irq() that do mask as same
    as msi/msix_mask_irq() but does not update cached state, for use
    in pci_msi/msix_shutdown().
    
    [updated: get rid of msi/msix_mask_irq_nocache() (proposed by Matthew Wilcox)]
    Reviewed-by: default avatarMatthew Wilcox <willy@linux.intel.com>
    Signed-off-by: default avatarHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    12abb8ba
msi.c 21.1 KB