From aebecf169abff62b022da2c0e70f7416d62c91ef Mon Sep 17 00:00:00 2001 From: Nathan Conrad Date: Sat, 21 Sep 2019 12:02:06 -0400 Subject: [PATCH] Reorder handling of EP control requests, --- src/device/usbd.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/device/usbd.c b/src/device/usbd.c index 0366d1ece..146da5420 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -499,10 +499,6 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const uint8_t const drv_id = _usbd_dev.ep2drv[ep_num][ep_dir]; TU_ASSERT(drv_id < USBD_CLASS_DRIVER_COUNT); - // Some classes such as TMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request - // We will forward all request targeted endpoint to its class driver - // - For non-standard request: driver can ACK or Stall the request by return true/false - // - For standard request: usbd decide the ACK stage regardless of driver return value bool ret = false; if ( TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type ) @@ -511,12 +507,6 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const usbd_control_set_complete_callback(usbd_class_drivers[drv_id].control_complete); } - // Invoke class driver first if available - if ( usbd_class_drivers[drv_id].control_request ) - { - ret = usbd_class_drivers[drv_id].control_request(rhport, p_request); - } - // Then handle if it is standard request if ( TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type ) { @@ -552,7 +542,17 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const default: TU_BREAKPOINT(); return false; } } + // Some classes such as TMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request + // We will forward all request targeted endpoint to its class driver + // For class-type requests: must (call tud_control_status(); return true) or (return false) + // For std-type requests: non-std requests codes are already discarded. + // must not call tud_control_status(), and return value will have no effect + // Invoke class driver last, so that EP is already stalled + if ( usbd_class_drivers[drv_id].control_request ) + { + ret = ret | usbd_class_drivers[drv_id].control_request(rhport, p_request); + } return ret; } break;