From afc07ec7c2b588443744384b4178001b76937cef Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Fri, 20 Mar 2009 13:25:39 +0000 Subject: [PATCH] --- yaml --- r: 135371 b: refs/heads/master c: bb145a9e28c32a37f35308bb32180b59e358a3a1 h: refs/heads/master i: 135369: 588a5ce6285664705ff6841bf595388f50a4bf80 135367: 041bf8f41292737904e160b6d3b5995ed0689077 v: v3 --- [refs] | 2 +- trunk/drivers/net/sfc/tx.c | 8 ++++++++ trunk/drivers/net/sfc/workarounds.h | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index d79d8cddd2bf..3ec944c8a238 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e84665c9cb4db963393fafad6fefe5efdd7e4a09 +refs/heads/master: bb145a9e28c32a37f35308bb32180b59e358a3a1 diff --git a/trunk/drivers/net/sfc/tx.c b/trunk/drivers/net/sfc/tx.c index b1e190779073..d6681edb7014 100644 --- a/trunk/drivers/net/sfc/tx.c +++ b/trunk/drivers/net/sfc/tx.c @@ -162,6 +162,14 @@ static int efx_enqueue_skb(struct efx_tx_queue *tx_queue, /* Get size of the initial fragment */ len = skb_headlen(skb); + /* Pad if necessary */ + if (EFX_WORKAROUND_15592(efx) && skb->len <= 32) { + EFX_BUG_ON_PARANOID(skb->data_len); + len = 32 + 1; + if (skb_pad(skb, len - skb->len)) + return NETDEV_TX_OK; + } + fill_level = tx_queue->insert_count - tx_queue->old_read_count; q_space = efx->type->txd_ring_mask - 1 - fill_level; diff --git a/trunk/drivers/net/sfc/workarounds.h b/trunk/drivers/net/sfc/workarounds.h index 78de68f4a95b..c821c15445a0 100644 --- a/trunk/drivers/net/sfc/workarounds.h +++ b/trunk/drivers/net/sfc/workarounds.h @@ -36,6 +36,8 @@ #define EFX_WORKAROUND_11482 EFX_WORKAROUND_ALWAYS /* Flush events can take a very long time to appear */ #define EFX_WORKAROUND_11557 EFX_WORKAROUND_ALWAYS +/* Truncated IPv4 packets can confuse the TX packet parser */ +#define EFX_WORKAROUND_15592 EFX_WORKAROUND_ALWAYS /* Spurious parity errors in TSORT buffers */ #define EFX_WORKAROUND_5129 EFX_WORKAROUND_FALCON_A