[PATCH v2 1/3] usb: dwc3: gadget: Refactor EP0 forced stall/restart into a separate API

Wesley Cheng posted 3 patches 2 years, 10 months ago
There is a newer version of this series
[PATCH v2 1/3] usb: dwc3: gadget: Refactor EP0 forced stall/restart into a separate API
Posted by Wesley Cheng 2 years, 10 months ago
Several sequences utilize the same routine for forcing the control endpoint
back into the SETUP phase.  This is required, because those operations need
to ensure that EP0 is back in the default state.

Fixes: c96683798e27 ("usb: dwc3: ep0: Don't prepare beyond Setup stage")
Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
---
 drivers/usb/dwc3/gadget.c | 44 ++++++++++++++++++---------------------
 1 file changed, 20 insertions(+), 24 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 3c63fa97a680..320e30476c88 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -139,6 +139,24 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
 	return -ETIMEDOUT;
 }
 
+static void dwc3_ep0_reset_state(struct dwc3 *dwc)
+{
+	unsigned int	dir;
+
+	if (dwc->ep0state != EP0_SETUP_PHASE) {
+		dir = !!dwc->ep0_expect_in;
+		if (dwc->ep0state == EP0_DATA_PHASE)
+			dwc3_ep0_end_control_data(dwc, dwc->eps[dir]);
+		else
+			dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]);
+
+		dwc->eps[0]->trb_enqueue = 0;
+		dwc->eps[1]->trb_enqueue = 0;
+
+		dwc3_ep0_stall_and_restart(dwc);
+	}
+}
+
 /**
  * dwc3_ep_inc_trb - increment a trb index.
  * @index: Pointer to the TRB index to increment.
@@ -3821,16 +3839,7 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
 	dwc->setup_packet_pending = false;
 	usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED);
 
-	if (dwc->ep0state != EP0_SETUP_PHASE) {
-		unsigned int    dir;
-
-		dir = !!dwc->ep0_expect_in;
-		if (dwc->ep0state == EP0_DATA_PHASE)
-			dwc3_ep0_end_control_data(dwc, dwc->eps[dir]);
-		else
-			dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]);
-		dwc3_ep0_stall_and_restart(dwc);
-	}
+	dwc3_ep0_reset_state(dwc);
 }
 
 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
@@ -3884,20 +3893,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
 	 * phase. So ensure that EP0 is in setup phase by issuing a stall
 	 * and restart if EP0 is not in setup phase.
 	 */
-	if (dwc->ep0state != EP0_SETUP_PHASE) {
-		unsigned int	dir;
-
-		dir = !!dwc->ep0_expect_in;
-		if (dwc->ep0state == EP0_DATA_PHASE)
-			dwc3_ep0_end_control_data(dwc, dwc->eps[dir]);
-		else
-			dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]);
-
-		dwc->eps[0]->trb_enqueue = 0;
-		dwc->eps[1]->trb_enqueue = 0;
-
-		dwc3_ep0_stall_and_restart(dwc);
-	}
+	dwc3_ep0_reset_state(dwc);
 
 	/*
 	 * In the Synopsis DesignWare Cores USB3 Databook Rev. 3.30a
Re: [PATCH v2 1/3] usb: dwc3: gadget: Refactor EP0 forced stall/restart into a separate API
Posted by Thinh Nguyen 2 years, 10 months ago
On Fri, Apr 07, 2023, Wesley Cheng wrote:
> Several sequences utilize the same routine for forcing the control endpoint
> back into the SETUP phase.  This is required, because those operations need
> to ensure that EP0 is back in the default state.
> 
> Fixes: c96683798e27 ("usb: dwc3: ep0: Don't prepare beyond Setup stage")

Refactor patch should have no functional change. Why is there fixes tag?

BR,
Thinh

> Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
> ---
>  drivers/usb/dwc3/gadget.c | 44 ++++++++++++++++++---------------------
>  1 file changed, 20 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 3c63fa97a680..320e30476c88 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -139,6 +139,24 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
>  	return -ETIMEDOUT;
>  }
>  
> +static void dwc3_ep0_reset_state(struct dwc3 *dwc)
> +{
> +	unsigned int	dir;
> +
> +	if (dwc->ep0state != EP0_SETUP_PHASE) {
> +		dir = !!dwc->ep0_expect_in;
> +		if (dwc->ep0state == EP0_DATA_PHASE)
> +			dwc3_ep0_end_control_data(dwc, dwc->eps[dir]);
> +		else
> +			dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]);
> +
> +		dwc->eps[0]->trb_enqueue = 0;
> +		dwc->eps[1]->trb_enqueue = 0;
> +
> +		dwc3_ep0_stall_and_restart(dwc);
> +	}
> +}
> +
>  /**
>   * dwc3_ep_inc_trb - increment a trb index.
>   * @index: Pointer to the TRB index to increment.
> @@ -3821,16 +3839,7 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
>  	dwc->setup_packet_pending = false;
>  	usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED);
>  
> -	if (dwc->ep0state != EP0_SETUP_PHASE) {
> -		unsigned int    dir;
> -
> -		dir = !!dwc->ep0_expect_in;
> -		if (dwc->ep0state == EP0_DATA_PHASE)
> -			dwc3_ep0_end_control_data(dwc, dwc->eps[dir]);
> -		else
> -			dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]);
> -		dwc3_ep0_stall_and_restart(dwc);
> -	}
> +	dwc3_ep0_reset_state(dwc);
>  }
>  
>  static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
> @@ -3884,20 +3893,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
>  	 * phase. So ensure that EP0 is in setup phase by issuing a stall
>  	 * and restart if EP0 is not in setup phase.
>  	 */
> -	if (dwc->ep0state != EP0_SETUP_PHASE) {
> -		unsigned int	dir;
> -
> -		dir = !!dwc->ep0_expect_in;
> -		if (dwc->ep0state == EP0_DATA_PHASE)
> -			dwc3_ep0_end_control_data(dwc, dwc->eps[dir]);
> -		else
> -			dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]);
> -
> -		dwc->eps[0]->trb_enqueue = 0;
> -		dwc->eps[1]->trb_enqueue = 0;
> -
> -		dwc3_ep0_stall_and_restart(dwc);
> -	}
> +	dwc3_ep0_reset_state(dwc);
>  
>  	/*
>  	 * In the Synopsis DesignWare Cores USB3 Databook Rev. 3.30a
Re: [PATCH v2 1/3] usb: dwc3: gadget: Refactor EP0 forced stall/restart into a separate API
Posted by Wesley Cheng 2 years, 10 months ago
Hi Thinh,

On 4/7/2023 6:45 PM, Thinh Nguyen wrote:
> On Fri, Apr 07, 2023, Wesley Cheng wrote:
>> Several sequences utilize the same routine for forcing the control endpoint
>> back into the SETUP phase.  This is required, because those operations need
>> to ensure that EP0 is back in the default state.
>>
>> Fixes: c96683798e27 ("usb: dwc3: ep0: Don't prepare beyond Setup stage")
> 
> Refactor patch should have no functional change. Why is there fixes tag?
> 

Sorry my mistake, will remove and resubmit.

Thanks
Wesley Cheng