diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 7d34f956ba6d..6eda84e51138 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -394,7 +394,7 @@ static struct xhci_ring *xhci_vendor_alloc_transfer_ring(struct xhci_hcd *xhci, return 0; } -static void xhci_vendor_free_transfer_ring(struct xhci_hcd *xhci, +void xhci_vendor_free_transfer_ring(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, unsigned int ep_index) { struct xhci_vendor_ops *ops = xhci_vendor_get_ops(xhci); @@ -403,7 +403,7 @@ static void xhci_vendor_free_transfer_ring(struct xhci_hcd *xhci, ops->free_transfer_ring(xhci, virt_dev, ep_index); } -static bool xhci_vendor_is_usb_offload_enabled(struct xhci_hcd *xhci, +bool xhci_vendor_is_usb_offload_enabled(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, unsigned int ep_index) { struct xhci_vendor_ops *ops = xhci_vendor_get_ops(xhci); diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 5eea3220ff25..c64ffcb77607 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -2990,7 +2990,11 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) for (i = 0; i < 31; i++) { if (virt_dev->eps[i].new_ring) { xhci_debugfs_remove_endpoint(xhci, virt_dev, i); - xhci_ring_free(xhci, virt_dev->eps[i].new_ring); + if (xhci_vendor_is_usb_offload_enabled(xhci, virt_dev, i)) + xhci_vendor_free_transfer_ring(xhci, virt_dev, i); + else + xhci_ring_free(xhci, virt_dev->eps[i].new_ring); + virt_dev->eps[i].new_ring = NULL; } } diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 58f259e9eb9e..64a658aae707 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -2257,6 +2257,10 @@ struct xhci_vendor_ops *xhci_vendor_get_ops(struct xhci_hcd *xhci); int xhci_vendor_sync_dev_ctx(struct xhci_hcd *xhci, unsigned int slot_id); bool xhci_vendor_usb_offload_skip_urb(struct xhci_hcd *xhci, struct urb *urb); +void xhci_vendor_free_transfer_ring(struct xhci_hcd *xhci, + struct xhci_virt_device *virt_dev, unsigned int ep_index); +bool xhci_vendor_is_usb_offload_enabled(struct xhci_hcd *xhci, + struct xhci_virt_device *virt_dev, unsigned int ep_index); /* * TODO: As per spec Isochronous IDT transmissions are supported. We bypass