[PATCH] config: search for PnPID on all parents (#75513)

Benjamin Tissoires benjamin.tissoires at gmail.com
Tue Mar 11 09:43:42 PDT 2014


On Tue, Feb 25, 2014 at 8:20 PM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> The PnPID for a device may not be on the immediate parent, so search up the
> device tree until we find one.
>
> X.Org Bug 75513 <http://bugs.freedesktop.org/show_bug.cgi?id=75513>
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> Another fix for the T440 and associated laptops. With Matthew's kernel patch
> https://lkml.org/lkml/2014/2/23/63 the PNPID is available in the tree, but
> a few parents up from our device.
>
> I'll need a tested-by for the HAL code though, I've only startup-tested it
> so far but not triggered the actual code.

Here you go:
Tested-by: Benjamin Tissoires <benjamin.tissoires at gmail.com>

tested under udev and hal backends.

Cheers,
Benjamin

>
>  config/hal.c  | 16 +++++++++++++---
>  config/udev.c | 15 +++++++++++----
>  2 files changed, 24 insertions(+), 7 deletions(-)
>
> diff --git a/config/hal.c b/config/hal.c
> index 94cb6e7..ea574ca 100644
> --- a/config/hal.c
> +++ b/config/hal.c
> @@ -185,8 +185,7 @@ device_added(LibHalContext * hal_ctx, const char *udi)
>      parent = get_prop_string(hal_ctx, udi, "info.parent");
>      if (parent) {
>          int usb_vendor, usb_product;
> -
> -        attrs.pnp_id = get_prop_string(hal_ctx, parent, "pnp.id");
> +        char *old_parent;
>
>          /* construct USB ID in lowercase - "0000:ffff" */
>          usb_vendor = libhal_device_get_property_int(hal_ctx, parent,
> @@ -204,7 +203,18 @@ device_added(LibHalContext * hal_ctx, const char *udi)
>                  == -1)
>                  attrs.usb_id = NULL;
>
> -        free(parent);
> +        attrs.pnp_id = get_prop_string(hal_ctx, parent, "pnp.id");
> +        old_parent = parent;
> +
> +        while (!attrs.pnp_id &&
> +               (parent = get_prop_string(hal_ctx, parent, "info.parent"))) {
> +            attrs.pnp_id = get_prop_string(hal_ctx, parent, "pnp.id");
> +
> +            free(old_parent);
> +            old_parent = parent;
> +        }
> +
> +        free(old_parent);
>      }
>
>      input_options = input_option_new(NULL, "_source", "server/hal");
> diff --git a/config/udev.c b/config/udev.c
> index 68ed348..2a5d40a 100644
> --- a/config/udev.c
> +++ b/config/udev.c
> @@ -130,10 +130,6 @@ device_added(struct udev_device *udev_device)
>              LOG_PROPERTY(ppath, "NAME", name);
>          }
>
> -        if (pnp_id)
> -            attrs.pnp_id = strdup(pnp_id);
> -        LOG_SYSATTR(ppath, "id", pnp_id);
> -
>          /* construct USB ID in lowercase hex - "0000:ffff" */
>          if (product &&
>              sscanf(product, "%*x/%4x/%4x/%*x", &usb_vendor, &usb_model) == 2) {
> @@ -145,6 +141,17 @@ device_added(struct udev_device *udev_device)
>                  LOG_PROPERTY(ppath, "PRODUCT", product);
>              attrs.usb_id = usb_id;
>          }
> +
> +        while (!pnp_id && (parent = udev_device_get_parent(parent))) {
> +            pnp_id = udev_device_get_sysattr_value(parent, "id");
> +            if (!pnp_id)
> +                continue;
> +
> +            attrs.pnp_id = strdup(pnp_id);
> +            ppath = udev_device_get_devnode(parent);
> +            LOG_SYSATTR(ppath, "id", pnp_id);
> +        }
> +
>      }
>      if (!name)
>          name = "(unnamed)";
> --
> 1.8.4.2
>


More information about the xorg-devel mailing list