Skip to content

Commit 7a2a714

Browse files
jannicExplodingWaffle
authored andcommitted
Clear sie_status.suspended / sie_status.resume flags in poll()
usb_device ignores PollResult::Suspend when already suspended, and PollResult::Resume when not suspended. This may lead to repeatedly triggered interrupts if for some reason the Suspend flag gets set while the device is already suspended. I observed such a situation when a reset was triggered while the device was suspended. To make sure that this can't cause interrupt storms, clear the flags before returning from poll()
1 parent 65c8157 commit 7a2a714

File tree

1 file changed

+4
-18
lines changed

1 file changed

+4
-18
lines changed

rp2040-hal/src/usb.rs

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -538,24 +538,8 @@ impl UsbBusTrait for UsbBus {
538538
.bit_is_set()
539539
})
540540
}
541-
fn suspend(&self) {
542-
interrupt::free(|cs| {
543-
let inner = self.inner.borrow(cs).borrow_mut();
544-
inner
545-
.ctrl_reg
546-
.sie_status
547-
.write(|w| w.suspended().set_bit());
548-
});
549-
}
550-
fn resume(&self) {
551-
interrupt::free(|cs| {
552-
let inner = self.inner.borrow(cs).borrow_mut();
553-
inner
554-
.ctrl_reg
555-
.sie_status
556-
.write(|w| w.resume().set_bit());
557-
});
558-
}
541+
fn suspend(&self) {}
542+
fn resume(&self) {}
559543
fn poll(&self) -> PollResult {
560544
interrupt::free(|cs| {
561545
let mut inner = self.inner.borrow(cs).borrow_mut();
@@ -565,8 +549,10 @@ impl UsbBusTrait for UsbBus {
565549
if sie_status.bus_reset().bit_is_set() {
566550
return PollResult::Reset;
567551
} else if sie_status.suspended().bit_is_set() {
552+
inner.ctrl_reg.sie_status.write(|w| w.suspended().set_bit());
568553
return PollResult::Suspend;
569554
} else if sie_status.resume().bit_is_set() {
555+
inner.ctrl_reg.sie_status.write(|w| w.resume().set_bit());
570556
return PollResult::Resume;
571557
}
572558

0 commit comments

Comments
 (0)