rtl8168d: log link state at end of init() via phys_sts register
The existing init() resets the chip, sets up descriptor rings, and enables TX+RX. It does not read phys_sts, so a driver that comes up on bare metal with the link not yet up (autoneg in progress, no cable, or forced-power-down from the BIOS) silently transmits into a dead medium. Add a single phys_sts read at the end of init(). The Realtek part numbers bits as: bit 0 = link up, bit 1 = 100 Mb/s, bit 2 = 1000 Mb/s, bits 4-5 = duplex encoding. When the link is not up, log a warn!() with the raw phys_sts byte so the operator can correlate with the link partner. When the link is up, log the detected speed as info!(). This is a real surface artefact (visible in the dmesg/log) and does NOT introduce any new registers or commands; the chip reports phys_sts on every read regardless of whether the driver queries it. The full PHY access (MII writes to PHY register 0x1F to read the chip version, then BMCR soft-reset + autoneg advertisement) remains [DEFERRED] until we have an MDIO read/write infrastructure exposed in redox-driver-sys or linux-kpi that works with the Redox MII bus scheme.
This commit is contained in:
@@ -342,6 +342,31 @@ impl Rtl8168 {
|
||||
// Lock config
|
||||
self.regs.cmd_9346.write(0);
|
||||
|
||||
// Read physical link state. The Realtek part numbers its
|
||||
// phys_sts bits: bit 0 = link up, bit 1 = speed-100,
|
||||
// bit 2 = speed-1000, bits 4-5 encode the duplex. This is
|
||||
// a read-only check; a failed link is not an error but
|
||||
// produces a warning that helps diagnose a missing
|
||||
// autonegotiation on bare metal. The driver continues to
|
||||
// emit TX descriptors regardless; if no cable is present
|
||||
// the peer simply does not reply.
|
||||
let phys_sts = self.regs.phys_sts.read();
|
||||
if phys_sts & 0x01 == 0 {
|
||||
log::warn!(
|
||||
"rtl8168d: link is down at start; check cable / \
|
||||
autoneg status (phys_sts = 0x{:02x})",
|
||||
phys_sts
|
||||
);
|
||||
} else {
|
||||
let mbps = match (phys_sts >> 4) & 0x03 {
|
||||
0b00 => 10,
|
||||
0b01 => 100,
|
||||
0b10 => 1000,
|
||||
_ => 0,
|
||||
};
|
||||
log::info!("rtl8168d: link up at {} Mb/s", mbps);
|
||||
}
|
||||
|
||||
log::debug!("Complete!");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user