Received: by 2002:ac0:a874:0:0:0:0:0 with SMTP id c49csp319294ima; Fri, 15 Mar 2019 03:37:23 -0700 (PDT) X-Google-Smtp-Source: APXvYqw1aotCVPJQYFnm+NmW9zbew+ls7j3unTE/qv8KJu/lYdsKWA/S7XPbJMNhFtiFHYPVWJqf X-Received: by 2002:a63:d256:: with SMTP id t22mr2814702pgi.108.1552646243540; Fri, 15 Mar 2019 03:37:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552646243; cv=none; d=google.com; s=arc-20160816; b=XO1bgNsUIaWbRpdDSCWd1kNcffp4NfKHyde+ck8YtePLe0vlugobFFT5G8oP7y3Xpl w9YHsnpBjkLk1dpdOYVJ10k0pQoVU3gq1yZ53N7JRtGA4xaRKoa/+aezU4S9MACN2eXA ovUD/xSh8aw1EsuVyb3Hf3d5e7t5/Fb1HvCzD8p73UrUlU5ZQXwdu2OFLmY1cjQ9Y+L8 6SmFoAAkBNifg8hdz+oNu2HtkNPv6rjcGVX3HRKaUBrKBUKwm07NyvIO2NLvfsot9SEL TpEGEdrMa9/yzrXWb/qvAsWiWabXiY6QRixYxpz2QvYbvdQTXcmp6Wp3pms2fqJSEGaS J3OQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=LWeGloYS4LIPIbPtxjfatwegvs/qVIFq3LZ7kRaubfg=; b=FzrChEFkRz24AsDCmghIqfk2fNwyO0lH/rUtJTOeYOM0jVeT1zFm/0/p4kNz3mkqTN 59Mk/0m097mTcSYRnqNWqfU7G+ZHCuL/46jUHR0p/+UhUxSzmvdSjfSJcChjsET5aR3P mu1QilnLIFGiu2roZXBLqNiHk2JG38qJdoUcbNGzr1kvkatkPJMczJxgQ+UQEhgSpwUB OITQErld6X3ppFlVRmkPhPOmJuc0LR4cvb1kxB3cH+KRw1ctRHg0jh7UvPc3Y/IARu4l dqcXPBXhuTJr85V3IkUeyChWxtUiY3t1Sri40+3vELj3AMtY/a6XrWNnUjGmQJYjTF9o xAvA== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=iki.fi Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q11si1463698pgh.548.2019.03.15.03.37.08; Fri, 15 Mar 2019 03:37:23 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=iki.fi Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728955AbfCOKfq (ORCPT + 99 others); Fri, 15 Mar 2019 06:35:46 -0400 Received: from emh03.mail.saunalahti.fi ([62.142.5.109]:36156 "EHLO emh03.mail.saunalahti.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727740AbfCOKfk (ORCPT ); Fri, 15 Mar 2019 06:35:40 -0400 Received: from localhost.localdomain (85-76-115-153-nat.elisa-mobile.fi [85.76.115.153]) by emh03.mail.saunalahti.fi (Postfix) with ESMTP id 0AB0A4008E; Fri, 15 Mar 2019 12:35:36 +0200 (EET) From: Aaro Koskinen To: "David S. Miller" , Giuseppe Cavallaro , Alexandre Torgue , Jose Abreu , Thor Thayer , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Aaro Koskinen Subject: [PATCH v2 1/2] net: stmmac: don't set own bit too early for jumbo frames Date: Fri, 15 Mar 2019 12:35:31 +0200 Message-Id: <20190315103532.6303-1-aaro.koskinen@iki.fi> X-Mailer: git-send-email 2.17.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Aaro Koskinen Commit 0e80bdc9a72d ("stmmac: first frame prep at the end of xmit routine") overlooked jumbo frames when re-ordering the code, and as a result the own bit was not getting set anymore for the first jumbo frame descriptor. Commit 487e2e22ab79 ("net: stmmac: Set OWN bit for jumbo frames") tried to fix this, but now the bit is getting set too early and the DMA may start while we are still setting up the remaining descriptors. And with the chain mode the own bit remains still unset. Fix by setting the own bit at the end of xmit also with jumbo frames. Fixes: 0e80bdc9a72d ("stmmac: first frame prep at the end of xmit routine") Fixes: 487e2e22ab79 ("net: stmmac: Set OWN bit for jumbo frames") Signed-off-by: Aaro Koskinen Acked-by: Jose Abreu --- v2: Fix typo in comment. Add Acked-by. v1: https://patchwork.ozlabs.org/patch/1056686/ drivers/net/ethernet/stmicro/stmmac/ring_mode.c | 4 ++-- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c index d8c5bc412219..bc83ced94e1b 100644 --- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c +++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c @@ -59,7 +59,7 @@ static int jumbo_frm(void *p, struct sk_buff *skb, int csum) desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB); stmmac_prepare_tx_desc(priv, desc, 1, bmax, csum, - STMMAC_RING_MODE, 1, false, skb->len); + STMMAC_RING_MODE, 0, false, skb->len); tx_q->tx_skbuff[entry] = NULL; entry = STMMAC_GET_ENTRY(entry, DMA_TX_SIZE); @@ -91,7 +91,7 @@ static int jumbo_frm(void *p, struct sk_buff *skb, int csum) tx_q->tx_skbuff_dma[entry].is_jumbo = true; desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB); stmmac_prepare_tx_desc(priv, desc, 1, nopaged_len, csum, - STMMAC_RING_MODE, 1, true, skb->len); + STMMAC_RING_MODE, 0, true, skb->len); } tx_q->cur_tx = entry; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 97c5e1aad88f..6a2e1031a62a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3216,14 +3216,16 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) stmmac_prepare_tx_desc(priv, first, 1, nopaged_len, csum_insertion, priv->mode, 1, last_segment, skb->len); - - /* The own bit must be the latest setting done when prepare the - * descriptor and then barrier is needed to make sure that - * all is coherent before granting the DMA engine. - */ - wmb(); + } else { + stmmac_set_tx_owner(priv, first); } + /* The own bit must be the latest setting done when prepare the + * descriptor and then barrier is needed to make sure that + * all is coherent before granting the DMA engine. + */ + wmb(); + netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len); stmmac_enable_dma_transmission(priv, priv->ioaddr); -- 2.17.0