[U-Boot] [PATCH 03/16] usb: Remove unnecessary work in usb_setup_descriptor()
Bin Meng
bmeng.cn at gmail.com
Fri Jun 30 06:19:45 UTC 2017
Hi Lothar,
On Fri, Jun 30, 2017 at 2:15 PM, Lothar Waßmann <LW at karo-electronics.de> wrote:
> Hi,
>
> On Fri, 30 Jun 2017 11:49:56 +0800 Bin Meng wrote:
>> Hi,
>>
>> On Fri, Jun 23, 2017 at 5:54 PM, Bin Meng <bmeng.cn at gmail.com> wrote:
>> > The only work we need do in usb_setup_descriptor() is to initialize
>> > dev->descriptor.bMaxPacketSize0, when do_read is false. Other steps
>> > are the same as do_read being true.
>> >
>> > While we are here, update the comment block to be within 80 cols.
>> >
>> > Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
>> > ---
>> >
>> > common/usb.c | 40 ++++++++++++++++++----------------------
>> > 1 file changed, 18 insertions(+), 22 deletions(-)
>> >
>> > diff --git a/common/usb.c b/common/usb.c
>> > index 15e1e4c..293d968 100644
>> > --- a/common/usb.c
>> > +++ b/common/usb.c
>> > @@ -962,37 +962,33 @@ static int usb_setup_descriptor(struct usb_device *dev, bool do_read)
>> > * some more, or keeps on retransmitting the 8 byte header.
>> > */
>> >
>> > - if (dev->speed == USB_SPEED_LOW) {
>> > - dev->descriptor.bMaxPacketSize0 = 8;
>> > - dev->maxpacketsize = PACKET_SIZE_8;
>> > - } else {
>> > - dev->descriptor.bMaxPacketSize0 = 64;
>> > - dev->maxpacketsize = PACKET_SIZE_64;
>> > - }
>> > - dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
>> > - dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
>> > -
>> > if (do_read) {
>> > int err;
>> >
>> > /*
>> > - * Validate we've received only at least 8 bytes, not that we've
>> > - * received the entire descriptor. The reasoning is:
>> > - * - The code only uses fields in the first 8 bytes, so that's all we
>> > - * need to have fetched at this stage.
>> > - * - The smallest maxpacket size is 8 bytes. Before we know the actual
>> > - * maxpacket the device uses, the USB controller may only accept a
>> > - * single packet. Consequently we are only guaranteed to receive 1
>> > - * packet (at least 8 bytes) even in a non-error case.
>> > + * Validate we've received only at least 8 bytes, not that
>> > + * we've received the entire descriptor. The reasoning is:
>> > + * - The code only uses fields in the first 8 bytes, so that's
>> > + * all we need to have fetched at this stage.
>> > + * - The smallest maxpacket size is 8 bytes. Before we know
>> > + * the actual maxpacket the device uses, the USB controller
>> > + * may only accept a single packet. Consequently we are only
>> > + * guaranteed to receive 1 packet (at least 8 bytes) even in
>> > + * a non-error case.
>> > *
>> > - * At least the DWC2 controller needs to be programmed with the number
>> > - * of packets in addition to the number of bytes. A request for 64
>> > - * bytes of data with the maxpacket guessed as 64 (above) yields a
>> > - * request for 1 packet.
>> > + * At least the DWC2 controller needs to be programmed with
>> > + * the number of packets in addition to the number of bytes.
>> > + * A request for 64 bytes of data with the maxpacket guessed
>> > + * as 64 (above) yields a request for 1 packet.
>> > */
>> > err = get_descriptor_len(dev, 64, 8);
>> > if (err)
>> > return err;
>> > + } else {
>> > + if (dev->speed == USB_SPEED_LOW)
>> > + dev->descriptor.bMaxPacketSize0 = 8;
>> > + else
>> > + dev->descriptor.bMaxPacketSize0 = 64;
>> > }
>> >
>> > dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
>> > --
>>
>> For some reason that I don't understand, this patch breaks EHCI.
>> dev->maxpacketsize is equal to zero with this patch, which leads to a
>> 'divide error' exception in ehci_submit_async(). Not sure if anyone
>> has some hints?
>>
> In the do_read case the dev->descriptor.bMaxPacketSize0 is not set up.
>
In that case, dev->descriptor.bMaxPacketSize0 was read from device. Am
I missing anything?
Regards,
Bin
More information about the U-Boot
mailing list