Annotation of sys/dev/mii/ukphy_subr.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ukphy_subr.c,v 1.7 2006/12/27 19:11:09 kettenis Exp $ */
! 2: /* $NetBSD: ukphy_subr.c,v 1.2 1998/11/05 04:08:02 thorpej Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 1998 The NetBSD Foundation, Inc.
! 6: * All rights reserved.
! 7: *
! 8: * This code is derived from software contributed to The NetBSD Foundation
! 9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
! 10: * NASA Ames Research Center, and by Frank van der Linden.
! 11: *
! 12: * Redistribution and use in source and binary forms, with or without
! 13: * modification, are permitted provided that the following conditions
! 14: * are met:
! 15: * 1. Redistributions of source code must retain the above copyright
! 16: * notice, this list of conditions and the following disclaimer.
! 17: * 2. Redistributions in binary form must reproduce the above copyright
! 18: * notice, this list of conditions and the following disclaimer in the
! 19: * documentation and/or other materials provided with the distribution.
! 20: * 3. All advertising materials mentioning features or use of this software
! 21: * must display the following acknowledgement:
! 22: * This product includes software developed by the NetBSD
! 23: * Foundation, Inc. and its contributors.
! 24: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 25: * contributors may be used to endorse or promote products derived
! 26: * from this software without specific prior written permission.
! 27: *
! 28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 38: * POSSIBILITY OF SUCH DAMAGE.
! 39: */
! 40:
! 41: /*
! 42: * Subroutines shared by the ukphy driver and other PHY drivers.
! 43: */
! 44:
! 45: #include <sys/param.h>
! 46: #include <sys/systm.h>
! 47: #include <sys/kernel.h>
! 48: #include <sys/device.h>
! 49: #include <sys/socket.h>
! 50:
! 51: #include <net/if.h>
! 52: #include <net/if_media.h>
! 53:
! 54: #include <dev/mii/mii.h>
! 55: #include <dev/mii/miivar.h>
! 56:
! 57: /*
! 58: * Media status subroutine. If a PHY driver does media detection simply
! 59: * by decoding the NWay autonegotiation, use this routine.
! 60: */
! 61: void
! 62: ukphy_status(struct mii_softc *phy)
! 63: {
! 64: struct mii_data *mii = phy->mii_pdata;
! 65: struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
! 66: int bmsr, bmcr, anlpar, gtcr, gtsr;
! 67:
! 68: mii->mii_media_status = IFM_AVALID;
! 69: mii->mii_media_active = IFM_ETHER;
! 70:
! 71: bmsr = PHY_READ(phy, MII_BMSR) | PHY_READ(phy, MII_BMSR);
! 72: if (bmsr & BMSR_LINK)
! 73: mii->mii_media_status |= IFM_ACTIVE;
! 74:
! 75: bmcr = PHY_READ(phy, MII_BMCR);
! 76: if (bmcr & BMCR_ISO) {
! 77: mii->mii_media_active |= IFM_NONE;
! 78: mii->mii_media_status = 0;
! 79: return;
! 80: }
! 81:
! 82: if (bmcr & BMCR_LOOP)
! 83: mii->mii_media_active |= IFM_LOOP;
! 84:
! 85: if (bmcr & BMCR_AUTOEN) {
! 86: /*
! 87: * NWay autonegotiation takes the highest-order common
! 88: * bit of the ANAR and ANLPAR (i.e. best media advertised
! 89: * both by us and our link partner).
! 90: */
! 91: if ((bmsr & BMSR_ACOMP) == 0) {
! 92: /* Erg, still trying, I guess... */
! 93: mii->mii_media_active |= IFM_NONE;
! 94: return;
! 95: }
! 96:
! 97: anlpar = PHY_READ(phy, MII_ANAR) & PHY_READ(phy, MII_ANLPAR);
! 98: if ((phy->mii_flags & MIIF_HAVE_GTCR) != 0 &&
! 99: (phy->mii_extcapabilities &
! 100: (EXTSR_1000THDX|EXTSR_1000TFDX)) != 0) {
! 101: gtcr = PHY_READ(phy, MII_100T2CR);
! 102: gtsr = PHY_READ(phy, MII_100T2SR);
! 103: } else
! 104: gtcr = gtsr = 0;
! 105:
! 106: if ((gtcr & GTCR_ADV_1000TFDX) && (gtsr & GTSR_LP_1000TFDX))
! 107: mii->mii_media_active |= IFM_1000_T|IFM_FDX;
! 108: else if ((gtcr & GTCR_ADV_1000THDX) &&
! 109: (gtsr & GTSR_LP_1000THDX))
! 110: mii->mii_media_active |= IFM_1000_T|IFM_HDX;
! 111: else if (anlpar & ANLPAR_T4)
! 112: mii->mii_media_active |= IFM_100_T4|IFM_HDX;
! 113: else if (anlpar & ANLPAR_TX_FD)
! 114: mii->mii_media_active |= IFM_100_TX|IFM_FDX;
! 115: else if (anlpar & ANLPAR_TX)
! 116: mii->mii_media_active |= IFM_100_TX|IFM_HDX;
! 117: else if (anlpar & ANLPAR_10_FD)
! 118: mii->mii_media_active |= IFM_10_T|IFM_FDX;
! 119: else if (anlpar & ANLPAR_10)
! 120: mii->mii_media_active |= IFM_10_T|IFM_HDX;
! 121: else
! 122: mii->mii_media_active |= IFM_NONE;
! 123:
! 124: if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) &&
! 125: (gtsr & GTSR_MS_RES))
! 126: mii->mii_media_active |= IFM_ETH_MASTER;
! 127: } else
! 128: mii->mii_media_active = ife->ifm_media;
! 129: }
CVSweb