diff options
| author | hathach <[email protected]> | 2022-11-28 23:22:10 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2022-11-28 23:22:10 +0700 |
| commit | b2a3f33046fe736557ad1a4bc9c0da76e47e68f3 (patch) | |
| tree | db0297ff562b58634ce4073e3cf6bec66e749807 /src/host/usbh.c | |
| parent | 5785467016f4f2d0f5e52cec70f4f2328a5d326a (diff) | |
Retry a few times with transfers in enumeration since device can be unstable when starting up
Diffstat (limited to 'src/host/usbh.c')
| -rw-r--r-- | src/host/usbh.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/host/usbh.c b/src/host/usbh.c index 9d618db92..a5abac843 100644 --- a/src/host/usbh.c +++ b/src/host/usbh.c @@ -620,9 +620,7 @@ static void _xfer_complete(uint8_t daddr, xfer_result_t result) .user_data = _ctrl_xfer.user_data }; - usbh_lock(); - _ctrl_xfer.stage = CONTROL_STAGE_IDLE; - usbh_unlock(); + _set_control_xfer_stage(CONTROL_STAGE_IDLE); if (xfer_temp.complete_cb) { @@ -1182,12 +1180,28 @@ static void enum_full_complete(void); // process device enumeration static void process_enumeration(tuh_xfer_t* xfer) { + // Retry a few times with transfers in enumeration since device can be unstable when starting up + enum { + ATTEMPT_COUNT_MAX = 3, + ATTEMPT_DELAY_MS = 10 + }; + static uint8_t failed_count = 0; + if (XFER_RESULT_SUCCESS != xfer->result) { - // stop enumeration, maybe we could retry this - enum_full_complete(); + // retry if not reaching max attempt + if ( failed_count < ATTEMPT_COUNT_MAX ) + { + failed_count++; + osal_task_delay(ATTEMPT_DELAY_MS); // delay a bit + TU_ASSERT(tuh_control_xfer(xfer), ); + }else + { + enum_full_complete(); + } return; } + failed_count = 0; uint8_t const daddr = xfer->daddr; uintptr_t const state = xfer->user_data; |
