Fixes and workarounds for dwc2 on HiKey board (rebased to synopsys-usb/next)
Subsystems (2)
v3 cover Fixes and workarounds for dwc2 on HiKey board (rebased to synopsys-usb/next)
Just wanted to resend my patches for dwc2 controller on the HiKey board for consideration for the 4.11 merge window.
This patchset is the same as v2, only rebased against John's synopsys-usb/next branch.
This does still exclude my patchset[1] to add extcon support to dwc2, which John Youn suspects a pending rework of the dwc2 fifo init logic might make unnecssary.
thanks
-john
[1] https://lkml.org/lkml/2016/12/6/69
v2:
* Reworked goto logic in patch #2, as suggested by Vardan v3:
* Rebased to synopsys-usb/next
Chen Yu (2):
usb: dwc2: Force port resume on switching to device mode
usb: dwc2: Add a quirk to allow speed negotiation for Hisilicon Hi6220
John Stultz (2):
usb: dwc2: Avoid sleeping while holding hsotg->lock
usb: dwc2: Workaround case where GOTGCTL state is wrong
drivers/usb/dwc2/core.c | 6 ++-- drivers/usb/dwc2/core.h | 9 +++++- drivers/usb/dwc2/gadget.c | 2 +- drivers/usb/dwc2/hcd.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/usb/dwc2/params.c | 1 + 5 files changed, 89 insertions(+), 5 deletions(-)
Signature · 1 line
2.7.4
PATCH v3 1/4 usb: dwc2: Avoid sleeping while holding hsotg->lock
Basically when plugging in various cables in different orders, I'm occasionally seeing the following BUG splat:
[ 86.215403] BUG: scheduling while atomic: kworker/u16:2/53/0x00000002
[ 86.219164] usb 1-1: USB disconnect, device number 9
[ 86.226845] Preemption disabled at:[ 86.230218]
[<ffffff8008673558>] dwc2_conn_id_status_change+0x120/0x250
[ 86.236894] CPU: 0 PID: 53 Comm: kworker/u16:2 Tainted: G W
4.9.0-rc8-00051-gd5a7979-dirty #1702
[ 86.246836] Hardware name: HiKey Development Board (DT)
[ 86.252100] Workqueue: dwc2 dwc2_conn_id_status_change
[ 86.257279] Call trace:
[ 86.259771] [<ffffff8008087c28>] dump_backtrace+0x0/0x1a0
[ 86.265210] [<ffffff8008087ddc>] show_stack+0x14/0x20
[ 86.270308] [<ffffff80084343f0>] dump_stack+0x90/0xb0
[ 86.275401] [<ffffff80080d8d94>] __schedule_bug+0x6c/0xb8
[ 86.280841] [<ffffff8008a07220>] __schedule+0x4f8/0x5b0
[ 86.286099] [<ffffff8008a073e8>] schedule+0x38/0xa0
[ 86.291017] [<ffffff8008a0a6cc>] schedule_hrtimeout_range_clock+0x8c/0xf0
[ 86.297846] [<ffffff8008a0a740>] schedule_hrtimeout_range+0x10/0x18
[ 86.304150] [<ffffff8008a0a4a0>] usleep_range+0x50/0x58
[ 86.309418] [<ffffff800866d8dc>] dwc2_wait_for_mode.isra.4+0x54/0xd0
[ 86.315815] [<ffffff800866f058>] dwc2_core_reset+0xe0/0x168
[ 86.321431] [<ffffff800867e364>] dwc2_hsotg_core_init_disconnected+0x2c/0x310
[ 86.328602] [<ffffff8008673568>] dwc2_conn_id_status_change+0x130/0x250
[ 86.335254] [<ffffff80080ccd48>] process_one_work+0x118/0x370
[ 86.341035] [<ffffff80080ccfe8>] worker_thread+0x48/0x498
[ 86.346473] [<ffffff80080d2eb0>] kthread+0xd0/0xe8
[ 86.351299] [<ffffff8008082e80>] ret_from_fork+0x10/0x50This seems to be caused by the dwc2_wait_for_mode() calling usleep_range() while the hstog->lock spinlock is held, since we take that before calling dwc2_hsotg_core_init_disconnected().
This patch avoids the issue by adding an extra argument to dwc2_core_reset(), as suggested by John Youn, which allows us to skip the waiting, which should be unnecessary when calling from dwc2_hsotg_core_init_disconnected().
---
v3:
* Rebased to synopsys-usb/next branch
drivers/usb/dwc2/core.c | 6 +++--- drivers/usb/dwc2/core.h | 2 +- drivers/usb/dwc2/gadget.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-)
drivers/usb/dwc2/core.c +3 -3
@@ -313,7 +313,7 @@ static bool dwc2_iddig_filter_enabled(struct dwc2_hsotg *hsotg)* Do core a soft reset of the core. Be careful with this because it * resets all the internal state machines of the core. */ -int dwc2_core_reset (struct dwc2_hsotg *hsotg) +int dwc2_core_reset (struct dwc2_hsotg *hsotg,bool skip_wait) {u32 greset;int count =0 ;
@@ -369,7 +369,7 @@ int dwc2_core_reset(struct dwc2_hsotg *hsotg) } }while (!(greset &GRSTCTL_AHBIDLE )); -if (wait_for_host_mode) +if (wait_for_host_mode && !skip_wait)dwc2_wait_for_mode (hsotg, true);return 0 ;
@@ -500,7 +500,7 @@ int dwc2_core_reset_and_force_dr_mode(struct dwc2_hsotg *hsotg) {int retval; - retval =dwc2_core_reset (hsotg); + retval =dwc2_core_reset (hsotg, false);if (retval)return retval;
drivers/usb/dwc2/core.h +1 -1
@@ -1089,7 +1089,7 @@ static inline bool dwc2_is_hs_iot(struct dwc2_hsotg *hsotg)* The following functions support initialization of the core driver component * and the DWC_otg controller */ -int dwc2_core_reset (struct dwc2_hsotg *hsotg); +int dwc2_core_reset (struct dwc2_hsotg *hsotg,bool skip_wait);int dwc2_core_reset_and_force_dr_mode (struct dwc2_hsotg *hsotg);int dwc2_enter_hibernation (struct dwc2_hsotg *hsotg);int dwc2_exit_hibernation (struct dwc2_hsotg *hsotg,bool restore);
drivers/usb/dwc2/gadget.c +1 -1
@@ -3161,7 +3161,7 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,kill_all_requests (hsotg, hsotg->eps_out[0 ], -ECONNRESET );if (!is_usb_reset) -if (dwc2_core_reset (hsotg)) +if (dwc2_core_reset (hsotg, true))return ;/*
Signature · 1 line
2.7.4
Re: [PATCH 1/4 v3] usb: dwc2: Avoid sleeping while holding hsotg->lock
Hi,
Quoted 52 lines · John Stultz
Basically when plugging in various cables in different orders, I'm occasionally seeing the following BUG splat:
[ 86.215403] BUG: scheduling while atomic: kworker/u16:2/53/0x00000002 [ 86.219164] usb 1-1: USB disconnect, device number 9 [ 86.226845] Preemption disabled at:[ 86.230218] [<ffffff8008673558>] dwc2_conn_id_status_change+0x120/0x250 [ 86.236894] CPU: 0 PID: 53 Comm: kworker/u16:2 Tainted: G W 4.9.0-rc8-00051-gd5a7979-dirty #1702 [ 86.246836] Hardware name: HiKey Development Board (DT) [ 86.252100] Workqueue: dwc2 dwc2_conn_id_status_change [ 86.257279] Call trace: [ 86.259771] [<ffffff8008087c28>] dump_backtrace+0x0/0x1a0 [ 86.265210] [<ffffff8008087ddc>] show_stack+0x14/0x20 [ 86.270308] [<ffffff80084343f0>] dump_stack+0x90/0xb0 [ 86.275401] [<ffffff80080d8d94>] __schedule_bug+0x6c/0xb8 [ 86.280841] [<ffffff8008a07220>] __schedule+0x4f8/0x5b0 [ 86.286099] [<ffffff8008a073e8>] schedule+0x38/0xa0 [ 86.291017] [<ffffff8008a0a6cc>] schedule_hrtimeout_range_clock+0x8c/0xf0 [ 86.297846] [<ffffff8008a0a740>] schedule_hrtimeout_range+0x10/0x18 [ 86.304150] [<ffffff8008a0a4a0>] usleep_range+0x50/0x58 [ 86.309418] [<ffffff800866d8dc>] dwc2_wait_for_mode.isra.4+0x54/0xd0 [ 86.315815] [<ffffff800866f058>] dwc2_core_reset+0xe0/0x168 [ 86.321431] [<ffffff800867e364>] dwc2_hsotg_core_init_disconnected+0x2c/0x310 [ 86.328602] [<ffffff8008673568>] dwc2_conn_id_status_change+0x130/0x250 [ 86.335254] [<ffffff80080ccd48>] process_one_work+0x118/0x370 [ 86.341035] [<ffffff80080ccfe8>] worker_thread+0x48/0x498 [ 86.346473] [<ffffff80080d2eb0>] kthread+0xd0/0xe8 [ 86.351299] [<ffffff8008082e80>] ret_from_fork+0x10/0x50This seems to be caused by the
dwc2_wait_for_mode()callingusleep_range()while thehstog->lockspinlock is held, since we take that before callingdwc2_hsotg_core_init_disconnected().This patch avoids the issue by adding an extra argument to
dwc2_core_reset(), as suggested by John Youn, which allows us to skip the waiting, which should be unnecessary when calling fromdwc2_hsotg_core_init_disconnected().Cc Wei Xu <[email protected]>Cc Guodong Xu <[email protected]>Cc Amit Pundir <[email protected]>Cc Rob Herring <[email protected]>Cc John Youn <[email protected]>Cc Douglas Anderson <[email protected]>Cc Chen Yu <[email protected]>Cc Vardan Mikayelyan <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Felipe Balbi <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by John Stultz <[email protected]>
Quoted 1 line
---
doesn't apply to my testing/next. Please rebase
Signature · 1 line
balbi
Re: [PATCH 1/4 v3] usb: dwc2: Avoid sleeping while holding hsotg->lock
Quoted 58 lines · Felipe Balbi
Hi,
Quoted 52 lines · John Stultz
Basically when plugging in various cables in different orders, I'm occasionally seeing the following BUG splat:
[ 86.215403] BUG: scheduling while atomic: kworker/u16:2/53/0x00000002 [ 86.219164] usb 1-1: USB disconnect, device number 9 [ 86.226845] Preemption disabled at:[ 86.230218] [<ffffff8008673558>] dwc2_conn_id_status_change+0x120/0x250 [ 86.236894] CPU: 0 PID: 53 Comm: kworker/u16:2 Tainted: G W 4.9.0-rc8-00051-gd5a7979-dirty #1702 [ 86.246836] Hardware name: HiKey Development Board (DT) [ 86.252100] Workqueue: dwc2 dwc2_conn_id_status_change [ 86.257279] Call trace: [ 86.259771] [<ffffff8008087c28>] dump_backtrace+0x0/0x1a0 [ 86.265210] [<ffffff8008087ddc>] show_stack+0x14/0x20 [ 86.270308] [<ffffff80084343f0>] dump_stack+0x90/0xb0 [ 86.275401] [<ffffff80080d8d94>] __schedule_bug+0x6c/0xb8 [ 86.280841] [<ffffff8008a07220>] __schedule+0x4f8/0x5b0 [ 86.286099] [<ffffff8008a073e8>] schedule+0x38/0xa0 [ 86.291017] [<ffffff8008a0a6cc>] schedule_hrtimeout_range_clock+0x8c/0xf0 [ 86.297846] [<ffffff8008a0a740>] schedule_hrtimeout_range+0x10/0x18 [ 86.304150] [<ffffff8008a0a4a0>] usleep_range+0x50/0x58 [ 86.309418] [<ffffff800866d8dc>] dwc2_wait_for_mode.isra.4+0x54/0xd0 [ 86.315815] [<ffffff800866f058>] dwc2_core_reset+0xe0/0x168 [ 86.321431] [<ffffff800867e364>] dwc2_hsotg_core_init_disconnected+0x2c/0x310 [ 86.328602] [<ffffff8008673568>] dwc2_conn_id_status_change+0x130/0x250 [ 86.335254] [<ffffff80080ccd48>] process_one_work+0x118/0x370 [ 86.341035] [<ffffff80080ccfe8>] worker_thread+0x48/0x498 [ 86.346473] [<ffffff80080d2eb0>] kthread+0xd0/0xe8 [ 86.351299] [<ffffff8008082e80>] ret_from_fork+0x10/0x50This seems to be caused by the
dwc2_wait_for_mode()callingusleep_range()while thehstog->lockspinlock is held, since we take that before callingdwc2_hsotg_core_init_disconnected().This patch avoids the issue by adding an extra argument to
dwc2_core_reset(), as suggested by John Youn, which allows us to skip the waiting, which should be unnecessary when calling fromdwc2_hsotg_core_init_disconnected().Cc Wei Xu <[email protected]>Cc Guodong Xu <[email protected]>Cc Amit Pundir <[email protected]>Cc Rob Herring <[email protected]>Cc John Youn <[email protected]>Cc Douglas Anderson <[email protected]>Cc Chen Yu <[email protected]>Cc Vardan Mikayelyan <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Felipe Balbi <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by John Stultz <[email protected]>Quoted 1 line
---
Quoted 1 line
doesn't apply to my testing/next. Please rebase
So these were rebased onto JohnY's tree here:
https://github.com/synopsys-usb/linux.git next
And apparently have been merged there. I suspect he's going to submit his entire tree there to you?
JohnY: Is this right?
thanks
-john
Re: [PATCH 1/4 v3] usb: dwc2: Avoid sleeping while holding hsotg->lock
Quoted 66 lines · John Stultz
Quoted 58 lines · Felipe Balbi
Hi,
Quoted 52 lines · John Stultz
Basically when plugging in various cables in different orders, I'm occasionally seeing the following BUG splat:
[ 86.215403] BUG: scheduling while atomic: kworker/u16:2/53/0x00000002 [ 86.219164] usb 1-1: USB disconnect, device number 9 [ 86.226845] Preemption disabled at:[ 86.230218] [<ffffff8008673558>] dwc2_conn_id_status_change+0x120/0x250 [ 86.236894] CPU: 0 PID: 53 Comm: kworker/u16:2 Tainted: G W 4.9.0-rc8-00051-gd5a7979-dirty #1702 [ 86.246836] Hardware name: HiKey Development Board (DT) [ 86.252100] Workqueue: dwc2 dwc2_conn_id_status_change [ 86.257279] Call trace: [ 86.259771] [<ffffff8008087c28>] dump_backtrace+0x0/0x1a0 [ 86.265210] [<ffffff8008087ddc>] show_stack+0x14/0x20 [ 86.270308] [<ffffff80084343f0>] dump_stack+0x90/0xb0 [ 86.275401] [<ffffff80080d8d94>] __schedule_bug+0x6c/0xb8 [ 86.280841] [<ffffff8008a07220>] __schedule+0x4f8/0x5b0 [ 86.286099] [<ffffff8008a073e8>] schedule+0x38/0xa0 [ 86.291017] [<ffffff8008a0a6cc>] schedule_hrtimeout_range_clock+0x8c/0xf0 [ 86.297846] [<ffffff8008a0a740>] schedule_hrtimeout_range+0x10/0x18 [ 86.304150] [<ffffff8008a0a4a0>] usleep_range+0x50/0x58 [ 86.309418] [<ffffff800866d8dc>] dwc2_wait_for_mode.isra.4+0x54/0xd0 [ 86.315815] [<ffffff800866f058>] dwc2_core_reset+0xe0/0x168 [ 86.321431] [<ffffff800867e364>] dwc2_hsotg_core_init_disconnected+0x2c/0x310 [ 86.328602] [<ffffff8008673568>] dwc2_conn_id_status_change+0x130/0x250 [ 86.335254] [<ffffff80080ccd48>] process_one_work+0x118/0x370 [ 86.341035] [<ffffff80080ccfe8>] worker_thread+0x48/0x498 [ 86.346473] [<ffffff80080d2eb0>] kthread+0xd0/0xe8 [ 86.351299] [<ffffff8008082e80>] ret_from_fork+0x10/0x50This seems to be caused by the
dwc2_wait_for_mode()callingusleep_range()while thehstog->lockspinlock is held, since we take that before callingdwc2_hsotg_core_init_disconnected().This patch avoids the issue by adding an extra argument to
dwc2_core_reset(), as suggested by John Youn, which allows us to skip the waiting, which should be unnecessary when calling fromdwc2_hsotg_core_init_disconnected().Cc Wei Xu <[email protected]>Cc Guodong Xu <[email protected]>Cc Amit Pundir <[email protected]>Cc Rob Herring <[email protected]>Cc John Youn <[email protected]>Cc Douglas Anderson <[email protected]>Cc Chen Yu <[email protected]>Cc Vardan Mikayelyan <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Felipe Balbi <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by John Stultz <[email protected]>Quoted 1 line
---
Quoted 1 line
doesn't apply to my testing/next. Please rebase
Quoted 7 lines
So these were rebased onto JohnY's tree here:
https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_synopsys-2Dusb_linux.git&d=DwIBaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=U3o8uKoKhWme5_V9D-eeCkB11BFwt4KvWztBgdE9ZpA&m=eBJTBuJyU21iKJvHdy5FxqtxsVARo0iIqJGxMHrlbyQ&s=VIiAT32aG7s04G5NoOOthNdm2JX0eWjJpg62neY_-KI&e= nextAnd apparently have been merged there. I suspect he's going to submit his entire tree there to you?
JohnY: Is this right?
Yeah I'll get these issues sorted out with Felipe. Which may mean resubmitting everything the the proper order.
Thanks,
John
Re: [PATCH 1/4 v3] usb: dwc2: Avoid sleeping while holding hsotg->lock
Quoted 69 lines · John Youn
Quoted 69 lines · John Stultz
Quoted 58 lines · Felipe Balbi
Hi,
Quoted 52 lines · John Stultz
Basically when plugging in various cables in different orders, I'm occasionally seeing the following BUG splat:
[ 86.215403] BUG: scheduling while atomic: kworker/u16:2/53/0x00000002 [ 86.219164] usb 1-1: USB disconnect, device number 9 [ 86.226845] Preemption disabled at:[ 86.230218] [<ffffff8008673558>] dwc2_conn_id_status_change+0x120/0x250 [ 86.236894] CPU: 0 PID: 53 Comm: kworker/u16:2 Tainted: G W 4.9.0-rc8-00051-gd5a7979-dirty #1702 [ 86.246836] Hardware name: HiKey Development Board (DT) [ 86.252100] Workqueue: dwc2 dwc2_conn_id_status_change [ 86.257279] Call trace: [ 86.259771] [<ffffff8008087c28>] dump_backtrace+0x0/0x1a0 [ 86.265210] [<ffffff8008087ddc>] show_stack+0x14/0x20 [ 86.270308] [<ffffff80084343f0>] dump_stack+0x90/0xb0 [ 86.275401] [<ffffff80080d8d94>] __schedule_bug+0x6c/0xb8 [ 86.280841] [<ffffff8008a07220>] __schedule+0x4f8/0x5b0 [ 86.286099] [<ffffff8008a073e8>] schedule+0x38/0xa0 [ 86.291017] [<ffffff8008a0a6cc>] schedule_hrtimeout_range_clock+0x8c/0xf0 [ 86.297846] [<ffffff8008a0a740>] schedule_hrtimeout_range+0x10/0x18 [ 86.304150] [<ffffff8008a0a4a0>] usleep_range+0x50/0x58 [ 86.309418] [<ffffff800866d8dc>] dwc2_wait_for_mode.isra.4+0x54/0xd0 [ 86.315815] [<ffffff800866f058>] dwc2_core_reset+0xe0/0x168 [ 86.321431] [<ffffff800867e364>] dwc2_hsotg_core_init_disconnected+0x2c/0x310 [ 86.328602] [<ffffff8008673568>] dwc2_conn_id_status_change+0x130/0x250 [ 86.335254] [<ffffff80080ccd48>] process_one_work+0x118/0x370 [ 86.341035] [<ffffff80080ccfe8>] worker_thread+0x48/0x498 [ 86.346473] [<ffffff80080d2eb0>] kthread+0xd0/0xe8 [ 86.351299] [<ffffff8008082e80>] ret_from_fork+0x10/0x50This seems to be caused by the
dwc2_wait_for_mode()callingusleep_range()while thehstog->lockspinlock is held, since we take that before callingdwc2_hsotg_core_init_disconnected().This patch avoids the issue by adding an extra argument to
dwc2_core_reset(), as suggested by John Youn, which allows us to skip the waiting, which should be unnecessary when calling fromdwc2_hsotg_core_init_disconnected().Cc Wei Xu <[email protected]>Cc Guodong Xu <[email protected]>Cc Amit Pundir <[email protected]>Cc Rob Herring <[email protected]>Cc John Youn <[email protected]>Cc Douglas Anderson <[email protected]>Cc Chen Yu <[email protected]>Cc Vardan Mikayelyan <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Felipe Balbi <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by John Stultz <[email protected]>Quoted 1 line
---
Quoted 1 line
doesn't apply to my testing/next. Please rebase
So these were rebased onto JohnY's tree here:
https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_synopsys-2Dusb_linux.git&d=DwIBaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=U3o8uKoKhWme5_V9D-eeCkB11BFwt4KvWztBgdE9ZpA&m=eBJTBuJyU21iKJvHdy5FxqtxsVARo0iIqJGxMHrlbyQ&s=VIiAT32aG7s04G5NoOOthNdm2JX0eWjJpg62neY_-KI&e= next
Quoted 7 lines
Quoted 4 lines
And apparently have been merged there. I suspect he's going to submit his entire tree there to you?
JohnY: Is this right?
Yeah I'll get these issues sorted out with Felipe. Which may mean resubmitting everything the the proper order.
Ok. Thanks for sorting this out. Please let me know if there's anything else you need from me!
thanks again!
-john
PATCH v3 2/4 usb: dwc2: Workaround case where GOTGCTL state is wrong
In reply to John StultzWhen removing a USB-A to USB-otg adapter cable, we get a change status irq, and then in dwc2_conn_id_status_change, we erroniously see the GOTGCTL_CONID_B flag set. This causes us to get stuck in the "while (!dwc2_is_device_mode(hsotg))" loop, spitting out "Waiting for Peripheral Mode, Mode=Host" warnings until it fails out many seconds later.
This patch works around the issue by re-reading the GOTGCTL state to check if the GOTGCTL_CONID_B is still set and if not restarting the change status logic.
I suspect this isn't the best solution, but it seems to work well for me.
Feedback would be greatly appreciated!
---
v2: Rework goto logic suggested by Vardan, and add a comment v3:
* Rebased to synopsys-usb/next branch
--- drivers/usb/dwc2/hcd.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/usb/dwc2/hcd.c +9 -0
@@ -3238,6 +3238,14 @@ static void dwc2_conn_id_status_change(struct work_struct *work)dwc2_is_host_mode (hsotg) ?"Host" : "Peripheral");usleep_range (20000 ,40000 ); +/* +* Sometimes the initial GOTGCTRL read is wrong, so +* check it again and jump to host mode if that was +* the case. +*/ + gotgctl =dwc2_readl (hsotg->regs +GOTGCTL ); +if (!(gotgctl &GOTGCTL_CONID_B )) + goto host;if (++count >250 )break ; }
@@ -3252,6 +3260,7 @@ static void dwc2_conn_id_status_change(struct work_struct *work)spin_unlock_irqrestore (&hsotg->lock, flags);dwc2_hsotg_core_connect (hsotg); }else { +host:/* A-Device connector (Host Mode) */ dev_dbg (hsotg->dev,"connId A\n" );while (!dwc2_is_host_mode (hsotg)) {
Signature · 1 line
2.7.4
PATCH v3 3/4 usb: dwc2: Force port resume on switching to device mode
In reply to John StultzFrom: Chen Yu <[email protected]>
We've seen failures when switching between host and gadget mode, which was diagnosed as being caused due to the bus being auto-suspended when we switched.
So this patch forces a port resume when switching to device mode if the bus is suspended.
---
v3:
* Rebased to synopsys-usb/next branch
drivers/usb/dwc2/hcd.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/dwc2/hcd.c +7 -0
@@ -54,6 +54,8 @@#include "core.h" #include "hcd.h" +static void dwc2_port_resume (struct dwc2_hsotg *hsotg); +/* * ========================================================================= * Host Core Layer Functions
@@ -3232,6 +3234,11 @@ static void dwc2_conn_id_status_change(struct work_struct *work)if (gotgctl &GOTGCTL_CONID_B ) {/* Wait for switch to device mode */ dev_dbg (hsotg->dev,"connId B\n" ); +if (hsotg->bus_suspended) { +dev_info (hsotg->dev, +"Do port resume before switching to device mode\n" ); +dwc2_port_resume (hsotg); + }while (!dwc2_is_device_mode (hsotg)) { dev_info(hsotg->dev, "Waiting for Peripheral Mode, Mode=%s\n",
Signature · 1 line
2.7.4
PATCH v3 4/4 usb: dwc2: Add a quirk to allow speed negotiation for Hisilicon Hi6220
In reply to John StultzFrom: Chen Yu <[email protected]>
The Hi6220's usb controller is limited in that it does not support "Split Transactions", so it does not support communicating with low-speed and full-speed devices behind a high-speed hub.
Thus it requires a quirk so that we can manually drop the usb speed when low/full-speed are attached, and bump back to high speed when they are removed.
[jstultz: Reworked to simplify the patch, and made
commit log to be more specific about the issue]
---
v2:
* Fix build issue reported by kbuildbot
* Rework to avoid using new dts entry suggested by RobH
* Further tweaks from Chen Yu to try to address comments from John Youn
* Further simplified logic
* Reworked to adapt around changes that landed in 4.10-rc v3:
* Rebased to synopsys-usb/next branch
--- drivers/usb/dwc2/core.h | 7 ++++++ drivers/usb/dwc2/hcd.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++ drivers/usb/dwc2/params.c | 1 + 3 files changed, 68 insertions(+)
drivers/usb/dwc2/core.h +7 -0
@@ -444,6 +444,11 @@ enum dwc2_ep0_state {* in DWORDS with possible values from from * 16-32768 (default: 256, 256, 256, 256, 768, * 768, 768, 768, 0, 0, 0, 0, 0, 0, 0). +* @change_speed_quirk: Change speed configuration to DWC2_SPEED_PARAM_FULL +* while full&low speed device connect. And change speed +* back to DWC2_SPEED_PARAM_HIGH while device is gone. +* 0 - No (default) +* 1 - Yes * * The following parameters may be specified when starting the module. These * parameters define how the DWC_otg controller should be configured. A
@@ -501,6 +506,8 @@ struct dwc2_core_params {u32 g_rx_fifo_size;u32 g_np_tx_fifo_size;u32 g_tx_fifo_size[MAX_EPS_CHANNELS ]; + +bool change_speed_quirk; };/**
drivers/usb/dwc2/hcd.c +60 -0
72 lines not on this page · raw message
drivers/usb/dwc2/params.c +1 -0
@@ -68,6 +68,7 @@ static void dwc2_set_his_params(struct dwc2_hsotg *hsotg) p->ahbcfg =GAHBCFG_HBSTLEN_INCR16 <<GAHBCFG_HBSTLEN_SHIFT ; p->uframe_sched = false; + p->change_speed_quirk = true; }static void dwc2_set_rk_params (struct dwc2_hsotg *hsotg)
Signature · 1 line
2.7.4
Quoted 13 lines · John Stultz
Just wanted to resend my patches for dwc2 controller on the HiKey board for consideration for the 4.11 merge window.
This patchset is the same as v2, only rebased against John's synopsys-usb/next branch.
This does still exclude my patchset[1] to add extcon support to dwc2, which John Youn suspects a pending rework of the dwc2 fifo init logic might make unnecssary.
thanks
-john
Quoted 7 lines
v2:
* Reworked goto logic in patch #2, as suggested by Vardan v3:
* Rebased to synopsys-usb/next
Thanks
For this series:
Regards,
John
Hi,
Quoted 22 lines · John Youn
Quoted 13 lines · John Stultz
Just wanted to resend my patches for dwc2 controller on the HiKey board for consideration for the 4.11 merge window.
This patchset is the same as v2, only rebased against John's synopsys-usb/next branch.
This does still exclude my patchset[1] to add extcon support to dwc2, which John Youn suspects a pending rework of the dwc2 fifo init logic might make unnecssary.
thanks
-johnQuoted 7 lines
v2:
* Reworked goto logic in patch #2, as suggested by Vardan v3:
* Rebased to synopsys-usb/next
Quoted 4 lines
Thanks
For this series:
Acked-by John Youn <[email protected]>
Do we need these in the -rc cycle?
Signature · 1 line
balbi
Quoted 26 lines · Felipe Balbi
Hi,
Quoted 22 lines · John Youn
Quoted 20 lines · John Stultz
Just wanted to resend my patches for dwc2 controller on the HiKey board for consideration for the 4.11 merge window.
This patchset is the same as v2, only rebased against John's synopsys-usb/next branch.
This does still exclude my patchset[1] to add extcon support to dwc2, which John Youn suspects a pending rework of the dwc2 fifo init logic might make unnecssary.
thanks
-johnv2:
* Reworked goto logic in patch #2, as suggested by Vardan v3:
* Rebased to synopsys-usb/next
Quoted 7 lines
Quoted 4 lines
Thanks
For this series:
Acked-by John Youn <[email protected]>Do we need these in the -rc cycle?
This series should be applied after my param rework series for next [1].
If you have any issues with applying I can resend everything together.
Regards,
John
Quoted 26 lines · Felipe Balbi
Hi,
Quoted 22 lines · John Youn
Quoted 20 lines · John Stultz
Just wanted to resend my patches for dwc2 controller on the HiKey board for consideration for the 4.11 merge window.
This patchset is the same as v2, only rebased against John's synopsys-usb/next branch.
This does still exclude my patchset[1] to add extcon support to dwc2, which John Youn suspects a pending rework of the dwc2 fifo init logic might make unnecssary.
thanks
-johnv2:
* Reworked goto logic in patch #2, as suggested by Vardan v3:
* Rebased to synopsys-usb/next
Quoted 6 lines
Quoted 4 lines
Thanks
For this series:
Acked-by John Youn <[email protected]>Do we need these in the -rc cycle?
I'd say no. There is one fix "Avoid sleeping while holding hsotg->lock", which could be considered, but seems to only get triggered on HiKey. So I wouldn't consider it a regression since the other patches in this series are needed for HiKey to function.
thanks
-john