diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/probe.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index cf57fe79450a..b50386dc72e0 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -156,6 +156,8 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar) | |||
156 | return flags; | 156 | return flags; |
157 | } | 157 | } |
158 | 158 | ||
159 | #define PCI_COMMAND_DECODE_ENABLE (PCI_COMMAND_MEMORY | PCI_COMMAND_IO) | ||
160 | |||
159 | /** | 161 | /** |
160 | * pci_read_base - read a PCI BAR | 162 | * pci_read_base - read a PCI BAR |
161 | * @dev: the PCI device | 163 | * @dev: the PCI device |
@@ -178,8 +180,10 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
178 | /* No printks while decoding is disabled! */ | 180 | /* No printks while decoding is disabled! */ |
179 | if (!dev->mmio_always_on) { | 181 | if (!dev->mmio_always_on) { |
180 | pci_read_config_word(dev, PCI_COMMAND, &orig_cmd); | 182 | pci_read_config_word(dev, PCI_COMMAND, &orig_cmd); |
181 | pci_write_config_word(dev, PCI_COMMAND, | 183 | if (orig_cmd & PCI_COMMAND_DECODE_ENABLE) { |
182 | orig_cmd & ~(PCI_COMMAND_MEMORY | PCI_COMMAND_IO)); | 184 | pci_write_config_word(dev, PCI_COMMAND, |
185 | orig_cmd & ~PCI_COMMAND_DECODE_ENABLE); | ||
186 | } | ||
183 | } | 187 | } |
184 | 188 | ||
185 | res->name = pci_name(dev); | 189 | res->name = pci_name(dev); |
@@ -293,7 +297,8 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
293 | fail: | 297 | fail: |
294 | res->flags = 0; | 298 | res->flags = 0; |
295 | out: | 299 | out: |
296 | if (!dev->mmio_always_on) | 300 | if (!dev->mmio_always_on && |
301 | (orig_cmd & PCI_COMMAND_DECODE_ENABLE)) | ||
297 | pci_write_config_word(dev, PCI_COMMAND, orig_cmd); | 302 | pci_write_config_word(dev, PCI_COMMAND, orig_cmd); |
298 | 303 | ||
299 | if (bar_too_big) | 304 | if (bar_too_big) |