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 {
next prev parent 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).