[BACK]Return to ixgb_hw.c CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/ixgb_hw.c, Revision 1.1

1.1     ! nbrk        1: /*******************************************************************************
        !             2:
        !             3:   Copyright (c) 2001-2005, Intel Corporation
        !             4:   All rights reserved.
        !             5:
        !             6:   Redistribution and use in source and binary forms, with or without
        !             7:   modification, are permitted provided that the following conditions are met:
        !             8:
        !             9:    1. Redistributions of source code must retain the above copyright notice,
        !            10:       this list of conditions and the following disclaimer.
        !            11:
        !            12:    2. Redistributions in binary form must reproduce the above copyright
        !            13:       notice, this list of conditions and the following disclaimer in the
        !            14:       documentation and/or other materials provided with the distribution.
        !            15:
        !            16:    3. Neither the name of the Intel Corporation nor the names of its
        !            17:       contributors may be used to endorse or promote products derived from
        !            18:       this software without specific prior written permission.
        !            19:
        !            20:   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
        !            21:   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            22:   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            23:   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
        !            24:   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            25:   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            26:   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            27:   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            28:   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            29:   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            30:   POSSIBILITY OF SUCH DAMAGE.
        !            31:
        !            32: *******************************************************************************/
        !            33:
        !            34: /* $OpenBSD: ixgb_hw.c,v 1.2 2006/06/22 04:50:31 brad Exp $ */
        !            35:
        !            36: /* ixgb_hw.c
        !            37:  * Shared functions for accessing and configuring the adapter
        !            38:  */
        !            39:
        !            40: #include <sys/param.h>
        !            41: #include <sys/systm.h>
        !            42: #include <sys/sockio.h>
        !            43: #include <sys/mbuf.h>
        !            44: #include <sys/malloc.h>
        !            45: #include <sys/kernel.h>
        !            46: #include <sys/device.h>
        !            47: #include <sys/socket.h>
        !            48:
        !            49: #include <net/if.h>
        !            50: #include <net/if_dl.h>
        !            51: #include <net/if_media.h>
        !            52:
        !            53: #ifdef INET
        !            54: #include <netinet/in.h>
        !            55: #include <netinet/in_systm.h>
        !            56: #include <netinet/in_var.h>
        !            57: #include <netinet/ip.h>
        !            58: #include <netinet/if_ether.h>
        !            59: #endif
        !            60:
        !            61: #include <uvm/uvm_extern.h>
        !            62:
        !            63: #include <dev/pci/pcireg.h>
        !            64: #include <dev/pci/pcivar.h>
        !            65: #include <dev/pci/pcidevs.h>
        !            66:
        !            67: #include <dev/pci/ixgb_hw.h>
        !            68: #include <dev/pci/ixgb_ids.h>
        !            69:
        !            70: /*  Local function prototypes */
        !            71:
        !            72: static uint32_t ixgb_hash_mc_addr(struct ixgb_hw *hw, uint8_t *mc_addr);
        !            73:
        !            74: static void ixgb_mta_set(struct ixgb_hw *hw, uint32_t hash_value);
        !            75:
        !            76: static void ixgb_get_bus_info(struct ixgb_hw *hw);
        !            77:
        !            78: static boolean_t ixgb_link_reset(struct ixgb_hw *hw);
        !            79:
        !            80: static void ixgb_optics_reset(struct ixgb_hw *hw);
        !            81:
        !            82: static ixgb_phy_type ixgb_identify_phy(struct ixgb_hw *hw);
        !            83:
        !            84: uint32_t ixgb_mac_reset(struct ixgb_hw *hw);
        !            85:
        !            86: uint32_t
        !            87: ixgb_mac_reset(struct ixgb_hw *hw)
        !            88: {
        !            89:        uint32_t ctrl_reg;
        !            90:
        !            91:     ctrl_reg =  IXGB_CTRL0_RST |
        !            92:                 IXGB_CTRL0_SDP3_DIR |   /* All pins are Output=1 */
        !            93:                 IXGB_CTRL0_SDP2_DIR |
        !            94:                 IXGB_CTRL0_SDP1_DIR |
        !            95:                 IXGB_CTRL0_SDP0_DIR |
        !            96:                 IXGB_CTRL0_SDP3     |   /* Initial value 1101   */
        !            97:                 IXGB_CTRL0_SDP2     |
        !            98:                 IXGB_CTRL0_SDP0;
        !            99:
        !           100: #ifdef HP_ZX1
        !           101:        /* Workaround for 82597EX reset errata */
        !           102:        IXGB_WRITE_REG_IO(hw, CTRL0, ctrl_reg);
        !           103: #else
        !           104:        IXGB_WRITE_REG(hw, CTRL0, ctrl_reg);
        !           105: #endif
        !           106:
        !           107:        /* Delay a few ms just to allow the reset to complete */
        !           108:        msec_delay(IXGB_DELAY_AFTER_RESET);
        !           109:        ctrl_reg = IXGB_READ_REG(hw, CTRL0);
        !           110: #ifdef DBG
        !           111:        /* Make sure the self-clearing global reset bit did self clear */
        !           112:        ASSERT(!(ctrl_reg & IXGB_CTRL0_RST));
        !           113: #endif
        !           114:
        !           115:        if(hw->phy_type == ixgb_phy_type_txn17401) {
        !           116:                ixgb_optics_reset(hw);
        !           117:        }
        !           118:
        !           119:        return ctrl_reg;
        !           120: }
        !           121:
        !           122: /******************************************************************************
        !           123:  * Reset the transmit and receive units; mask and clear all interrupts.
        !           124:  *
        !           125:  * hw - Struct containing variables accessed by shared code
        !           126:  *****************************************************************************/
        !           127: boolean_t
        !           128: ixgb_adapter_stop(struct ixgb_hw *hw)
        !           129: {
        !           130:        uint32_t ctrl_reg;
        !           131:        uint32_t icr_reg;
        !           132:
        !           133:        DEBUGFUNC("ixgb_adapter_stop");
        !           134:
        !           135:        /* If we are stopped or resetting exit gracefully and wait to be
        !           136:         * started again before accessing the hardware. */
        !           137:        if(hw->adapter_stopped) {
        !           138:                DEBUGOUT("Exiting because the adapter is already stopped!!!\n");
        !           139:                return FALSE;
        !           140:        }
        !           141:
        !           142:        /* Set the Adapter Stopped flag so other driver functions stop touching
        !           143:         * the Hardware. */
        !           144:        hw->adapter_stopped = TRUE;
        !           145:
        !           146:        /* Clear interrupt mask to stop board from generating interrupts */
        !           147:        DEBUGOUT("Masking off all interrupts\n");
        !           148:        IXGB_WRITE_REG(hw, IMC, 0xFFFFFFFF);
        !           149:
        !           150:        /* Disable the Transmit and Receive units.  Then delay to allow any
        !           151:         * pending transactions to complete before we hit the MAC with the
        !           152:         * global reset. */
        !           153:        IXGB_WRITE_REG(hw, RCTL, IXGB_READ_REG(hw, RCTL) & ~IXGB_RCTL_RXEN);
        !           154:        IXGB_WRITE_REG(hw, TCTL, IXGB_READ_REG(hw, TCTL) & ~IXGB_TCTL_TXEN);
        !           155:        msec_delay(IXGB_DELAY_BEFORE_RESET);
        !           156:
        !           157:        /* Issue a global reset to the MAC.  This will reset the chip's
        !           158:         * transmit, receive, DMA, and link units.  It will not effect the
        !           159:         * current PCI configuration.  The global reset bit is self- clearing,
        !           160:         * and should clear within a microsecond. */
        !           161:        DEBUGOUT("Issuing a global reset to MAC\n");
        !           162:
        !           163:        ctrl_reg = ixgb_mac_reset(hw);
        !           164:
        !           165:        /* Clear interrupt mask to stop board from generating interrupts */
        !           166:        DEBUGOUT("Masking off all interrupts\n");
        !           167:        IXGB_WRITE_REG(hw, IMC, 0xffffffff);
        !           168:
        !           169:        /* Clear any pending interrupt events. */
        !           170:        icr_reg = IXGB_READ_REG(hw, ICR);
        !           171:
        !           172:        return (ctrl_reg & IXGB_CTRL0_RST);
        !           173: }
        !           174:
        !           175: /******************************************************************************
        !           176:  * Identifies the vendor of the optics module on the adapter.  The SR adapters
        !           177:  * support two different types of XPAK optics, so it is necessary to determine
        !           178:  * which optics are present before applying any optics-specific workarounds.
        !           179:  *
        !           180:  * hw - Struct containing variables accessed by shared code.
        !           181:  *
        !           182:  * Returns: the vendor of the XPAK optics module.
        !           183:  *****************************************************************************/
        !           184: static ixgb_xpak_vendor
        !           185: ixgb_identify_xpak_vendor(struct ixgb_hw *hw)
        !           186: {
        !           187:        uint32_t i;
        !           188:        uint16_t vendor_name[5];
        !           189:        ixgb_xpak_vendor xpak_vendor;
        !           190:
        !           191:        DEBUGFUNC("ixgb_identify_xpak_vendor");
        !           192:
        !           193:        /* Read the first few bytes of the vendor string from the XPAK NVR
        !           194:         * registers.  These are standard XENPAK/XPAK registers, so all XPAK
        !           195:         * devices should implement them. */
        !           196:        for(i = 0; i < 5; i++) {
        !           197:                vendor_name[i] =
        !           198:                        ixgb_read_phy_reg(hw, MDIO_PMA_PMD_XPAK_VENDOR_NAME + i,
        !           199:                                          IXGB_PHY_ADDRESS, MDIO_PMA_PMD_DID);
        !           200:        }
        !           201:
        !           202:        /* Determine the actual vendor */
        !           203:        if (vendor_name[0] == 'I' &&
        !           204:            vendor_name[1] == 'N' &&
        !           205:            vendor_name[2] == 'T' &&
        !           206:            vendor_name[3] == 'E' &&
        !           207:            vendor_name[4] == 'L') {
        !           208:            xpak_vendor = ixgb_xpak_vendor_intel;
        !           209:        }
        !           210:        else {
        !           211:                xpak_vendor = ixgb_xpak_vendor_infineon;
        !           212:        }
        !           213:        return (xpak_vendor);
        !           214: }
        !           215:
        !           216: /******************************************************************************
        !           217:  * Determine the physical layer module on the adapter.
        !           218:  *
        !           219:  * hw - Struct containing variables accessed by shared code.  The device_id
        !           220:  *      field must be (correctly) populated before calling this routine.
        !           221:  *
        !           222:  * Returns: the phy type of the adapter.
        !           223:  *****************************************************************************/
        !           224: static ixgb_phy_type
        !           225: ixgb_identify_phy(struct ixgb_hw *hw)
        !           226: {
        !           227:        ixgb_phy_type phy_type;
        !           228:        ixgb_xpak_vendor xpak_vendor;
        !           229:
        !           230:        DEBUGFUNC("ixgb_identify_phy");
        !           231:
        !           232:        /* Infer the transceiver/phy type from the device id */
        !           233:        switch(hw->device_id) {
        !           234:        case IXGB_DEVICE_ID_82597EX:
        !           235:                DEBUGOUT("Identified TXN17401 optics\n");
        !           236:                phy_type = ixgb_phy_type_txn17401;
        !           237:                break;
        !           238:
        !           239:        case IXGB_DEVICE_ID_82597EX_SR:
        !           240:                /* The SR adapters carry two different types of XPAK optics
        !           241:                 * modules; read the vendor identifier to determine the exact
        !           242:                 * type of optics. */
        !           243:                xpak_vendor = ixgb_identify_xpak_vendor(hw);
        !           244:                if(xpak_vendor == ixgb_xpak_vendor_intel) {
        !           245:                        DEBUGOUT("Identified TXN17201 optics\n");
        !           246:                        phy_type = ixgb_phy_type_txn17201;
        !           247:                } else {
        !           248:                        DEBUGOUT("Identified G6005 optics\n");
        !           249:                        phy_type = ixgb_phy_type_g6005;
        !           250:                }
        !           251:                break;
        !           252:
        !           253:        case IXGB_DEVICE_ID_82597EX_LR:
        !           254:                DEBUGOUT("Identified G6104 optics\n");
        !           255:                phy_type = ixgb_phy_type_g6104;
        !           256:                break;
        !           257:
        !           258:        case IXGB_DEVICE_ID_82597EX_CX4:
        !           259:                DEBUGOUT("Identified CX4\n");
        !           260:                xpak_vendor = ixgb_identify_xpak_vendor(hw);
        !           261:                if(xpak_vendor == ixgb_xpak_vendor_intel) {
        !           262:                        DEBUGOUT("Identified TXN17201 optics\n");
        !           263:                        phy_type = ixgb_phy_type_txn17201;
        !           264:                } else {
        !           265:                        DEBUGOUT("Identified G6005 optics\n");
        !           266:                        phy_type = ixgb_phy_type_g6005;
        !           267:                }
        !           268:                break;
        !           269:
        !           270:        default:
        !           271:                DEBUGOUT("Unknown physical layer module\n");
        !           272:                phy_type = ixgb_phy_type_unknown;
        !           273:                break;
        !           274:        }
        !           275:
        !           276:        return (phy_type);
        !           277: }
        !           278:
        !           279: /******************************************************************************
        !           280:  * Performs basic configuration of the adapter.
        !           281:  *
        !           282:  * hw - Struct containing variables accessed by shared code
        !           283:  *
        !           284:  * Resets the controller.
        !           285:  * Reads and validates the EEPROM.
        !           286:  * Initializes the receive address registers.
        !           287:  * Initializes the multicast table.
        !           288:  * Clears all on-chip counters.
        !           289:  * Calls routine to setup flow control settings.
        !           290:  * Leaves the transmit and receive units disabled and uninitialized.
        !           291:  *
        !           292:  * Returns:
        !           293:  *      TRUE if successful,
        !           294:  *      FALSE if unrecoverable problems were encountered.
        !           295:  *****************************************************************************/
        !           296: boolean_t
        !           297: ixgb_init_hw(struct ixgb_hw *hw)
        !           298: {
        !           299:        uint32_t i;
        !           300:        uint32_t ctrl_reg;
        !           301:        boolean_t status;
        !           302:
        !           303:        DEBUGFUNC("ixgb_init_hw");
        !           304:
        !           305:        /* Issue a global reset to the MAC.  This will reset the chip's
        !           306:         * transmit, receive, DMA, and link units.  It will not effect the
        !           307:         * current PCI configuration.  The global reset bit is self- clearing,
        !           308:         * and should clear within a microsecond. */
        !           309:        DEBUGOUT("Issuing a global reset to MAC\n");
        !           310:
        !           311:        ctrl_reg = ixgb_mac_reset(hw);
        !           312:
        !           313:        DEBUGOUT("Issuing an EE reset to MAC\n");
        !           314: #ifdef HP_ZX1
        !           315:        /* Workaround for 82597EX reset errata */
        !           316:        IXGB_WRITE_REG_IO(hw, CTRL1, IXGB_CTRL1_EE_RST);
        !           317: #else
        !           318:        IXGB_WRITE_REG(hw, CTRL1, IXGB_CTRL1_EE_RST);
        !           319: #endif
        !           320:
        !           321:        /* Delay a few ms just to allow the reset to complete */
        !           322:        msec_delay(IXGB_DELAY_AFTER_EE_RESET);
        !           323:
        !           324:        if(ixgb_get_eeprom_data(hw) == FALSE) {
        !           325:                return (FALSE);
        !           326:        }
        !           327:
        !           328:        /* Use the device id to determine the type of phy/transceiver. */
        !           329:        hw->device_id = ixgb_get_ee_device_id(hw);
        !           330:        hw->phy_type = ixgb_identify_phy(hw);
        !           331:
        !           332:        /* Setup the receive addresses. Receive Address Registers (RARs 0 -
        !           333:         * 15). */
        !           334:        ixgb_init_rx_addrs(hw);
        !           335:
        !           336:        /*
        !           337:         * Check that a valid MAC address has been set.
        !           338:         * If it is not valid, we fail hardware init.
        !           339:         */
        !           340:        if(!mac_addr_valid(hw->curr_mac_addr)) {
        !           341:                DEBUGOUT("MAC address invalid after ixgb_init_rx_addrs\n");
        !           342:                return (FALSE);
        !           343:        }
        !           344:
        !           345:        /* tell the routines in this file they can access hardware again */
        !           346:        hw->adapter_stopped = FALSE;
        !           347:
        !           348:        /* Fill in the bus_info structure */
        !           349:        ixgb_get_bus_info(hw);
        !           350:
        !           351:        /* Zero out the Multicast HASH table */
        !           352:        DEBUGOUT("Zeroing the MTA\n");
        !           353:        for(i = 0; i < IXGB_MC_TBL_SIZE; i++)
        !           354:                IXGB_WRITE_REG_ARRAY(hw, MTA, i, 0);
        !           355:
        !           356:        /* Zero out the VLAN Filter Table Array */
        !           357:        ixgb_clear_vfta(hw);
        !           358:
        !           359:        /* Zero all of the hardware counters */
        !           360:        ixgb_clear_hw_cntrs(hw);
        !           361:
        !           362:        /* Call a subroutine to setup flow control. */
        !           363:        status = ixgb_setup_fc(hw);
        !           364:
        !           365:        /* 82597EX errata: Call check-for-link in case lane deskew is locked */
        !           366:        ixgb_check_for_link(hw);
        !           367:
        !           368:        return (status);
        !           369: }
        !           370:
        !           371: /******************************************************************************
        !           372:  * Initializes receive address filters.
        !           373:  *
        !           374:  * hw - Struct containing variables accessed by shared code
        !           375:  *
        !           376:  * Places the MAC address in receive address register 0 and clears the rest
        !           377:  * of the receive addresss registers. Clears the multicast table. Assumes
        !           378:  * the receiver is in reset when the routine is called.
        !           379:  *****************************************************************************/
        !           380: void
        !           381: ixgb_init_rx_addrs(struct ixgb_hw *hw)
        !           382: {
        !           383:        uint32_t i;
        !           384:
        !           385:        DEBUGFUNC("ixgb_init_rx_addrs");
        !           386:
        !           387:        /*
        !           388:         * If the current mac address is valid, assume it is a software override
        !           389:         * to the permanent address.
        !           390:         * Otherwise, use the permanent address from the eeprom.
        !           391:         */
        !           392:        if(!mac_addr_valid(hw->curr_mac_addr)) {
        !           393:
        !           394:                /* Get the MAC address from the eeprom for later reference */
        !           395:                ixgb_get_ee_mac_addr(hw, hw->curr_mac_addr);
        !           396:
        !           397:                DEBUGOUT3(" Keeping Permanent MAC Addr =%.2X %.2X %.2X ",
        !           398:                          hw->curr_mac_addr[0], hw->curr_mac_addr[1],
        !           399:                          hw->curr_mac_addr[2]);
        !           400:                DEBUGOUT3("%.2X %.2X %.2X\n", hw->curr_mac_addr[3],
        !           401:                          hw->curr_mac_addr[4], hw->curr_mac_addr[5]);
        !           402:        } else {
        !           403:
        !           404:                /* Setup the receive address. */
        !           405:                DEBUGOUT("Overriding MAC Address in RAR[0]\n");
        !           406:                DEBUGOUT3(" New MAC Addr =%.2X %.2X %.2X ",
        !           407:                          hw->curr_mac_addr[0], hw->curr_mac_addr[1],
        !           408:                          hw->curr_mac_addr[2]);
        !           409:                DEBUGOUT3("%.2X %.2X %.2X\n", hw->curr_mac_addr[3],
        !           410:                          hw->curr_mac_addr[4], hw->curr_mac_addr[5]);
        !           411:
        !           412:                ixgb_rar_set(hw, hw->curr_mac_addr, 0);
        !           413:        }
        !           414:
        !           415:        /* Zero out the other 15 receive addresses. */
        !           416:        DEBUGOUT("Clearing RAR[1-15]\n");
        !           417:        for(i = 1; i < IXGB_RAR_ENTRIES; i++) {
        !           418:                IXGB_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
        !           419:                IXGB_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
        !           420:        }
        !           421:
        !           422:        return;
        !           423: }
        !           424:
        !           425: /******************************************************************************
        !           426:  * Updates the MAC's list of multicast addresses.
        !           427:  *
        !           428:  * hw - Struct containing variables accessed by shared code
        !           429:  * mc_addr_list - the list of new multicast addresses
        !           430:  * mc_addr_count - number of addresses
        !           431:  * pad - number of bytes between addresses in the list
        !           432:  *
        !           433:  * The given list replaces any existing list. Clears the last 15 receive
        !           434:  * address registers and the multicast table. Uses receive address registers
        !           435:  * for the first 15 multicast addresses, and hashes the rest into the
        !           436:  * multicast table.
        !           437:  *****************************************************************************/
        !           438: void
        !           439: ixgb_mc_addr_list_update(struct ixgb_hw *hw, uint8_t *mc_addr_list,
        !           440:                         uint32_t mc_addr_count, uint32_t pad)
        !           441: {
        !           442:        uint32_t hash_value;
        !           443:        uint32_t i;
        !           444:        uint32_t rar_used_count = 1;    /* RAR[0] is used for our MAC address */
        !           445:
        !           446:        DEBUGFUNC("ixgb_mc_addr_list_update");
        !           447:
        !           448:        /* Set the new number of MC addresses that we are being requested to
        !           449:         * use. */
        !           450:        hw->num_mc_addrs = mc_addr_count;
        !           451:
        !           452:        /* Clear RAR[1-15] */
        !           453:        DEBUGOUT(" Clearing RAR[1-15]\n");
        !           454:        for(i = rar_used_count; i < IXGB_RAR_ENTRIES; i++) {
        !           455:                IXGB_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);
        !           456:                IXGB_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);
        !           457:        }
        !           458:
        !           459:        /* Clear the MTA */
        !           460:        DEBUGOUT(" Clearing MTA\n");
        !           461:        for(i = 0; i < IXGB_MC_TBL_SIZE; i++) {
        !           462:                IXGB_WRITE_REG_ARRAY(hw, MTA, i, 0);
        !           463:        }
        !           464:
        !           465:        /* Add the new addresses */
        !           466:        for(i = 0; i < mc_addr_count; i++) {
        !           467:                DEBUGOUT(" Adding the multicast addresses:\n");
        !           468:                DEBUGOUT7(" MC Addr #%d =%.2X %.2X %.2X %.2X %.2X %.2X\n", i,
        !           469:                          mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad)],
        !           470:                          mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 1],
        !           471:                          mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 2],
        !           472:                          mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 3],
        !           473:                          mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 4],
        !           474:                          mc_addr_list[i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad) + 5]);
        !           475:
        !           476:                /* Place this multicast address in the RAR if there is room, *
        !           477:                 * else put it in the MTA */
        !           478:                if(rar_used_count < IXGB_RAR_ENTRIES) {
        !           479:                        ixgb_rar_set(hw,
        !           480:                                     mc_addr_list +
        !           481:                                     (i * (IXGB_ETH_LENGTH_OF_ADDRESS + pad)),
        !           482:                                     rar_used_count);
        !           483:                        DEBUGOUT1("Added a multicast address to RAR[%d]\n", i);
        !           484:                        rar_used_count++;
        !           485:                } else {
        !           486:                        hash_value =
        !           487:                                ixgb_hash_mc_addr(hw,
        !           488:                                                  mc_addr_list +
        !           489:                                                  (i *
        !           490:                                                   (IXGB_ETH_LENGTH_OF_ADDRESS +
        !           491:                                                    pad)));
        !           492:
        !           493:                        DEBUGOUT1(" Hash value = 0x%03X\n", hash_value);
        !           494:
        !           495:                        ixgb_mta_set(hw, hash_value);
        !           496:                }
        !           497:        }
        !           498:
        !           499:        DEBUGOUT("MC Update Complete\n");
        !           500:        return;
        !           501: }
        !           502:
        !           503: /******************************************************************************
        !           504:  * Hashes an address to determine its location in the multicast table
        !           505:  *
        !           506:  * hw - Struct containing variables accessed by shared code
        !           507:  * mc_addr - the multicast address to hash
        !           508:  *
        !           509:  * Returns:
        !           510:  *      The hash value
        !           511:  *****************************************************************************/
        !           512: static uint32_t
        !           513: ixgb_hash_mc_addr(struct ixgb_hw *hw, uint8_t *mc_addr)
        !           514: {
        !           515:        uint32_t hash_value = 0;
        !           516:
        !           517:        DEBUGFUNC("ixgb_hash_mc_addr");
        !           518:
        !           519:        /* The portion of the address that is used for the hash table is
        !           520:         * determined by the mc_filter_type setting. */
        !           521:        switch(hw->mc_filter_type) {
        !           522:                /* [0] [1] [2] [3] [4] [5] 01 AA 00 12 34 56 LSB MSB -
        !           523:                 * According to H/W docs */
        !           524:        case 0:
        !           525:                /* [47:36] i.e. 0x563 for above example address */
        !           526:                hash_value =
        !           527:                        ((mc_addr[4] >> 4) | (((uint16_t)mc_addr[5]) << 4));
        !           528:                break;
        !           529:        case 1:                     /* [46:35] i.e. 0xAC6 for above
        !           530:                                             * example address */
        !           531:                hash_value =
        !           532:                        ((mc_addr[4] >> 3) | (((uint16_t)mc_addr[5]) << 5));
        !           533:                break;
        !           534:        case 2:                     /* [45:34] i.e. 0x5D8 for above
        !           535:                                             * example address */
        !           536:                hash_value =
        !           537:                        ((mc_addr[4] >> 2) | (((uint16_t)mc_addr[5]) << 6));
        !           538:                break;
        !           539:        case 3:                     /* [43:32] i.e. 0x634 for above
        !           540:                                             * example address */
        !           541:                hash_value = ((mc_addr[4]) | (((uint16_t)mc_addr[5]) << 8));
        !           542:                break;
        !           543:        default:
        !           544:                /* Invalid mc_filter_type, what should we do? */
        !           545:                DEBUGOUT("MC filter type param set incorrectly\n");
        !           546:                ASSERT(0);
        !           547:                break;
        !           548:        }
        !           549:
        !           550:        hash_value &= 0xFFF;
        !           551:        return (hash_value);
        !           552: }
        !           553:
        !           554: /******************************************************************************
        !           555:  * Sets the bit in the multicast table corresponding to the hash value.
        !           556:  *
        !           557:  * hw - Struct containing variables accessed by shared code
        !           558:  * hash_value - Multicast address hash value
        !           559:  *****************************************************************************/
        !           560: static void
        !           561: ixgb_mta_set(struct ixgb_hw *hw, uint32_t hash_value)
        !           562: {
        !           563:        uint32_t hash_bit, hash_reg;
        !           564:        uint32_t mta_reg;
        !           565:
        !           566:        /* The MTA is a register array of 128 32-bit registers. It is treated
        !           567:         * like an array of 4096 bits.  We want to set bit
        !           568:         * BitArray[hash_value]. So we figure out what register the bit is in,
        !           569:         * read it, OR in the new bit, then write back the new value.  The
        !           570:         * register is determined by the upper 7 bits of the hash value and the
        !           571:         * bit within that register are determined by the lower 5 bits of the
        !           572:         * value. */
        !           573:        hash_reg = (hash_value >> 5) & 0x7F;
        !           574:        hash_bit = hash_value & 0x1F;
        !           575:        mta_reg = IXGB_READ_REG_ARRAY(hw, MTA, hash_reg);
        !           576:        mta_reg |= (1 << hash_bit);
        !           577:        IXGB_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta_reg);
        !           578:        return;
        !           579: }
        !           580:
        !           581: /******************************************************************************
        !           582:  * Puts an ethernet address into a receive address register.
        !           583:  *
        !           584:  * hw - Struct containing variables accessed by shared code
        !           585:  * addr - Address to put into receive address register
        !           586:  * index - Receive address register to write
        !           587:  *****************************************************************************/
        !           588: void
        !           589: ixgb_rar_set(struct ixgb_hw *hw, uint8_t *addr, uint32_t index)
        !           590: {
        !           591:        uint32_t rar_low, rar_high;
        !           592:
        !           593:        DEBUGFUNC("ixgb_rar_set");
        !           594:
        !           595:        /* HW expects these in little endian so we reverse the byte order from
        !           596:         * network order (big endian) to little endian */
        !           597:        rar_low = ((uint32_t)addr[0] |
        !           598:                  ((uint32_t)addr[1] << 8) |
        !           599:                  ((uint32_t)addr[2] << 16) |
        !           600:                  ((uint32_t)addr[3] << 24));
        !           601:
        !           602:        rar_high = ((uint32_t)addr[4] |
        !           603:                   ((uint32_t)addr[5] << 8) |
        !           604:                    IXGB_RAH_AV);
        !           605:
        !           606:        IXGB_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low);
        !           607:        IXGB_WRITE_REG_ARRAY(hw, RA, ((index << 1) + 1), rar_high);
        !           608:        return;
        !           609: }
        !           610:
        !           611: /******************************************************************************
        !           612:  * Writes a value to the specified offset in the VLAN filter table.
        !           613:  *
        !           614:  * hw - Struct containing variables accessed by shared code
        !           615:  * offset - Offset in VLAN filer table to write
        !           616:  * value - Value to write into VLAN filter table
        !           617:  *****************************************************************************/
        !           618: void
        !           619: ixgb_write_vfta(struct ixgb_hw *hw, uint32_t offset, uint32_t value)
        !           620: {
        !           621:        IXGB_WRITE_REG_ARRAY(hw, VFTA, offset, value);
        !           622:        return;
        !           623: }
        !           624:
        !           625: /******************************************************************************
        !           626:  * Clears the VLAN filer table
        !           627:  *
        !           628:  * hw - Struct containing variables accessed by shared code
        !           629:  *****************************************************************************/
        !           630: void
        !           631: ixgb_clear_vfta(struct ixgb_hw *hw)
        !           632: {
        !           633:        uint32_t offset;
        !           634:
        !           635:        for(offset = 0; offset < IXGB_VLAN_FILTER_TBL_SIZE; offset++)
        !           636:                IXGB_WRITE_REG_ARRAY(hw, VFTA, offset, 0);
        !           637:        return;
        !           638: }
        !           639:
        !           640: /******************************************************************************
        !           641:  * Configures the flow control settings based on SW configuration.
        !           642:  *
        !           643:  * hw - Struct containing variables accessed by shared code
        !           644:  *****************************************************************************/
        !           645:
        !           646: boolean_t
        !           647: ixgb_setup_fc(struct ixgb_hw *hw)
        !           648: {
        !           649:        uint32_t ctrl_reg;
        !           650:        uint32_t pap_reg = 0;   /* by default, assume no pause time */
        !           651:        boolean_t status = TRUE;
        !           652:
        !           653:        DEBUGFUNC("ixgb_setup_fc");
        !           654:
        !           655:        /* Get the current control reg 0 settings */
        !           656:        ctrl_reg = IXGB_READ_REG(hw, CTRL0);
        !           657:
        !           658:        /* Clear the Receive Pause Enable and Transmit Pause Enable bits */
        !           659:        ctrl_reg &= ~(IXGB_CTRL0_RPE | IXGB_CTRL0_TPE);
        !           660:
        !           661:        /* The possible values of the "flow_control" parameter are:
        !           662:         * 0: Flow control is completely disabled
        !           663:         * 1: Rx flow control is enabled (we can receive pause frames but not send
        !           664:         *    pause frames).
        !           665:         * 2: Tx flow control is enabled (we can send pause frames but we do not
        !           666:         *    support receiving pause frames)
        !           667:         * 3: Both Rx and TX flow control (symmetric) are enabled.
        !           668:         * other: Invalid. */
        !           669:        switch(hw->fc.type) {
        !           670:        case ixgb_fc_none:                  /* 0 */
        !           671:                /* Set CMDC bit to disable Rx Flow control */
        !           672:                ctrl_reg |= (IXGB_CTRL0_CMDC);
        !           673:                break;
        !           674:        case ixgb_fc_rx_pause:              /* 1 */
        !           675:                /* RX Flow control is enabled, and TX Flow control is disabled. */
        !           676:                ctrl_reg |= (IXGB_CTRL0_RPE);
        !           677:                break;
        !           678:        case ixgb_fc_tx_pause:              /* 2 */
        !           679:                /* TX Flow control is enabled, and RX Flow control is disabled,
        !           680:                 * by a software over-ride. */
        !           681:                ctrl_reg |= (IXGB_CTRL0_TPE);
        !           682:                pap_reg = hw->fc.pause_time;
        !           683:                break;
        !           684:        case ixgb_fc_full:                  /* 3 */
        !           685:                /* Flow control (both RX and TX) is enabled by a software
        !           686:                 * over-ride. */
        !           687:                ctrl_reg |= (IXGB_CTRL0_RPE | IXGB_CTRL0_TPE);
        !           688:                pap_reg = hw->fc.pause_time;
        !           689:                break;
        !           690:        default:
        !           691:                /* We should never get here.  The value should be 0-3. */
        !           692:                DEBUGOUT("Flow control param set incorrectly\n");
        !           693:                ASSERT(0);
        !           694:                break;
        !           695:        }
        !           696:
        !           697:        /* Write the new settings */
        !           698:        IXGB_WRITE_REG(hw, CTRL0, ctrl_reg);
        !           699:
        !           700:        if(pap_reg != 0) {
        !           701:                IXGB_WRITE_REG(hw, PAP, pap_reg);
        !           702:        }
        !           703:
        !           704:        /* Set the flow control receive threshold registers.  Normally, these
        !           705:         * registers will be set to a default threshold that may be adjusted
        !           706:         * later by the driver's runtime code.  However, if the ability to
        !           707:         * transmit pause frames in not enabled, then these registers will be
        !           708:         * set to 0. */
        !           709:        if(!(hw->fc.type & ixgb_fc_tx_pause)) {
        !           710:                IXGB_WRITE_REG(hw, FCRTL, 0);
        !           711:                IXGB_WRITE_REG(hw, FCRTH, 0);
        !           712:        } else {
        !           713:                /* We need to set up the Receive Threshold high and low water
        !           714:                 * marks as well as (optionally) enabling the transmission of
        !           715:                 * XON frames. */
        !           716:                if(hw->fc.send_xon) {
        !           717:                        IXGB_WRITE_REG(hw, FCRTL,
        !           718:                                       (hw->fc.low_water | IXGB_FCRTL_XONE));
        !           719:                } else {
        !           720:                        IXGB_WRITE_REG(hw, FCRTL, hw->fc.low_water);
        !           721:                }
        !           722:                IXGB_WRITE_REG(hw, FCRTH, hw->fc.high_water);
        !           723:        }
        !           724:        return (status);
        !           725: }
        !           726:
        !           727: /******************************************************************************
        !           728:  * Reads a word from a device over the Management Data Interface (MDI) bus.
        !           729:  * This interface is used to manage Physical layer devices.
        !           730:  *
        !           731:  * hw          - Struct containing variables accessed by hw code
        !           732:  * reg_address - Offset of device register being read.
        !           733:  * phy_address - Address of device on MDI.
        !           734:  *
        !           735:  * Returns:  Data word (16 bits) from MDI device.
        !           736:  *
        !           737:  * The 82597EX has support for several MDI access methods.  This routine
        !           738:  * uses the new protocol MDI Single Command and Address Operation.
        !           739:  * This requires that first an address cycle command is sent, followed by a
        !           740:  * read command.
        !           741:  *****************************************************************************/
        !           742: uint16_t
        !           743: ixgb_read_phy_reg(struct ixgb_hw *hw, uint32_t reg_address,
        !           744:                  uint32_t phy_address, uint32_t device_type)
        !           745: {
        !           746:        uint32_t i;
        !           747:        uint32_t data;
        !           748:        uint32_t command = 0;
        !           749:
        !           750:        ASSERT(reg_address <= IXGB_MAX_PHY_REG_ADDRESS);
        !           751:        ASSERT(phy_address <= IXGB_MAX_PHY_ADDRESS);
        !           752:        ASSERT(device_type <= IXGB_MAX_PHY_DEV_TYPE);
        !           753:
        !           754:        /* Setup and write the address cycle command */
        !           755:        command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT)  |
        !           756:                   (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
        !           757:                   (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
        !           758:                   (IXGB_MSCA_ADDR_CYCLE | IXGB_MSCA_MDI_COMMAND));
        !           759:
        !           760:        IXGB_WRITE_REG(hw, MSCA, command);
        !           761:
        !           762:     /**************************************************************
        !           763:     ** Check every 10 usec to see if the address cycle completed
        !           764:     ** The COMMAND bit will clear when the operation is complete.
        !           765:     ** This may take as long as 64 usecs (we'll wait 100 usecs max)
        !           766:     ** from the CPU Write to the Ready bit assertion.
        !           767:     **************************************************************/
        !           768:
        !           769:        for(i = 0; i < 10; i++) {
        !           770:                usec_delay(10);
        !           771:
        !           772:                command = IXGB_READ_REG(hw, MSCA);
        !           773:
        !           774:                if((command & IXGB_MSCA_MDI_COMMAND) == 0)
        !           775:                        break;
        !           776:        }
        !           777:
        !           778:        ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
        !           779:
        !           780:        /* Address cycle complete, setup and write the read command */
        !           781:        command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT)  |
        !           782:                   (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
        !           783:                   (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
        !           784:                   (IXGB_MSCA_READ | IXGB_MSCA_MDI_COMMAND));
        !           785:
        !           786:        IXGB_WRITE_REG(hw, MSCA, command);
        !           787:
        !           788:     /**************************************************************
        !           789:     ** Check every 10 usec to see if the read command completed
        !           790:     ** The COMMAND bit will clear when the operation is complete.
        !           791:     ** The read may take as long as 64 usecs (we'll wait 100 usecs max)
        !           792:     ** from the CPU Write to the Ready bit assertion.
        !           793:     **************************************************************/
        !           794:
        !           795:        for(i = 0; i < 10; i++) {
        !           796:                usec_delay(10);
        !           797:
        !           798:                command = IXGB_READ_REG(hw, MSCA);
        !           799:
        !           800:                if((command & IXGB_MSCA_MDI_COMMAND) == 0)
        !           801:                        break;
        !           802:        }
        !           803:
        !           804:        ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
        !           805:
        !           806:        /* Operation is complete, get the data from the MDIO Read/Write Data
        !           807:         * register and return. */
        !           808:        data = IXGB_READ_REG(hw, MSRWD);
        !           809:        data >>= IXGB_MSRWD_READ_DATA_SHIFT;
        !           810:        return ((uint16_t)data);
        !           811: }
        !           812:
        !           813: /******************************************************************************
        !           814:  * Writes a word to a device over the Management Data Interface (MDI) bus.
        !           815:  * This interface is used to manage Physical layer devices.
        !           816:  *
        !           817:  * hw          - Struct containing variables accessed by hw code
        !           818:  * reg_address - Offset of device register being read.
        !           819:  * phy_address - Address of device on MDI.
        !           820:  * device_type - Also known as the Device ID or DID.
        !           821:  * data        - 16-bit value to be written
        !           822:  *
        !           823:  * Returns:  void.
        !           824:  *
        !           825:  * The 82597EX has support for several MDI access methods.  This routine
        !           826:  * uses the new protocol MDI Single Command and Address Operation.
        !           827:  * This requires that first an address cycle command is sent, followed by a
        !           828:  * write command.
        !           829:  *****************************************************************************/
        !           830: void
        !           831: ixgb_write_phy_reg(struct ixgb_hw *hw, uint32_t reg_address,
        !           832:                    uint32_t phy_address, uint32_t device_type, uint16_t data)
        !           833: {
        !           834:        uint32_t i;
        !           835:        uint32_t command = 0;
        !           836:
        !           837:        ASSERT(reg_address <= IXGB_MAX_PHY_REG_ADDRESS);
        !           838:        ASSERT(phy_address <= IXGB_MAX_PHY_ADDRESS);
        !           839:        ASSERT(device_type <= IXGB_MAX_PHY_DEV_TYPE);
        !           840:
        !           841:        /* Put the data in the MDIO Read/Write Data register */
        !           842:        IXGB_WRITE_REG(hw, MSRWD, (uint32_t)data);
        !           843:
        !           844:        /* Setup and write the address cycle command */
        !           845:        command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT)  |
        !           846:                   (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
        !           847:                   (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
        !           848:                   (IXGB_MSCA_ADDR_CYCLE | IXGB_MSCA_MDI_COMMAND));
        !           849:
        !           850:        IXGB_WRITE_REG(hw, MSCA, command);
        !           851:
        !           852:     /**************************************************************
        !           853:     ** Check every 10 usec to see if the address cycle completed
        !           854:     ** The COMMAND bit will clear when the operation is complete.
        !           855:     ** This may take as long as 64 usecs (we'll wait 100 usecs max)
        !           856:     ** from the CPU Write to the Ready bit assertion.
        !           857:     **************************************************************/
        !           858:
        !           859:        for(i = 0; i < 10; i++) {
        !           860:                usec_delay(10);
        !           861:
        !           862:                command = IXGB_READ_REG(hw, MSCA);
        !           863:
        !           864:                if((command & IXGB_MSCA_MDI_COMMAND) == 0)
        !           865:                        break;
        !           866:        }
        !           867:
        !           868:        ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
        !           869:
        !           870:        /* Address cycle complete, setup and write the write command */
        !           871:        command = ((reg_address << IXGB_MSCA_NP_ADDR_SHIFT)  |
        !           872:                   (device_type << IXGB_MSCA_DEV_TYPE_SHIFT) |
        !           873:                   (phy_address << IXGB_MSCA_PHY_ADDR_SHIFT) |
        !           874:                   (IXGB_MSCA_WRITE | IXGB_MSCA_MDI_COMMAND));
        !           875:
        !           876:        IXGB_WRITE_REG(hw, MSCA, command);
        !           877:
        !           878:     /**************************************************************
        !           879:     ** Check every 10 usec to see if the read command completed
        !           880:     ** The COMMAND bit will clear when the operation is complete.
        !           881:     ** The write may take as long as 64 usecs (we'll wait 100 usecs max)
        !           882:     ** from the CPU Write to the Ready bit assertion.
        !           883:     **************************************************************/
        !           884:
        !           885:        for(i = 0; i < 10; i++) {
        !           886:                usec_delay(10);
        !           887:
        !           888:                command = IXGB_READ_REG(hw, MSCA);
        !           889:
        !           890:                if((command & IXGB_MSCA_MDI_COMMAND) == 0)
        !           891:                        break;
        !           892:        }
        !           893:
        !           894:        ASSERT((command & IXGB_MSCA_MDI_COMMAND) == 0);
        !           895:
        !           896:        /* Operation is complete, return. */
        !           897: }
        !           898:
        !           899: /******************************************************************************
        !           900:  * Checks to see if the link status of the hardware has changed.
        !           901:  *
        !           902:  * hw - Struct containing variables accessed by hw code
        !           903:  *
        !           904:  * Called by any function that needs to check the link status of the adapter.
        !           905:  *****************************************************************************/
        !           906: void
        !           907: ixgb_check_for_link(struct ixgb_hw *hw)
        !           908: {
        !           909:        uint32_t status_reg;
        !           910:        uint32_t xpcss_reg;
        !           911:
        !           912:        DEBUGFUNC("ixgb_check_for_link");
        !           913:
        !           914:        xpcss_reg = IXGB_READ_REG(hw, XPCSS);
        !           915:        status_reg = IXGB_READ_REG(hw, STATUS);
        !           916:
        !           917:        if((xpcss_reg & IXGB_XPCSS_ALIGN_STATUS) &&
        !           918:           (status_reg & IXGB_STATUS_LU)) {
        !           919:                hw->link_up = TRUE;
        !           920:        } else if(!(xpcss_reg & IXGB_XPCSS_ALIGN_STATUS) &&
        !           921:                  (status_reg & IXGB_STATUS_LU)) {
        !           922:                DEBUGOUT("XPCSS Not Aligned while Status:LU is set.\n");
        !           923:                hw->link_up = ixgb_link_reset(hw);
        !           924:        } else {
        !           925:                /*
        !           926:                 * 82597EX errata.  Since the lane deskew problem may prevent
        !           927:                 * link, reset the link before reporting link down.
        !           928:                 */
        !           929:                hw->link_up = ixgb_link_reset(hw);
        !           930:        }
        !           931:        /* Anything else for 10 Gig?? */
        !           932: }
        !           933:
        !           934: /******************************************************************************
        !           935:  * Check for a bad link condition that may have occured.
        !           936:  * The indication is that the RFC / LFC registers may be incrementing
        !           937:  * continually.  A full adapter reset is required to recover.
        !           938:  *
        !           939:  * hw - Struct containing variables accessed by hw code
        !           940:  *
        !           941:  * Called by any function that needs to check the link status of the adapter.
        !           942:  *****************************************************************************/
        !           943: boolean_t
        !           944: ixgb_check_for_bad_link(struct ixgb_hw *hw)
        !           945: {
        !           946:        uint32_t newLFC, newRFC;
        !           947:        boolean_t bad_link_returncode = FALSE;
        !           948:
        !           949:        if(hw->phy_type == ixgb_phy_type_txn17401) {
        !           950:                newLFC = IXGB_READ_REG(hw, LFC);
        !           951:                newRFC = IXGB_READ_REG(hw, RFC);
        !           952:                if((hw->lastLFC + 250 < newLFC) || (hw->lastRFC + 250 < newRFC)) {
        !           953:                        DEBUGOUT("BAD LINK! too many LFC/RFC since last check\n");
        !           954:                        bad_link_returncode = TRUE;
        !           955:                }
        !           956:                hw->lastLFC = newLFC;
        !           957:                hw->lastRFC = newRFC;
        !           958:        }
        !           959:
        !           960:        return bad_link_returncode;
        !           961: }
        !           962:
        !           963: /******************************************************************************
        !           964:  * Clears all hardware statistics counters.
        !           965:  *
        !           966:  * hw - Struct containing variables accessed by shared code
        !           967:  *****************************************************************************/
        !           968: void
        !           969: ixgb_clear_hw_cntrs(struct ixgb_hw *hw)
        !           970: {
        !           971:        volatile uint32_t temp_reg;
        !           972:
        !           973:        DEBUGFUNC("ixgb_clear_hw_cntrs");
        !           974:
        !           975:        /* if we are stopped or resetting exit gracefully */
        !           976:        if(hw->adapter_stopped) {
        !           977:                DEBUGOUT("Exiting because the adapter is stopped!!!\n");
        !           978:                return;
        !           979:        }
        !           980:
        !           981:        temp_reg = IXGB_READ_REG(hw, TPRL);
        !           982:        temp_reg = IXGB_READ_REG(hw, TPRH);
        !           983:        temp_reg = IXGB_READ_REG(hw, GPRCL);
        !           984:        temp_reg = IXGB_READ_REG(hw, GPRCH);
        !           985:        temp_reg = IXGB_READ_REG(hw, BPRCL);
        !           986:        temp_reg = IXGB_READ_REG(hw, BPRCH);
        !           987:        temp_reg = IXGB_READ_REG(hw, MPRCL);
        !           988:        temp_reg = IXGB_READ_REG(hw, MPRCH);
        !           989:        temp_reg = IXGB_READ_REG(hw, UPRCL);
        !           990:        temp_reg = IXGB_READ_REG(hw, UPRCH);
        !           991:        temp_reg = IXGB_READ_REG(hw, VPRCL);
        !           992:        temp_reg = IXGB_READ_REG(hw, VPRCH);
        !           993:        temp_reg = IXGB_READ_REG(hw, JPRCL);
        !           994:        temp_reg = IXGB_READ_REG(hw, JPRCH);
        !           995:        temp_reg = IXGB_READ_REG(hw, GORCL);
        !           996:        temp_reg = IXGB_READ_REG(hw, GORCH);
        !           997:        temp_reg = IXGB_READ_REG(hw, TORL);
        !           998:        temp_reg = IXGB_READ_REG(hw, TORH);
        !           999:        temp_reg = IXGB_READ_REG(hw, RNBC);
        !          1000:        temp_reg = IXGB_READ_REG(hw, RUC);
        !          1001:        temp_reg = IXGB_READ_REG(hw, ROC);
        !          1002:        temp_reg = IXGB_READ_REG(hw, RLEC);
        !          1003:        temp_reg = IXGB_READ_REG(hw, CRCERRS);
        !          1004:        temp_reg = IXGB_READ_REG(hw, ICBC);
        !          1005:        temp_reg = IXGB_READ_REG(hw, ECBC);
        !          1006:        temp_reg = IXGB_READ_REG(hw, MPC);
        !          1007:        temp_reg = IXGB_READ_REG(hw, TPTL);
        !          1008:        temp_reg = IXGB_READ_REG(hw, TPTH);
        !          1009:        temp_reg = IXGB_READ_REG(hw, GPTCL);
        !          1010:        temp_reg = IXGB_READ_REG(hw, GPTCH);
        !          1011:        temp_reg = IXGB_READ_REG(hw, BPTCL);
        !          1012:        temp_reg = IXGB_READ_REG(hw, BPTCH);
        !          1013:        temp_reg = IXGB_READ_REG(hw, MPTCL);
        !          1014:        temp_reg = IXGB_READ_REG(hw, MPTCH);
        !          1015:        temp_reg = IXGB_READ_REG(hw, UPTCL);
        !          1016:        temp_reg = IXGB_READ_REG(hw, UPTCH);
        !          1017:        temp_reg = IXGB_READ_REG(hw, VPTCL);
        !          1018:        temp_reg = IXGB_READ_REG(hw, VPTCH);
        !          1019:        temp_reg = IXGB_READ_REG(hw, JPTCL);
        !          1020:        temp_reg = IXGB_READ_REG(hw, JPTCH);
        !          1021:        temp_reg = IXGB_READ_REG(hw, GOTCL);
        !          1022:        temp_reg = IXGB_READ_REG(hw, GOTCH);
        !          1023:        temp_reg = IXGB_READ_REG(hw, TOTL);
        !          1024:        temp_reg = IXGB_READ_REG(hw, TOTH);
        !          1025:        temp_reg = IXGB_READ_REG(hw, DC);
        !          1026:        temp_reg = IXGB_READ_REG(hw, PLT64C);
        !          1027:        temp_reg = IXGB_READ_REG(hw, TSCTC);
        !          1028:        temp_reg = IXGB_READ_REG(hw, TSCTFC);
        !          1029:        temp_reg = IXGB_READ_REG(hw, IBIC);
        !          1030:        temp_reg = IXGB_READ_REG(hw, RFC);
        !          1031:        temp_reg = IXGB_READ_REG(hw, LFC);
        !          1032:        temp_reg = IXGB_READ_REG(hw, PFRC);
        !          1033:        temp_reg = IXGB_READ_REG(hw, PFTC);
        !          1034:        temp_reg = IXGB_READ_REG(hw, MCFRC);
        !          1035:        temp_reg = IXGB_READ_REG(hw, MCFTC);
        !          1036:        temp_reg = IXGB_READ_REG(hw, XONRXC);
        !          1037:        temp_reg = IXGB_READ_REG(hw, XONTXC);
        !          1038:        temp_reg = IXGB_READ_REG(hw, XOFFRXC);
        !          1039:        temp_reg = IXGB_READ_REG(hw, XOFFTXC);
        !          1040:        temp_reg = IXGB_READ_REG(hw, RJC);
        !          1041:        return;
        !          1042: }
        !          1043:
        !          1044: /******************************************************************************
        !          1045:  * Turns on the software controllable LED
        !          1046:  *
        !          1047:  * hw - Struct containing variables accessed by shared code
        !          1048:  *****************************************************************************/
        !          1049: void
        !          1050: ixgb_led_on(struct ixgb_hw *hw)
        !          1051: {
        !          1052:        uint32_t ctrl0_reg = IXGB_READ_REG(hw, CTRL0);
        !          1053:
        !          1054:        /* To turn on the LED, clear software-definable pin 0 (SDP0). */
        !          1055:        ctrl0_reg &= ~IXGB_CTRL0_SDP0;
        !          1056:        IXGB_WRITE_REG(hw, CTRL0, ctrl0_reg);
        !          1057:        return;
        !          1058: }
        !          1059:
        !          1060: /******************************************************************************
        !          1061:  * Turns off the software controllable LED
        !          1062:  *
        !          1063:  * hw - Struct containing variables accessed by shared code
        !          1064:  *****************************************************************************/
        !          1065: void
        !          1066: ixgb_led_off(struct ixgb_hw *hw)
        !          1067: {
        !          1068:        uint32_t ctrl0_reg = IXGB_READ_REG(hw, CTRL0);
        !          1069:
        !          1070:        /* To turn off the LED, set software-definable pin 0 (SDP0). */
        !          1071:        ctrl0_reg |= IXGB_CTRL0_SDP0;
        !          1072:        IXGB_WRITE_REG(hw, CTRL0, ctrl0_reg);
        !          1073:        return;
        !          1074: }
        !          1075:
        !          1076: /******************************************************************************
        !          1077:  * Gets the current PCI bus type, speed, and width of the hardware
        !          1078:  *
        !          1079:  * hw - Struct containing variables accessed by shared code
        !          1080:  *****************************************************************************/
        !          1081: static void
        !          1082: ixgb_get_bus_info(struct ixgb_hw *hw)
        !          1083: {
        !          1084:        uint32_t status_reg;
        !          1085:
        !          1086:        status_reg = IXGB_READ_REG(hw, STATUS);
        !          1087:
        !          1088:        hw->bus.type =
        !          1089:                (status_reg & IXGB_STATUS_PCIX_MODE) ? ixgb_bus_type_pcix :
        !          1090:                ixgb_bus_type_pci;
        !          1091:
        !          1092:        if(hw->bus.type == ixgb_bus_type_pci) {
        !          1093:                hw->bus.speed =
        !          1094:                        (status_reg & IXGB_STATUS_PCI_SPD) ? ixgb_bus_speed_66 :
        !          1095:                        ixgb_bus_speed_33;
        !          1096:        } else {
        !          1097:                switch(status_reg & IXGB_STATUS_PCIX_SPD_MASK) {
        !          1098:                case IXGB_STATUS_PCIX_SPD_66:
        !          1099:                        hw->bus.speed = ixgb_bus_speed_66;
        !          1100:                        break;
        !          1101:                case IXGB_STATUS_PCIX_SPD_100:
        !          1102:                        hw->bus.speed = ixgb_bus_speed_100;
        !          1103:                        break;
        !          1104:                case IXGB_STATUS_PCIX_SPD_133:
        !          1105:                        hw->bus.speed = ixgb_bus_speed_133;
        !          1106:                        break;
        !          1107:                default:
        !          1108:                        hw->bus.speed = ixgb_bus_speed_reserved;
        !          1109:                        break;
        !          1110:                }
        !          1111:        }
        !          1112:
        !          1113:        hw->bus.width =
        !          1114:                (status_reg & IXGB_STATUS_BUS64) ? ixgb_bus_width_64 :
        !          1115:                ixgb_bus_width_32;
        !          1116:
        !          1117:        return;
        !          1118: }
        !          1119:
        !          1120: /******************************************************************************
        !          1121:  * Tests a MAC address to ensure it is a valid Individual Address
        !          1122:  *
        !          1123:  * mac_addr - pointer to MAC address.
        !          1124:  *
        !          1125:  *****************************************************************************/
        !          1126: boolean_t
        !          1127: mac_addr_valid(uint8_t *mac_addr)
        !          1128: {
        !          1129:        boolean_t is_valid = TRUE;
        !          1130:
        !          1131:        DEBUGFUNC("mac_addr_valid");
        !          1132:
        !          1133:        /* Make sure it is not a multicast address */
        !          1134:        if(IS_MULTICAST(mac_addr)) {
        !          1135:                DEBUGOUT("MAC address is multicast\n");
        !          1136:                is_valid = FALSE;
        !          1137:        }
        !          1138:        /* Not a broadcast address */
        !          1139:        else if(IS_BROADCAST(mac_addr)) {
        !          1140:                DEBUGOUT("MAC address is broadcast\n");
        !          1141:                is_valid = FALSE;
        !          1142:        }
        !          1143:        /* Reject the zero address */
        !          1144:        else if (mac_addr[0] == 0 &&
        !          1145:                 mac_addr[1] == 0 &&
        !          1146:                 mac_addr[2] == 0 &&
        !          1147:                 mac_addr[3] == 0 &&
        !          1148:                 mac_addr[4] == 0 &&
        !          1149:                 mac_addr[5] == 0) {
        !          1150:                DEBUGOUT("MAC address is all zeros\n");
        !          1151:                is_valid = FALSE;
        !          1152:        }
        !          1153:        return (is_valid);
        !          1154: }
        !          1155:
        !          1156: /******************************************************************************
        !          1157:  * Resets the 10GbE link.  Waits the settle time and returns the state of
        !          1158:  * the link.
        !          1159:  *
        !          1160:  * hw - Struct containing variables accessed by shared code
        !          1161:  *****************************************************************************/
        !          1162: boolean_t
        !          1163: ixgb_link_reset(struct ixgb_hw *hw)
        !          1164: {
        !          1165:        boolean_t link_status = FALSE;
        !          1166:        uint8_t wait_retries = MAX_RESET_ITERATIONS;
        !          1167:        uint8_t lrst_retries = MAX_RESET_ITERATIONS;
        !          1168:
        !          1169:        do {
        !          1170:                /* Reset the link */
        !          1171:                IXGB_WRITE_REG(hw, CTRL0,
        !          1172:                               IXGB_READ_REG(hw, CTRL0) | IXGB_CTRL0_LRST);
        !          1173:
        !          1174:                /* Wait for link-up and lane re-alignment */
        !          1175:                do {
        !          1176:                        usec_delay(IXGB_DELAY_USECS_AFTER_LINK_RESET);
        !          1177:                        link_status =
        !          1178:                                ((IXGB_READ_REG(hw, STATUS) & IXGB_STATUS_LU) &&
        !          1179:                                 (IXGB_READ_REG(hw, XPCSS) &
        !          1180:                                  IXGB_XPCSS_ALIGN_STATUS)) ? TRUE : FALSE;
        !          1181:                } while(!link_status && --wait_retries);
        !          1182:
        !          1183:        } while(!link_status && --lrst_retries);
        !          1184:
        !          1185:        return link_status;
        !          1186: }
        !          1187:
        !          1188: /******************************************************************************
        !          1189:  * Resets the 10GbE optics module.
        !          1190:  *
        !          1191:  * hw - Struct containing variables accessed by shared code
        !          1192:  *****************************************************************************/
        !          1193: void
        !          1194: ixgb_optics_reset(struct ixgb_hw *hw)
        !          1195: {
        !          1196:        if(hw->phy_type == ixgb_phy_type_txn17401) {
        !          1197:                uint16_t mdio_reg;
        !          1198:
        !          1199:                ixgb_write_phy_reg(hw,
        !          1200:                                   MDIO_PMA_PMD_CR1,
        !          1201:                                   IXGB_PHY_ADDRESS,
        !          1202:                                   MDIO_PMA_PMD_DID,
        !          1203:                                   MDIO_PMA_PMD_CR1_RESET);
        !          1204:
        !          1205:                mdio_reg = ixgb_read_phy_reg(hw,
        !          1206:                                             MDIO_PMA_PMD_CR1,
        !          1207:                                             IXGB_PHY_ADDRESS,
        !          1208:                                             MDIO_PMA_PMD_DID);
        !          1209:        }
        !          1210:
        !          1211:        return;
        !          1212: }

CVSweb