diff -uNr linux.orig/drivers/net/3c501.c linux/drivers/net/3c501.c --- linux.orig/drivers/net/3c501.c Sun Mar 25 18:31:15 2001 +++ linux/drivers/net/3c501.c Wed Nov 28 12:52:22 2001 @@ -105,6 +105,15 @@ #include #include +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + + /* A zero-terminated list of I/O addresses to be probed. The 3c501 can be at many locations, but here are the popular ones. */ static unsigned int netcard_portlist[] __initdata = { @@ -673,7 +682,7 @@ if (el_debug > 4) printk(" el_receive %d.\n", pkt_len); - if ((pkt_len < 60) || (pkt_len > 1536)) + if ((pkt_len < 60) || (pkt_len > MAX_ETH_FRAME_SIZE)) { if (el_debug) printk("%s: bogus packet, length=%d\n", dev->name, pkt_len); diff -uNr linux.orig/drivers/net/3c507.c linux/drivers/net/3c507.c --- linux.orig/drivers/net/3c507.c Sun Mar 25 18:31:15 2001 +++ linux/drivers/net/3c507.c Wed Nov 28 13:04:04 2001 @@ -70,6 +70,12 @@ #endif static unsigned int net_debug = NET_DEBUG; +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + /* A zero-terminated list of common I/O addresses to be probed. */ static unsigned int netcard_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x280, 0}; @@ -97,7 +103,7 @@ #define RX_SUSPEND 0x0030 /* The Rx unit uses a list of frame descriptors and a list of data buffer - descriptors. We use full-sized (1518 byte) data buffers, so there is + descriptors. We use full-sized (MAX_FRAME_SIZE byte) data buffers, so there is a one-to-one pairing of frame descriptors to buffer descriptors. The Tx ("command") unit executes a list of commands that look like: @@ -194,10 +200,10 @@ #define TX_BUF_START 0x0100 #define NUM_TX_BUFS 4 -#define TX_BUF_SIZE (1518+14+20+16) /* packet+header+TBD */ +#define TX_BUF_SIZE (MAX_FRAME_SIZE+14+20+16) /* packet+header+TBD */ #define RX_BUF_START 0x2000 -#define RX_BUF_SIZE (1518+14+18) /* packet+header+RBD */ +#define RX_BUF_SIZE (MAX_FRAME_SIZE+14+18) /* packet+header+RBD */ #define RX_BUF_END (dev->mem_end - dev->mem_start) /* diff -uNr linux.orig/drivers/net/3c509.c linux/drivers/net/3c509.c --- linux.orig/drivers/net/3c509.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/3c509.c Wed Nov 28 13:03:14 2001 @@ -44,6 +44,15 @@ static char *version = "3c509.c:1.16 (2.2) 2/3/98 becker@cesdis.gsfc.nasa.gov.\n"; /* A few values that may be tweaked. */ +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + + /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (400*HZ/1000) /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ @@ -591,11 +600,11 @@ #endif dev->trans_start = jiffies; - if (inw(ioaddr + TX_FREE) > 1536) { + if (inw(ioaddr + TX_FREE) > MAX_ETH_FRAME_SIZE) { dev->tbusy = 0; } else /* Interrupt us when the FIFO has room for max-sized packet. */ - outw(SetTxThreshold + 1536, ioaddr + EL3_CMD); + outw(SetTxThreshold + MAX_ETH_FRAME_SIZE, ioaddr + EL3_CMD); #ifdef __SMP__ spin_unlock(&lp->lock); enable_irq(dev->irq); diff -uNr linux.orig/drivers/net/3c59x.c linux/drivers/net/3c59x.c --- linux.orig/drivers/net/3c59x.c Sun Mar 25 18:37:34 2001 +++ linux/drivers/net/3c59x.c Wed Nov 28 13:55:01 2001 @@ -106,6 +106,15 @@ /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ static int max_interrupt_work = 20; +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + + /* Put out somewhat more debugging messages. (0: no msg, 1 minimal .. 6). */ #define vortex_debug debug #ifdef VORTEX_DEBUG @@ -125,7 +134,7 @@ /* Keep the ring sizes a power of two for efficiency. */ #define TX_RING_SIZE 16 #define RX_RING_SIZE 32 -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#define PKT_BUF_SZ MAX_ETH_FRAME_SIZE /* Size of each temporary Rx buffer.*/ #include #include @@ -1108,7 +1117,11 @@ } /* Set the full-duplex bit. */ + #ifdef CONFIG_VLAN_802_1Q + outb((vp->full_duplex ? 0x20 : 0) | 0x40, ioaddr + Wn3_MAC_Ctrl); + #else outb((vp->full_duplex ? 0x20 : 0) | (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl); + #endif if (vortex_debug > 1) { printk(KERN_DEBUG "%s: vortex_open() InternalConfig %8.8x.\n", dev->name, config); @@ -1168,7 +1181,7 @@ if (vp->full_bus_master_rx) { /* Boomerang bus master. */ vp->cur_rx = vp->dirty_rx = 0; /* Initialize the RxEarly register as recommended. */ - outw(SetRxThreshold + (1536>>2), ioaddr + EL3_CMD); + outw(SetRxThreshold + (MAX_ETH_FRAME_SIZE>>2), ioaddr + EL3_CMD); outl(0x0020, ioaddr + PktStatus); if (vortex_debug > 2) printk(KERN_DEBUG "%s: Filling in the Rx ring.\n", dev->name); @@ -1304,9 +1317,15 @@ vp->phys[0], mii_reg5); /* Set the full-duplex bit. */ EL3WINDOW(3); + #ifdef CONFIG_VLAN_802_1Q + outb((vp->full_duplex ? 0x20 : 0) | + 0x40, + ioaddr + Wn3_MAC_Ctrl); + #else outb((vp->full_duplex ? 0x20 : 0) | (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl); + #endif } next_tick = 60*HZ; } @@ -1554,11 +1573,11 @@ outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2); #endif dev_kfree_skb(skb); - if (inw(ioaddr + TxFree) > 1536) { + if (inw(ioaddr + TxFree) > MAX_ETH_FRAME_SIZE) { clear_bit(0, (void*)&dev->tbusy); } else /* Interrupt us when the FIFO has room for max-sized packet. */ - outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD); + outw(SetTxThreshold + (MAX_ETH_FRAME_SIZE>>2), ioaddr + EL3_CMD); } dev->trans_start = jiffies; @@ -1696,11 +1715,11 @@ if (inw(ioaddr + Wn7_MasterStatus) & 0x1000) { outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */ dev_kfree_skb(vp->tx_skb); /* Release the transfered buffer */ - if (inw(ioaddr + TxFree) > 1536) { + if (inw(ioaddr + TxFree) > MAX_ETH_FRAME_SIZE) { clear_bit(0, (void*)&dev->tbusy); mark_bh(NET_BH); } else /* Interrupt when FIFO has room for max-sized packet. */ - outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD); + outw(SetTxThreshold + (MAX_ETH_FRAME_SIZE>>2), ioaddr + EL3_CMD); } } diff -uNr linux.orig/drivers/net/8139too.c linux/drivers/net/8139too.c --- linux.orig/drivers/net/8139too.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/8139too.c Wed Nov 28 13:56:24 2001 @@ -348,7 +348,13 @@ #define NUM_TX_DESC 4 /* max supported ethernet frame size -- must be at least (dev->mtu+14+4).*/ -#define MAX_ETH_FRAME_SIZE 1536 +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) /* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */ #define TX_BUF_SIZE MAX_ETH_FRAME_SIZE diff -uNr linux.orig/drivers/net/82596.c linux/drivers/net/82596.c --- linux.orig/drivers/net/82596.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/82596.c Wed Nov 28 14:16:59 2001 @@ -159,7 +159,14 @@ */ static int rx_copybreak = 100; -#define PKT_BUF_SZ 1536 +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) +#define PKT_BUF_SZ MAX_ETH_FRAME_SIZE #define MAX_MC_CNT 64 #define I596_TOTAL_SIZE 17 diff -uNr linux.orig/drivers/net/8390.c linux/drivers/net/8390.c --- linux.orig/drivers/net/8390.c Sun Mar 25 18:31:15 2001 +++ linux/drivers/net/8390.c Wed Nov 28 12:33:49 2001 @@ -74,6 +74,12 @@ #define BUG_83C690 +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + /* These are the operational function interfaces to board-specific routines. void reset_8390(struct device *dev) @@ -698,7 +704,7 @@ continue; } - if (pkt_len < 60 || pkt_len > 1518) + if (pkt_len < 60 || pkt_len > MAX_FRAME_SIZE) { if (ei_debug) printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n", diff -uNr linux.orig/drivers/net/eepro100.c linux/drivers/net/eepro100.c --- linux.orig/drivers/net/eepro100.c Sun Mar 25 18:37:34 2001 +++ linux/drivers/net/eepro100.c Wed Nov 28 13:13:18 2001 @@ -46,6 +46,15 @@ */ /*#define USE_IO*/ +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + + static const char *version = "eepro100.c:v1.09j-t 9/29/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html\n" "eepro100.c: $Revision$ 2000/05/31 Modified by Andrey V. Savochkin and others\n" @@ -65,7 +74,7 @@ Lower values use more memory, but are faster. */ #if defined(__alpha__) || defined(__sparc__) /* force copying of all packets to avoid unaligned accesses on Alpha */ -static int rx_copybreak = 1518; +static int rx_copybreak = MAX_FRAME_SIZE; #else static int rx_copybreak = 200; #endif @@ -103,7 +112,7 @@ /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (2*HZ) /* Size of an pre-allocated Rx buffer: + slack.*/ -#define PKT_BUF_SZ 1536 +#define PKT_BUF_SZ MAX_ETH_FRAME_SIZE #if !defined(__OPTIMIZE__) || !defined(__KERNEL__) #warning You must compile this file with the correct options! @@ -549,12 +558,12 @@ const char i82557_config_cmd[22] = { 22, 0x08, 0, 0, 0, 0, 0x32, 0x03, 1, /* 1=Use MII 0=Use AUI */ 0, 0x2E, 0, 0x60, 0, - 0xf2, 0x48, 0, 0x40, 0xf2, 0x80, /* 0x40=Force full-duplex */ + 0xf2, 0x48, 0, 0x40, 0xfa, 0x80, /* 0x40=Force full-duplex */ 0x3f, 0x05, }; const char i82558_config_cmd[22] = { 22, 0x08, 0, 1, 0, 0, 0x22, 0x03, 1, /* 1=Use MII 0=Use AUI */ 0, 0x2E, 0, 0x60, 0x08, 0x88, - 0x68, 0, 0x40, 0xf2, 0x84, /* Disable FC */ + 0x68, 0, 0x40, 0xfa, 0x84, /* Disable FC */ 0x31, 0x05, }; /* PHY media interface chips. */ diff -uNr linux.orig/drivers/net/epic100.c linux/drivers/net/epic100.c --- linux.orig/drivers/net/epic100.c Sun Mar 25 18:31:20 2001 +++ linux/drivers/net/epic100.c Wed Nov 28 14:12:44 2001 @@ -48,7 +48,15 @@ /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (2*HZ) -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + +#define PKT_BUF_SZ MAX_ETH_FRAME_SIZE /* Size of each temporary Rx buffer.*/ /* Bytes transferred to chip before transmission starts. */ /* Initial threshold, increased on underflow, rounded down to 4 byte units. */ diff -uNr linux.orig/drivers/net/hamachi.c linux/drivers/net/hamachi.c --- linux.orig/drivers/net/hamachi.c Sun Mar 25 18:31:22 2001 +++ linux/drivers/net/hamachi.c Wed Nov 28 14:25:46 2001 @@ -446,19 +446,25 @@ -fix the reset procedure. It doesn't quite work. */ +/* For now, this is going to be set to the maximum size of an ethernet + * packet. Eventually, we may want to make it a variable that is + * related to the MTU + */ +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + /* A few values that may be tweaked. */ /* Size of each temporary Rx buffer, calculated as: * 1518 bytes (ethernet packet) + 2 bytes (to get 8 byte alignment for * the card) + 8 bytes of status info + 8 bytes for the Rx Checksum + * 2 more because we use skb_reserve. */ -#define PKT_BUF_SZ 1538 - -/* For now, this is going to be set to the maximum size of an ethernet - * packet. Eventually, we may want to make it a variable that is - * related to the MTU - */ -#define MAX_FRAME_SIZE 1518 +#define PKT_BUF_SZ (MAX_ETH_FRAME_SIZE+2) /* The rest of these values should never change. */ diff -uNr linux.orig/drivers/net/old_tulip.c linux/drivers/net/old_tulip.c --- linux.orig/drivers/net/old_tulip.c Sun Mar 25 18:31:22 2001 +++ linux/drivers/net/old_tulip.c Wed Nov 28 12:50:30 2001 @@ -53,9 +53,15 @@ #define TX_RING_SIZE 16 #define RX_RING_SIZE 32 +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + /* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */ #ifdef __alpha__ -static int rx_copybreak = 1518; +static int rx_copybreak = MAX_FRAME_SIZE; #else static int rx_copybreak = 100; #endif @@ -221,7 +227,7 @@ /* A few values that may be tweaked. */ -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#define PKT_BUF_SZ (MAX_FRAME_SIZE+18) /* Size of each temporary Rx buffer.*/ /* This is a mysterious value that can be written to CSR11 in the 21040 (only) to support a pre-NWay full-duplex signaling mechanism using short frames. diff -uNr linux.orig/drivers/net/rtl8139.c linux/drivers/net/rtl8139.c --- linux.orig/drivers/net/rtl8139.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/rtl8139.c Wed Nov 28 12:44:42 2001 @@ -37,11 +37,17 @@ static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + /* Size of the in-memory receive ring. */ #define RX_BUF_LEN_IDX 3 /* 0==8K, 1==16K, 2==32K, 3==64K */ #define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX) /* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */ -#define TX_BUF_SIZE 1536 +#define TX_BUF_SIZE (MAX_FRAME_SIZE+18) /* PCI Tuning Parameters Threshold is bytes transferred to chip before transmission starts. */ diff -uNr linux.orig/drivers/net/sis900.c linux/drivers/net/sis900.c --- linux.orig/drivers/net/sis900.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/sis900.c Wed Nov 28 13:49:28 2001 @@ -1058,6 +1058,10 @@ rx_flags |= RxATX; } + #ifdef CONFIG_VLAN_802_1Q + rx_flags |= RxAJAB; + #endif + outl (tx_flags, ioaddr + txcfg); outl (rx_flags, ioaddr + rxcfg); } @@ -1286,15 +1290,24 @@ while (rx_status & OWN) { unsigned int rx_size; + unsigned int data_size; + + data_size = rx_status & DSIZE; + rx_size = data_size - CRC_SIZE; - rx_size = (rx_status & DSIZE) - CRC_SIZE; + #ifdef CONFIG_VLAN_802_1Q + /* ``TOOLONG'' flag means jumbo packet recived. */ + if(rx_status & TOOLONG) + if(data_size <= MAX_FRAME_SIZE) + rx_status &= (~ ((unsigned int)TOOLONG)); + #endif if (rx_status & (ABORT|OVERRUN|TOOLONG|RUNT|RXISERR|CRCERR|FAERR)) { /* corrupted packet received */ if (sis900_debug > 3) printk(KERN_INFO "%s: Corrupted packet " - "received, buffer status = 0x%8.8x.\n", - net_dev->name, rx_status); + "received, buffer status = 0x%8.8x/%d.\n", + net_dev->name, rx_status, data_size); sis_priv->stats.rx_errors++; if (rx_status & OVERRUN) sis_priv->stats.rx_over_errors++; diff -uNr linux.orig/drivers/net/sis900.h linux/drivers/net/sis900.h --- linux.orig/drivers/net/sis900.h Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/sis900.h Wed Nov 28 13:41:36 2001 @@ -258,8 +258,16 @@ #define CRC_SIZE 4 #define MAC_HEADER_SIZE 14 -#define TX_BUF_SIZE 1536 -#define RX_BUF_SIZE 1536 +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + +#define TX_BUF_SIZE MAX_ETH_FRAME_SIZE +#define RX_BUF_SIZE MAX_ETH_FRAME_SIZE #define NUM_TX_DESC 16 /* Number of Tx descriptor registers. */ #define NUM_RX_DESC 16 /* Number of Rx descriptor registers. */ diff -uNr linux.orig/drivers/net/starfire.c linux/drivers/net/starfire.c --- linux.orig/drivers/net/starfire.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/starfire.c Wed Nov 28 14:15:16 2001 @@ -157,7 +157,14 @@ The Starfire has a 512 element hash table based on the Ethernet CRC. */ static int multicast_filter_limit = 512; -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) +#define PKT_BUF_SZ MAX_ETH_FRAME_SIZE /* Size of each temporary Rx buffer.*/ /* * Set the copy breakpoint for the copy-only-tiny-frames scheme. * Setting to > 1518 effectively disables this feature. diff -uNr linux.orig/drivers/net/sunlance.c linux/drivers/net/sunlance.c --- linux.orig/drivers/net/sunlance.c Sun Mar 25 18:31:17 2001 +++ linux/drivers/net/sunlance.c Wed Nov 28 14:08:33 2001 @@ -634,7 +634,9 @@ } if (csr0 & LE_C0_BABL) + #ifndef CONFIG_VLAN_802_1Q lp->stats.tx_errors++; + #endif if (csr0 & LE_C0_MISS) lp->stats.rx_errors++; diff -uNr linux.orig/drivers/net/tulip.c linux/drivers/net/tulip.c --- linux.orig/drivers/net/tulip.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/tulip.c Wed Nov 28 13:18:02 2001 @@ -51,6 +51,12 @@ static int reverse_probe = 0; #endif +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + /* Keep the ring sizes a power of two for efficiency. Making the Tx ring too large decreases the effectiveness of channel bonding and packet priority. @@ -60,7 +66,7 @@ /* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */ #ifdef __alpha__ -static int rx_copybreak = 1518; +static int rx_copybreak = MAX_FRAME_SIZE; #else static int rx_copybreak = 100; #endif @@ -90,7 +96,7 @@ /* Operational parameters that usually are not changed. */ /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (4*HZ) -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#define PKT_BUF_SZ (MAX_FRAME_SIZE+18) /* Size of each temporary Rx buffer.*/ /* This is a mysterious value that can be written to CSR11 in the 21040 (only) to support a pre-NWay full-duplex signaling mechanism using short frames. No one knows what it should be, but if left at its default value some @@ -458,7 +464,7 @@ }; enum desc_status_bits { - DescOwned=0x80000000, RxDescFatalErr=0x8000, RxWholePkt=0x0300, + DescOwned=0x80000000, RxDescFatalErr=0x4842, RxWholePkt=0x0300, }; /* Ring-wrap flag in length field, use for last ring entry. @@ -2851,8 +2857,8 @@ dev->name, entry, status); if (--rx_work_limit < 0) break; - if ((status & 0x38008300) != 0x0300) { - if ((status & 0x38000300) != 0x0300) { + if ((status & (0x38000000 | RxDescFatalErr | RxWholePkt)) != RxWholePkt) { + if ((status & (0x38000000 | RxWholePkt)) != RxWholePkt) { /* Ingore earlier buffers. */ if ((status & 0xffff) != 0x7fff) { if (tulip_debug > 1) @@ -2878,10 +2884,10 @@ struct sk_buff *skb; #ifndef final_version - if (pkt_len > 1518) { + if (pkt_len > MAX_FRAME_SIZE) { printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n", dev->name, pkt_len, pkt_len); - pkt_len = 1518; + pkt_len = MAX_FRAME_SIZE; tp->stats.rx_length_errors++; } #endif diff -uNr linux.orig/drivers/net/via-rhine.c linux/drivers/net/via-rhine.c --- linux.orig/drivers/net/via-rhine.c Fri Nov 2 17:39:07 2001 +++ linux/drivers/net/via-rhine.c Wed Nov 28 14:03:02 2001 @@ -76,7 +76,15 @@ /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (2*HZ) -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#ifdef CONFIG_VLAN_802_1Q +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif + +#define MAX_ETH_FRAME_SIZE (MAX_FRAME_SIZE+18) + +#define PKT_BUF_SZ MAX_ETH_FRAME_SIZE /* Size of each temporary Rx buffer.*/ #if !defined(__OPTIMIZE__) @@ -639,7 +647,11 @@ np->cur_rx = 0; np->dirty_rx = 0; + #ifdef CONFIG_VLAN_802_1Q + np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 36); + #else np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32); + #endif np->rx_head_desc = &np->rx_ring[0]; for (i = 0; i < RX_RING_SIZE; i++) {