xhci: xhci_handle_cmd_stop_ep might give back urb incorrectly

2014-11-24 Thread Lu, Baolu

Hi Mathias, Alan and all,

During xhci handling a completion event for stop endpoint command , 
xhci_handle_cmd_stop_ep() always gives back a urb with status set to 0.


The comment says,

/* Doesn't matter what we pass for status, since the 
core will

 * just overwrite it (because the URB has been unlinked).
 */

I don't think this assumption is always correct. Stop endpoint command 
is used in below two cases in xhci driver.


1. In xhci_urb_dequeue(). This is the hcd driver interface for canceling 
a transfer.
2. During suspend process. This is to stop on-going transfers and cause 
xHC to save various endpoint state into memory.


The assumption of URB has been unlinked is only the fact for case 1. 
It's wrong in case 2. If my understanding is right, USB client drivers 
(serial, mass storage ) might receive an incompletion urb transfer 
with status set to success during suspend/resume.


Please correct me if there is any misunderstanding.

[below is the code segment in xhci_handle_cmd_stop_ep()]
/*
 * Drop the lock and complete the URBs in the cancelled TD list.
 * New TDs to be cancelled might be added to the end of the 
list before

 * we can complete all the URBs for the TDs we already unlinked.
 * So stop when we've completed the URB for the last TD we 
unlinked.

 */
do {
cur_td = list_entry(ep-cancelled_td_list.next,
struct xhci_td, cancelled_td_list);
list_del_init(cur_td-cancelled_td_list);

/* Clean up the cancelled URB */
/* Doesn't matter what we pass for status, since the 
core will

 * just overwrite it (because the URB has been unlinked).
 */
xhci_giveback_urb_in_irq(xhci, cur_td, 0);

/* Stop processing the cancelled list if the watchdog 
timer is

 * running.
 */
if (xhci-xhc_state  XHCI_STATE_DYING)
return;
} while (cur_td != last_unlinked_td);
[end of code segment]

Beset Regards,
Lu Baolu
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: xhci: xhci_handle_cmd_stop_ep might give back urb incorrectly

2014-11-24 Thread Alan Stern
On Mon, 24 Nov 2014, Lu, Baolu wrote:

 Hi Mathias, Alan and all,
 
 During xhci handling a completion event for stop endpoint command , 
 xhci_handle_cmd_stop_ep() always gives back a urb with status set to 0.
 
 The comment says,
 
  /* Doesn't matter what we pass for status, since the 
 core will
   * just overwrite it (because the URB has been unlinked).
   */
 
 I don't think this assumption is always correct. Stop endpoint command 
 is used in below two cases in xhci driver.
 
 1. In xhci_urb_dequeue(). This is the hcd driver interface for canceling 
 a transfer.
 2. During suspend process. This is to stop on-going transfers and cause 
 xHC to save various endpoint state into memory.
 
 The assumption of URB has been unlinked is only the fact for case 1. 
 It's wrong in case 2. If my understanding is right, USB client drivers 
 (serial, mass storage ) might receive an incompletion urb transfer 
 with status set to success during suspend/resume.
 
 Please correct me if there is any misunderstanding.

When a suspend is about to occur, usbcore makes sure there are no
outstanding URBs for the device.  It tells the device's driver to go
into suspend, unlinks any remaining URBs, and prevents new ones from
being submitted.

Alan Stern

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: xhci: xhci_handle_cmd_stop_ep might give back urb incorrectly

2014-11-24 Thread Lu, Baolu


On 2014年11月24日 23:33, Alan Stern wrote:

On Mon, 24 Nov 2014, Lu, Baolu wrote:


Hi Mathias, Alan and all,

During xhci handling a completion event for stop endpoint command ,
xhci_handle_cmd_stop_ep() always gives back a urb with status set to 0.

The comment says,

  /* Doesn't matter what we pass for status, since the
core will
   * just overwrite it (because the URB has been unlinked).
   */

I don't think this assumption is always correct. Stop endpoint command
is used in below two cases in xhci driver.

1. In xhci_urb_dequeue(). This is the hcd driver interface for canceling
a transfer.
2. During suspend process. This is to stop on-going transfers and cause
xHC to save various endpoint state into memory.

The assumption of URB has been unlinked is only the fact for case 1.
It's wrong in case 2. If my understanding is right, USB client drivers
(serial, mass storage ) might receive an incompletion urb transfer
with status set to success during suspend/resume.

Please correct me if there is any misunderstanding.

When a suspend is about to occur, usbcore makes sure there are no
outstanding URBs for the device.  It tells the device's driver to go
into suspend, unlinks any remaining URBs, and prevents new ones from
being submitted.

That's clear now. Thank you, Alan.



Alan Stern



--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html