Annotation of qemu/roms/ipxe/src/net/mii.c, revision 1.1

1.1     ! root        1: /*
        !             2: 
        !             3:        mii.c: MII interface library
        !             4: 
        !             5:        Ported to iPXE by Daniel Verkamp <[email protected]>
        !             6:        from Linux drivers/net/mii.c
        !             7: 
        !             8:        Maintained by Jeff Garzik <[email protected]>
        !             9:        Copyright 2001,2002 Jeff Garzik
        !            10: 
        !            11:        Various code came from myson803.c and other files by
        !            12:        Donald Becker.  Copyright:
        !            13: 
        !            14:                Written 1998-2002 by Donald Becker.
        !            15: 
        !            16:                This software may be used and distributed according
        !            17:                to the terms of the GNU General Public License (GPL),
        !            18:                incorporated herein by reference.  Drivers based on
        !            19:                or derived from this code fall under the GPL and must
        !            20:                retain the authorship, copyright and license notice.
        !            21:                This file is not a complete program and may only be
        !            22:                used when the entire operating system is licensed
        !            23:                under the GPL.
        !            24: 
        !            25:                The author may be reached as [email protected], or C/O
        !            26:                Scyld Computing Corporation
        !            27:                410 Severn Ave., Suite 210
        !            28:                Annapolis MD 21403
        !            29: 
        !            30: */
        !            31: 
        !            32: #include <mii.h>
        !            33: 
        !            34: /**
        !            35:  * mii_link_ok - is link status up/ok
        !            36:  * @mii: the MII interface
        !            37:  *
        !            38:  * Returns 1 if the MII reports link status up/ok, 0 otherwise.
        !            39:  */
        !            40: int
        !            41: mii_link_ok ( struct mii_if_info *mii )
        !            42: {
        !            43:        /* first, a dummy read, needed to latch some MII phys */
        !            44:        mii->mdio_read ( mii->dev, mii->phy_id, MII_BMSR );
        !            45:        if ( mii->mdio_read ( mii->dev, mii->phy_id, MII_BMSR ) & BMSR_LSTATUS )
        !            46:                return 1;
        !            47:        return 0;
        !            48: }
        !            49: 
        !            50: /**
        !            51:  * mii_check_link - check MII link status
        !            52:  * @mii: MII interface
        !            53:  *
        !            54:  * If the link status changed (previous != current), call
        !            55:  * netif_carrier_on() if current link status is Up or call
        !            56:  * netif_carrier_off() if current link status is Down.
        !            57:  */
        !            58: void
        !            59: mii_check_link ( struct mii_if_info *mii )
        !            60: {
        !            61:        int cur_link = mii_link_ok ( mii );
        !            62:        int prev_link = netdev_link_ok ( mii->dev );
        !            63: 
        !            64:        if ( cur_link && !prev_link )
        !            65:                netdev_link_up ( mii->dev );
        !            66:        else if (prev_link && !cur_link)
        !            67:                netdev_link_down ( mii->dev );
        !            68: }
        !            69: 
        !            70: 
        !            71: /**
        !            72:  * mii_check_media - check the MII interface for a duplex change
        !            73:  * @mii: the MII interface
        !            74:  * @ok_to_print: OK to print link up/down messages
        !            75:  * @init_media: OK to save duplex mode in @mii
        !            76:  *
        !            77:  * Returns 1 if the duplex mode changed, 0 if not.
        !            78:  * If the media type is forced, always returns 0.
        !            79:  */
        !            80: unsigned int
        !            81: mii_check_media ( struct mii_if_info *mii,
        !            82:                   unsigned int ok_to_print,
        !            83:                   unsigned int init_media )
        !            84: {
        !            85:        unsigned int old_carrier, new_carrier;
        !            86:        int advertise, lpa, media, duplex;
        !            87:        int lpa2 = 0;
        !            88: 
        !            89:        /* if forced media, go no further */
        !            90:        if (mii->force_media)
        !            91:                return 0; /* duplex did not change */
        !            92: 
        !            93:        /* check current and old link status */
        !            94:        old_carrier = netdev_link_ok ( mii->dev ) ? 1 : 0;
        !            95:        new_carrier = (unsigned int) mii_link_ok ( mii );
        !            96: 
        !            97:        /* if carrier state did not change, this is a "bounce",
        !            98:         * just exit as everything is already set correctly
        !            99:         */
        !           100:        if ( ( ! init_media ) && ( old_carrier == new_carrier ) )
        !           101:                return 0; /* duplex did not change */
        !           102: 
        !           103:        /* no carrier, nothing much to do */
        !           104:        if ( ! new_carrier ) {
        !           105:                netdev_link_down ( mii->dev );
        !           106:                if ( ok_to_print )
        !           107:                        DBG ( "%s: link down\n", mii->dev->name);
        !           108:                return 0; /* duplex did not change */
        !           109:        }
        !           110: 
        !           111:        /*
        !           112:         * we have carrier, see who's on the other end
        !           113:         */
        !           114:        netdev_link_up ( mii->dev );
        !           115: 
        !           116:        /* get MII advertise and LPA values */
        !           117:        if ( ( ! init_media ) && ( mii->advertising ) ) {
        !           118:                advertise = mii->advertising;
        !           119:        } else {
        !           120:                advertise = mii->mdio_read ( mii->dev, mii->phy_id, MII_ADVERTISE );
        !           121:                mii->advertising = advertise;
        !           122:        }
        !           123:        lpa = mii->mdio_read ( mii->dev, mii->phy_id, MII_LPA );
        !           124:        if ( mii->supports_gmii )
        !           125:                lpa2 = mii->mdio_read ( mii->dev, mii->phy_id, MII_STAT1000 );
        !           126: 
        !           127:        /* figure out media and duplex from advertise and LPA values */
        !           128:        media = mii_nway_result ( lpa & advertise );
        !           129:        duplex = ( media & ADVERTISE_FULL ) ? 1 : 0;
        !           130:        if ( lpa2 & LPA_1000FULL )
        !           131:                duplex = 1;
        !           132: 
        !           133:        if ( ok_to_print )
        !           134:                DBG ( "%s: link up, %sMbps, %s-duplex, lpa 0x%04X\n",
        !           135:                       mii->dev->name,
        !           136:                       lpa2 & ( LPA_1000FULL | LPA_1000HALF ) ? "1000" :
        !           137:                       media & ( ADVERTISE_100FULL | ADVERTISE_100HALF ) ? "100" : "10",
        !           138:                       duplex ? "full" : "half",
        !           139:                       lpa);
        !           140: 
        !           141:        if ( ( init_media ) || ( mii->full_duplex != duplex ) ) {
        !           142:                mii->full_duplex = duplex;
        !           143:                return 1; /* duplex changed */
        !           144:        }
        !           145: 
        !           146:        return 0; /* duplex did not change */
        !           147: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.