* [PATCH v2 0/2] fix trb handling for high speed isoc transfers @ 2022-07-04 14:18 Michael Grzeschik 2022-07-04 14:18 ` [PATCH v2 1/2] usb: dwc3: gadget: refactor dwc3_repare_one_trb Michael Grzeschik 2022-07-04 14:18 ` [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting Michael Grzeschik 0 siblings, 2 replies; 7+ messages in thread From: Michael Grzeschik @ 2022-07-04 14:18 UTC (permalink / raw) To: linux-usb; +Cc: balbi, gregkh, kernel Michael Grzeschik (2): usb: dwc3: gadget: refactor dwc3_repare_one_trb usb: dwc3: gadget: fix high speed multiplier setting drivers/usb/dwc3/gadget.c | 92 +++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 52 deletions(-) -- 2.30.2 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/2] usb: dwc3: gadget: refactor dwc3_repare_one_trb 2022-07-04 14:18 [PATCH v2 0/2] fix trb handling for high speed isoc transfers Michael Grzeschik @ 2022-07-04 14:18 ` Michael Grzeschik 2022-07-08 12:45 ` Greg KH 2022-07-04 14:18 ` [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting Michael Grzeschik 1 sibling, 1 reply; 7+ messages in thread From: Michael Grzeschik @ 2022-07-04 14:18 UTC (permalink / raw) To: linux-usb; +Cc: balbi, gregkh, kernel The function __dwc3_prepare_one_trb has many parameters. Since it is only used in dwc3_prepare_one_trb there is no point in keeping the function. We merge both functions and get rid of the big list of parameters. Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> --- v1 -> v2: - new patch drivers/usb/dwc3/gadget.c | 92 +++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 52 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a944c7a6c83a28..dcd8fc209ccd6a 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1183,17 +1183,49 @@ static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep) return trbs_left; } -static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb, - dma_addr_t dma, unsigned int length, unsigned int chain, - unsigned int node, unsigned int stream_id, - unsigned int short_not_ok, unsigned int no_interrupt, - unsigned int is_last, bool must_interrupt) +/** + * dwc3_prepare_one_trb - setup one TRB from one request + * @dep: endpoint for which this request is prepared + * @req: dwc3_request pointer + * @trb_length: buffer size of the TRB + * @chain: should this TRB be chained to the next? + * @node: only for isochronous endpoints. First TRB needs different type. + * @use_bounce_buffer: set to use bounce buffer + * @must_interrupt: set to interrupt on TRB completion + */ +static void dwc3_prepare_one_trb(struct dwc3_ep *dep, + struct dwc3_request *req, unsigned int trb_length, + unsigned int chain, unsigned int node, bool use_bounce_buffer, + bool must_interrupt) { + struct dwc3_trb *trb; + dma_addr_t dma; + unsigned int stream_id = req->request.stream_id; + unsigned int short_not_ok = req->request.short_not_ok; + unsigned int no_interrupt = req->request.no_interrupt; + unsigned int is_last = req->request.is_last; struct dwc3 *dwc = dep->dwc; struct usb_gadget *gadget = dwc->gadget; enum usb_device_speed speed = gadget->speed; - trb->size = DWC3_TRB_SIZE_LENGTH(length); + if (use_bounce_buffer) + dma = dep->dwc->bounce_addr; + else if (req->request.num_sgs > 0) + dma = sg_dma_address(req->start_sg); + else + dma = req->request.dma; + + trb = &dep->trb_pool[dep->trb_enqueue]; + + if (!req->trb) { + dwc3_gadget_move_started_request(req); + req->trb = trb; + req->trb_dma = dwc3_trb_dma_offset(dep, trb); + } + + req->num_trbs++; + + trb->size = DWC3_TRB_SIZE_LENGTH(trb_length); trb->bpl = lower_32_bits(dma); trb->bph = upper_32_bits(dma); @@ -1233,10 +1265,10 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb, unsigned int mult = 2; unsigned int maxp = usb_endpoint_maxp(ep->desc); - if (length <= (2 * maxp)) + if (trb_length <= (2 * maxp)) mult--; - if (length <= maxp) + if (trb_length <= maxp) mult--; trb->size |= DWC3_TRB_SIZE_PCM1(mult); @@ -1310,50 +1342,6 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb, trace_dwc3_prepare_trb(dep, trb); } -/** - * dwc3_prepare_one_trb - setup one TRB from one request - * @dep: endpoint for which this request is prepared - * @req: dwc3_request pointer - * @trb_length: buffer size of the TRB - * @chain: should this TRB be chained to the next? - * @node: only for isochronous endpoints. First TRB needs different type. - * @use_bounce_buffer: set to use bounce buffer - * @must_interrupt: set to interrupt on TRB completion - */ -static void dwc3_prepare_one_trb(struct dwc3_ep *dep, - struct dwc3_request *req, unsigned int trb_length, - unsigned int chain, unsigned int node, bool use_bounce_buffer, - bool must_interrupt) -{ - struct dwc3_trb *trb; - dma_addr_t dma; - unsigned int stream_id = req->request.stream_id; - unsigned int short_not_ok = req->request.short_not_ok; - unsigned int no_interrupt = req->request.no_interrupt; - unsigned int is_last = req->request.is_last; - - if (use_bounce_buffer) - dma = dep->dwc->bounce_addr; - else if (req->request.num_sgs > 0) - dma = sg_dma_address(req->start_sg); - else - dma = req->request.dma; - - trb = &dep->trb_pool[dep->trb_enqueue]; - - if (!req->trb) { - dwc3_gadget_move_started_request(req); - req->trb = trb; - req->trb_dma = dwc3_trb_dma_offset(dep, trb); - } - - req->num_trbs++; - - __dwc3_prepare_one_trb(dep, trb, dma, trb_length, chain, node, - stream_id, short_not_ok, no_interrupt, is_last, - must_interrupt); -} - static bool dwc3_needs_extra_trb(struct dwc3_ep *dep, struct dwc3_request *req) { unsigned int maxp = usb_endpoint_maxp(dep->endpoint.desc); -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] usb: dwc3: gadget: refactor dwc3_repare_one_trb 2022-07-04 14:18 ` [PATCH v2 1/2] usb: dwc3: gadget: refactor dwc3_repare_one_trb Michael Grzeschik @ 2022-07-08 12:45 ` Greg KH 0 siblings, 0 replies; 7+ messages in thread From: Greg KH @ 2022-07-08 12:45 UTC (permalink / raw) To: Michael Grzeschik; +Cc: linux-usb, balbi, kernel On Mon, Jul 04, 2022 at 04:18:11PM +0200, Michael Grzeschik wrote: > The function __dwc3_prepare_one_trb has many parameters. Since it is > only used in dwc3_prepare_one_trb there is no point in keeping the > function. We merge both functions and get rid of the big list of > parameters. > > Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> > --- > v1 -> v2: - new patch > > drivers/usb/dwc3/gadget.c | 92 +++++++++++++++++---------------------- > 1 file changed, 40 insertions(+), 52 deletions(-) Much nicer, thanks! ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting 2022-07-04 14:18 [PATCH v2 0/2] fix trb handling for high speed isoc transfers Michael Grzeschik 2022-07-04 14:18 ` [PATCH v2 1/2] usb: dwc3: gadget: refactor dwc3_repare_one_trb Michael Grzeschik @ 2022-07-04 14:18 ` Michael Grzeschik 2022-07-08 12:45 ` Greg KH 1 sibling, 1 reply; 7+ messages in thread From: Michael Grzeschik @ 2022-07-04 14:18 UTC (permalink / raw) To: linux-usb; +Cc: balbi, gregkh, kernel For High-Speed Transfers the prepare_one_trb function is calculating the multiplier setting for the trb based on the length parameter of the trb currently prepared. This assumption is wrong. For trbs with a sg list, the length of the actual request has to be taken instead. Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> --- v1 -> v2: - added refactor patch before this patch - using req->request.length as condition value drivers/usb/dwc3/gadget.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index dcd8fc209ccd6a..4366c45c28cf6d 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1265,10 +1265,10 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, unsigned int mult = 2; unsigned int maxp = usb_endpoint_maxp(ep->desc); - if (trb_length <= (2 * maxp)) + if (req->request.length <= (2 * maxp)) mult--; - if (trb_length <= maxp) + if (req->request.length <= maxp) mult--; trb->size |= DWC3_TRB_SIZE_PCM1(mult); -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting 2022-07-04 14:18 ` [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting Michael Grzeschik @ 2022-07-08 12:45 ` Greg KH 2022-07-08 12:51 ` Michael Grzeschik 0 siblings, 1 reply; 7+ messages in thread From: Greg KH @ 2022-07-08 12:45 UTC (permalink / raw) To: Michael Grzeschik; +Cc: linux-usb, balbi, kernel On Mon, Jul 04, 2022 at 04:18:12PM +0200, Michael Grzeschik wrote: > For High-Speed Transfers the prepare_one_trb function is calculating the > multiplier setting for the trb based on the length parameter of the trb > currently prepared. This assumption is wrong. For trbs with a sg list, > the length of the actual request has to be taken instead. > > Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> > --- > v1 -> v2: - added refactor patch before this patch > - using req->request.length as condition value Does this need to be backported to older kernels or is it ok for 5.20-rc1? thanks, greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting 2022-07-08 12:45 ` Greg KH @ 2022-07-08 12:51 ` Michael Grzeschik 2022-07-08 23:00 ` Thinh Nguyen 0 siblings, 1 reply; 7+ messages in thread From: Michael Grzeschik @ 2022-07-08 12:51 UTC (permalink / raw) To: Greg KH; +Cc: linux-usb, balbi, kernel, Thinh.Nguyen [-- Attachment #1: Type: text/plain, Size: 1242 bytes --] Cc: Thinh.Nguyen@synopsys.com On Fri, Jul 08, 2022 at 02:45:30PM +0200, Greg KH wrote: >On Mon, Jul 04, 2022 at 04:18:12PM +0200, Michael Grzeschik wrote: >> For High-Speed Transfers the prepare_one_trb function is calculating the >> multiplier setting for the trb based on the length parameter of the trb >> currently prepared. This assumption is wrong. For trbs with a sg list, >> the length of the actual request has to be taken instead. >> >> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> >> --- >> v1 -> v2: - added refactor patch before this patch >> - using req->request.length as condition value > >Does this need to be backported to older kernels or is it ok for >5.20-rc1? We can add this line to the patch. Fixes: 40d829fb2ec6 ("usb: dwc3: gadget: Correct ISOC DATA PIDs for short packets") I would say this could be backported. Thinh? >thanks, > >greg k-h > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting 2022-07-08 12:51 ` Michael Grzeschik @ 2022-07-08 23:00 ` Thinh Nguyen 0 siblings, 0 replies; 7+ messages in thread From: Thinh Nguyen @ 2022-07-08 23:00 UTC (permalink / raw) To: Michael Grzeschik, Greg KH Cc: linux-usb@vger.kernel.org, balbi@kernel.org, kernel@pengutronix.de, Thinh Nguyen On 7/8/2022, Michael Grzeschik wrote: > Cc: Thinh.Nguyen@synopsys.com > > On Fri, Jul 08, 2022 at 02:45:30PM +0200, Greg KH wrote: >> On Mon, Jul 04, 2022 at 04:18:12PM +0200, Michael Grzeschik wrote: >>> For High-Speed Transfers the prepare_one_trb function is calculating >>> the >>> multiplier setting for the trb based on the length parameter of the trb >>> currently prepared. This assumption is wrong. For trbs with a sg list, >>> the length of the actual request has to be taken instead. >>> >>> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> >>> --- >>> v1 -> v2: - added refactor patch before this patch >>> - using req->request.length as condition value >> >> Does this need to be backported to older kernels or is it ok for >> 5.20-rc1? > > We can add this line to the patch. > > Fixes: 40d829fb2ec6 ("usb: dwc3: gadget: Correct ISOC DATA PIDs for > short packets") > > I would say this could be backported. > > Thinh? Hi Michael, Since you have the refactoring patch prior to this, it's a bit difficult to backport cleanly without rewriting the patch. It would be nice to be able to backport fixes. But for this particular fix, I don't think will affect too many users. Not many application would use SG for simply 3KB or less requests. (Note that periodic ep can only transfer up to 3KB/interval in HS). Typically a page size is 4KB, and I don't think SG is needed. Anyway, I think Greg already picked up your patches. Thanks for the fix! BR, Thinh ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-07-08 23:00 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-07-04 14:18 [PATCH v2 0/2] fix trb handling for high speed isoc transfers Michael Grzeschik 2022-07-04 14:18 ` [PATCH v2 1/2] usb: dwc3: gadget: refactor dwc3_repare_one_trb Michael Grzeschik 2022-07-08 12:45 ` Greg KH 2022-07-04 14:18 ` [PATCH v2 2/2] usb: dwc3: gadget: fix high speed multiplier setting Michael Grzeschik 2022-07-08 12:45 ` Greg KH 2022-07-08 12:51 ` Michael Grzeschik 2022-07-08 23:00 ` Thinh Nguyen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox