@@ -443,13 +443,21 @@ bool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *
443
443
ehci_qtd_t * qtd ;
444
444
445
445
if (epnum == 0 ) {
446
+ // Control endpoint never be stalled. Skip reset Data Toggle since it is fixed per stage
447
+ if (qhd -> qtd_overlay .halted ) {
448
+ qhd -> qtd_overlay .halted = false;
449
+ }
450
+
446
451
qtd = qtd_control (dev_addr );
447
452
qtd_init (qtd , buffer , buflen );
448
453
449
454
// first data toggle is always 1 (data & setup stage)
450
455
qtd -> data_toggle = 1 ;
451
456
qtd -> pid = dir ? EHCI_PID_IN : EHCI_PID_OUT ;
452
457
} else {
458
+ // skip if endpoint is halted
459
+ TU_VERIFY (!qhd -> qtd_overlay .halted );
460
+
453
461
qtd = qtd_find_free ();
454
462
TU_ASSERT (qtd );
455
463
@@ -506,8 +514,9 @@ bool hcd_edpt_clear_stall(uint8_t daddr, uint8_t ep_addr)
506
514
{
507
515
ehci_qhd_t * qhd = qhd_get_from_addr (daddr , ep_addr );
508
516
qhd -> qtd_overlay .halted = 0 ;
517
+ qhd -> qtd_overlay .data_toggle = 0 ;
509
518
hcd_dcache_clean_invalidate (qhd , sizeof (ehci_qhd_t ));
510
- // TODO reset data toggle ?
519
+
511
520
return true;
512
521
}
513
522
@@ -881,8 +890,10 @@ static void qhd_remove_qtd(ehci_qhd_t *qhd) {
881
890
882
891
qhd -> attached_qtd = NULL ;
883
892
qhd -> attached_buffer = 0 ;
893
+ hcd_dcache_clean (qhd , sizeof (ehci_qhd_t ));
884
894
885
895
qtd -> used = 0 ; // free QTD
896
+ hcd_dcache_clean (qtd , sizeof (ehci_qtd_t ));
886
897
}
887
898
888
899
//--------------------------------------------------------------------+
0 commit comments