* [PATCH] usb: dwc3: gadget: Check for prepared TRBs
@ 2020-05-15 23:40 Thinh Nguyen
2020-05-16 1:50 ` kbuild test robot
0 siblings, 1 reply; 3+ messages in thread
From: Thinh Nguyen @ 2020-05-15 23:40 UTC (permalink / raw)
To: Felipe Balbi, Greg Kroah-Hartman, linux-usb; +Cc: John Youn, Thinh Nguyen
There are cases where the endpoint needs to be restarted. For example,
it may need to restart for NoStream rejection to reinitiate stream. If
so, check and make sure we don't prepare beyond the current transfer
when we restart the endpoint.
DWC_usb32 internal burst transfer feature will look into TRBs beyond a
transfer. Other controllers will stop on the last TRB, but not
DWC_usb32. This may cause the controller to incorrectly process TRBs of
a different transfer. Make sure to explicitly prevent preparing TRBs of
a different transfer.
This should only affect DWC_usb32 releases prior to v1.00a since it
doesn't use SET_ENDPOINT_PRIME to reinitiate stream. However, it's
better to be cautious in case users don't want to use SET_ENDPOINT_PRIME
command. Also, it's possible other controller IPs may share the same
features as DWC_usb32 in new releases.
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
---
drivers/usb/dwc3/gadget.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index fea4fde1b5e3..45b7e6dca781 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1232,6 +1232,14 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep)
if (!dwc3_calc_trbs_left(dep))
return;
+
+ /*
+ * Don't prepare beyond a transfer. In DWC_usb32, its transfer
+ * burst capability may try to read and use TRBs beyond the
+ * active transfer instead of stopping.
+ */
+ if (dep->stream_capable && req->request.is_last)
+ return;
}
list_for_each_entry_safe(req, n, &dep->pending_list, list) {
--
2.11.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] usb: dwc3: gadget: Check for prepared TRBs
2020-05-15 23:40 [PATCH] usb: dwc3: gadget: Check for prepared TRBs Thinh Nguyen
@ 2020-05-16 1:50 ` kbuild test robot
2020-05-16 2:04 ` Thinh Nguyen
0 siblings, 1 reply; 3+ messages in thread
From: kbuild test robot @ 2020-05-16 1:50 UTC (permalink / raw)
To: Thinh Nguyen, Felipe Balbi, Greg Kroah-Hartman, linux-usb
Cc: kbuild-all, John Youn, Thinh Nguyen
[-- Attachment #1: Type: text/plain, Size: 3627 bytes --]
Hi Thinh,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on balbi-usb/next]
[also build test ERROR on usb/usb-testing peter.chen-usb/ci-for-usb-next v5.7-rc5 next-20200515]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Thinh-Nguyen/usb-dwc3-gadget-Check-for-prepared-TRBs/20200516-074413
base: https://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git next
config: i386-allyesconfig (attached as .config)
compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>, old ones prefixed by <<):
drivers/usb/dwc3/gadget.c: In function 'dwc3_prepare_trbs':
>> drivers/usb/dwc3/gadget.c:1203:42: error: 'struct usb_request' has no member named 'is_last'
if (dep->stream_capable && req->request.is_last)
^
vim +1203 drivers/usb/dwc3/gadget.c
1166
1167 /*
1168 * dwc3_prepare_trbs - setup TRBs from requests
1169 * @dep: endpoint for which requests are being prepared
1170 *
1171 * The function goes through the requests list and sets up TRBs for the
1172 * transfers. The function returns once there are no more TRBs available or
1173 * it runs out of requests.
1174 */
1175 static void dwc3_prepare_trbs(struct dwc3_ep *dep)
1176 {
1177 struct dwc3_request *req, *n;
1178
1179 BUILD_BUG_ON_NOT_POWER_OF_2(DWC3_TRB_NUM);
1180
1181 /*
1182 * We can get in a situation where there's a request in the started list
1183 * but there weren't enough TRBs to fully kick it in the first time
1184 * around, so it has been waiting for more TRBs to be freed up.
1185 *
1186 * In that case, we should check if we have a request with pending_sgs
1187 * in the started list and prepare TRBs for that request first,
1188 * otherwise we will prepare TRBs completely out of order and that will
1189 * break things.
1190 */
1191 list_for_each_entry(req, &dep->started_list, list) {
1192 if (req->num_pending_sgs > 0)
1193 dwc3_prepare_one_trb_sg(dep, req);
1194
1195 if (!dwc3_calc_trbs_left(dep))
1196 return;
1197
1198 /*
1199 * Don't prepare beyond a transfer. In DWC_usb32, its transfer
1200 * burst capability may try to read and use TRBs beyond the
1201 * active transfer instead of stopping.
1202 */
> 1203 if (dep->stream_capable && req->request.is_last)
1204 return;
1205 }
1206
1207 list_for_each_entry_safe(req, n, &dep->pending_list, list) {
1208 struct dwc3 *dwc = dep->dwc;
1209 int ret;
1210
1211 ret = usb_gadget_map_request_by_dev(dwc->sysdev, &req->request,
1212 dep->direction);
1213 if (ret)
1214 return;
1215
1216 req->sg = req->request.sg;
1217 req->start_sg = req->sg;
1218 req->num_queued_sgs = 0;
1219 req->num_pending_sgs = req->request.num_mapped_sgs;
1220
1221 if (req->num_pending_sgs > 0)
1222 dwc3_prepare_one_trb_sg(dep, req);
1223 else
1224 dwc3_prepare_one_trb_linear(dep, req);
1225
1226 if (!dwc3_calc_trbs_left(dep))
1227 return;
1228 }
1229 }
1230
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 71303 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] usb: dwc3: gadget: Check for prepared TRBs
2020-05-16 1:50 ` kbuild test robot
@ 2020-05-16 2:04 ` Thinh Nguyen
0 siblings, 0 replies; 3+ messages in thread
From: Thinh Nguyen @ 2020-05-16 2:04 UTC (permalink / raw)
To: kbuild test robot, Thinh Nguyen, Felipe Balbi,
Greg Kroah-Hartman, linux-usb
Cc: kbuild-all, John Youn
kbuild test robot wrote:
> Hi Thinh,
>
> Thank you for the patch! Yet something to improve:
>
> [auto build test ERROR on balbi-usb/next]
> [also build test ERROR on usb/usb-testing peter.chen-usb/ci-for-usb-next v5.7-rc5 next-20200515]
> [if your patch is applied to the wrong git tree, please drop us a note to help
> improve the system.
Just dropping a note:
This patch is base on Felipe's testing/next branch.
BR,
Thinh
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-05-16 2:31 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-15 23:40 [PATCH] usb: dwc3: gadget: Check for prepared TRBs Thinh Nguyen
2020-05-16 1:50 ` kbuild test robot
2020-05-16 2:04 ` Thinh Nguyen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).