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...@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...@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.
Lothar Waßmann _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot