From: Alex Chiang <achiang@hp.com>
To: Gary Hade <garyhade@us.ibm.com>,
kaneshige.kenji@jp.fujitsu.com, warthog19@eaglescrag.net
Cc: Matthew Wilcox <matthew@wil.cx>,
gregkh@suse.de, kristen.c.accardi@intel.com, rick.jones2@hp.com,
linux-kernel@vger.kernel.org, linux-pci@atrey.karlin.mff.cuni.cz,
linux-acpi@vger.kernel.org
Subject: [PATCH 2/4] Construct one fakephp slot per pci slot
Date: Thu, 28 Feb 2008 17:27:10 -0700 [thread overview]
Message-ID: <20080229002710.GC21420@ldl.fc.hp.com> (raw)
In-Reply-To: <20080229002341.GA21420@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 | 85 ++++++++++++++--------------------------
1 files changed, 30 insertions(+), 55 deletions(-)
diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c
index 94b6401..6c14b4d 100644
--- a/drivers/pci/hotplug/fakephp.c
+++ b/drivers/pci/hotplug/fakephp.c
@@ -66,6 +66,7 @@ struct dummy_slot {
struct pci_dev *dev;
struct work_struct remove_work;
unsigned long removed;
+ char name[8];
};
static int debug;
@@ -100,6 +101,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)
@@ -113,13 +115,14 @@ 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];
- dbg("slot->name = %s\n", slot->name);
-
dslot = kzalloc(sizeof(struct dummy_slot), GFP_KERNEL);
if (!dslot)
goto error_info;
+ slot->name = dslot->name;
+ snprintf(slot->name, sizeof(dslot->name), "fake%d", count++);
+ dbg("slot->name = %s\n", slot->name);
+
slot->ops = &dummy_hotplug_slot_ops;
slot->release = &dummy_release;
slot->private = dslot;
@@ -148,17 +151,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)
@@ -296,23 +299,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;
@@ -322,41 +311,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;
- }
- if (test_and_set_bit(0, &dslot->removed)) {
- dbg("Slot already scheduled for removal\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;
+
+ if (test_and_set_bit(0, &dslot->removed)) {
+ dbg("Slot already scheduled for removal\n");
+ return -ENODEV;
}
- }
- /* remove the device from the pci core */
- pci_remove_bus_device(dslot->dev);
+ /* queue work item to blow away this sysfs entry and other
+ * parts.
+ */
+ INIT_WORK(&dslot->remove_work, remove_slot_worker);
+ queue_work(dummyphp_wq, &dslot->remove_work);
- /* queue work item to blow away this sysfs entry and other parts. */
- INIT_WORK(&dslot->remove_work, remove_slot_worker);
- queue_work(dummyphp_wq, &dslot->remove_work);
+ /* blow away this sysfs entry and other parts. */
+ remove_slot(dslot);
+ pci_dev_put(dev);
+ }
return 0;
}
--
1.5.3.1.g1e61
next prev parent reply other threads:[~2008-02-29 0:27 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-29 0:23 [PATCH 0/4, v7] PCI, ACPI: Physical PCI slot objects Alex Chiang
2008-02-29 0:26 ` [PATCH 1/4] Remove path attribute from sgi_hotplug Alex Chiang
2008-03-03 18:48 ` Jesse Barnes
2008-03-03 18:54 ` Prarit Bhargava
2008-03-05 0:19 ` Alex Chiang
2008-02-29 0:27 ` Alex Chiang [this message]
2008-02-29 0:28 ` [PATCH 3/4] Introduce pci_slot Alex Chiang
2008-03-01 5:24 ` Greg KH
2008-03-01 5:24 ` Greg KH
2008-03-03 20:56 ` Alex Chiang
2008-03-04 5:58 ` Greg KH
2008-03-04 5:58 ` Greg KH
2008-03-04 23:30 ` [PATCH 3/4, v8] " Alex Chiang
2008-02-29 0:29 ` [PATCH 4/4] ACPI PCI slot detection driver Alex Chiang
2008-03-01 5:25 ` Greg KH
2008-03-01 5:25 ` Greg KH
2008-03-01 14:43 ` Matthew Wilcox
2008-03-04 5:49 ` Greg KH
2008-03-04 18:18 ` Jesse Barnes
2008-03-04 19:30 ` Greg KH
2008-03-04 20:02 ` Jesse Barnes
2008-03-04 20:12 ` Kristen Carlson Accardi
2008-03-04 23:09 ` Alex Chiang
2008-03-05 1:11 ` Kenji Kaneshige
2008-03-05 1:11 ` Kenji Kaneshige
2008-03-05 20:20 ` Alex Chiang
2008-03-05 20:34 ` Matthew Wilcox
2008-03-05 20:34 ` Matthew Wilcox
2008-03-06 2:07 ` Kenji Kaneshige
2008-03-06 2:07 ` Kenji Kaneshige
2008-03-11 13:10 ` Kenji Kaneshige
2008-03-11 13:13 ` [PATCH 3/(3+1)] " Kenji Kaneshige
2008-03-11 13:17 ` Kenji Kaneshige
2008-03-11 13:19 ` [PATCH 4/(3+1)] Add quirks for " Kenji Kaneshige
2008-03-11 13:28 ` [PATCH 4/4] " Matthew Wilcox
2008-03-11 16:56 ` Jesse Barnes
2008-03-12 5:51 ` Kenji Kaneshige
2008-03-12 4:08 ` Kenji Kaneshige
2008-03-11 18:04 ` Kristen Carlson Accardi
2008-03-11 18:04 ` Kristen Carlson Accardi
2008-03-11 19:14 ` Alex Chiang
2008-03-12 11:33 ` Kenji Kaneshige
2008-03-12 11:33 ` Kenji Kaneshige
2008-03-13 3:24 ` Alex Chiang
2008-03-14 2:16 ` Gary Hade
2008-03-14 2:16 ` Gary Hade
2008-03-14 5:34 ` Kenji Kaneshige
2008-03-18 20:49 ` Alex Chiang
2008-03-12 10:50 ` Kenji Kaneshige
2008-03-12 10:50 ` Kenji Kaneshige
2008-03-11 23:34 ` Kristen Carlson Accardi
2008-03-11 23:34 ` Kristen Carlson Accardi
2008-03-12 12:59 ` Kenji Kaneshige
2008-03-04 22:58 ` Alex Chiang
2008-03-04 23:15 ` Greg KH
2008-03-04 23:15 ` Greg KH
2008-03-04 23:46 ` Alex Chiang
2008-03-01 5:12 ` [PATCH 0/4, v7] PCI, ACPI: Physical PCI slot objects Greg KH
2008-03-01 5:12 ` Greg KH
2008-03-03 23:35 ` Alex Chiang
2008-03-04 5:56 ` Greg KH
2008-03-04 5:56 ` Greg KH
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=20080229002710.GC21420@ldl.fc.hp.com \
--to=achiang@hp.com \
--cc=garyhade@us.ibm.com \
--cc=gregkh@suse.de \
--cc=kaneshige.kenji@jp.fujitsu.com \
--cc=kristen.c.accardi@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@atrey.karlin.mff.cuni.cz \
--cc=matthew@wil.cx \
--cc=rick.jones2@hp.com \
--cc=warthog19@eaglescrag.net \
/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.