• Peter Chen's avatar
    usb: chipidea: udc: workaround for endpoint conflict issue · 94207779
    Peter Chen authored
    commit c19dffc0 upstream.
    
    An endpoint conflict occurs when the USB is working in device mode
    during an isochronous communication. When the endpointA IN direction
    is an isochronous IN endpoint, and the host sends an IN token to
    endpointA on another device, then the OUT transaction may be missed
    regardless the OUT endpoint number. Generally, this occurs when the
    device is connected to the host through a hub and other devices are
    connected to the same hub.
    
    The affected OUT endpoint can be either control, bulk, isochronous, or
    an interrupt endpoint. After the OUT endpoint is primed, if an IN token
    to the same endpoint number on another device is received, then the OUT
    endpoint may be unprimed (cannot be detected by software), which causes
    this endpoint to no longer respond to the host OUT token, and thus, no
    corresponding interrupt occurs.
    
    There is no good workaround for this issue, the only thing the software
    could do is numbering isochronous IN from the highest endpoint since we
    have observed most of device number endpoint from the lowest.
    
    Cc: <stable@vger.kernel.org> #v3.14+
    Cc: Fabio Estevam <festevam@gmail.com>
    Cc: Greg KH <gregkh@linuxfoundation.org>
    Cc: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
    Cc: Jun Li <jun.li@nxp.com>
    Signed-off-by: default avatarPeter Chen <peter.chen@nxp.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    94207779
udc.c 48.8 KB