All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lukasz Majewski <l.majewski@majess.pl>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/3] fastboot: Clean up bulk-out logic
Date: Fri, 22 Apr 2016 05:52:27 +0200	[thread overview]
Message-ID: <20160422055227.00e14594@jawa> (raw)
In-Reply-To: <CAM7GXokYsA-LqNHS+Ng33iUu=_0HboT5NcZ69eFrrLLXpEXp_g@mail.gmail.com>

On Thu, 21 Apr 2016 19:59:21 -0700
Steve Rae <steve.rae@broadcom.com> wrote:

> On Thu, Apr 21, 2016 at 3:03 AM, Lukasz Majewski
> <l.majewski@samsung.com> wrote:
> 
> > Hi Roger,
> >
> > > Just use ep->maxpacket to get the maxpacket size
> > > and simplify the bulk-out maxpacket alignment.
> > >
> > > Signed-off-by: Roger Quadros <rogerq@ti.com>
> > > Tested-by: Steve Rae <srae@broadcom.com>
> > > ---
> > >  drivers/usb/gadget/f_fastboot.c | 50
> > > +++++++++++++++++++---------------------- 1 file changed, 23
> > > insertions(+), 27 deletions(-)
> > >
> > > diff --git a/drivers/usb/gadget/f_fastboot.c
> > > b/drivers/usb/gadget/f_fastboot.c index 7961231..28b244a 100644
> > > --- a/drivers/usb/gadget/f_fastboot.c
> > > +++ b/drivers/usb/gadget/f_fastboot.c
> > > @@ -39,6 +39,11 @@
> > >  #define TX_ENDPOINT_MAXIMUM_PACKET_SIZE      (0x0040)
> > >
> > >  #define EP_BUFFER_SIZE                       4096
> > > +/*
> > > + * EP_BUFFER_SIZE must always be an integral multiple of
> > > maxpacket size
> > > + * (64 or 512 or 1024), else we break on certain controllers like
> > > DWC3
> > > + * that expect bulk OUT requests to be divisible by maxpacket
> > > size.
> > > + */
> > >
> > >  struct f_fastboot {
> > >       struct usb_function usb_function;
> > > @@ -57,7 +62,6 @@ static struct f_fastboot *fastboot_func;
> > >  static unsigned int fastboot_flash_session_id;
> > >  static unsigned int download_size;
> > >  static unsigned int download_bytes;
> > > -static bool is_high_speed;
> > >
> > >  static struct usb_endpoint_descriptor fs_ep_in = {
> > >       .bLength            = USB_DT_ENDPOINT_SIZE,
> > > @@ -269,11 +273,6 @@ static int fastboot_set_alt(struct
> > > usb_function *f, debug("%s: func: %s intf: %d alt: %d\n",
> > >             __func__, f->name, interface, alt);
> > >
> > > -     if (gadget->speed == USB_SPEED_HIGH)
> > > -             is_high_speed = true;
> > > -     else
> > > -             is_high_speed = false;
> > > -
> > >       d = fb_ep_desc(gadget, &fs_ep_out, &hs_ep_out);
> > >       ret = usb_ep_enable(f_fb->out_ep, d);
> > >       if (ret) {
> > > @@ -455,20 +454,27 @@ static void cb_getvar(struct usb_ep *ep,
> > > struct usb_request *req) fastboot_tx_write_str(response);
> > >  }
> > >
> > > -static unsigned int rx_bytes_expected(unsigned int maxpacket)
> > > +static unsigned int rx_bytes_expected(struct usb_ep *ep)
> > >  {
> > >       int rx_remain = download_size - download_bytes;
> > > -     int rem = 0;
> > > -     if (rx_remain < 0)
> > > +     unsigned int rem;
> > > +     unsigned int maxpacket = ep->maxpacket;
> > > +
> > > +     if (rx_remain <= 0)
> > >               return 0;
> > > -     if (rx_remain > EP_BUFFER_SIZE)
> > > +     else if (rx_remain > EP_BUFFER_SIZE)
> > >               return EP_BUFFER_SIZE;
> > > -     if (rx_remain < maxpacket) {
> > > -             rx_remain = maxpacket;
> > > -     } else if (rx_remain % maxpacket != 0) {
> > > -             rem = rx_remain % maxpacket;
> > > +
> > > +     /*
> > > +      * Some controllers e.g. DWC3 don't like OUT transfers to be
> > > +      * not ending in maxpacket boundary. So just make them happy
> > > by
> > > +      * always requesting for integral multiple of maxpackets.
> > > +      * This shouldn't bother controllers that don't care about
> > > it.
> > > +      */
> > > +     rem = rx_remain % maxpacket;
> > > +     if (rem > 0)
> > >               rx_remain = rx_remain + (maxpacket - rem);
> > > -     }
> > > +
> > >       return rx_remain;
> > >  }
> > >
> > > @@ -480,7 +486,6 @@ static void rx_handler_dl_image(struct usb_ep
> > > *ep, struct usb_request *req) const unsigned char *buffer =
> > > req->buf; unsigned int buffer_size = req->actual;
> > >       unsigned int pre_dot_num, now_dot_num;
> > > -     unsigned int max;
> > >
> > >       if (req->status != 0) {
> > >               printf("Bad status: %d\n", req->status);
> > > @@ -518,11 +523,7 @@ static void rx_handler_dl_image(struct usb_ep
> > > *ep, struct usb_request *req)
> > >               printf("\ndownloading of %d bytes finished\n",
> > > download_bytes); } else {
> > > -             max = is_high_speed ? hs_ep_out.wMaxPacketSize :
> > > -                             fs_ep_out.wMaxPacketSize;
> > > -             req->length = rx_bytes_expected(max);
> > > -             if (req->length < ep->maxpacket)
> > > -                     req->length = ep->maxpacket;
> > > +             req->length = rx_bytes_expected(ep);
> > >       }
> > >
> > >       req->actual = 0;
> > > @@ -533,7 +534,6 @@ static void cb_download(struct usb_ep *ep,
> > > struct usb_request *req) {
> > >       char *cmd = req->buf;
> > >       char response[FASTBOOT_RESPONSE_LEN];
> > > -     unsigned int max;
> > >
> > >       strsep(&cmd, ":");
> > >       download_size = simple_strtoul(cmd, NULL, 16);
> > > @@ -549,11 +549,7 @@ static void cb_download(struct usb_ep *ep,
> > > struct usb_request *req) } else {
> > >               sprintf(response, "DATA%08x", download_size);
> > >               req->complete = rx_handler_dl_image;
> > > -             max = is_high_speed ? hs_ep_out.wMaxPacketSize :
> > > -                     fs_ep_out.wMaxPacketSize;
> > > -             req->length = rx_bytes_expected(max);
> > > -             if (req->length < ep->maxpacket)
> > > -                     req->length = ep->maxpacket;
> > > +             req->length = rx_bytes_expected(ep);
> > >       }
> > >       fastboot_tx_write_str(response);
> > >  }
> >
> > I cannot apply this patch on temporary u-boot-usb/master branch
> > (SHA1: e6c0bc0643e5a4387fecbcf83080d0b796eb067c).
> >
> > Could you apply your changes (from this patch) on top of newest
> > u-boot-usb repo?
> >
> > Lukasz, (in case Roger doesn't reply soon....)
> -- this needs to be applied on top of his earlier patches:
> (1) http://patchwork.ozlabs.org/patch/609417/
>         [U-Boot,1/2] fastboot: Fix wMaxPacketSize for High-Speed IN
> endpoint (2) http://patchwork.ozlabs.org/patch/609896/
>         [U-Boot,v2,2/2] fastboot: Enable the respective speed
> endpoints at runtime
> 
> ... then this one will apply
> (http://patchwork.ozlabs.org/patch/612006/)

Steve, thanks for tip. I was missing this information :-)

Best regards,
?ukasz

> 
> Thanks, Steve
> 
> --
> > Best regards,
> >
> > Lukasz Majewski
> >
> > Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
> >
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160422/fc936c89/attachment.sig>

  reply	other threads:[~2016-04-22  3:52 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-19  7:16 [U-Boot] [PATCH 0/3] s3c-otg: fastboot: fixes and cleanup Roger Quadros
2016-04-19  7:16 ` [U-Boot] [PATCH 1/3] fastboot: Clean up bulk-out logic Roger Quadros
2016-04-19  9:00   ` Lukasz Majewski
2016-04-21 10:03   ` Lukasz Majewski
2016-04-22  2:59     ` Steve Rae
2016-04-22  3:52       ` Lukasz Majewski [this message]
2016-04-19  7:17 ` [U-Boot] [PATCH 2/3] usb: s3c-otg: Fix short packet for request size > ep.maxpacket Roger Quadros
2016-04-19  9:02   ` Lukasz Majewski
2016-04-19 10:21     ` Roger Quadros
2016-04-19 11:25       ` Lukasz Majewski
2016-04-19 11:52         ` Roger Quadros
2016-04-19 12:20   ` [U-Boot] [PATCH v2 " Roger Quadros
2016-04-21 10:04     ` Lukasz Majewski
2016-04-19  7:17 ` [U-Boot] [PATCH 3/3] usb: s3c-otg: Fix remaining bytes in debug messages Roger Quadros
2016-04-21 10:05   ` Lukasz Majewski
2016-04-22  2:49     ` Steve Rae
2016-04-22  3:03       ` Steve Rae

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160422055227.00e14594@jawa \
    --to=l.majewski@majess.pl \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.