aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/chelsio/cxgb3
diff options
context:
space:
mode:
authorSimon Horman <horms@verge.net.au>2013-05-28 16:34:24 -0400
committerDavid S. Miller <davem@davemloft.net>2013-05-29 02:49:07 -0400
commitbe8b678c6c63010cd2b0f4f602bd3066f7827fb2 (patch)
tree10ca86d4e1bb5209d2985c73c21faab3d0e21b9b /drivers/net/ethernet/chelsio/cxgb3
parent25b6e14881e7861bb720a4624dcaf5f37854fc70 (diff)
cxgb3: Correct comparisons and calculations using skb->tail and skb-transport_header
This corrects an regression introduced by "net: Use 16bits for *_headers fields of struct skbuff" when NET_SKBUFF_DATA_USES_OFFSET is not set. In that case skb->tail will be a pointer whereas skb->transport_header will be an offset from head. This is corrected by using wrappers that ensure that comparisons and calculations are always made using pointers. Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb3')
-rw-r--r--drivers/net/ethernet/chelsio/cxgb3/sge.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
index 2fd773e267dc..46d1efc17527 100644
--- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
@@ -1584,9 +1584,8 @@ static void deferred_unmap_destructor(struct sk_buff *skb)
1584 p = dui->addr; 1584 p = dui->addr;
1585 1585
1586 if (skb->tail - skb->transport_header) 1586 if (skb->tail - skb->transport_header)
1587 pci_unmap_single(dui->pdev, *p++, 1587 pci_unmap_single(dui->pdev, *p++, skb_tail_pointer(skb) -
1588 skb->tail - skb->transport_header, 1588 skb_transport_header(skb), PCI_DMA_TODEVICE);
1589 PCI_DMA_TODEVICE);
1590 1589
1591 si = skb_shinfo(skb); 1590 si = skb_shinfo(skb);
1592 for (i = 0; i < si->nr_frags; i++) 1591 for (i = 0; i < si->nr_frags; i++)
@@ -1647,8 +1646,8 @@ static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
1647 flits = skb_transport_offset(skb) / 8; 1646 flits = skb_transport_offset(skb) / 8;
1648 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; 1647 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
1649 sgl_flits = write_sgl(skb, sgp, skb_transport_header(skb), 1648 sgl_flits = write_sgl(skb, sgp, skb_transport_header(skb),
1650 skb->tail - skb->transport_header, 1649 skb_tail_pointer(skb) -
1651 addr); 1650 skb_transport_header(skb), addr);
1652 if (need_skb_unmap()) { 1651 if (need_skb_unmap()) {
1653 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits); 1652 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits);
1654 skb->destructor = deferred_unmap_destructor; 1653 skb->destructor = deferred_unmap_destructor;
@@ -1674,7 +1673,7 @@ static inline unsigned int calc_tx_descs_ofld(const struct sk_buff *skb)
1674 1673
1675 flits = skb_transport_offset(skb) / 8; /* headers */ 1674 flits = skb_transport_offset(skb) / 8; /* headers */
1676 cnt = skb_shinfo(skb)->nr_frags; 1675 cnt = skb_shinfo(skb)->nr_frags;
1677 if (skb->tail != skb->transport_header) 1676 if (skb_tail_pointer(skb) != skb_transport_header(skb))
1678 cnt++; 1677 cnt++;
1679 return flits_to_desc(flits + sgl_len(cnt)); 1678 return flits_to_desc(flits + sgl_len(cnt));
1680} 1679}