summaryrefslogtreecommitdiffstats
path: root/driver/compat.c
diff options
context:
space:
mode:
authorSuren A. Chilingaryan <csa@suren.me>2015-11-19 03:19:51 +0100
committerSuren A. Chilingaryan <csa@suren.me>2015-11-19 03:19:51 +0100
commit6191a86bf2de5413cc9100e1450b541e5dfcb8f9 (patch)
treec4edeb5e91aa4098c55d01a00f2d292d0635ae61 /driver/compat.c
parent46754246bddd1c15d61e915bd860448bab8d7400 (diff)
downloadpcitool-6191a86bf2de5413cc9100e1450b541e5dfcb8f9.tar.gz
pcitool-6191a86bf2de5413cc9100e1450b541e5dfcb8f9.tar.bz2
pcitool-6191a86bf2de5413cc9100e1450b541e5dfcb8f9.tar.xz
pcitool-6191a86bf2de5413cc9100e1450b541e5dfcb8f9.zip
Support setting payload size
Diffstat (limited to 'driver/compat.c')
-rw-r--r--driver/compat.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/driver/compat.c b/driver/compat.c
new file mode 100644
index 0000000..a632781
--- /dev/null
+++ b/driver/compat.c
@@ -0,0 +1,26 @@
+#include <linux/pci.h>
+
+int pcidriver_pcie_get_mps(struct pci_dev *dev)
+{
+ u16 ctl;
+
+ pcie_capability_read_word(dev, PCI_EXP_DEVCTL, &ctl);
+
+ return 128 << ((ctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5);
+}
+
+int pcidriver_pcie_set_mps(struct pci_dev *dev, int mps)
+{
+ u16 v;
+
+ if (mps < 128 || mps > 4096 || !is_power_of_2(mps))
+ return -EINVAL;
+
+ v = ffs(mps) - 8;
+ if (v > dev->pcie_mpss)
+ return -EINVAL;
+ v <<= 5;
+
+ return pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
+ PCI_EXP_DEVCTL_PAYLOAD, v);
+}