Loading drivers/usb/dwc3/gadget.c +8 −5 Original line number Original line Diff line number Diff line Loading @@ -1962,7 +1962,7 @@ static int dwc3_gadget_set_selfpowered(struct usb_gadget *g, return 0; return 0; } } static void dwc3_stop_active_transfers(struct dwc3 *dwc) static void dwc3_stop_active_transfers(struct dwc3 *dwc, bool block_db) { { u32 epnum; u32 epnum; Loading @@ -1976,9 +1976,11 @@ static void dwc3_stop_active_transfers(struct dwc3 *dwc) if (!(dep->flags & DWC3_EP_ENABLED)) if (!(dep->flags & DWC3_EP_ENABLED)) continue; continue; if (dep->gsi && dep->direction) if (dep->gsi && dep->direction && block_db) { dbg_log_string("block_db with dep:%s", dep->name); dwc3_notify_event(dwc, dwc3_notify_event(dwc, DWC3_CONTROLLER_NOTIFY_CLEAR_DB, 0); DWC3_CONTROLLER_NOTIFY_CLEAR_DB, 0); } dwc3_remove_requests(dwc, dep); dwc3_remove_requests(dwc, dep); } } Loading Loading @@ -2064,9 +2066,10 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) * According to dwc3 databook, it is must to remove any active * According to dwc3 databook, it is must to remove any active * transfers before trying to stop USB device controller. Hence * transfers before trying to stop USB device controller. Hence * call dwc3_stop_active_transfers() API before stopping USB * call dwc3_stop_active_transfers() API before stopping USB * device controller. * device controller. Also don't block ringing of doorbell until * controller is halted (i.e. second param as false). */ */ dwc3_stop_active_transfers(dwc); dwc3_stop_active_transfers(dwc, false); reg &= ~DWC3_DCTL_RUN_STOP; reg &= ~DWC3_DCTL_RUN_STOP; Loading Loading @@ -3264,7 +3267,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_ep0_stall_and_restart(dwc); dwc3_ep0_stall_and_restart(dwc); } } dwc3_stop_active_transfers(dwc); dwc3_stop_active_transfers(dwc, true); dwc3_clear_stall_all_ep(dwc); dwc3_clear_stall_all_ep(dwc); /* Reset device address to zero */ /* Reset device address to zero */ Loading Loading
drivers/usb/dwc3/gadget.c +8 −5 Original line number Original line Diff line number Diff line Loading @@ -1962,7 +1962,7 @@ static int dwc3_gadget_set_selfpowered(struct usb_gadget *g, return 0; return 0; } } static void dwc3_stop_active_transfers(struct dwc3 *dwc) static void dwc3_stop_active_transfers(struct dwc3 *dwc, bool block_db) { { u32 epnum; u32 epnum; Loading @@ -1976,9 +1976,11 @@ static void dwc3_stop_active_transfers(struct dwc3 *dwc) if (!(dep->flags & DWC3_EP_ENABLED)) if (!(dep->flags & DWC3_EP_ENABLED)) continue; continue; if (dep->gsi && dep->direction) if (dep->gsi && dep->direction && block_db) { dbg_log_string("block_db with dep:%s", dep->name); dwc3_notify_event(dwc, dwc3_notify_event(dwc, DWC3_CONTROLLER_NOTIFY_CLEAR_DB, 0); DWC3_CONTROLLER_NOTIFY_CLEAR_DB, 0); } dwc3_remove_requests(dwc, dep); dwc3_remove_requests(dwc, dep); } } Loading Loading @@ -2064,9 +2066,10 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) * According to dwc3 databook, it is must to remove any active * According to dwc3 databook, it is must to remove any active * transfers before trying to stop USB device controller. Hence * transfers before trying to stop USB device controller. Hence * call dwc3_stop_active_transfers() API before stopping USB * call dwc3_stop_active_transfers() API before stopping USB * device controller. * device controller. Also don't block ringing of doorbell until * controller is halted (i.e. second param as false). */ */ dwc3_stop_active_transfers(dwc); dwc3_stop_active_transfers(dwc, false); reg &= ~DWC3_DCTL_RUN_STOP; reg &= ~DWC3_DCTL_RUN_STOP; Loading Loading @@ -3264,7 +3267,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_ep0_stall_and_restart(dwc); dwc3_ep0_stall_and_restart(dwc); } } dwc3_stop_active_transfers(dwc); dwc3_stop_active_transfers(dwc, true); dwc3_clear_stall_all_ep(dwc); dwc3_clear_stall_all_ep(dwc); /* Reset device address to zero */ /* Reset device address to zero */ Loading