| From b38a3703d8800cbf37b804d356e967c6efb20c85 Mon Sep 17 00:00:00 2001 |
| From: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Date: Fri, 25 Oct 2019 13:47:24 +1100 |
| Subject: [PATCH] net: ethernet: ftgmac100: Fix DMA coherency issue with SW |
| checksum |
| |
| commit 88824e3bf29a2fcacfd9ebbfe03063649f0f3254 upstream. |
| |
| We are calling the checksum helper after the dma_map_single() |
| call to map the packet. This is incorrect as the checksumming |
| code will touch the packet from the CPU. This means the cache |
| won't be properly flushes (or the bounce buffering will leave |
| us with the unmodified packet to DMA). |
| |
| This moves the calculation of the checksum & vlan tags to |
| before the DMA mapping. |
| |
| This also has the side effect of fixing another bug: If the |
| checksum helper fails, we goto "drop" to drop the packet, which |
| will not unmap the DMA mapping. |
| |
| Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Fixes: 05690d633f30 ("ftgmac100: Upgrade to NETIF_F_HW_CSUM") |
| Reviewed-by: Vijay Khemka <vijaykhemka@fb.com> |
| Tested-by: Vijay Khemka <vijaykhemka@fb.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c |
| index 055f77c70fa3..e671914fc247 100644 |
| --- a/drivers/net/ethernet/faraday/ftgmac100.c |
| +++ b/drivers/net/ethernet/faraday/ftgmac100.c |
| @@ -726,6 +726,18 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb, |
| */ |
| nfrags = skb_shinfo(skb)->nr_frags; |
| |
| + /* Setup HW checksumming */ |
| + csum_vlan = 0; |
| + if (skb->ip_summed == CHECKSUM_PARTIAL && |
| + !ftgmac100_prep_tx_csum(skb, &csum_vlan)) |
| + goto drop; |
| + |
| + /* Add VLAN tag */ |
| + if (skb_vlan_tag_present(skb)) { |
| + csum_vlan |= FTGMAC100_TXDES1_INS_VLANTAG; |
| + csum_vlan |= skb_vlan_tag_get(skb) & 0xffff; |
| + } |
| + |
| /* Get header len */ |
| len = skb_headlen(skb); |
| |
| @@ -752,19 +764,6 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb, |
| if (nfrags == 0) |
| f_ctl_stat |= FTGMAC100_TXDES0_LTS; |
| txdes->txdes3 = cpu_to_le32(map); |
| - |
| - /* Setup HW checksumming */ |
| - csum_vlan = 0; |
| - if (skb->ip_summed == CHECKSUM_PARTIAL && |
| - !ftgmac100_prep_tx_csum(skb, &csum_vlan)) |
| - goto drop; |
| - |
| - /* Add VLAN tag */ |
| - if (skb_vlan_tag_present(skb)) { |
| - csum_vlan |= FTGMAC100_TXDES1_INS_VLANTAG; |
| - csum_vlan |= skb_vlan_tag_get(skb) & 0xffff; |
| - } |
| - |
| txdes->txdes1 = cpu_to_le32(csum_vlan); |
| |
| /* Next descriptor */ |
| -- |
| 2.7.4 |
| |