AR-1 - Adding support category for distributions AR-4 - Remove Allwinner legacy AR-5 - Drop Udoo family and move Udoo board into newly created imx6 family AR-9 - Rename sunxi-next to sunxi-legacy AR-10 - Rename sunxi-dev to sunxi-current AR-11 - Adding Radxa Rockpi S support AR-13 - Rename rockchip64-default to rockchip64-legacy AR-14 - Add rockchip64-current as mainline source AR-15 - Drop Rockchip 4.19.y NEXT, current become 5.3.y AR-16 - Rename RK3399 default to legacy AR-17 - Rename Odroid XU4 next and default to legacy 4.14.y, add DEV 5.4.y AR-18 - Add Odroid N2 current mainline AR-19 - Move Odroid C1 to meson family AR-20 - Rename mvebu64-default to mvebu64-legacy AR-21 - Rename mvebu-default to mvebu-legacy AR-22 - Rename mvebu-next to mvebu-current AR-23 - Drop meson64 default and next, current becomes former DEV 5.3.y AR-24 - Drop cubox family and move Cubox/Hummingboard boards under imx6 AR-26 - Adjust motd AR-27 - Enabling distribution release status AR-28 - Added new GCC compilers AR-29 - Implementing Ubuntu Eoan AR-30 - Add desktop packages per board or family AR-31 - Remove (Ubuntu/Debian) distribution name from image filename AR-32 - Move arch configs from configuration.sh to separate arm64 and armhf config files AR-33 - Revision numbers for beta builds changed to day_in_the_year AR-34 - Patches support linked patches AR-35 - Break meson64 family into gxbb and gxl AR-36 - Add Nanopineo2 Black AR-38 - Upgrade option from old branches to new one via armbian-config AR-41 - Show full timezone info AR-43 - Merge Odroid N2 to meson64 AR-44 - Enable FORCE_BOOTSCRIPT_UPDATE for all builds
108 lines
3.7 KiB
Diff
108 lines
3.7 KiB
Diff
From cfe2329be3af16b324a2e338ad29484f36e753ab Mon Sep 17 00:00:00 2001
|
|
From: Bin Yang <yangbin@rock-chips.com>
|
|
Date: Wed, 29 Mar 2017 17:43:23 +0800
|
|
Subject: [PATCH] USB: fix handle NAK for IN/OUT SSPLIT/CSPLIT transfers
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
IN SSPLIT/CSPLIT transfers, NAK packet will cause DWC_OTG
|
|
ctrl to generate lots of SSPLIT/CSPLIT transfer interrupts,
|
|
and seriously affect the performance of the system. So need
|
|
to stop queue transactions after receive SSPLIT/CSPLIT NAK.
|
|
|
|
Change-Id: Ie1b1e9e6971c6546a4239a10b06fba7360978ce0
|
|
Signed-off-by: Wu Liang feng <wulf@rock-chips.com>
|
|
Reviewed-on: https://tp-biosrd-v02/gerrit/80149
|
|
Reviewed-by: Scorpio Chang(張志賢) <Scorpio_Chang@asus.com>
|
|
Tested-by: Scorpio Chang(張志賢) <Scorpio_Chang@asus.com>
|
|
---
|
|
drivers/usb/dwc2/hcd.c | 2 ++
|
|
drivers/usb/dwc2/hcd.h | 1 +
|
|
drivers/usb/dwc2/hcd_intr.c | 19 ++++++++++++++-----
|
|
3 files changed, 17 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
|
|
index 3ed5d3398831..7bca8ffe9146 100644
|
|
--- a/drivers/usb/dwc2/hcd.c
|
|
+++ b/drivers/usb/dwc2/hcd.c
|
|
@@ -2700,6 +2700,8 @@ static int dwc2_assign_and_init_hc(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
|
|
chan->xfer_len = urb->length - urb->actual_length;
|
|
chan->xfer_count = 0;
|
|
|
|
+ chan->csplit_nak = 0;
|
|
+
|
|
/* Set the split attributes if required */
|
|
if (qh->do_split)
|
|
dwc2_hc_init_split(hsotg, chan, qtd, urb);
|
|
diff --git a/drivers/usb/dwc2/hcd.h b/drivers/usb/dwc2/hcd.h
|
|
index 7758bfb644ff..91091d9009ef 100755
|
|
--- a/drivers/usb/dwc2/hcd.h
|
|
+++ b/drivers/usb/dwc2/hcd.h
|
|
@@ -142,6 +142,7 @@ struct dwc2_host_chan {
|
|
u8 halt_pending;
|
|
u8 do_split;
|
|
u8 complete_split;
|
|
+ u8 csplit_nak;
|
|
u8 hub_addr;
|
|
u8 hub_port;
|
|
u8 xact_pos;
|
|
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c
|
|
index 906f223542ee..d0ee6fb3d088 100644
|
|
--- a/drivers/usb/dwc2/hcd_intr.c
|
|
+++ b/drivers/usb/dwc2/hcd_intr.c
|
|
@@ -691,6 +691,7 @@ static void dwc2_release_channel(struct dwc2_hsotg *hsotg,
|
|
enum dwc2_transaction_type tr_type;
|
|
u32 haintmsk;
|
|
int free_qtd = 0;
|
|
+ int continue_trans = 1;
|
|
|
|
if (dbg_hc(chan))
|
|
dev_vdbg(hsotg->dev, " %s: channel %d, halt_status %d\n",
|
|
@@ -719,6 +720,7 @@ static void dwc2_release_channel(struct dwc2_hsotg *hsotg,
|
|
* deactivated. Don't want to do anything except release the
|
|
* host channel and try to queue more transfers.
|
|
*/
|
|
+ continue_trans = 0;
|
|
goto cleanup;
|
|
case DWC2_HC_XFER_PERIODIC_INCOMPLETE:
|
|
dev_vdbg(hsotg->dev, " Complete URB with I/O error\n");
|
|
@@ -730,6 +732,10 @@ static void dwc2_release_channel(struct dwc2_hsotg *hsotg,
|
|
break;
|
|
}
|
|
|
|
+ if (chan->csplit_nak) {
|
|
+ continue_trans = 0;
|
|
+ chan->csplit_nak = 0;
|
|
+ }
|
|
dwc2_deactivate_qh(hsotg, chan->qh, free_qtd);
|
|
|
|
cleanup:
|
|
@@ -767,11 +773,13 @@ static void dwc2_release_channel(struct dwc2_hsotg *hsotg,
|
|
dwc2_writel(haintmsk, hsotg->regs + HAINTMSK);
|
|
|
|
/* Try to queue more transfers now that there's a free channel */
|
|
- tr_type = dwc2_hcd_select_transactions(hsotg);
|
|
- if (tr_type != DWC2_TRANSACTION_NONE)
|
|
- dwc2_hcd_queue_transactions(hsotg, tr_type);
|
|
-}
|
|
-
|
|
+ if (continue_trans) {
|
|
+ tr_type = dwc2_hcd_select_transactions(hsotg);
|
|
+ if (tr_type != DWC2_TRANSACTION_NONE)
|
|
+ dwc2_hcd_queue_transactions(hsotg, tr_type);
|
|
+ }
|
|
+ }
|
|
+
|
|
/*
|
|
* Halts a host channel. If the channel cannot be halted immediately because
|
|
* the request queue is full, this function ensures that the FIFO empty
|
|
@@ -1199,6 +1207,7 @@ static void dwc2_hc_nak_intr(struct dwc2_hsotg *hsotg,
|
|
if (chan->do_split) {
|
|
if (chan->complete_split)
|
|
qtd->error_count = 0;
|
|
+ chan->csplit_nak = 1;
|
|
qtd->complete_split = 0;
|
|
dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK);
|
|
goto handle_nak_done;
|