--- linux-2.4.14vanilla/drivers/net/8139too.c Fri Oct 19 17:32:28 2001 +++ linux-2.4.14/drivers/net/8139too.c Wed Jan 28 18:27:45 2004 @@ -1765,6 +1765,9 @@ assert (tp->tx_info[entry].skb == NULL); assert (tp->tx_info[entry].mapping == 0); + if(skb->len < ETH_ZLEN) + memset(tp->tx_buf[entry], 0, ETH_ZLEN); + tp->tx_info[entry].skb = skb; if ( !((unsigned long)skb->data & 3) && skb_shinfo(skb)->nr_frags == 0 && skb->ip_summed != CHECKSUM_HW) { --- linux-2.4.14vanilla/drivers/net/8390.c Sun Sep 30 21:26:06 2001 +++ linux-2.4.14/drivers/net/8390.c Thu Jan 29 09:26:40 2004 @@ -270,7 +270,8 @@ struct ei_device *ei_local = (struct ei_device *) dev->priv; int length, send_length, output_page; unsigned long flags; - + char scratch[ETH_ZLEN]; + length = skb->len; /* Mask interrupts from the ethercard. @@ -341,7 +342,15 @@ * trigger the send later, upon receiving a Tx done interrupt. */ - ei_block_output(dev, length, skb->data, output_page); + if(length == send_length) + ei_block_output(dev, length, skb->data, output_page); + else + { + memset(scratch, 0, ETH_ZLEN); + memcpy(scratch, skb->data, skb->len); + ei_block_output(dev, ETH_ZLEN, scratch, output_page); + } + if (! ei_local->txing) { ei_local->txing = 1; @@ -373,7 +382,15 @@ * reasonable hardware if you only use one Tx buffer. */ - ei_block_output(dev, length, skb->data, ei_local->tx_start_page); + if(length == send_length) + ei_block_output(dev, length, skb->data, ei_local->tx_start_page); + else + { + memset(scratch, 0, ETH_ZLEN); + memcpy(scratch, skb->data, skb->len); + ei_block_output(dev, ETH_ZLEN, scratch, ei_local->tx_start_page); + } + ei_local->txing = 1; NS8390_trigger_send(dev, send_length, ei_local->tx_start_page); dev->trans_start = jiffies;