• Tejas Joglekar's avatar
    usb: xhci: Use temporary buffer to consolidate SG · 2017a1e5
    Tejas Joglekar authored
    The Synopsys xHC has an internal TRB cache of size TRB_CACHE_SIZE for
    each endpoint. The default value for TRB_CACHE_SIZE is 16 for SS and 8
    for HS. The controller loads and updates the TRB cache from the transfer
    ring in system memory whenever the driver issues a start transfer or
    update transfer command.
    
    For chained TRBs, the Synopsys xHC requires that the total amount of
    bytes for all TRBs loaded in the TRB cache be greater than or equal to 1
    MPS. Or the chain ends within the TRB cache (with a last TRB).
    
    If this requirement is not met, the controller will not be able to send
    or receive a packet and it will hang causing a driver timeout and error.
    
    This can be a problem if a class driver queues SG requests with many
    small-buffer entries. The XHCI driver will create a chained TRB for each
    entry which may trigger this issue.
    
    This patch adds logic to the XHCI driver to detect and prevent this from
    happening.
    
    For every (TRB_CACHE_SIZE - 2), we check the total buffer size of
    the SG list and if the last window of (TRB_CACHE_SIZE - 2) SG list length
    and we don't make up at least 1 MPS, we create a temporary buffer to
    consolidate full SG list into the buffer.
    
    We check at (TRB_CACHE_SIZE - 2) window because it is possible that there
    would be a link and/or event data TRB that take up to 2 of the cache
    entries.
    
    We discovered this issue with devices on other platforms but have not
    yet come across any device that triggers this on Linux. But it could be
    a real problem now or in the future. All it takes is N number of small
    chained TRBs. And other instances of the Synopsys IP may have smaller
    values for the TRB_CACHE_SIZE which would exacerbate the problem.
    Signed-off-by: default avatarTejas Joglekar <joglekar@synopsys.com>
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20201208092912.1773650-3-mathias.nyman@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2017a1e5
xhci.c 162 KB