Date: Thu, 3 Jul 2008 10:59:48 +0900 From: Pyun YongHyeon <pyunyh@gmail.com> To: Krzysztof J?druczyk <beaker@hot.pl> Cc: freebsd-stable@freebsd.org Subject: Re: Marvell Yukon 88E8062 - media selection problem Message-ID: <20080703015948.GB92015@cdnetworks.co.kr> In-Reply-To: <486C0E69.8020603@hot.pl> References: <1052423937.20080630135423@hot.pl> <20080701004855.GF83626@cdnetworks.co.kr> <486A07A4.1070406@hot.pl> <20080702010929.GA87933@cdnetworks.co.kr> <486C0E69.8020603@hot.pl>
next in thread | previous in thread | raw e-mail | index | archive | help
--BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Jul 03, 2008 at 01:25:29AM +0200, Krzysztof J?druczyk wrote: > Pyun YongHyeon pisze: > > Would you try attached patch? > >The patch is just for checking code path of fiber media. > > It's slightly better - some media gets detected, but looks weird to me > (and doesn't communicate with other machines on the switch): > > # ifconfig > msk0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 > options=11a<TXCSUM,VLAN_MTU,VLAN_HWTAGGING,TSO4> > ether 00:10:f3:0d:d6:45 > media: Ethernet autoselect (autoselect <full-duplex>) > status: active > msk1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 > options=11a<TXCSUM,VLAN_MTU,VLAN_HWTAGGING,TSO4> > ether 00:10:f3:0d:d6:46 > media: Ethernet autoselect (autoselect <full-duplex>) > status: active > > 'autoselect (autoselect <full-duplex>)' doesn't seem right to me... > I guess I've clobbered extended address register. How about attached one? > I couldn't see any signs of interface being functional with neither ping > nor tcpdump... > There could be other issues in msk(4) for dual port controllers but let's focus on PHY issue first. > I tried the patch with 7.0-RELEASE-p2, -STABLE and -CURRENT kernels. > > I'm not sure how important is that, but I still can't force it to > 1000baseSX: > > # ifconfig msk0 media 1000baseSX > ifconfig: SIOCSIFMEDIA (media): Device not configured > I guess you may have to specify "mediaopt full-duplex" in the command. But I believe you should not manually set media type on gigabit environments. > > > >Btw, it looks like you have dual port controller, right? > > > Yes, this machine has dual gigabit ports: > http://www.nexcom.com/ProductModel.aspx?id=7541ac3e-ecfd-4008-83cd-52e1ababe6a8 > > Let me know if there is any info I could provide that would help making > this interface functional. > There are a copule of code path that applys to dual port controllers. For example MSI is not supported even though hardware actually support that feature. That would be next item to try. -- Regards, Pyun YongHyeon --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="e1000phy.fiber.patch2" --- sys/dev/mii/e1000phy.c.orig 2007-11-21 14:51:55.000000000 +0900 +++ sys/dev/mii/e1000phy.c 2008-07-03 10:46:06.000000000 +0900 @@ -148,10 +148,13 @@ esc->mii_model = MII_MODEL(ma->mii_id2); switch (esc->mii_model) { case MII_MODEL_MARVELL_E1011: - case MII_MODEL_MARVELL_E1112: if (PHY_READ(sc, E1000_ESSR) & E1000_ESSR_FIBER_LINK) sc->mii_flags |= MIIF_HAVEFIBER; break; + case MII_MODEL_MARVELL_E1112: + /* XXX Should have a way to get instance info. */ + sc->mii_flags |= MIIF_HAVEFIBER; + break; case MII_MODEL_MARVELL_E3082: /* 88E3082 10/100 Fast Ethernet PHY. */ sc->mii_anegticks = MII_ANEGTICKS; @@ -209,7 +212,7 @@ e1000phy_reset(struct mii_softc *sc) { struct e1000phy_softc *esc; - uint16_t reg; + uint16_t page, reg; esc = (struct e1000phy_softc *)sc; reg = PHY_READ(sc, E1000_SCR); @@ -217,13 +220,14 @@ reg &= ~E1000_SCR_AUTO_X_MODE; PHY_WRITE(sc, E1000_SCR, reg); if (esc->mii_model == MII_MODEL_MARVELL_E1112) { + page = PHY_READ(sc, E1000_EADR); /* Select 1000BASE-X only mode. */ PHY_WRITE(sc, E1000_EADR, 2); reg = PHY_READ(sc, E1000_SCR); reg &= ~E1000_SCR_MODE_MASK; reg |= E1000_SCR_MODE_1000BX; PHY_WRITE(sc, E1000_SCR, reg); - PHY_WRITE(sc, E1000_EADR, 1); + PHY_WRITE(sc, E1000_EADR, page); } } else { switch (esc->mii_model) { @@ -472,8 +476,8 @@ else mii->mii_media_active |= IFM_10_T; } else { - if (ssr & E1000_SSR_1000MBS) - mii->mii_media_active |= IFM_1000_SX; + /* XXX Should have a way to tell IFM_1000_SX/IFM_1000_LX. */ + mii->mii_media_active |= IFM_1000_SX; } if (ssr & E1000_SSR_DUPLEX) --BOKacYhQ+x31HxR3--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080703015948.GB92015>