Do not block on IRQ read, add more debugging to RTL8168/9
This commit is contained in:
parent
2608b93dbb
commit
9037dee817
3 changed files with 39 additions and 31 deletions
|
@ -1,10 +1,9 @@
|
|||
use core::{mem, str};
|
||||
use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
|
||||
use spin::{Mutex, Once};
|
||||
use spin::Mutex;
|
||||
|
||||
use arch::interrupt::irq::acknowledge;
|
||||
use context;
|
||||
use sync::WaitCondition;
|
||||
use syscall::error::*;
|
||||
use syscall::flag::EVENT_READ;
|
||||
use syscall::scheme::Scheme;
|
||||
|
@ -14,22 +13,11 @@ pub static IRQ_SCHEME_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
|||
/// IRQ queues
|
||||
static ACKS: Mutex<[usize; 16]> = Mutex::new([0; 16]);
|
||||
static COUNTS: Mutex<[usize; 16]> = Mutex::new([0; 16]);
|
||||
static WAITS: Once<[WaitCondition; 16]> = Once::new();
|
||||
|
||||
fn init_waits() -> [WaitCondition; 16] {
|
||||
[
|
||||
WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new(),
|
||||
WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new(),
|
||||
WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new(),
|
||||
WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new()
|
||||
]
|
||||
}
|
||||
|
||||
/// Add to the input queue
|
||||
#[no_mangle]
|
||||
pub extern fn irq_trigger(irq: u8) {
|
||||
COUNTS.lock()[irq as usize] += 1;
|
||||
WAITS.call_once(init_waits)[irq as usize].notify();
|
||||
context::event::trigger(IRQ_SCHEME_ID.load(Ordering::SeqCst), irq as usize, EVENT_READ, mem::size_of::<usize>());
|
||||
}
|
||||
|
||||
|
@ -59,17 +47,15 @@ impl Scheme for IrqScheme {
|
|||
fn read(&self, file: usize, buffer: &mut [u8]) -> Result<usize> {
|
||||
// Ensures that the length of the buffer is larger than the size of a usize
|
||||
if buffer.len() >= mem::size_of::<usize>() {
|
||||
loop {
|
||||
let ack = ACKS.lock()[file];
|
||||
let current = COUNTS.lock()[file];
|
||||
if ack != current {
|
||||
// Safe if the length of the buffer is larger than the size of a usize
|
||||
assert!(buffer.len() >= mem::size_of::<usize>());
|
||||
unsafe { *(buffer.as_mut_ptr() as *mut usize) = current; }
|
||||
return Ok(mem::size_of::<usize>());
|
||||
} else {
|
||||
WAITS.call_once(init_waits)[file].wait();
|
||||
}
|
||||
let ack = ACKS.lock()[file];
|
||||
let current = COUNTS.lock()[file];
|
||||
if ack != current {
|
||||
// Safe if the length of the buffer is larger than the size of a usize
|
||||
assert!(buffer.len() >= mem::size_of::<usize>());
|
||||
unsafe { *(buffer.as_mut_ptr() as *mut usize) = current; }
|
||||
Ok(mem::size_of::<usize>())
|
||||
} else {
|
||||
Ok(0)
|
||||
}
|
||||
} else {
|
||||
Err(Error::new(EINVAL))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue