Compare commits

..

6 Commits

Author SHA1 Message Date
e73ec731aa libboard_zynq/smoltcp: default without ipv6 support
SZL netboot binary size too large with ipv6.
We can enable the ipv6 support in the runtime crate instead.
2020-08-31 12:07:20 +08:00
73e4e4fd03 libcortex_a9/sync_channel: fixed memory leak
ptr::drop_in_place would not drop the box content properly,
the best way is to convert it back to a box and implicitly drop it.
2020-08-27 17:03:26 +08:00
273f9ea72b libboard_zynq/eth: fix comment 2020-08-24 21:47:10 +08:00
671968bac3 libboard_zynq/eth: fixed tx lost packet 2020-08-24 15:51:01 +08:00
39f672dde8 libasync/smoltcp/mod: prevent duplicated wakers 2020-08-24 15:25:03 +08:00
c13ca614ef libcortex_a9/mutex: use AcqRel for CAS operations 2020-08-24 15:24:20 +08:00
5 changed files with 21 additions and 22 deletions

View File

@ -30,7 +30,7 @@ impl Sockets {
let sockets = RefCell::new(SocketSet::new(sockets_storage)); let sockets = RefCell::new(SocketSet::new(sockets_storage));
let wakers = RefCell::new(Vec::new()); let wakers = RefCell::new(Vec::new());
let instance = Sockets { let instance = Sockets {
sockets, sockets,
wakers, wakers,
@ -57,7 +57,7 @@ impl Sockets {
pub(crate) fn instance() -> &'static Self { pub(crate) fn instance() -> &'static Self {
unsafe { SOCKETS.as_ref().expect("Sockets") } unsafe { SOCKETS.as_ref().expect("Sockets") }
} }
fn poll<'b, 'c, 'e, D: for<'d> Device<'d>>( fn poll<'b, 'c, 'e, D: for<'d> Device<'d>>(
&self, &self,
iface: &mut EthernetInterface<'b, 'c, 'e, D>, iface: &mut EthernetInterface<'b, 'c, 'e, D>,
@ -81,7 +81,14 @@ impl Sockets {
/// TODO: this was called through eg. TcpStream, another poll() /// TODO: this was called through eg. TcpStream, another poll()
/// might want to send packets before sleeping for an interrupt. /// might want to send packets before sleeping for an interrupt.
pub(crate) fn register_waker(waker: Waker) { pub(crate) fn register_waker(waker: Waker) {
Self::instance().wakers.borrow_mut() let mut wakers = Self::instance().wakers.borrow_mut();
.push(waker); for (i, w) in wakers.iter().enumerate() {
if w.will_wake(&waker) {
let last = wakers.len() - 1;
wakers.swap(i, last);
return;
}
}
wakers.push(waker);
} }
} }

View File

@ -8,6 +8,7 @@ edition = "2018"
[features] [features]
target_zc706 = [] target_zc706 = []
target_cora_z7_10 = [] target_cora_z7_10 = []
ipv6 = [ "smoltcp/proto-ipv6" ]
[dependencies] [dependencies]
volatile-register = "0.2" volatile-register = "0.2"
@ -21,5 +22,5 @@ libcortex_a9 = { path = "../libcortex_a9" }
[dependencies.smoltcp] [dependencies.smoltcp]
version = "0.6" version = "0.6"
features = ["ethernet", "proto-ipv4", "proto-ipv6", "socket-tcp"] features = ["ethernet", "proto-ipv4", "socket-tcp"]
default-features = false default-features = false

View File

@ -132,10 +132,8 @@ impl<'a> Drop for PktRef<'a> {
dcc_slice(self.buffer); dcc_slice(self.buffer);
self.entry.word1.modify(|_, w| w.used(false)); self.entry.word1.modify(|_, w| w.used(false));
if ! self.regs.tx_status.read().tx_go() { // Start the TX engine
// Start TX if not already running self.regs.net_ctrl.modify(|_, w| w.start_tx(true));
self.regs.net_ctrl.modify(|_, w| w.start_tx(true));
}
} }
} }
@ -166,10 +164,7 @@ impl<'a> smoltcp::phy::TxToken for Token<'a> {
None => None =>
Err(smoltcp::Error::Exhausted), Err(smoltcp::Error::Exhausted),
Some(mut pktref) => { Some(mut pktref) => {
let result = f(pktref.deref_mut()); f(pktref.deref_mut())
// TODO: on result.is_err() don;t send
drop(pktref);
result
} }
} }
} }

