[U-Boot] [PATCH] e1000e : Set Receive Threshold granularity to number of

Ruchika Gupta ruchika.gupta at freescale.com
Thu Apr 19 13:28:48 CEST 2012


In RXDCTL register, WTHRESH controls the write back of processed receive
descriptors. WTHRESH controls the write back of processed receive
descriptors. This threshold refers to the number of receive
descriptors in the Ethernet controllers on-chip buffer which are
ready to be written back to host memory. In the absence of
external events (explicit flushes), the write back occurs only after
more than WTHRESH descriptors are available for write back.
A value of WTHRESH can be in either cache line units, or based on
number of descriptors based on RXDCTL.GRAN. By default it is set to
cache line granularoty.

In e1000e driver, receive descriptor queue is configured such that
hardware can add only 1 descriptor at a time. So the WTHRESH granularity
should be set to single descriptor. This would ensure that every time 
controller fills a Rx descriptor, it is flushed to host memory.

This change fixes timeout which was seen when tftping large files.

Signed-off-by: Ruchika Gupta <ruchika.gupta at freescale.com>
Signed-off-by: Vakul Garg <vakul at freescale.com>
Acked-by: Roy Zang <tie-fei.zang at freescale.com>
---
 drivers/net/e1000.c |   10 ++++++++++
 drivers/net/e1000.h |    1 +
 2 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c
index 98145bc..1f3c2b0 100644
--- a/drivers/net/e1000.c
+++ b/drivers/net/e1000.c
@@ -1703,6 +1703,16 @@ e1000_init_hw(struct eth_device *nic)
 		E1000_WRITE_REG(hw, TXDCTL, ctrl);
 	}
 
+	/* Set the receive descriptor write back policy */
+
+	if (hw->mac_type >= e1000_82571) {
+		ctrl = E1000_READ_REG(hw, RXDCTL);
+		ctrl =
+		    (ctrl & ~E1000_RXDCTL_WTHRESH) |
+		    E1000_RXDCTL_FULL_RX_DESC_WB;
+		E1000_WRITE_REG(hw, RXDCTL, ctrl);
+	}
+
 	switch (hw->mac_type) {
 	default:
 		break;
diff --git a/drivers/net/e1000.h b/drivers/net/e1000.h
index 720d8c6..cdb0e36 100644
--- a/drivers/net/e1000.h
+++ b/drivers/net/e1000.h
@@ -1518,6 +1518,7 @@ struct e1000_hw {
 #define E1000_RXDCTL_HTHRESH 0x00003F00	/* RXDCTL Host Threshold */
 #define E1000_RXDCTL_WTHRESH 0x003F0000	/* RXDCTL Writeback Threshold */
 #define E1000_RXDCTL_GRAN    0x01000000	/* RXDCTL Granularity */
+#define E1000_RXDCTL_FULL_RX_DESC_WB 0x01010000	/* GRAN=1, WTHRESH=1 */
 
 /* Transmit Descriptor Control */
 #define E1000_TXDCTL_PTHRESH 0x0000003F	/* TXDCTL Prefetch Threshold */
-- 
1.7.4.4




More information about the U-Boot mailing list