From 5b24364acc04b434a633a213b34248d2b1153990 Mon Sep 17 00:00:00 2001 From: Neil Horman Date: Mon, 29 Mar 2010 13:16:02 -0700 Subject: [PATCH] --- yaml --- r: 189183 b: refs/heads/master c: c0cd884af045338476b8e69a61fceb3f34ff22f1 h: refs/heads/master i: 189181: 156cdc1298387ef6ff2af4ea5d966a57f16e33b5 189179: 31af1e394434ae0e286f0e01997c5eda83c7a6b6 189175: 8eeff1918ede5592e93b458b3786e5ec7823ce12 189167: 0b53e6f651a74fb56cda5a105fabb5704f0c04d1 189151: f0369dee00e801de5fc6c0606f67ef6bd68c78ea 189119: 7b2fb55c5cb2fe165abf88160145e2109bee4ba8 189055: a85d903278214b149205900f159dacc2534fa1f6 188927: 7056ffa98e2521b71508afa7844e7cee4ee8f370 v: v3 --- [refs] | 2 +- trunk/drivers/net/r8169.c | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 5a8cd7ae9145..cbaf53f59de3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 54c1a859efd9fd6cda05bc700315ba2519c14eba +refs/heads/master: c0cd884af045338476b8e69a61fceb3f34ff22f1 diff --git a/trunk/drivers/net/r8169.c b/trunk/drivers/net/r8169.c index 7193afc00e47..96740051cdcc 100644 --- a/trunk/drivers/net/r8169.c +++ b/trunk/drivers/net/r8169.c @@ -186,7 +186,12 @@ static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = { MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); -static int rx_copybreak = 200; +/* + * we set our copybreak very high so that we don't have + * to allocate 16k frames all the time (see note in + * rtl8169_open() + */ +static int rx_copybreak = 16383; static int use_dac; static struct { u32 msg_enable; @@ -3217,9 +3222,13 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) } static void rtl8169_set_rxbufsize(struct rtl8169_private *tp, - struct net_device *dev) + unsigned int mtu) { - unsigned int max_frame = dev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN; + unsigned int max_frame = mtu + VLAN_ETH_HLEN + ETH_FCS_LEN; + + if (max_frame != 16383) + printk(KERN_WARNING "WARNING! Changing of MTU on this NIC" + "May lead to frame reception errors!\n"); tp->rx_buf_sz = (max_frame > RX_BUF_SIZE) ? max_frame : RX_BUF_SIZE; } @@ -3231,7 +3240,17 @@ static int rtl8169_open(struct net_device *dev) int retval = -ENOMEM; - rtl8169_set_rxbufsize(tp, dev); + /* + * Note that we use a magic value here, its wierd I know + * its done because, some subset of rtl8169 hardware suffers from + * a problem in which frames received that are longer than + * the size set in RxMaxSize register return garbage sizes + * when received. To avoid this we need to turn off filtering, + * which is done by setting a value of 16383 in the RxMaxSize register + * and allocating 16k frames to handle the largest possible rx value + * thats what the magic math below does. + */ + rtl8169_set_rxbufsize(tp, 16383 - VLAN_ETH_HLEN - ETH_FCS_LEN); /* * Rx and Tx desscriptors needs 256 bytes alignment. @@ -3884,7 +3903,7 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) rtl8169_down(dev); - rtl8169_set_rxbufsize(tp, dev); + rtl8169_set_rxbufsize(tp, dev->mtu); ret = rtl8169_init_ring(dev); if (ret < 0)