On Thu, 5 Oct 2006, Martin Christoph wrote: > Alan Stern wrote: > > > [...] > > Try the patch below, and send in another usbmon listing together with the > > dmesg log if it doesn't > > work. > > > > Alan Stern > > > > [patch] > > Thank you for the patch. Unfortunately the device is still not working. > Here the information i obtained from my testsystem. I attached the usbmon > output from plugging the > device in and out.
Okay, Martin, I found the problem with that patch. Here's an updated version, nearly identical, also for 2.6.18. I think it will solve your problem. Alan Stern Index: 2.6.18/drivers/usb/input/hid.h =================================================================== --- 2.6.18.orig/drivers/usb/input/hid.h +++ 2.6.18/drivers/usb/input/hid.h @@ -384,6 +384,7 @@ struct hid_control_fifo { #define HID_IN_RUNNING 3 #define HID_RESET_PENDING 4 #define HID_SUSPENDED 5 +#define HID_CLEAR_HALT 6 struct hid_input { struct list_head list; Index: 2.6.18/drivers/usb/input/hid-core.c =================================================================== --- 2.6.18.orig/drivers/usb/input/hid-core.c +++ 2.6.18/drivers/usb/input/hid-core.c @@ -935,20 +935,29 @@ static void hid_retry_timeout(unsigned l hid_io_error(hid); } -/* Workqueue routine to reset the device */ +/* Workqueue routine to reset the device or clear a halt */ static void hid_reset(void *_hid) { struct hid_device *hid = (struct hid_device *) _hid; - int rc_lock, rc; + int rc_lock, rc = 0; - dev_dbg(&hid->intf->dev, "resetting device\n"); - rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf); - if (rc_lock >= 0) { - rc = usb_reset_composite_device(hid->dev, hid->intf); - if (rc_lock) - usb_unlock_device(hid->dev); + if (test_bit(HID_CLEAR_HALT, &hid->iofl)) { + dev_dbg(&hid->intf->dev, "clear halt\n"); + rc = usb_clear_halt(hid->dev, hid->urbin->pipe); + clear_bit(HID_CLEAR_HALT, &hid->iofl); + hid_start_in(hid); + } + + else if (test_bit(HID_RESET_PENDING, &hid->iofl)) { + dev_dbg(&hid->intf->dev, "resetting device\n"); + rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf); + if (rc_lock >= 0) { + rc = usb_reset_composite_device(hid->dev, hid->intf); + if (rc_lock) + usb_unlock_device(hid->dev); + } + clear_bit(HID_RESET_PENDING, &hid->iofl); } - clear_bit(HID_RESET_PENDING, &hid->iofl); switch (rc) { case 0: @@ -990,9 +999,8 @@ static void hid_io_error(struct hid_devi /* Retries failed, so do a port reset */ if (!test_and_set_bit(HID_RESET_PENDING, &hid->iofl)) { - if (schedule_work(&hid->reset_work)) - goto done; - clear_bit(HID_RESET_PENDING, &hid->iofl); + schedule_work(&hid->reset_work); + goto done; } } @@ -1016,6 +1024,11 @@ static void hid_irq_in(struct urb *urb, hid->retry_delay = 0; hid_input_report(HID_INPUT_REPORT, urb, 1, regs); break; + case -EPIPE: /* stall */ + clear_bit(HID_IN_RUNNING, &hid->iofl); + set_bit(HID_CLEAR_HALT, &hid->iofl); + schedule_work(&hid->reset_work); + return; case -ECONNRESET: /* unlink */ case -ENOENT: case -ESHUTDOWN: /* unplug */ ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel