pub const PHY_OUI: u32 = 0x0007_C000;
pub const PHY_OUI_MASK: u32 = 0xFFFF_FC00;
pub mod mcsr {
pub const ADDR: u8 = 17;
pub const EDPD_EN: u16 = 1 << 14;
#[cfg(test)]
pub const ENERGYON: u16 = 1 << 1;
}
pub mod pscsr {
pub const ADDR: u8 = 31;
pub const AUTODONE: u16 = 1 << 12;
pub const SPEED_DUPLEX_MASK: u16 = 0b111 << 2;
pub const SPEED_10_HD: u16 = 0b001 << 2;
pub const SPEED_10_FD: u16 = 0b101 << 2;
pub const SPEED_100_HD: u16 = 0b010 << 2;
pub const SPEED_100_FD: u16 = 0b110 << 2;
}
#[allow(dead_code)]
pub mod isr {
pub const ADDR: u8 = 29;
pub const ENERGYON: u16 = 1 << 7;
pub const AN_COMPLETE: u16 = 1 << 6;
pub const REMOTE_FAULT: u16 = 1 << 5;
pub const LINK_DOWN: u16 = 1 << 4;
pub const AN_LP_ACK: u16 = 1 << 3;
pub const PD_FAULT: u16 = 1 << 2;
pub const AN_PAGE_RX: u16 = 1 << 1;
}
#[allow(dead_code)]
pub mod imr {
pub const ADDR: u8 = 30;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn phy_oui_matches_lan8720a() {
let id: u32 = 0x0007_C0F0;
assert_eq!(id & PHY_OUI_MASK, PHY_OUI);
}
#[test]
fn phy_oui_matches_lan8742a() {
let id: u32 = 0x0007_C130;
assert_eq!(id & PHY_OUI_MASK, PHY_OUI);
}
#[test]
fn phy_oui_rejects_unknown() {
let id: u32 = 0x0022_1619;
assert_ne!(id & PHY_OUI_MASK, PHY_OUI);
}
#[test]
fn pscsr_speed_duplex_values() {
assert_eq!(pscsr::SPEED_10_HD, 0x04);
assert_eq!(pscsr::SPEED_10_FD, 0x14);
assert_eq!(pscsr::SPEED_100_HD, 0x08);
assert_eq!(pscsr::SPEED_100_FD, 0x18);
}
#[test]
fn pscsr_speed_duplex_mask() {
assert_eq!(
pscsr::SPEED_10_HD & pscsr::SPEED_DUPLEX_MASK,
pscsr::SPEED_10_HD
);
assert_eq!(
pscsr::SPEED_10_FD & pscsr::SPEED_DUPLEX_MASK,
pscsr::SPEED_10_FD
);
assert_eq!(
pscsr::SPEED_100_HD & pscsr::SPEED_DUPLEX_MASK,
pscsr::SPEED_100_HD
);
assert_eq!(
pscsr::SPEED_100_FD & pscsr::SPEED_DUPLEX_MASK,
pscsr::SPEED_100_FD
);
let val_with_noise: u16 = pscsr::SPEED_100_FD | 0xFF00 | 0x0003;
assert_eq!(
val_with_noise & pscsr::SPEED_DUPLEX_MASK,
pscsr::SPEED_100_FD
);
}
#[test]
fn mcsr_edpd_bit() {
assert_eq!(mcsr::EDPD_EN, 0x4000);
assert_eq!(mcsr::EDPD_EN.count_ones(), 1);
}
}