From owner-linux-pci@atrey.karlin.mff.cuni.cz Fri Oct 6 12:05:27 2006 From: Matthew Wilcox To: Val Henson , Greg Kroah-Hartman Cc: netdev@vger.kernel.org, linux-pci@atrey.karlin.mff.cuni.cz, linux-kernel@vger.kernel.org, Matthew Wilcox Subject: PCI: Check that MWI bit really did get set Date: Fri, 06 Oct 2006 13:05:18 -0600 Message-Id: <1160161519800-git-send-email-matthew@wil.cx> Since some devices may not implement the MWI bit, we should check that the write did set it and return an error if it didn't. Signed-off-by: Matthew Wilcox Acked-by: Jeff Garzik Signed-off-by: Greg Kroah-Hartman --- drivers/pci/pci.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) --- gregkh-2.6.orig/drivers/pci/pci.c +++ gregkh-2.6/drivers/pci/pci.c @@ -900,13 +900,17 @@ pci_set_mwi(struct pci_dev *dev) return rc; pci_read_config_word(dev, PCI_COMMAND, &cmd); - if (! (cmd & PCI_COMMAND_INVALIDATE)) { - pr_debug("PCI: Enabling Mem-Wr-Inval for device %s\n", pci_name(dev)); - cmd |= PCI_COMMAND_INVALIDATE; - pci_write_config_word(dev, PCI_COMMAND, cmd); - } - - return 0; + if (cmd & PCI_COMMAND_INVALIDATE) + return 0; + + pr_debug("PCI: Enabling Mem-Wr-Inval for device %s\n", pci_name(dev)); + cmd |= PCI_COMMAND_INVALIDATE; + pci_write_config_word(dev, PCI_COMMAND, cmd); + + /* read result from hardware (in case bit refused to enable) */ + pci_read_config_word(dev, PCI_COMMAND, &cmd); + + return (cmd & PCI_COMMAND_INVALIDATE) ? 0 : -EINVAL; } /**