lkml.org 
[lkml]   [2006]   [Sep]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: one more ACPI Error (utglobal-0125): Unknown exception code: 0xFFFFFFEA [Re: 2.6.18-rc4-mm3]
    Date
    On Friday 01 September 2006 17:01, keith mannthey wrote:
    > On Thu, 2006-08-31 at 21:15 -0600, Bjorn Helgaas wrote:
    > > The current ACPI driver binding algorithm in acpi_bus_find_driver()
    > > looks at each driver, checking whether it can match either the _HID
    > > or the _CID of a device. Since we try the motherboard driver first,
    > > it matches the memory device _CID.
    >
    > Ok I reverted the motherboard driver patch and cooked up the following
    > patch that works for my issue.
    >
    > It creates the idea that acpi_match_ids has a type of request to check
    > against for _HID, _CID or both. See acpi_bus_match_req. I then fix up
    > all the needed callers to change the API to acpi_match_ids and
    > acpi_bus_match and have callers can say what they want to match
    > against.
    >
    > Then in acpi_bus_find_driver I have it do 2 passes to search for _HID
    > first then the _CID.
    >
    > Does this look like it is in the right ballpark or should we be doing
    > something else? Built/tested against 2.6.18-rc4-mm3.

    Conceptually I like this much better than mucking with the motherboard
    driver. I'm not sure the important people have signed off on this
    strategy of binding with _HID first, then _CID (hi, Len :-)) Maybe
    there are ramifications that we need to consider. But I think it
    is a better match for "what people expect should happen."

    > Signed-off-by: Keith Mannthey <kmannth@us.ibm.com>
    >
    >
    > diff -urN linux-2.6.17-orig/drivers/acpi/scan.c linux-2.6.17/drivers/acpi/scan.c
    > --- linux-2.6.17-orig/drivers/acpi/scan.c 2006-09-01 17:11:37.000000000 -0400
    > +++ linux-2.6.17/drivers/acpi/scan.c 2006-09-01 18:13:53.000000000 -0400
    > @@ -235,13 +235,13 @@
    > return 0;
    > }
    >
    > -int acpi_match_ids(struct acpi_device *device, char *ids)
    > +int acpi_match_ids(struct acpi_device *device, char *ids, int type)
    > {
    > - if (device->flags.hardware_id)
    > + if ((device->flags.hardware_id) && (type != ACPI_BUS_MATCH_CID))
    > if (strstr(ids, device->pnp.hardware_id))
    > return 0;
    >
    > - if (device->flags.compatible_ids) {
    > + if ((device->flags.compatible_ids) && (type != ACPI_BUS_MATCH_HID)) {
    > struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
    > int i;
    >
    > @@ -329,7 +329,8 @@
    >
    > device->wakeup.flags.valid = 1;
    > /* Power button, Lid switch always enable wakeup */
    > - if (!acpi_match_ids(device, "PNP0C0D,PNP0C0C,PNP0C0E"))
    > + if (!acpi_match_ids(device, "PNP0C0D,PNP0C0C,PNP0C0E",
    > + ACPI_BUS_MATCH_ALL))
    > device->wakeup.flags.run_wake = 1;
    >
    > end:
    > @@ -471,11 +472,11 @@
    > * matches the specified driver's criteria.
    > */
    > static int
    > -acpi_bus_match(struct acpi_device *device, struct acpi_driver *driver)
    > +acpi_bus_match(struct acpi_device *device, struct acpi_driver *driver, int type)
    > {
    > if (driver && driver->ops.match)
    > return driver->ops.match(device, driver);
    > - return acpi_match_ids(device, driver->ids);
    > + return acpi_match_ids(device, driver->ids, type);
    > }
    >
    > /**
    > @@ -549,7 +550,7 @@
    > continue;
    > spin_unlock(&acpi_device_lock);
    >
    > - if (!acpi_bus_match(dev, drv)) {
    > + if (!acpi_bus_match(dev, drv, ACPI_BUS_MATCH_ALL)) {
    > if (!acpi_bus_driver_init(dev, drv)) {
    > acpi_start_single_object(dev);
    > atomic_inc(&drv->references);
    > @@ -651,7 +652,22 @@
    >
    > atomic_inc(&driver->references);
    > spin_unlock(&acpi_device_lock);
    > - if (!acpi_bus_match(device, driver)) {
    > + if (!acpi_bus_match(device, driver, ACPI_BUS_MATCH_HID)) {
    > + result = acpi_bus_driver_init(device, driver);
    > + if (!result)
    > + goto Done;
    > + }
    > + atomic_dec(&driver->references);
    > + spin_lock(&acpi_device_lock);
    > + }
    > +
    > + list_for_each_safe(node, next, &acpi_bus_drivers) {
    > + struct acpi_driver *driver =
    > + container_of(node, struct acpi_driver, node);
    > +
    > + atomic_inc(&driver->references);
    > + spin_unlock(&acpi_device_lock);
    > + if (!acpi_bus_match(device, driver, ACPI_BUS_MATCH_ALL)) {
    > result = acpi_bus_driver_init(device, driver);
    > if (!result)
    > goto Done;
    > diff -urN linux-2.6.17-orig/drivers/pnp/pnpacpi/core.c linux-2.6.17/drivers/pnp/pnpacpi/core.c
    > --- linux-2.6.17-orig/drivers/pnp/pnpacpi/core.c 2006-09-01 17:11:37.000000000 -0400
    > +++ linux-2.6.17/drivers/pnp/pnpacpi/core.c 2006-09-01 18:03:26.000000000 -0400
    > @@ -41,7 +41,7 @@
    > ;
    > static inline int is_exclusive_device(struct acpi_device *dev)
    > {
    > - return (!acpi_match_ids(dev, excluded_id_list));
    > + return (!acpi_match_ids(dev, excluded_id_list, ACPI_BUS_MATCH_ALL));
    > }
    >
    > /*
    > diff -urN linux-2.6.17-orig/include/acpi/acpi_bus.h linux-2.6.17/include/acpi/acpi_bus.h
    > --- linux-2.6.17-orig/include/acpi/acpi_bus.h 2006-09-01 17:11:38.000000000 -0400
    > +++ linux-2.6.17/include/acpi/acpi_bus.h 2006-09-01 18:00:27.000000000 -0400
    > @@ -79,6 +79,12 @@
    > ACPI_BUS_DEVICE_TYPE_COUNT
    > };
    >
    > +enum acpi_bus_match_req {
    > + ACPI_BUS_MATCH_HID = 0,
    > + ACPI_BUS_MATCH_CID,
    > + ACPI_BUS_MATCH_ALL
    > +};
    > +
    > struct acpi_driver;
    > struct acpi_device;
    >
    > @@ -335,7 +341,7 @@
    > int acpi_bus_trim(struct acpi_device *start, int rmdevice);
    > int acpi_bus_start(struct acpi_device *device);
    > acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle *ejd);
    > -int acpi_match_ids(struct acpi_device *device, char *ids);
    > +int acpi_match_ids(struct acpi_device *device, char *ids, int type);
    > int acpi_create_dir(struct acpi_device *);
    > void acpi_remove_dir(struct acpi_device *);
    >
    >
    >
    >

    --
    VGER BF report: H 0
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-09-02 01:23    [W:0.031 / U:1.616 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site