Re: [PATCH] USB Core hub.c

"Pandita, Vikram" <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
>From: Alan Stern [mailto:[email protected]]
>On Mon, 21 May 2007, David Brownell wrote:
>> On Monday 21 May 2007, Vikram Pandita wrote:
>> > ---
>> > diff -purN -X ./dontdiff a/drivers/usb/core/hub.c
>> > b/drivers/usb/core/hub.c
>> > --- a/drivers/usb/core/hub.c    2007-05-13 14:24:43.000000000 +0530
>> > +++ b/drivers/usb/core/hub.c    2007-05-21 13:19:07.000000000 +0530
>> > @@ -2571,7 +2571,7 @@ loop:
>> >                 ep0_reinit(udev);
>> >                 release_address(udev);
>> >                 usb_put_dev(udev);
>> > -               if (status == -ENOTCONN)
>> > +               if ((status == -ENOTCONN) || (status == -ENODEV))
>> >                         break;
>> >         }
>
>This is wrong.  -ENOTCONN means what it says, that nothing is connected
>to the port.  So when it occurs we really do want to break out of the
>loop.
>
>On the other hand, -ENODEV means that there is a device but it doesn't
>match our preconceptions (maybe its speed has somehow changed or some
>other aspect is different).  Since there still is a device connected to
>the port, we don't want to break out of the loop.
>
>Did you notice any particular example where the port was unconnected
>and the code still tried to enumerate three times?

Yes. This is to fix the OTG HNP case. 

In OTG enabled environment when the b-device attached is not supported
by host (is_targeted() returns Zero), the host suspends to give chance
to device to become b-host. If this fix is not in place, then the host
tries to enumerate the attached device SET_CONFIG_TRIES times which is
not required.

Following is the snippet of the code already in place that does the HNP
and returns the error code to stop re-enumerations and the proposed
patch checks for this error code:

        if (!is_targeted(udev)) {

                /* Maybe it can talk to us, though we can't talk to it.
                 * (Includes HNP test device.)
                 */
                if (udev->bus->b_hnp_enable || udev->bus->is_b_host) {
                        err = __usb_port_suspend(udev,
udev->bus->otg_port);
                        if (err < 0)
                                dev_dbg(&udev->dev, "HNP fail, %d\n",
err);
                }
                err = -ENODEV;
                goto fail;
        }
>
Vikram Pandita


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.