summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakimisu <[email protected]>2022-12-30 20:57:54 +0800
committersakimisu <[email protected]>2022-12-30 20:57:54 +0800
commit902f1da40776443a5559406e5982c8a2f0492cc1 (patch)
tree4b369e13739e9418337035113964dc9c50622ed3
parente88756a41283031ab239f1e61504d394d3fd70de (diff)
release sources when enable port fails
-rw-r--r--class/hub/usbh_hub.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/class/hub/usbh_hub.c b/class/hub/usbh_hub.c
index 90724544..d749aa3f 100644
--- a/class/hub/usbh_hub.c
+++ b/class/hub/usbh_hub.c
@@ -333,7 +333,7 @@ static int usbh_hub_disconnect(struct usbh_hubport *hport, uint8_t intf)
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) {
- ret = CLASS_DISCONNECT(child, i);
+ CLASS_DISCONNECT(child, i);
}
}
@@ -477,16 +477,15 @@ 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) {
+ child->connected = false;
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);
}
}
+ child->config.config_desc.bNumInterfaces = 0;
}
memset(child, 0, sizeof(struct usbh_hubport));
@@ -502,6 +501,18 @@ static void usbh_hub_events(struct usbh_hub *hub)
}
} else {
USB_LOG_ERR("Failed to enable port %u\r\n", port + 1);
+
+ child = &hub->child[port];
+ if (child->connected) {
+ child->connected = false;
+ 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);
+ }
+ }
+ }
+ child->config.config_desc.bNumInterfaces = 0;
continue;
}
} else {
@@ -597,4 +608,4 @@ CLASS_INFO_DEFINE const struct usbh_class_info hub_info = {
.pid = 0x00,
.class_driver = &hub_driver
};
-#endif \ No newline at end of file
+#endif