@@ -1921,13 +1921,20 @@ static int32_t handle_hc_datatglerr_intr(dwc_otg_hcd_t * hcd,
1921
1921
dwc_otg_qtd_t * qtd )
1922
1922
{
1923
1923
DWC_DEBUGPL (DBG_HCDI , "--Host Channel %d Interrupt: "
1924
- "Data Toggle Error--\n" , hc -> hc_num );
1924
+ "Data Toggle Error on %s transfer--\n" ,
1925
+ hc -> hc_num , (hc -> ep_is_in ? "IN" : "OUT" ));
1925
1926
1926
- if (hc -> ep_is_in ) {
1927
+ /* Data toggles on split transactions cause the hc to halt.
1928
+ * restart transfer */
1929
+ if (hc -> qh -> do_split )
1930
+ {
1931
+ qtd -> error_count ++ ;
1932
+ dwc_otg_hcd_save_data_toggle (hc , hc_regs , qtd );
1933
+ update_urb_state_xfer_intr (hc , hc_regs ,
1934
+ qtd -> urb , qtd , DWC_OTG_HC_XFER_XACT_ERR );
1935
+ halt_channel (hcd , hc , qtd , DWC_OTG_HC_XFER_XACT_ERR );
1936
+ } else if (hc -> ep_is_in ) {
1927
1937
qtd -> error_count = 0 ;
1928
- } else {
1929
- DWC_ERROR ("Data Toggle Error on OUT transfer,"
1930
- "channel %d\n" , hc -> hc_num );
1931
1938
}
1932
1939
1933
1940
disable_hc_int (hc_regs , datatglerr );
@@ -2080,6 +2087,8 @@ static void handle_hc_chhltd_intr_dma(dwc_otg_hcd_t * hcd,
2080
2087
handle_hc_babble_intr (hcd , hc , hc_regs , qtd );
2081
2088
} else if (hcint .b .frmovrun ) {
2082
2089
handle_hc_frmovrun_intr (hcd , hc , hc_regs , qtd );
2090
+ } else if (hcint .b .datatglerr ) {
2091
+ handle_hc_datatglerr_intr (hcd , hc , hc_regs , qtd );
2083
2092
} else if (!out_nak_enh ) {
2084
2093
if (hcint .b .nyet ) {
2085
2094
/*
0 commit comments