Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp3096481pxp; Tue, 8 Mar 2022 07:40:00 -0800 (PST) X-Google-Smtp-Source: ABdhPJzyf7XzoxU9ENahiW2QYG15jmylA+wH5qKPzYH3IApiAUbRZOvOKQIxetSlMI2d8DQQnNJd X-Received: by 2002:a17:906:3144:b0:6ce:de5d:5e3b with SMTP id e4-20020a170906314400b006cede5d5e3bmr13905019eje.689.1646753999737; Tue, 08 Mar 2022 07:39:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646753999; cv=none; d=google.com; s=arc-20160816; b=mBCO/Fk8p4S68vtW80JY2T8zKFQRksXy3BgGHNfPvMn4QEl38k+h6636RRYLYfWO+D HIGjIJNtw+ydgudtms718nZqu6I78B/zHL+10VzdVjSIHF1PTBrLsHqxPPeFEc9X1pkI 5Tb8un4MlR8Ei+jAIk5RExtBbDwmOlWwycN94UCOartE/sK9tClonL6VUQ+Z+UOpah4w 836DN+wTXU6Qzff9Ksfb8KUFJZ8/pu0ljz2eNHJNCkqHYeQ62XBfRy+NUtGyt9pzDSYW 03KgVAEbHyXxqHdjYWXnkQCx9arFnsFwuKRyaUQ2gaqp0NWfl7vY63LzrhixEv9whV7U WDlw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=AcmuKtistEUnkuhXK3xKOqGhKGrpX5+W2tK3nL9OybE=; b=iW7MizO1OycMpSkvZLR2nzjrdodh1+y62X8UPsfmZs7BSk69gsmNkM58rlQnhQLdpO Ki4k4+9X7vctkq51R9u9vgJ5lt9uwoe9R1L2w5WA9FFjjXmnJBst9GGEjohDQvmpnRP1 p+om/82TK1eB1Iy7RRNpNp5NLMh+/LWepRMjW8LRj6dD7kw8ZNnv4akSIm19q4IE9th9 qoEDqdB0ul08LXV++zgBhkH2Z2SnsweONyOQVQ6HC+Rb6vaLDQwMyz6c+GNcujcrUYaS p82PEu5rVbDWO75vwvQsvRrI4JS0j8HZmb6o9LBfYy2CfEF7KgQVIN0HjEKb2HpSd7nT Y2HA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=g7sYPbL+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t9-20020a1709061be900b006baf07c1bedsi9636281ejg.749.2022.03.08.07.39.35; Tue, 08 Mar 2022 07:39:59 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=g7sYPbL+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237140AbiCGKQd (ORCPT + 99 others); Mon, 7 Mar 2022 05:16:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40584 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240320AbiCGKA4 (ORCPT ); Mon, 7 Mar 2022 05:00:56 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A88F57EA2B; Mon, 7 Mar 2022 01:47:22 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 62A48B810AA; Mon, 7 Mar 2022 09:47:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BFBEEC340E9; Mon, 7 Mar 2022 09:47:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1646646440; bh=x8ZYtRRcL48dYlDHV1QRsqoLWP2M1e17vPSx1/fvbqQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=g7sYPbL+5DWHgSZd/R0Rt3bWZ40k4Q/wK+qHESG3oHpoul5JgqFVZ1vnYW7G5Vydk cgAl6m13uN502pQspRjoF1KQCoxk7ZQ052F9AjZTMF71F6o1iV0sxpt6jHQfT9DECy lsatPoiT1pDB5feyTOoUGdvGIA+HDa1bmct6Rw2k= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lars Persson , Vincent Whitchurch , "David S. Miller" , Sasha Levin Subject: [PATCH 5.15 217/262] net: stmmac: only enable DMA interrupts when ready Date: Mon, 7 Mar 2022 10:19:21 +0100 Message-Id: <20220307091709.110171415@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220307091702.378509770@linuxfoundation.org> References: <20220307091702.378509770@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vincent Whitchurch [ Upstream commit 087a7b944c5db409f7c1a68bf4896c56ba54eaff ] In this driver's ->ndo_open() callback, it enables DMA interrupts, starts the DMA channels, then requests interrupts with request_irq(), and then finally enables napi. If RX DMA interrupts are received before napi is enabled, no processing is done because napi_schedule_prep() will return false. If the network has a lot of broadcast/multicast traffic, then the RX ring could fill up completely before napi is enabled. When this happens, no further RX interrupts will be delivered, and the driver will fail to receive any packets. Fix this by only enabling DMA interrupts after all other initialization is complete. Fixes: 523f11b5d4fd72efb ("net: stmmac: move hardware setup for stmmac_open to new function") Reported-by: Lars Persson Signed-off-by: Vincent Whitchurch Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 4595282a9790..73f66170829a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -2268,6 +2268,23 @@ static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan) stmmac_stop_tx(priv, priv->ioaddr, chan); } +static void stmmac_enable_all_dma_irq(struct stmmac_priv *priv) +{ + u32 rx_channels_count = priv->plat->rx_queues_to_use; + u32 tx_channels_count = priv->plat->tx_queues_to_use; + u32 dma_csr_ch = max(rx_channels_count, tx_channels_count); + u32 chan; + + for (chan = 0; chan < dma_csr_ch; chan++) { + struct stmmac_channel *ch = &priv->channel[chan]; + unsigned long flags; + + spin_lock_irqsave(&ch->lock, flags); + stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 1); + spin_unlock_irqrestore(&ch->lock, flags); + } +} + /** * stmmac_start_all_dma - start all RX and TX DMA channels * @priv: driver private structure @@ -2903,8 +2920,10 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv) stmmac_axi(priv, priv->ioaddr, priv->plat->axi); /* DMA CSR Channel configuration */ - for (chan = 0; chan < dma_csr_ch; chan++) + for (chan = 0; chan < dma_csr_ch; chan++) { stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 1); + } /* DMA RX Channel Configuration */ for (chan = 0; chan < rx_channels_count; chan++) { @@ -3756,6 +3775,7 @@ static int stmmac_open(struct net_device *dev) stmmac_enable_all_queues(priv); netif_tx_start_all_queues(priv->dev); + stmmac_enable_all_dma_irq(priv); return 0; @@ -6514,8 +6534,10 @@ int stmmac_xdp_open(struct net_device *dev) } /* DMA CSR Channel configuration */ - for (chan = 0; chan < dma_csr_ch; chan++) + for (chan = 0; chan < dma_csr_ch; chan++) { stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 1); + } /* Adjust Split header */ sph_en = (priv->hw->rx_csum > 0) && priv->sph; @@ -6575,6 +6597,7 @@ int stmmac_xdp_open(struct net_device *dev) stmmac_enable_all_queues(priv); netif_carrier_on(dev); netif_tx_start_all_queues(dev); + stmmac_enable_all_dma_irq(priv); return 0; @@ -7453,6 +7476,7 @@ int stmmac_resume(struct device *dev) stmmac_restore_hw_vlan_rx_fltr(priv, ndev, priv->hw); stmmac_enable_all_queues(priv); + stmmac_enable_all_dma_irq(priv); mutex_unlock(&priv->lock); rtnl_unlock(); -- 2.34.1