--- a/drivers/net/ethernet/cavium/cns3xxx_eth.c +++ b/drivers/net/ethernet/cavium/cns3xxx_eth.c @@ -666,6 +666,7 @@ static int eth_xmit(struct sk_buff *skb, int nr_frags = skb_shinfo(skb)->nr_frags; struct skb_frag_struct *frag; unsigned int i; + u32 config0 = 0; if (pmap == 8) pmap = (1 << 4); @@ -691,6 +692,10 @@ static int eth_xmit(struct sk_buff *skb, spin_unlock(&tx_lock); + config0 = FORCE_ROUTE; + if (skb->ip_summed == CHECKSUM_PARTIAL) + config0 |= UDP_CHECKSUM | TCP_CHECKSUM; + if (!nr_frags) { tx_desc = &(tx_ring)->desc[index]; @@ -704,23 +709,14 @@ static int eth_xmit(struct sk_buff *skb, tx_ring->phys_tab[index] = phys; tx_ring->buff_tab[index] = skb; - if (index == TX_DESCS - 1) { - tx_desc->config0 = END_OF_RING | FIRST_SEGMENT | LAST_SEGMENT | - FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM | - TCP_CHECKSUM | len; - } else { - tx_desc->config0 = FIRST_SEGMENT | LAST_SEGMENT | - FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM | - TCP_CHECKSUM | len; - } + config0 |= FIRST_SEGMENT | LAST_SEGMENT; } else { - unsigned int config; - index = ((index + nr_frags) % TX_DESCS); tx_desc = &(tx_ring)->desc[index]; /* fragments */ for (i = nr_frags; i > 0; i--) { + u32 config; void *addr; frag = &skb_shinfo(skb)->frags[i-1]; @@ -735,8 +731,7 @@ static int eth_xmit(struct sk_buff *skb, tx_desc->pmap = pmap; tx_ring->phys_tab[index] = phys; - config = FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM | - TCP_CHECKSUM | len; + config = config0 | len; if (i == nr_frags) { config |= LAST_SEGMENT; tx_ring->buff_tab[index] = skb; @@ -757,24 +752,19 @@ static int eth_xmit(struct sk_buff *skb, /* header */ len = skb->len - skb->data_len; - phys = dma_map_single(NULL, skb->data, len, - DMA_TO_DEVICE); + phys = dma_map_single(NULL, skb->data, len, DMA_TO_DEVICE); tx_desc->sdp = phys; tx_desc->pmap = pmap; tx_ring->phys_tab[index] = phys; - - if (index == TX_DESCS - 1) { - tx_desc->config0 = END_OF_RING | FIRST_SEGMENT | - FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM | - TCP_CHECKSUM | len; - } else { - tx_desc->config0 = FIRST_SEGMENT | - FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM | - TCP_CHECKSUM | len; - } + config0 |= FIRST_SEGMENT; } + if (index == TX_DESCS - 1) + config0 |= END_OF_RING; + + tx_desc->config0 = config0 | len; + mb(); spin_lock(&tx_lock);