All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.