diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/dpa')
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c | 46 |
2 files changed, 36 insertions, 12 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c index 7821195..c599052 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c @@ -1530,7 +1530,7 @@ int dpa_enable_tx_csum(struct dpa_priv_s *priv, int ethertype = ntohs(skb->protocol); int retval = 0; - if (!priv->mac_dev || skb->ip_summed != CHECKSUM_PARTIAL) + if (skb->ip_summed != CHECKSUM_PARTIAL) return 0; /* Note: L3 csum seems to be already computed in sw, but we can't choose diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c index 300c456..64857e5 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c @@ -498,12 +498,43 @@ int __hot dpa_shared_tx(struct sk_buff *skb, struct net_device *net_dev) dpa_bp_vaddr + dpa_fd_offset(&fd), dpa_fd_length(&fd)); - /* Enable L3/L4 hardware checksum computation, if applicable */ - err = dpa_enable_tx_csum(priv, skb, &fd, + if (!priv->mac_dev) + fd.cmd |= FM_FD_CMD_DTC; + else { + /* Enable L3/L4 hardware checksum computation, + * if applicable + */ + err = dpa_enable_tx_csum(priv, skb, &fd, dpa_bp_vaddr + DPA_TX_PRIV_DATA_SIZE); + + if (unlikely(err < 0)) { + if (netif_msg_tx_err(priv) && net_ratelimit()) + netdev_err(net_dev, + "Tx HW csum error: %d\n", err); + percpu_priv->stats.tx_errors++; + goto l3_l4_csum_failed; + } + } + } else { - err = dpa_enable_tx_csum(priv, skb, &fd, - (char *)&parse_results); + if (!priv->mac_dev) + fd.cmd |= FM_FD_CMD_DTC; + else { + /* Enable L3/L4 hardware checksum computation, + * if applicable + */ + err = dpa_enable_tx_csum(priv, skb, &fd, + (char *)&parse_results); + + if (unlikely(err < 0)) { + if (netif_msg_tx_err(priv) && net_ratelimit()) + netdev_err(net_dev, + "Tx HW csum error: %d\n", err); + percpu_priv->stats.tx_errors++; + goto l3_l4_csum_failed; + } + + } copy_to_unmapped_area(bm_buf_addr(&bmb) + DPA_TX_PRIV_DATA_SIZE, &parse_results, @@ -514,13 +545,6 @@ int __hot dpa_shared_tx(struct sk_buff *skb, struct net_device *net_dev) dpa_fd_length(&fd)); } - if (unlikely(err < 0)) { - if (netif_msg_tx_err(priv) && net_ratelimit()) - netdev_err(net_dev, "Tx HW csum error: %d\n", err); - percpu_priv->stats.tx_errors++; - goto l3_l4_csum_failed; - } - err = dpa_xmit(priv, &percpu_priv->stats, queue_mapping, &fd); l3_l4_csum_failed: |