Hi Kay: Kay Sievers wrote: > On Fri, Jul 31, 2009 at 21:35, Mario Limonciello<mario_limonciello@xxxxxxxx> wrote: > > > I guess, we can get rid of all these hacks and the search code, by > tagging the mouse device we need to find, with: > ..., ENV{HID2HCI_SWITCH}="1", RUN+="hid2hci --method=dell --devpath=%p" > > and for the bluetooth device we just let it trigger the > tagged mouse device when it goes away, with: > ..., ENV{REMOVE_CMD}="/sbin/udevadm trigger --action=change --subsystem-match=usb --property-match=HID2HCI_SWITCH=1" > > That way the disappearing bluetooth device would just cause > a "change" event at the mouse device, which would trigger > the original rule again. > It would not need any further search logic, and the resume case > would run the same rules as the plug-in case. > > Thanks for the suggestion! I've cleaned up per this advice and am attaching a new patch. -- Mario Limonciello *Dell | Linux Engineering* mario_limonciello@xxxxxxxx
=== modified file 'extras/hid2hci/70-hid2hci.rules' --- extras/hid2hci/70-hid2hci.rules 2009-07-24 16:06:22 +0000 +++ extras/hid2hci/70-hid2hci.rules 2009-08-06 11:45:36 +0000 @@ -1,6 +1,6 @@ # do not edit this file, it will be overwritten on update -ACTION!="add", GOTO="hid2hci_end" +ACTION!="add|change", GOTO="hid2hci_end" SUBSYSTEM!="usb", GOTO="hid2hci_end" # Variety of Dell Bluetooth devices - match on a mouse device that is @@ -8,7 +8,7 @@ # Known supported devices: 413c:8154, 413c:8158, 413c:8162 ATTR{bInterfaceClass}=="03", ATTR{bInterfaceSubClass}=="01", ATTR{bInterfaceProtocol}=="02", \ ATTRS{bDeviceClass}=="00", ATTRS{idVendor}=="413c", ATTRS{bmAttributes}=="e0", \ - RUN+="hid2hci --method=dell --devpath=%p" + RUN+="hid2hci --method=dell --devpath=%p", ENV{HID2HCI_SWITCH}="1" # Logitech devices (hidraw) KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345abce]|c71[34bc]", \ @@ -21,7 +21,7 @@ # device needs to be chased down on the USB bus. ATTR{bDeviceClass}=="e0", ATTR{bDeviceSubClass}=="01", ATTR{bDeviceProtocol}=="01", \ ATTR{idVendor}=="413c", ATTR{bmAttributes}=="e0", \ - ENV{REMOVE_CMD}="hid2hci --method=dell --devpath=%p --find-sibling-intf=03:01:02" + ENV{REMOVE_CMD}="/sbin/udevadm trigger --action=change --subsystem-match=usb --property-match=HID2HCI_SWITCH=1" # CSR devices ATTR{idVendor}=="0a12|0458|05ac", ATTR{idProduct}=="1000", RUN+="hid2hci --method=csr --devpath=%p" === modified file 'extras/hid2hci/hid2hci.c' --- extras/hid2hci/hid2hci.c 2009-07-24 16:06:22 +0000 +++ extras/hid2hci/hid2hci.c 2009-08-05 08:07:51 +0000 @@ -191,70 +191,14 @@ return NULL; } -static struct usb_dev_handle *find_device(struct udev_device *udev_dev, const char *sibling_intf) +static struct usb_dev_handle *find_device(struct udev_device *udev_dev) { - struct udev *udev = udev_device_get_udev(udev_dev); struct usb_device *dev; - struct udev_device *udev_parent; - char str[UTIL_NAME_SIZE]; - struct udev_enumerate *enumerate; - struct udev_list_entry *entry; - struct usb_dev_handle *handle = NULL; - - if (sibling_intf == NULL) { - dev = usb_device_open_from_udev(udev_dev); - if (dev == NULL) - return NULL; - return usb_open(dev); - } - - /* find matching sibling of the current usb_device, they share the same hub */ - udev_parent = udev_device_get_parent_with_subsystem_devtype(udev_dev, "usb", "usb_device"); - if (udev_parent == NULL) - return NULL; - - enumerate = udev_enumerate_new(udev); - if (enumerate == NULL) - return NULL; - - udev_enumerate_add_match_subsystem(enumerate, "usb"); - - /* match all childs of the parent */ - util_strscpyl(str, sizeof(str), udev_device_get_sysname(udev_parent), "*", NULL); - udev_enumerate_add_match_sysname(enumerate, str); - - /* match the specified interface */ - util_strscpy(str, sizeof(str), sibling_intf); - str[2] = '\0'; - str[5] = '\0'; - str[8] = '\0'; - if (strcmp(str, "-1") != 0) - udev_enumerate_add_match_sysattr(enumerate, "bInterfaceClass", str); - if (strcmp(&str[3], "-1") != 0) - udev_enumerate_add_match_sysattr(enumerate, "bInterfaceSubClass", &str[3]); - if (strcmp(&str[6], "-1") != 0) - udev_enumerate_add_match_sysattr(enumerate, "bInterfaceProtocol", &str[6]); - - udev_enumerate_scan_devices(enumerate); - udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(enumerate)) { - struct udev_device *udev_device; - - udev_device = udev_device_new_from_syspath(udev, udev_list_entry_get_name(entry)); - if (udev_device != NULL) { - /* get the usb_device of the usb_interface we matched */ - udev_parent = udev_device_get_parent_with_subsystem_devtype(udev_device, "usb", "usb_device"); - if (udev_parent == NULL) - continue; - /* only look at the first matching device */ - dev = usb_device_open_from_udev(udev_parent); - if (dev != NULL) - handle = usb_open(dev); - udev_device_unref(udev_device); - break; - } -} - udev_enumerate_unref(enumerate); - return handle; + + dev = usb_device_open_from_udev(udev_dev); + if (dev == NULL) + return NULL; + return usb_open(dev); } static void usage(const char *error) @@ -268,7 +212,6 @@ " --mode= mode to switch to [hid|hci] (default hci)\n" " --devpath= sys device path\n" " --method= method to use to switch [csr|logitech-hid|dell]\n" - " --find-sibling-intf= find the sibling device with 00:00:00 (class:subclass:prot)\n" " --help\n\n"); } @@ -279,7 +222,6 @@ { "mode", required_argument, NULL, 'm' }, { "devpath", required_argument, NULL, 'p' }, { "method", required_argument, NULL, 'M' }, - { "find-sibling-intf", required_argument, NULL, 'I' }, { } }; enum method { @@ -294,14 +236,13 @@ int (*usb_switch)(struct usb_dev_handle *dev, enum mode mode) = NULL; enum mode mode = HCI; const char *devpath = NULL; - const char *sibling_intf = NULL; int err = -1; int rc = 1; for (;;) { int option; - option = getopt_long(argc, argv, "m:p:M:I:qh", options, NULL); + option = getopt_long(argc, argv, "m:p:M:qh", options, NULL); if (option == -1) break; @@ -333,9 +274,6 @@ exit(1); } break; - case 'I': - sibling_intf = optarg; - break; case 'h': usage(NULL); default: @@ -377,10 +315,10 @@ } } - handle = find_device(dev, sibling_intf); + handle = find_device(dev); if (handle == NULL) { - fprintf(stderr, "error: unable to handle '%s' (intf=%s)\n", - udev_device_get_syspath(dev), sibling_intf); + fprintf(stderr, "error: unable to handle '%s'\n", + udev_device_get_syspath(dev)); goto exit; } err = usb_switch(handle, mode); @@ -402,8 +340,8 @@ } if (err < 0) - fprintf(stderr, "error: switching device '%s' (intf=%s) failed.\n", - udev_device_get_syspath(udev_dev), sibling_intf); + fprintf(stderr, "error: switching device '%s' failed.\n", + udev_device_get_syspath(udev_dev)); exit: udev_device_unref(udev_dev); udev_unref(udev);
Attachment:
signature.asc
Description: OpenPGP digital signature