diff options
author | hayeswang <hayeswang@realtek.com> | 2014-03-11 10:20:32 +0800 |
---|---|---|
committer | Seema Khowala <seemaj@nvidia.com> | 2014-04-23 14:07:39 -0700 |
commit | 6e9e856198a617f05febda8cb93154864878810f (patch) | |
tree | 1bf27fdb6a9c6d3fbcedd513e7c1e3f4157b6aed /drivers/net | |
parent | 6156a4c25c8404f8c29967b732c9dfb20f662343 (diff) |
r8152: add skb_cow_head
Call skb_cow_head() before editing the tx packet header. The header
would be reallocated if it is shared.
Change-Id: I6b3aef7acf215692eec02da679f356be614a9585
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Aly Hirani <ahirani@nvidia.com>
Reviewed-on: http://git-master/r/390299
(cherry picked from commit a51ef337214b4d1a848d5c3279aec4718f1be36a)
Reviewed-on: http://git-master/r/396901
Reviewed-by: Preetham Chandru <pchandru@nvidia.com>
Tested-by: Preetham Chandru <pchandru@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/usb/r8152.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 4e5560425b59..4fb1f2c02f6f 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -1374,6 +1374,11 @@ static int msdn_giant_send_check(struct sk_buff *skb) { const struct ipv6hdr *ipv6h; struct tcphdr *th; + int ret; + + ret = skb_cow_head(skb, 0); + if (ret) + return ret; ipv6h = ipv6_hdr(skb); th = tcp_hdr(skb); @@ -1381,7 +1386,7 @@ static int msdn_giant_send_check(struct sk_buff *skb) th->check = 0; th->check = ~tcp_v6_check(0, &ipv6h->saddr, &ipv6h->daddr, 0); - return 0; + return ret; } static int r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc, @@ -1410,8 +1415,11 @@ static int r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc, break; case htons(ETH_P_IPV6): + if (msdn_giant_send_check(skb)) { + ret = TX_CSUM_TSO; + goto unavailable; + } opts1 |= GTSENDV6; - msdn_giant_send_check(skb); break; default: |