Hi Yijing, On 02/12/2014 10:52 AM, Yijing Wang wrote: > Sometimes OS do not know the physical device swap, > for instance, some device hotplug during system suspend. > Interrupt can not deliver to OS in some platform. > So we can use pci serial number capability to detect this > issue if device supports serial number. > > Signed-off-by: Yijing Wang <wangyijing@xxxxxxxxxx> > Cc: Paul Bolle <pebolle@xxxxxxxxxx> > Cc: Oliver Neukum <oneukum@xxxxxxx> > Cc: Gu Zheng <guz.fnst@xxxxxxxxxxxxxx> > Cc: linux-pci@xxxxxxxxxxxxxxx > --- > drivers/pci/pci.c | 28 ++++++++++++++++++++++++++++ > include/linux/pci.h | 2 ++ > 2 files changed, 30 insertions(+), 0 deletions(-) > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index a8c1c2d..af34057 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -2199,6 +2199,34 @@ void pci_dsn_init(struct pci_dev *dev) > } > > /** > + * pci_serial_number_changed - check the device SN is changed How about the name “pci_device_changed”? I think it's more readable, though the judgement is according to SN. Regards, Gu > + * @pdev: the PCI device > + * > + * check the device serial number is changed. > + * if device does not support device serial number, > + * return false. > + */ > +bool pci_serial_number_changed(struct pci_dev *pdev) > +{ > + u64 old, new; > + old = pdev->sn; > + > + if (!pci_is_pcie(pdev)) > + return false; > + > + new = pci_device_serial_number(pdev->bus, > + pdev->devfn); > + > + if (old != new) { > + pr_info("%s: Device Serial Number Changed!\n", > + pci_name(pdev)); > + return true; > + } else > + return false; > +} > +EXPORT_SYMBOL(pci_serial_number_changed); > + > +/** > * pci_configure_ari - enable or disable ARI forwarding > * @dev: the PCI device > * > diff --git a/include/linux/pci.h b/include/linux/pci.h > index 3631859..d60c0b6 100644 > --- a/include/linux/pci.h > +++ b/include/linux/pci.h > @@ -1025,6 +1025,8 @@ void pci_unlock_rescan_remove(void); > ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf); > ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf); > > +bool pci_serial_number_changed(struct pci_dev *pdev); > + > /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */ > resource_size_t pcibios_retrieve_fw_addr(struct pci_dev *dev, int idx); > void pci_bus_assign_resources(const struct pci_bus *bus); -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html