bcm63xx: switch to 3.6.6
[openwrt.git] / target / linux / cns3xxx / patches-3.3 / 400-ethernet_fix_tx_csum_offload.patch
1 --- a/drivers/net/ethernet/cavium/cns3xxx_eth.c
2 +++ b/drivers/net/ethernet/cavium/cns3xxx_eth.c
3 @@ -666,6 +666,7 @@ static int eth_xmit(struct sk_buff *skb,
4         int nr_frags = skb_shinfo(skb)->nr_frags;
5         struct skb_frag_struct *frag;
6         unsigned int i;
7 +       u32 config0 = 0;
8  
9         if (pmap == 8)
10                 pmap = (1 << 4);
11 @@ -691,6 +692,10 @@ static int eth_xmit(struct sk_buff *skb,
12  
13         spin_unlock(&tx_lock);
14  
15 +       config0 = FORCE_ROUTE;
16 +       if (skb->ip_summed == CHECKSUM_PARTIAL)
17 +               config0 |= UDP_CHECKSUM | TCP_CHECKSUM;
18 +
19         if (!nr_frags) {
20                 tx_desc = &(tx_ring)->desc[index];
21  
22 @@ -704,23 +709,14 @@ static int eth_xmit(struct sk_buff *skb,
23                 tx_ring->phys_tab[index] = phys;
24  
25                 tx_ring->buff_tab[index] = skb;
26 -               if (index == TX_DESCS - 1) {
27 -                       tx_desc->config0 = END_OF_RING | FIRST_SEGMENT | LAST_SEGMENT |
28 -                                       FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
29 -                                       TCP_CHECKSUM | len;
30 -               } else {
31 -                       tx_desc->config0 = FIRST_SEGMENT | LAST_SEGMENT |
32 -                                       FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
33 -                                       TCP_CHECKSUM | len;
34 -               }
35 +               config0 |= FIRST_SEGMENT | LAST_SEGMENT;
36         } else {
37 -               unsigned int config;
38 -
39                 index = ((index + nr_frags) % TX_DESCS);
40                 tx_desc = &(tx_ring)->desc[index];
41  
42                 /* fragments */
43                 for (i = nr_frags; i > 0; i--) {
44 +                       u32 config;
45                         void *addr;
46  
47                         frag = &skb_shinfo(skb)->frags[i-1];
48 @@ -735,8 +731,7 @@ static int eth_xmit(struct sk_buff *skb,
49                         tx_desc->pmap = pmap;
50                         tx_ring->phys_tab[index] = phys;
51  
52 -                       config = FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
53 -                               TCP_CHECKSUM | len;
54 +                       config = config0 | len;
55                         if (i == nr_frags) {
56                                 config |= LAST_SEGMENT;
57                                 tx_ring->buff_tab[index] = skb;
58 @@ -757,24 +752,19 @@ static int eth_xmit(struct sk_buff *skb,
59                 /* header */
60                 len = skb->len - skb->data_len;
61  
62 -               phys = dma_map_single(NULL, skb->data, len,
63 -                                       DMA_TO_DEVICE);
64 +               phys = dma_map_single(NULL, skb->data, len, DMA_TO_DEVICE);
65  
66                 tx_desc->sdp = phys;
67                 tx_desc->pmap = pmap;
68                 tx_ring->phys_tab[index] = phys;
69 -
70 -               if (index == TX_DESCS - 1) {
71 -                       tx_desc->config0 = END_OF_RING | FIRST_SEGMENT |
72 -                                       FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
73 -                                       TCP_CHECKSUM | len;
74 -               } else {
75 -                       tx_desc->config0 = FIRST_SEGMENT |
76 -                                       FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
77 -                                       TCP_CHECKSUM | len;
78 -               }
79 +               config0 |= FIRST_SEGMENT;
80         }
81  
82 +       if (index == TX_DESCS - 1)
83 +               config0 |= END_OF_RING;
84 +
85 +       tx_desc->config0 = config0 | len;
86 +
87         mb();
88  
89         spin_lock(&tx_lock);