diff options
Diffstat (limited to 'sys/dev/mii/mii.c')
| -rw-r--r-- | sys/dev/mii/mii.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/sys/dev/mii/mii.c b/sys/dev/mii/mii.c index 4771cc541e166..a22330bcff98a 100644 --- a/sys/dev/mii/mii.c +++ b/sys/dev/mii/mii.c @@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$"); #include <net/if.h> #include <net/if_media.h> +#include <net/route.h> #include <dev/mii/mii.h> #include <dev/mii/miivar.h> @@ -230,6 +231,8 @@ miibus_statchg(dev) return; } +void (*vlan_link_state_p)(struct ifnet *, int); /* XXX: private from if_vlan */ + static void miibus_linkchg(dev) device_t dev; @@ -237,7 +240,7 @@ miibus_linkchg(dev) struct mii_data *mii; struct ifnet *ifp; device_t parent; - int link; + int link, link_state; parent = device_get_parent(dev); MIIBUS_LINKCHG(parent); @@ -249,15 +252,26 @@ miibus_linkchg(dev) ifp = device_get_softc(parent); if (mii->mii_media_status & IFM_AVALID) { - if (mii->mii_media_status & IFM_ACTIVE) + if (mii->mii_media_status & IFM_ACTIVE) { link = NOTE_LINKUP; - else + link_state = LINK_STATE_UP; + } else { link = NOTE_LINKDOWN; + link_state = LINK_STATE_DOWN; + } } else { link = NOTE_LINKINV; + link_state = LINK_STATE_UNKNOWN; } - KNOTE(&ifp->if_klist, link); + /* Notify that the link state has changed. */ + if (ifp->if_link_state != link_state) { + ifp->if_link_state = link_state; + rt_ifmsg(ifp); + KNOTE(&ifp->if_klist, link); + if (ifp->if_nvlans != 0) + (*vlan_link_state_p)(ifp, link); + } } static void |
