All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Chiang <achiang@hp.com>
To: gregkh@suse.de, kristen.c.accardi@intel.com, lenb@kernel.org,
	matthew@wil.cx, rick.jones2@hp.com, linux-kernel@vger.kernel.org,
	linux-pci@atrey.karlin.mff.cuni.cz, pcihpd-discuss@list
Subject: [PATCH 2/5] Construct one fakephp slot per pci slot
Date: Mon, 12 Nov 2007 17:13:36 -0700	[thread overview]
Message-ID: <20071113001336.GC13341@ldl.fc.hp.com> (raw)
In-Reply-To: <20071113000853.GA13341@ldl.fc.hp.com>

Register one slot per slot, rather than one slot per function.
Change the name of the slot to fake%d instead of the pci address.

Signed-off-by: Alex Chiang <achiang@hp.com>
Signed-off-by: Matthew Wilcox <matthew@wil.cx>
---
 drivers/pci/hotplug/fakephp.c |   75 +++++++++++++++--------------------------
 1 files changed, 27 insertions(+), 48 deletions(-)

diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c
index 027f686..828335e 100644
--- a/drivers/pci/hotplug/fakephp.c
+++ b/drivers/pci/hotplug/fakephp.c
@@ -93,6 +93,7 @@ static int add_slot(struct pci_dev *dev)
 	struct dummy_slot *dslot;
 	struct hotplug_slot *slot;
 	int retval = -ENOMEM;
+	static int count = 1;
 
 	slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
 	if (!slot)
@@ -106,7 +107,8 @@ static int add_slot(struct pci_dev *dev)
 	slot->info->max_bus_speed = PCI_SPEED_UNKNOWN;
 	slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN;
 
-	slot->name = &dev->dev.bus_id[0];
+	slot->name = kmalloc(8, GFP_KERNEL);
+	sprintf(slot->name, "fake%d", count++);
 	dbg("slot->name = %s\n", slot->name);
 
 	dslot = kmalloc(sizeof(struct dummy_slot), GFP_KERNEL);
@@ -141,17 +143,17 @@ error:
 static int __init pci_scan_buses(void)
 {
 	struct pci_dev *dev = NULL;
-	int retval = 0;
+	int lastslot = 0;
 
 	while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-		retval = add_slot(dev);
-		if (retval) {
-			pci_dev_put(dev);
-			break;
-		}
+		if (PCI_FUNC(dev->devfn) > 0 &&
+				lastslot == PCI_SLOT(dev->devfn))
+			continue;
+		lastslot = PCI_SLOT(dev->devfn);
+		add_slot(dev);
 	}
 
-	return retval;
+	return 0;
 }
 
 static void remove_slot(struct dummy_slot *dslot)
@@ -275,23 +277,9 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
 	return -ENODEV;
 }
 
