forked from M-Labs/artiq
firmware: improve DRTIO log messages
This commit is contained in:
parent
663432adbd
commit
4d889c0c4e
|
@ -114,23 +114,21 @@ pub mod drtio {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wait_tsc_ack(linkno: u8, io: &Io) -> bool {
|
fn wait_tsc_ack(linkno: u8, io: &Io) -> Result<(), &'static str> {
|
||||||
loop {
|
loop {
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
if !link_rx_up(linkno) {
|
if !link_rx_up(linkno) {
|
||||||
return false;
|
return Err("link went down");
|
||||||
}
|
}
|
||||||
count += 1;
|
count += 1;
|
||||||
if count > 200 {
|
if count > 200 {
|
||||||
return false;
|
return Err("timeout");
|
||||||
}
|
}
|
||||||
io.sleep(100).unwrap();
|
io.sleep(100).unwrap();
|
||||||
// TSCAck is the only aux packet that is sent spontaneously
|
// TSCAck is the only aux packet that is sent spontaneously
|
||||||
// by the satellite, in response to a TSC set on the RT link.
|
// by the satellite, in response to a TSC set on the RT link.
|
||||||
let pr = drtioaux::recv_link(linkno);
|
if let Ok(Some(drtioaux::Packet::TSCAck)) = drtioaux::recv_link(linkno) {
|
||||||
match pr {
|
return Ok(())
|
||||||
Ok(Some(drtioaux::Packet::TSCAck)) => return true,
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -194,13 +192,13 @@ pub mod drtio {
|
||||||
set_link_up(linkno, true);
|
set_link_up(linkno, true);
|
||||||
init_buffer_space(linkno);
|
init_buffer_space(linkno);
|
||||||
sync_tsc(linkno);
|
sync_tsc(linkno);
|
||||||
if !wait_tsc_ack(linkno, &io) {
|
if wait_tsc_ack(linkno, &io).is_err() {
|
||||||
info!("[LINK#{}] remote failed to ack TSC", linkno);
|
error!("[LINK#{}] remote failed to ack TSC", linkno);
|
||||||
} else {
|
} else {
|
||||||
info!("[LINK#{}] link initialization completed", linkno);
|
info!("[LINK#{}] link initialization completed", linkno);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
info!("[LINK#{}] ping failed", linkno);
|
error!("[LINK#{}] ping failed", linkno);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -298,7 +298,7 @@ pub extern fn main() -> i32 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("link is up, switching to recovered clock");
|
info!("uplink is up, switching to recovered clock");
|
||||||
si5324::siphaser::select_recovered_clock(true).expect("failed to switch clocks");
|
si5324::siphaser::select_recovered_clock(true).expect("failed to switch clocks");
|
||||||
si5324::siphaser::calibrate_skew(SIPHASER_PHASE).expect("failed to calibrate skew");
|
si5324::siphaser::calibrate_skew(SIPHASER_PHASE).expect("failed to calibrate skew");
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ pub extern fn main() -> i32 {
|
||||||
rep.service();
|
rep.service();
|
||||||
}
|
}
|
||||||
if drtiosat_tsc_loaded() {
|
if drtiosat_tsc_loaded() {
|
||||||
info!("TSC loaded");
|
info!("TSC loaded from uplink");
|
||||||
#[cfg(has_ad9154)]
|
#[cfg(has_ad9154)]
|
||||||
{
|
{
|
||||||
if let Err(e) = board_artiq::jesd204sync::sysref_auto_rtio_align() {
|
if let Err(e) = board_artiq::jesd204sync::sysref_auto_rtio_align() {
|
||||||
|
@ -343,7 +343,9 @@ pub extern fn main() -> i32 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for rep in repeaters.iter() {
|
for rep in repeaters.iter() {
|
||||||
rep.sync_tsc();
|
if rep.sync_tsc().is_err() {
|
||||||
|
error!("remote failed to ack TSC");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if let Err(e) = drtioaux::send_link(0, &drtioaux::Packet::TSCAck) {
|
if let Err(e) = drtioaux::send_link(0, &drtioaux::Packet::TSCAck) {
|
||||||
error!("aux packet error: {}", e);
|
error!("aux packet error: {}", e);
|
||||||
|
@ -357,7 +359,7 @@ pub extern fn main() -> i32 {
|
||||||
drtiosat_reset_phy(true);
|
drtiosat_reset_phy(true);
|
||||||
drtiosat_reset(true);
|
drtiosat_reset(true);
|
||||||
drtiosat_tsc_loaded();
|
drtiosat_tsc_loaded();
|
||||||
info!("link is down, switching to local crystal clock");
|
info!("uplink is down, switching to local crystal clock");
|
||||||
si5324::siphaser::select_recovered_clock(false).expect("failed to switch clocks");
|
si5324::siphaser::select_recovered_clock(false).expect("failed to switch clocks");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ fn rep_link_rx_up(linkno: u8) -> bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy, PartialEq)]
|
||||||
enum RepeaterState {
|
enum RepeaterState {
|
||||||
Down,
|
Down,
|
||||||
SendPing { ping_count: u16 },
|
SendPing { ping_count: u16 },
|
||||||
|
@ -63,7 +63,7 @@ impl Repeater {
|
||||||
if rep_link_rx_up(self.repno) {
|
if rep_link_rx_up(self.repno) {
|
||||||
if let Ok(Some(drtioaux::Packet::EchoReply)) = drtioaux::recv_link(self.auxno) {
|
if let Ok(Some(drtioaux::Packet::EchoReply)) = drtioaux::recv_link(self.auxno) {
|
||||||
info!("[REP#{}] remote replied after {} packets", self.repno, ping_count);
|
info!("[REP#{}] remote replied after {} packets", self.repno, ping_count);
|
||||||
if !self.sync_tsc() {
|
if self.sync_tsc().is_err() {
|
||||||
error!("[REP#{}] remote failed to ack TSC", self.repno);
|
error!("[REP#{}] remote failed to ack TSC", self.repno);
|
||||||
self.state = RepeaterState::Failed;
|
self.state = RepeaterState::Failed;
|
||||||
return;
|
return;
|
||||||
|
@ -100,7 +100,11 @@ impl Repeater {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sync_tsc(&self) -> bool {
|
pub fn sync_tsc(&self) -> Result<(), &'static str> {
|
||||||
|
if self.state != RepeaterState::Up {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let repno = self.repno as usize;
|
let repno = self.repno as usize;
|
||||||
unsafe {
|
unsafe {
|
||||||
(csr::DRTIOREP[repno].set_time_write)(1);
|
(csr::DRTIOREP[repno].set_time_write)(1);
|
||||||
|
@ -110,15 +114,15 @@ impl Repeater {
|
||||||
let timeout = clock::get_ms() + 200;
|
let timeout = clock::get_ms() + 200;
|
||||||
loop {
|
loop {
|
||||||
if !rep_link_rx_up(self.repno) {
|
if !rep_link_rx_up(self.repno) {
|
||||||
return false;
|
return Err("link went down");
|
||||||
}
|
}
|
||||||
if clock::get_ms() > timeout {
|
if clock::get_ms() > timeout {
|
||||||
return false;
|
return Err("timeout");
|
||||||
}
|
}
|
||||||
// TSCAck is the only aux packet that is sent spontaneously
|
// TSCAck is the only aux packet that is sent spontaneously
|
||||||
// by the satellite, in response to a TSC set on the RT link.
|
// by the satellite, in response to a TSC set on the RT link.
|
||||||
if let Ok(Some(drtioaux::Packet::TSCAck)) = drtioaux::recv_link(self.auxno) {
|
if let Ok(Some(drtioaux::Packet::TSCAck)) = drtioaux::recv_link(self.auxno) {
|
||||||
return true;
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,5 +134,5 @@ impl Repeater {
|
||||||
|
|
||||||
pub fn service(&self) { }
|
pub fn service(&self) { }
|
||||||
|
|
||||||
pub fn sync_tsc(&self) { }
|
pub fn sync_tsc(&self) -> Result<(), &'static str> { Ok(()) }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue