diff options
author | Suren A. Chilingaryan <csa@suren.me> | 2015-11-19 03:19:51 +0100 |
---|---|---|
committer | Suren A. Chilingaryan <csa@suren.me> | 2015-11-19 03:19:51 +0100 |
commit | 6191a86bf2de5413cc9100e1450b541e5dfcb8f9 (patch) | |
tree | c4edeb5e91aa4098c55d01a00f2d292d0635ae61 /driver/compat.c | |
parent | 46754246bddd1c15d61e915bd860448bab8d7400 (diff) | |
download | pcitool-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.c | 26 |
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); +} |