summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-06-28 14:45:11 +0800
committersakumisu <[email protected]>2024-06-28 16:33:45 +0800
commitc24eea607736afd3f6d68301ca1a2ccbf6903954 (patch)
tree0cd853f40bf76dcc670e14ef0546ff046218aab7
parent8fa517016e1a12f8b7deaa15b82105ed441097b0 (diff)
fix(port): enter section before alloc pipe
-rw-r--r--port/dwc2/usb_hc_dwc2.c9
-rw-r--r--port/ehci/usb_hc_ehci.c3
-rw-r--r--port/musb/usb_hc_musb.c7
3 files changed, 8 insertions, 11 deletions
diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c
index 907ae8b1..ddcbaf28 100644
--- a/port/dwc2/usb_hc_dwc2.c
+++ b/port/dwc2/usb_hc_dwc2.c
@@ -322,15 +322,15 @@ static int dwc2_chan_alloc(struct usbh_bus *bus)
size_t flags;
int chidx;
+ flags = usb_osal_enter_critical_section();
for (chidx = 0; chidx < CONFIG_USBHOST_PIPE_NUM; chidx++) {
if (!g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].inuse) {
- flags = usb_osal_enter_critical_section();
g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].inuse = true;
usb_osal_leave_critical_section(flags);
return chidx;
}
}
-
+ usb_osal_leave_critical_section(flags);
return -1;
}
@@ -736,11 +736,8 @@ int usbh_submit_urb(struct usbh_urb *urb)
return -USB_ERR_BUSY;
}
- flags = usb_osal_enter_critical_section();
-
chidx = dwc2_chan_alloc(bus);
if (chidx == -1) {
- usb_osal_leave_critical_section(flags);
return -USB_ERR_NOMEM;
}
@@ -763,6 +760,8 @@ int usbh_submit_urb(struct usbh_urb *urb)
}
}
+ flags = usb_osal_enter_critical_section();
+
chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx];
chan->chidx = chidx;
chan->urb = urb;
diff --git a/port/ehci/usb_hc_ehci.c b/port/ehci/usb_hc_ehci.c
index bce45093..d8370120 100644
--- a/port/ehci/usb_hc_ehci.c
+++ b/port/ehci/usb_hc_ehci.c
@@ -32,9 +32,9 @@ static struct ehci_qh_hw *ehci_qh_alloc(struct usbh_bus *bus)
struct ehci_qtd_hw *qtd;
size_t flags;
+ flags = usb_osal_enter_critical_section();
for (uint32_t i = 0; i < CONFIG_USB_EHCI_QH_NUM; i++) {
if (!g_ehci_hcd[bus->hcd.hcd_id].ehci_qh_used[i]) {
- flags = usb_osal_enter_critical_section();
g_ehci_hcd[bus->hcd.hcd_id].ehci_qh_used[i] = true;
usb_osal_leave_critical_section(flags);
@@ -56,6 +56,7 @@ static struct ehci_qh_hw *ehci_qh_alloc(struct usbh_bus *bus)
return qh;
}
}
+ usb_osal_leave_critical_section(flags);
return NULL;
}
diff --git a/port/musb/usb_hc_musb.c b/port/musb/usb_hc_musb.c
index a59e1693..b5d7e36c 100644
--- a/port/musb/usb_hc_musb.c
+++ b/port/musb/usb_hc_musb.c
@@ -684,19 +684,18 @@ int usbh_submit_urb(struct usbh_urb *urb)
bus = urb->hport->bus;
- flags = usb_osal_enter_critical_section();
-
if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) {
chidx = 0;
} else {
chidx = (urb->ep->bEndpointAddress & 0x0f);
if (chidx > (CONFIG_USBHOST_PIPE_NUM - 1)) {
- usb_osal_leave_critical_section(flags);
return -USB_ERR_RANGE;
}
}
+ flags = usb_osal_enter_critical_section();
+
pipe = &g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx];
pipe->chidx = chidx;
pipe->urb = urb;
@@ -705,8 +704,6 @@ int usbh_submit_urb(struct usbh_urb *urb)
urb->errorcode = -USB_ERR_BUSY;
urb->actual_length = 0;
- usb_osal_sem_reset(pipe->waitsem);
-
switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
case USB_ENDPOINT_TYPE_CONTROL:
pipe->ep0_state = USB_EP0_STATE_SETUP;