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;