-/* find the hotplug_slot for the pci_dev */
-static struct hotplug_slot *get_slot_from_dev(struct pci_dev *dev)
-{
-	struct dummy_slot *dslot;
-
-	list_for_each_entry(dslot, &slot_list, node) {
-		if (dslot->dev == dev)
-			return dslot->slot;
-	}
-	return NULL;
-}
-
-
 static int disable_slot(struct hotplug_slot *slot)
 {
 	struct dummy_slot *dslot;
-	struct hotplug_slot *hslot;
 	struct pci_dev *dev;
 	int func;
 
@@ -301,36 +289,27 @@ static int disable_slot(struct hotplug_slot *slot)
 
 	dbg("%s - physical_slot = %s\n", __FUNCTION__, slot->name);
 
-	/* don't disable bridged devices just yet, we can't handle them easily... */
-	if (dslot->dev->subordinate) {
-		err("Can't remove PCI devices with other PCI devices behind it yet.\n");
-		return -ENODEV;
-	}
-	/* search for subfunctions and disable them first */
-	if (!(dslot->dev->devfn & 7)) {
-		for (func = 1; func < 8; func++) {
-			dev = pci_get_slot(dslot->dev->bus,
-					dslot->dev->devfn + func);
-			if (dev) {
-				hslot = get_slot_from_dev(dev);
-				if (hslot)
-					disable_slot(hslot);
-				else {
-					err("Hotplug slot not found for subfunction of PCI device\n");
-					return -ENODEV;
-				}
-				pci_dev_put(dev);
-			} else
-				dbg("No device in slot found\n");
+	for (func = 7; func >= 0; func--) {
+		dev = pci_get_slot(dslot->dev->bus, dslot->dev->devfn + func);
+		if (!dev)
+			continue;
+
+		/* don't disable bridged devices just yet, we can't handle
+		 * them easily... */
+		if (dev->subordinate) {
+			err("Can't remove PCI devices with other PCI devices behind it yet.\n");
+			return -ENODEV;
 		}
-	}
 
-	/* remove the device from the pci core */
-	pci_remove_bus_device(dslot->dev);
 
-	/* blow away this sysfs entry and other parts. */
-	remove_slot(dslot);
+		/* remove the device from the pci core */
+		pci_remove_bus_device(dslot->dev);
 
+		/* blow away this sysfs entry and other parts. */
+		remove_slot(dslot);
+
+		pci_dev_put(dev);
+	}
 	return 0;
 }
 
-- 
1.5.3.1.1.g1e61


WARNING: multiple messages have this Message-ID (diff)
From: Alex Chiang <achiang@hp.com>
To: gregkh@suse.de, kristen.c.accardi@intel.com, lenb@kernel.org,
	matthew@wil.cx, rick.jones2@hp.com, linux-kernel@vger.kernel.org,
	linux-pci@atrey.karlin.mff.cuni.cz,
	pcihpd-discuss@lists.sourceforge.net, linux-acpi@vger.kernel.org
Subject: [PATCH 2/5] Construct one fakephp slot per pci slot
Date: Mon, 12 Nov 2007 17:13:36 -0700	[thread overview]
Message-ID: <20071113001336.GC13341@ldl.fc.hp.com> (raw)
In-Reply-To: <20071113000853.GA13341@ldl.fc.hp.com>

Register one slot per slot, rather than one slot per function.
Change the name of the slot to fake%d instead of the pci address.

Signed-off-by: Alex Chiang <achiang@hp.com>
Signed-off-by: Matthew Wilcox <matthew@wil.cx>
---
 drivers/pci/hotplug/fakephp.c |   75 +++++++++++++++--------------------------
 1 files changed, 27 insertions(+), 48 deletions(-)

diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c
index 027f686..828335e 100644
--- a/drivers/pci/hotplug/fakephp.c
+++ b/drivers/pci/hotplug/fakephp.c
@@ -93,6 +93,7 @@ static int add_slot(struct pci_dev *dev)
 	struct dummy_slot *dslot;
 	struct hotplug_slot *slot;
 	int retval = -ENOMEM;
+	static int count = 1;
 
 	slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
 	if (!slot)
@@ -106,7 +107,8 @@ static int add_slot(struct pci_dev *dev)
 	slot->info->max_bus_speed = PCI_SPEED_UNKNOWN;
 	slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN;
 
-	slot->name = &dev->dev.bus_id[0];
+	slot->name = kmalloc(8, GFP_KERNEL);
+	sprintf(slot->name, "fake%d", count++);
 	dbg("slot->name = %s\n", slot->name);
 
 	dslot = kmalloc(sizeof(struct dummy_slot), GFP_KERNEL);
@@ -141,17 +143,17 @@ error:
 static int __init pci_scan_buses(void)
 {
 	struct pci_dev *dev = NULL;
-	int retval = 0;
+	int lastslot = 0;
 
 	while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-		retval = add_slot(dev);
-		if (retval) {
-			pci_dev_put(dev);
-			break;
-		}
+		if (PCI_FUNC(dev->devfn) > 0 &&
+				lastslot == PCI_SLOT(dev->devfn))
+			continue;
+		lastslot = PCI_SLOT(dev->devfn);
+		add_slot(dev);
 	}
 
-	return retval;
+	return 0;
 }
 
 static void remove_slot(struct dummy_slot *dslot)
@@ -275,23 +277,9 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
 	return -ENODEV;
 }
 
