• J
    usb: xhci: Correct last context entry calculation for Configure Endpoint · d6759133
    Julius Werner 提交于
    The current XHCI driver recalculates the Context Entries field in the
    Slot Context on every add_endpoint() and drop_endpoint() call. In the
    case of drop_endpoint(), it seems to assume that the add_flags will
    always contain every endpoint for the new configuration, which is not
    necessarily correct if you don't make assumptions about how the USB core
    uses the add_endpoint/drop_endpoint interface (add_flags only contains
    endpoints that are new additions in the new configuration).
    
    Furthermore, EP0_FLAG is not consistently set in add_flags throughout
    the lifetime of a device. This means that when all endpoints are
    dropped, the Context Entries field can be set to 0 (which is invalid and
    may cause a Parameter Error) or -1 (which is interpreted as 31 and
    causes the driver to keep using the old, incorrect value).
    
    The only surefire way to set this field right is to also take all
    existing endpoints into account, and to force the value to 1 (meaning
    only EP0 is active) if no other endpoint is found. This patch implements
    that as a single step in the final check_bandwidth() call and removes
    the intermediary calculations from add_endpoint() and drop_endpoint().
    Signed-off-by: NJulius Werner <jwerner@chromium.org>
    Signed-off-by: NMathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d6759133
xhci.c 145.5 KB