From patchwork Mon Aug 29 13:57:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helmut Buchsbaum X-Patchwork-Id: 663697 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3sNCsd2nTlz9s9c for ; Mon, 29 Aug 2016 23:58:13 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=Efqs9h2X; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757297AbcH2N6J (ORCPT ); Mon, 29 Aug 2016 09:58:09 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:35939 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757252AbcH2N6I (ORCPT ); Mon, 29 Aug 2016 09:58:08 -0400 Received: by mail-wm0-f65.google.com with SMTP id i138so9669337wmf.3 for ; Mon, 29 Aug 2016 06:58:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sHuvAQ8G43pJRxukYg6KSp9cHEAfbX6Zv9JwXDnuLzg=; b=Efqs9h2Xn0zK7b2zVPozaqRB89EQbWrR4DU1g7hJDHmncVWZHtuiFE+qd4y31PxQc+ m2VXz07a8d/qO+1cHIiPp8+0TMvPgrzlXbXaAtbdXsgHzU+us9AOg0Mo7pnpYW5TYqmd U3rWo/b5caYztwDWZjqldsKmooMub/w9LGfw0EAF3J/dGjwBsWmoFuRCEU8zR1jkQzIF IQfyByck3THMMgi6NlnrfUN3fbuODogTKbiKpIfeC+jAOfsgFmVdbByuhVqo08/Scfrq YHGYUSGqVbtD5l6NeyC4zDo/zvQIGz4rX17wO6Q45beLKMQoFlKfK3yroVSJnyMawMK/ QJ0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sHuvAQ8G43pJRxukYg6KSp9cHEAfbX6Zv9JwXDnuLzg=; b=VsVxBmbug8cnmQiJ3iNKlenfK9xhERFBgsmibtfK12+32fHoXzSnGFp0XWDUqHiyyY Sr9OpVx/QDEZvP0zE6p4ybobglUwIyFdKrBqU+ai9/na6mGakw3rR8JaRVl3/tW0y1g3 4nH6KBaEtGrKgoZFT+02Y5tO8IYaXmP4VaHK3Ft3A8Sgt5/Ydeg8PFRlXzPDsRCoWKF3 FrkNVMUNn1ub2GTnZ1LuIQWc0o+PVa26VJ9gIboW1NM5jueeIEUqlkIwAb+6GGm1ogay Ih08pRgkCOy9XjjFzXcEUkMngBVZBzM9FMy9Mq+hEVGMxU7fbrAVTGbBKqkVnH+pJfj8 BgmQ== X-Gm-Message-State: AE9vXwOQRkIeqfNH8lhnb38T7MMuZ6fhTyHXWUQ5zsG8kXduhHMip459hwjx/HwKXuP/5w== X-Received: by 10.28.216.75 with SMTP id p72mr10192296wmg.67.1472479086672; Mon, 29 Aug 2016 06:58:06 -0700 (PDT) Received: from jessie64.festo.net ([165.225.72.106]) by smtp.gmail.com with ESMTPSA id 17sm13680368wmf.6.2016.08.29.06.58.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 29 Aug 2016 06:58:06 -0700 (PDT) From: Helmut Buchsbaum To: David Miller , tom@herbertland.com, Nicolas Ferre Cc: Michal Simek , netdev@vger.kernel.org, Cyrille Pitchen , Helmut Buchsbaum Subject: [PATCH v2 1/1] net: macb: initialize checksum when using checksum offloading Date: Mon, 29 Aug 2016 15:57:25 +0200 Message-Id: <1472479045-8814-2-git-send-email-helmut.buchsbaum@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1472479045-8814-1-git-send-email-helmut.buchsbaum@gmail.com> References: <1471611898-3852-2-git-send-email-helmut.buchsbaum@gmail.com> <1472479045-8814-1-git-send-email-helmut.buchsbaum@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org MACB/GEM needs the checksum field initialized to 0 to get correct results on transmit in all cases, e.g. on Zynq, UDP packets with payload <= 2 otherwise contain a wrong checksums. Signed-off-by: Helmut Buchsbaum --- drivers/net/ethernet/cadence/macb.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index 89c0cfa..de2f791 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c @@ -1323,6 +1323,19 @@ dma_error: return 0; } +static inline void macb_clear_csum(struct sk_buff *skb) +{ + /* no change for packets without checksum offloading */ + if (skb->ip_summed != CHECKSUM_PARTIAL) + return; + + /* initialize checksum field + * This is required - at least for Zynq, which otherwise calculates + * wrong UDP header checksums for UDP packets with UDP data len <=2 + */ + *(__sum16 *)(skb->head + skb->csum_start + skb->csum_offset) = 0; +} + static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) { u16 queue_index = skb_get_queue_mapping(skb); @@ -1362,6 +1375,8 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_BUSY; } + macb_clear_csum(skb); + /* Map socket buffer for DMA transfer */ if (!macb_tx_map(bp, queue, skb)) { dev_kfree_skb_any(skb);