Hi Michal, On 11/03/16 23:07, Michal Nazarewicz wrote: > On Wed, Mar 09 2016, Felipe F. Tonello wrote: >> buflen by default (256) is smaller than wMaxPacketSize (512) in high-speed >> devices. >> >> That caused the OUT endpoint to freeze if the host send any data packet of >> length greater than 256 bytes. >> >> This is an example dump of what happended on that enpoint: >> HOST: [DATA][Length=260][...] >> DEVICE: [NAK] >> HOST: [PING] >> DEVICE: [NAK] >> HOST: [PING] >> DEVICE: [NAK] >> ... >> HOST: [PING] >> DEVICE: [NAK] >> >> This patch fixes this problem by setting the minimum usb_request's buffer size >> for the OUT endpoint as its wMaxPacketSize. >> >> Signed-off-by: Felipe F. Tonello <eu@xxxxxxxxxxxxxxxxx> > > Acked-by: Michal Nazarewicz <mina86@xxxxxxxxxx> > > But see comment below: > >> --- >> drivers/usb/gadget/function/f_midi.c | 4 +++- >> 1 file changed, 3 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c >> index 8475e3dc82d4..826ba641f29d 100644 >> --- a/drivers/usb/gadget/function/f_midi.c >> +++ b/drivers/usb/gadget/function/f_midi.c >> @@ -366,7 +366,9 @@ static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt) >> /* allocate a bunch of read buffers and queue them all at once. */ >> for (i = 0; i < midi->qlen && err == 0; i++) { >> struct usb_request *req = >> - midi_alloc_ep_req(midi->out_ep, midi->buflen); >> + midi_alloc_ep_req(midi->out_ep, >> + max_t(unsigned, midi->buflen, >> + bulk_out_desc.wMaxPacketSize)); > > Or, just: > > + midi_alloc_ep_req(midi->out_ep, > + bulk_out_desc.wMaxPacketSize); > > Packet cannot be greater than wMaxPacketSize so there is no need to > allocate more (if buflen > wMaxPacketSize). I didn't know that was a constraint. If so, I agree with you. > >> if (req == NULL) >> return -ENOMEM; >> > > I’m also wondering whether it would be beneficial to get rid of buflen > all together and use wMaxPacketSie for in endpoints as well? Is that > feasible? Yes, we could just remove the buflen parameter. The only scenario where I can see buflen been "useful" is if the user wants to have a smaller buffer size for the OUT endpoint. Should we support this case or not? I can rework this patch for any case we agree on. -- Felipe
Attachment:
0x92698E6A.asc
Description: application/pgp-keys