Skip to content

Commit ccb6e5c

Browse files
committed
[realtek] Clear bit 24 of RCR
On an Asus Z87-K motherboard with an onboard 8168 NIC, booting into Windows 7 and then warm rebooting into iPXE results in a broken RX datapath: packets can be transmitted successfully but garbage is received. A cold reboot clears the problem. A dump of the PHY registers reveals only one difference: in the failure case the bits ADVERTISE_PAUSE_CAP and ADVERTISE_PAUSE_ASYM are cleared. Explicitly setting these bits does not fix the problem. A dump of the MAC registers reveals a few differences, of which the most obvious culprit is the undocumented bit 24 of the Receive Configuration Register (RCR), which is set in the failure case. Explicitly clearing this bit does fix the problem. Reported-by: Sebastian Nielsen <ipxe@sebbe.eu> Reported-by: Oliver Rath <rath@mglug.de> Debugged-by: Sebastian Nielsen <ipxe@sebbe.eu> Tested-by: Sebastian Nielsen <ipxe@sebbe.eu> Signed-off-by: Michael Brown <mcb30@ipxe.org>
1 parent 87b5967 commit ccb6e5c

File tree

2 files changed

+3
-2
lines changed

2 files changed

+3
-2
lines changed

src/drivers/net/realtek.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -708,8 +708,8 @@ static int realtek_open ( struct net_device *netdev ) {
708708

709709
/* Configure receiver */
710710
rcr = readl ( rtl->regs + RTL_RCR );
711-
rcr &= ~( RTL_RCR_RXFTH_MASK | RTL_RCR_RBLEN_MASK |
712-
RTL_RCR_MXDMA_MASK );
711+
rcr &= ~( RTL_RCR_STOP_WORKING | RTL_RCR_RXFTH_MASK |
712+
RTL_RCR_RBLEN_MASK | RTL_RCR_MXDMA_MASK );
713713
rcr |= ( RTL_RCR_RXFTH_DEFAULT | RTL_RCR_RBLEN_DEFAULT |
714714
RTL_RCR_MXDMA_DEFAULT | RTL_RCR_WRAP | RTL_RCR_AB |
715715
RTL_RCR_AM | RTL_RCR_APM | RTL_RCR_AAP );

src/drivers/net/realtek.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ enum realtek_legacy_status {
140140

141141
/** Receive (Rx) Configuration Register (dword) */
142142
#define RTL_RCR 0x44
143+
#define RTL_RCR_STOP_WORKING 0x01000000UL /**< Here be dragons */
143144
#define RTL_RCR_RXFTH(x) ( (x) << 13 ) /**< Receive FIFO threshold */
144145
#define RTL_RCR_RXFTH_MASK RTL_RCR_RXFTH ( 0x7 )
145146
#define RTL_RCR_RXFTH_DEFAULT RTL_RCR_RXFTH ( 0x7 /* Whole packet */ )

0 commit comments

Comments
 (0)