[U-Boot] [PATCH] usb: gadget: ci_udc: fix suspend/resume of USB Mass Storage
John Tobias
john.tobias.ph at gmail.com
Wed Aug 24 07:25:44 CEST 2016
Hi Marek,
On Tue, Aug 23, 2016 at 8:29 PM, Marek Vasut <marex at denx.de> wrote:
> On 08/24/2016 03:30 AM, John Tobias wrote:
>> Hi Marek,
>
> Hi,
>
>> On Tue, Aug 23, 2016 at 5:18 PM, Marek Vasut <marex at denx.de> wrote:
>>> On 08/24/2016 12:49 AM, Fabio Estevam wrote:
>>>> Adding Marek on Cc
>>>
>>> Thanks
>>>
>>>> On Mon, Aug 22, 2016 at 4:38 PM, John Tobias <john.tobias.ph at gmail.com> wrote:
>>>>> When the host machine went to suspend mode and then wake it up, it send
>>>>> a USB_REQ_GET_STATUS.
>>>
>>> Can you expand on this ? It is not clear what the conditions to
>>> replicate this are. Please do so in detail.
>>
>>
>> For MacOS Yosemite:
>>
>> Connect your board into your host machine and run UMS. Once, the icon
>> pop-up on your host machine (MacOS), put it in sleep mode (by clicking
>> sleep in the menu under apple icon on the upper left corner of the
>> screen). Then, once, you're sure that the host machine is in sleep
>> mode, just wake it up.
>>
>> 1.0 If you load the uboot without the said patch, you should see a
>> message "Disk Not Ejected Properly", the icon disappeared and the
>> drive is no longer available.
>> 1.1 If you load the uboot with the said patch, you should be able
>> to access the drive after the host woke-up.
>>
>> For Windows (I've only tested in Windows 7):
>> Similar procedures, after the icon pop-up on the screen, put the host
>> machine in sleep mode (by clicking sleep under "Shut down" menu). The
>> behavior should similar to 1.0 and 1.1.
>
> OK, I see, now it's clearer . This really should be in the commit message.
I'll resend v2 to include it.
>
>> Btw, if you are testing it in Windows, connect your device directly
>> into the USB port of your host machine, not in the HUB.
>
> I think I'll have to trust you on all this.
>
> Do you know which usb request arrives which throws the code off ?
USB_REQ_GET_STATUS.
I tried to following combinations below but, the return
SETUP(r.bRequestType, r.bRequest) doesn't match at all.
SETUP(USB_DIR_IN | USB_RECIP_DEVICE, USB_REQ_GET_STATUS)
SETUP(USB_RECIP_DEVICE, USB_REQ_GET_STATUS)
SETUP(USB_DIR_IN, USB_REQ_GET_STATUS)
> I don't think it's correct to remove the bRequestType checking altogether.
Looking at the fsl_udc_core.c
http://lxr.free-electrons.com/source/drivers/usb/gadget/udc/fsl_udc_core.c#L1405
looks identical.
>
> Thanks
>
>>>>> The existing case condition below, never
>>>>> become true and it causes the host machine to reset the connection. Once,
>>>>> it reset you will see an error "Disk Not Ejected Properly".
>>>>>
>>>>> case SETUP(USB_DIR_IN | USB_RECIP_DEVICE, USB_REQ_GET_STATUS):
>>>>>
>>>>> By applying this patch, the device could respond to the USB_REQ_GET_STATUS
>>>>> command correctly.
>>>>> ---
>>>>> drivers/usb/gadget/ci_udc.c | 8 ++++----
>>>>> 1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>
>>>>> diff --git a/drivers/usb/gadget/ci_udc.c b/drivers/usb/gadget/ci_udc.c
>>>>> index d36bcf6..fdec613 100644
>>>>> --- a/drivers/usb/gadget/ci_udc.c
>>>>> +++ b/drivers/usb/gadget/ci_udc.c
>>>>> @@ -703,8 +703,8 @@ static void handle_setup(void)
>>>>> list_del_init(&ci_req->queue);
>>>>> ci_ep->req_primed = false;
>>>>>
>>>>> - switch (SETUP(r.bRequestType, r.bRequest)) {
>>>>> - case SETUP(USB_RECIP_ENDPOINT, USB_REQ_CLEAR_FEATURE):
>>>>> + switch (r.bRequest) {
>>>>> + case USB_REQ_CLEAR_FEATURE:
>>>>> _num = r.wIndex & 15;
>>>>> _in = !!(r.wIndex & 0x80);
>>>>>
>>>>> @@ -729,7 +729,7 @@ static void handle_setup(void)
>>>>> }
>>>>> return;
>>>>>
>>>>> - case SETUP(USB_RECIP_DEVICE, USB_REQ_SET_ADDRESS):
>>>>> + case USB_REQ_SET_ADDRESS:
>>>>> /*
>>>>> * write address delayed (will take effect
>>>>> * after the next IN txn)
>>>>> @@ -739,7 +739,7 @@ static void handle_setup(void)
>>>>> usb_ep_queue(controller.gadget.ep0, req, 0);
>>>>> return;
>>>>>
>>>>> - case SETUP(USB_DIR_IN | USB_RECIP_DEVICE, USB_REQ_GET_STATUS):
>>>>> + case USB_REQ_GET_STATUS:
>>>>> req->length = 2;
>>>>> buf = (char *)req->buf;
>>>>> buf[0] = 1 << USB_DEVICE_SELF_POWERED;
>>>>> --
>>>>> 2.9.3
>>>>>
>>>
>>>
>>> --
>>> Best regards,
>>> Marek Vasut
>>
>> Regards,
>>
>> John Tobias
>>
>
>
> --
> Best regards,
> Marek Vasut
Regards,
John Tobias
More information about the U-Boot
mailing list