|
@@ -2180,21 +2180,18 @@ void pci_request_acs(void)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * pci_enable_acs - enable ACS if hardware support it
|
|
|
+ * pci_std_enable_acs - enable ACS on devices using standard ACS capabilites
|
|
|
* @dev: the PCI device
|
|
|
*/
|
|
|
-void pci_enable_acs(struct pci_dev *dev)
|
|
|
+static int pci_std_enable_acs(struct pci_dev *dev)
|
|
|
{
|
|
|
int pos;
|
|
|
u16 cap;
|
|
|
u16 ctrl;
|
|
|
|
|
|
- if (!pci_acs_enable)
|
|
|
- return;
|
|
|
-
|
|
|
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
|
|
|
if (!pos)
|
|
|
- return;
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
pci_read_config_word(dev, pos + PCI_ACS_CAP, &cap);
|
|
|
pci_read_config_word(dev, pos + PCI_ACS_CTRL, &ctrl);
|
|
@@ -2212,6 +2209,23 @@ void pci_enable_acs(struct pci_dev *dev)
|
|
|
ctrl |= (cap & PCI_ACS_UF);
|
|
|
|
|
|
pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pci_enable_acs - enable ACS if hardware support it
|
|
|
+ * @dev: the PCI device
|
|
|
+ */
|
|
|
+void pci_enable_acs(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ if (!pci_acs_enable)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (!pci_std_enable_acs(dev))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pci_dev_specific_enable_acs(dev);
|
|
|
}
|
|
|
|
|
|
static bool pci_acs_flags_enabled(struct pci_dev *pdev, u16 acs_flags)
|