Root/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);
90

Archive Download this file



interactive