Date: Sat, 21 Jan 2012 00:58:08 +0100 From: Stefan Bethke <stb@lassitu.de> To: Marius Strobl <marius@alchemy.franken.de> Cc: YongHyeon PYUN <pyunyh@gmail.com>, FreeBSD Net <freebsd-net@freebsd.org> Subject: Re: "ifconfig media off"? Message-ID: <AD7424DB-01E7-4988-BE12-835286112960@lassitu.de> In-Reply-To: <20111214011657.GH36635@alchemy.franken.de> References: <600A8C6C-DAB4-4E22-A034-38224017166B@lassitu.de> <20111213025041.GF3705@michelle.cdnetworks.com> <45B0B859-207C-4F02-A28F-7E34B775A273@lassitu.de> <20111213185348.GA7546@michelle.cdnetworks.com> <20111214011657.GH36635@alchemy.franken.de>
next in thread | previous in thread | raw e-mail | index | archive | help
Am 14.12.2011 um 02:16 schrieb Marius Strobl: > On Tue, Dec 13, 2011 at 10:53:48AM -0800, YongHyeon PYUN wrote: >> On Tue, Dec 13, 2011 at 11:04:51AM +0100, Stefan Bethke wrote: >>> Am 13.12.2011 um 03:50 schrieb YongHyeon PYUN: >>>=20 >>>> On Tue, Dec 13, 2011 at 12:56:22AM +0100, Stefan Bethke wrote: >>>>> I'm currently writing a driver to configure an ethernet switch = chip (see TL-WR1043ND on -embedded). >>>>>=20 >>>>> I noticed that there doesn't seem to be a way to power down a phy = right now through the ifconfig media command. >>>>>=20 >>>>> Would there be objections to extend the media subtype definitions = to include an "off", "poweroff" or "down" media subtype, and add code to = the relevant phy drivers to power down the phy for this media subtype? >>>>>=20 >>>>> The difference between media subtype "none" and this new one would = be that there will be no link, even if there is a physical connection. = With media subtype "none", a 10 MBit/s half-duplex connection is = established, potentially confusing the remote end about the availability = of this link. On the local side, the link is down, so no packets are = exchanged. >>>>>=20 >>>>=20 >>>> I think "none" means "isolated" so should have no established link >>>> and probably you can also power down the PHY. >>>> I vaguely guess the PHY of switch chip does not correctly support >>>> isolated mode so you may have wanted to power down. >>>=20 >>>=20 >>> After looking at the code a bit more, I think the common code just = doesn't set the BMCR_PDOWN (but clears it when bringing up the PHY). >>>=20 >>=20 >> Yes, and most PHYs could be powered down when BMCR_ISO is chosen. >> I'm not sure whether this could be applied to hardwares that >> support multiple PHYs(i.e. internal and external transceivers) >> though. Marius may have some opinions on this(CCed). >> However powering down PHY with BMCR_ISO looks natural to me. >>=20 >>> Index: sys/dev/mii/mii_physubr.c >>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> --- sys/dev/mii/mii_physubr.c (revision 228402) >>> +++ sys/dev/mii/mii_physubr.c (working copy) >>> @@ -58,7 +58,7 @@ >>> */ >>> static const struct mii_media mii_media_table[MII_NMEDIA] =3D { >>> /* None */ >>> - { BMCR_ISO, ANAR_CSMA, >>> + { BMCR_ISO | BMCR_PDOWN, ANAR_CSMA, >>> 0, }, >>>=20 >>> /* 10baseT */ >>>=20 >>> I've opened kern/163240. >>> http://www.freebsd.org/cgi/query-pr.cgi?pr=3D163240 I'd like to revisit this. Just to reiterate my motivation for the = change: I want to be able to indicate to the remote end that my station = is not active. With the PHY just isolated from the MII, the link stays = up and functional (and even autoneg continues to work), so the remote = has no indication that it's just shouting into a void. > I don't think powering down the PHY along with IFM_NONE especially > in that way is a good idea for several reasons: > - It's incomplete as not all PHY drivers use mii_phy_add_media()/ > mii_phy_setmedia(). > - Even for those that do IFM_NONE isn't added when the PHY driver > sets MIIF_NOISOLATE (for some PHYs BMCR_ISO either just doesn't > work as especially the built-in ones probably have been designed > with only single-PHY configurations in mind or even wedges the > chip up to the point that even a reset doesn't get it working > again). In general though, BMCR_ISO and BMCR_PDOWN are orthogonal > (even in IEEE 802.3-2008 as far as I can see), i.e. while BMCR_ISO > might be broken, BMCR_PDOWN could work (actually I'd expect > BMCR_PDOWN to be less fragile than BMCR_ISO). I didn't expect my suggestion to be the be-all end-all, only a quick and = easy way to allow compliant PHYs to be powered down, and I'm not sure = why a "complete" solution is required. I'd assume that PHYs setting = MIIF_NOISOLATE have specific requirements, so it's OK to not have the = power-down option available there. (Plus I don't have hardware I could = test that case on). > - There should be a way to let a PHY driver do something different > than setting BMCR_PDOWN when it's told to power down as f.e. at > least some Broadcom PHYs support a "super isolation" mode. Cool, but how does my suggestion stop anyone from implementing that? > - As you already mentioned in general there can be multiple PHYs > on one MII bus and I'd expect "power down that interface" to > mean to power all of them down (granted, MACs with multiple > PHYs are rather uncommon in reality but they do exist, f.e. > Allied Telesis has several card models that use two PHYs per > MAC). Since there can be only one active PHY at a time, it could make sense to = also set PDOWN in mii_mediachg(). How about a new flag MIIF_PDOWN that = the phy driver can set to indicate that it would rather be shut off than = just isolated? Right now I only care about ukphy anyway. > In generall I agree that there should be a way to power down PHYs > though. While there might be some merit in additionally adding that > as a media option I think that the most intuitive way would be for > `ifconfig foo0 down` to also power down the PHYs on that interface. > In order implement that the basic way seems to be to make the > various foo_stop() methods of MAC drivers to call mii_down() (as > in NetBSD) and to make mii_phy_down() (or a replacement) actually > do something, with PHY drivers being allowed to opt-out with > something like a MIIF_NOPOWERDOWN. What I'm not sure about is how > to implement power down in the individual drivers while keeping > code duplication for the common case low, i.e. I'm not sure whether > the NetBSD way of having a MII_DOWN case in the service routines > is the way to go. I'm hesitant to tie IFF_UP to link state. Is there precedent for that? = My gut feeling is that IFF_UP has always meant that the interface has = been brought up administratively; bringing an interface down "only" = means that the system should not transmit on it and discard received = frames. > Is there something in the rc.d scripts that downs network > interfaces on shutdown that could interfere with WOL when we > power down the PHYs? I don't think so, but I've never looked in detail. I believe that = interfaces are brought down on shutdown by the kernel, though. Stefan --=20 Stefan Bethke <stb@lassitu.de> Fon +49 151 14070811
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AD7424DB-01E7-4988-BE12-835286112960>