• Felipe Balbi's avatar
    usb: host: xhci: handle COMP_STOP from SETUP phase too · 29fc1aa4
    Felipe Balbi authored
    Stop Endpoint command can come at any point and we
    have no control of that. We should make sure to
    handle COMP_STOP on SETUP phase as well, otherwise
    urb->actual_length might be set to negative values
    in some occasions such as below:
    
     urb->length = 4;
     build_control_transfer_td_for(urb, ep);
    
     					stop_endpoint(ep);
    
    COMP_STOP:
    	[...]
    	urb->actual_length = urb->length - trb->length;
    
    trb->length is 8 for SETUP stage (8 control request
    bytes), so actual_length would be set to -4 in this
    case.
    
    While doing that, also make sure to use TRB_TYPE
    field of the actual TRB instead of matching pointers
    to figure out in which stage of the control transfer
    we got our completion event.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    29fc1aa4
xhci-ring.c 122 KB