linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Finn Thain <fthain@telegraphics.com.au>
To: "David S. Miller" <davem@davemloft.net>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
	Chris Zankel <chris@zankel.net>,
	Laurent Vivier <laurent@vivier.eu>,
	Geert Uytterhoeven <geert@linux-m68k.org>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH net v2 06/12] net/sonic: Avoid needless receive descriptor EOL flag updates
Date: Wed, 22 Jan 2020 08:22:08 +1100	[thread overview]
Message-ID: <960febac5aedee833195d0270ca1cde5d81a5d43.1579641728.git.fthain@telegraphics.com.au> (raw)
In-Reply-To: <cover.1579641728.git.fthain@telegraphics.com.au>

The while loop in sonic_rx() traverses the rx descriptor ring. It stops
when it reaches a descriptor that the SONIC has not used. Each iteration
advances the EOL flag so the SONIC can keep using more descriptors.
Therefore, the while loop has no definite termination condition.

The algorithm described in the National Semiconductor literature is quite
different. It consumes descriptors up to the one with its EOL flag set
(which will also have its "in use" flag set). All freed descriptors are
then returned to the ring at once, by adjusting the EOL flags (and link
pointers).

Adopt the algorithm from datasheet as it's simpler, terminates quickly
and avoids a lot of pointless descriptor EOL flag changes.

Fixes: efcce839360f ("[PATCH] macsonic/jazzsonic network drivers update")
Tested-by: Stan Johnson <userm57@yahoo.com>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
 drivers/net/ethernet/natsemi/sonic.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c
index 3387f7bc1a80..431a6e46c08c 100644
--- a/drivers/net/ethernet/natsemi/sonic.c
+++ b/drivers/net/ethernet/natsemi/sonic.c
@@ -432,6 +432,7 @@ 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;
 
 	while (sonic_rda_get(dev, entry, SONIC_RD_IN_USE) == 0) {
 		struct sk_buff *used_skb;
@@ -512,13 +513,21 @@ static void sonic_rx(struct net_device *dev)
 		/*
 		 * give back the descriptor
 		 */
-		sonic_rda_put(dev, entry, SONIC_RD_LINK,
-			sonic_rda_get(dev, entry, SONIC_RD_LINK) | SONIC_EOL);
 		sonic_rda_put(dev, entry, SONIC_RD_IN_USE, 1);
-		sonic_rda_put(dev, lp->eol_rx, SONIC_RD_LINK,
-			sonic_rda_get(dev, lp->eol_rx, SONIC_RD_LINK) & ~SONIC_EOL);
-		lp->eol_rx = entry;
-		lp->cur_rx = entry = (entry + 1) & SONIC_RDS_MASK;
+
+		prev_entry = entry;
+		entry = (entry + 1) & SONIC_RDS_MASK;
+	}
+
+	lp->cur_rx = entry;
+
+	if (prev_entry != lp->eol_rx) {
+		/* Advance the EOL flag to put descriptors back into service */
+		sonic_rda_put(dev, prev_entry, SONIC_RD_LINK, SONIC_EOL |
+			      sonic_rda_get(dev, prev_entry, SONIC_RD_LINK));
+		sonic_rda_put(dev, lp->eol_rx, SONIC_RD_LINK, ~SONIC_EOL &
+			      sonic_rda_get(dev, lp->eol_rx, SONIC_RD_LINK));
+		lp->eol_rx = prev_entry;
 	}
 	/*
 	 * If any worth-while packets have been received, netif_rx()
-- 
2.24.1


  reply	other threads:[~2020-01-21 22:11 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-21 21:22 [PATCH net v2 00/12] Fixes for SONIC ethernet driver Finn Thain
2020-01-21 21:22 ` Finn Thain [this message]
2020-01-21 21:22 ` [PATCH net v2 08/12] net/sonic: Fix receive buffer replenishment Finn Thain
2020-01-21 21:22 ` [PATCH net v2 04/12] net/sonic: Fix interface error stats collection Finn Thain
2020-01-21 21:22 ` [PATCH net v2 10/12] net/sonic: Fix command register usage Finn Thain
2020-01-21 21:22 ` [PATCH net v2 12/12] net/sonic: Prevent tx watchdog timeout Finn Thain
2020-01-21 21:22 ` [PATCH net v2 02/12] net/sonic: Clear interrupt flags immediately Finn Thain
2020-01-21 21:22 ` [PATCH net v2 07/12] net/sonic: Improve receive descriptor status flag check Finn Thain
2020-01-21 21:22 ` [PATCH net v2 11/12] net/sonic: Fix CAM initialization Finn Thain
2020-01-21 21:22 ` [PATCH net v2 09/12] net/sonic: Quiesce SONIC before re-initializing descriptor memory Finn Thain
2020-01-21 21:22 ` [PATCH net v2 05/12] net/sonic: Fix receive buffer handling Finn Thain
2020-01-21 22:23   ` Stephen Hemminger
2020-01-21 23:53     ` Finn Thain
2020-01-21 21:22 ` [PATCH net v2 03/12] net/sonic: Use MMIO accessors Finn Thain
2020-01-21 21:22 ` [PATCH net v2 01/12] net/sonic: Add mutual exclusion for accessing shared state Finn Thain
2020-01-21 22:19   ` Eric Dumazet
2020-01-21 23:33     ` Finn Thain
2020-01-21 23:52       ` Eric Dumazet
2020-01-22  0:40         ` Finn Thain

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=960febac5aedee833195d0270ca1cde5d81a5d43.1579641728.git.fthain@telegraphics.com.au \
    --to=fthain@telegraphics.com.au \
    --cc=chris@zankel.net \
    --cc=davem@davemloft.net \
    --cc=geert@linux-m68k.org \
    --cc=laurent@vivier.eu \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=tsbogend@alpha.franken.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).