-/* find the hotplug_slot for the pci_dev */
-static struct hotplug_slot *get_slot_from_dev(struct pci_dev *dev)
-{
-	struct dummy_slot *dslot;
-
-	list_for_each_entry(dslot, &slot_list, node) {
-		if (dslot->dev == dev)
-			return dslot->slot;
-	}
-	return NULL;
-}
-
-
 static int disable_slot(struct hotplug_slot *slot)
 {
 	struct dummy_slot *dslot;
-	struct hotplug_slot *hslot;
 	struct pci_dev *dev;
 	int func;
 
@@ -301,36 +289,27 @@ static int disable_slot(struct hotplug_slot *slot)
 
 	dbg("%s - physical_slot = %s\n", __FUNCTION__, slot->name);
 
-	/* don't disable bridged devices just yet, we can't handle them easily... */
-	if (dslot->dev->subordinate) {
-		err("Can't remove PCI devices with other PCI devices behind it yet.\n");
-		return -ENODEV;
-	}
-	/* search for subfunctions and disable them first */
-	if (!(dslot->dev->devfn & 7)) {
-		for (func = 1; func < 8; func++) {
-			dev = pci_get_slot(dslot->dev->bus,
-					dslot->dev->devfn + func);
-			if (dev) {
-				hslot = get_slot_from_dev(dev);
-				if (hslot)
-					disable_slot(hslot);
-				else {
-					err("Hotplug slot not found for subfunction of PCI device\n");
-					return -ENODEV;
-				}
-				pci_dev_put(dev);
-			} else
-				dbg("No device in slot found\n");
+	for (func = 7; func >= 0; func--) {
+		dev = pci_get_slot(dslot->dev->bus, dslot->dev->devfn + func);
+		if (!dev)
+			continue;
+
+		/* don't disable bridged devices just yet, we can't handle
+		 * them easily... */
+		if (dev->subordinate) {
+			err("Can't remove PCI devices with other PCI devices behind it yet.\n");
+			return -ENODEV;
 		}
-	}
 
-	/* remove the device from the pci core */
-	pci_remove_bus_device(dslot->dev);
 
-	/* blow away this sysfs entry and other parts. */
-	remove_slot(dslot);
+		/* remove the device from the pci core */
+		pci_remove_bus_device(dslot->dev);
 
+		/* blow away this sysfs entry and other parts. */
+		remove_slot(dslot);
+
+		pci_dev_put(dev);
+	}
 	return 0;
 }
 
-- 
1.5.3.1.1.g1e61


  parent reply	other threads:[~2007-11-13  0:13 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-13  0:08 [PATCH 0/5][RFC] Physical PCI slot objects Alex Chiang
2007-11-13  0:12 ` [PATCH 1/5] Remove path attribute from sgi_hotplug Alex Chiang
2007-11-13  0:12   ` Alex Chiang
2007-11-13  0:13 ` Alex Chiang [this message]
2007-11-13  0:13   ` [PATCH 2/5] Construct one fakephp slot per pci slot Alex Chiang
2007-11-13 19:48   ` Linas Vepstas
2007-11-13 19:52     ` Matthew Wilcox
2007-11-14 12:39   ` [Pcihpd-discuss] " Rolf Eike Beer
2007-11-14 14:17     ` Alex Chiang
2007-11-14 14:49       ` Rolf Eike Beer
2007-11-14 15:01         ` Alex Chiang
2007-11-13  0:14 ` [PATCH 3/5, RFC] Introduce pci_slot Alex Chiang
2007-11-13  0:14   ` Alex Chiang
2007-11-13 19:56   ` Linas Vepstas
2007-11-13 20:03     ` Matthew Wilcox
2007-11-13  0:17 ` [PATCH 4/5, RFC] ACPI PCI slot detection driver Alex Chiang
2007-11-13  0:17   ` Alex Chiang
2007-11-13  0:18   ` [PATCH 5/5] Add pci_slot_add_hotplug() interface Alex Chiang
2007-11-13  0:18     ` Alex Chiang
2007-11-13 17:01 ` [PATCH 0/5][RFC] Physical PCI slot objects Greg KH
2007-11-13 18:33   ` Matthew Wilcox
2007-11-13 18:51     ` Greg KH
2007-11-13 20:11       ` Matthew Wilcox
2007-11-13 20:19         ` Greg KH
2007-11-13 23:08         ` Gary Hade
2007-11-14  1:37           ` Alex Chiang
2007-11-15  0:40             ` Gary Hade
2007-11-15 17:36               ` Alex Chiang
2007-11-15 23:38                 ` Gary Hade
2007-11-14 14:42           ` Alex Chiang
2007-11-14 18:13             ` Gary Hade
2007-11-14 18:36               ` Alex Chiang
2007-11-13 20:36       ` Alex Chiang
2007-11-13 21:30         ` Greg KH
2007-11-13 22:01           ` Bjorn Helgaas
2007-11-13 22:16             ` Greg KH
2007-11-13 21:15       ` Matt Domsch
2007-11-13 21:31         ` Alex Chiang
2007-11-13 21:36           ` Greg KH
2007-11-13 21:36           ` Greg KH
2007-11-13 23:14             ` Alex Chiang
2007-11-13 21:32         ` Greg KH
2007-11-13 20:21   ` Alex Chiang
2007-11-13 20:26     ` Greg KH
2007-11-13 20:26       ` Greg KH
2007-11-13 22:51       ` Rick Jones
2007-11-13 22:56         ` Greg KH
2007-11-13 23:04           ` Matthew Wilcox
2007-11-13 23:07             ` Greg KH
2007-11-14  6:00               ` Scott Murray
2007-11-13 23:33             ` Kristen Carlson Accardi
2007-11-14  0:10               ` Matthew Wilcox
2007-11-14  9:55                 ` Kenji Kaneshige
2007-11-14 18:38                   ` Kristen Carlson Accardi
2007-11-13 22:59       ` Kristen Carlson Accardi
2007-11-14 17:37         ` Bjorn Helgaas
2007-11-14 17:53           ` Greg KH
2007-11-14 19:53             ` Alex Chiang
2007-11-14 21:24             ` Alex Chiang
2007-11-14 21:42             ` Alex Chiang
2007-11-14 22:00               ` Greg KH
2007-11-14 22:00                 ` Greg KH
2007-11-15 20:20                 ` Alex Chiang
2007-11-14 17:44       ` Matthew Garrett
2007-11-14 17:51         ` Greg KH
2007-11-14 18:03           ` Matthew Garrett
2007-11-13 20:24   ` Linas Vepstas
2007-11-13 20:59     ` Alex Chiang
2007-11-13 21:41       ` Linas Vepstas
2007-11-13 21:58         ` Matthew Wilcox
2007-11-14  1:07   ` Andi Kleen
2007-11-14 14:17     ` Matthew Wilcox
2007-11-14 14:35       ` Andi Kleen
2007-11-14 15:00         ` Matthew Wilcox
2007-11-14 15:08           ` Andi Kleen
2007-11-14 15:12             ` Matthew Wilcox
2007-11-14 15:20             ` Alex Chiang
2007-11-14 11:43 ` Kenji Kaneshige
  -- strict thread matches above, loose matches on Subject: below --
2007-11-14 19:36 [PATCH 0/5, v2] " Alex Chiang
2007-11-14 19:37 ` [PATCH 2/5] Construct one fakephp slot per pci slot Alex Chiang
2007-11-14 19:37   ` Alex Chiang
2007-11-14 20:12   ` Matthew Wilcox
2007-11-14 20:12     ` Matthew Wilcox
2007-11-14 20:55     ` Alex Chiang
2007-11-15 11:57       ` Rolf Eike Beer
2007-11-15 17:40         ` Alex Chiang
2007-11-14 21:04     ` Alex Chiang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20071113001336.GC13341@ldl.fc.hp.com \
    --to=achiang@hp.com \
    --cc=gregkh@suse.de \
    --cc=kristen.c.accardi@intel.com \
    --cc=lenb@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@atrey.karlin.mff.cuni.cz \
    --cc=matthew@wil.cx \
    --cc=pcihpd-discuss@list \
    --cc=rick.jones2@hp.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.