فهرست منبع

Preventing resources from not being released

sakumisu 3 سال پیش
والد
کامیت
9b72a17a5b
1فایلهای تغییر یافته به همراه11 افزوده شده و 0 حذف شده
  1. 11 0
      class/hub/usbh_hub.c

+ 11 - 0
class/hub/usbh_hub.c

@@ -484,6 +484,17 @@ static void usbh_hub_events(struct usbh_hub *hub)
 
                     child = &hub->child[port];
 
+                    /* if last status is connected, free sources first, this does not happen normally,
+                      but there may be hardware issues in some ips */
+                    if (child->connected) {
+                        usbh_hport_deactivate_ep0(child);
+                        for (uint8_t i = 0; i < child->config.config_desc.bNumInterfaces; i++) {
+                            if (child->config.intf[i].class_driver && child->config.intf[i].class_driver->disconnect) {
+                                CLASS_DISCONNECT(child, i);
+                            }
+                        }
+                    }
+
                     memset(child, 0, sizeof(struct usbh_hubport));
                     child->parent = hub;
                     child->connected = true;