* [PATCH 0/4] usb: gadget: Link state changes
@ 2019-10-22 19:09 Thinh Nguyen
2019-10-22 19:09 ` [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change Thinh Nguyen
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Thinh Nguyen @ 2019-10-22 19:09 UTC (permalink / raw)
To: Felipe Balbi, Thinh Nguyen, linux-usb; +Cc: John Youn
This patch series adds some fixes to how dwc3 handles cases related to
link state changes.
Thinh Nguyen (4):
usb: dwc3: gadget: Don't send unintended link state change
usb: dwc3: gadget: Set link state to RX_Detect on disconnect
usb: dwc3: gadget: Clear DCTL.ULSTCHNGREQ before set
usb: dwc3: debug: Remove newline printout
drivers/usb/dwc3/debug.h | 4 ++--
drivers/usb/dwc3/gadget.c | 26 ++++++++++++++++++++++++++
2 files changed, 28 insertions(+), 2 deletions(-)
--
2.11.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change
2019-10-22 19:09 [PATCH 0/4] usb: gadget: Link state changes Thinh Nguyen
@ 2019-10-22 19:09 ` Thinh Nguyen
2019-10-23 6:21 ` Felipe Balbi
2019-10-22 19:09 ` [PATCH 2/4] usb: dwc3: gadget: Set link state to RX_Detect on disconnect Thinh Nguyen
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Thinh Nguyen @ 2019-10-22 19:09 UTC (permalink / raw)
To: Felipe Balbi, Thinh Nguyen, linux-usb; +Cc: John Youn
DCTL.ULSTCHNGREQ is a write-only field. When doing a read-modify-write
to DCTL, the driver must make sure that there's no unintended link state
change request from whatever is read from DCTL.ULSTCHNGREQ. Set link
state change to no-action when the driver writes to DCTL.
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
---
drivers/usb/dwc3/gadget.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 86dc1db788a9..24178b4b9d46 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -57,6 +57,8 @@ int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
return -EINVAL;
}
+ /* Don't send link state change request */
+ reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
return 0;
@@ -1822,6 +1824,9 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
dwc->pullups_connected = false;
}
+ /* Don't send link state change request */
+ reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
+
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
do {
@@ -2744,6 +2749,10 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
int reg;
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
+
+ /* Don't send link state change request */
+ reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
+
reg &= ~DWC3_DCTL_INITU1ENA;
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
@@ -2799,6 +2808,10 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
dwc3_reset_gadget(dwc);
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
+
+ /* Don't send link state change request */
+ reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
+
reg &= ~DWC3_DCTL_TSTCTRL_MASK;
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
dwc->test_mode = false;
@@ -2904,10 +2917,15 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
if (dwc->has_lpm_erratum && dwc->revision >= DWC3_REVISION_240A)
reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold);
+ /* Don't send link state change request */
+ reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
} else {
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
reg &= ~DWC3_DCTL_HIRD_THRES_MASK;
+
+ /* Don't send link state change request */
+ reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
}
@@ -3017,6 +3035,9 @@ static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,
reg &= ~u1u2;
+ /* Don't send link state change request */
+ reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
+
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
break;
default:
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] usb: dwc3: gadget: Set link state to RX_Detect on disconnect
2019-10-22 19:09 [PATCH 0/4] usb: gadget: Link state changes Thinh Nguyen
2019-10-22 19:09 ` [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change Thinh Nguyen
@ 2019-10-22 19:09 ` Thinh Nguyen
2019-10-22 19:10 ` [PATCH 3/4] usb: dwc3: gadget: Clear DCTL.ULSTCHNGREQ before set Thinh Nguyen
2019-10-22 19:10 ` [PATCH 4/4] usb: dwc3: debug: Remove newline printout Thinh Nguyen
3 siblings, 0 replies; 7+ messages in thread
From: Thinh Nguyen @ 2019-10-22 19:09 UTC (permalink / raw)
To: Felipe Balbi, Thinh Nguyen, linux-usb; +Cc: John Youn
When DWC3 receives disconnect event, it needs to set the link state to
RX_Detect.
DWC_usb3 3.30a programming guide 4.1.7
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
---
drivers/usb/dwc3/gadget.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 24178b4b9d46..37631d2e2a2e 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2748,6 +2748,8 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
{
int reg;
+ dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RX_DET);
+
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
/* Don't send link state change request */
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] usb: dwc3: gadget: Clear DCTL.ULSTCHNGREQ before set
2019-10-22 19:09 [PATCH 0/4] usb: gadget: Link state changes Thinh Nguyen
2019-10-22 19:09 ` [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change Thinh Nguyen
2019-10-22 19:09 ` [PATCH 2/4] usb: dwc3: gadget: Set link state to RX_Detect on disconnect Thinh Nguyen
@ 2019-10-22 19:10 ` Thinh Nguyen
2019-10-22 19:10 ` [PATCH 4/4] usb: dwc3: debug: Remove newline printout Thinh Nguyen
3 siblings, 0 replies; 7+ messages in thread
From: Thinh Nguyen @ 2019-10-22 19:10 UTC (permalink / raw)
To: Felipe Balbi, Thinh Nguyen, linux-usb; +Cc: John Youn
Send a no-action link state change request before the actual request
so DWC3 can send the same request whenever we call
dwc3_gadget_set_link_state().
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
---
drivers/usb/dwc3/gadget.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 37631d2e2a2e..03d58254d1e6 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -113,6 +113,9 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
reg = dwc3_readl(dwc->regs, DWC3_DCTL);
reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
+ /* set no action before sending new link state change */
+ dwc3_writel(dwc->regs, DWC3_DCTL, reg);
+
/* set requested state */
reg |= DWC3_DCTL_ULSTCHNGREQ(state);
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/4] usb: dwc3: debug: Remove newline printout
2019-10-22 19:09 [PATCH 0/4] usb: gadget: Link state changes Thinh Nguyen
` (2 preceding siblings ...)
2019-10-22 19:10 ` [PATCH 3/4] usb: dwc3: gadget: Clear DCTL.ULSTCHNGREQ before set Thinh Nguyen
@ 2019-10-22 19:10 ` Thinh Nguyen
3 siblings, 0 replies; 7+ messages in thread
From: Thinh Nguyen @ 2019-10-22 19:10 UTC (permalink / raw)
To: Felipe Balbi, Thinh Nguyen, linux-usb; +Cc: John Youn
The newline from the unknown link state tracepoint doesn't follow the
other tracepoints, and it looks unsightly. Let's remove it.
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
---
drivers/usb/dwc3/debug.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/dwc3/debug.h b/drivers/usb/dwc3/debug.h
index 9baabed87d61..e56beb9d1e36 100644
--- a/drivers/usb/dwc3/debug.h
+++ b/drivers/usb/dwc3/debug.h
@@ -112,7 +112,7 @@ dwc3_gadget_link_string(enum dwc3_link_state link_state)
case DWC3_LINK_STATE_RESUME:
return "Resume";
default:
- return "UNKNOWN link state\n";
+ return "UNKNOWN link state";
}
}
@@ -141,7 +141,7 @@ dwc3_gadget_hs_link_string(enum dwc3_link_state link_state)
case DWC3_LINK_STATE_RESUME:
return "Resume";
default:
- return "UNKNOWN link state\n";
+ return "UNKNOWN link state";
}
}
--
2.11.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change
2019-10-22 19:09 ` [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change Thinh Nguyen
@ 2019-10-23 6:21 ` Felipe Balbi
2019-10-24 2:10 ` Thinh Nguyen
0 siblings, 1 reply; 7+ messages in thread
From: Felipe Balbi @ 2019-10-23 6:21 UTC (permalink / raw)
To: Thinh Nguyen, Thinh Nguyen, linux-usb; +Cc: John Youn
[-- Attachment #1: Type: text/plain, Size: 1206 bytes --]
Hi Thinh,
Thinh Nguyen <Thinh.Nguyen@synopsys.com> writes:
> DCTL.ULSTCHNGREQ is a write-only field. When doing a read-modify-write
> to DCTL, the driver must make sure that there's no unintended link state
> change request from whatever is read from DCTL.ULSTCHNGREQ. Set link
> state change to no-action when the driver writes to DCTL.
>
> Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
WHAT A GREAT CATCH!!! However, let's do one small change here:
> ---
> drivers/usb/dwc3/gadget.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 86dc1db788a9..24178b4b9d46 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -57,6 +57,8 @@ int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
> return -EINVAL;
> }
>
> + /* Don't send link state change request */
> + reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
> dwc3_writel(dwc->regs, DWC3_DCTL, reg);
Let's a small macro or a little function to wrap this. Something
dwc3_dctl_write_safe() or something long those line.
Then that macro/function will make sure to clear those bits.
--
balbi
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change
2019-10-23 6:21 ` Felipe Balbi
@ 2019-10-24 2:10 ` Thinh Nguyen
0 siblings, 0 replies; 7+ messages in thread
From: Thinh Nguyen @ 2019-10-24 2:10 UTC (permalink / raw)
To: Felipe Balbi, Thinh Nguyen, linux-usb@vger.kernel.org; +Cc: John Youn
Hi,
Felipe Balbi wrote:
> Thinh Nguyen <Thinh.Nguyen@synopsys.com> writes:
>> DCTL.ULSTCHNGREQ is a write-only field. When doing a read-modify-write
>> to DCTL, the driver must make sure that there's no unintended link state
>> change request from whatever is read from DCTL.ULSTCHNGREQ. Set link
>> state change to no-action when the driver writes to DCTL.
>>
>> Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
> WHAT A GREAT CATCH!!! However, let's do one small change here:
>
>> ---
>> drivers/usb/dwc3/gadget.c | 21 +++++++++++++++++++++
>> 1 file changed, 21 insertions(+)
>>
>> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
>> index 86dc1db788a9..24178b4b9d46 100644
>> --- a/drivers/usb/dwc3/gadget.c
>> +++ b/drivers/usb/dwc3/gadget.c
>> @@ -57,6 +57,8 @@ int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
>> return -EINVAL;
>> }
>>
>> + /* Don't send link state change request */
>> + reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
>> dwc3_writel(dwc->regs, DWC3_DCTL, reg);
> Let's a small macro or a little function to wrap this. Something
> dwc3_dctl_write_safe() or something long those line.
>
> Then that macro/function will make sure to clear those bits.
Sure. I'll resend with the change.
Thanks,
Thinh
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-10-24 2:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-10-22 19:09 [PATCH 0/4] usb: gadget: Link state changes Thinh Nguyen
2019-10-22 19:09 ` [PATCH 1/4] usb: dwc3: gadget: Don't send unintended link state change Thinh Nguyen
2019-10-23 6:21 ` Felipe Balbi
2019-10-24 2:10 ` Thinh Nguyen
2019-10-22 19:09 ` [PATCH 2/4] usb: dwc3: gadget: Set link state to RX_Detect on disconnect Thinh Nguyen
2019-10-22 19:10 ` [PATCH 3/4] usb: dwc3: gadget: Clear DCTL.ULSTCHNGREQ before set Thinh Nguyen
2019-10-22 19:10 ` [PATCH 4/4] usb: dwc3: debug: Remove newline printout Thinh Nguyen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.