It seems usb_unlink_urb(submitted_urb) causes a kernel oops if called after the usbcore completes usb_disconnect(), during fileop->close(), when the device is hardware-disconnected while streaming. Below is the oops from the kernel and (part of) the code calling usb_unlink_urb(). The same code used to work on previous versions of the kernel.
Unable to handle kernel paging request at virtual address 6b6b6b8b printing eip: c0207cf8 *pde = 00000000 Oops: 0000 [#1] PREEMPT Modules linked in: w9968cf_vpp ovcamchip w9968cf floppy ehci_hcd uhci_hcd ipt_TCPMSS ipt_state ipt_limit ipt_MASQUERADE iptable_nat ip_conntrack ipt_TOS ipt_multiport iptable_mangle ppp_synctty ppp_async iptable_filter ip_tables 8139too mii crc32 ide_scsi scsi_mod ide_cd cdrom rtc CPU: 0 EIP: 0060:[<c0207cf8>] Not tainted EFLAGS: 00210202 (2.6.7-rc1-bk1) EIP is at usb_unlink_urb+0x18/0x30 eax: c3fe5d04 ebx: 00000001 ecx: 00000001 edx: 6b6b6b6b esi: c2922084 edi: c36b40ec ebp: c28a2f64 esp: c28a2f64 ds: 007b es: 007b ss: 0068 Process xawtv (pid: 4786, threadinfo=c28a2000 task=c336a710) Stack: c28a2f7c c4968258 01922084 c2922084 c29227d0 c10931f4 c28a2f8c c496c80a c12eca88 00000000 c28a2fa8 c014c797 c345c96c c2e1f2d0 c12eca88 00000000 c2f48750 c28a2fbc c014b086 00000004 08097ed0 40189884 c28a2000 c0105e47 Call Trace: [<c0106445>] show_stack+0x75/0x90 [<c0106595>] show_registers+0x115/0x170 [<c01066f2>] die+0x82/0xf0 [<c0112a7e>] do_page_fault+0x20e/0x531 [<c01060ad>] error_code+0x2d/0x40 [<c4968258>] w9968cf_stop_transfer+0x158/0x1a0 [w9968cf] [<c496c80a>] w9968cf_release+0x2a/0xe0 [w9968cf] [<c014c797>] __fput+0x127/0x140 [<c014b086>] filp_close+0x46/0x70 [<c0105e47>] syscall_call+0x7/0xb Code: 8b 52 20 85 d2 75 08 90 b8 ed ff ff ff 5d c3 ff 52 10 eb f9 static void w9968cf_stop_transfer(struct w9968cf_device* cam) { struct usb_device *udev = cam->usbdev; ... for (i = W9968CF_URBS-1; i >= 0; i--) if (cam->urb[i]) { if (!usb_unlink_urb(cam->urb[i])) { /* From urb.c: "Successful cancelation means the request's completion handler _will be_ called with a [-ENOENT] status code indicating that the request has been canceled". This means we can wait for it to wake up this code: */ wait_for_completion(&cam->urb_complete); usb_free_urb(cam->urb[i]); cam->urb[i] = NULL; } } ... } static void w9968cf_urb_complete() { if (urb->status == -ENOENT) { complete(&cam->urb_complete); return; } .... } ------------------------------------------------------- This SF.Net email is sponsored by: Oracle 10g Get certified on the hottest thing ever to hit the market... Oracle 10g. Take an Oracle 10g class now, and we'll give you the exam FREE. http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel