netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Guo-Fu Tseng" <cooldavid@cooldavid.org>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: netdev@vger.kernel.org, Ethan <ethanhsiao@jmicron.com>,
	akeemting <akeem@jmicron.com>
Subject: [PATCH net-next-2.6 1/3] jme: Added half-duplex mode and IPv6 RSS fix
Date: Thu, 9 Oct 2008 05:56:01 +0800	[thread overview]
Message-ID: <20081008215205.M37765@cooldavid.org> (raw)
In-Reply-To: <48D27CDA.50501@pobox.com>

Dear Jeff, David:

This patch:

    1. Set bit 5 of GPREG1 to 1 to enable hardware workaround for half-duplex
       mode. Which the MAC processor generates CRS/COL by itself instead of
       receive it from PHY processor.

    2. Set bit 6 of GPREG1 to 1 to enable hardware workaround that masks the
       MAC processor working right while calculating IPv6 RSS in 10/100
       mode.

    3. Group the workaround codes all together.

    The patch is also available at:
    http://cooldavid.org/download/jme.net-next-2.6.20081009.1.patch

    Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org>

diff --git a/drivers/net/jme.c b/drivers/net/jme.c
index f292df5..635f616 100644
--- a/drivers/net/jme.c
+++ b/drivers/net/jme.c
@@ -190,7 +190,7 @@ jme_reset_mac_processor(struct jme_adapter *jme)
 	else
 		gpreg0 = GPREG0_DEFAULT;
 	jwrite32(jme, JME_GPREG0, gpreg0);
-	jwrite32(jme, JME_GPREG1, 0);
+	jwrite32(jme, JME_GPREG1, GPREG1_DEFAULT);
 }
 
 static inline void
@@ -365,7 +365,7 @@ static int
 jme_check_link(struct net_device *netdev, int testonly)
 {
 	struct jme_adapter *jme = netdev_priv(netdev);
-	u32 phylink, ghc, cnt = JME_SPDRSV_TIMEOUT, bmcr;
+	u32 phylink, ghc, cnt = JME_SPDRSV_TIMEOUT, bmcr, gpreg1;
 	char linkmsg[64];
 	int rc = 0;
 
@@ -437,37 +437,22 @@ jme_check_link(struct net_device *netdev, int testonly)
 		case PHY_LINK_SPEED_10M:
 			ghc |= GHC_SPEED_10M;
 			strcat(linkmsg, "10 Mbps, ");
-			if (is_buggy250(jme->pdev->device, jme->chiprev))
-				jme_set_phyfifoa(jme);
 			break;
 		case PHY_LINK_SPEED_100M:
 			ghc |= GHC_SPEED_100M;
 			strcat(linkmsg, "100 Mbps, ");
-			if (is_buggy250(jme->pdev->device, jme->chiprev))
-				jme_set_phyfifob(jme);
 			break;
 		case PHY_LINK_SPEED_1000M:
 			ghc |= GHC_SPEED_1000M;
 			strcat(linkmsg, "1000 Mbps, ");
-			if (is_buggy250(jme->pdev->device, jme->chiprev))
-				jme_set_phyfifoa(jme);
 			break;
 		default:
 			break;
 		}
-		ghc |= (phylink & PHY_LINK_DUPLEX) ? GHC_DPX : 0;
-
-		strcat(linkmsg, (phylink & PHY_LINK_DUPLEX) ?
-					"Full-Duplex, " :
-					"Half-Duplex, ");
-
-		if (phylink & PHY_LINK_MDI_STAT)
-			strcat(linkmsg, "MDI-X");
-		else
-			strcat(linkmsg, "MDI");
 
 		if (phylink & PHY_LINK_DUPLEX) {
 			jwrite32(jme, JME_TXMCS, TXMCS_DEFAULT);
+			ghc |= GHC_DPX;
 		} else {
 			jwrite32(jme, JME_TXMCS, TXMCS_DEFAULT |
 						TXMCS_BACKOFF |
@@ -478,6 +463,36 @@ jme_check_link(struct net_device *netdev, int testonly)
 				TXTRHD_TXREN |
 				((8 << TXTRHD_TXRL_SHIFT) & TXTRHD_TXRL));
 		}
+		strcat(linkmsg, (phylink & PHY_LINK_DUPLEX) ?
+					"Full-Duplex, " :
+					"Half-Duplex, ");
+
+		if (phylink & PHY_LINK_MDI_STAT)
+			strcat(linkmsg, "MDI-X");
+		else
+			strcat(linkmsg, "MDI");
+
+		gpreg1 = GPREG1_DEFAULT;
+		if (is_buggy250(jme->pdev->device, jme->chiprev)) {
+			if (!(phylink & PHY_LINK_DUPLEX))
+				gpreg1 |= GPREG1_HALFMODEPATCH;
+			switch (phylink & PHY_LINK_SPEED_MASK) {
+			case PHY_LINK_SPEED_10M:
+				jme_set_phyfifoa(jme);
+				gpreg1 |= GPREG1_RSSPATCH;
+				break;
+			case PHY_LINK_SPEED_100M:
+				jme_set_phyfifob(jme);
+				gpreg1 |= GPREG1_RSSPATCH;
+				break;
+			case PHY_LINK_SPEED_1000M:
+				jme_set_phyfifoa(jme);
+				break;
+			default:
+				break;
+			}
+		}
+		jwrite32(jme, JME_GPREG1, gpreg1);
 
 		jme->reg_ghc = ghc;
 		jwrite32(jme, JME_GHC, ghc);
