mirror of https://lore.kernel.org/lkml/
 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>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH net 18/19] net/sonic: Fix CAM initialization
Date: Mon, 20 Jan 2020 09:56:09 +1100	[thread overview]
Message-ID: <ef679c41a39f64a495cc7d7953e5e995825ab034.1579474569.git.fthain@telegraphics.com.au> (raw)
In-Reply-To: <cover.1579474569.git.fthain@telegraphics.com.au>

Section 4.3.1 of the datasheet says,

    This bit [TXP] must not be set if a Load CAM operation is in
    progress (LCAM is set). The SONIC will lock up if both bits are
    set simultaneously.

Testing has shown that the driver sometimes attempts to set LCAM
while TXP is set. Avoid this by waiting for command completion
before and after giving the LCAM command.

After issuing the Load CAM command, poll for !SONIC_CR_LCAM rather than
SONIC_INT_LCD, because the SONIC_CR_TXP bit can't be used until
!SONIC_CR_LCAM.

When in reset mode, take the opportunity to reset the CAM Enable
register.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
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, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c
index 01055a53517d..1a569df63fde 100644
--- a/drivers/net/ethernet/natsemi/sonic.c
+++ b/drivers/net/ethernet/natsemi/sonic.c
@@ -661,6 +661,8 @@ static void sonic_multicast_list(struct net_device *dev)
 		    (netdev_mc_count(dev) > 15)) {
 			rcr |= SONIC_RCR_AMC;
 		} else {
+			unsigned long flags;
+
 			netif_dbg(lp, ifup, dev, "%s: mc_count %d\n", __func__,
 				  netdev_mc_count(dev));
 			sonic_set_cam_enable(dev, 1);  /* always enable our own address */
@@ -674,9 +676,14 @@ static void sonic_multicast_list(struct net_device *dev)
 				i++;
 			}
 			SONIC_WRITE(SONIC_CDC, 16);
-			/* issue Load CAM command */
 			SONIC_WRITE(SONIC_CDP, lp->cda_laddr & 0xffff);
+
+			/* LCAM and TXP commands can't be used simultaneously */
+			local_irq_save(flags);
+			sonic_quiesce(dev, SONIC_CR_TXP);
 			SONIC_WRITE(SONIC_CMD, SONIC_CR_LCAM);
+			sonic_quiesce(dev, SONIC_CR_LCAM);
+			local_irq_restore(flags);
 		}
 	}
 
@@ -702,6 +709,9 @@ static int sonic_init(struct net_device *dev)
 	SONIC_WRITE(SONIC_ISR, 0x7fff);
 	SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
 
+	/* While in reset mode, clear CAM Enable register */
+	SONIC_WRITE(SONIC_CE, 0);
+
 	/*
 	 * clear software reset flag, disable receiver, clear and
 	 * enable interrupts, then completely initialize the SONIC
@@ -812,14 +822,7 @@ static int sonic_init(struct net_device *dev)
 	 * load the CAM
 	 */
 	SONIC_WRITE(SONIC_CMD, SONIC_CR_LCAM);
-
-	i = 0;
-	while (i++ < 100) {
-		if (SONIC_READ(SONIC_ISR) & SONIC_INT_LCD)
-			break;
-	}
-	netif_dbg(lp, ifup, dev, "%s: CMD=%x, ISR=%x, i=%d\n", __func__,
-		  SONIC_READ(SONIC_CMD), SONIC_READ(SONIC_ISR), i);
+	sonic_quiesce(dev, SONIC_CR_LCAM);
 
 	/*
 	 * enable receiver, disable loopback
-- 
2.24.1


  parent reply	other threads:[~2020-01-19 23:17 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-19 22:56 [PATCH net 00/19] Fixes for SONIC ethernet driver Finn Thain
2020-01-19 22:56 ` [PATCH net 04/19] net/sonic: Add mutual exclusion for accessing shared state Finn Thain
2020-01-20  8:29   ` Geert Uytterhoeven
2020-01-20 22:23     ` Finn Thain
2020-01-19 22:56 ` [PATCH net 05/19] net/sonic: Remove redundant netif_start_queue() call Finn Thain
2020-01-19 22:56 ` [PATCH net 02/19] net/sonic: Remove redundant next_tx variable Finn Thain
2020-01-19 22:56 ` [PATCH net 12/19] net/sonic: Fix receive buffer handling Finn Thain
2020-01-19 22:56 ` [PATCH net 15/19] net/sonic: Fix receive buffer replenishment Finn Thain
2020-01-19 22:56 ` [PATCH net 03/19] net/sonic: Refactor duplicated code Finn Thain
2020-01-19 22:56 ` [PATCH net 13/19] net/sonic: Avoid needless receive descriptor EOL flag updates Finn Thain
2020-01-19 22:56 ` [PATCH net 06/19] net/macsonic: Remove interrupt handler wrapper Finn Thain
2020-01-19 22:56 ` [PATCH net 08/19] net/sonic: Use MMIO accessors Finn Thain
2020-01-19 22:56 ` [PATCH net 10/19] net/sonic: Start packet transmission immediately Finn Thain
2020-01-19 22:56 ` [PATCH net 01/19] net/sonic: Remove obsolete comment Finn Thain
2020-01-19 22:56 ` [PATCH net 17/19] net/sonic: Fix command register usage Finn Thain
2020-01-19 22:56 ` [PATCH net 16/19] net/sonic: Quiesce SONIC before re-initializing descriptor memory Finn Thain
2020-01-19 22:56 ` [PATCH net 11/19] net/sonic: Fix interface error stats collection Finn Thain
2020-01-19 22:56 ` [PATCH net 09/19] net/sonic: Remove explicit memory barriers Finn Thain
2020-01-19 22:56 ` [PATCH net 19/19] net/sonic: Prevent tx watchdog timeout Finn Thain
2020-01-19 22:56 ` [PATCH net 14/19] net/sonic: Improve receive descriptor status flag check Finn Thain
2020-01-19 22:56 ` [PATCH net 07/19] net/sonic: Clear interrupt flags immediately Finn Thain
2020-01-19 22:56 ` Finn Thain [this message]
2020-01-20 10:06 ` [PATCH net 00/19] Fixes for SONIC ethernet driver David Miller
2020-01-20 23:28   ` 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=ef679c41a39f64a495cc7d7953e5e995825ab034.1579474569.git.fthain@telegraphics.com.au \
    --to=fthain@telegraphics.com.au \
    --cc=chris@zankel.net \
    --cc=davem@davemloft.net \
    --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

all inboxes | Powered by JetHome®