From: Bjorn Helgaas <bjorn.helgaas@hp.com>
To: "Sébastien Dugué" <sebastien.dugue@bull.net>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
ambx1@neo.rr.com, akpm@linux-foundation.org, lenb@kernel.org,
rmk@arm.linux.org.uk, mjg59@srcf.ucam.org,
castet.matthieu@free.fr, shaohua.li@intel.com,
"Yinghai Lu" <yhlu.kernel@gmail.com>
Subject: Re: commit 7e92b4fc34 - x86, serial: convert legacy COM ports to platform devices - broke my serial console
Date: Wed, 25 Jul 2007 16:41:23 -0600 [thread overview]
Message-ID: <200707251641.23406.bjorn.helgaas@hp.com> (raw)
In-Reply-To: <20070725153253.4d7e7e37@frecb000686.frec.bull.fr>
On Wednesday 25 July 2007 07:32:53 am Sébastien Dugué wrote:
> On Wed, 25 Jul 2007 07:16:44 -0600 Bjorn Helgaas <bjorn.helgaas@hp.com> wrote:
>
> > The _DDN is a "DOS device name", and the _UID is a "logical device ID
> > that does not change across reboots." Both are optional, and PNPACPI
> > ignores them. But maybe we could change PNPACPI to sort by them if
> > they are present. I'll think about this a bit.
>
> That would be nice, but I wish you good luck with all those
> crappy BIOSes out there.
Yeah, it's an ugly world we live in. Would you be able to try the
attached patch just for testing? It should sort devices with the
same _HID by their _UID. It doesn't have any effect on my systems,
because my devices are already ordered by _UID by default. But I
think it should switch your COM1/COM2 ports back to the order you
expect.
Yinghai, you mentioned the same issue on boxes with multiple root
bridges. Any chance you could try this out there as well?
Index: w/drivers/pnp/pnpacpi/core.c
===================================================================
--- w.orig/drivers/pnp/pnpacpi/core.c 2007-07-25 13:56:02.000000000 -0600
+++ w/drivers/pnp/pnpacpi/core.c 2007-07-25 16:25:27.000000000 -0600
@@ -224,18 +224,91 @@
return -EINVAL;
}
-static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
+struct pnpacpi_device {
+ struct acpi_device *device;
+ unsigned long unique_id;
+ struct list_head list;
+};
+
+static LIST_HEAD(pnpacpi_dev_list);
+
+static inline int hardware_id_match(struct acpi_device *dev1,
+ struct acpi_device *dev2)
+{
+ return !strncmp(acpi_device_hid(dev1), acpi_device_hid(dev2),
+ sizeof(acpi_device_hid(dev1)));
+}
+
+static inline int precedes(struct pnpacpi_device *dev1,
+ struct pnpacpi_device *dev2)
+{
+ return hardware_id_match(dev1->device, dev2->device) &&
+ dev1->unique_id < dev2->unique_id;
+}
+
+static acpi_status __init pnpacpi_find_device_handler(acpi_handle handle,
u32 lvl, void *context, void **rv)
{
struct acpi_device *device;
+ struct pnpacpi_device *dev, *cur, *prev = NULL;
+ struct list_head *node;
+ acpi_status status;
+ unsigned long id;
- if (!acpi_bus_get_device(handle, &device))
- pnpacpi_add_device(device);
- else
+ if (acpi_bus_get_device(handle, &device))
return AE_CTRL_DEPTH;
+
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (!dev) {
+ pnp_err("Out of memory");
+ return AE_OK;
+ }
+
+ status = acpi_evaluate_integer(handle, METHOD_NAME__UID, NULL, &id);
+ if (ACPI_FAILURE(status))
+ id = 0;
+
+ INIT_LIST_HEAD(&dev->list);
+ dev->device = device;
+ dev->unique_id = id;
+
+ /*
+ * If several devices have the same _HID, sort them by _UID so
+ * device names are ordered by _UID. Note that _UID can be
+ * either an integer or a string; we only order the integer ones.
+ */
+ if (list_empty(&pnpacpi_dev_list)) {
+ list_add(&dev->list, &pnpacpi_dev_list);
+ return AE_OK;
+ }
+
+ list_for_each(node, &pnpacpi_dev_list) {
+ cur = list_entry(node, struct pnpacpi_device, list);
+ if (precedes(dev, cur) ||
+ (prev && hardware_id_match(prev->device, cur->device))) {
+ list_add_tail(&dev->list, node);
+ return AE_OK;
+ }
+ prev = cur;
+ }
+
+ list_add_tail(&dev->list, &pnpacpi_dev_list);
return AE_OK;
}
+static void __init pnpacpi_add_devices(void)
+{
+ struct list_head *node, *next;
+ struct pnpacpi_device *dev;
+
+ list_for_each_safe(node, next, &pnpacpi_dev_list) {
+ dev = list_entry(node, struct pnpacpi_device, list);
+ pnpacpi_add_device(dev->device);
+ list_del(node);
+ kfree(dev);
+ }
+}
+
static int __init acpi_pnp_match(struct device *dev, void *_pnp)
{
struct acpi_device *acpi = to_acpi_device(dev);
@@ -282,7 +355,8 @@
pnp_info("PnP ACPI init");
pnp_register_protocol(&pnpacpi_protocol);
register_acpi_bus_type(&acpi_pnp_bus);
- acpi_get_devices(NULL, pnpacpi_add_device_handler, NULL, NULL);
+ acpi_get_devices(NULL, pnpacpi_find_device_handler, NULL, NULL);
+ pnpacpi_add_devices();
pnp_info("PnP ACPI: found %d devices", num);
unregister_acpi_bus_type(&acpi_pnp_bus);
pnp_platform_devices = 1;
next prev parent reply other threads:[~2007-07-25 22:45 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-24 14:28 Sébastien Dugué
2007-07-24 15:48 ` Bjorn Helgaas
2007-07-24 17:49 ` Jeff Garzik
2007-07-24 18:09 ` Andrew Morton
2007-07-24 19:07 ` Jeff Garzik
2007-07-24 18:17 ` Maciej W. Rozycki
2007-07-24 19:53 ` Bjorn Helgaas
2007-07-24 20:13 ` Jeff Garzik
2007-07-24 20:33 ` Yinghai Lu
2007-07-25 2:34 ` Bjorn Helgaas
2007-07-25 4:27 ` Yinghai Lu
2007-07-25 12:55 ` Bjorn Helgaas
2007-07-25 15:57 ` Yinghai Lu
2007-07-25 16:11 ` Bjorn Helgaas
2007-07-25 16:45 ` Yinghai Lu
2007-07-24 20:34 ` Bjorn Helgaas
2007-07-24 20:40 ` Jeff Garzik
2007-07-24 20:56 ` Bjorn Helgaas
2007-07-24 21:05 ` Jeff Garzik
2007-07-24 22:07 ` Alan Cox
[not found] ` <p73ir88sax1.fsf@bingen.suse.de>
2007-07-25 15:48 ` Alan Cox
2007-07-25 16:06 ` Bjorn Helgaas
2007-07-25 16:47 ` Jeff Garzik
2007-07-25 17:34 ` Alan Cox
2007-07-25 17:38 ` Alan Cox
2007-07-24 22:06 ` Alan Cox
2007-07-25 7:45 ` Sébastien Dugué
2007-07-25 13:16 ` Bjorn Helgaas
2007-07-25 13:32 ` Sébastien Dugué
2007-07-25 13:38 ` Sébastien Dugué
2007-07-25 22:41 ` Bjorn Helgaas [this message]
2007-07-26 0:37 ` Yinghai Lu
2007-07-26 1:35 ` Yinghai Lu
2007-07-26 2:21 ` Shaohua Li
2007-07-26 3:33 ` Bjorn Helgaas
2007-07-27 18:16 ` Bjorn Helgaas
2007-07-27 18:38 ` Yinghai Lu
2007-07-27 18:56 ` Bjorn Helgaas
2007-07-27 20:35 ` Yinghai Lu
2007-07-27 20:58 ` Bjorn Helgaas
2007-07-27 21:05 ` Jeff Garzik
2007-07-27 21:53 ` Kay Sievers
2007-07-29 17:21 ` Kyle Moffett
2007-07-29 18:03 ` Russell King
2007-07-26 8:08 ` Sébastien Dugué
2007-07-25 15:51 ` Yinghai Lu
-- strict thread matches above, loose matches on Subject: below --
2007-07-22 21:04 Linus 2.6.23-rc1 Linus Torvalds
2007-07-23 18:38 ` 2.6.23-rc1: BUG_ON in kmap_atomic_prot() Alexey Dobriyan
2007-07-23 19:01 ` Alexey Dobriyan
2007-07-23 20:24 ` Andrew Morton
2007-07-23 20:40 ` Alexey Dobriyan
2007-07-23 21:01 ` Alexey Dobriyan
2007-07-23 21:11 ` Andrew Morton
2007-07-23 21:28 ` Linus Torvalds
2007-07-24 17:59 ` Adrian Bunk
2007-07-24 18:14 ` Linus Torvalds
2007-07-26 6:09 ` commit 7e92b4fc34 - x86, serial: convert legacy COM ports to platform devices - broke my serial console H. Peter Anvin
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=200707251641.23406.bjorn.helgaas@hp.com \
--to=bjorn.helgaas@hp.com \
--cc=akpm@linux-foundation.org \
--cc=ambx1@neo.rr.com \
--cc=castet.matthieu@free.fr \
--cc=lenb@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mjg59@srcf.ucam.org \
--cc=rmk@arm.linux.org.uk \
--cc=sebastien.dugue@bull.net \
--cc=shaohua.li@intel.com \
--cc=yhlu.kernel@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®