diff --git a/drivers/net/jme.h b/drivers/net/jme.h
index b296884..9fdf20a 100644
--- a/drivers/net/jme.h
+++ b/drivers/net/jme.h
@@ -964,6 +964,36 @@ enum jme_gpreg0_vals {
 };
 
 /*
+ * General Purpose REG-1
+ * Note: All theses bits defined here are for
+ *       Chip mode revision 0x11 only
+ */
+enum jme_gpreg1_masks {
+	GPREG1_INTRDELAYUNIT	= 0x00000018,
+	GPREG1_INTRDELAYENABLE	= 0x00000007,
+};
+
+enum jme_gpreg1_vals {
+	GPREG1_RSSPATCH		= 0x00000040,
+	GPREG1_HALFMODEPATCH	= 0x00000020,
+
+	GPREG1_INTDLYUNIT_16NS	= 0x00000000,
+	GPREG1_INTDLYUNIT_256NS	= 0x00000008,
+	GPREG1_INTDLYUNIT_1US	= 0x00000010,
+	GPREG1_INTDLYUNIT_16US	= 0x00000018,
+
+	GPREG1_INTDLYEN_1U	= 0x00000001,
+	GPREG1_INTDLYEN_2U	= 0x00000002,
+	GPREG1_INTDLYEN_3U	= 0x00000003,
+	GPREG1_INTDLYEN_4U	= 0x00000004,
+	GPREG1_INTDLYEN_5U	= 0x00000005,
+	GPREG1_INTDLYEN_6U	= 0x00000006,
+	GPREG1_INTDLYEN_7U	= 0x00000007,
+
+	GPREG1_DEFAULT		= 0x00000000,
+};
+
+/*
  * Interrupt Status Bits
  */
 enum jme_interrupt_bits {


  reply	other threads:[~2008-10-08 21:56 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-15 17:00 [PATCH netdev-2.6] jme: JMicron Gigabit Ethernet Driver Guo-Fu Tseng
2008-09-16  2:47 ` Ethan
2008-09-18 16:07 ` Jeff Garzik
2008-10-08 21:56   ` Guo-Fu Tseng [this message]
2008-10-09  2:51     ` [PATCH net-next-2.6 1/3] jme: Added half-duplex mode and IPv6 RSS fix David Miller
2008-10-08 21:57   ` [PATCH net-next-2.6 2/3] jme: Faulty IRQ handle bug fix Guo-Fu Tseng
2008-10-09  2:51     ` David Miller
2008-10-08 21:58   ` [PATCH net-next-2.6 3/3] jme: Advances version number Guo-Fu Tseng
2008-10-09  2:51     ` David Miller
2008-12-03 10:41     ` [PATCH net-2.6 1/2] jme: GHC register control fix for new hardware Guo-Fu Tseng
2008-12-03 15:00       ` Jeff Garzik
2008-12-04  5:20         ` David Miller
2008-12-03 10:44     ` [PATCH net-2.6 2/2] jme: Remove 64 and 40 bit dma_mask Guo-Fu Tseng
2009-02-28  3:54     ` [PATCH net-next-2.6 1/4] jme: Modifies messages to display correct hardware version Guo-Fu Tseng
2009-02-28  3:57     ` [PATCH net-next-2.6 2/4] jme: Fix pci sync Guo-Fu Tseng
2009-02-28  3:58     ` [PATCH net-next-2.6 3/4] jme: Clear all modified GHC register flags Guo-Fu Tseng
2009-02-28  3:59     ` [PATCH net-next-2.6 4/4] jme: Adding {64,40}bits DMA mask back Guo-Fu Tseng
2009-03-02  8:39     ` [PATCH net-next] jme: Advance version number after previous changes Guo-Fu Tseng
2009-03-02  9:55       ` David Miller
2008-11-21  5:20 ` [PATCH netdev-2.6] jme: JMicron Gigabit Ethernet Driver Stephen Hemminger
2008-11-21  5:36   ` David Miller
2008-11-21  6:45     ` Stephen Hemminger
2008-11-21  8:46       ` David Miller
2008-11-21 16:22         ` Guo-Fu Tseng
2008-11-21 16:18       ` Guo-Fu Tseng

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=20081008215205.M37765@cooldavid.org \
    --to=cooldavid@cooldavid.org \
    --cc=akeem@jmicron.com \
    --cc=ethanhsiao@jmicron.com \
    --cc=jgarzik@pobox.com \
    --cc=netdev@vger.kernel.org \
    /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).