Skip to content

Commit

Permalink
Handle xfer events before closing EP
Browse files Browse the repository at this point in the history
  • Loading branch information
vmilea committed Dec 8, 2021
1 parent 36e69b8 commit ae970ba
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 12 deletions.
17 changes: 8 additions & 9 deletions src/portable/raspberrypi/rp2040/dcd_rp2040.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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);
}

Expand Down
4 changes: 1 addition & 3 deletions src/portable/raspberrypi/rp2040/rp2040_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit ae970ba

Please sign in to comment.