Loading drivers/usb/dwc3/ep0.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -267,7 +267,7 @@ out: return ret; return ret; } } static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) { { struct dwc3_ep *dep; struct dwc3_ep *dep; Loading drivers/usb/dwc3/gadget.c +9 −0 Original line number Original line Diff line number Diff line Loading @@ -3001,6 +3001,15 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_writel(dwc->regs, DWC3_DCTL, reg); dwc3_writel(dwc->regs, DWC3_DCTL, reg); dwc->test_mode = false; dwc->test_mode = false; /* * From SNPS databook section 8.1.2 * the EP0 should be in setup 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) dwc3_ep0_stall_and_restart(dwc); dwc3_stop_active_transfers(dwc); dwc3_stop_active_transfers(dwc); dwc3_clear_stall_all_ep(dwc); dwc3_clear_stall_all_ep(dwc); Loading drivers/usb/dwc3/gadget.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -98,6 +98,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, void dwc3_ep0_interrupt(struct dwc3 *dwc, void dwc3_ep0_interrupt(struct dwc3 *dwc, const struct dwc3_event_depevt *event); const struct dwc3_event_depevt *event); void dwc3_ep0_out_start(struct dwc3 *dwc); void dwc3_ep0_out_start(struct dwc3 *dwc); void dwc3_ep0_stall_and_restart(struct dwc3 *dwc); int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, Loading Loading
drivers/usb/dwc3/ep0.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -267,7 +267,7 @@ out: return ret; return ret; } } static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) void dwc3_ep0_stall_and_restart(struct dwc3 *dwc) { { struct dwc3_ep *dep; struct dwc3_ep *dep; Loading
drivers/usb/dwc3/gadget.c +9 −0 Original line number Original line Diff line number Diff line Loading @@ -3001,6 +3001,15 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_writel(dwc->regs, DWC3_DCTL, reg); dwc3_writel(dwc->regs, DWC3_DCTL, reg); dwc->test_mode = false; dwc->test_mode = false; /* * From SNPS databook section 8.1.2 * the EP0 should be in setup 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) dwc3_ep0_stall_and_restart(dwc); dwc3_stop_active_transfers(dwc); dwc3_stop_active_transfers(dwc); dwc3_clear_stall_all_ep(dwc); dwc3_clear_stall_all_ep(dwc); Loading
drivers/usb/dwc3/gadget.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -98,6 +98,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, void dwc3_ep0_interrupt(struct dwc3 *dwc, void dwc3_ep0_interrupt(struct dwc3 *dwc, const struct dwc3_event_depevt *event); const struct dwc3_event_depevt *event); void dwc3_ep0_out_start(struct dwc3 *dwc); void dwc3_ep0_out_start(struct dwc3 *dwc); void dwc3_ep0_stall_and_restart(struct dwc3 *dwc); int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, Loading