• G
    usb: dwc2: Abort transaction after errors with unknown reason · 13e343db
    Guenter Roeck 提交于
    stable inclusion
    from stable-5.10.20
    commit fdc77e02db8cad90f89cbf43e7c4804f2eecb2ad
    bugzilla: 50608
    
    --------------------------------
    
    [ Upstream commit f74b68c6 ]
    
    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: NNicolas Saenz Julienne <nsaenzjulienne@suse.de>
    Reviewed-by: NDouglas Anderson <dianders@chromium.org>
    Signed-off-by: NGuenter Roeck <linux@roeck-us.net>
    Signed-off-by: NNicolas Saenz Julienne <nsaenzjulienne@suse.de>
    Link: https://lore.kernel.org/r/20210113112052.17063-3-nsaenzjulienne@suse.deSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    Signed-off-by: NChen Jun <chenjun102@huawei.com>
    Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    13e343db
hcd_intr.c 67.1 KB