Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1613574ybv; Fri, 21 Feb 2020 00:17:56 -0800 (PST) X-Google-Smtp-Source: APXvYqyabz9osE47fo0ahGj9tHbEwDkNpHliDjc2bznqAsGnq5JrfhG0pp5DcmEZPh0QCldqO1CB X-Received: by 2002:aca:ad11:: with SMTP id w17mr1011880oie.85.1582273076596; Fri, 21 Feb 2020 00:17:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582273076; cv=none; d=google.com; s=arc-20160816; b=QAYnxknzNMzmEogrsHapKg3oQ/sQKPdawWm892QCwmzpAHwcGE8qUszIVdRQDUcOBH J8XM/8Xf++SWAx9pCAVX0DE12F83pawCqtJxkEn348IZiaHYrNAbDfWs3eUZH0Ux82j9 OajvOJfK+HPagC+7hbCZSB87pVUcjYjciPp7zgZZscajmsuE3438Jf9LbMnL1bJVBhMv cMMA51hH12k3/FzRKXmvcM6HwyOJxPmrHs7bW5BOdsxKlcu4Jgy9jo/lEXv+zjeCQ6Gp zAw5IkgiF2hwEbUW8dxOy5qwHw15pRvUIPbQTVmA4IkdwXS8QoaVoZ9j/jIk/9oDIvod aCRw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=COxKrp7QQyatiqzHhvMrO5Ct4gULyhcsZ/ZgPcBFti0=; b=Ia8OAL0icJ6S8DJGKKz4hq5fBe0gDhiJWVw0IJftsVZdJKS6ypJpC45xegS3KaBKcq UipH08DU5JV4f5SGGxyVQSosfJUWQm0xhM9hpNbQFlxGsFvKmKGBQdNFy9lCvQZHCR3g 4sxyZdLKh9NrbxPOGBSrDPJtZDfmoSHQuA5sc/F8JtXIgjxzfAsS6ymnTAokjhtsjrGL ljAdCw+nTbK4CG25QwQUPFrQaKbEAjyMNCJEYlQ6tGDSVdQECb109KKk3X+oIzKR8iHV LwSLUzxTg50lUuWKldVFAfSXjSVY5iwm/EQMMOVAyLM6Y4BXLB1nkbEQydAOsk0/cXNV LBNw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=owNifkX1; 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 f62si470376oib.131.2020.02.21.00.17.44; Fri, 21 Feb 2020 00:17:56 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=owNifkX1; 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 S2387614AbgBUIRC (ORCPT + 99 others); Fri, 21 Feb 2020 03:17:02 -0500 Received: from mail.kernel.org ([198.145.29.99]:54292 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387605AbgBUIRB (ORCPT ); Fri, 21 Feb 2020 03:17:01 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 13AD124685; Fri, 21 Feb 2020 08:16:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582273020; bh=HFXyLgZOluO4xGPVuMxvzsLOr5aDlIyiQMNmxVT5tgk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=owNifkX1Siaxo7kxFBZQ7hoMalOjceJWS1CzJ1qsWDh7MXg2A2Tzt9mVoyevncZcR sUWh8qEYvKFx4wHl9E1c15kCIWGxU4mB5AuNAvIfcXhOr08lNeHfkScyTQp96g2xaA M3N9dqCXI58nMaXv0x4E4kvZD1NiHqrnYsmGX5XQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vladimir Oltean , Richard Cochran , "David S. Miller" , Sasha Levin Subject: [PATCH 4.19 018/191] gianfar: Fix TX timestamping with a stacked DSA driver Date: Fri, 21 Feb 2020 08:39:51 +0100 Message-Id: <20200221072253.460703326@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200221072250.732482588@linuxfoundation.org> References: <20200221072250.732482588@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vladimir Oltean [ Upstream commit c26a2c2ddc0115eb088873f5c309cf46b982f522 ] The driver wrongly assumes that it is the only entity that can set the SKBTX_IN_PROGRESS bit of the current skb. Therefore, in the gfar_clean_tx_ring function, where the TX timestamp is collected if necessary, the aforementioned bit is used to discriminate whether or not the TX timestamp should be delivered to the socket's error queue. But a stacked driver such as a DSA switch can also set the SKBTX_IN_PROGRESS bit, which is actually exactly what it should do in order to denote that the hardware timestamping process is undergoing. Therefore, gianfar would misinterpret the "in progress" bit as being its own, and deliver a second skb clone in the socket's error queue, completely throwing off a PTP process which is not expecting to receive it, _even though_ TX timestamping is not enabled for gianfar. There have been discussions [0] as to whether non-MAC drivers need or not to set SKBTX_IN_PROGRESS at all (whose purpose is to avoid sending 2 timestamps, a sw and a hw one, to applications which only expect one). But as of this patch, there are at least 2 PTP drivers that would break in conjunction with gianfar: the sja1105 DSA switch and the felix switch, by way of its ocelot core driver. So regardless of that conclusion, fix the gianfar driver to not do stuff based on flags set by others and not intended for it. [0]: https://www.spinics.net/lists/netdev/msg619699.html Fixes: f0ee7acfcdd4 ("gianfar: Add hardware TX timestamping support") Signed-off-by: Vladimir Oltean Acked-by: Richard Cochran Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/freescale/gianfar.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index c97c4edfa31bc..cf2d1e846a692 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c @@ -2685,13 +2685,17 @@ static void gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue) skb_dirtytx = tx_queue->skb_dirtytx; while ((skb = tx_queue->tx_skbuff[skb_dirtytx])) { + bool do_tstamp; + + do_tstamp = (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && + priv->hwts_tx_en; frags = skb_shinfo(skb)->nr_frags; /* When time stamping, one additional TxBD must be freed. * Also, we need to dma_unmap_single() the TxPAL. */ - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) + if (unlikely(do_tstamp)) nr_txbds = frags + 2; else nr_txbds = frags + 1; @@ -2705,7 +2709,7 @@ static void gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue) (lstatus & BD_LENGTH_MASK)) break; - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) { + if (unlikely(do_tstamp)) { next = next_txbd(bdp, base, tx_ring_size); buflen = be16_to_cpu(next->length) + GMAC_FCB_LEN + GMAC_TXPAL_LEN; @@ -2715,7 +2719,7 @@ static void gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue) dma_unmap_single(priv->dev, be32_to_cpu(bdp->bufPtr), buflen, DMA_TO_DEVICE); - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) { + if (unlikely(do_tstamp)) { struct skb_shared_hwtstamps shhwtstamps; u64 *ns = (u64 *)(((uintptr_t)skb->data + 0x10) & ~0x7UL); -- 2.20.1