Re: [PATCH v2 1/3] usb: dwc3: gadget: Refactor EP0 forced stall/restart into a separate API
From: Thinh Nguyen
Date: Fri Apr 07 2023 - 21:45:18 EST
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@xxxxxxxxxxx>
> ---
> 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