• Kleber Sacilotto de Souza's avatar
    [SCSI] ipr: fix EEH recovery · 99c965dd
    Kleber Sacilotto de Souza authored
    After commits c82f63e4 (PCI: check saved
    state before restore) and 4b77b0a2 (PCI:
    Clear saved_state after the state has been restored) PCI drivers are
    prevented from restoring the device standard configuration registers
    twice in a row. These changes introduced a regression on ipr EEH
    recovery.
    
    The ipr device driver saves the PCI state only during the device probe
    and restores it on ipr_reset_restore_cfg_space() during IOA resets. This
    behavior is causing the EEH recovery to fail after the second error
    detected, since the registers are not being restored.
    
    One possible solution would be saving the registers after restoring
    them. The problem with this approach is that while recovering from an
    EEH error if pci_save_state() results in an EEH error, the adapter/slot
    will be reset, and end up back in ipr_reset_restore_cfg_space(), but it
    won't have a valid saved state to restore, so pci_restore_state() will
    fail.
    
    The following patch introduces a workaround for this problem, hacking
    around the PCI API by setting pdev->state_saved = true before we do the
    restore. It fixes the EEH regression and prevents that we hit another
    EEH error during EEH recovery.
    
    
    [jejb: fix is a hack ... Jesse and Rafael will fix properly]
    Signed-off-by: default avatarKleber Sacilotto de Souza <klebers@linux.vnet.ibm.com>
    Acked-by: default avatarBrian King <brking@linux.vnet.ibm.com>
    Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
    Cc: stable@kernel.org
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    99c965dd
ipr.c 220 KB