@@ -1673,6 +1673,40 @@ static int __dwc3_gadget_get_frame(struct dwc3 *dwc)
1673
1673
return DWC3_DSTS_SOFFN (reg );
1674
1674
}
1675
1675
1676
+ /**
1677
+ * __dwc3_stop_active_transfer - stop the current active transfer
1678
+ * @dep: isoc endpoint
1679
+ * @force: set forcerm bit in the command
1680
+ * @interrupt: command complete interrupt after End Transfer command
1681
+ *
1682
+ * When setting force, the ForceRM bit will be set. In that case
1683
+ * the controller won't update the TRB progress on command
1684
+ * completion. It also won't clear the HWO bit in the TRB.
1685
+ * The command will also not complete immediately in that case.
1686
+ */
1687
+ static int __dwc3_stop_active_transfer (struct dwc3_ep * dep , bool force , bool interrupt )
1688
+ {
1689
+ struct dwc3_gadget_ep_cmd_params params ;
1690
+ u32 cmd ;
1691
+ int ret ;
1692
+
1693
+ cmd = DWC3_DEPCMD_ENDTRANSFER ;
1694
+ cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0 ;
1695
+ cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0 ;
1696
+ cmd |= DWC3_DEPCMD_PARAM (dep -> resource_index );
1697
+ memset (& params , 0 , sizeof (params ));
1698
+ ret = dwc3_send_gadget_ep_cmd (dep , cmd , & params );
1699
+ WARN_ON_ONCE (ret );
1700
+ dep -> resource_index = 0 ;
1701
+
1702
+ if (!interrupt )
1703
+ dep -> flags &= ~DWC3_EP_TRANSFER_STARTED ;
1704
+ else if (!ret )
1705
+ dep -> flags |= DWC3_EP_END_TRANSFER_PENDING ;
1706
+
1707
+ return ret ;
1708
+ }
1709
+
1676
1710
/**
1677
1711
* dwc3_gadget_start_isoc_quirk - workaround invalid frame number
1678
1712
* @dep: isoc endpoint
@@ -1848,21 +1882,8 @@ static int __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
1848
1882
* status, issue END_TRANSFER command and retry on the next XferNotReady
1849
1883
* event.
1850
1884
*/
1851
- if (ret == - EAGAIN ) {
1852
- struct dwc3_gadget_ep_cmd_params params ;
1853
- u32 cmd ;
1854
-
1855
- cmd = DWC3_DEPCMD_ENDTRANSFER |
1856
- DWC3_DEPCMD_CMDIOC |
1857
- DWC3_DEPCMD_PARAM (dep -> resource_index );
1858
-
1859
- dep -> resource_index = 0 ;
1860
- memset (& params , 0 , sizeof (params ));
1861
-
1862
- ret = dwc3_send_gadget_ep_cmd (dep , cmd , & params );
1863
- if (!ret )
1864
- dep -> flags |= DWC3_EP_END_TRANSFER_PENDING ;
1865
- }
1885
+ if (ret == - EAGAIN )
1886
+ ret = __dwc3_stop_active_transfer (dep , false, true);
1866
1887
1867
1888
return ret ;
1868
1889
}
@@ -3603,10 +3624,6 @@ static void dwc3_reset_gadget(struct dwc3 *dwc)
3603
3624
static void dwc3_stop_active_transfer (struct dwc3_ep * dep , bool force ,
3604
3625
bool interrupt )
3605
3626
{
3606
- struct dwc3_gadget_ep_cmd_params params ;
3607
- u32 cmd ;
3608
- int ret ;
3609
-
3610
3627
if (!(dep -> flags & DWC3_EP_TRANSFER_STARTED ) ||
3611
3628
(dep -> flags & DWC3_EP_END_TRANSFER_PENDING ))
3612
3629
return ;
@@ -3638,19 +3655,7 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
3638
3655
* This mode is NOT available on the DWC_usb31 IP.
3639
3656
*/
3640
3657
3641
- cmd = DWC3_DEPCMD_ENDTRANSFER ;
3642
- cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0 ;
3643
- cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0 ;
3644
- cmd |= DWC3_DEPCMD_PARAM (dep -> resource_index );
3645
- memset (& params , 0 , sizeof (params ));
3646
- ret = dwc3_send_gadget_ep_cmd (dep , cmd , & params );
3647
- WARN_ON_ONCE (ret );
3648
- dep -> resource_index = 0 ;
3649
-
3650
- if (!interrupt )
3651
- dep -> flags &= ~DWC3_EP_TRANSFER_STARTED ;
3652
- else
3653
- dep -> flags |= DWC3_EP_END_TRANSFER_PENDING ;
3658
+ __dwc3_stop_active_transfer (dep , force , interrupt );
3654
3659
}
3655
3660
3656
3661
static void dwc3_clear_stall_all_ep (struct dwc3 * dwc )
0 commit comments