View File

@ -3,7 +3,7 @@ use core::sync::atomic::{AtomicU32, Ordering};
use core::cell::UnsafeCell; use core::cell::UnsafeCell;
use super::{ use super::{
spin_lock_yield, notify_spin_lock, spin_lock_yield, notify_spin_lock,
asm::{dmb, enter_critical, exit_critical} asm::{enter_critical, exit_critical}
}; };
const LOCKED: u32 = 1; const LOCKED: u32 = 1;
@ -32,30 +32,27 @@ impl<T> Mutex<T> {
/// Lock the Mutex, blocks when already locked /// Lock the Mutex, blocks when already locked
pub fn lock(&self) -> MutexGuard<T> { pub fn lock(&self) -> MutexGuard<T> {
let mut irq = unsafe { enter_critical() }; let mut irq = unsafe { enter_critical() };
while self.locked.compare_and_swap(UNLOCKED, LOCKED, Ordering::Acquire) != UNLOCKED { while self.locked.compare_and_swap(UNLOCKED, LOCKED, Ordering::AcqRel) != UNLOCKED {
unsafe { unsafe {
exit_critical(irq); exit_critical(irq);
spin_lock_yield(); spin_lock_yield();
irq = enter_critical(); irq = enter_critical();
} }
} }
dmb();
MutexGuard { mutex: self, irq } MutexGuard { mutex: self, irq }
} }
pub fn try_lock(&self) -> Option<MutexGuard<T>> { pub fn try_lock(&self) -> Option<MutexGuard<T>> {
let irq = unsafe { enter_critical() }; let irq = unsafe { enter_critical() };
if self.locked.compare_and_swap(UNLOCKED, LOCKED, Ordering::Acquire) != UNLOCKED { if self.locked.compare_and_swap(UNLOCKED, LOCKED, Ordering::AcqRel) != UNLOCKED {
unsafe { exit_critical(irq) }; unsafe { exit_critical(irq) };
None None
} else { } else {
dmb();
Some(MutexGuard { mutex: self, irq }) Some(MutexGuard { mutex: self, irq })
} }
} }
fn unlock(&self) { fn unlock(&self) {
dmb();
self.locked.store(UNLOCKED, Ordering::Release); self.locked.store(UNLOCKED, Ordering::Release);
notify_spin_lock(); notify_spin_lock();

View File

@ -1,7 +1,6 @@
use core::{ use core::{
pin::Pin, pin::Pin,
future::Future, future::Future,
ptr::drop_in_place,
sync::atomic::{AtomicPtr, AtomicUsize, Ordering}, sync::atomic::{AtomicPtr, AtomicUsize, Ordering},
task::{Context, Poll}, task::{Context, Poll},
}; };
@ -38,7 +37,7 @@ impl<'a, T> Sender<'a, T> where T: Clone {
notify_spin_lock(); notify_spin_lock();
if !prev.is_null() { if !prev.is_null() {
unsafe { unsafe {
drop_in_place(prev); Box::from_raw(prev);
} }
} }
Ok(()) Ok(())
@ -92,7 +91,7 @@ impl<'a, T> Sender<'a, T> where T: Clone {
for v in self.list.iter() { for v in self.list.iter() {
let original = v.swap(core::ptr::null_mut(), Ordering::Relaxed); let original = v.swap(core::ptr::null_mut(), Ordering::Relaxed);
if !original.is_null() { if !original.is_null() {
drop_in_place(original); Box::from_raw(original);
} }
} }
} }