[PATCH] Fix restore of 64-bit PCI BAR's

For 64-bit BAR[i] only pci_dev->resource[i] is valid, ->resource[i+1]
slot is unused and contains zeroes in all fields.

So when we update a PCI BAR, all we need is just to check that we're
going to update a _valid_ resource.

Also make sure to write high bits - use "x >> 16 >> 16" (rather than the
simpler ">> 32") to avoid warnings on 32-bit architectures where we're
not going to have any high bits.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Ivan Kokshaysky and committed by Linus Torvalds cf7bee5a 0d317fb7

+6 -1
+6 -1
drivers/pci/setup-res.c
··· 33 33 u32 new, check, mask; 34 34 int reg; 35 35 36 + /* Ignore resources for unimplemented BARs and unused resource slots 37 + for 64 bit BARs. */ 38 + if (!res->flags) 39 + return; 40 + 36 41 pcibios_resource_to_bus(dev, &region, res); 37 42 38 43 pr_debug(" got res [%lx:%lx] bus [%lx:%lx] flags %lx for " ··· 72 67 73 68 if ((new & (PCI_BASE_ADDRESS_SPACE|PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == 74 69 (PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64)) { 75 - new = 0; /* currently everyone zeros the high address */ 70 + new = region.start >> 16 >> 16; 76 71 pci_write_config_dword(dev, reg + 4, new); 77 72 pci_read_config_dword(dev, reg + 4, &check); 78 73 if (check != new) {