I attached a wrong patch, please ignore this. Thanks, Kenji Kaneshige Kenji Kaneshige wrote: > Create symbolic link to hotplug driver module in the PCI slot > directory (/sys/bus/pci/slots/<SLOT#>). In the past, we need to load > hotplug drivers one by one to identify the hotplug driver that handles > the slot, and it was very inconvenient especially for trouble shooting. > With this change, we can easily identify the hotplug driver. > > Signed-off-by: Taku Izumi <izumi.taku@xxxxxxxxxxxxxx> > Signed-off-by: Kenji Kaneshige <kaneshige.kenji@xxxxxxxxxxxxxx> > > --- > Documentation/ABI/testing/sysfs-bus-pci | 7 +++++ > drivers/pci/hotplug/pci_hotplug_core.c | 23 +++++++++++++----- > drivers/pci/slot.c | 39 ++++++++++++++++++++++++++++++++ > include/linux/pci.h | 5 ++++ > include/linux/pci_hotplug.h | 15 ++++++++++-- > 5 files changed, 80 insertions(+), 9 deletions(-) > > Index: 20090612/drivers/pci/hotplug/pci_hotplug_core.c > =================================================================== > --- 20090612.orig/drivers/pci/hotplug/pci_hotplug_core.c > +++ 20090612/drivers/pci/hotplug/pci_hotplug_core.c > @@ -424,6 +424,9 @@ static int fs_add_slot(struct pci_slot * > { > int retval = 0; > > + /* Create symbolic link to the hotplug driver module */ > + pci_hp_create_module_link(slot); > + > if (has_power_file(slot)) { > retval = sysfs_create_file(&slot->kobj, > &hotplug_slot_attr_power.attr); > @@ -498,6 +501,7 @@ exit_attention: > if (has_power_file(slot)) > sysfs_remove_file(&slot->kobj, &hotplug_slot_attr_power.attr); > exit_power: > + pci_hp_remove_module_link(slot); > exit: > return retval; > } > @@ -528,6 +532,8 @@ static void fs_remove_slot(struct pci_sl > > if (has_test_file(slot)) > sysfs_remove_file(&slot->kobj, &hotplug_slot_attr_test.attr); > + > + pci_hp_remove_module_link(slot); > } > > static struct hotplug_slot *get_slot_from_name (const char *name) > @@ -544,10 +550,10 @@ static struct hotplug_slot *get_slot_fro > } > > /** > - * pci_hp_register - register a hotplug_slot with the PCI hotplug subsystem > + * __pci_hp_register - register a hotplug_slot with the PCI hotplug subsystem > * @bus: bus this slot is on > * @slot: pointer to the &struct hotplug_slot to register > - * @slot_nr: slot number > + * @devnr: device number > * @name: name registered with kobject core > * > * Registers a hotplug slot with the pci hotplug subsystem, which will allow > @@ -555,8 +561,9 @@ static struct hotplug_slot *get_slot_fro > * > * Returns 0 if successful, anything else for an error. > */ > -int pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, int slot_nr, > - const char *name) > +int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, > + int devnr, const char *name, > + struct module *owner, const char *mod_name) > { > int result; > struct pci_slot *pci_slot; > @@ -571,14 +578,16 @@ int pci_hp_register(struct hotplug_slot > return -EINVAL; > } > > - mutex_lock(&pci_hp_mutex); > + slot->ops->owner = owner; > + slot->ops->mod_name = mod_name; > > + mutex_lock(&pci_hp_mutex); > /* > * No problems if we call this interface from both ACPI_PCI_SLOT > * driver and call it here again. If we've already created the > * pci_slot, the interface will simply bump the refcount. > */ > - pci_slot = pci_create_slot(bus, slot_nr, name, slot); > + pci_slot = pci_create_slot(bus, devnr, name, slot); > if (IS_ERR(pci_slot)) { > result = PTR_ERR(pci_slot); > goto out; > @@ -688,6 +697,6 @@ MODULE_LICENSE("GPL"); > module_param(debug, bool, 0644); > MODULE_PARM_DESC(debug, "Debugging mode enabled or not"); > > -EXPORT_SYMBOL_GPL(pci_hp_register); > +EXPORT_SYMBOL_GPL(__pci_hp_register); > EXPORT_SYMBOL_GPL(pci_hp_deregister); > EXPORT_SYMBOL_GPL(pci_hp_change_slot_info); > Index: 20090612/include/linux/pci_hotplug.h > =================================================================== > --- 20090612.orig/include/linux/pci_hotplug.h > +++ 20090612/include/linux/pci_hotplug.h > @@ -69,6 +69,7 @@ enum pcie_link_speed { > /** > * struct hotplug_slot_ops -the callbacks that the hotplug pci core can use > * @owner: The module owner of this structure > + * @mod_name: The module name (KBUILD_MODNAME) of this structure > * @enable_slot: Called when the user wants to enable a specific pci slot > * @disable_slot: Called when the user wants to disable a specific pci slot > * @set_attention_status: Called to set the specific slot's attention LED to > @@ -101,6 +102,7 @@ enum pcie_link_speed { > */ > struct hotplug_slot_ops { > struct module *owner; > + const char *mod_name; > int (*enable_slot) (struct hotplug_slot *slot); > int (*disable_slot) (struct hotplug_slot *slot); > int (*set_attention_status) (struct hotplug_slot *slot, u8 value); > @@ -159,12 +161,21 @@ static inline const char *hotplug_slot_n > return pci_slot_name(slot->pci_slot); > } > > -extern int pci_hp_register(struct hotplug_slot *, struct pci_bus *, int nr, > - const char *name); > +extern int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *pbus, > + int nr, const char *name, > + struct module *owner, const char *mod_name); > extern int pci_hp_deregister(struct hotplug_slot *slot); > extern int __must_check pci_hp_change_slot_info (struct hotplug_slot *slot, > struct hotplug_slot_info *info); > > +static inline int pci_hp_register(struct hotplug_slot *slot, > + struct pci_bus *pbus, > + int devnr, const char *name) > +{ > + return __pci_hp_register(slot, pbus, devnr, name, > + THIS_MODULE, KBUILD_MODNAME); > +} > + > /* PCI Setting Record (Type 0) */ > struct hpp_type0 { > u32 revision; > Index: 20090612/drivers/pci/slot.c > =================================================================== > --- 20090612.orig/drivers/pci/slot.c > +++ 20090612/drivers/pci/slot.c > @@ -307,6 +307,45 @@ void pci_destroy_slot(struct pci_slot *s > } > EXPORT_SYMBOL_GPL(pci_destroy_slot); > > +#if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) > +#include <linux/pci_hotplug.h> > +/** > + * pci_hp_create_link - create symbolic link to the hotplug driver module. > + * @slot: struct pci_slot > + * > + * Helper function for pci_hotplug_core.c to create symbolic link to > + * the hotplug driver module. > + */ > +void pci_hp_create_module_link(struct pci_slot *pci_slot) > +{ > + struct hotplug_slot *slot = pci_slot->hotplug; > + struct kobject *kobj = NULL; > + int no_warn; > + > + if (!slot || !slot->ops) > + return; > + kobj = kset_find_obj(module_kset, slot->ops->mod_name); > + if (!kobj) > + return; > + no_warn = sysfs_create_link(&pci_slot->kobj, kobj, "module"); > + kobject_put(kobj); > +} > +EXPORT_SYMBOL_GPL(pci_hp_create_module_link); > + > +/** > + * pci_hp_remove_link - remove symbolic link to the hotplug driver module. > + * @slot: struct pci_slot > + * > + * Helper function for pci_hotplug_core.c to remove symbolic link to > + * the hotplug driver module. > + */ > +void pci_hp_remove_module_link(struct pci_slot *pci_slot) > +{ > + sysfs_remove_link(&pci_slot->kobj, "module"); > +} > +EXPORT_SYMBOL_GPL(pci_hp_remove_module_link); > +#endif > + > static int pci_slot_init(void) > { > struct kset *pci_bus_kset; > Index: 20090612/include/linux/pci.h > =================================================================== > --- 20090612.orig/include/linux/pci.h > +++ 20090612/include/linux/pci.h > @@ -1261,5 +1261,10 @@ static inline irqreturn_t pci_sriov_migr > } > #endif > > +#if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) > +extern void pci_hp_create_module_link(struct pci_slot *pci_slot); > +extern void pci_hp_remove_module_link(struct pci_slot *pci_slot); > +#endif > + > #endif /* __KERNEL__ */ > #endif /* LINUX_PCI_H */ > Index: 20090612/Documentation/ABI/testing/sysfs-bus-pci > =================================================================== > --- 20090612.orig/Documentation/ABI/testing/sysfs-bus-pci > +++ 20090612/Documentation/ABI/testing/sysfs-bus-pci > @@ -122,3 +122,10 @@ Description: > This symbolic link appears when a device is a Virtual Function. > The symbolic link points to the PCI device sysfs entry of the > Physical Function this device associates with. > + > +What: /sys/bus/pci/slots/.../module > +Date: June 2009 > +Contact: Kenji Kaneshige <kaneshige.kenji@xxxxxxxxxxxxxx> > +Description: > + This symbolic link points to the PCI hotplug controller driver > + module that manages the hotplug slot. > > -- 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