aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers/net
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2012-08-23 12:25:08 +0100
committerMichael Brown <mcb30@ipxe.org>2012-08-23 15:15:35 +0100
commit5d05220ee034bf6989786303d1e195aaf61da986 (patch)
tree9ab67280b38249fda8636d40bfbd84eb12f7b1e5 /src/drivers/net
parentb0ba8923330107ce539b6265af617e497ad5529d (diff)
downloadipxe-5d05220ee034bf6989786303d1e195aaf61da986.tar.gz
[realtek] Use explicit values for RCR.RXFTH and RCR.MXDMA
Some RTL8169 cards (observed with an RTL8169SC) power up with invalid values in RCR.RXFTH and RCR.MXDMA, causing receive DMA to fail. Fix by setting explicit values for both fields. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net')
-rw-r--r--src/drivers/net/realtek.c6
-rw-r--r--src/drivers/net/realtek.h6
2 files changed, 10 insertions, 2 deletions
diff --git a/src/drivers/net/realtek.c b/src/drivers/net/realtek.c
index 6a119db34..2dded0a55 100644
--- a/src/drivers/net/realtek.c
+++ b/src/drivers/net/realtek.c
@@ -526,8 +526,10 @@ static int realtek_open ( struct net_device *netdev ) {
/* Configure receiver */
rcr = readl ( rtl->regs + RTL_RCR );
- rcr &= ~( RTL_RCR_RBLEN_MASK );
- rcr |= ( RTL_RCR_RBLEN_DEFAULT | RTL_RCR_WRAP | RTL_RCR_AB |
+ rcr &= ~( RTL_RCR_RXFTH_MASK | RTL_RCR_RBLEN_MASK |
+ RTL_RCR_MXDMA_MASK );
+ rcr |= ( RTL_RCR_RXFTH_DEFAULT | RTL_RCR_RBLEN_DEFAULT |
+ RTL_RCR_MXDMA_DEFAULT | RTL_RCR_WRAP | RTL_RCR_AB |
RTL_RCR_AM | RTL_RCR_APM | RTL_RCR_AAP );
writel ( rcr, rtl->regs + RTL_RCR );
diff --git a/src/drivers/net/realtek.h b/src/drivers/net/realtek.h
index 1c6bc5442..24ec09e71 100644
--- a/src/drivers/net/realtek.h
+++ b/src/drivers/net/realtek.h
@@ -134,9 +134,15 @@ enum realtek_legacy_status {
/** Receive (Rx) Configuration Register (dword) */
#define RTL_RCR 0x44
+#define RTL_RCR_RXFTH(x) ( (x) << 13 ) /**< Receive FIFO threshold */
+#define RTL_RCR_RXFTH_MASK RTL_RCR_RXFTH ( 0x7 )
+#define RTL_RCR_RXFTH_DEFAULT RTL_RCR_RXFTH ( 0x7 /* Whole packet */ )
#define RTL_RCR_RBLEN(x) ( (x) << 11 ) /**< Receive buffer length */
#define RTL_RCR_RBLEN_MASK RTL_RCR_RBLEN ( 0x3 )
#define RTL_RCR_RBLEN_DEFAULT RTL_RCR_RBLEN ( 0 /* 8kB */ )
+#define RTL_RCR_MXDMA(x) ( (x) << 8 ) /**< Max DMA burst size */
+#define RTL_RCR_MXDMA_MASK RTL_RCR_MXDMA ( 0x7 )
+#define RTL_RCR_MXDMA_DEFAULT RTL_RCR_MXDMA ( 0x7 /* Unlimited */ )
#define RTL_RCR_WRAP 0x00000080UL /**< Overrun receive buffer */
#define RTL_RCR_9356SEL 0x00000040UL /**< EEPROM is a 93C56 */
#define RTL_RCR_AB 0x00000008UL /**< Accept broadcast packets */