aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/lib.rs b/src/lib.rs
index f818caf6b..5e79e6e40 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -526,7 +526,7 @@ pub struct Runner<'a, PWR, SPI> {
526 sdpcm_seq: u8, 526 sdpcm_seq: u8,
527 backplane_window: u32, 527 backplane_window: u32,
528 528
529 tx_seq_max: u8, 529 sdpcm_seq_max: u8,
530} 530}
531 531
532pub async fn new<'a, PWR, SPI>( 532pub async fn new<'a, PWR, SPI>(
@@ -549,7 +549,7 @@ where
549 sdpcm_seq: 0, 549 sdpcm_seq: 0,
550 backplane_window: 0xAAAA_AAAA, 550 backplane_window: 0xAAAA_AAAA,
551 551
552 tx_seq_max: 1, 552 sdpcm_seq_max: 1,
553 }; 553 };
554 554
555 runner.init(firmware).await; 555 runner.init(firmware).await;
@@ -673,17 +673,20 @@ where
673 let mut buf = [0; 512]; 673 let mut buf = [0; 512];
674 loop { 674 loop {
675 // Send stuff 675 // Send stuff
676 // TODO flow control 676 // TODO flow control not yet complete
677 if self.sdpcm_seq == self.tx_seq_max || self.tx_seq_max.wrapping_sub(self.sdpcm_seq) & 0x80 != 0 { 677 if !self.has_credit() {
678 warn!("TX stalled"); 678 warn!("TX stalled");
679 } else { 679 } else {
680 if let IoctlState::Pending { kind, cmd, iface, buf } = self.state.ioctl_state.get() { 680 if let IoctlState::Pending { kind, cmd, iface, buf } = self.state.ioctl_state.get() {
681 self.send_ioctl(kind, cmd, iface, unsafe { &*buf }).await; 681 self.send_ioctl(kind, cmd, iface, unsafe { &*buf }).await;
682 self.state.ioctl_state.set(IoctlState::Sent { buf }); 682 self.state.ioctl_state.set(IoctlState::Sent { buf });
683 } 683 }
684 684 if !self.has_credit() {
685 if let Ok(p) = self.state.tx_channel.try_recv() { 685 warn!("TX stalled");
686 self.send_packet(&p).await; 686 } else {
687 if let Ok(p) = self.state.tx_channel.try_recv() {
688 self.send_packet(&p).await;
689 }
687 } 690 }
688 } 691 }
689 692
@@ -906,14 +909,18 @@ where
906 909
907 fn update_credit(&mut self, sdpcm_header: &SdpcmHeader) { 910 fn update_credit(&mut self, sdpcm_header: &SdpcmHeader) {
908 if sdpcm_header.channel_and_flags & 0xf < 3 { 911 if sdpcm_header.channel_and_flags & 0xf < 3 {
909 let mut tx_seq_max = sdpcm_header.bus_data_credit; 912 let mut sdpcm_seq_max = sdpcm_header.bus_data_credit;
910 if tx_seq_max - self.sdpcm_seq > 0x40 { 913 if sdpcm_seq_max - self.sdpcm_seq > 0x40 {
911 tx_seq_max = self.sdpcm_seq + 2; 914 sdpcm_seq_max = self.sdpcm_seq + 2;
912 } 915 }
913 self.tx_seq_max = tx_seq_max; 916 self.sdpcm_seq_max = sdpcm_seq_max;
914 } 917 }
915 } 918 }
916 919
920 fn has_credit(&mut self) -> bool {
921 self.sdpcm_seq != self.sdpcm_seq_max && self.sdpcm_seq_max.wrapping_sub(self.sdpcm_seq) & 0x80 == 0
922 }
923
917 async fn send_ioctl(&mut self, kind: u32, cmd: u32, iface: u32, data: &[u8]) { 924 async fn send_ioctl(&mut self, kind: u32, cmd: u32, iface: u32, data: &[u8]) {
918 let mut buf = [0; 512]; 925 let mut buf = [0; 512];
919 let buf8 = slice8_mut(&mut buf); 926 let buf8 = slice8_mut(&mut buf);