diff options
| -rw-r--r-- | src/lib.rs | 29 |
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 | ||
| 532 | pub async fn new<'a, PWR, SPI>( | 532 | pub 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); |
