usb: xhci-ring: USB SSD may fail to unmount if disconnect during data transferring.
Subsystems (2)
PATCH 1/1 usb: xhci-ring: USB SSD may fail to unmount if disconnect during data transferring.
From: Tao Wang <[email protected]>
it stuck in usb_kill_urb() due to urb use_count will not become zero, this means urb giveback is not happen.
in xhci_handle_cmd_set_deq() will giveback urb if td's cancel_status equal to TD_CLEARING_CACHE,
but in xhci_invalidate_cancelled_tds(), only last canceled td's cancel_status change to TD_CLEARING_CACHE,
thus giveback only happen to last urb.
this change set all cancelled_td's cancel_status to TD_CLEARING_CACHE rather than the last one, so all urb can giveback.
--- drivers/usb/host/xhci-ring.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/usb/host/xhci-ring.c +12 -12
@@ -960,19 +960,19 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)td_to_noop (xhci, ring, td, false); td->cancel_status =TD_CLEARED ; } - } -if (cached_td) { - cached_td->cancel_status =TD_CLEARING_CACHE ; - - err =xhci_move_dequeue_past_td (xhci, slot_id, ep->ep_index, - cached_td->urb->stream_id, - cached_td); -/* Failed to move past cached td, try just setting it noop */ -if (err) { -td_to_noop (xhci, ring, cached_td, false); - cached_td->cancel_status =TD_CLEARED ; +if (cached_td) { + cached_td->cancel_status =TD_CLEARING_CACHE ; + + err =xhci_move_dequeue_past_td (xhci, slot_id, ep->ep_index, + cached_td->urb->stream_id, + cached_td); +/* Failed to move past cached td, try just setting it noop */ +if (err) { +td_to_noop (xhci, ring, cached_td, false); + cached_td->cancel_status =TD_CLEARED ; + } + cached_td =NULL ; } - cached_td =NULL ; }return 0 ; }
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Hi usb teams,
I have a patch about xhci-ring, can you help me to check?
you can contact me if you have any question.
Quoted 55 lines · Tao Wang
From: Tao Wang <[email protected]>
it stuck in
usb_kill_urb()due to urbuse_countwill not become zero, this means urb giveback is not happen.
inxhci_handle_cmd_set_deq()will giveback urb if td'scancel_statusequal toTD_CLEARING_CACHE,
but inxhci_invalidate_cancelled_tds(), only last canceled td'scancel_statuschange toTD_CLEARING_CACHE,
thus giveback only happen to last urb.this change set all cancelled_td's
cancel_statustoTD_CLEARING_CACHErather than the last one, so all urb can giveback.Signed-off-by Tao Wang <[email protected]>--- drivers/usb/host/xhci-ring.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)drivers/usb/host/xhci-ring.c +12
-12@@ -960,19 +960,19 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)td_to_noop (xhci ,ring ,td ,false ); td->cancel_status =TD_CLEARED ; } - } -if (cached_td) { - cached_td->cancel_status =TD_CLEARING_CACHE ; - - err =xhci_move_dequeue_past_td (xhci, slot_id, ep->ep_index, - cached_td->urb->stream_id, - cached_td); -/* Failed to move past cached td, try just setting it noop */ -if (err) { -td_to_noop (xhci, ring, cached_td, false); - cached_td->cancel_status =TD_CLEARED ; +if (cached_td) { + cached_td->cancel_status =TD_CLEARING_CACHE ; + + err =xhci_move_dequeue_past_td (xhci, slot_id, ep->ep_index, + cached_td->urb->stream_id, + cached_td); +/* Failed to move past cached td, try just setting it noop */ +if (err) { +td_to_noop (xhci, ring, cached_td, false); + cached_td->cancel_status =TD_CLEARED ; + } + cached_td =NULL ; } - cached_td =NULL ; }return 0 ;}
sorry, This email is invalid because some reason, I will submit another email for it.
Quoted 63 lines · On 2021-08-13 09:44, [email protected] wrote:
Hi usb teams,
I have a patch about xhci-ring, can you help me to check?
you can contact me if you have any question.
Quoted 55 lines · Tao Wang
From: Tao Wang <[email protected]>
it stuck in
usb_kill_urb()due to urbuse_countwill not become zero, this means urb giveback is not happen.
inxhci_handle_cmd_set_deq()will giveback urb if td'scancel_statusequal toTD_CLEARING_CACHE,
but inxhci_invalidate_cancelled_tds(), only last canceled td'scancel_statuschange toTD_CLEARING_CACHE,
thus giveback only happen to last urb.this change set all cancelled_td's
cancel_statustoTD_CLEARING_CACHErather than the last one, so all urb can giveback.Signed-off-by Tao Wang <[email protected]>--- drivers/usb/host/xhci-ring.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)drivers/usb/host/xhci-ring.c +12
-12@@ -960,19 +960,19 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)td_to_noop (xhci ,ring ,td ,false ); td->cancel_status =TD_CLEARED ; } - } -if (cached_td) { - cached_td->cancel_status =TD_CLEARING_CACHE ; - - err =xhci_move_dequeue_past_td (xhci, slot_id, ep->ep_index, - cached_td->urb->stream_id, - cached_td); -/* Failed to move past cached td, try just setting it noop */ -if (err) { -td_to_noop (xhci, ring, cached_td, false); - cached_td->cancel_status =TD_CLEARED ; +if (cached_td) { + cached_td->cancel_status =TD_CLEARING_CACHE ; + + err =xhci_move_dequeue_past_td (xhci, slot_id, ep->ep_index, + cached_td->urb->stream_id, + cached_td); +/* Failed to move past cached td, try just setting it noop */ +if (err) { +td_to_noop (xhci, ring, cached_td, false); + cached_td->cancel_status =TD_CLEARED ; + } + cached_td =NULL ; } - cached_td =NULL ; }return 0 ;}