diff options
author | Jesse Brandeburg <jesse.brandeburg@intel.com> | 2009-07-06 06:44:39 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-07-06 21:07:51 -0400 |
commit | edbbb3ca107715067b27a71e6ea7f58750912aa2 (patch) | |
tree | 4b9772ff2dc239ad61812cce4b4e6249a25512a2 /drivers/net/e1000/e1000.h | |
parent | 94c9e5a89349a1f1ebabe0876c059dc387b8b2a0 (diff) |
e1000: implement jumbo receive with partial descriptors
This is code extremely similar to what is committed in e1000e
already.
e1000 will no longer request 32kB slab buffers to support jumbo
frames on PCI/PCI-X adapters. This will significantly reduce the
likelyhood of order:3 allocation failures.
This new code adds support for using pages as receive buffers,
and the driver will chain multiple pages together to build a
jumbo frame for OS consumption.
The hardware takes a power of two buffer size and will
dump as much data as it can receive into 1 or more buffers.
The benefits of applying this are
1) stop akpm's dissing :-) of this lame e1000 behavior [1]
2) more efficient memory allocation (half) when using jumbo
frames, which will also allow for much better socket utilization
with jumbos since the socket is charged for the full allocation
of each receive buffer, regardless of how much is used.
3) this was a feature request by a customer
4) copybreak for small packets < 256 bytes still applies
[1] http://lkml.org/lkml/2008/7/10/68
http://article.gmane.org/gmane.linux.network/130986
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
CC: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/e1000/e1000.h')
-rw-r--r-- | drivers/net/e1000/e1000.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h index c87f2cbdbae3..1a4f89c66a26 100644 --- a/drivers/net/e1000/e1000.h +++ b/drivers/net/e1000/e1000.h | |||
@@ -140,7 +140,7 @@ do { \ | |||
140 | #define E1000_FC_HIGH_DIFF 0x1638 /* High: 5688 bytes below Rx FIFO size */ | 140 | #define E1000_FC_HIGH_DIFF 0x1638 /* High: 5688 bytes below Rx FIFO size */ |
141 | #define E1000_FC_LOW_DIFF 0x1640 /* Low: 5696 bytes below Rx FIFO size */ | 141 | #define E1000_FC_LOW_DIFF 0x1640 /* Low: 5696 bytes below Rx FIFO size */ |
142 | 142 | ||
143 | #define E1000_FC_PAUSE_TIME 0x0680 /* 858 usec */ | 143 | #define E1000_FC_PAUSE_TIME 0xFFFF /* pause for the max or until send xon */ |
144 | 144 | ||
145 | /* How many Tx Descriptors do we need to call netif_wake_queue ? */ | 145 | /* How many Tx Descriptors do we need to call netif_wake_queue ? */ |
146 | #define E1000_TX_QUEUE_WAKE 16 | 146 | #define E1000_TX_QUEUE_WAKE 16 |
@@ -164,6 +164,7 @@ do { \ | |||
164 | struct e1000_buffer { | 164 | struct e1000_buffer { |
165 | struct sk_buff *skb; | 165 | struct sk_buff *skb; |
166 | dma_addr_t dma; | 166 | dma_addr_t dma; |
167 | struct page *page; | ||
167 | unsigned long time_stamp; | 168 | unsigned long time_stamp; |
168 | u16 length; | 169 | u16 length; |
169 | u16 next_to_watch; | 170 | u16 next_to_watch; |
@@ -205,6 +206,7 @@ struct e1000_rx_ring { | |||
205 | unsigned int next_to_clean; | 206 | unsigned int next_to_clean; |
206 | /* array of buffer information structs */ | 207 | /* array of buffer information structs */ |
207 | struct e1000_buffer *buffer_info; | 208 | struct e1000_buffer *buffer_info; |
209 | struct sk_buff *rx_skb_top; | ||
208 | 210 | ||
209 | /* cpu for rx queue */ | 211 | /* cpu for rx queue */ |
210 | int cpu; | 212 | int cpu; |