Thread (6 messages) 6 messages, 3 authors, 2009-06-24

Re: [PATCH] gianfar: Fix half-duplex operation for non-MII/RMII interfaces

From: Anton Vorontsov <hidden>
Date: 2009-06-24 21:11:48
Also in: linuxppc-dev

On Wed, Jun 24, 2009 at 03:18:59PM -0500, Andy Fleming wrote:
On Jun 24, 2009, at 1:27 PM, Anton Vorontsov wrote:
quoted
It appears that gianfar driver has the same problem[1] that I
just fixed for ucc_geth.

NFS boot using 10/half link takes about 10 minutes to complete:
quoted
The symptoms were observed on MPC8379E-RDB boards (eTSEC). Although
I didn't find where documentation forbids clearing Full Duplex bit
for non-MII/RMII modes, it's pretty distinct that the bit should be
set.

It's no wonder though, QE Ethernet and TSEC are pretty similar.
quoted
-			if (!(phydev->duplex))
-				tempval &= ~(MACCFG2_FULL_DUPLEX);
+			if (!phydev->duplex &&
+					(phyi == PHY_INTERFACE_MODE_MII ||
+					 phyi == PHY_INTERFACE_MODE_RMII))

Hmm....have you tested this on a GMII interface?
Nope, only RGMII.
 *Technically*, full  
duplex is required for GMII, as GMII is used only for gigabit.  However, 
we've been treating the GMII interface type as an indicator that the PHY 
*has* a GMII connection to the NIC.  When gianfar detects the speed is 
10/100 it switches to the compatible MII interface via this code, just 
below:

                        case 100:
                        case 10:
                                tempval =
                                    ((tempval & ~(MACCFG2_IF)) |  
MACCFG2_MII);


My concern is that you will be detecting the GMII interface, and  
disallowing half-duplex, despite the fact that the interface is actually 
running at 10 or 100 Mbit.
Very interesting, though I'm not sure I'm completely following. :-)

Are you saying that I should do this instead:

	if (!phydev->duplex &&
			(phyi == PHY_INTERFACE_MODE_MII ||
			 phyi == PHY_INTERFACE_MODE_RMII ||
			 (phyi == PHY_INTERFACE_MODE_GMII &&
			  phydev->speed < 1000)))
		tempval &= ~MACCFG2_FULL_DUPLEX;
	else
		tempval |= MACCFG2_FULL_DUPLEX;

i.e. we detected GMII interface initially, but it downgraded
to MII since speed is < 1000, thus we can set half-duplex in MAC?

Thanks,

-- 
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help