Project

General

Profile

Bug #580 » df-link-state.patch

hasso, 03/16/2007 08:20 AM

View differences:

sys/dev/netif/em/if_em.c Thu Mar 15 21:41:11 2007 +0000 → sys/dev/netif/em/if_em.c Thu Mar 15 20:05:40 2007 +0200
static void
em_update_link_status(struct adapter *adapter)
{
struct ifnet *ifp;
ifp = &adapter->interface_data.ac_if;
if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
if (adapter->link_active == 0) {
em_get_speed_and_duplex(&adapter->hw,
......
}
adapter->link_active = 1;
adapter->smartspeed = 0;
#ifdef notyet
ifp->if_baudrate = adapter->link_speed * 1000000;
if_link_state_change(ifp, LINK_STATE_UP);
#endif
ifp->if_link_state = LINK_STATE_UP;
if_link_state_change(ifp);
}
} else {
if (adapter->link_active == 1) {
#ifdef notyet
ifp->if_baudrate = 0;
#endif
adapter->link_speed = 0;
adapter->link_duplex = 0;
if (bootverbose) {
......
"Link is Down\n");
}
adapter->link_active = 0;
#ifdef notyet
if_link_state_change(ifp, LINK_STATE_DOWN);
#endif
ifp->if_link_state = LINK_STATE_DOWN;
if_link_state_change(ifp);
}
}
}
sys/dev/netif/mii_layer/mii_physubr.c Thu Mar 15 21:41:11 2007 +0000 → sys/dev/netif/mii_layer/mii_physubr.c Thu Mar 15 20:10:03 2007 +0200
return (0);
}
#ifdef notyet
static void
static int
mii_phy_statusmsg(struct mii_softc *sc)
{
struct mii_data *mii = sc->mii_pdata;
struct ifnet *ifp = mii->mii_ifp;
int s;
crit_enter();
int baudrate, link_state, announce = 0;
if (mii->mii_media_status & IFM_AVALID) {
if (mii->mii_media_status & IFM_ACTIVE)
if_link_state_change(ifp, LINK_STATE_UP);
link_state = LINK_STATE_UP;
else
if_link_state_change(ifp, LINK_STATE_DOWN);
link_state = LINK_STATE_DOWN;
} else
if_link_state_change(ifp, LINK_STATE_UNKNOWN);
crit_exit();
ifp->if_baudrate = ifmedia_baudrate(mii->mii_media_active);
}
#endif
link_state = LINK_STATE_UNKNOWN;
baudrate = ifmedia_baudrate(mii->mii_media_active);
if (link_state != ifp->if_link_state) {
ifp->if_link_state = link_state;
/*
* XXX Right here we'd like to notify protocols
* XXX that the link status has changed, so that
* XXX e.g. Duplicate Address Detection can restart.
*/
announce = 1;
}
if (baudrate != ifp->if_baudrate) {
ifp->if_baudrate = baudrate;
announce = 1;
}
return (announce);
}
void
mii_phy_update(struct mii_softc *sc, int cmd)
{
struct mii_data *mii = sc->mii_pdata;
struct ifnet *ifp = mii->mii_ifp;
int announce;
if (sc->mii_media_active != mii->mii_media_active ||
sc->mii_media_status != mii->mii_media_status ||
cmd == MII_MEDIACHG) {
#ifdef notyet
mii_phy_statusmsg(sc);
#endif
announce = mii_phy_statusmsg(sc);
MIIBUS_STATCHG(sc->mii_dev);
sc->mii_media_active = mii->mii_media_active;
sc->mii_media_status = mii->mii_media_status;
if (announce) {
crit_enter();
if_link_state_change(ifp);
crit_exit();
}
}
}
sys/net/if.c Thu Mar 15 21:41:11 2007 +0000 → sys/net/if.c Fri Mar 16 06:58:52 2007 +0200
{
if_route(ifp, IFF_UP, AF_UNSPEC);
}
/*
* Process a link state change.
* NOTE: must be called at splsoftnet or equivalent.
*/
void
if_link_state_change(struct ifnet *ifp)
{
rt_ifmsg(ifp);
}
/*
sys/net/if.h Thu Mar 15 21:41:11 2007 +0000 → sys/net/if.h Thu Mar 15 20:08:58 2007 +0200
#endif
/*
* Values for if_link_state.
*/
#define LINK_STATE_UNKNOWN 0 /* link invalid/unknown */
#define LINK_STATE_DOWN 1 /* link is down */
#define LINK_STATE_UP 2 /* link is up */
struct ifnet;
/*
......
u_char ifi_xmitquota; /* polling quota for xmit intrs */
u_long ifi_mtu; /* maximum transmission unit */
u_long ifi_metric; /* routing metric (external only) */
u_long ifi_link_state; /* current link state */
u_long ifi_baudrate; /* linespeed */
/* volatile statistics */
u_long ifi_ipackets; /* packets received on interface */
sys/net/if_media.c Thu Mar 15 21:41:11 2007 +0000 → sys/net/if_media.c Thu Mar 15 13:57:11 2007 +0200
return match;
}
struct ifmedia_baudrate ifmedia_baudrate_descriptions[] =
IFM_BAUDRATE_DESCRIPTIONS;
int
ifmedia_baudrate(int mword)
{
int i;
for (i = 0; ifmedia_baudrate_descriptions[i].ifmb_word != 0; i++) {
if ((mword & (IFM_NMASK|IFM_TMASK)) ==
ifmedia_baudrate_descriptions[i].ifmb_word)
return (ifmedia_baudrate_descriptions[i].ifmb_baudrate);
}
/* Not known. */
return (0);
}
#ifdef IFMEDIA_DEBUG
struct ifmedia_description ifm_type_descriptions[] =
IFM_TYPE_DESCRIPTIONS;
sys/net/if_media.h Thu Mar 15 21:41:11 2007 +0000 → sys/net/if_media.h Fri Mar 16 06:56:20 2007 +0200
int ifmedia_ioctl(struct ifnet *ifp, struct ifreq *ifr,
struct ifmedia *ifm, u_long cmd);
/* Compute baudrate for a given media. */
int ifmedia_baudrate(int);
#endif /*_KERNEL */
/*
......
{ 0, NULL }, \
}
/*
* Baudrate descriptions for the various media types.
*/
struct ifmedia_baudrate {
int ifmb_word; /* media word */
int ifmb_baudrate; /* corresponding baudrate */
};
#define IFM_BAUDRATE_DESCRIPTIONS { \
{ IFM_ETHER|IFM_10_T, IF_Mbps(10) }, \
{ IFM_ETHER|IFM_10_2, IF_Mbps(10) }, \
{ IFM_ETHER|IFM_10_5, IF_Mbps(10) }, \
{ IFM_ETHER|IFM_100_TX, IF_Mbps(100) }, \
{ IFM_ETHER|IFM_100_FX, IF_Mbps(100) }, \
{ IFM_ETHER|IFM_100_T4, IF_Mbps(100) }, \
{ IFM_ETHER|IFM_100_VG, IF_Mbps(100) }, \
{ IFM_ETHER|IFM_100_T2, IF_Mbps(100) }, \
{ IFM_ETHER|IFM_1000_SX, IF_Mbps(1000) }, \
{ IFM_ETHER|IFM_10_STP, IF_Mbps(10) }, \
{ IFM_ETHER|IFM_10_FL, IF_Mbps(10) }, \
{ IFM_ETHER|IFM_1000_LX, IF_Mbps(1000) }, \
{ IFM_ETHER|IFM_1000_CX, IF_Mbps(1000) }, \
{ IFM_ETHER|IFM_1000_T, IF_Mbps(1000) }, \
{ IFM_ETHER|IFM_HPNA_1, IF_Mbps(1) }, \
\
{ IFM_TOKEN|IFM_TOK_STP4, IF_Mbps(4) }, \
{ IFM_TOKEN|IFM_TOK_STP16, IF_Mbps(16) }, \
{ IFM_TOKEN|IFM_TOK_UTP4, IF_Mbps(4) }, \
{ IFM_TOKEN|IFM_TOK_UTP16, IF_Mbps(16) }, \
\
{ IFM_FDDI|IFM_FDDI_SMF, IF_Mbps(100) }, \
{ IFM_FDDI|IFM_FDDI_MMF, IF_Mbps(100) }, \
{ IFM_FDDI|IFM_FDDI_UTP, IF_Mbps(100) }, \
\
{ IFM_IEEE80211|IFM_IEEE80211_FH1, IF_Mbps(1) }, \
{ IFM_IEEE80211|IFM_IEEE80211_FH2, IF_Mbps(2) }, \
{ IFM_IEEE80211|IFM_IEEE80211_DS1, IF_Mbps(1) }, \
{ IFM_IEEE80211|IFM_IEEE80211_DS2, IF_Mbps(2) }, \
{ IFM_IEEE80211|IFM_IEEE80211_DS5, IF_Mbps(5) }, \
{ IFM_IEEE80211|IFM_IEEE80211_DS11, IF_Mbps(11) }, \
{ IFM_IEEE80211|IFM_IEEE80211_DS22, IF_Mbps(22) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM6, IF_Mbps(6) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM9, IF_Mbps(9) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM12, IF_Mbps(12) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM18, IF_Mbps(18) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM24, IF_Mbps(24) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM36, IF_Mbps(36) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM48, IF_Mbps(48) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM54, IF_Mbps(54) }, \
{ IFM_IEEE80211|IFM_IEEE80211_OFDM72, IF_Mbps(72) }, \
\
{ 0, 0 }, \
}
#endif /* _NET_IF_MEDIA_H_ */
sys/net/if_var.h Thu Mar 15 21:41:11 2007 +0000 → sys/net/if_var.h Thu Mar 15 14:18:56 2007 +0200
#define if_addrlen if_data.ifi_addrlen
#define if_hdrlen if_data.ifi_hdrlen
#define if_metric if_data.ifi_metric
#define if_link_state if_data.ifi_link_state
#define if_baudrate if_data.ifi_baudrate
#define if_hwassist if_data.ifi_hwassist
#define if_ipackets if_data.ifi_ipackets
......
int if_delmulti(struct ifnet *, struct sockaddr *);
void if_detach(struct ifnet *);
void if_down(struct ifnet *);
void if_link_state_change(struct ifnet *);
void if_initname(struct ifnet *, const char *, int);
int if_printf(struct ifnet *, const char *, ...) __printflike(2, 3);
void if_route(struct ifnet *, int flag, int fam);
    (1-1/1)