diff options
| author | Nathan Conrad <[email protected]> | 2019-09-21 12:02:06 -0400 |
|---|---|---|
| committer | Nathan Conrad <[email protected]> | 2019-09-21 12:02:06 -0400 |
| commit | aebecf169abff62b022da2c0e70f7416d62c91ef (patch) | |
| tree | 40ce60e1172cf73506458683e271ed846d8561a2 /src/device/usbd.c | |
| parent | b6590490a8e2ad3debac4508f65af001dc1753af (diff) | |
Reorder handling of EP control requests,
Diffstat (limited to 'src/device/usbd.c')
| -rw-r--r-- | src/device/usbd.c | 20 |
1 files 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;
|
