[U-Boot] [PATCH] usb: gadget: ci_udc: fix suspend/resume of USB Mass Storage

Marek Vasut marex at denx.de
Wed Aug 24 05:29:04 CEST 2016


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.

> 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 ?
I don't think it's correct to remove the bRequestType checking altogether.

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


More information about the U-Boot mailing list