Hi Lothar, On Fri, Jun 30, 2017 at 2:15 PM, Lothar Waßmann <l...@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...@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. >
In that case, dev->descriptor.bMaxPacketSize0 was read from device. Am I missing anything? Regards, Bin _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot