From fc8ef508a5c47baa59b1d60d206de26fbe8260a5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 2 Sep 2022 11:32:38 -0600 Subject: [PATCH] xhcid: Make polling mode code match normal irq code --- xhcid/src/xhci/irq_reactor.rs | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/xhcid/src/xhci/irq_reactor.rs b/xhcid/src/xhci/irq_reactor.rs index 3a073eca39..6a2250dbba 100644 --- a/xhcid/src/xhci/irq_reactor.rs +++ b/xhcid/src/xhci/irq_reactor.rs @@ -110,29 +110,35 @@ impl IrqReactor { debug!("Running IRQ reactor in polling mode."); let hci_clone = Arc::clone(&self.hci); - 'event_loop: loop { - let mut event_ring_guard = hci_clone.primary_event_ring.lock().unwrap(); + let mut event_trb_index = { hci_clone.primary_event_ring.lock().unwrap().ring.next_index() }; - let index = event_ring_guard.ring.next_index(); + 'trb_loop: loop { + self.pause(); - let mut trb; + let mut event_ring = hci_clone.primary_event_ring.lock().unwrap(); - 'busy_waiting: loop { - trb = &event_ring_guard.ring.trbs[index]; + let event_trb = &mut event_ring.ring.trbs[event_trb_index]; - if trb.completion_code() == TrbCompletionCode::Invalid as u8 { - self.pause(); - } else { - break; - } + if event_trb.completion_code() == TrbCompletionCode::Invalid as u8 { + continue 'trb_loop; } - if self.check_event_ring_full(trb.clone()) { continue 'event_loop } + trace!("Found event TRB: {:?}", event_trb); + + if self.check_event_ring_full(event_trb.clone()) { + info!("Had to resize event TRB, retrying..."); + hci_clone.event_handler_finished(); + continue 'trb_loop; + } self.handle_requests(); - self.acknowledge(trb.clone()); + self.acknowledge(event_trb.clone()); - self.update_erdp(&*event_ring_guard); + event_trb.reserved(false); + + self.update_erdp(&*event_ring); + + event_trb_index = event_ring.ring.next_index(); } } fn run_with_irq_file(mut self) {