diff --git a/kernel.spec b/kernel.spec index 66fb761..fdbfa26 100644 --- a/kernel.spec +++ b/kernel.spec @@ -751,6 +751,8 @@ Patch12595: sched-35-increment-cache_nice_tries-only-on-periodic-lb.patch Patch13600: btusb-macbookpro-6-2.patch Patch13601: btusb-macbookpro-7-1.patch +Patch13603: pnpacpi-cope-with-invalid-device-ids.patch + Patch13610: libata-it821x-dump-stack-on-cache-flush.patch Patch13620: xen-fix-typo-in-xen-irq-fix.patch @@ -1402,6 +1404,8 @@ ApplyPatch libata-it821x-dump-stack-on-cache-flush.patch # temporary fix for typo in Xen -stable patch ApplyPatch xen-fix-typo-in-xen-irq-fix.patch +# rhbz#641468 +ApplyPatch pnpacpi-cope-with-invalid-device-ids.patch # rhbz#641476 ApplyPatch dm-allow-setting-of-uuid-via-rename-if-not-already-set.patch @@ -1992,6 +1996,9 @@ fi # and build. %changelog +* Fri Oct 15 2010 Kyle McMartin +- pnpacpi: cope with invalid device IDs. (rhbz#641468) + * Fri Oct 15 2010 Peter Jones 2.6.35.6-44 - Add a missing dm_put in previous device mapper patch. diff --git a/pnpacpi-cope-with-invalid-device-ids.patch b/pnpacpi-cope-with-invalid-device-ids.patch new file mode 100644 index 0000000..70b2ab9 --- /dev/null +++ b/pnpacpi-cope-with-invalid-device-ids.patch @@ -0,0 +1,85 @@ +commit 420a0f66378c84b00b0e603e4d38210102dbe367 +Author: Dmitry Torokhov +Date: Sat Sep 18 10:11:09 2010 -0700 + + PNPACPI: cope with invalid device IDs + + If primary ID (HID) is invalid try locating first valid ID on compatible + ID list before giving up. + + This helps, for example, to recognize i8042 AUX port on Sony Vaio VPCZ1 + which uses SNYSYN0003 as HID. Without the patch users are forced to + boot with i8042.nopnp to make use of their touchpads. + + Tested-by: Jan-Hendrik Zab + Signed-off-by: Dmitry Torokhov + Signed-off-by: Len Brown + +diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c +index dc4e32e..0d943ee 100644 +--- a/drivers/pnp/pnpacpi/core.c ++++ b/drivers/pnp/pnpacpi/core.c +@@ -28,7 +28,7 @@ + #include "../base.h" + #include "pnpacpi.h" + +-static int num = 0; ++static int num; + + /* We need only to blacklist devices that have already an acpi driver that + * can't use pnp layer. We don't need to blacklist device that are directly +@@ -180,11 +180,24 @@ struct pnp_protocol pnpacpi_protocol = { + }; + EXPORT_SYMBOL(pnpacpi_protocol); + ++static char *pnpacpi_get_id(struct acpi_device *device) ++{ ++ struct acpi_hardware_id *id; ++ ++ list_for_each_entry(id, &device->pnp.ids, list) { ++ if (ispnpidacpi(id->id)) ++ return id->id; ++ } ++ ++ return NULL; ++} ++ + static int __init pnpacpi_add_device(struct acpi_device *device) + { + acpi_handle temp = NULL; + acpi_status status; + struct pnp_dev *dev; ++ char *pnpid; + struct acpi_hardware_id *id; + + /* +@@ -192,11 +205,17 @@ static int __init pnpacpi_add_device(struct acpi_device *device) + * driver should not be loaded. + */ + status = acpi_get_handle(device->handle, "_CRS", &temp); +- if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) || +- is_exclusive_device(device) || (!device->status.present)) ++ if (ACPI_FAILURE(status)) ++ return 0; ++ ++ pnpid = pnpacpi_get_id(device); ++ if (!pnpid) ++ return 0; ++ ++ if (is_exclusive_device(device) || !device->status.present) + return 0; + +- dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device)); ++ dev = pnp_alloc_dev(&pnpacpi_protocol, num, pnpid); + if (!dev) + return -ENOMEM; + +@@ -227,7 +246,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device) + pnpacpi_parse_resource_option_data(dev); + + list_for_each_entry(id, &device->pnp.ids, list) { +- if (!strcmp(id->id, acpi_device_hid(device))) ++ if (!strcmp(id->id, pnpid)) + continue; + if (!ispnpidacpi(id->id)) + continue;