That fixed everything, Alan, you are the man! Thank you so much, if
you need anything else tested just let me know.
On Fri, 13 Aug 2004 11:56:16 -0400 (EDT), Alan Stern
<[EMAIL PROTECTED]> wrote:
> On Fri, 13 Aug 2004, Michael Guterl wrote:
>
> > Okay I applied this patch to 2.6.8-rc3-mm1 and recorded dmesg's output
> > with no devices attached, after the keyboard was plugged in and
> > unplugged, and then rebooted, plugged the mouse and then unplugged it.
> > All the corresponding files are attached. I don't know if this was
> > intended to fix anything or provide more useful output, but it did not
> > fix anything.
>
> Thanks to both of you for your testing. (And yes, the patch wasn't
> intended to fix anything but only to provide more useful information --
> which it did.)
>
> It turns out there are two bugs in the HID core causing this problem:
>
> (1) The calls to usb_unlink_urb() in hid_init_reports() are
> being carried out using synchronous unlinking, since the
> URB_ASYNC_UNLINK flag isn't set in either the control or
> the output URB. Synchronous unlinking prevents resubmission
> from within the completion handler, which means that
> hid_submit_ctrl() fails and returns an error code.
>
> (2) hid_submit_report() calls hid_submit_out() and hid_submit_ctrl()
> but doesn't check the return codes. So if there's an error
> in submission, the HID_OUT_RUNNING or HID_CTRL_RUNNING bits
> remain set even though the queue isn't running. Of course
> this causes the driver to stop working.
>
> (1) can be fixed easily enough by setting the URB_ASYNC_UNLINK flag in the
> two URBs. The patch below includes this change, together with some places
> where I changed usb_unlink_urb() to usb_kill_urb() in cases where
> synchronous unlinking clearly is needed. However I'm not very familiar
> with the HID driver, so it's possible that setting the flag will have
> other, bad consequences or that some other places need to be changed too.
>
> I don't know how to fix (2). Someone who knows the driver will have to do
> this. Fortunately in your cases, once (1) is fixed then (2) shouldn't
> occur.
>
> There remains the question of what caused the original timeout that
> started the cascade of bugs. I can't tell, but maybe it will turn out not
> to matter once the bugs are gone.
>
> In the meantime, you can try out this patch and see if it helps at all.
> You won't need the previous patch -- although if things still don't work
> you should apply both patches and send the dmesg as before. It won't be
> surprising if the final fix for these bugs turns out to be quite different
> from the patch below.
>
> Vojtech, maybe you can look more deeply into these problems and check
> whether my attempted fix for (1) is really okay.
>
> Alan Stern
>
> ===== drivers/usb/input/hid-core.c 1.119 vs edited =====
> --- 1.119/drivers/usb/input/hid-core.c Fri Jul 23 09:29:18 2004
> +++ edited/drivers/usb/input/hid-core.c Fri Aug 13 11:31:17 2004
> @@ -1282,7 +1282,7 @@
> void hid_close(struct hid_device *hid)
> {
> if (!--hid->open)
> - usb_unlink_urb(hid->urbin);
> + usb_kill_urb(hid->urbin);
> }
>
> /*
> @@ -1654,7 +1654,8 @@
> usb_fill_int_urb(hid->urbout, dev, pipe, hid->outbuf, 0,
> hid_irq_out, hid, interval);
> hid->urbout->transfer_dma = hid->outbuf_dma;
> - hid->urbout->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
> + hid->urbout->transfer_flags |= (URB_ASYNC_UNLINK |
> + URB_NO_TRANSFER_DMA_MAP);
> }
> }
>
> @@ -1704,8 +1705,8 @@
> hid->ctrlbuf, 1, hid_ctrl, hid);
> hid->urbctrl->setup_dma = hid->cr_dma;
> hid->urbctrl->transfer_dma = hid->ctrlbuf_dma;
> - hid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP
> - | URB_NO_SETUP_DMA_MAP);
> + hid->urbctrl->transfer_flags |= (URB_ASYNC_UNLINK |
> + URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
>
> return hid;
>
> @@ -1731,9 +1732,9 @@
> return;
>
> usb_set_intfdata(intf, NULL);
> - usb_unlink_urb(hid->urbin);
> - usb_unlink_urb(hid->urbout);
> - usb_unlink_urb(hid->urbctrl);
> + usb_kill_urb(hid->urbin);
> + usb_kill_urb(hid->urbout);
> + usb_kill_urb(hid->urbctrl);
>
> if (hid->claimed & HID_CLAIMED_INPUT)
> hidinput_disconnect(hid);
>
>
-------------------------------------------------------
SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media
100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33
Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift.
http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel