@@ -65,6 +65,15 @@ Description:
force a rescan of all PCI buses in the system, and
re-discover previously removed devices.
+What: /sys/bus/pci/devices/.../msi_bus
+Date: September 2014
+Contact: Linux PCI developers <linux-pci@vger.kernel.org>
+Description:
+ Writing a zero value to this attribute will turn off
+ MSI capability for device. If device is a bridge, all
+ child devices under the bridge will be set to no MSI.
+ Drivers need to be reloaded to valid the new setting.
+
What: /sys/bus/pci/devices/.../msi_irqs/
Date: September, 2011
Contact: Neil Horman <nhorman@tuxdriver.com>
@@ -251,11 +251,9 @@ static ssize_t msi_bus_show(struct device *dev, struct device_attribute *attr,
{
struct pci_dev *pdev = to_pci_dev(dev);
- if (!pdev->subordinate)
- return 0;
-
- return sprintf(buf, "%u\n",
- !(pdev->subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI));
+ return sprintf(buf, "%u\n", pdev->subordinate ?
+ !(pdev->subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI)
+ : !pdev->no_msi);
}
static ssize_t msi_bus_store(struct device *dev, struct device_attribute *attr,
@@ -278,8 +276,10 @@ static ssize_t msi_bus_store(struct device *dev, struct device_attribute *attr,
* Maybe devices without subordinate buses shouldn't have this
* attribute in the first place?
*/
- if (!pdev->subordinate)
+ if (!pdev->subordinate) {
+ pdev->no_msi = !val;
return count;
+ }
/* Is the flag going to change, or keep the value it already had? */
if (!(pdev->subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI) ^
Msi_bus attribute is only valid for bridge device. We can enable or disable MSI capability for a bus, if we echo 1/0 > /sys/bus/pci/devices/$EP/msi_bus, the action will be ignored. Sometime we need to only enable/disable a EP device MSI capability, not all devices share the same bus. Signed-off-by: Yijing Wang <wangyijing@huawei.com> --- Documentation/ABI/testing/sysfs-bus-pci | 9 +++++++++ drivers/pci/pci-sysfs.c | 12 ++++++------ 2 files changed, 15 insertions(+), 6 deletions(-)