Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp4034440ybg; Fri, 25 Oct 2019 12:22:35 -0700 (PDT) X-Google-Smtp-Source: APXvYqxwf3cl887gQu5klATYrIjKG03ImoWF2rNIKKMElpfdu7vI0iEs3dtm/JdLgia+J+Ihm9BM X-Received: by 2002:a50:8dc9:: with SMTP id s9mr5727083edh.168.1572031355306; Fri, 25 Oct 2019 12:22:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572031355; cv=none; d=google.com; s=arc-20160816; b=kU2348IcUfElf/M5mdo2lSL4dwRatGSG8U8jJegMY2edJBX3/UaIp/koJp8VBjsexL 4aDB/T7BkmrVRN/3uu3bgfJxofjiplzLQSxC+DNXQl5RO7+zwMHLis5m2xf2YYZQxeM5 wjyAWxqQIg3UYZo92Y81BWrvG0sjyulMf6ovC+kXZyywl/KSRT+U0/q2Eh9XvTm2Z9LO 2ol6VO4Hx/JpQ+F7eJLxldW0UkBZKPQAG9mKJSfBahzq1ijWy49I+YTuyFjcAaUPnsks P0wZUHRP/vEeQitnXMFfLkZOtOHpKYyuL3tekVsM0O8J9TSUElVYJXSjrizRQDCgrKaf 3ZFw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :date:cc:to:from:subject:message-id; bh=TA84+wb/SFG9ZhE0LBoGcDR+MyxryV9DhYkWzE9x8rU=; b=n9M9ItXemASO/PfhMSll+MyX3LNUQETe/FV4TO/Y38dV91LetBOKTH9g/Ut52RVXM6 takRbNT/UkN8sAC+thBMoTrSyUjBS4UnKcEEYfFitnwa+KIVGdPONjGMyTCzE8pcn9S+ +qHK4r0SG/VPU8yfUdnkFdFQtv3gmwKYFCbcT0q9NzZrzqt6EQKXnRGalx+ULJDK5iIG NwthNo2Ig5cT5fVojxgSMSi+hMKaB2a1pfHq0UEpFgb9CN6FFKlLtFE2+74CU4J78CT8 G/qJ1PXgCFDJAe8wHhwXv9FLci8DGvg677oEVuaZtkDXeglkW9QOmhh8aJ+eBtTLPobk MXcQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m1si1833967ejb.44.2019.10.25.12.22.11; Fri, 25 Oct 2019 12:22:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390738AbfJYCrp (ORCPT + 99 others); Thu, 24 Oct 2019 22:47:45 -0400 Received: from gate.crashing.org ([63.228.1.57]:53148 "EHLO gate.crashing.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728416AbfJYCro (ORCPT ); Thu, 24 Oct 2019 22:47:44 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id x9P2lPkV002163; Thu, 24 Oct 2019 21:47:26 -0500 Message-ID: <572a7d510ace5e5a5ba41c4774d330133291c82a.camel@kernel.crashing.org> Subject: [PATCH] net: ethernet: ftgmac100: Fix DMA coherency issue with SW checksum From: Benjamin Herrenschmidt To: "David S. Miller" Cc: netdev@vger.kernel.org, "linux-kernel@vger.kernel.org" , Vijay Khemka , openbmc@lists.ozlabs.org, Joel Stanley , linux-aspeed@lists.ozlabs.org Date: Fri, 25 Oct 2019 13:47:24 +1100 Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Fixes: 05690d633f30 ftgmac100: Upgrade to NETIF_F_HW_CSUM CC: stable@vger.kernel.org [v4.12+] --- drivers/net/ethernet/faraday/ftgmac100.c | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c index 9b7af94a40bb..96e9565f1e08 100644 --- a/drivers/net/ethernet/faraday/ftgmac100.c +++ b/drivers/net/ethernet/faraday/ftgmac100.c @@ -727,6 +727,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); @@ -753,19 +765,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 */