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;
11 @@ -691,6 +692,10 @@ static int eth_xmit(struct sk_buff *skb,
13 spin_unlock(&tx_lock);
15 + config0 = FORCE_ROUTE;
16 + if (skb->ip_summed == CHECKSUM_PARTIAL)
17 + config0 |= UDP_CHECKSUM | TCP_CHECKSUM;
20 tx_desc = &(tx_ring)->desc[index];
22 @@ -704,23 +709,14 @@ static int eth_xmit(struct sk_buff *skb,
23 tx_ring->phys_tab[index] = phys;
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 |
31 - tx_desc->config0 = FIRST_SEGMENT | LAST_SEGMENT |
32 - FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
35 + config0 |= FIRST_SEGMENT | LAST_SEGMENT;
37 - unsigned int config;
39 index = ((index + nr_frags) % TX_DESCS);
40 tx_desc = &(tx_ring)->desc[index];
43 for (i = nr_frags; i > 0; i--) {
47 frag = &skb_shinfo(skb)->frags[i-1];
48 @@ -735,8 +731,7 @@ static int eth_xmit(struct sk_buff *skb,
50 tx_ring->phys_tab[index] = phys;
52 - config = FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
54 + config = config0 | len;
56 config |= LAST_SEGMENT;
57 tx_ring->buff_tab[index] = skb;
58 @@ -757,24 +752,19 @@ static int eth_xmit(struct sk_buff *skb,
60 len = skb->len - skb->data_len;
62 - phys = dma_map_single(NULL, skb->data, len,
64 + phys = dma_map_single(NULL, skb->data, len, DMA_TO_DEVICE);
68 tx_ring->phys_tab[index] = phys;
70 - if (index == TX_DESCS - 1) {
71 - tx_desc->config0 = END_OF_RING | FIRST_SEGMENT |
72 - FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
75 - tx_desc->config0 = FIRST_SEGMENT |
76 - FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM |
79 + config0 |= FIRST_SEGMENT;
82 + if (index == TX_DESCS - 1)
83 + config0 |= END_OF_RING;
85 + tx_desc->config0 = config0 | len;