Re: CSW endpoint status returned STALL after BOT MSC Reset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 30 Oct 2013, Pratyush Anand wrote:

> I am using dwc3 driver. I my case kernel version is even a bit old
> 3.3, but dwc3 patches are almost updated. I am using g_mass_storage.
> 
> > 
> > Why don't you try running an up-to-date kernel, like 3.11, instead?  
> 
> Yaa, I am trying to upgrade my kernel to 3.12.RC5.
> 
> To me, it seems more like a mass storage layer issue rather than
> peripheral layer. I do not have any expertize of mass storage
> internals, so meanwhile I am providing few more inputs, if some expert
> from mass storage can give any advice.

I think you have found a bug in the dwc3 driver.

> Please see attached snapshot of lecroy capture for a failing and
> passing error recovery test. Transfer 10 is a BULK IN transfer, in
> which SBSU Tag, Residue and status is expected. I see that Verbatim
> usb3.0 disk passes here, while Linux g_mass_storage stalls. 
> 
> I am also providing usbcv log, if that tells something...
> 
> INFO	Start time: Wed Oct 30 11:54:06 2013	
> INFO	Configuring device, set configuration = 0x1
> INFO	NOTE: It is expected the device has reset the data toggles on all Bulk endpoints after the above SetConfiguration call
> INFO	Setting device interface, interface number = 0x0 and alternate setting = 0x0
> INFO	NOTE: It is expected the device has reset the data toggles on all Bulk endpoints after the above SetInterface call
> INFO	Issuing Get Max LUN request
> INFO	Max LUN value = 0
> INFO	Issue CBW with invalid signature

At this point, the IGNORE_BULK_OUT bit in g_mass_storage gets set:

		/*
		 * The Bulk-only spec says we MUST stall the IN endpoint
		 * (6.6.1), so it's unavoidable.  It also says we must
		 * retain this state until the next reset, but there's
		 * no way to tell the controller driver it should ignore
		 * Clear-Feature(HALT) requests.
		 *
		 * We aren't required to halt the OUT endpoint; instead
		 * we can simply accept and discard any data received
		 * until the next reset.
		 */
		wedge_bulk_in_endpoint(fsg);
		set_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags);

> INFO	Issuing invalid CBW
> INFO	CBW successful
> INFO	Issuing CSW 2 times, CSW should stall in every case
> INFO	Issuing CSW 1
> INFO	Issuing CSW 2
> INFO	Retrieving status on CSW endpoint
> INFO	CSW endpoint status = 0x1
> INFO	CSW endpoint stalled
> INFO	Clearing stalled CSW endpoint
> INFO	Issuing CSW 2 times, CSW should stall in every case
> INFO	Issuing CSW 1
> INFO	Issuing CSW 2
> INFO	Issuing CBW 2 times, CBW should either stall or return success
> INFO	Issuing CBW 1
> INFO	CBW successful
> INFO	Issuing BOT MSC Reset, reset should always succeed

At this point, because the IGNORE_BULK_OUT bit is set, g_mass_storage
issues a usb_ep_clear_halt() call for the bulk-in (CSW) endpoint.  
This tells the dwc3 driver to change the endpoint's status back to 0:

		if (test_and_clear_bit(IGNORE_BULK_OUT,
				       &common->fsg->atomic_bitflags))
			usb_ep_clear_halt(common->fsg->bulk_in);

> INFO	Retrieving status on CBW endpoint
> INFO	CBW endpoint status = 0x0
> INFO	Retrieving status on CSW endpoint
> INFO	CSW endpoint status = 0x1

But the status is still set to 1.  Clearly this is a bug in dwc3.

> ERROR	CSW endpoint status returned STALL after BOT MSC Reset
> 
> FAIL	(5.5.4) The device must support the Bulk-Only Mass Storage Reset.

Alan Stern

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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux