• Rafael J. Wysocki's avatar
    PCI: Fix regression in pci_restore_state(), v3 · ebfc5b80
    Rafael J. Wysocki authored
    Commit 26f41062 ("PCI: check for pci bar restore completion and
    retry") attempted to address problems with PCI BAR restoration on
    systems where FLR had not been completed before pci_restore_state() was
    called, but it did that in an utterly wrong way.
    
    First off, instead of retrying the writes for the BAR registers only, it
    did that for all of the PCI config space of the device, including the
    status register (whose value after the write quite obviously need not be
    the same as the written one).  Second, it added arbitrary delay to
    pci_restore_state() even for systems where the PCI config space
    restoration was successful at first attempt.  Finally, the mdelay(10) it
    added to every iteration of the writing loop was way too much of a delay
    for any reasonable device.
    
    All of this actually caused resume failures for some devices on Mikko's
    system.
    
    To fix the regression, make pci_restore_state() only retry the writes
    for BAR registers and only wait if the first read from the register
    doesn't return the written value.  Additionaly, make it wait for 1 ms,
    instead of 10 ms, after every failing attempt to write into config
    space.
    Reported-by: default avatarMikko Vinni <mmvinni@yahoo.com>
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ebfc5b80
pci.c 101 KB