From torvalds@osdl.org Wed Mar 8 16:58:31 2006 Date: Wed, 8 Mar 2006 16:58:22 -0800 (PST) From: Linus Torvalds To: Andrew Morton Cc: Ingo Molnar , gregkh@suse.de Subject: PCI: test that drivers properly call pci_set_master(dev) Message-ID: [Note, this will not be sent to mainline, but is very good to have for -mm (gkh)] Btw, this patch obviously depends on all drivers that depend on DMA doing the proper "pci_set_master(dev)", but all the good drivers should do that anyway. The point being that this is not for general use, because it certainly _can_ break some setups. But it should be an easy first thing to test, and if it breaks some driver, that's interesting information in itself. --- --- drivers/pci/probe.c | 7 +++++++ 1 file changed, 7 insertions(+) --- gregkh-2.6.orig/drivers/pci/probe.c +++ gregkh-2.6/drivers/pci/probe.c @@ -639,6 +639,7 @@ static void pci_read_irq(struct pci_dev */ static int pci_setup_device(struct pci_dev * dev) { + u16 cmd; u32 class; sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus), @@ -664,6 +665,12 @@ static int pci_setup_device(struct pci_d if (class == PCI_CLASS_BRIDGE_PCI) goto bad; pci_read_irq(dev); + pci_read_config_word(dev, PCI_COMMAND, &cmd); + if (cmd & PCI_COMMAND_MASTER) { + printk("Turning off bus mastering on %s\n", pci_name(dev)); + cmd &= ~PCI_COMMAND_MASTER; + pci_write_config_word(dev, PCI_COMMAND, cmd); + } pci_read_bases(dev, 6, PCI_ROM_ADDRESS); pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor); pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);