>From b57b339bf10237e234c491c58f6dd0a1f575c34e Mon Sep 17 00:00:00 2001 From: Dirk Gouders Date: Fri, 12 Sep 2014 21:16:06 +0200 Subject: [PATCH 1/4] PCI: Add generic pcie_link_disable Remove not needed return value checking that Linus pointed out before. Will use it from /sys/.../pcie/link_disable Signed-off-by: Yinghai Lu --- drivers/pci/Makefile | 2 +- drivers/pci/pcie-link.c | 42 ++++++++++++++++++++++++++++++++++++++++++ include/linux/pci.h | 2 ++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 drivers/pci/pcie-link.c diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile index e04fe2d..eab9feb 100644 --- a/drivers/pci/Makefile +++ b/drivers/pci/Makefile @@ -4,7 +4,7 @@ obj-y += access.o bus.o probe.o host-bridge.o remove.o pci.o \ pci-driver.o search.o pci-sysfs.o rom.o setup-res.o \ - irq.o vpd.o setup-bus.o vc.o + irq.o vpd.o setup-bus.o pcie-link.o vc.o obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_SYSFS) += slot.o diff --git a/drivers/pci/pcie-link.c b/drivers/pci/pcie-link.c new file mode 100644 index 0000000..e10d0ba --- /dev/null +++ b/drivers/pci/pcie-link.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include + +int pcie_link_disable_get(struct pci_dev *dev) +{ + u16 lnk_ctrl; + if (!pci_is_pcie(dev)) + return 0; + + pcie_capability_read_word(dev, PCI_EXP_LNKCTL, &lnk_ctrl); + + return !!(lnk_ctrl & PCI_EXP_LNKCTL_LD); +} + +void pcie_link_disable_set(struct pci_dev *dev, int bit) +{ + u16 lnk_ctrl, old_lnk_ctrl; + + if (!pci_is_pcie(dev)) + return; + + pcie_capability_read_word(dev, PCI_EXP_LNKCTL, &lnk_ctrl); + old_lnk_ctrl = lnk_ctrl; + + if (!bit) + lnk_ctrl &= ~PCI_EXP_LNKCTL_LD; + else + lnk_ctrl |= PCI_EXP_LNKCTL_LD; + + if (old_lnk_ctrl == lnk_ctrl) + return; + + pcie_capability_write_word(dev, PCI_EXP_LNKCTL, lnk_ctrl); + + dev_printk(KERN_DEBUG, &dev->dev, "%s: lnk_ctrl = %x\n", __func__, + lnk_ctrl); +} +EXPORT_SYMBOL(pcie_link_disable_set); diff --git a/include/linux/pci.h b/include/linux/pci.h index 61978a4..926fcb4 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -778,6 +778,8 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, int bus, struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr); void pcie_update_link_speed(struct pci_bus *bus, u16 link_status); +void pcie_link_disable_set(struct pci_dev *dev, int bit); +int pcie_link_disable_get(struct pci_dev *dev); struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr, const char *name, struct hotplug_slot *hotplug); -- 2.1.0