From: Jan Dittmer <jdittmer@ppp0.net>
To: Greg KH <greg@kroah.com>
Cc: Rolf Eike Beer <eike-kernel@sf-tec.de>,
linux-kernel@vger.kernel.org,
Hotplug List <pcihpd-discuss@lists.sourceforge.net>
Subject: Re: Is there a user space pci rescan method?
Date: Sun, 10 Oct 2004 02:59:49 +0200 [thread overview]
Message-ID: <41688985.7030607@ppp0.net> (raw)
In-Reply-To: <41687EBA.7050506@ppp0.net>
[-- Attachment #1: Type: text/plain, Size: 1087 bytes --]
Jan Dittmer wrote:
> Greg KH wrote:
>
>>Please just add the "rescan" support to fakephp, and everyone will be
>>happy...
>
>
> Well, I started to work on this for fun. What I currently have is a
> stand-alone module which rescans the pci bus on insert and enables
> previously disabled devices. This works (at least with my ieee1394 port).
> Problem is, that fakephp does not get notified about this new pci device
> and no new file is created in /sys/bus/pci/slots. So I'm going to add
> this rescan functionality directly to fakephp.
> Question is: where? My current idea is a fake hotplug slot "rescan" in
> /sys/bus/pci/slots , where you can write "1" into the "power" attribute.
> FWIW I've attached the standalone module and a kernel patch which rips
> out the pci_bus_add_device functionality from pci_bus_add_devices.
Well, here is a quick & dirty hack, which adds this function to
enable_slot in fakephp. So if you write "1" in the power attribute of
any slot, the whole bus gets rescanned (you still need the
pci_bus_add_device.patch from the previous mail).
Thanks,
Jan
[-- Attachment #2: fakephp-rescan-on-enable.patch --]
[-- Type: text/x-patch, Size: 3245 bytes --]
diff -ur linus/drivers/pci/hotplug/fakephp.c pcirescan/drivers/pci/hotplug/fakephp.c
--- linus/drivers/pci/hotplug/fakephp.c 2004-01-09 07:59:45.000000000 +0100
+++ pcirescan/drivers/pci/hotplug/fakephp.c 2004-10-10 02:53:05.000000000 +0200
@@ -165,8 +165,111 @@
err("Problem unregistering a slot %s\n", dslot->slot->name);
}
+/**
+ * Rescan slot.
+ * First, determine whether card in the slot has changed. It is
+ * done by compare of old and actual devices for function 0.
+ * If change detected, old device(s) removed, other functions
+ * scanned if it is multi-function dev, new devices inserted.
+ *
+ * @param temp Device template. Should be set: bus and devfn.
+ * @return Device for function 0
+ */
+static void pci_rescan_slot(struct pci_dev *temp)
+{
+ struct pci_bus *bus = temp->bus;
+ struct pci_dev* old_dev = pci_find_slot(bus->number, temp->devfn);
+ struct pci_dev *dev = NULL;
+ int func = 0;
+ int new_multi = 0; /* new multifunction device */
+ u8 hdr_type;
+ if (!pci_read_config_byte(temp, PCI_HEADER_TYPE, &hdr_type)) {
+ temp->hdr_type = hdr_type & 0x7f;
+ new_multi=hdr_type & 0x80;
+ if (!old_dev) {
+ dev = pci_scan_single_device(bus, temp->devfn);
+ if (dev) {
+ printk("Found new device on %s function %x:%x %x\n",
+ bus->name, temp->devfn >> 3,
+ temp->devfn & 7,
+ hdr_type);
+ pci_bus_add_device(dev);
+ add_slot(dev);
+ }
+ }
+ if (new_multi) { /* continue scanning for other functions */
+ for (func = 1, temp->devfn++; func < 8; func++, temp->devfn++) {
+ // printk("%x\n", func);
+ if (pci_read_config_byte(temp, PCI_HEADER_TYPE, &hdr_type))
+ continue;
+ temp->hdr_type = hdr_type & 0x7f;
+
+ old_dev = pci_find_slot(bus->number, temp->devfn);
+ if (!old_dev) {
+ dev = pci_scan_single_device(bus, temp->devfn);
+ if (dev) {
+ printk("Found new device on %s function %x:%x %x\n",
+ bus->name, temp->devfn >> 3,
+ temp->devfn & 7,
+ hdr_type);
+ // from drivers/pci/bus.c, pci_bus_add_devices
+ pci_bus_add_device(dev);
+ // add fakephp slot
+ add_slot(dev);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/**
+ * Rescan PCI bus.
+ * Assumed, some slots may have changed its content.
+ * Find old information about each slot and the new one.
+ * If they match, do nothing. Otherwise,
+ * remove/insert proper devices.
+ *
+ * @param bus
+ */
+static void pci_rescan_bus(const struct pci_bus *bus)
+{
+ unsigned int devfn;
+ struct pci_dev *dev;
+ dev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL);
+ if (!dev)
+ return;
+
+ memset(dev, 0, sizeof(dev));
+ dev->bus = (struct pci_bus*)bus;
+ dev->sysdata = bus->sysdata;
+ for (devfn = 0; devfn < 0x100; devfn += 8) {
+ dev->devfn = devfn;
+ pci_rescan_slot(dev);
+ }
+ kfree(dev);
+}
+
+static void pci_rescan_buses(const struct list_head *list)
+{
+ const struct list_head *l;
+ list_for_each(l,list) {
+ const struct pci_bus *b = pci_bus_b(l);
+ pci_rescan_bus(b);
+ pci_rescan_buses(&b->children);
+ }
+}
+
+static void pci_rescan(void) {
+ pci_rescan_buses(&pci_root_buses);
+}
+
+
static int enable_slot(struct hotplug_slot *hotplug_slot)
{
+ /* mis-use enable_slot for rescanning of pci bus */
+ pci_rescan();
return -ENODEV;
}
next prev parent reply other threads:[~2004-10-10 1:00 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-22 22:00 Dave Aubin
2004-09-22 23:58 ` Jan Dittmer
2004-09-23 0:26 ` Greg KH
2004-09-23 15:04 ` Jan Dittmer
2004-09-23 16:49 ` Rolf Eike Beer
2004-09-23 16:53 ` Jan Dittmer
2004-09-23 17:05 ` Rolf Eike Beer
2004-09-24 10:41 ` Rolf Eike Beer
2004-09-24 11:42 ` Jan Dittmer
2004-09-24 12:12 ` Rolf Eike Beer
2004-09-24 12:16 ` Jan Dittmer
2004-09-24 12:32 ` Rolf Eike Beer
2004-09-24 14:55 ` Greg KH
2004-09-27 9:14 ` Rolf Eike Beer
2004-10-10 0:13 ` Jan Dittmer
2004-10-10 0:59 ` Jan Dittmer [this message]
2004-10-10 13:45 ` Jan Dittmer
2004-10-30 4:16 ` Greg KH
2004-10-31 23:59 ` [patch 1/2] fakephp: introduce pci_bus_add_device Jan Dittmer
2004-11-01 9:35 ` Christoph Hellwig
2004-11-02 22:51 ` Jan Dittmer
2004-11-11 23:47 ` Greg KH
2004-11-12 0:13 ` Jan Dittmer
2004-11-12 18:59 ` Greg KH
2004-10-31 23:59 ` [patch 2/2] fakephp: add pci bus rescan ability Jan Dittmer
2004-11-12 18:59 ` Greg KH
2004-09-24 13:09 ` [Pcihpd-discuss] Re: Is there a user space pci rescan method? Matthew Wilcox
2004-09-24 13:18 ` Rolf Eike Beer
2004-09-24 12:40 ` Jan Dittmer
2004-09-24 12:59 ` Rolf Eike Beer
2004-09-23 23:31 ` Greg KH
-- strict thread matches above, loose matches on Subject: below --
2004-09-22 21:58 Dave Aubin
2004-09-22 20:30 Dave Aubin
2004-09-22 20:04 ` Alan Cox
2004-09-22 20:42 ` Richard B. Johnson
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=41688985.7030607@ppp0.net \
--to=jdittmer@ppp0.net \
--cc=eike-kernel@sf-tec.de \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pcihpd-discuss@lists.sourceforge.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome