mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 19:46:41 +07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: PCI: fix reference leak in pci_get_dev_by_id() PCI: shpchp: Rename duplicate slot name N as N-1, N-2, N-M... PCI: pciehp: Rename duplicate slot name N as N-1, N-2, N-M...
This commit is contained in:
commit
a56cb4ecbd
@ -43,7 +43,6 @@ extern int pciehp_poll_mode;
|
|||||||
extern int pciehp_poll_time;
|
extern int pciehp_poll_time;
|
||||||
extern int pciehp_debug;
|
extern int pciehp_debug;
|
||||||
extern int pciehp_force;
|
extern int pciehp_force;
|
||||||
extern int pciehp_slot_with_bus;
|
|
||||||
extern struct workqueue_struct *pciehp_wq;
|
extern struct workqueue_struct *pciehp_wq;
|
||||||
|
|
||||||
#define dbg(format, arg...) \
|
#define dbg(format, arg...) \
|
||||||
|
@ -41,7 +41,6 @@ int pciehp_debug;
|
|||||||
int pciehp_poll_mode;
|
int pciehp_poll_mode;
|
||||||
int pciehp_poll_time;
|
int pciehp_poll_time;
|
||||||
int pciehp_force;
|
int pciehp_force;
|
||||||
int pciehp_slot_with_bus;
|
|
||||||
struct workqueue_struct *pciehp_wq;
|
struct workqueue_struct *pciehp_wq;
|
||||||
|
|
||||||
#define DRIVER_VERSION "0.4"
|
#define DRIVER_VERSION "0.4"
|
||||||
@ -56,12 +55,10 @@ module_param(pciehp_debug, bool, 0644);
|
|||||||
module_param(pciehp_poll_mode, bool, 0644);
|
module_param(pciehp_poll_mode, bool, 0644);
|
||||||
module_param(pciehp_poll_time, int, 0644);
|
module_param(pciehp_poll_time, int, 0644);
|
||||||
module_param(pciehp_force, bool, 0644);
|
module_param(pciehp_force, bool, 0644);
|
||||||
module_param(pciehp_slot_with_bus, bool, 0644);
|
|
||||||
MODULE_PARM_DESC(pciehp_debug, "Debugging mode enabled or not");
|
MODULE_PARM_DESC(pciehp_debug, "Debugging mode enabled or not");
|
||||||
MODULE_PARM_DESC(pciehp_poll_mode, "Using polling mechanism for hot-plug events or not");
|
MODULE_PARM_DESC(pciehp_poll_mode, "Using polling mechanism for hot-plug events or not");
|
||||||
MODULE_PARM_DESC(pciehp_poll_time, "Polling mechanism frequency, in seconds");
|
MODULE_PARM_DESC(pciehp_poll_time, "Polling mechanism frequency, in seconds");
|
||||||
MODULE_PARM_DESC(pciehp_force, "Force pciehp, even if _OSC and OSHP are missing");
|
MODULE_PARM_DESC(pciehp_force, "Force pciehp, even if _OSC and OSHP are missing");
|
||||||
MODULE_PARM_DESC(pciehp_slot_with_bus, "Use bus number in the slot name");
|
|
||||||
|
|
||||||
#define PCIE_MODULE_NAME "pciehp"
|
#define PCIE_MODULE_NAME "pciehp"
|
||||||
|
|
||||||
@ -194,6 +191,7 @@ static int init_slots(struct controller *ctrl)
|
|||||||
struct slot *slot;
|
struct slot *slot;
|
||||||
struct hotplug_slot *hotplug_slot;
|
struct hotplug_slot *hotplug_slot;
|
||||||
struct hotplug_slot_info *info;
|
struct hotplug_slot_info *info;
|
||||||
|
int len, dup = 1;
|
||||||
int retval = -ENOMEM;
|
int retval = -ENOMEM;
|
||||||
|
|
||||||
list_for_each_entry(slot, &ctrl->slot_list, slot_list) {
|
list_for_each_entry(slot, &ctrl->slot_list, slot_list) {
|
||||||
@ -220,15 +218,24 @@ static int init_slots(struct controller *ctrl)
|
|||||||
dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x "
|
dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x "
|
||||||
"slot_device_offset=%x\n", slot->bus, slot->device,
|
"slot_device_offset=%x\n", slot->bus, slot->device,
|
||||||
slot->hp_slot, slot->number, ctrl->slot_device_offset);
|
slot->hp_slot, slot->number, ctrl->slot_device_offset);
|
||||||
|
duplicate_name:
|
||||||
retval = pci_hp_register(hotplug_slot,
|
retval = pci_hp_register(hotplug_slot,
|
||||||
ctrl->pci_dev->subordinate,
|
ctrl->pci_dev->subordinate,
|
||||||
slot->device);
|
slot->device);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
|
/*
|
||||||
|
* If slot N already exists, we'll try to create
|
||||||
|
* slot N-1, N-2 ... N-M, until we overflow.
|
||||||
|
*/
|
||||||
|
if (retval == -EEXIST) {
|
||||||
|
len = snprintf(slot->name, SLOT_NAME_SIZE,
|
||||||
|
"%d-%d", slot->number, dup++);
|
||||||
|
if (len < SLOT_NAME_SIZE)
|
||||||
|
goto duplicate_name;
|
||||||
|
else
|
||||||
|
err("duplicate slot name overflow\n");
|
||||||
|
}
|
||||||
err("pci_hp_register failed with error %d\n", retval);
|
err("pci_hp_register failed with error %d\n", retval);
|
||||||
if (retval == -EEXIST)
|
|
||||||
err("Failed to register slot because of name "
|
|
||||||
"collision. Try \'pciehp_slot_with_bus\' "
|
|
||||||
"module option.\n");
|
|
||||||
goto error_info;
|
goto error_info;
|
||||||
}
|
}
|
||||||
/* create additional sysfs entries */
|
/* create additional sysfs entries */
|
||||||
|
@ -1030,15 +1030,6 @@ static void pcie_shutdown_notification(struct controller *ctrl)
|
|||||||
pciehp_free_irq(ctrl);
|
pciehp_free_irq(ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void make_slot_name(struct slot *slot)
|
|
||||||
{
|
|
||||||
if (pciehp_slot_with_bus)
|
|
||||||
snprintf(slot->name, SLOT_NAME_SIZE, "%04d_%04d",
|
|
||||||
slot->bus, slot->number);
|
|
||||||
else
|
|
||||||
snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pcie_init_slot(struct controller *ctrl)
|
static int pcie_init_slot(struct controller *ctrl)
|
||||||
{
|
{
|
||||||
struct slot *slot;
|
struct slot *slot;
|
||||||
@ -1053,7 +1044,7 @@ static int pcie_init_slot(struct controller *ctrl)
|
|||||||
slot->device = ctrl->slot_device_offset + slot->hp_slot;
|
slot->device = ctrl->slot_device_offset + slot->hp_slot;
|
||||||
slot->hpc_ops = ctrl->hpc_ops;
|
slot->hpc_ops = ctrl->hpc_ops;
|
||||||
slot->number = ctrl->first_slot;
|
slot->number = ctrl->first_slot;
|
||||||
make_slot_name(slot);
|
snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
|
||||||
mutex_init(&slot->lock);
|
mutex_init(&slot->lock);
|
||||||
INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
|
INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
|
||||||
list_add(&slot->slot_list, &ctrl->slot_list);
|
list_add(&slot->slot_list, &ctrl->slot_list);
|
||||||
|
@ -39,7 +39,6 @@
|
|||||||
int shpchp_debug;
|
int shpchp_debug;
|
||||||
int shpchp_poll_mode;
|
int shpchp_poll_mode;
|
||||||
int shpchp_poll_time;
|
int shpchp_poll_time;
|
||||||
static int shpchp_slot_with_bus;
|
|
||||||
struct workqueue_struct *shpchp_wq;
|
struct workqueue_struct *shpchp_wq;
|
||||||
|
|
||||||
#define DRIVER_VERSION "0.4"
|
#define DRIVER_VERSION "0.4"
|
||||||
@ -53,11 +52,9 @@ MODULE_LICENSE("GPL");
|
|||||||
module_param(shpchp_debug, bool, 0644);
|
module_param(shpchp_debug, bool, 0644);
|
||||||
module_param(shpchp_poll_mode, bool, 0644);
|
module_param(shpchp_poll_mode, bool, 0644);
|
||||||
module_param(shpchp_poll_time, int, 0644);
|
module_param(shpchp_poll_time, int, 0644);
|
||||||
module_param(shpchp_slot_with_bus, bool, 0644);
|
|
||||||
MODULE_PARM_DESC(shpchp_debug, "Debugging mode enabled or not");
|
MODULE_PARM_DESC(shpchp_debug, "Debugging mode enabled or not");
|
||||||
MODULE_PARM_DESC(shpchp_poll_mode, "Using polling mechanism for hot-plug events or not");
|
MODULE_PARM_DESC(shpchp_poll_mode, "Using polling mechanism for hot-plug events or not");
|
||||||
MODULE_PARM_DESC(shpchp_poll_time, "Polling mechanism frequency, in seconds");
|
MODULE_PARM_DESC(shpchp_poll_time, "Polling mechanism frequency, in seconds");
|
||||||
MODULE_PARM_DESC(shpchp_slot_with_bus, "Use bus number in the slot name");
|
|
||||||
|
|
||||||
#define SHPC_MODULE_NAME "shpchp"
|
#define SHPC_MODULE_NAME "shpchp"
|
||||||
|
|
||||||
@ -99,23 +96,13 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
|
|||||||
kfree(slot);
|
kfree(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void make_slot_name(struct slot *slot)
|
|
||||||
{
|
|
||||||
if (shpchp_slot_with_bus)
|
|
||||||
snprintf(slot->hotplug_slot->name, SLOT_NAME_SIZE, "%04d_%04d",
|
|
||||||
slot->bus, slot->number);
|
|
||||||
else
|
|
||||||
snprintf(slot->hotplug_slot->name, SLOT_NAME_SIZE, "%d",
|
|
||||||
slot->number);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int init_slots(struct controller *ctrl)
|
static int init_slots(struct controller *ctrl)
|
||||||
{
|
{
|
||||||
struct slot *slot;
|
struct slot *slot;
|
||||||
struct hotplug_slot *hotplug_slot;
|
struct hotplug_slot *hotplug_slot;
|
||||||
struct hotplug_slot_info *info;
|
struct hotplug_slot_info *info;
|
||||||
int retval = -ENOMEM;
|
int retval = -ENOMEM;
|
||||||
int i;
|
int i, len, dup = 1;
|
||||||
|
|
||||||
for (i = 0; i < ctrl->num_slots; i++) {
|
for (i = 0; i < ctrl->num_slots; i++) {
|
||||||
slot = kzalloc(sizeof(*slot), GFP_KERNEL);
|
slot = kzalloc(sizeof(*slot), GFP_KERNEL);
|
||||||
@ -146,7 +133,7 @@ static int init_slots(struct controller *ctrl)
|
|||||||
/* register this slot with the hotplug pci core */
|
/* register this slot with the hotplug pci core */
|
||||||
hotplug_slot->private = slot;
|
hotplug_slot->private = slot;
|
||||||
hotplug_slot->release = &release_slot;
|
hotplug_slot->release = &release_slot;
|
||||||
make_slot_name(slot);
|
snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
|
||||||
hotplug_slot->ops = &shpchp_hotplug_slot_ops;
|
hotplug_slot->ops = &shpchp_hotplug_slot_ops;
|
||||||
|
|
||||||
get_power_status(hotplug_slot, &info->power_status);
|
get_power_status(hotplug_slot, &info->power_status);
|
||||||
@ -157,14 +144,23 @@ static int init_slots(struct controller *ctrl)
|
|||||||
dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x "
|
dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x "
|
||||||
"slot_device_offset=%x\n", slot->bus, slot->device,
|
"slot_device_offset=%x\n", slot->bus, slot->device,
|
||||||
slot->hp_slot, slot->number, ctrl->slot_device_offset);
|
slot->hp_slot, slot->number, ctrl->slot_device_offset);
|
||||||
|
duplicate_name:
|
||||||
retval = pci_hp_register(slot->hotplug_slot,
|
retval = pci_hp_register(slot->hotplug_slot,
|
||||||
ctrl->pci_dev->subordinate, slot->device);
|
ctrl->pci_dev->subordinate, slot->device);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
|
/*
|
||||||
|
* If slot N already exists, we'll try to create
|
||||||
|
* slot N-1, N-2 ... N-M, until we overflow.
|
||||||
|
*/
|
||||||
|
if (retval == -EEXIST) {
|
||||||
|
len = snprintf(slot->name, SLOT_NAME_SIZE,
|
||||||
|
"%d-%d", slot->number, dup++);
|
||||||
|
if (len < SLOT_NAME_SIZE)
|
||||||
|
goto duplicate_name;
|
||||||
|
else
|
||||||
|
err("duplicate slot name overflow\n");
|
||||||
|
}
|
||||||
err("pci_hp_register failed with error %d\n", retval);
|
err("pci_hp_register failed with error %d\n", retval);
|
||||||
if (retval == -EEXIST)
|
|
||||||
err("Failed to register slot because of name "
|
|
||||||
"collision. Try \'shpchp_slot_with_bus\' "
|
|
||||||
"module option.\n");
|
|
||||||
goto error_info;
|
goto error_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,6 +280,8 @@ static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id,
|
|||||||
match_pci_dev_by_id);
|
match_pci_dev_by_id);
|
||||||
if (dev)
|
if (dev)
|
||||||
pdev = to_pci_dev(dev);
|
pdev = to_pci_dev(dev);
|
||||||
|
if (from)
|
||||||
|
pci_dev_put(from);
|
||||||
return pdev;
|
return pdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user