usb: dwc3: gadget: Fix TRB preparation
Subsystems (3)
Thinh Nguyen
maintainerv2 cover usb: dwc3: gadget: Fix TRB preparation
There are a few issues in DWC3 driver when preparing for TRB. The driver needs to account the following:
* MPS alignment for ZLP OUT direction
* Extra TRBs when checking for available TRBs
* SG entries size > request length
Along with these fixes, there are some cleanup/refactoring patches in this series.
Changes in v2:
- Update remaining length when resume request
- Remove unused variables
- Add a missing "return 0" for dwc3_prepare_trbs()
- Update doc indicating dwc3_prepare_trbs() can return other -errno
Thinh Nguyen (7):
usb: dwc3: gadget: Don't setup more than requested
usb: dwc3: gadget: Fix handling ZLP
usb: dwc3: gadget: Handle ZLP for sg requests
usb: dwc3: gadget: Refactor preparing TRBs
usb: dwc3: gadget: Account for extra TRB
usb: dwc3: gadget: Rename misleading function names
usb: dwc3: ep0: Skip ZLP setup for OUT
drivers/usb/dwc3/ep0.c | 2 +- drivers/usb/dwc3/gadget.c | 247 +++++++++++++++++++++++--------------- 2 files changed, 148 insertions(+), 101 deletions(-)
base-commit: e3ee0e740c3887d2293e8d54a8707218d70d86ca
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v2 1/7 usb: dwc3: gadget: Don't setup more than requested
The SG list may be set up with entry size more than the requested length. Check the usb_request->length and make sure that we don't setup the TRBs to send/receive more than requested. This case may occur when the SG entry is allocated up to a certain minimum size, but the request length is less than that. It can also occur when the request is reused for a different request length.
---
Changes in v2:
- Update remaining length when resume request
drivers/usb/dwc3/gadget.c | 51 +++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 16 deletions(-)
drivers/usb/dwc3/gadget.c +35 -16
@@ -1054,27 +1054,25 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *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. */ static void dwc3_prepare_one_trb (struct dwc3_ep *dep, -struct dwc3_request *req,unsigned chain,unsigned node) +struct dwc3_request *req,unsigned int trb_length, +unsigned chain,unsigned node) {struct dwc3_trb *trb; -unsigned int length;dma_addr_t dma;unsigned stream_id = req->request.stream_id;unsigned short_not_ok = req->request.short_not_ok;unsigned no_interrupt = req->request.no_interrupt;unsigned is_last = req->request.is_last; -if (req->request.num_sgs >0 ) { - length =sg_dma_len (req->start_sg); +if (req->request.num_sgs >0 ) dma =sg_dma_address (req->start_sg); - }else { - length = req->request.length; +else dma = req->request.dma; - } trb = &dep->trb_pool[dep->trb_enqueue];
@@ -1086,7 +1084,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, req->num_trbs++; -__dwc3_prepare_one_trb (dep, trb, dma, length, chain, node, +__dwc3_prepare_one_trb (dep, trb, dma, trb_length, chain, node, stream_id, short_not_ok, no_interrupt, is_last); }
@@ -1096,16 +1094,27 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,struct scatterlist *sg = req->start_sg;struct scatterlist *s;int i; - +unsigned int length = req->request.length;unsigned int remaining = req->request.num_mapped_sgs - req->num_queued_sgs; +/* +* If we resume preparing the request, then get the remaining length of +* the request and resume where we left off. +*/ +for_each_sg (req->request.sg, s, req->num_queued_sgs, i) + length -=sg_dma_len (s); +for_each_sg (sg, s, remaining, i) { -unsigned int length = req->request.length;unsigned int maxp =usb_endpoint_maxp (dep->endpoint.desc);unsigned int rem = length % maxp; +unsigned int trb_length;unsigned chain = true; + trb_length = min_t(unsigned int, length, sg_dma_len(s)); + + length -= trb_length; +/* * IOMMU driver is coalescing the list of sgs which shares a * page boundary into one and giving it to USB driver. With
@@ -1113,7 +1122,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,* sgs passed. So mark the chain bit to false if it isthe last * mapped sg. */ -if (i == remaining -1 ) +if ((i == remaining -1 ) || !length) chain = false;if (rem &&usb_endpoint_dir_out (dep->endpoint.desc) && !chain) {
@@ -1123,7 +1132,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, req->needs_extra_trb = true;/* prepare normal TRB */ -dwc3_prepare_one_trb (dep, req, true, i); +dwc3_prepare_one_trb (dep, req, trb_length, true, i);/* Now prepare one extra TRB to align transfer size */ trb = &dep->trb_pool[dep->trb_enqueue];
@@ -1135,7 +1144,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, req->request.no_interrupt, req->request.is_last); }else { -dwc3_prepare_one_trb (dep, req, chain, i); +dwc3_prepare_one_trb (dep, req, trb_length, chain, i); }/*
@@ -1150,6 +1159,16 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, req->num_queued_sgs++; +/* +* The number of pending SG entries may not correspond to the +* number of mapped SG entries. If all the data are queued, then +* don't include unused SG entries. +*/ +if (length ==0 ) { + req->num_pending_sgs -= req->request.num_mapped_sgs - req->num_queued_sgs; +break ; + } +if (!dwc3_calc_trbs_left (dep))break ; }
@@ -1169,7 +1188,7 @@ static void dwc3_prepare_one_trb_linear(struct dwc3_ep *dep, req->needs_extra_trb = true;/* prepare normal TRB */ -dwc3_prepare_one_trb (dep, req, true,0 ); +dwc3_prepare_one_trb (dep, req, length, true,0 );/* Now prepare one extra TRB to align transfer size */ trb = &dep->trb_pool[dep->trb_enqueue];
@@ -1187,7 +1206,7 @@ static void dwc3_prepare_one_trb_linear(struct dwc3_ep *dep, req->needs_extra_trb = true;/* prepare normal TRB */ -dwc3_prepare_one_trb (dep, req, true,0 ); +dwc3_prepare_one_trb (dep, req, length, true,0 );/* Now prepare one extra TRB to handle ZLP */ trb = &dep->trb_pool[dep->trb_enqueue];
@@ -1198,7 +1217,7 @@ static void dwc3_prepare_one_trb_linear(struct dwc3_ep *dep, req->request.no_interrupt, req->request.is_last); }else { -dwc3_prepare_one_trb (dep, req, false,0 ); +dwc3_prepare_one_trb (dep, req, length, false,0 ); } }
Signature · 1 line
2.28.0
Sasha Levin
maintainerRe: [PATCH v2 1/7] usb: dwc3: gadget: Don't setup more than requested
Hi
[This is an automated email]
This commit has been processed because it contains a "Fixes:" tag
fixing commit: a31e63b608ff ("usb: dwc3: gadget: Correct handling of scattergather lists").
The bot has tested the following trees: v5.8, v5.7.14, v5.4.57, v4.19.138.
v5.8: Build OK!
v5.7.14: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v5.4.57: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v4.19.138: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3aec99154db3 ("usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") 974a1368c33e ("usb: dwc3: gadget: don't use resource_index as a flag") a3af5e3ad3f1 ("usb: dwc3: gadget: add dwc3_request status tracking") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") c58d8bfc77a2 ("usb: dwc3: gadget: Check END_TRANSFER completion") d3abda5a98a1 ("usb: dwc3: gadget: Clear started flag for non-IOC") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests") da10bcdd6f70 ("usb: dwc3: gadget: Delay starting transfer")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
Signature · 2 lines
Thanks Sasha
Sasha Levin
maintainerRe: [PATCH v2 1/7] usb: dwc3: gadget: Don't setup more than requested
In reply to Thinh NguyenHi
[This is an automated email]
This commit has been processed because it contains a "Fixes:" tag
fixing commit: a31e63b608ff ("usb: dwc3: gadget: Correct handling of scattergather lists").
The bot has tested the following trees: v5.8.1, v5.7.15, v5.4.58, v4.19.139.
v5.8.1: Build OK!
v5.7.15: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v5.4.58: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v4.19.139: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3aec99154db3 ("usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") 974a1368c33e ("usb: dwc3: gadget: don't use resource_index as a flag") a3af5e3ad3f1 ("usb: dwc3: gadget: add dwc3_request status tracking") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") c58d8bfc77a2 ("usb: dwc3: gadget: Check END_TRANSFER completion") d3abda5a98a1 ("usb: dwc3: gadget: Clear started flag for non-IOC") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests") da10bcdd6f70 ("usb: dwc3: gadget: Delay starting transfer")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
Signature · 2 lines
Thanks Sasha
Sasha Levin
maintainerRe: [PATCH v2 1/7] usb: dwc3: gadget: Don't setup more than requested
In reply to Thinh NguyenHi
[This is an automated email]
This commit has been processed because it contains a "Fixes:" tag
fixing commit: a31e63b608ff ("usb: dwc3: gadget: Correct handling of scattergather lists").
The bot has tested the following trees: v5.8.2, v5.7.16, v5.4.59, v4.19.140.
v5.8.2: Build OK!
v5.7.16: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v5.4.59: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v4.19.140: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3aec99154db3 ("usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") 974a1368c33e ("usb: dwc3: gadget: don't use resource_index as a flag") a3af5e3ad3f1 ("usb: dwc3: gadget: add dwc3_request status tracking") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") c58d8bfc77a2 ("usb: dwc3: gadget: Check END_TRANSFER completion") d3abda5a98a1 ("usb: dwc3: gadget: Clear started flag for non-IOC") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests") da10bcdd6f70 ("usb: dwc3: gadget: Delay starting transfer")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
Signature · 2 lines
Thanks Sasha
Thinh Nguyen
maintainerPATCH v2 2/7 usb: dwc3: gadget: Fix handling ZLP
In reply to Thinh NguyenThe usb_request->zero doesn't apply for isoc. Also, if we prepare a 0-length (ZLP) TRB for the OUT direction, we need to prepare an extra TRB to pad up to the MPS alignment. Use the same bounce buffer for the ZLP TRB and the extra pad TRB.
---
Changes in v2:
- None
drivers/usb/dwc3/gadget.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)
drivers/usb/dwc3/gadget.c +23 -2
@@ -1199,6 +1199,7 @@ static void dwc3_prepare_one_trb_linear(struct dwc3_ep *dep, req->request.no_interrupt, req->request.is_last); }else if (req->request.zero && req->request.length && + !usb_endpoint_xfer_isoc (dep->endpoint.desc) && (IS_ALIGNED (req->request.length, maxp))) {struct dwc3 *dwc = dep->dwc;struct dwc3_trb *trb;
@@ -1208,14 +1209,25 @@ static void dwc3_prepare_one_trb_linear(struct dwc3_ep *dep,/* prepare normal TRB */ dwc3_prepare_one_trb (dep, req, length, true,0 ); -/* Now prepare one extra TRB to handle ZLP */ +/* Prepare one extra TRB to handle ZLP */ trb = &dep->trb_pool[dep->trb_enqueue]; req->num_trbs++;__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr,0 , - false,1 , req->request.stream_id, + !req->direction,1 , req->request.stream_id, req->request.short_not_ok, req->request.no_interrupt, req->request.is_last); + +/* Prepare one more TRB to handle MPS alignment for OUT */ +if (!req->direction) { + trb = &dep->trb_pool[dep->trb_enqueue]; + req->num_trbs++; +__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, maxp, + false,1 , req->request.stream_id, + req->request.short_not_ok, + req->request.no_interrupt, + req->request.is_last); + } }else {dwc3_prepare_one_trb (dep, req, length, false,0 ); }
@@ -2690,8 +2702,17 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, status);if (req->needs_extra_trb) { +unsigned int maxp =usb_endpoint_maxp (dep->endpoint.desc); + ret =dwc3_gadget_ep_reclaim_trb_linear (dep, req, event, status); + +/* Reclaim MPS padding TRB for ZLP */ +if (!req->direction && req->request.zero && req->request.length && + !usb_endpoint_xfer_isoc (dep->endpoint.desc) && + (IS_ALIGNED (req->request.length, maxp))) + ret =dwc3_gadget_ep_reclaim_trb_linear (dep, req, event, status); + req->needs_extra_trb = false; }
Signature · 1 line
2.28.0
Sasha Levin
maintainerRe: [PATCH v2 2/7] usb: dwc3: gadget: Fix handling ZLP
Hi
[This is an automated email]
This commit has been processed because it contains a "Fixes:" tag fixing commit: d6e5a549cc4d ("usb: dwc3: simplify ZLP handling").
The bot has tested the following trees: v5.8.1, v5.7.15, v5.4.58, v4.19.139, v4.14.193.
v5.8.1: Build OK!
v5.7.15: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v5.4.58: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v4.19.139: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3aec99154db3 ("usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") 974a1368c33e ("usb: dwc3: gadget: don't use resource_index as a flag") a3af5e3ad3f1 ("usb: dwc3: gadget: add dwc3_request status tracking") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") c58d8bfc77a2 ("usb: dwc3: gadget: Check END_TRANSFER completion") d3abda5a98a1 ("usb: dwc3: gadget: Clear started flag for non-IOC") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests") da10bcdd6f70 ("usb: dwc3: gadget: Delay starting transfer")
v4.14.193: Failed to apply! Possible dependencies:
09fe1f8d7e2f ("usb: dwc3: gadget: track number of TRBs per request") 0bd0f6d201eb ("usb: dwc3: gadget: remove allocated/queued request tracking") 1a22ec643580 ("usb: dwc3: gadget: combine unaligned and zero flags") 38408464aa76 ("usb: dwc3: gadget: XferNotReady is Isoc-only") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") 502a37b98a7b ("usb: dwc3: gadget: cache frame number in struct dwc3_ep") 66f5dd5a0379 ("usb: dwc3: gadget: rename done_trbs and done_reqs") 7fdca766499b ("usb: dwc3: gadget: simplify __dwc3_gadget_kick_transfer() prototype") 8f608e8ab628 ("usb: dwc3: gadget: remove unnecessary 'dwc' parameter") a31e63b608ff ("usb: dwc3: gadget: Correct handling of scattergather lists") d80fe1b6e34d ("usb: dwc3: gadget: simplify short packet event") e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling")
f38e35dd84e2 ("usb: dwc3: gadget: split dwc3_gadget_ep_cleanup_completed_requests()") fbea935accf4 ("usb: dwc3: gadget: rename dwc3_endpoint_transfer_complete()")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
Signature · 2 lines
Thanks Sasha
Sasha Levin
maintainerRe: [PATCH v2 2/7] usb: dwc3: gadget: Fix handling ZLP
In reply to Thinh NguyenHi
[This is an automated email]
This commit has been processed because it contains a "Fixes:" tag fixing commit: d6e5a549cc4d ("usb: dwc3: simplify ZLP handling").
The bot has tested the following trees: v5.8.2, v5.7.16, v5.4.59, v4.19.140, v4.14.193.
v5.8.2: Build OK!
v5.7.16: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v5.4.59: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests")
v4.19.140: Failed to apply! Possible dependencies:
2e6e9e4b2ed7 ("usb: dwc3: gadget: Refactor TRB completion handler") 3aec99154db3 ("usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") 974a1368c33e ("usb: dwc3: gadget: don't use resource_index as a flag") a3af5e3ad3f1 ("usb: dwc3: gadget: add dwc3_request status tracking") b6842d4938c3 ("usb: dwc3: gadget: Check for in-progress END_TRANSFER") c58d8bfc77a2 ("usb: dwc3: gadget: Check END_TRANSFER completion") d3abda5a98a1 ("usb: dwc3: gadget: Clear started flag for non-IOC") d9feef974e0d ("usb: dwc3: gadget: Continue to process pending requests") da10bcdd6f70 ("usb: dwc3: gadget: Delay starting transfer")
v4.14.193: Failed to apply! Possible dependencies:
09fe1f8d7e2f ("usb: dwc3: gadget: track number of TRBs per request") 0bd0f6d201eb ("usb: dwc3: gadget: remove allocated/queued request tracking") 1a22ec643580 ("usb: dwc3: gadget: combine unaligned and zero flags") 38408464aa76 ("usb: dwc3: gadget: XferNotReady is Isoc-only") 3eaecd0c2333 ("usb: dwc3: gadget: Handle XferComplete for streams") 502a37b98a7b ("usb: dwc3: gadget: cache frame number in struct dwc3_ep") 66f5dd5a0379 ("usb: dwc3: gadget: rename done_trbs and done_reqs") 7fdca766499b ("usb: dwc3: gadget: simplify __dwc3_gadget_kick_transfer() prototype") 8f608e8ab628 ("usb: dwc3: gadget: remove unnecessary 'dwc' parameter") a31e63b608ff ("usb: dwc3: gadget: Correct handling of scattergather lists") d80fe1b6e34d ("usb: dwc3: gadget: simplify short packet event") e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling")
f38e35dd84e2 ("usb: dwc3: gadget: split dwc3_gadget_ep_cleanup_completed_requests()") fbea935accf4 ("usb: dwc3: gadget: rename dwc3_endpoint_transfer_complete()")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
Signature · 2 lines
Thanks Sasha
Thinh Nguyen
maintainerPATCH v2 3/7 usb: dwc3: gadget: Handle ZLP for sg requests
In reply to Thinh NguyenCurrently dwc3 doesn't handle usb_request->zero for SG requests. This change checks and prepares extra TRBs for the ZLP for SG requests.
---
Changes in v2:
- None
drivers/usb/dwc3/gadget.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
drivers/usb/dwc3/gadget.c +31 -0
@@ -1143,6 +1143,37 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, req->request.short_not_ok, req->request.no_interrupt, req->request.is_last); + }else if (req->request.zero && req->request.length && + !usb_endpoint_xfer_isoc (dep->endpoint.desc) && + !rem && !chain) { +struct dwc3 *dwc = dep->dwc; +struct dwc3_trb *trb; + + req->needs_extra_trb = true; + +/* Prepare normal TRB */ +dwc3_prepare_one_trb (dep, req, trb_length, true, i); + +/* Prepare one extra TRB to handle ZLP */ + trb = &dep->trb_pool[dep->trb_enqueue]; + req->num_trbs++; +__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr,0 , + !req->direction,1 , + req->request.stream_id, + req->request.short_not_ok, + req->request.no_interrupt, + req->request.is_last); + +/* Prepare one more TRB to handle MPS alignment */ +if (!req->direction) { + trb = &dep->trb_pool[dep->trb_enqueue]; + req->num_trbs++; +__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, maxp, + false,1 , req->request.stream_id, + req->request.short_not_ok, + req->request.no_interrupt, + req->request.is_last); + } }else {dwc3_prepare_one_trb (dep, req, trb_length, chain, i); }
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v2 4/7 usb: dwc3: gadget: Refactor preparing TRBs
In reply to Thinh NguyenThere are a lot of common codes for preparing SG and linear TRBs. Let's refactor them for easier read. No functional change here.
---
Changes in v2:
- Remove unused variables rem and maxp
drivers/usb/dwc3/gadget.c | 178 ++++++++++++++------------------------ 1 file changed, 67 insertions(+), 111 deletions(-)
drivers/usb/dwc3/gadget.c +67 -111
@@ -1088,6 +1088,65 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, stream_id, short_not_ok, no_interrupt, is_last); } +/** +* dwc3_prepare_last_sg - prepare TRBs for the last SG entry +* @dep: The endpoint that the request belongs to +* @req: The request to prepare +* @entry_length: The last SG entry size +* @node: Indicates whether this is not the first entry (for isoc only) +*/ +static void dwc3_prepare_last_sg (struct dwc3_ep *dep, +struct dwc3_request *req, +unsigned int entry_length, +unsigned int node) +{ +unsigned int maxp =usb_endpoint_maxp (dep->endpoint.desc); +unsigned int rem = req->request.length % maxp; +unsigned int num_extra_trbs =0 ; +unsigned int i; +bool do_zlp = false; + +if (!usb_endpoint_xfer_isoc (dep->endpoint.desc) && + req->request.zero && req->request.length && !rem) { + num_extra_trbs++; + do_zlp = true; + } + +if (!req->direction && (!req->request.length || rem || do_zlp)) + num_extra_trbs++; + +if (num_extra_trbs >0 ) + req->needs_extra_trb = true; + +/* Prepare a normal TRB */ +dwc3_prepare_one_trb (dep, req, entry_length, req->needs_extra_trb, node); + +/* Prepare extra TRBs for ZLP and MPS OUT transfer alignment */ +for (i =0 ; i < num_extra_trbs; i++) { +struct dwc3 *dwc = dep->dwc; +struct dwc3_trb *trb; +unsigned int extra_trb_length; +bool chain = true; + +if (do_zlp && !i) + extra_trb_length =0 ; +else + extra_trb_length = maxp - rem; + +if (i == num_extra_trbs -1 ) + chain = false; + + trb = &dep->trb_pool[dep->trb_enqueue]; + req->num_trbs++; +__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, + extra_trb_length, chain,1 , + req->request.stream_id, + req->request.short_not_ok, + req->request.no_interrupt, + req->request.is_last); + } +} +static void dwc3_prepare_one_trb_sg (struct dwc3_ep *dep,struct dwc3_request *req) {
@@ -1106,10 +1165,8 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, length -=sg_dma_len (s);for_each_sg (sg, s, remaining, i) { -unsigned int maxp =usb_endpoint_maxp (dep->endpoint.desc); -unsigned int rem = length % maxp;unsigned int trb_length; -unsigned chain = true; +bool last_sg = false; trb_length = min_t(unsigned int, length, sg_dma_len(s));
@@ -1123,60 +1180,12 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,* mapped sg. */ if ((i == remaining -1 ) || !length) - chain = false; + last_sg = true; -if (rem &&usb_endpoint_dir_out (dep->endpoint.desc) && !chain) { -struct dwc3 *dwc = dep->dwc; -struct dwc3_trb *trb; - - req->needs_extra_trb = true; - -/* prepare normal TRB */ -dwc3_prepare_one_trb (dep, req, trb_length, true, i); - -/* Now prepare one extra TRB to align transfer size */ - trb = &dep->trb_pool[dep->trb_enqueue]; - req->num_trbs++; -__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, - maxp - rem, false,1 , - req->request.stream_id, - req->request.short_not_ok, - req->request.no_interrupt, - req->request.is_last); - }else if (req->request.zero && req->request.length && - !usb_endpoint_xfer_isoc (dep->endpoint.desc) && - !rem && !chain) { -struct dwc3 *dwc = dep->dwc; -struct dwc3_trb *trb; - - req->needs_extra_trb = true; - -/* Prepare normal TRB */ -dwc3_prepare_one_trb (dep, req, trb_length, true, i); - -/* Prepare one extra TRB to handle ZLP */ - trb = &dep->trb_pool[dep->trb_enqueue]; - req->num_trbs++; -__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr,0 , - !req->direction,1 , - req->request.stream_id, - req->request.short_not_ok, - req->request.no_interrupt, - req->request.is_last); - -/* Prepare one more TRB to handle MPS alignment */ -if (!req->direction) { - trb = &dep->trb_pool[dep->trb_enqueue]; - req->num_trbs++; -__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, maxp, - false,1 , req->request.stream_id, - req->request.short_not_ok, - req->request.no_interrupt, - req->request.is_last); - } - }else { -dwc3_prepare_one_trb (dep, req, trb_length, chain, i); - } +if (last_sg) +dwc3_prepare_last_sg (dep, req, trb_length, i); +else +dwc3_prepare_one_trb (dep, req, trb_length,1 , i);/* * There can be a situation where all sgs in sglist are not
@@ -1185,7 +1194,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,* we have free trbs we can continue queuing from where we * previously stopped */ -if (chain) +if (!last_sg) req->start_sg =sg_next (s); req->num_queued_sgs++;
@@ -1208,60 +1217,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,static void dwc3_prepare_one_trb_linear (struct dwc3_ep *dep,struct dwc3_request *req) { -unsigned int length = req->request.length; -unsigned int maxp =usb_endpoint_maxp (dep->endpoint.desc); -unsigned int rem = length % maxp; - -if ((!length || rem) &&usb_endpoint_dir_out (dep->endpoint.desc)) { -struct dwc3 *dwc = dep->dwc; -struct dwc3_trb *trb; - - req->needs_extra_trb = true; - -/* prepare normal TRB */ -dwc3_prepare_one_trb (dep, req, length, true,0 ); - -/* Now prepare one extra TRB to align transfer size */ - trb = &dep->trb_pool[dep->trb_enqueue]; - req->num_trbs++; -__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, maxp - rem, - false,1 , req->request.stream_id, - req->request.short_not_ok, - req->request.no_interrupt, - req->request.is_last); - }else if (req->request.zero && req->request.length && - !usb_endpoint_xfer_isoc (dep->endpoint.desc) && - (IS_ALIGNED (req->request.length, maxp))) { -struct dwc3 *dwc = dep->dwc; -struct dwc3_trb *trb; - - req->needs_extra_trb = true; - -/* prepare normal TRB */ -dwc3_prepare_one_trb (dep, req, length, true,0 ); - -/* Prepare one extra TRB to handle ZLP */ - trb = &dep->trb_pool[dep->trb_enqueue]; - req->num_trbs++; -__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr,0 , - !req->direction,1 , req->request.stream_id, - req->request.short_not_ok, - req->request.no_interrupt, - req->request.is_last); - -/* Prepare one more TRB to handle MPS alignment for OUT */ -if (!req->direction) { - trb = &dep->trb_pool[dep->trb_enqueue]; - req->num_trbs++; -__dwc3_prepare_one_trb (dep, trb, dwc->bounce_addr, maxp, - false,1 , req->request.stream_id, - req->request.short_not_ok, - req->request.no_interrupt, - req->request.is_last); - } - }else { -dwc3_prepare_one_trb (dep, req, length, false,0 ); - } +dwc3_prepare_last_sg (dep, req, req->request.length,0 ); }/*
Signature · 1 line
2.28.0
Re: [PATCH v2 4/7] usb: dwc3: gadget: Refactor preparing TRBs
Hi,
Quoted 4 lines · Thinh Nguyen
There are a lot of common codes for preparing SG and linear TRBs. Let's refactor them for easier read. No functional change here.
Signed-off-by Thinh Nguyen <[email protected]>
patches 1-3 will be merged for the -rc cycle. Because following patches depend on this, I have to delay the others for v5.10 merge window. Unless you want to rebase to make this the final patch in the series and make sure all fixes come before any refactoring on code clean-ups.
Signature · 1 line
balbi
Thinh Nguyen
maintainerRe: [PATCH v2 4/7] usb: dwc3: gadget: Refactor preparing TRBs
Hi,
Quoted 6 lines · Felipe Balbi
Hi,
Quoted 3 lines · Thinh Nguyen
There are a lot of common codes for preparing SG and linear TRBs. Let's refactor them for easier read. No functional change here.
Quoted 7 lines
Quoted 1 line
Signed-off-by Thinh Nguyen <[email protected]>patches 1-3 will be merged for the -rc cycle. Because following patches depend on this, I have to delay the others for v5.10 merge window. Unless you want to rebase to make this the final patch in the series and make sure all fixes come before any refactoring on code clean-ups.
That's fine. They can go on v5.10. The patch fix checking TRB availability is not easy to hit unless you're targeting that issue specifically.
Thanks!
Thinh
Thinh Nguyen
maintainerPATCH v2 5/7 usb: dwc3: gadget: Account for extra TRB
In reply to Thinh NguyenWhen checking for how many TRB remaining, make sure to account for extra TRBs for ZLP or MPS alignment transfers. Since the dwc3_prepare_trb* functions should know if we need the extra TRBs, make those functions return a status code -EAGAIN if there isn't enough TRB. Check against those status when preparing TRB instead.
---
Changes in v2:
- Add a missing "return 0" for dwc3_prepare_trbs()
- Update doc indicate dwc3_prepare_trbs() can return other -errno
drivers/usb/dwc3/gadget.c | 82 ++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 31 deletions(-)
drivers/usb/dwc3/gadget.c +51 -31
@@ -1057,8 +1057,10 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb,* @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. +* +* Return 0 on success or -EAGAIN if there is not enough TRBs. */ -static void dwc3_prepare_one_trb (struct dwc3_ep *dep, +static int dwc3_prepare_one_trb (struct dwc3_ep *dep,struct dwc3_request *req,unsigned int trb_length,unsigned chain,unsigned node) {
@@ -1069,6 +1071,9 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,unsigned no_interrupt = req->request.no_interrupt;unsigned is_last = req->request.is_last; +if (!dwc3_calc_trbs_left (dep)) +return -EAGAIN ; +if (req->request.num_sgs >0 ) dma =sg_dma_address (req->start_sg);else
@@ -1086,6 +1091,8 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,__dwc3_prepare_one_trb (dep, trb, dma, trb_length, chain, node, stream_id, short_not_ok, no_interrupt, is_last); + +return 0 ; }/**
@@ -1094,11 +1101,13 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,* @req: The request to prepare * @entry_length: The last SG entry size * @node: Indicates whether this is not the first entry (for isoc only) +* +* Returns 0 on success or -EAGAIN if there is not enough TRBs. */ -static void dwc3_prepare_last_sg (struct dwc3_ep *dep, -struct dwc3_request *req, -unsigned int entry_length, -unsigned int node) +static int dwc3_prepare_last_sg (struct dwc3_ep *dep, +struct dwc3_request *req, +unsigned int entry_length, +unsigned int node) {unsigned int maxp =usb_endpoint_maxp (dep->endpoint.desc);unsigned int rem = req->request.length % maxp;
@@ -1118,6 +1127,9 @@ static void dwc3_prepare_last_sg(struct dwc3_ep *dep,if (num_extra_trbs >0 ) req->needs_extra_trb = true; +if (dwc3_calc_trbs_left (dep) < num_extra_trbs +1 ) +return -EAGAIN ; +/* Prepare a normal TRB */ dwc3_prepare_one_trb (dep, req, entry_length, req->needs_extra_trb, node);
@@ -1145,9 +1157,11 @@ static void dwc3_prepare_last_sg(struct dwc3_ep *dep, req->request.no_interrupt, req->request.is_last); } + +return 0 ; } -static void dwc3_prepare_one_trb_sg (struct dwc3_ep *dep, +static int dwc3_prepare_one_trb_sg (struct dwc3_ep *dep,struct dwc3_request *req) {struct scatterlist *sg = req->start_sg;
@@ -1167,6 +1181,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,for_each_sg (sg, s, remaining, i) {unsigned int trb_length;bool last_sg = false; +int ret; trb_length = min_t(unsigned int, length, sg_dma_len(s));
@@ -1183,9 +1198,13 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, last_sg = true;if (last_sg) -dwc3_prepare_last_sg (dep, req, trb_length, i); + ret =dwc3_prepare_last_sg (dep, req, trb_length, i);else -dwc3_prepare_one_trb (dep, req, trb_length,1 , i); + ret =dwc3_prepare_one_trb (dep, req, trb_length,1 , i); + +/* Ran out of TRBs */ +if (ret) +return ret;/* * There can be a situation where all sgs in sglist are not
@@ -1208,16 +1227,14 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, req->num_pending_sgs -= req->request.num_mapped_sgs - req->num_queued_sgs;break ; } - -if (!dwc3_calc_trbs_left (dep)) -break ; } +return 0 ; } -static void dwc3_prepare_one_trb_linear (struct dwc3_ep *dep, +static int dwc3_prepare_one_trb_linear (struct dwc3_ep *dep,struct dwc3_request *req) { -dwc3_prepare_last_sg (dep, req, req->request.length,0 ); +return dwc3_prepare_last_sg (dep, req, req->request.length,0 ); }/*
@@ -1227,10 +1244,13 @@ static void dwc3_prepare_one_trb_linear(struct dwc3_ep *dep,* The function goes through the requests list and sets up TRBs for the * transfers. The function returns once there are no more TRBs available or * it runs out of requests. +* +* Returns 0 on success or negative errno. */ -static void dwc3_prepare_trbs (struct dwc3_ep *dep) +static int dwc3_prepare_trbs (struct dwc3_ep *dep) {struct dwc3_request *req, *n; +int ret =0 ;BUILD_BUG_ON_NOT_POWER_OF_2 (DWC3_TRB_NUM );
@@ -1245,11 +1265,11 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep)* break things. */ list_for_each_entry (req, &dep->started_list, list) { -if (req->num_pending_sgs >0 ) -dwc3_prepare_one_trb_sg (dep, req); - -if (!dwc3_calc_trbs_left (dep)) -return ; +if (req->num_pending_sgs >0 ) { + ret =dwc3_prepare_one_trb_sg (dep, req); +if (ret) +return ret; + }/* * Don't prepare beyond a transfer. In DWC_usb32, its transfer
@@ -1257,17 +1277,16 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep)* active transfer instead of stopping. */ if (dep->stream_capable && req->request.is_last) -return ; +return 0 ; }list_for_each_entry_safe (req, n, &dep->pending_list, list) {struct dwc3 *dwc = dep->dwc; -int ret; ret =usb_gadget_map_request_by_dev (dwc->sysdev, &req->request, dep->direction);if (ret) -return ; +return ret; req->sg = req->request.sg; req->start_sg = req->sg;
@@ -1275,12 +1294,12 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep) req->num_pending_sgs = req->request.num_mapped_sgs;if (req->num_pending_sgs >0 ) -dwc3_prepare_one_trb_sg (dep, req); + ret =dwc3_prepare_one_trb_sg (dep, req);else -dwc3_prepare_one_trb_linear (dep, req); + ret =dwc3_prepare_one_trb_linear (dep, req); -if (!dwc3_calc_trbs_left (dep)) -return ; +if (ret) +return ret;/* * Don't prepare beyond a transfer. In DWC_usb32, its transfer
@@ -1288,8 +1307,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep)* active transfer instead of stopping. */ if (dep->stream_capable && req->request.is_last) -return ; +return 0 ; } +return 0 ; }static void dwc3_gadget_ep_cleanup_cancelled_requests (struct dwc3_ep *dep);
@@ -1302,12 +1322,12 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep)int ret;u32 cmd; -if (!dwc3_calc_trbs_left (dep)) -return 0 ; - starting = !(dep->flags &DWC3_EP_TRANSFER_STARTED ); -dwc3_prepare_trbs (dep); + ret =dwc3_prepare_trbs (dep); +if (ret) +return 0 ; + req =next_request (&dep->started_list);if (!req) { dep->flags |=DWC3_EP_PENDING_REQUEST ;
Signature · 1 line
2.28.0
Thinh Nguyen
maintainerPATCH v2 6/7 usb: dwc3: gadget: Rename misleading function names
In reply to Thinh NguyenThe functions dwc3_prepare_one_trb_sg and dwc3_prepare_one_trb_linear are not necessarily preparing "one" TRB, it can prepare multiple TRBs. Rename these functions as follow:
dwc3_prepare_one_trb_sg -> dwc3_prepare_trbs_sg dwc3_prepare_one_trb_linear -> dwc3_prepare_trbs_linear
---
Changes in v2:
- None
drivers/usb/dwc3/gadget.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/usb/dwc3/gadget.c +5 -5
@@ -1161,7 +1161,7 @@ static int dwc3_prepare_last_sg(struct dwc3_ep *dep,return 0 ; } -static int dwc3_prepare_one_trb_sg (struct dwc3_ep *dep, +static int dwc3_prepare_trbs_sg (struct dwc3_ep *dep,struct dwc3_request *req) {struct scatterlist *sg = req->start_sg;
@@ -1231,7 +1231,7 @@ static int dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,return 0 ; } -static int dwc3_prepare_one_trb_linear (struct dwc3_ep *dep, +static int dwc3_prepare_trbs_linear (struct dwc3_ep *dep,struct dwc3_request *req) {return dwc3_prepare_last_sg (dep, req, req->request.length,0 );
@@ -1266,7 +1266,7 @@ static int dwc3_prepare_trbs(struct dwc3_ep *dep)*/ list_for_each_entry (req, &dep->started_list, list) {if (req->num_pending_sgs >0 ) { - ret =dwc3_prepare_one_trb_sg (dep, req); + ret =dwc3_prepare_trbs_sg (dep, req);if (ret)return ret; }
@@ -1294,9 +1294,9 @@ static int dwc3_prepare_trbs(struct dwc3_ep *dep) req->num_pending_sgs = req->request.num_mapped_sgs;if (req->num_pending_sgs >0 ) - ret =dwc3_prepare_one_trb_sg (dep, req); + ret =dwc3_prepare_trbs_sg (dep, req);else - ret =dwc3_prepare_one_trb_linear (dep, req); + ret =dwc3_prepare_trbs_linear (dep, req);if (ret)return ret;
Signature · 1 line
2.28.0
Re: [PATCH v2 6/7] usb: dwc3: gadget: Rename misleading function names
Quoted 8 lines · Thinh Nguyen
The functions
dwc3_prepare_one_trb_sganddwc3_prepare_one_trb_linearare not necessarily preparing "one" TRB, it can prepare multiple TRBs. Rename these functions as follow:
dwc3_prepare_one_trb_sg->dwc3_prepare_trbs_sgdwc3_prepare_one_trb_linear->dwc3_prepare_trbs_linearSigned-off-by Thinh Nguyen <[email protected]>
Tried to apply on top of -rc6:
checking file drivers/usb/dwc3/gadget.c
Hunk #1 FAILED at 1161.
Hunk #2 FAILED at 1231.
Hunk #3 FAILED at 1266.
Hunk #4 FAILED at 1294.
4 out of 4 hunks FAILED
Signature · 1 line
balbi
Thinh Nguyen
maintainerRe: [PATCH v2 6/7] usb: dwc3: gadget: Rename misleading function names
Hi Felipe,
Quoted 10 lines · Felipe Balbi
Quoted 8 lines · Thinh Nguyen
The functions
dwc3_prepare_one_trb_sganddwc3_prepare_one_trb_linearare not necessarily preparing "one" TRB, it can prepare multiple TRBs. Rename these functions as follow:
dwc3_prepare_one_trb_sg->dwc3_prepare_trbs_sgdwc3_prepare_one_trb_linear->dwc3_prepare_trbs_linearSigned-off-by Thinh Nguyen <[email protected]>
Quoted 9 lines
Tried to apply on top of -rc6:
checking file
drivers/usb/dwc3/gadget.c
Hunk #1 FAILED at 1161.
Hunk #2 FAILED at 1231.
Hunk #3 FAILED at 1266.
Hunk #4 FAILED at 1294.
4 out of 4 hunks FAILED
I'll rebase send out a new series with a bunch of fixes.
Btw, the patches you just merged are not the latest:
usb: dwc3: gadget: Resume pending requests after CLEAR_STALL
usb: dwc3: gadget: END_TRANSFER before CLEAR_STALL command
The latest are on your "testing/fixes" branch
Thanks,
Thinh
Re: [PATCH v2 6/7] usb: dwc3: gadget: Rename misleading function names
Quoted 23 lines · Thinh Nguyen
Hi Felipe,
Quoted 10 lines · Felipe Balbi
Quoted 8 lines · Thinh Nguyen
The functions
dwc3_prepare_one_trb_sganddwc3_prepare_one_trb_linearare not necessarily preparing "one" TRB, it can prepare multiple TRBs. Rename these functions as follow:
dwc3_prepare_one_trb_sg->dwc3_prepare_trbs_sgdwc3_prepare_one_trb_linear->dwc3_prepare_trbs_linearSigned-off-by Thinh Nguyen <[email protected]>Quoted 9 lines
Tried to apply on top of -rc6:
checking file
drivers/usb/dwc3/gadget.c
Hunk #1 FAILED at 1161.
Hunk #2 FAILED at 1231.
Hunk #3 FAILED at 1266.
Hunk #4 FAILED at 1294.
4 out of 4 hunks FAILED
Quoted 7 lines
I'll rebase send out a new series with a bunch of fixes.
Btw, the patches you just merged are not the latest:
usb: dwc3: gadget: Resume pending requests afterCLEAR_STALL
usb: dwc3: gadget:END_TRANSFERbeforeCLEAR_STALLcommandThe latest are on your "testing/fixes" branch
Argh, nice catch. I'll fix it shortly.
Signature · 1 line
balbi
Re: [PATCH v2 6/7] usb: dwc3: gadget: Rename misleading function names
Hi,
Quoted 27 lines · Felipe Balbi
Quoted 25 lines · Thinh Nguyen
Hi Felipe,
Quoted 10 lines · Felipe Balbi
Quoted 8 lines · Thinh Nguyen
The functions
dwc3_prepare_one_trb_sganddwc3_prepare_one_trb_linearare not necessarily preparing "one" TRB, it can prepare multiple TRBs. Rename these functions as follow:
dwc3_prepare_one_trb_sg->dwc3_prepare_trbs_sgdwc3_prepare_one_trb_linear->dwc3_prepare_trbs_linearSigned-off-by Thinh Nguyen <[email protected]>Quoted 9 lines
Tried to apply on top of -rc6:
checking file
drivers/usb/dwc3/gadget.c
Hunk #1 FAILED at 1161.
Hunk #2 FAILED at 1231.
Hunk #3 FAILED at 1266.
Hunk #4 FAILED at 1294.
4 out of 4 hunks FAILEDI'll rebase send out a new series with a bunch of fixes.
Quoted 7 lines
Quoted 5 lines
Btw, the patches you just merged are not the latest:
usb: dwc3: gadget: Resume pending requests afterCLEAR_STALL
usb: dwc3: gadget:END_TRANSFERbeforeCLEAR_STALLcommandThe latest are on your "testing/fixes" branch
Argh, nice catch. I'll fix it shortly.
should be corrected now. Thanks
Signature · 1 line
balbi
Thinh Nguyen
maintainerPATCH v2 7/7 usb: dwc3: ep0: Skip ZLP setup for OUT
In reply to Thinh NguyenThe current implementation for ZLP handling of usb_request->zero for ep0 is only for control IN requests. For OUT direction, DWC3 needs to check and set up for MPS boundary alignment, and it doesn't do that at the moment.
Usually, control OUT requests can indicate its transfer size via the wLength field of the control message. So usb_request->zero is usually not needed for OUT direction. To handle ZLP OUT for control endpoint, we'd need to allocate at least 3 TRBs for control requests (we have 2 at the moment). For now, let's just make sure the current ZLP setup is only for IN direction.
---
Changes in v2:
- None
drivers/usb/dwc3/ep0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc3/ep0.c +1 -1
@@ -979,7 +979,7 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, false); ret =dwc3_ep0_start_trans (dep); }else if (IS_ALIGNED (req->request.length, dep->endpoint.maxpacket) && - req->request.length && req->request.zero) { + req->request.length && req->request.zero && req->direction) { ret =usb_gadget_map_request_by_dev (dwc->sysdev, &req->request, dep->number);
Signature · 1 line
2.28.0