|
@@ -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)
|