"ifconfig media off"?

Stefan Bethke stb at lassitu.de
Fri Jan 20 23:58:11 UTC 2012


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:
>>> 
>>>> 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).
>>>>> 
>>>>> I noticed that there doesn't seem to be a way to power down a phy right now through the ifconfig media command.
>>>>> 
>>>>> 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?
>>>>> 
>>>>> 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.
>>>>> 
>>>> 
>>>> 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.
>>> 
>>> 
>>> 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).
>>> 
>> 
>> 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.
>> 
>>> Index: sys/dev/mii/mii_physubr.c
>>> ===================================================================
>>> --- 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] = {
>>> 	/* None */
>>> -	{ BMCR_ISO,		ANAR_CSMA,
>>> +	{ BMCR_ISO | BMCR_PDOWN,	ANAR_CSMA,
>>> 	  0, },
>>> 
>>> 	/* 10baseT */
>>> 
>>> I've opened kern/163240.
>>> http://www.freebsd.org/cgi/query-pr.cgi?pr=163240

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

-- 
Stefan Bethke <stb at lassitu.de>   Fon +49 151 14070811





More information about the freebsd-net mailing list