usb/79287: UHCI hang after interrupt transfer

Adam Kropelin akropel1 at rochester.rr.com
Sun Mar 27 14:30:03 PST 2005


>Number:         79287
>Category:       usb
>Synopsis:       UHCI hang after interrupt transfer
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-usb
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Mar 27 22:30:02 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Adam Kropelin
>Release:        6.0-CURRENT
>Organization:
>Environment:
FreeBSD p3.kroptech.com 6.0-CURRENT FreeBSD 6.0-CURRENT #0: Tue Mar 22 23:25:44 EST 2005     adk0212 at p3.kroptech.com:/usr/src/sys/i386/compile/GENERIC.adk  i386
>Description:
My userspace HID driver (apcupsd) makes extensive use of ugen and the USB_DO_REQUEST ioctl. Some users are experiencing a hang where the driver process becomes unkillable and I've traced the problem to a USB_DO_REQUEST ioctl that never returns. The hang is very intermittent (it can happen after anywhere from tens to thousands of USB transfers) and seems to be timing dependent (enabling USB_DEBUG makes the condition much harder to trigger). 

I've managed to capture a USB_DEBUG trace that shows the failure condition. After thousands of proper transfers, I see this...

kernel: usbd_start_next: pipe=0xc1a83c00, xfer=0
kernel: usb_transfer_complete: pipe=0xc1f6cb80 xfer=0xc1a9d400 status=0
actlen=5
kernel: usb_transfer_complete: repeat=1 new head=0xc1a9d400
kernel: usb0: host controller process error
kernel: usb0: host controller halted
kernel: usb0 regs: cmd=0080, sts=0031, intr=000f, frnum=0528,
flbase=1f2c9000, sof=0040, portsc1=05a5, portsc2=0580
kernel: intrs=43840
kernel: QH(0xc1a93f80) at 1f167f80: hlink=1f167fa2 elink=00000001
kernel: usbd_free_xfer: 0xc1f1c800
kernel: usbd_alloc_xfer() = 0xc1f1c800
kernel: usbd_transfer: xfer=0xc1f1c800, flags=6, pipe=0xc1a83c00, running=0
kernel: usbd_dump_queue: pipe=0xc1a83c00
kernel: usb_allocmem: large alloc 100
kernel: usb_block_allocmem: size=4096 align=1
kernel: usb_block_allocmem: free list size=4096
kernel: usb_insert_transfer: pipe=0xc1a83c00 running=0 timeout=0
kernel: usb_freemem: large free
kernel: usb_block_freemem: size=4096
kernel: usbd_free_xfer: 0xc1f1c800
kernel: usbd_alloc_xfer() = 0xc1f1c800
kernel: usbd_transfer: xfer=0xc1f1c800, flags=6, pipe=0xc1a83c00, running=1
kernel: usbd_dump_queue: pipe=0xc1a83c00
kernel: xfer=0xc1f1c800
kernel: usb_allocmem: large alloc 100
kernel: usb_block_allocmem: size=4096 align=1
kernel: usb_block_allocmem: free list size=4096
kernel: usb_insert_transfer: pipe=0xc1a83c00 running=1 timeout=0
kernel: usb_event_thread: woke up
kernel: usb_discover

..after which only the usb_event_thread and usb_discover messages continue.

I've tested 5.3-RELEASE as well as 6.0-CURRENT.

FWIW, OpenBSD and NetBSD exhibit the same hang.

Also FWIW, The USB rewrite from Hans Petter Selasky <hselasky at c2i dot net> does NOT exhibit the hang.

I'm willing to test patches or do whatever level of debugging is
required. A lot of users are hitting this hang and I'd like to get them up and running again with something less invasive than a complete subsystem rewrite.
>How-To-Repeat:

>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-usb mailing list