Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp445473ybl; Tue, 28 Jan 2020 06:07:33 -0800 (PST) X-Google-Smtp-Source: APXvYqyVv6dwSdx+Le9D/MyHVX6J1QO0Zt1WVWcRX8tZR9+ca2yWb2NNBCl7VGoj1uiw5DXiihhY X-Received: by 2002:aca:4587:: with SMTP id s129mr2796351oia.124.1580220452993; Tue, 28 Jan 2020 06:07:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580220452; cv=none; d=google.com; s=arc-20160816; b=AoLPKEGsOhdW5pSgYgTbkMpsszGkxfi4fjP1kj7L/aLRhyOLN4YR2A0rc+TyVQkZU5 gF2tY4g27TKj8nHn5fEJmVt6rd2yLqQWsBHv38NKKHMTSLROrsz2YfliX4dOpqj3NP68 adJFuyT48qOtTWJR1uANXWMFx2FPLJZimGa12d+6jNhr0/br/yAbw0eHJ+3JvlLBOUR/ Rx6VtVrG/jcRcVFGUSQcmlyO6pmkpUELohVV/yNrkSF3ACUzqBd4CrJ3Hg9Rs3DSro1O ViVjIrwAyvlscFKBIrksvAUyyiW6E3lWl2mffV1VJnK5zG5p4RTcCutQIrIgpNB1av2f Ow7A== 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=4mypUWND8LSPakGKMYVSw35xMAsr/6OsRCu9hoLls2w=; b=M4oF7BPZ/XCgOqDyprlxL//fL0CcCSniWAwBE/PdzXxconhrJ1z0vBzm0owtLlKMdv Wz0bpm24R6QdRbwZK4uwsgTtenWJzDhVGoj+mFIENGl9m5jbT7TPcmKe3GueEh1m452I rzpnWncL1pnn3gIvSog4Zxsp9e1JpN3yGv3Mrxy0q6cWOqFJYhNETx1HBTCzbKMA4L9i rH10aNzwEAwXumamtYmP9OlAJTj/uBnAaqqYS3X9lyzLJw7e6W9yNVz7CrBzXkIrfEP6 RltbxGX3iprQKI6JrpPdrxIaan2CpyMbwwGJIAYN+wapcYgH+anrL7xs9YReK97wfbCi QrQg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=oVDZUPXr; 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 i25si5127328oii.259.2020.01.28.06.07.07; Tue, 28 Jan 2020 06:07:32 -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=oVDZUPXr; 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 S1728144AbgA1OEn (ORCPT + 99 others); Tue, 28 Jan 2020 09:04:43 -0500 Received: from mail.kernel.org ([198.145.29.99]:51878 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728123AbgA1OEi (ORCPT ); Tue, 28 Jan 2020 09:04:38 -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 C7AD324683; Tue, 28 Jan 2020 14:04:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580220277; bh=qerVG9v8HUTbWt56y/67aCa0lMWyxQHO+4AeGmHfkEI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oVDZUPXr036N/3lRn1MZe7amWGv+ZpNaWthsepK9V4oK8+MuNkEpXvXMq3WaR3+Co FURp4y20O8RJ9A+H6jq1B7HtY0Sh8v0cC9PIKXiW3I/7+J7J/XkFkFNtT2jwDJS9lH 1r85HNaE1bH5T88e39NShe/LhsrMawnlO4hb99Eo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Stan Johnson , Finn Thain , "David S. Miller" Subject: [PATCH 5.4 088/104] net/sonic: Clear interrupt flags immediately Date: Tue, 28 Jan 2020 15:00:49 +0100 Message-Id: <20200128135829.287150225@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200128135817.238524998@linuxfoundation.org> References: <20200128135817.238524998@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: Finn Thain commit 5fedabf5a70be26b19d7520f09f12a62274317c6 upstream. The chip can change a packet's descriptor status flags at any time. However, an active interrupt flag gets cleared rather late. This allows a race condition that could theoretically lose an interrupt. Fix this by clearing asserted interrupt flags immediately. Fixes: efcce839360f ("[PATCH] macsonic/jazzsonic network drivers update") Tested-by: Stan Johnson Signed-off-by: Finn Thain Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/natsemi/sonic.c | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) --- a/drivers/net/ethernet/natsemi/sonic.c +++ b/drivers/net/ethernet/natsemi/sonic.c @@ -304,10 +304,11 @@ static irqreturn_t sonic_interrupt(int i } do { + SONIC_WRITE(SONIC_ISR, status); /* clear the interrupt(s) */ + if (status & SONIC_INT_PKTRX) { netif_dbg(lp, intr, dev, "%s: packet rx\n", __func__); sonic_rx(dev); /* got packet(s) */ - SONIC_WRITE(SONIC_ISR, SONIC_INT_PKTRX); /* clear the interrupt */ } if (status & SONIC_INT_TXDN) { @@ -362,7 +363,6 @@ static irqreturn_t sonic_interrupt(int i if (freed_some || lp->tx_skb[entry] == NULL) netif_wake_queue(dev); /* The ring is no longer full */ lp->cur_tx = entry; - SONIC_WRITE(SONIC_ISR, SONIC_INT_TXDN); /* clear the interrupt */ } /* @@ -372,42 +372,31 @@ static irqreturn_t sonic_interrupt(int i netif_dbg(lp, rx_err, dev, "%s: rx fifo overrun\n", __func__); lp->stats.rx_fifo_errors++; - SONIC_WRITE(SONIC_ISR, SONIC_INT_RFO); /* clear the interrupt */ } if (status & SONIC_INT_RDE) { netif_dbg(lp, rx_err, dev, "%s: rx descriptors exhausted\n", __func__); lp->stats.rx_dropped++; - SONIC_WRITE(SONIC_ISR, SONIC_INT_RDE); /* clear the interrupt */ } if (status & SONIC_INT_RBAE) { netif_dbg(lp, rx_err, dev, "%s: rx buffer area exceeded\n", __func__); lp->stats.rx_dropped++; - SONIC_WRITE(SONIC_ISR, SONIC_INT_RBAE); /* clear the interrupt */ } /* counter overruns; all counters are 16bit wide */ - if (status & SONIC_INT_FAE) { + if (status & SONIC_INT_FAE) lp->stats.rx_frame_errors += 65536; - SONIC_WRITE(SONIC_ISR, SONIC_INT_FAE); /* clear the interrupt */ - } - if (status & SONIC_INT_CRC) { + if (status & SONIC_INT_CRC) lp->stats.rx_crc_errors += 65536; - SONIC_WRITE(SONIC_ISR, SONIC_INT_CRC); /* clear the interrupt */ - } - if (status & SONIC_INT_MP) { + if (status & SONIC_INT_MP) lp->stats.rx_missed_errors += 65536; - SONIC_WRITE(SONIC_ISR, SONIC_INT_MP); /* clear the interrupt */ - } /* transmit error */ - if (status & SONIC_INT_TXER) { + if (status & SONIC_INT_TXER) if (SONIC_READ(SONIC_TCR) & SONIC_TCR_FU) netif_dbg(lp, tx_err, dev, "%s: tx fifo underrun\n", __func__); - SONIC_WRITE(SONIC_ISR, SONIC_INT_TXER); /* clear the interrupt */ - } /* bus retry */ if (status & SONIC_INT_BR) { @@ -416,13 +405,8 @@ static irqreturn_t sonic_interrupt(int i /* ... to help debug DMA problems causing endless interrupts. */ /* Bounce the eth interface to turn on the interrupt again. */ SONIC_WRITE(SONIC_IMR, 0); - SONIC_WRITE(SONIC_ISR, SONIC_INT_BR); /* clear the interrupt */ } - /* load CAM done */ - if (status & SONIC_INT_LCD) - SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the interrupt */ - status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; } while (status);