summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorudoudou <[email protected]>2025-07-27 18:17:40 +0800
committersakumisu <[email protected]>2025-07-27 20:30:08 +0800
commitae2a24642bb00f66268f6f6d423f69de902deec8 (patch)
treed75f9b34efa2ec9d9b286cc838758b02bc7b6b98
parent1a68d94c32b5e31988490c556e7ae384cd26e4b3 (diff)
Fix a bug where the channel might not be released
-rw-r--r--port/dwc2/usb_glue_esp.c4
-rw-r--r--port/dwc2/usb_hc_dwc2.c21
-rw-r--r--port/ehci/usb_hc_ehci.c8
-rw-r--r--port/musb/usb_hc_musb.c8
-rw-r--r--port/rp2040/usb_hc_rp2040.c9
5 files changed, 26 insertions, 24 deletions
diff --git a/port/dwc2/usb_glue_esp.c b/port/dwc2/usb_glue_esp.c
index 6ce03857..03110fb8 100644
--- a/port/dwc2/usb_glue_esp.c
+++ b/port/dwc2/usb_glue_esp.c
@@ -144,6 +144,7 @@ void usb_dc_low_level_init(uint8_t busid)
{
esp_err_t ret;
void *reg_base = (void*)g_usbdev_bus[busid].reg_base;
+ (void)reg_base;
usb_phy_config_t phy_config = {
.controller = USB_PHY_CTRL_OTG,
.otg_mode = USB_OTG_MODE_DEVICE,
@@ -170,6 +171,7 @@ void usb_dc_low_level_init(uint8_t busid)
void usb_dc_low_level_deinit(uint8_t busid)
{
void *reg_base = (void*)g_usbdev_bus[busid].reg_base;
+ (void)reg_base;
if (s_interrupt_handle[GET_USB_INDEX(reg_base)]) {
esp_intr_free(s_interrupt_handle[GET_USB_INDEX(reg_base)]);
s_interrupt_handle[GET_USB_INDEX(reg_base)] = NULL;
@@ -190,6 +192,7 @@ static void usb_hc_interrupt_cb(void *arg_pv)
void usb_hc_low_level_init(struct usbh_bus *bus)
{
void *reg_base = (void*)bus->hcd.reg_base;
+ (void)reg_base;
// Host Library defaults to internal PHY
usb_phy_config_t phy_config = {
.controller = USB_PHY_CTRL_OTG,
@@ -219,6 +222,7 @@ void usb_hc_low_level_init(struct usbh_bus *bus)
void usb_hc_low_level_deinit(struct usbh_bus *bus)
{
void *reg_base = (void*)bus->hcd.reg_base;
+ (void)reg_base;
if (s_interrupt_handle[GET_USB_INDEX(reg_base)]) {
esp_intr_free(s_interrupt_handle[GET_USB_INDEX(reg_base)]);
s_interrupt_handle[GET_USB_INDEX(reg_base)] = NULL;
diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c
index 838c7b3c..f8de2d11 100644
--- a/port/dwc2/usb_hc_dwc2.c
+++ b/port/dwc2/usb_hc_dwc2.c
@@ -306,9 +306,6 @@ static inline void dwc2_chan_transfer(struct usbh_bus *bus, uint8_t ch_num, uint
{
__IO uint32_t tmpreg;
uint8_t is_oddframe;
- struct dwc2_chan *chan;
-
- chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[ch_num];
/* Initialize the HCTSIZn register */
USB_OTG_HC(ch_num)->HCTSIZ = (size & USB_OTG_HCTSIZ_XFRSIZ) |
@@ -489,6 +486,10 @@ static void dwc2_chan_free(struct dwc2_chan *chan)
size_t flags;
flags = usb_osal_enter_critical_section();
+ if (chan->urb) {
+ chan->urb->hcpriv = NULL;
+ chan->urb = NULL;
+ }
chan->inuse = false;
usb_osal_leave_critical_section(flags);
}
@@ -998,11 +999,6 @@ int usbh_submit_urb(struct usbh_urb *urb)
return -USB_ERR_BUSY;
}
- chidx = dwc2_chan_alloc(bus);
- if (chidx == -1) {
- return -USB_ERR_NOMEM;
- }
-
if (urb->ep->bEndpointAddress & 0x80) {
/* Check if pipe rx fifo is overflow */
if (USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) > (g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size * 4)) {
@@ -1022,6 +1018,11 @@ int usbh_submit_urb(struct usbh_urb *urb)
}
}
+ chidx = dwc2_chan_alloc(bus);
+ if (chidx == -1) {
+ return -USB_ERR_NOMEM;
+ }
+
flags = usb_osal_enter_critical_section();
chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx];
@@ -1094,8 +1095,6 @@ int usbh_kill_urb(struct usbh_urb *urb)
dwc2_halt(bus, chan->chidx);
- chan->urb = NULL;
- urb->hcpriv = NULL;
urb->errorcode = -USB_ERR_SHUTDOWN;
if (urb->timeout) {
@@ -1114,8 +1113,6 @@ static inline void dwc2_urb_waitup(struct usbh_urb *urb)
struct dwc2_chan *chan;
chan = (struct dwc2_chan *)urb->hcpriv;
- chan->urb = NULL;
- urb->hcpriv = NULL;
if (urb->timeout) {
usb_osal_sem_give(chan->waitsem);
diff --git a/port/ehci/usb_hc_ehci.c b/port/ehci/usb_hc_ehci.c
index e88af6d4..3ad7c9b9 100644
--- a/port/ehci/usb_hc_ehci.c
+++ b/port/ehci/usb_hc_ehci.c
@@ -99,6 +99,10 @@ static void ehci_qh_free(struct usbh_bus *bus, struct ehci_qh_hw *qh)
size_t flags;
flags = usb_osal_enter_critical_section();
+ if (qh->urb) {
+ qh->urb->hcpriv = NULL;
+ qh->urb = NULL;
+ }
qtd = EHCI_ADDR2QTD(qh->first_qtd);
while (qtd) {
@@ -616,8 +620,6 @@ static void ehci_urb_waitup(struct usbh_bus *bus, struct usbh_urb *urb)
struct ehci_qh_hw *qh;
qh = (struct ehci_qh_hw *)urb->hcpriv;
- qh->urb = NULL;
- urb->hcpriv = NULL;
qh->remove_in_iaad = 0;
@@ -1335,9 +1337,7 @@ int usbh_kill_urb(struct usbh_urb *urb)
EHCI_HCOR->usbcmd |= (EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN);
qh = (struct ehci_qh_hw *)urb->hcpriv;
- urb->hcpriv = NULL;
urb->errorcode = -USB_ERR_SHUTDOWN;
- qh->urb = NULL;
if (urb->timeout) {
usb_osal_sem_give(qh->waitsem);
diff --git a/port/musb/usb_hc_musb.c b/port/musb/usb_hc_musb.c
index 9111177a..b16be99e 100644
--- a/port/musb/usb_hc_musb.c
+++ b/port/musb/usb_hc_musb.c
@@ -477,6 +477,10 @@ static int musb_pipe_alloc(void)
static void musb_pipe_free(struct musb_pipe *pipe)
{
+ if (pipe->urb) {
+ pipe->urb->hcpriv = NULL;
+ pipe->urb = NULL;
+ }
#if 0
pipe->inuse = false;
#endif
@@ -771,9 +775,7 @@ int usbh_kill_urb(struct usbh_urb *urb)
flags = usb_osal_enter_critical_section();
pipe = (struct musb_pipe *)urb->hcpriv;
- urb->hcpriv = NULL;
urb->errorcode = -USB_ERR_SHUTDOWN;
- pipe->urb = NULL;
if (urb->ep->bEndpointAddress & 0x80) {
HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << (urb->ep->bEndpointAddress & 0x0f));
@@ -800,8 +802,6 @@ static void musb_urb_waitup(struct usbh_urb *urb)
struct musb_pipe *pipe;
pipe = (struct musb_pipe *)urb->hcpriv;
- pipe->urb = NULL;
- urb->hcpriv = NULL;
if (urb->timeout) {
usb_osal_sem_give(pipe->waitsem);
diff --git a/port/rp2040/usb_hc_rp2040.c b/port/rp2040/usb_hc_rp2040.c
index be8ff976..48f4128f 100644
--- a/port/rp2040/usb_hc_rp2040.c
+++ b/port/rp2040/usb_hc_rp2040.c
@@ -72,6 +72,10 @@ static void rp2040_pipe_free(struct rp2040_pipe *pipe)
size_t flags;
flags = usb_osal_enter_critical_section();
+ if (pipe->urb) {
+ pipe->urb->hcpriv = NULL;
+ pipe->urb = NULL;
+ }
pipe->inuse = false;
usb_osal_leave_critical_section(flags);
}
@@ -590,9 +594,8 @@ int usbh_kill_urb(struct usbh_urb *urb)
flags = usb_osal_enter_critical_section();
pipe = (struct rp2040_pipe *)urb->hcpriv;
- urb->hcpriv = NULL;
urb->errorcode = -USB_ERR_SHUTDOWN;
- pipe->urb = NULL;
+
usb_hw_clear->int_ep_ctrl = 1 << pipe->chidx;
usb_hw_clear->buf_status = 1 << (pipe->chidx * 2 + 0);
usb_hw_clear->buf_status = 1 << (pipe->chidx * 2 + 1);
@@ -615,8 +618,6 @@ static void rp2040_urb_waitup(struct usbh_urb *urb)
struct rp2040_pipe *pipe;
pipe = (struct rp2040_pipe *)urb->hcpriv;
- pipe->urb = NULL;
- urb->hcpriv = NULL;
if (urb->timeout) {
usb_osal_sem_give(pipe->waitsem);