summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorImre Kaloz <kaloz@openwrt.org>2014-12-26 14:48:33 +0000
committerImre Kaloz <kaloz@openwrt.org>2014-12-26 14:48:33 +0000
commitedbb903461dd7dafce6916901adde5164969e814 (patch)
tree430225c776c7d1d338c26b1a124d9215d182ae28
parent9038e8d24841ca01e486b2238c9ac285ce1afb9d (diff)
downloadmtk-20170518-edbb903461dd7dafce6916901adde5164969e814.zip
mtk-20170518-edbb903461dd7dafce6916901adde5164969e814.tar.gz
mtk-20170518-edbb903461dd7dafce6916901adde5164969e814.tar.bz2
fix mvneta vlan tagging
This is a 3.14.x backport of: "mvneta: Fix TSO and checksum for non-acceleration vlan traffic" Upstream commits: 817dbfa5d1bc276a72c1a577310382008e8aca0a 2d39d120781a5770573dc6ed672a5a562f541aea Fixes vlan tagging on SoC interfaces for the WRT1900AC. Useful when using mvsw6171 driver. Signed-off-by: Mark Milburn <mark.a.milburn@gmail.com> Signed-off-by: Imre Kaloz <kaloz@openwrt.org> SVN-Revision: 43781
-rw-r--r--target/linux/mvebu/patches-3.14/110-mvneta_fix_tso_and_chksum.patch38
1 files changed, 38 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-3.14/110-mvneta_fix_tso_and_chksum.patch b/target/linux/mvebu/patches-3.14/110-mvneta_fix_tso_and_chksum.patch
new file mode 100644
index 0000000..7115468
--- /dev/null
+++ b/target/linux/mvebu/patches-3.14/110-mvneta_fix_tso_and_chksum.patch
@@ -0,0 +1,38 @@
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -20,6 +20,7 @@
+ #include <linux/mbus.h>
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
++#include <linux/if_vlan.h>
+ #include <net/ip.h>
+ #include <net/ipv6.h>
+ #include <linux/io.h>
+@@ -1380,15 +1381,16 @@ static u32 mvneta_skb_tx_csum(struct mvn
+ {
+ if (skb->ip_summed == CHECKSUM_PARTIAL) {
+ int ip_hdr_len = 0;
++ __be16 l3_proto = vlan_get_protocol(skb);
+ u8 l4_proto;
+
+- if (skb->protocol == htons(ETH_P_IP)) {
++ if (l3_proto == htons(ETH_P_IP)) {
+ struct iphdr *ip4h = ip_hdr(skb);
+
+ /* Calculate IPv4 checksum and L4 checksum */
+ ip_hdr_len = ip4h->ihl;
+ l4_proto = ip4h->protocol;
+- } else if (skb->protocol == htons(ETH_P_IPV6)) {
++ } else if (l3_proto == htons(ETH_P_IPV6)) {
+ struct ipv6hdr *ip6h = ipv6_hdr(skb);
+
+ /* Read l4_protocol from one of IPv6 extra headers */
+@@ -1399,7 +1401,7 @@ static u32 mvneta_skb_tx_csum(struct mvn
+ return MVNETA_TX_L4_CSUM_NOT;
+
+ return mvneta_txq_desc_csum(skb_network_offset(skb),
+- skb->protocol, ip_hdr_len, l4_proto);
++ l3_proto, ip_hdr_len, l4_proto);
+ }
+
+ return MVNETA_TX_L4_CSUM_NOT;