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

Reply via email to