Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp5307973ybl; Wed, 22 Jan 2020 14:26:11 -0800 (PST) X-Google-Smtp-Source: APXvYqzJOhvQvPwWgOX8TdP4ijm8cQD8GR8jyGNP53A6SeNYdmb5dcL3ojvFltF0GASxpJDW/TfP X-Received: by 2002:a54:4501:: with SMTP id l1mr8025777oil.101.1579731971475; Wed, 22 Jan 2020 14:26:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579731971; cv=none; d=google.com; s=arc-20160816; b=S5VeVw0zA7LSvSs2Q01j8g8BRunq/LfTdDnw6Rg3SUytOojWqR+0T5HC8AisA0rTVk F+O+NAZKDwIj4R92ByiXBj9PRyWRAzMtDPHSjm6NukLYa4ibvGiU2vc5hbIT1endFCzg cuJtPm0jGUatGsDRIOxPoXthOZiXHYDTjhl7zP7zQbutKDL3gSUQidWSqJfYoNRlvPTl cFYRkr+rI7zyegh1p17S0gtHDYpdK5RjTamBB/8iz5Bij5zB+JQixKk0owwe5GUx1FR/ G0Qisqt+wxvlaEXcS8wbuUwgWpxHSKVOITdyB5NAevAvt3a0G5uqBsVIezHSornF7G+h AOPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:subject:from:references:in-reply-to :message-id:cc:to; bh=4+SVhW9IkW/N0TbPmagTZiiQBCVpB+gkBiQOXA7hy3g=; b=u6COvl4ypb6okKCu1Do8H1PrUkwTyzozwxEkH2k/Ug3lDiltPPaKTcIL/HzuCuy0+W xIiUHb5GHwAk6izOZspo8FVcVFxLPiqojOd8l6t73cFoaQkos4my5Smx1fqyyJ5qOOKH dFPKFCE0Nlyonp/5UGagZNmK+HwvVlo7wvQhxrUMeuzPjuwOV7almRDP0qceitIGBJ3o eHrCYCO9TQB+AvWDqNECeo9GUkfJsQaOtcmXrHdy+g4CS6ekqwM3jCBe1fvlqYFTTh80 NSefj8w1lHgUHQg0BKZup8PnrlCZ5hZi1GfsuJj23JH1qKhJtstXBfhbw8UG2HLe5w8l lmbg== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h64si21267651oif.215.2020.01.22.14.25.54; Wed, 22 Jan 2020 14:26:11 -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; 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 S1728900AbgAVWYD (ORCPT + 99 others); Wed, 22 Jan 2020 17:24:03 -0500 Received: from kvm5.telegraphics.com.au ([98.124.60.144]:47890 "EHLO kvm5.telegraphics.com.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726605AbgAVWYC (ORCPT ); Wed, 22 Jan 2020 17:24:02 -0500 Received: by kvm5.telegraphics.com.au (Postfix, from userid 502) id AB4E5299BD; Wed, 22 Jan 2020 17:23:59 -0500 (EST) To: "David S. Miller" Cc: Thomas Bogendoerfer , Chris Zankel , Laurent Vivier , Geert Uytterhoeven , Eric Dumazet , Stephen Hemminger , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Message-Id: <4edeb98033446fcb3e4966b0b856f1243235fa5f.1579730846.git.fthain@telegraphics.com.au> In-Reply-To: References: From: Finn Thain Subject: [PATCH net v3 07/12] net/sonic: Improve receive descriptor status flag check Date: Thu, 23 Jan 2020 09:07:26 +1100 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org After sonic_tx_timeout() calls sonic_init(), it can happen that sonic_rx() will subsequently encounter a receive descriptor with no flags set. Remove the comment that says that this can't happen. When giving a receive descriptor to the SONIC, clear the descriptor status field. That way, any rx descriptor with flags set can only be a newly received packet. Don't process a descriptor without the LPKT bit set. The buffer is still in use by the SONIC. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Tested-by: Stan Johnson Signed-off-by: Finn Thain --- Changed since v2: - Removed blank line. --- drivers/net/ethernet/natsemi/sonic.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c index 2cee702f49b8..9d2bddc4951b 100644 --- a/drivers/net/ethernet/natsemi/sonic.c +++ b/drivers/net/ethernet/natsemi/sonic.c @@ -434,7 +434,6 @@ static int index_from_addr(struct sonic_local *lp, dma_addr_t addr, static void sonic_rx(struct net_device *dev) { struct sonic_local *lp = netdev_priv(dev); - int status; int entry = lp->cur_rx; int prev_entry = lp->eol_rx; @@ -445,9 +444,10 @@ static void sonic_rx(struct net_device *dev) u16 bufadr_l; u16 bufadr_h; int pkt_len; + u16 status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); - status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); - if (status & SONIC_RCR_PRX) { + /* If the RD has LPKT set, the chip has finished with the RB */ + if ((status & SONIC_RCR_PRX) && (status & SONIC_RCR_LPKT)) { u32 addr = (sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_H) << 16) | sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L); @@ -495,10 +495,6 @@ static void sonic_rx(struct net_device *dev) bufadr_h = (unsigned long)new_laddr >> 16; sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l); sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h); - } else { - /* This should only happen, if we enable accepting broken packets. */ - } - if (status & SONIC_RCR_LPKT) { /* * this was the last packet out of the current receive buffer * give the buffer back to the SONIC @@ -511,12 +507,11 @@ static void sonic_rx(struct net_device *dev) __func__); SONIC_WRITE(SONIC_ISR, SONIC_INT_RBE); /* clear the flag */ } - } else - printk(KERN_ERR "%s: rx desc without RCR_LPKT. Shouldn't happen !?\n", - dev->name); + } /* * give back the descriptor */ + sonic_rda_put(dev, entry, SONIC_RD_STATUS, 0); sonic_rda_put(dev, entry, SONIC_RD_IN_USE, 1); prev_entry = entry; -- 2.24.1