summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2023-11-22 21:44:51 +0800
committersakumisu <[email protected]>2023-11-22 21:44:51 +0800
commit50e1cd3471c138b73d79bc3b7d5f0c3c5dad3fe6 (patch)
tree00b927630ccab2023a608b2707a783c76f54db0f
parentb7d02b71253701a89dd3738497b034e74b0ae077 (diff)
add mutex for ep0 urb to avoid multithreading
-rw-r--r--class/hub/usbh_hub.c2
-rw-r--r--core/usbh_core.c5
-rw-r--r--core/usbh_core.h1
3 files changed, 8 insertions, 0 deletions
diff --git a/class/hub/usbh_hub.c b/class/hub/usbh_hub.c
index fe660fc4..b967a37d 100644
--- a/class/hub/usbh_hub.c
+++ b/class/hub/usbh_hub.c
@@ -310,6 +310,7 @@ static void usbh_hubport_release(struct usbh_hubport *child)
}
child->config.config_desc.bNumInterfaces = 0;
usbh_kill_urb(&child->ep0_urb);
+ usb_osal_mutex_delete(child->mutex);
}
}
@@ -598,6 +599,7 @@ static void usbh_hub_events(struct usbh_hub *hub)
child->connected = true;
child->port = port + 1;
child->speed = speed;
+ child->mutex = usb_osal_mutex_create();
USB_LOG_INFO("New %s device on Hub %u, Port %u connected\r\n", speed_table[speed], hub->index, port + 1);
diff --git a/core/usbh_core.c b/core/usbh_core.c
index 33dc7b5f..91d79f71 100644
--- a/core/usbh_core.c
+++ b/core/usbh_core.c
@@ -673,11 +673,16 @@ int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *s
urb = &hport->ep0_urb;
+ usb_osal_mutex_take(hport->mutex);
+
+ memset(urb, 0, sizeof(struct usbh_urb));
usbh_control_urb_fill(urb, hport, setup, buffer, setup->wLength, CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT, NULL, NULL);
ret = usbh_submit_urb(urb);
if (ret == 0) {
ret = urb->actual_length;
}
+
+ usb_osal_mutex_give(hport->mutex);
return ret;
}
diff --git a/core/usbh_core.h b/core/usbh_core.h
index 7cc1eace..c56953b9 100644
--- a/core/usbh_core.h
+++ b/core/usbh_core.h
@@ -111,6 +111,7 @@ struct usbh_hubport {
#endif
struct usb_endpoint_descriptor ep0;
struct usbh_urb ep0_urb;
+ usb_osal_mutex_t mutex;
};
struct usbh_hub {