Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 299265
b: refs/heads/master
c: ebfc5b8
h: refs/heads/master
i:
  299263: e87fa65
v: v3
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed Apr 15, 2012
1 parent ee8c27b commit 663909d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 19 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6c23b8e9330c77557fa9658db751029675dd195a
refs/heads/master: ebfc5b802fa76baeb4371311ff9fc27a2258d90d
57 changes: 39 additions & 18 deletions trunk/drivers/pci/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -967,41 +967,62 @@ pci_save_state(struct pci_dev *dev)
return 0;
}

static void pci_restore_config_dword(struct pci_dev *pdev, int offset,
u32 saved_val, int retry)
{
u32 val;

pci_read_config_dword(pdev, offset, &val);
if (val == saved_val)
return;

for (;;) {
dev_dbg(&pdev->dev, "restoring config space at offset "
"%#x (was %#x, writing %#x)\n", offset, val, saved_val);
pci_write_config_dword(pdev, offset, saved_val);
if (retry-- <= 0)
return;

pci_read_config_dword(pdev, offset, &val);
if (val == saved_val)
return;

mdelay(1);
}
}

static void pci_restore_config_space(struct pci_dev *pdev, int start, int end,
int retry)
{
int index;

for (index = end; index >= start; index--)
pci_restore_config_dword(pdev, 4 * index,
pdev->saved_config_space[index],
retry);
}

/**
* pci_restore_state - Restore the saved state of a PCI device
* @dev: - PCI device that we're dealing with
*/
void pci_restore_state(struct pci_dev *dev)
{
int i;
u32 val;
int tries;

if (!dev->state_saved)
return;

/* PCI Express register must be restored first */
pci_restore_pcie_state(dev);
pci_restore_ats_state(dev);

pci_restore_config_space(dev, 10, 15, 0);
/*
* The Base Address register should be programmed before the command
* register(s)
*/
for (i = 15; i >= 0; i--) {
pci_read_config_dword(dev, i * 4, &val);
tries = 10;
while (tries && val != dev->saved_config_space[i]) {
dev_dbg(&dev->dev, "restoring config "
"space at offset %#x (was %#x, writing %#x)\n",
i, val, (int)dev->saved_config_space[i]);
pci_write_config_dword(dev,i * 4,
dev->saved_config_space[i]);
pci_read_config_dword(dev, i * 4, &val);
mdelay(10);
tries--;
}
}
pci_restore_config_space(dev, 4, 9, 10);
pci_restore_config_space(dev, 0, 3, 0);

pci_restore_pcix_state(dev);
pci_restore_msi_state(dev);
pci_restore_iov_state(dev);
Expand Down

0 comments on commit 663909d

Please sign in to comment.