Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: don't corrupt enable_cnt when doing manual resource alignment

This patch fixes breakage of of enable_cnt in quirk_resource_alignment.

Currently, quirk_resource_alignment calls pci_disable_device.
pci_disable_device decrements enable_cnt, so that enable_cnt becomes -1.

The patch disables memory decoding, writing command register directly.
So enable_cnt is not broken.

Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>

authored by

Yuji Shimada and committed by
Jesse Barnes
0cdbe30f 5446a6bd

+9 -5
+9 -5
drivers/pci/quirks.c
··· 36 36 37 37 #ifdef CONFIG_PCI_QUIRKS 38 38 /* 39 - * This quirk function disables the device and releases resources 40 - * which is specified by kernel's boot parameter 'pci=resource_alignment='. 39 + * This quirk function disables memory decoding and releases memory resources 40 + * of the device specified by kernel's boot parameter 'pci=resource_alignment='. 41 41 * It also rounds up size to specified alignment. 42 42 * Later on, the kernel will assign page-aligned memory resource back 43 - * to that device. 43 + * to the device. 44 44 */ 45 45 static void __devinit quirk_resource_alignment(struct pci_dev *dev) 46 46 { 47 47 int i; 48 48 struct resource *r; 49 49 resource_size_t align, size; 50 + u16 command; 50 51 51 52 if (!pci_is_reassigndev(dev)) 52 53 return; ··· 59 58 return; 60 59 } 61 60 62 - dev_info(&dev->dev, "Disabling device and release resources.\n"); 63 - pci_disable_device(dev); 61 + dev_info(&dev->dev, 62 + "Disabling memory decoding and releasing memory resources.\n"); 63 + pci_read_config_word(dev, PCI_COMMAND, &command); 64 + command &= ~PCI_COMMAND_MEMORY; 65 + pci_write_config_word(dev, PCI_COMMAND, command); 64 66 65 67 align = pci_specified_resource_alignment(dev); 66 68 for (i=0; i < PCI_BRIDGE_RESOURCES; i++) {