|
@@ -1458,6 +1458,7 @@ struct pci_devres {
|
|
|
unsigned int pinned:1;
|
|
|
unsigned int orig_intx:1;
|
|
|
unsigned int restore_intx:1;
|
|
|
+ unsigned int mwi:1;
|
|
|
u32 region_mask;
|
|
|
};
|
|
|
|
|
@@ -1476,6 +1477,9 @@ static void pcim_release(struct device *gendev, void *res)
|
|
|
if (this->region_mask & (1 << i))
|
|
|
pci_release_region(dev, i);
|
|
|
|
|
|
+ if (this->mwi)
|
|
|
+ pci_clear_mwi(dev);
|
|
|
+
|
|
|
if (this->restore_intx)
|
|
|
pci_intx(dev, this->orig_intx);
|
|
|
|
|
@@ -3760,6 +3764,27 @@ int pci_set_mwi(struct pci_dev *dev)
|
|
|
}
|
|
|
EXPORT_SYMBOL(pci_set_mwi);
|
|
|
|
|
|
+/**
|
|
|
+ * pcim_set_mwi - a device-managed pci_set_mwi()
|
|
|
+ * @dev: the PCI device for which MWI is enabled
|
|
|
+ *
|
|
|
+ * Managed pci_set_mwi().
|
|
|
+ *
|
|
|
+ * RETURNS: An appropriate -ERRNO error value on error, or zero for success.
|
|
|
+ */
|
|
|
+int pcim_set_mwi(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ struct pci_devres *dr;
|
|
|
+
|
|
|
+ dr = find_pci_dr(dev);
|
|
|
+ if (!dr)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ dr->mwi = 1;
|
|
|
+ return pci_set_mwi(dev);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(pcim_set_mwi);
|
|
|
+
|
|
|
/**
|
|
|
* pci_try_set_mwi - enables memory-write-invalidate PCI transaction
|
|
|
* @dev: the PCI device for which MWI is enabled
|