aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/msk
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2009-05-25 06:19:36 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2009-05-25 06:19:36 +0000
commit6c4d62e1d6ef01410f04aea6b3fe45180d8c2a1a (patch)
treecd56a6b451bb995e9836af8c547782426b1c1f1d /sys/dev/msk
parent262e9dcf36460d10194cc4d63e6cd615704b2c19 (diff)
downloadsrc-6c4d62e1d6ef01410f04aea6b3fe45180d8c2a1a.tar.gz
src-6c4d62e1d6ef01410f04aea6b3fe45180d8c2a1a.zip
Explicitly check resolved speed/duplex. Just checking IFM_ACTIVE
does not guarantee established link. Also 1000baseT link report for fast ethernet controller is not valid one so make sure gigabit link is allowed for this controller. Whenever we lost link, check whether Rx/Tx MACs were enabled. If both MAC are not active, do not try to disable it again.
Notes
Notes: svn path=/head/; revision=192727
Diffstat (limited to 'sys/dev/msk')
-rw-r--r--sys/dev/msk/if_msk.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c
index f067247df8ee..41084e802a1b 100644
--- a/sys/dev/msk/if_msk.c
+++ b/sys/dev/msk/if_msk.c
@@ -475,11 +475,25 @@ msk_miibus_statchg(device_t dev)
(ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
return;
- if (mii->mii_media_status & IFM_ACTIVE) {
- if (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
+ sc_if->msk_flags &= ~MSK_FLAG_LINK;
+ if ((mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) ==
+ (IFM_AVALID | IFM_ACTIVE)) {
+ switch (IFM_SUBTYPE(mii->mii_media_active)) {
+ case IFM_10_T:
+ case IFM_100_TX:
sc_if->msk_flags |= MSK_FLAG_LINK;
- } else
- sc_if->msk_flags &= ~MSK_FLAG_LINK;
+ break;
+ case IFM_1000_T:
+ case IFM_1000_SX:
+ case IFM_1000_LX:
+ case IFM_1000_CX:
+ if ((sc_if->msk_flags & MSK_FLAG_FASTETHER) == 0)
+ sc_if->msk_flags |= MSK_FLAG_LINK;
+ break;
+ default:
+ break;
+ }
+ }
if ((sc_if->msk_flags & MSK_FLAG_LINK) != 0) {
/* Enable Tx FIFO Underrun. */
@@ -538,10 +552,12 @@ msk_miibus_statchg(device_t dev)
msk_phy_writereg(sc_if, PHY_ADDR_MARV, PHY_MARV_INT_MASK, 0);
/* Disable Rx/Tx MAC. */
gmac = GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
- gmac &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
- GMAC_WRITE_2(sc, sc_if->msk_port, GM_GP_CTRL, gmac);
- /* Read again to ensure writing. */
- GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
+ if ((GM_GPCR_RX_ENA | GM_GPCR_TX_ENA) != 0) {
+ gmac &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
+ GMAC_WRITE_2(sc, sc_if->msk_port, GM_GP_CTRL, gmac);
+ /* Read again to ensure writing. */
+ GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL);
+ }
}
}