diff --git a/drivers/usb/xhcid/src/xhci/irq_reactor.rs b/drivers/usb/xhcid/src/xhci/irq_reactor.rs index b452e3a4ec..098f4d14c1 100644 --- a/drivers/usb/xhcid/src/xhci/irq_reactor.rs +++ b/drivers/usb/xhcid/src/xhci/irq_reactor.rs @@ -547,10 +547,26 @@ impl IrqReactor { } had_event_ring_full_error } - /// Grows the event ring fn grow_event_ring(&mut self) { - // TODO - error!("TODO: grow event ring"); + let mut event_ring = self.hci.primary_event_ring.lock().unwrap_or_else(|e| e.into_inner()); + let cycle = event_ring.ring.cycle; + for trb in event_ring.ring.trbs.iter_mut() { + trb.reserved(!cycle); + } + let dequeue_pointer = event_ring.ring.register() & 0xFFFF_FFFF_FFFF_FFF0; + drop(event_ring); + + let zero_64b = self.hci.quirks.contains(crate::xhci::quirks::XhciQuirks::ZERO_64B_REGS); + let mut run = self.hci.run.lock().unwrap_or_else(|e| e.into_inner()); + if zero_64b { + run.ints[0].erdp_high.write((dequeue_pointer >> 32) as u32); + run.ints[0].erdp_low.write(dequeue_pointer as u32 | (1 << 3)); + } else { + run.ints[0].erdp_low.write(dequeue_pointer as u32 | (1 << 3)); + run.ints[0].erdp_high.write((dequeue_pointer >> 32) as u32); + } + + log::warn!("xhcid: event ring full — reset to ERDP={:#x}", dequeue_pointer); } pub fn run(self) -> ! { diff --git a/drivers/usb/xhcid/src/xhci/scheme.rs b/drivers/usb/xhcid/src/xhci/scheme.rs index 8252198133..11b6e1e788 100644 --- a/drivers/usb/xhcid/src/xhci/scheme.rs +++ b/drivers/usb/xhcid/src/xhci/scheme.rs @@ -1897,12 +1897,10 @@ impl Xhci { serial_str ); - //TODO let (bos_desc, bos_data) = self.fetch_bos_desc(port_id, slot).await?; + let (bos_desc, bos_data) = self.fetch_bos_desc(port_id, slot).await?; - let supports_superspeed = false; - //TODO usb::bos_capability_descs(bos_desc, &bos_data).any(|desc| desc.is_superspeed()); - let supports_superspeedplus = false; - //TODO usb::bos_capability_descs(bos_desc, &bos_data).any(|desc| desc.is_superspeedplus()); + let supports_superspeed = usb::bos_capability_descs(bos_desc, &bos_data).any(|desc| desc.is_superspeed()); + let supports_superspeedplus = usb::bos_capability_descs(bos_desc, &bos_data).any(|desc| desc.is_superspeedplus()); let mut config_descs = SmallVec::new();