Selaa lähdekoodia

fix(port): enter section before alloc pipe

sakumisu 1 vuosi sitten
vanhempi
sitoutus
c24eea6077
3 muutettua tiedostoa jossa 8 lisäystä ja 11 poistoa
  1. 4 5
      port/dwc2/usb_hc_dwc2.c
  2. 2 1
      port/ehci/usb_hc_ehci.c
  3. 2 5
      port/musb/usb_hc_musb.c

+ 4 - 5
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;

+ 2 - 1
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;
 }
 

+ 2 - 5
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;