diff options
author | Tang, Jianqiang <jianqiang.tang@intel.com> | 2016-02-16 18:02:07 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@kernel.org> | 2016-02-17 03:32:09 -0500 |
commit | 62943b7dfa35887a40f71f698deec4488bf73036 (patch) | |
tree | 2fa89d1d3842c58033fcd72d8b4df924ed5fe7b6 | |
parent | 3142a16b9816c24501103a92010a283eb6e2766c (diff) |
usb: dwc2: host: fix the data toggle error in full speed descriptor dma
There will be data toggle error happen for full speed buld-out transfer.
The data toggle bit is saved in qh for non-control transfers, it is wrong
to check the qtd for that case.
Also fix one static analysis tool issue after fix the data toggle error.
John Youn:
* Added WARN() to warn on improper usage of the
dwc2_hcd_save_data_toggle() function.
Signed-off-by: Dyson Lee <dyson.lee@intel.com>
Signed-off-by: Tang, Jianqiang <jianqiang.tang@intel.com>
Signed-off-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
-rw-r--r-- | drivers/usb/dwc2/hcd_ddma.c | 2 | ||||
-rw-r--r-- | drivers/usb/dwc2/hcd_intr.c | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/drivers/usb/dwc2/hcd_ddma.c b/drivers/usb/dwc2/hcd_ddma.c index 89db47a1ffed..a41274aa52ad 100644 --- a/drivers/usb/dwc2/hcd_ddma.c +++ b/drivers/usb/dwc2/hcd_ddma.c | |||
@@ -1257,7 +1257,7 @@ stop_scan: | |||
1257 | */ | 1257 | */ |
1258 | if (halt_status == DWC2_HC_XFER_STALL) | 1258 | if (halt_status == DWC2_HC_XFER_STALL) |
1259 | qh->data_toggle = DWC2_HC_PID_DATA0; | 1259 | qh->data_toggle = DWC2_HC_PID_DATA0; |
1260 | else if (qtd) | 1260 | else |
1261 | dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); | 1261 | dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); |
1262 | } | 1262 | } |
1263 | 1263 | ||
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c index f8253803a050..cadba8b13c48 100644 --- a/drivers/usb/dwc2/hcd_intr.c +++ b/drivers/usb/dwc2/hcd_intr.c | |||
@@ -525,11 +525,19 @@ void dwc2_hcd_save_data_toggle(struct dwc2_hsotg *hsotg, | |||
525 | u32 pid = (hctsiz & TSIZ_SC_MC_PID_MASK) >> TSIZ_SC_MC_PID_SHIFT; | 525 | u32 pid = (hctsiz & TSIZ_SC_MC_PID_MASK) >> TSIZ_SC_MC_PID_SHIFT; |
526 | 526 | ||
527 | if (chan->ep_type != USB_ENDPOINT_XFER_CONTROL) { | 527 | if (chan->ep_type != USB_ENDPOINT_XFER_CONTROL) { |
528 | if (WARN(!chan || !chan->qh, | ||
529 | "chan->qh must be specified for non-control eps\n")) | ||
530 | return; | ||
531 | |||
528 | if (pid == TSIZ_SC_MC_PID_DATA0) | 532 | if (pid == TSIZ_SC_MC_PID_DATA0) |
529 | chan->qh->data_toggle = DWC2_HC_PID_DATA0; | 533 | chan->qh->data_toggle = DWC2_HC_PID_DATA0; |
530 | else | 534 | else |
531 | chan->qh->data_toggle = DWC2_HC_PID_DATA1; | 535 | chan->qh->data_toggle = DWC2_HC_PID_DATA1; |
532 | } else { | 536 | } else { |
537 | if (WARN(!qtd, | ||
538 | "qtd must be specified for control eps\n")) | ||
539 | return; | ||
540 | |||
533 | if (pid == TSIZ_SC_MC_PID_DATA0) | 541 | if (pid == TSIZ_SC_MC_PID_DATA0) |
534 | qtd->data_toggle = DWC2_HC_PID_DATA0; | 542 | qtd->data_toggle = DWC2_HC_PID_DATA0; |
535 | else | 543 | else |