• Guenter Roeck's avatar
    usb: dwc2: Abort transaction after errors with unknown reason · f74b68c6
    Guenter Roeck authored
    In some situations, the following error messages are reported.
    
    dwc2 ff540000.usb: dwc2_hc_chhltd_intr_dma: Channel 1 - ChHltd set, but reason is unknown
    dwc2 ff540000.usb: hcint 0x00000002, intsts 0x04000021
    
    This is sometimes followed by:
    
    dwc2 ff540000.usb: dwc2_update_urb_state_abn(): trimming xfer length
    
    and then:
    
    WARNING: CPU: 0 PID: 0 at kernel/v4.19/drivers/usb/dwc2/hcd.c:2913
    			dwc2_assign_and_init_hc+0x98c/0x990
    
    The warning suggests that an odd buffer address is to be used for DMA.
    
    After an error is observed, the receive buffer may be full
    (urb->actual_length >= urb->length). However, the urb is still left in
    the queue unless three errors were observed in a row. When it is queued
    again, the dwc2 hcd code translates this into a 1-block transfer.
    If urb->actual_length (ie the total expected receive length) is not
    DMA-aligned, the buffer pointer programmed into the chip will be
    unaligned. This results in the observed warning.
    
    To solve the problem, abort input transactions after an error with
    unknown cause if the entire packet was already received. This may be
    a bit drastic, but we don't really know why the transfer was aborted
    even though the entire packet was received. Aborting the transfer in
    this situation is less risky than accepting a potentially corrupted
    packet.
    
    With this patch in place, the 'ChHltd set' and 'trimming xfer length'
    messages are still observed, but there are no more transfer attempts
    with odd buffer addresses.
    
    Fixes: 151d0cbd ("usb: dwc2: make the scheduler handle excessive NAKs better")
    Cc: Boris ARZUR <boris@konbu.org>
    Cc: Douglas Anderson <dianders@chromium.org>
    Tested-by: default avatarNicolas Saenz Julienne <nsaenzjulienne@suse.de>
    Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
    Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Signed-off-by: default avatarNicolas Saenz Julienne <nsaenzjulienne@suse.de>
    Link: https://lore.kernel.org/r/20210113112052.17063-3-nsaenzjulienne@suse.deSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f74b68c6
hcd_intr.c 67.1 KB