Преглед изворни кода

Reorder handling of EP control requests,

Nathan Conrad пре 6 година
родитељ
комит
aebecf169a
1 измењених фајлова са 10 додато и 10 уклоњено
  1. 10 10
      src/device/usbd.c

+ 10 - 10
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;