• A Sun's avatar
    media: mceusb: USB reset device following USB clear halt error · 19d41a28
    A Sun authored
    This patch schedules a USB reset device call following a USB clear
    halt error. The issues solved, and patch implementation,
    are similar to those found in
      drivers/hid/usbhid/hid-core.c.
    
    As seen on very rare occasions approximately one time per month
    (mceusb device 2304:0225 in this sample)
      Jul 27 2018 15:09:39
      [59388.696941] mceusb 1-1.1.2:1.0: Error: urb status = -32 (RX HALT)
      [59388.698838] mceusb 1-1.1.2:1.0: rx clear halt error -32
    the device can get into RX or TX HALT state where usb_clear_halt()
    also fails and also returns -EPIPE (HALT/STALL). After which, all
    further mceusb device control and data I/O always fail with HALT/STALL.
    Subsequently, the entire mceusb device no longer functions.
    Cause and problem replication conditions remain unknown.
    
    Further troubleshooting reveals usb_reset_device()
    restores mceusb device operation.
    
    Patch test 1:
    
    Hot unplugging the mceusb device triggers USB RX HALT and
    USB clear halt errors. A mceusb_dev_disconnect() call follows unplug.
    This patch's reset device call invokes an extra
      mceusb_dev_probe()
      mceusb_dev_disconnect()
    cycle, before the mceusb driver detaches.
    The additional probe/disconnect verifies the patch's device reset
    code executed.
    
    But note this patch is for USB clear halt error cases not caused by
    unplugging the mceusb device.
    
    Patch test 2:
    
    Simulate a RX HALT and a clear halt error with instrumented code in
    the driver.
      Jul 12 2019 19:41:18
      [522745.263104] mceusb 1-1.3:1.0: set rx halt retval, 0
      [522745.263943] mceusb 1-1.3:1.0: Error: rx urb status = -32 (RX HALT)
      [522745.263970] mceusb 1-1.3:1.0: kevent 1 scheduled
      [522745.264016] mceusb 1-1.3:1.0: kevent handler called (flags 0x2)
      [522745.272883] mceusb 1-1.3:1.0: rx clear halt status = 0
      [522745.272917] mceusb 1-1.3:1.0: stuck RX HALT state requires USB Reset Device to clear
      [522745.273005] mceusb 1-1.3:1.0: mceusb_dev_disconnect called
      [522745.702815] usb 1-1.3: reset full-speed USB device number 14 using dwc_otg
      [522745.836812] mceusb 1-1.3:1.0: mceusb_dev_probe called
      [522745.836823] mceusb 1-1.3:1.0: acceptable bulk inbound endpoint found
      [522745.836832] mceusb 1-1.3:1.0: acceptable bulk outbound endpoint found
      ...
    The result matches what is expected when the device gets into
    a real rx clear halt error case by itself.
    This is the same sequence of messages when manually invoking
    the ./usbreset command line utility with an unpatched mceusb driver.
    Signed-off-by: default avatarA Sun <as1033x@comcast.net>
    Signed-off-by: default avatarSean Young <sean@mess.org>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
    19d41a28
mceusb.c 50.7 KB