Subject: Re: forcing out an Nway code word on media change
To: None <M.Drochner@fz-juelich.de>
From: Jason Thorpe <thorpej@nas.nasa.gov>
List: tech-net
Date: 11/13/1999 14:34:42
On Sat, 13 Nov 1999 16:15:18 +0100 
 Matthias Drochner <M.Drochner@fz-juelich.de> wrote:

 > Can we always assume that the ANER has the LPAN bit set if the
 > partner supports NWAY at this point? A switch should start an
 > autonegotiotion cycle when the link is established, but I didn't
 > find out whether our ANER gets set if we don't have autonegotiation
 > enabled (the BMCR_AUTOEN bit) at this time. The standard doesn't
 > go into details here. (Btw, does "isolated" mean "link down"?)

Right, that's one of my main concerns, that the link partner won't
see ANER_LPAN unless we set BMCR_AUTOEN.

 > There is also a bootstrap problem if two machines are connected
 > point-to-point.
 > I don't see what this condition is necessary for, so I'd remove it.

So, the issue is that if the partner is *NOT* Nway-capable, and we
start an Nway cycle on our end (using BMCR_STARTNEG), then we have
a problem; the Nway will never enter FLP_GOOD state, so we will never
have a link-up condition.

Perhaps we can do the following instead: if we support Nway (i.e. BMSR_ANEG),
always set BMCR_AUTOEN.  This should ensure that our link partner always
sees ANER_LPAN[*].  If we see ANER_LPAN for our link partner, then also set
BMCR_STARTNEG to force out a code word.

[*] Not only do I wish the standard were more clear here, I wish I *had*
a copy of it.  Sadly, it's probably a pretty penny for that from IEEE.

BTW, "isolated" in this case means the user set media of "none" (which
has the effect of isolating the PHY from the MII bus).

        -- Jason R. Thorpe <thorpej@nas.nasa.gov>

Index: mii_physubr.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/mii/mii_physubr.c,v
retrieving revision 1.8
diff -c -r1.8 mii_physubr.c
*** mii_physubr.c	1999/11/12 18:13:00	1.8
--- mii_physubr.c	1999/11/13 22:21:57
***************
*** 88,95 ****
  	anar = mii_media_table[ife->ifm_data].mm_anar;
  	bmcr = mii_media_table[ife->ifm_data].mm_bmcr;
  
! 	if (ife->ifm_media & IFM_LOOP)
! 		bmcr |= BMCR_LOOP;
  
  	PHY_WRITE(sc, MII_ANAR, anar);
  	PHY_WRITE(sc, MII_BMCR, bmcr);
--- 88,114 ----
  	anar = mii_media_table[ife->ifm_data].mm_anar;
  	bmcr = mii_media_table[ife->ifm_data].mm_bmcr;
  
! 	if ((bmcr & BMCR_ISO) == 0) {
! 		if (ife->ifm_media & IFM_LOOP)
! 			bmcr |= BMCR_LOOP;
! 		else {
! 			/*
! 			 * If we support Nway, set BMCR_AUTOEN so
! 			 * that our link partner sees ANER_LPAN.
! 			 */
! 			if (sc->mii_capabilities & BMSR_ANEG)
! 				bmcr |= BMCR_AUTOEN;
! 
! 			/*
! 			 * If our link partner supports Nway, make
! 			 * sure we transmit a code word to them so
! 			 * that they can update their link speed and
! 			 * duplex mode when ours changes.
! 			 */
! 			if (PHY_READ(sc, MII_ANER) & ANER_LPAN)
! 				bmcr |= BMCR_STARTNEG;
! 		}
! 	}
  
  	PHY_WRITE(sc, MII_ANAR, anar);
  	PHY_WRITE(sc, MII_BMCR, bmcr);