From 9c94a5cd86aeafd1e05d610fc0e34196a840b5c0 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 23 Oct 2016 15:26:36 -0600 Subject: [PATCH] Event based ethernetd --- e1000d/src/device.rs | 22 +++++++++++++++++++++- e1000d/src/main.rs | 5 +++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/e1000d/src/device.rs b/e1000d/src/device.rs index 86047283d1..edadeb1aab 100644 --- a/e1000d/src/device.rs +++ b/e1000d/src/device.rs @@ -140,7 +140,8 @@ impl Scheme for Intel8254x { } } - Err(Error::new(EWOULDBLOCK)) + //Err(Error::new(EWOULDBLOCK)) + Ok(0) } fn write(&self, _id: usize, buf: &[u8]) -> Result { @@ -225,6 +226,25 @@ impl Intel8254x { icr != 0 } + pub fn next_read(&self) -> usize { + let head = unsafe { self.read(RDH) }; + let mut tail = unsafe { self.read(RDT) }; + + tail += 1; + if tail >= self.receive_ring.len() as u32 { + tail = 0; + } + + if tail != head { + let rd = unsafe { &* (self.receive_ring.as_ptr().offset(tail as isize) as *const Rd) }; + if rd.status & RD_DD == RD_DD { + return rd.length as usize; + } + } + + 0 + } + pub unsafe fn read(&self, register: u32) -> u32 { ptr::read_volatile((self.base + register as usize) as *mut u32) } diff --git a/e1000d/src/main.rs b/e1000d/src/main.rs index a80303bc94..c6a98f277c 100644 --- a/e1000d/src/main.rs +++ b/e1000d/src/main.rs @@ -69,6 +69,11 @@ fn main() { todo.remove(i); } } + + let next_read = device_irq.next_read(); + if next_read > 0 { + return Ok(Some(next_read)); + } } Ok(None) }).expect("e1000d: failed to catch events on IRQ file");