Don't let the MAC add FCS when it is done by app
The application can append FSC to outgoing packets and the MAC can detect and report when a bitflip has occurred. But the MAC can also add FSC if we want, but we can´t do both. When adding FSC by the application and MAC results in the packet drop by the MAC when the TX packet size > (MTU - 4). Having the application append the FSC is preferred. So set the right config bits.
This commit is contained in:
parent
4b6538c8a8
commit
7f7256050c
@ -58,9 +58,11 @@ const TURN_AROUND_BYTE: u8 = 0x00;
|
|||||||
|
|
||||||
/// Packet minimal frame/packet length
|
/// Packet minimal frame/packet length
|
||||||
const ETH_MIN_LEN: usize = 64;
|
const ETH_MIN_LEN: usize = 64;
|
||||||
|
|
||||||
/// Ethernet `Frame Check Sequence` length
|
/// Ethernet `Frame Check Sequence` length
|
||||||
const FSC_LEN: usize = 4;
|
const FSC_LEN: usize = 4;
|
||||||
|
/// Packet minimal frame/packet length without `Frame Check Sequence` length
|
||||||
|
const ETH_MIN_WITHOUT_FSC_LEN: usize = ETH_MIN_LEN - FSC_LEN;
|
||||||
|
|
||||||
/// SPI Header, contains SPI action and register id.
|
/// SPI Header, contains SPI action and register id.
|
||||||
const SPI_HEADER_LEN: usize = 2;
|
const SPI_HEADER_LEN: usize = 2;
|
||||||
/// SPI Header CRC length
|
/// SPI Header CRC length
|
||||||
@ -283,8 +285,8 @@ impl<SPI: SpiDevice> ADIN1110<SPI> {
|
|||||||
|
|
||||||
// ADIN1110 MAC and PHY don´t accept ethernet packet smaller than 64 bytes.
|
// ADIN1110 MAC and PHY don´t accept ethernet packet smaller than 64 bytes.
|
||||||
// So padded the data minus the FCS, FCS is automatilly added to by the MAC.
|
// So padded the data minus the FCS, FCS is automatilly added to by the MAC.
|
||||||
if let Some(pad_len) = (ETH_MIN_LEN - FSC_LEN).checked_sub(frame.len()) {
|
if frame.len() < ETH_MIN_WITHOUT_FSC_LEN {
|
||||||
let _ = tail_data.resize(pad_len, 0x00);
|
let _ = tail_data.resize(ETH_MIN_WITHOUT_FSC_LEN - frame.len(), 0x00);
|
||||||
frame_fcs = frame_fcs.update(&tail_data);
|
frame_fcs = frame_fcs.update(&tail_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,15 +296,18 @@ impl<SPI: SpiDevice> ADIN1110<SPI> {
|
|||||||
|
|
||||||
// len = frame_size + optional padding + 2 bytes Frame header
|
// len = frame_size + optional padding + 2 bytes Frame header
|
||||||
let send_len_orig = frame.len() + tail_data.len() + FRAME_HEADER_LEN;
|
let send_len_orig = frame.len() + tail_data.len() + FRAME_HEADER_LEN;
|
||||||
let spi_pad_len = send_len_orig.next_multiple_of(4);
|
|
||||||
let send_len = u32::try_from(send_len_orig).map_err(|_| AdinError::PACKET_TOO_BIG)?;
|
let send_len = u32::try_from(send_len_orig).map_err(|_| AdinError::PACKET_TOO_BIG)?;
|
||||||
|
|
||||||
// Packet read of write to the MAC packet buffer must be a multipul of 4 bytes!
|
// Packet read of write to the MAC packet buffer must be a multipul of 4 bytes!
|
||||||
if spi_pad_len != send_len_orig {
|
let pad_len = send_len_orig & 0x03;
|
||||||
let spi_pad_len = spi_pad_len - send_len_orig;
|
if pad_len != 0 {
|
||||||
let _ = tail_data.extend_from_slice(&[DONT_CARE_BYTE, DONT_CARE_BYTE, DONT_CARE_BYTE][..spi_pad_len]);
|
let spi_pad_len = 4 - pad_len + tail_data.len();
|
||||||
|
let _ = tail_data.resize(spi_pad_len, DONT_CARE_BYTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.write_reg(sr::TX_FSIZE, send_len).await?;
|
||||||
|
|
||||||
#[cfg(feature = "defmt")]
|
#[cfg(feature = "defmt")]
|
||||||
defmt::trace!(
|
defmt::trace!(
|
||||||
"TX: hdr {} [{}] {:02x}-{:02x}-{:02x} SIZE: {}",
|
"TX: hdr {} [{}] {:02x}-{:02x}-{:02x} SIZE: {}",
|
||||||
@ -314,8 +319,6 @@ impl<SPI: SpiDevice> ADIN1110<SPI> {
|
|||||||
send_len,
|
send_len,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.write_reg(sr::TX_FSIZE, send_len).await?;
|
|
||||||
|
|
||||||
let mut transaction = [
|
let mut transaction = [
|
||||||
Operation::Write(head_data.as_slice()),
|
Operation::Write(head_data.as_slice()),
|
||||||
Operation::Write(frame),
|
Operation::Write(frame),
|
||||||
@ -439,7 +442,12 @@ impl<'d, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, SPI, INT, RST> {
|
|||||||
Err(e) => match e {
|
Err(e) => match e {
|
||||||
AdinError::PACKET_TOO_BIG => {
|
AdinError::PACKET_TOO_BIG => {
|
||||||
#[cfg(feature = "defmt")]
|
#[cfg(feature = "defmt")]
|
||||||
defmt::error!("RX Packet to big, DROP");
|
defmt::error!("RX Packet too big, DROP");
|
||||||
|
self.mac.write_reg(sr::FIFO_CLR, 1).await.unwrap();
|
||||||
|
}
|
||||||
|
AdinError::PACKET_TOO_SMALL => {
|
||||||
|
#[cfg(feature = "defmt")]
|
||||||
|
defmt::error!("RX Packet too small, DROP");
|
||||||
self.mac.write_reg(sr::FIFO_CLR, 1).await.unwrap();
|
self.mac.write_reg(sr::FIFO_CLR, 1).await.unwrap();
|
||||||
}
|
}
|
||||||
AdinError::Spi(_) => {
|
AdinError::Spi(_) => {
|
||||||
@ -622,9 +630,18 @@ pub async fn new<const N_RX: usize, const N_TX: usize, SPI: SpiDevice, INT: Wait
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config2: CRC_APPEND
|
// Check if the FCS is valid in the TX path.
|
||||||
|
let tx_fsc_validation_enable = true;
|
||||||
|
|
||||||
|
// Config0
|
||||||
|
let mut config0 = Config0(0x0000_0006);
|
||||||
|
config0.set_txfcsve(tx_fsc_validation_enable);
|
||||||
|
mac.write_reg(sr::CONFIG0, config0.0).await.unwrap();
|
||||||
|
|
||||||
|
// Config2
|
||||||
let mut config2 = Config2(0x0000_0800);
|
let mut config2 = Config2(0x0000_0800);
|
||||||
config2.set_crc_append(true);
|
// crc_append must be disable if tx_fsc_validation_enable is true!
|
||||||
|
config2.set_crc_append(!tx_fsc_validation_enable);
|
||||||
mac.write_reg(sr::CONFIG2, config2.0).await.unwrap();
|
mac.write_reg(sr::CONFIG2, config2.0).await.unwrap();
|
||||||
|
|
||||||
// Pin Mux Config 1
|
// Pin Mux Config 1
|
||||||
|
Loading…
Reference in New Issue
Block a user