summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin Milea <[email protected]>2021-12-08 12:33:30 +0200
committerValentin Milea <[email protected]>2021-12-08 12:34:00 +0200
commitae970ba2e2cc83881c52e66cd79fad5947e5e59e (patch)
tree12446e7cb5e0c2d1ff988719c15c9694ba81972f
parent36e69b86bf0f95916a66a35874da15fb420296e1 (diff)
Handle xfer events before closing EP
-rw-r--r--src/portable/raspberrypi/rp2040/dcd_rp2040.c17
-rw-r--r--src/portable/raspberrypi/rp2040/rp2040_usb.c4
2 files changed, 9 insertions, 12 deletions
diff --git a/src/portable/raspberrypi/rp2040/dcd_rp2040.c b/src/portable/raspberrypi/rp2040/dcd_rp2040.c
index 3a3bef6a5..42add3167 100644
--- a/src/portable/raspberrypi/rp2040/dcd_rp2040.c
+++ b/src/portable/raspberrypi/rp2040/dcd_rp2040.c
@@ -247,6 +247,14 @@ static void dcd_rp2040_irq(void)
uint32_t const status = usb_hw->ints;
uint32_t handled = 0;
+ // xfer events are handled before setup req. So if a transfer completes immediately
+ // before closing the EP, the events will be delivered in same order.
+ if (status & USB_INTS_BUFF_STATUS_BITS)
+ {
+ handled |= USB_INTS_BUFF_STATUS_BITS;
+ hw_handle_buff_status();
+ }
+
if (status & USB_INTS_SETUP_REQ_BITS)
{
handled |= USB_INTS_SETUP_REQ_BITS;
@@ -260,12 +268,6 @@ static void dcd_rp2040_irq(void)
usb_hw_clear->sie_status = USB_SIE_STATUS_SETUP_REC_BITS;
}
- if (status & USB_INTS_BUFF_STATUS_BITS)
- {
- handled |= USB_INTS_BUFF_STATUS_BITS;
- hw_handle_buff_status();
- }
-
#if FORCE_VBUS_DETECT == 0
// Since we force VBUS detect On, device will always think it is connected and
// couldn't distinguish between disconnect and suspend
@@ -496,9 +498,6 @@ void dcd_edpt_close (uint8_t rhport, uint8_t ep_addr)
(void) rhport;
pico_trace("dcd_edpt_close %02x\n", ep_addr);
-
- // usbd.c says: In progress transfers on this EP may be delivered after this call.
- // If the endpoint is no longer active when the transfer event is delivered, it will be ignored.
hw_endpoint_close(ep_addr);
}
diff --git a/src/portable/raspberrypi/rp2040/rp2040_usb.c b/src/portable/raspberrypi/rp2040/rp2040_usb.c
index 0a943b676..9d833e65f 100644
--- a/src/portable/raspberrypi/rp2040/rp2040_usb.c
+++ b/src/portable/raspberrypi/rp2040/rp2040_usb.c
@@ -294,9 +294,7 @@ bool hw_endpoint_xfer_continue(struct hw_endpoint *ep)
// Part way through a transfer
if (!ep->active)
{
- pico_info("Ignore xfer on inactive ep %d %s", tu_edpt_number(ep->ep_addr), ep_dir_string[tu_edpt_dir(ep->ep_addr)]);
- _hw_endpoint_lock_update(ep, -1);
- return false;
+ panic("Can't continue xfer on inactive ep %d %s", tu_edpt_number(ep->ep_addr), ep_dir_string[tu_edpt_dir(ep->ep_addr)]);
}
// Update EP struct from hardware state