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