Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a56cb4ec authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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...
parents b9b50363 ebca4f1b
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@ extern int pciehp_poll_mode;
extern int pciehp_poll_time;
extern int pciehp_debug;
extern int pciehp_force;
extern int pciehp_slot_with_bus;
extern struct workqueue_struct *pciehp_wq;

#define dbg(format, arg...)						\
+14 −7
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ int pciehp_debug;
int pciehp_poll_mode;
int pciehp_poll_time;
int pciehp_force;
int pciehp_slot_with_bus;
struct workqueue_struct *pciehp_wq;

#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_time, int, 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_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_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"

@@ -194,6 +191,7 @@ static int init_slots(struct controller *ctrl)
	struct slot *slot;
	struct hotplug_slot *hotplug_slot;
	struct hotplug_slot_info *info;
	int len, dup = 1;
	int retval = -ENOMEM;

	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 "
		    "slot_device_offset=%x\n", slot->bus, slot->device,
		    slot->hp_slot, slot->number, ctrl->slot_device_offset);
duplicate_name:
		retval = pci_hp_register(hotplug_slot,
					 ctrl->pci_dev->subordinate,
					 slot->device);
		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);
			if (retval == -EEXIST)
				err("Failed to register slot because of name "
				    "collision. Try \'pciehp_slot_with_bus\' "
				    "module option.\n");
			goto error_info;
		}
		/* create additional sysfs entries */
+1 −10
Original line number Diff line number Diff line
@@ -1030,15 +1030,6 @@ static void pcie_shutdown_notification(struct controller *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)
{
	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->hpc_ops = ctrl->hpc_ops;
	slot->number = ctrl->first_slot;
	make_slot_name(slot);
	snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
	mutex_init(&slot->lock);
	INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
	list_add(&slot->slot_list, &ctrl->slot_list);
+15 −19
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@
int shpchp_debug;
int shpchp_poll_mode;
int shpchp_poll_time;
static int shpchp_slot_with_bus;
struct workqueue_struct *shpchp_wq;

#define DRIVER_VERSION	"0.4"
@@ -53,11 +52,9 @@ MODULE_LICENSE("GPL");
module_param(shpchp_debug, bool, 0644);
module_param(shpchp_poll_mode, bool, 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_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_slot_with_bus, "Use bus number in the slot name");

#define SHPC_MODULE_NAME "shpchp"

@@ -99,23 +96,13 @@ static void release_slot(struct hotplug_slot *hotplug_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)
{
	struct slot *slot;
	struct hotplug_slot *hotplug_slot;
	struct hotplug_slot_info *info;
	int retval = -ENOMEM;
	int i;
	int i, len, dup = 1;

	for (i = 0; i < ctrl->num_slots; i++) {
		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 */
		hotplug_slot->private = 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;

		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 "
		    "slot_device_offset=%x\n", slot->bus, slot->device,
		    slot->hp_slot, slot->number, ctrl->slot_device_offset);
duplicate_name:
		retval = pci_hp_register(slot->hotplug_slot,
				ctrl->pci_dev->subordinate, slot->device);
		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);
			if (retval == -EEXIST)
				err("Failed to register slot because of name "
                                    "collision. Try \'shpchp_slot_with_bus\' "
				    "module option.\n");
			goto error_info;
		}

+2 −0
Original line number Diff line number Diff line
@@ -280,6 +280,8 @@ static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id,
			      match_pci_dev_by_id);
	if (dev)
		pdev = to_pci_dev(dev);
	if (from)
		pci_dev_put(from);
	return pdev;
}