diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2007-04-25 20:55:53 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-26 01:25:16 -0400 |
commit | ea2ae17d6443abddc79480dc9f7af8feacabddc4 (patch) | |
tree | 2d6f48a5e4a40f761b5b510af9aac1fca55004cb /drivers | |
parent | badff6d01a8589a1c828b0bf118903ca38627f4e (diff) |
[SK_BUFF]: Introduce skb_transport_offset()
For the quite common 'skb->h.raw - skb->data' sequence.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/atl1/atl1_main.c | 10 | ||||
-rw-r--r-- | drivers/net/cassini.c | 6 | ||||
-rw-r--r-- | drivers/net/cxgb3/sge.c | 7 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 10 | ||||
-rw-r--r-- | drivers/net/ixgb/ixgb_main.c | 8 | ||||
-rw-r--r-- | drivers/net/myri10ge/myri10ge.c | 5 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 2 | ||||
-rw-r--r-- | drivers/net/sk98lin/skge.c | 4 | ||||
-rw-r--r-- | drivers/net/skge.c | 2 | ||||
-rw-r--r-- | drivers/net/sky2.c | 2 | ||||
-rw-r--r-- | drivers/net/sungem.c | 6 | ||||
-rw-r--r-- | drivers/net/sunhme.c | 6 |
12 files changed, 32 insertions, 36 deletions
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index d2be79a30f8a..c26f8ce320e6 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
@@ -1326,8 +1326,8 @@ static int atl1_tx_csum(struct atl1_adapter *adapter, struct sk_buff *skb, | |||
1326 | u8 css, cso; | 1326 | u8 css, cso; |
1327 | 1327 | ||
1328 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 1328 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
1329 | cso = skb->h.raw - skb->data; | 1329 | cso = skb_transport_offset(skb); |
1330 | css = (skb->h.raw + skb->csum_offset) - skb->data; | 1330 | css = cso + skb->csum; |
1331 | if (unlikely(cso & 0x1)) { | 1331 | if (unlikely(cso & 0x1)) { |
1332 | printk(KERN_DEBUG "%s: payload offset != even number\n", | 1332 | printk(KERN_DEBUG "%s: payload offset != even number\n", |
1333 | atl1_driver_name); | 1333 | atl1_driver_name); |
@@ -1369,8 +1369,8 @@ static void atl1_tx_map(struct atl1_adapter *adapter, | |||
1369 | 1369 | ||
1370 | if (tcp_seg) { | 1370 | if (tcp_seg) { |
1371 | /* TSO/GSO */ | 1371 | /* TSO/GSO */ |
1372 | proto_hdr_len = | 1372 | proto_hdr_len = (skb_transport_offset(skb) + |
1373 | ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); | 1373 | (skb->h.th->doff << 2)); |
1374 | buffer_info->length = proto_hdr_len; | 1374 | buffer_info->length = proto_hdr_len; |
1375 | page = virt_to_page(skb->data); | 1375 | page = virt_to_page(skb->data); |
1376 | offset = (unsigned long)skb->data & ~PAGE_MASK; | 1376 | offset = (unsigned long)skb->data & ~PAGE_MASK; |
@@ -1562,7 +1562,7 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1562 | mss = skb_shinfo(skb)->gso_size; | 1562 | mss = skb_shinfo(skb)->gso_size; |
1563 | if (mss) { | 1563 | if (mss) { |
1564 | if (skb->protocol == htons(ETH_P_IP)) { | 1564 | if (skb->protocol == htons(ETH_P_IP)) { |
1565 | proto_hdr_len = ((skb->h.raw - skb->data) + | 1565 | proto_hdr_len = (skb_transport_offset(skb) + |
1566 | (skb->h.th->doff << 2)); | 1566 | (skb->h.th->doff << 2)); |
1567 | if (unlikely(proto_hdr_len > len)) { | 1567 | if (unlikely(proto_hdr_len > len)) { |
1568 | dev_kfree_skb_any(skb); | 1568 | dev_kfree_skb_any(skb); |
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index 68e37a655fe2..bd3ab6493e39 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c | |||
@@ -2821,10 +2821,8 @@ static inline int cas_xmit_tx_ringN(struct cas *cp, int ring, | |||
2821 | 2821 | ||
2822 | ctrl = 0; | 2822 | ctrl = 0; |
2823 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 2823 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
2824 | u64 csum_start_off, csum_stuff_off; | 2824 | const u64 csum_start_off = skb_transport_offset(skb); |
2825 | 2825 | const u64 csum_stuff_off = csum_start_off + skb->csum_offset; | |
2826 | csum_start_off = (u64) (skb->h.raw - skb->data); | ||
2827 | csum_stuff_off = csum_start_off + skb->csum_offset; | ||
2828 | 2826 | ||
2829 | ctrl = TX_DESC_CSUM_EN | | 2827 | ctrl = TX_DESC_CSUM_EN | |
2830 | CAS_BASE(TX_DESC_CSUM_START, csum_start_off) | | 2828 | CAS_BASE(TX_DESC_CSUM_START, csum_start_off) | |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index a891f6f81527..d38b1bcd138e 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -1319,9 +1319,10 @@ static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb, | |||
1319 | /* Only TX_DATA builds SGLs */ | 1319 | /* Only TX_DATA builds SGLs */ |
1320 | 1320 | ||
1321 | from = (struct work_request_hdr *)skb->data; | 1321 | from = (struct work_request_hdr *)skb->data; |
1322 | memcpy(&d->flit[1], &from[1], skb->h.raw - skb->data - sizeof(*from)); | 1322 | memcpy(&d->flit[1], &from[1], |
1323 | skb_transport_offset(skb) - sizeof(*from)); | ||
1323 | 1324 | ||
1324 | flits = (skb->h.raw - skb->data) / 8; | 1325 | flits = skb_transport_offset(skb) / 8; |
1325 | sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; | 1326 | sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; |
1326 | sgl_flits = make_sgl(skb, sgp, skb->h.raw, skb->tail - skb->h.raw, | 1327 | sgl_flits = make_sgl(skb, sgp, skb->h.raw, skb->tail - skb->h.raw, |
1327 | adap->pdev); | 1328 | adap->pdev); |
@@ -1349,7 +1350,7 @@ static inline unsigned int calc_tx_descs_ofld(const struct sk_buff *skb) | |||
1349 | if (skb->len <= WR_LEN && cnt == 0) | 1350 | if (skb->len <= WR_LEN && cnt == 0) |
1350 | return 1; /* packet fits as immediate data */ | 1351 | return 1; /* packet fits as immediate data */ |
1351 | 1352 | ||
1352 | flits = (skb->h.raw - skb->data) / 8; /* headers */ | 1353 | flits = skb_transport_offset(skb) / 8; /* headers */ |
1353 | if (skb->tail != skb->h.raw) | 1354 | if (skb->tail != skb->h.raw) |
1354 | cnt++; | 1355 | cnt++; |
1355 | return flits_to_desc(flits + sgl_len(cnt)); | 1356 | return flits_to_desc(flits + sgl_len(cnt)); |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index a3d9986b4170..78cf417cf236 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -2887,7 +2887,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, | |||
2887 | return err; | 2887 | return err; |
2888 | } | 2888 | } |
2889 | 2889 | ||
2890 | hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); | 2890 | hdr_len = (skb_transport_offset(skb) + (skb->h.th->doff << 2)); |
2891 | mss = skb_shinfo(skb)->gso_size; | 2891 | mss = skb_shinfo(skb)->gso_size; |
2892 | if (skb->protocol == htons(ETH_P_IP)) { | 2892 | if (skb->protocol == htons(ETH_P_IP)) { |
2893 | struct iphdr *iph = ip_hdr(skb); | 2893 | struct iphdr *iph = ip_hdr(skb); |
@@ -2897,7 +2897,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, | |||
2897 | iph->daddr, 0, | 2897 | iph->daddr, 0, |
2898 | IPPROTO_TCP, 0); | 2898 | IPPROTO_TCP, 0); |
2899 | cmd_length = E1000_TXD_CMD_IP; | 2899 | cmd_length = E1000_TXD_CMD_IP; |
2900 | ipcse = skb->h.raw - skb->data - 1; | 2900 | ipcse = skb_transport_offset(skb) - 1; |
2901 | } else if (skb->protocol == htons(ETH_P_IPV6)) { | 2901 | } else if (skb->protocol == htons(ETH_P_IPV6)) { |
2902 | ipv6_hdr(skb)->payload_len = 0; | 2902 | ipv6_hdr(skb)->payload_len = 0; |
2903 | skb->h.th->check = | 2903 | skb->h.th->check = |
@@ -2908,7 +2908,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, | |||
2908 | } | 2908 | } |
2909 | ipcss = skb_network_offset(skb); | 2909 | ipcss = skb_network_offset(skb); |
2910 | ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data; | 2910 | ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data; |
2911 | tucss = skb->h.raw - skb->data; | 2911 | tucss = skb_transport_offset(skb); |
2912 | tucso = (void *)&(skb->h.th->check) - (void *)skb->data; | 2912 | tucso = (void *)&(skb->h.th->check) - (void *)skb->data; |
2913 | tucse = 0; | 2913 | tucse = 0; |
2914 | 2914 | ||
@@ -2950,7 +2950,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, | |||
2950 | uint8_t css; | 2950 | uint8_t css; |
2951 | 2951 | ||
2952 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 2952 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
2953 | css = skb->h.raw - skb->data; | 2953 | css = skb_transport_offset(skb); |
2954 | 2954 | ||
2955 | i = tx_ring->next_to_use; | 2955 | i = tx_ring->next_to_use; |
2956 | buffer_info = &tx_ring->buffer_info[i]; | 2956 | buffer_info = &tx_ring->buffer_info[i]; |
@@ -3292,7 +3292,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
3292 | /* TSO Workaround for 82571/2/3 Controllers -- if skb->data | 3292 | /* TSO Workaround for 82571/2/3 Controllers -- if skb->data |
3293 | * points to just header, pull a few bytes of payload from | 3293 | * points to just header, pull a few bytes of payload from |
3294 | * frags into skb->data */ | 3294 | * frags into skb->data */ |
3295 | hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); | 3295 | hdr_len = (skb_transport_offset(skb) + (skb->h.th->doff << 2)); |
3296 | if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { | 3296 | if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { |
3297 | switch (adapter->hw.mac_type) { | 3297 | switch (adapter->hw.mac_type) { |
3298 | unsigned int pull_size; | 3298 | unsigned int pull_size; |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index bba4dcaf92e9..ceea6e45792d 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -1190,7 +1190,7 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
1190 | return err; | 1190 | return err; |
1191 | } | 1191 | } |
1192 | 1192 | ||
1193 | hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); | 1193 | hdr_len = (skb_transport_offset(skb) + (skb->h.th->doff << 2)); |
1194 | mss = skb_shinfo(skb)->gso_size; | 1194 | mss = skb_shinfo(skb)->gso_size; |
1195 | iph = ip_hdr(skb); | 1195 | iph = ip_hdr(skb); |
1196 | iph->tot_len = 0; | 1196 | iph->tot_len = 0; |
@@ -1199,8 +1199,8 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
1199 | 0, IPPROTO_TCP, 0); | 1199 | 0, IPPROTO_TCP, 0); |
1200 | ipcss = skb_network_offset(skb); | 1200 | ipcss = skb_network_offset(skb); |
1201 | ipcso = (void *)&(iph->check) - (void *)skb->data; | 1201 | ipcso = (void *)&(iph->check) - (void *)skb->data; |
1202 | ipcse = skb->h.raw - skb->data - 1; | 1202 | ipcse = skb_transport_offset(skb) - 1; |
1203 | tucss = skb->h.raw - skb->data; | 1203 | tucss = skb_transport_offset(skb); |
1204 | tucso = (void *)&(skb->h.th->check) - (void *)skb->data; | 1204 | tucso = (void *)&(skb->h.th->check) - (void *)skb->data; |
1205 | tucse = 0; | 1205 | tucse = 0; |
1206 | 1206 | ||
@@ -1245,7 +1245,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
1245 | 1245 | ||
1246 | if(likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 1246 | if(likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
1247 | struct ixgb_buffer *buffer_info; | 1247 | struct ixgb_buffer *buffer_info; |
1248 | css = skb->h.raw - skb->data; | 1248 | css = skb_transport_offset(skb); |
1249 | cso = css + skb->csum_offset; | 1249 | cso = css + skb->csum_offset; |
1250 | 1250 | ||
1251 | i = adapter->tx_ring.next_to_use; | 1251 | i = adapter->tx_ring.next_to_use; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 7c04179c7b13..e04228c7b14f 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -2029,7 +2029,7 @@ again: | |||
2029 | odd_flag = 0; | 2029 | odd_flag = 0; |
2030 | flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST); | 2030 | flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST); |
2031 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 2031 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
2032 | cksum_offset = (skb->h.raw - skb->data); | 2032 | cksum_offset = skb_transport_offset(skb); |
2033 | pseudo_hdr_offset = cksum_offset + skb->csum_offset; | 2033 | pseudo_hdr_offset = cksum_offset + skb->csum_offset; |
2034 | /* If the headers are excessively large, then we must | 2034 | /* If the headers are excessively large, then we must |
2035 | * fall back to a software checksum */ | 2035 | * fall back to a software checksum */ |
@@ -2054,7 +2054,8 @@ again: | |||
2054 | * send loop that we are still in the | 2054 | * send loop that we are still in the |
2055 | * header portion of the TSO packet. | 2055 | * header portion of the TSO packet. |
2056 | * TSO header must be at most 134 bytes long */ | 2056 | * TSO header must be at most 134 bytes long */ |
2057 | cum_len = -((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); | 2057 | cum_len = -(skb_transport_offset(skb) + |
2058 | (skb->h.th->doff << 2)); | ||
2058 | 2059 | ||
2059 | /* for TSO, pseudo_hdr_offset holds mss. | 2060 | /* for TSO, pseudo_hdr_offset holds mss. |
2060 | * The firmware figures out where to put | 2061 | * The firmware figures out where to put |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 28d68c3550ef..09ca2192cbfa 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -387,7 +387,7 @@ void netxen_tso_check(struct netxen_adapter *adapter, | |||
387 | } | 387 | } |
388 | } | 388 | } |
389 | adapter->stats.xmitcsummed++; | 389 | adapter->stats.xmitcsummed++; |
390 | desc->tcp_hdr_offset = skb->h.raw - skb->data; | 390 | desc->tcp_hdr_offset = skb_transport_offset(skb); |
391 | desc->ip_hdr_offset = skb_network_offset(skb); | 391 | desc->ip_hdr_offset = skb_network_offset(skb); |
392 | } | 392 | } |
393 | 393 | ||
diff --git a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c index 9ac1fe659dc9..e4ab7a8acc1a 100644 --- a/drivers/net/sk98lin/skge.c +++ b/drivers/net/sk98lin/skge.c | |||
@@ -1562,7 +1562,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ | |||
1562 | pTxd->pMBuf = pMessage; | 1562 | pTxd->pMBuf = pMessage; |
1563 | 1563 | ||
1564 | if (pMessage->ip_summed == CHECKSUM_PARTIAL) { | 1564 | if (pMessage->ip_summed == CHECKSUM_PARTIAL) { |
1565 | u16 hdrlen = pMessage->h.raw - pMessage->data; | 1565 | u16 hdrlen = skb_transport_offset(pMessage); |
1566 | u16 offset = hdrlen + pMessage->csum_offset; | 1566 | u16 offset = hdrlen + pMessage->csum_offset; |
1567 | 1567 | ||
1568 | if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) && | 1568 | if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) && |
@@ -1681,7 +1681,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ | |||
1681 | ** Does the HW need to evaluate checksum for TCP or UDP packets? | 1681 | ** Does the HW need to evaluate checksum for TCP or UDP packets? |
1682 | */ | 1682 | */ |
1683 | if (pMessage->ip_summed == CHECKSUM_PARTIAL) { | 1683 | if (pMessage->ip_summed == CHECKSUM_PARTIAL) { |
1684 | u16 hdrlen = pMessage->h.raw - pMessage->data; | 1684 | u16 hdrlen = skb_transport_offset(pMessage); |
1685 | u16 offset = hdrlen + pMessage->csum_offset; | 1685 | u16 offset = hdrlen + pMessage->csum_offset; |
1686 | 1686 | ||
1687 | Control = BMU_STFWD; | 1687 | Control = BMU_STFWD; |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index d476a3cc2e94..ca7a0e039849 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -2654,7 +2654,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
2654 | td->dma_hi = map >> 32; | 2654 | td->dma_hi = map >> 32; |
2655 | 2655 | ||
2656 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 2656 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
2657 | int offset = skb->h.raw - skb->data; | 2657 | const int offset = skb_transport_offset(skb); |
2658 | 2658 | ||
2659 | /* This seems backwards, but it is what the sk98lin | 2659 | /* This seems backwards, but it is what the sk98lin |
2660 | * does. Looks like hardware is wrong? | 2660 | * does. Looks like hardware is wrong? |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index a37bb205f3d3..a35f2f2784ae 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -1421,7 +1421,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
1421 | 1421 | ||
1422 | /* Handle TCP checksum offload */ | 1422 | /* Handle TCP checksum offload */ |
1423 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 1423 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
1424 | unsigned offset = skb->h.raw - skb->data; | 1424 | const unsigned offset = skb_transport_offset(skb); |
1425 | u32 tcpsum; | 1425 | u32 tcpsum; |
1426 | 1426 | ||
1427 | tcpsum = offset << 16; /* sum start */ | 1427 | tcpsum = offset << 16; /* sum start */ |
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index db2e1a6b7231..4bb89dec5650 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c | |||
@@ -1028,10 +1028,8 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1028 | 1028 | ||
1029 | ctrl = 0; | 1029 | ctrl = 0; |
1030 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 1030 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
1031 | u64 csum_start_off, csum_stuff_off; | 1031 | const u64 csum_start_off = skb_transport_offset(skb); |
1032 | 1032 | const u64 csum_stuff_off = csum_start_off + skb->csum_offset; | |
1033 | csum_start_off = (u64) (skb->h.raw - skb->data); | ||
1034 | csum_stuff_off = csum_start_off + skb->csum_offset; | ||
1035 | 1033 | ||
1036 | ctrl = (TXDCTRL_CENAB | | 1034 | ctrl = (TXDCTRL_CENAB | |
1037 | (csum_start_off << 15) | | 1035 | (csum_start_off << 15) | |
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index aca592bc0329..4b69c1deb9f3 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c | |||
@@ -2269,10 +2269,8 @@ static int happy_meal_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2269 | 2269 | ||
2270 | tx_flags = TXFLAG_OWN; | 2270 | tx_flags = TXFLAG_OWN; |
2271 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 2271 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
2272 | u32 csum_start_off, csum_stuff_off; | 2272 | const u32 csum_start_off = skb_transport_offset(skb); |
2273 | 2273 | const u32 csum_stuff_off = csum_start_off + skb->csum_offset; | |
2274 | csum_start_off = (u32) (skb->h.raw - skb->data); | ||
2275 | csum_stuff_off = csum_start_off + skb->csum_offset; | ||
2276 | 2274 | ||
2277 | tx_flags = (TXFLAG_OWN | TXFLAG_CSENABLE | | 2275 | tx_flags = (TXFLAG_OWN | TXFLAG_CSENABLE | |
2278 | ((csum_start_off << 14) & TXFLAG_CSBUFBEGIN) | | 2276 | ((csum_start_off << 14) & TXFLAG_CSBUFBEGIN) | |