Patchwork small packets sent through ne2k-pci delayed

login
register
mail settings
Submitter Florian Zumbiehl
Date April 4, 2010, 2:18 p.m.
Message ID <20100404141833.GH32613@florz.florz.dyndns.org>
Download mbox | patch
Permalink /patch/49353/
State RFC
Delegated to: David Miller
Headers show

Comments

Florian Zumbiehl - April 4, 2010, 2:18 p.m.
Hi,

I noticed today that a 2.6.33 kernel with an ne2k-pci card of mine
transmits small packets (those that result in frames < 61 bytes)
only with some major delay - or more exactly, it seems that they are
being transmitted only when the next packet to be transmitted comes along.

Now, this patch seems to fix it for me, but I am not that sure that that's
how it should be fixed:

I _think_ that this problem did not exist with 2.6.22-rc4 - but I didn't
have a chance to (re-)test that yet, I just think that I did things in the
past (when that kernel was still running on that machine) that would imply
that the problem did not exist at the time ...

So, any suggestions what I should try, other than re-testing with
2.6.22-rc4 (some time soon, I can do that, too, just not now)?

What might be interesting to know: those 61-byte frames do actually arrive
at the recipient as 61-byte frames ...

Florian
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/net/lib8390.c b/drivers/net/lib8390.c
index 57f2584..ccef77c 100644
--- a/drivers/net/lib8390.c
+++ b/drivers/net/lib8390.c
@@ -306,13 +306,13 @@  static netdev_tx_t __ei_start_xmit(struct sk_buff *skb,
 	struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
 	int send_length = skb->len, output_page;
 	unsigned long flags;
-	char buf[ETH_ZLEN];
+	char buf[ETH_ZLEN+1];
 	char *data = skb->data;
 
-	if (skb->len < ETH_ZLEN) {
-		memset(buf, 0, ETH_ZLEN);	/* more efficient than doing just the needed bits */
+	if (skb->len < ETH_ZLEN+1) {
+		memset(buf, 0, ETH_ZLEN+1);	/* more efficient than doing just the needed bits */
 		memcpy(buf, data, skb->len);
-		send_length = ETH_ZLEN;
+		send_length = ETH_ZLEN+1;
 		data = buf;
 	}