Date: Wed, 23 Jan 2013 17:58:40 -0500 From: Ryan Stone <rysto32@gmail.com> To: Neel Natu <neelnatu@gmail.com> Cc: Jack F Vogel <jfv@freebsd.org>, freebsd-net <freebsd-net@freebsd.org> Subject: Re: e1000 serdes link flap Message-ID: <CAFMmRNzA-s4T1T=NCZL1fWqop0Hr-WpPwJQfat1E-qugb4Jdcw@mail.gmail.com> In-Reply-To: <CAFgRE9EpskSJ=PHG0qhDoDE6eP1_yXTidOwnhr8q-M=G3UCHSQ@mail.gmail.com> References: <CAFgRE9EpskSJ=PHG0qhDoDE6eP1_yXTidOwnhr8q-M=G3UCHSQ@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Jan 23, 2013 at 2:13 AM, Neel Natu <neelnatu@gmail.com> wrote: > Hi, > > I am running into a problem in head with the e1000 link state > detection logic attached to a 82571EB serdes controller. > > The symptom is that the link state keeps flapping between "up" and "down". > > After I enabled the debug output in > 'e1000_check_for_serdes_link_82571()' this is what I see: > <snip> > e1000_check_for_serdes_link_82571 > ctrl = 0x4c0241, status = 0x803a7, rxcw = 0x44000000 > FORCED_UP -> AN_PROG > em6: link state changed to DOWN > e1000_check_for_serdes_link_82571 > ctrl = 0x4c0201, status = 0x803a4, rxcw = 0x44000000 > AN_PROG -> FORCED_UP > em6: link state changed to UP > e1000_check_for_serdes_link_82571 > ctrl = 0x4c0241, status = 0x803a7, rxcw = 0x44000000 > FORCED_UP -> AN_PROG > em6: link state changed to DOWN > </snip> > > The problem goes away if I apply the following patch to bring the link > state detection logic in line with the e1000e driver in Linux: > > Index: e1000_82571.c > =================================================================== > --- e1000_82571.c (revision 245766) > +++ e1000_82571.c (working copy) > @@ -1712,10 +1712,8 @@ > * auto-negotiation in the TXCW register and > disable > * forced link in the Device Control register in an > * attempt to auto-negotiate with our link partner. > - * If the partner code word is null, stop forcing > - * and restart auto negotiation. > */ > - if ((rxcw & E1000_RXCW_C) || !(rxcw & > E1000_RXCW_CW)) { > + if ((rxcw & E1000_RXCW_C) != 0) { > /* Enable autoneg, and unforce link up */ > E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); > E1000_WRITE_REG(hw, E1000_CTRL, > > I am not sure why the !(rxcw & E1000_RXCW_CW) check was added and the > e1000 SDM does not have any more information. > > Jack, can you take a look at the patch and commit if it looks alright? > I have this change applied internally. I thought that it was something funny in my environment, so I never tried to push it upstream. Sorry for costing you time in having to debug this. :(
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFMmRNzA-s4T1T=NCZL1fWqop0Hr-WpPwJQfat1E-qugb4Jdcw>