From patchwork Sun Sep 4 16:09:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helmut Buchsbaum X-Patchwork-Id: 665528 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 3sRyY74tQlz9sR9 for ; Mon, 5 Sep 2016 02:11:55 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=NufTpYsm; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754383AbcIDQLx (ORCPT ); Sun, 4 Sep 2016 12:11:53 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:36329 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754325AbcIDQLu (ORCPT ); Sun, 4 Sep 2016 12:11:50 -0400 Received: by mail-wm0-f68.google.com with SMTP id l65so2028930wmf.3 for ; Sun, 04 Sep 2016 09:10:35 -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=3fvszVZ/7w0TgyXyNfsNRRNebhhrJOPcADdVIDP8K9k=; b=NufTpYsmfQPn5+RiMddG1ZIzwg+L/3regZUwC5qtmI8+XivNIHdMEPpRshPUUuubjw UH5AteugLWWPQRaFz8daRVm89IBlMVIBR30/ft9R7h0wpinJKQSZb+kRo8Zj4Ax8cWKE 0vz6nLGs2Avkca+m2ZXd6Jx/xw/noZZLnzFsGPvuz1uhcJmjSXAAl/XvC9tgxIYEi2Z2 l/hYfdlWkVtQNpa94FgCnGs6aaYU+z78U0nBXUyrbuxGhB4XTB/ehBBgWN1DZYBWZwOK 54VvlPpejR2od7+35OAw/6/BNqs2ORKNn1pKfIAYqlhrphf3pDSTxjhcuiF9mb2gMmxJ Jydw== 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=3fvszVZ/7w0TgyXyNfsNRRNebhhrJOPcADdVIDP8K9k=; b=dq722OhV3oE2UpWxzKtKjR8NKqxShj1nlxFNwItz+nu8bv2dcKeh3+vmebzdLysA2c 7bBVeTEDYqH2oVnhhXQf/IHFmp0mmOFMTPlwpCWdcq13h7NvuSRRzeGdLPLvhivd6wpz 6i2H+PlJquqMZ733JvNAyB7fgSFC+VfOHt4DVSKqGwhoMhu05hOx/wGBmVoIJTx3kKOj mCfKgGnKtyMjCp1M+SkF9wkzqSZwZJ8KNq5KrVRcpbVN9klkiUMfW45NtJnJyTvWZBEG pgGhSNmn1DsW7U57OHuzbZsOfI+sXaRlnLrS9cy1ASKRFxLwQeR6ZJ6dyWkRgEeAS/5Q QXkw== X-Gm-Message-State: AE9vXwMe3PWXray6YoBK42MJVD0kKydrlNEeF/pOrxMhZubFZwG5ep+DAe1rw43KuR8uWA== X-Received: by 10.194.85.106 with SMTP id g10mr11792479wjz.114.1473005434701; Sun, 04 Sep 2016 09:10:34 -0700 (PDT) Received: from jessie64.buchsbaum.ddns.net (178-190-148-193.adsl.highway.telekom.at. [178.190.148.193]) by smtp.gmail.com with ESMTPSA id g62sm2490883wme.18.2016.09.04.09.10.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 04 Sep 2016 09:10:33 -0700 (PDT) From: Helmut Buchsbaum To: David Miller , Nicolas Ferre Cc: tom@herbertland.com, Michal Simek , netdev@vger.kernel.org, Cyrille Pitchen , Helmut Buchsbaum Subject: [PATCH v3] net: macb: initialize checksum when using checksum offloading Date: Sun, 4 Sep 2016 18:09:47 +0200 Message-Id: <1473005387-24917-1-git-send-email-helmut.buchsbaum@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1472479045-8814-2-git-send-email-helmut.buchsbaum@gmail.com> References: <1472479045-8814-2-git-send-email-helmut.buchsbaum@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org I'm still struggling to get this fix right.. Changes since v2: - do not blindly modify SKB contents according to Dave's legitimate objection Changes since v1: - dropped disabling HW checksum offload for Zynq - initialize checksum similar to net/ethernet/freescale/fec_main.c -- >8 -- 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 | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index 89c0cfa..d954a97 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c @@ -1323,6 +1323,24 @@ dma_error: return 0; } +static inline int macb_clear_csum(struct sk_buff *skb) +{ + /* no change for packets without checksum offloading */ + if (skb->ip_summed != CHECKSUM_PARTIAL) + return 0; + + /* make sure we can modify the header */ + if (unlikely(skb_cow_head(skb, 0))) + return -1; + + /* 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_checksum_start(skb) + skb->csum_offset) = 0; + return 0; +} + static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) { u16 queue_index = skb_get_queue_mapping(skb); @@ -1362,6 +1380,11 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_BUSY; } + if (macb_clear_csum(skb)) { + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; + } + /* Map socket buffer for DMA transfer */ if (!macb_tx_map(bp, queue, skb)) { dev_kfree_skb_any(skb);