diff -Nur -x '*.orig' -x '*~' bluez-utils-3.26/tools/hid2hci.c bluez-utils-3.26.new/tools/hid2hci.c --- bluez-utils-3.26/tools/hid2hci.c 2008-02-01 17:16:34.000000000 -0600 +++ bluez-utils-3.26.new/tools/hid2hci.c 2008-04-04 13:34:13.000000000 -0500 @@ -211,6 +211,42 @@ return err; } +static int switch_dell(struct device_info *devinfo) +{ + char report[] = { 0x7F, 0x13, 0x00, 0x00}; + + struct usb_dev_handle *handle; + int err; + + //release any locks that the kernel may have on this device + handle = usb_open(devinfo->dev); + if (handle) + { + usb_claim_interface(handle, 0); + usb_detach_kernel_driver_np(handle,0); + } + + //switch device modes + err = usb_control_msg(handle, + USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE, + 0x09, + 0x7f + (0x03 << 8), + 0, + (char*)report, 4, 10000); + + if (err == 0) { + err = -1; + errno = EALREADY; + } else { + if (errno == ETIMEDOUT) + err = 0; + } + + usb_close(handle); + + return err; +} + static struct device_id device_list[] = { { HCI, 0x0a12, 0x1000, switch_hidproxy }, { HID, 0x0a12, 0x0001, switch_hidproxy }, @@ -229,6 +265,7 @@ { HCI, 0x046d, 0xc70e, switch_logitech }, /* Logitech diNovo keyboard */ { HCI, 0x046d, 0xc713, switch_logitech }, /* Logitech diNovo Edge */ { HCI, 0x046d, 0xc714, switch_logitech }, /* Logitech diNovo Edge */ + { HCI, 0x413c, 0x8158, switch_dell }, /* Dell Wireless 370 */ { -1 } };