aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e
diff options
context:
space:
mode:
authorJesse Brandeburg <jesse.brandeburg@intel.com>2010-01-22 17:56:16 -0500
committerDavid S. Miller <davem@davemloft.net>2010-01-23 04:08:53 -0500
commit9926146b15fd96d78a4f7c32e7a26d50639369f4 (patch)
tree264806b984ed232d80e6998ce895c6497be952b3 /drivers/net/e1000e
parent33d7959a7a9ef36573bfd0cc85ebef29ed4b846d (diff)
e1000/e1000e: don't use small hardware rx buffers
When testing the "e1000: enhance frame fragment detection" (and e1000e) patches we found some bugs with reducing the MTU size. The 1024 byte descriptor used with the 1000 mtu test also (re) introduced the (originally) reported bug, and causes us to need the e1000_clean_tx_irq "enhance frame fragment detection" fix. So what has occured here is that 2.6.32 is only vulnerable for mtu < 1500 due to the jumbo specific routines in both e1000 and e1000e. So, 2.6.32 needs the 2kB buffer len fix for those smaller MTUs, but is not vulnerable to the original issue reported. It has been pointed out that this vulnerability needs to be patched in older kernels that don't have the e1000 jumbo routine. Without the jumbo routines, we need the "enhance frame fragment detection" fix the e1000, old e1000e is only vulnerable for < 1500 mtu, and needs a similar fix. We split the patches up to provide easy backport paths. There is only a slight bit of extra code when this fix and the original "enhance frame fragment detection" fixes are applied, so please apply both, even though it is a bit of overkill. Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r--drivers/net/e1000e/netdev.c20
1 files changed, 1 insertions, 19 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 1ea395b6c992..3d887104a0d8 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -2350,18 +2350,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
2350 rctl &= ~E1000_RCTL_SZ_4096; 2350 rctl &= ~E1000_RCTL_SZ_4096;
2351 rctl |= E1000_RCTL_BSEX; 2351 rctl |= E1000_RCTL_BSEX;
2352 switch (adapter->rx_buffer_len) { 2352 switch (adapter->rx_buffer_len) {
2353 case 256:
2354 rctl |= E1000_RCTL_SZ_256;
2355 rctl &= ~E1000_RCTL_BSEX;
2356 break;
2357 case 512:
2358 rctl |= E1000_RCTL_SZ_512;
2359 rctl &= ~E1000_RCTL_BSEX;
2360 break;
2361 case 1024:
2362 rctl |= E1000_RCTL_SZ_1024;
2363 rctl &= ~E1000_RCTL_BSEX;
2364 break;
2365 case 2048: 2353 case 2048:
2366 default: 2354 default:
2367 rctl |= E1000_RCTL_SZ_2048; 2355 rctl |= E1000_RCTL_SZ_2048;
@@ -4334,13 +4322,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
4334 * fragmented skbs 4322 * fragmented skbs
4335 */ 4323 */
4336 4324
4337 if (max_frame <= 256) 4325 if (max_frame <= 2048)
4338 adapter->rx_buffer_len = 256;
4339 else if (max_frame <= 512)
4340 adapter->rx_buffer_len = 512;
4341 else if (max_frame <= 1024)
4342 adapter->rx_buffer_len = 1024;
4343 else if (max_frame <= 2048)
4344 adapter->rx_buffer_len = 2048; 4326 adapter->rx_buffer_len = 2048;
4345 else 4327 else
4346 adapter->rx_buffer_len = 4096; 4328 adapter->rx_buffer_len = 4096;