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

Annotation of sys/dev/pci/ixgb_ee.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_ee.c,v 1.2 2007/06/26 10:30:05 tom Exp $ */
        !            35:
        !            36: #include <sys/param.h>
        !            37: #include <sys/systm.h>
        !            38: #include <sys/sockio.h>
        !            39: #include <sys/mbuf.h>
        !            40: #include <sys/malloc.h>
        !            41: #include <sys/kernel.h>
        !            42: #include <sys/device.h>
        !            43: #include <sys/socket.h>
        !            44:
        !            45: #include <net/if.h>
        !            46: #include <net/if_dl.h>
        !            47: #include <net/if_media.h>
        !            48:
        !            49: #ifdef INET
        !            50: #include <netinet/in.h>
        !            51: #include <netinet/in_systm.h>
        !            52: #include <netinet/in_var.h>
        !            53: #include <netinet/ip.h>
        !            54: #include <netinet/if_ether.h>
        !            55: #endif
        !            56:
        !            57: #include <uvm/uvm_extern.h>
        !            58:
        !            59: #include <dev/pci/pcireg.h>
        !            60: #include <dev/pci/pcivar.h>
        !            61: #include <dev/pci/pcidevs.h>
        !            62:
        !            63: #include <dev/pci/ixgb_hw.h>
        !            64: #include <dev/pci/ixgb_ee.h>
        !            65:
        !            66: /* Local prototypes */
        !            67: static uint16_t ixgb_shift_in_bits(struct ixgb_hw *hw);
        !            68:
        !            69: static void ixgb_shift_out_bits(struct ixgb_hw *hw, uint16_t data,
        !            70:                                 uint16_t count);
        !            71: static void ixgb_standby_eeprom(struct ixgb_hw *hw);
        !            72:
        !            73: static boolean_t ixgb_wait_eeprom_command(struct ixgb_hw *hw);
        !            74:
        !            75: static void ixgb_cleanup_eeprom(struct ixgb_hw *hw);
        !            76:
        !            77: /******************************************************************************
        !            78:  * Raises the EEPROM's clock input.
        !            79:  *
        !            80:  * hw - Struct containing variables accessed by shared code
        !            81:  * eecd_reg - EECD's current value
        !            82:  *****************************************************************************/
        !            83: static void
        !            84: ixgb_raise_clock(struct ixgb_hw *hw, uint32_t *eecd_reg)
        !            85: {
        !            86:        /* Raise the clock input to the EEPROM (by setting the SK bit), and
        !            87:         * then wait 50 microseconds. */
        !            88:        *eecd_reg = *eecd_reg | IXGB_EECD_SK;
        !            89:        IXGB_WRITE_REG(hw, EECD, *eecd_reg);
        !            90:        usec_delay(50);
        !            91:        return;
        !            92: }
        !            93:
        !            94: /******************************************************************************
        !            95:  * Lowers the EEPROM's clock input.
        !            96:  *
        !            97:  * hw - Struct containing variables accessed by shared code
        !            98:  * eecd_reg - EECD's current value
        !            99:  *****************************************************************************/
        !           100: static void
        !           101: ixgb_lower_clock(struct ixgb_hw *hw, uint32_t *eecd_reg)
        !           102: {
        !           103:        /* Lower the clock input to the EEPROM (by clearing the SK bit), and
        !           104:         * then wait 50 microseconds. */
        !           105:        *eecd_reg = *eecd_reg & ~IXGB_EECD_SK;
        !           106:        IXGB_WRITE_REG(hw, EECD, *eecd_reg);
        !           107:        usec_delay(50);
        !           108:        return;
        !           109: }
        !           110:
        !           111: /******************************************************************************
        !           112:  * Shift data bits out to the EEPROM.
        !           113:  *
        !           114:  * hw - Struct containing variables accessed by shared code
        !           115:  * data - data to send to the EEPROM
        !           116:  * count - number of bits to shift out
        !           117:  *****************************************************************************/
        !           118: static void
        !           119: ixgb_shift_out_bits(struct ixgb_hw *hw, uint16_t data, uint16_t count)
        !           120: {
        !           121:        uint32_t eecd_reg;
        !           122:        uint32_t mask;
        !           123:
        !           124:        /* We need to shift "count" bits out to the EEPROM. So, value in the
        !           125:         * "data" parameter will be shifted out to the EEPROM one bit at a
        !           126:         * time. In order to do this, "data" must be broken down into bits. */
        !           127:        mask = 0x01 << (count - 1);
        !           128:        eecd_reg = IXGB_READ_REG(hw, EECD);
        !           129:        eecd_reg &= ~(IXGB_EECD_DO | IXGB_EECD_DI);
        !           130:        do {
        !           131:                /* A "1" is shifted out to the EEPROM by setting bit "DI" to a
        !           132:                 * "1", and then raising and then lowering the clock (the SK
        !           133:                 * bit controls the clock input to the EEPROM).  A "0" is
        !           134:                 * shifted out to the EEPROM by setting "DI" to "0" and then
        !           135:                 * raising and then lowering the clock. */
        !           136:                eecd_reg &= ~IXGB_EECD_DI;
        !           137:
        !           138:                if(data & mask)
        !           139:                        eecd_reg |= IXGB_EECD_DI;
        !           140:
        !           141:                IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           142:
        !           143:                usec_delay(50);
        !           144:
        !           145:                ixgb_raise_clock(hw, &eecd_reg);
        !           146:                ixgb_lower_clock(hw, &eecd_reg);
        !           147:
        !           148:                mask = mask >> 1;
        !           149:
        !           150:        } while(mask);
        !           151:
        !           152:        /* We leave the "DI" bit set to "0" when we leave this routine. */
        !           153:        eecd_reg &= ~IXGB_EECD_DI;
        !           154:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           155:        return;
        !           156: }
        !           157:
        !           158: /******************************************************************************
        !           159:  * Shift data bits in from the EEPROM
        !           160:  *
        !           161:  * hw - Struct containing variables accessed by shared code
        !           162:  *****************************************************************************/
        !           163: static uint16_t
        !           164: ixgb_shift_in_bits(struct ixgb_hw *hw)
        !           165: {
        !           166:        uint32_t eecd_reg;
        !           167:        uint32_t i;
        !           168:        uint16_t data;
        !           169:
        !           170:        /* In order to read a register from the EEPROM, we need to shift 16
        !           171:         * bits in from the EEPROM. Bits are "shifted in" by raising the clock
        !           172:         * input to the EEPROM (setting the SK bit), and then reading the value
        !           173:         * of the "DO" bit.  During this "shifting in" process the "DI" bit
        !           174:         * should always be clear.. */
        !           175:
        !           176:        eecd_reg = IXGB_READ_REG(hw, EECD);
        !           177:
        !           178:        eecd_reg &= ~(IXGB_EECD_DO | IXGB_EECD_DI);
        !           179:        data = 0;
        !           180:
        !           181:        for(i = 0; i < 16; i++) {
        !           182:                data = data << 1;
        !           183:                ixgb_raise_clock(hw, &eecd_reg);
        !           184:
        !           185:                eecd_reg = IXGB_READ_REG(hw, EECD);
        !           186:
        !           187:                eecd_reg &= ~(IXGB_EECD_DI);
        !           188:                if(eecd_reg & IXGB_EECD_DO)
        !           189:                        data |= 1;
        !           190:
        !           191:                ixgb_lower_clock(hw, &eecd_reg);
        !           192:        }
        !           193:
        !           194:        return data;
        !           195: }
        !           196:
        !           197: /******************************************************************************
        !           198:  * Prepares EEPROM for access
        !           199:  *
        !           200:  * hw - Struct containing variables accessed by shared code
        !           201:  *
        !           202:  * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This
        !           203:  * function should be called before issuing a command to the EEPROM.
        !           204:  *****************************************************************************/
        !           205: static void
        !           206: ixgb_setup_eeprom(struct ixgb_hw *hw)
        !           207: {
        !           208:        uint32_t eecd_reg;
        !           209:
        !           210:        eecd_reg = IXGB_READ_REG(hw, EECD);
        !           211:
        !           212:        /* Clear SK and DI */
        !           213:        eecd_reg &= ~(IXGB_EECD_SK | IXGB_EECD_DI);
        !           214:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           215:
        !           216:        /* Set CS */
        !           217:        eecd_reg |= IXGB_EECD_CS;
        !           218:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           219:        return;
        !           220: }
        !           221:
        !           222: /******************************************************************************
        !           223:  * Returns EEPROM to a "standby" state
        !           224:  *
        !           225:  * hw - Struct containing variables accessed by shared code
        !           226:  *****************************************************************************/
        !           227: static void
        !           228: ixgb_standby_eeprom(struct ixgb_hw *hw)
        !           229: {
        !           230:        uint32_t eecd_reg;
        !           231:
        !           232:        eecd_reg = IXGB_READ_REG(hw, EECD);
        !           233:
        !           234:        /* Deselct EEPROM */
        !           235:        eecd_reg &= ~(IXGB_EECD_CS | IXGB_EECD_SK);
        !           236:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           237:        usec_delay(50);
        !           238:
        !           239:        /* Clock high */
        !           240:        eecd_reg |= IXGB_EECD_SK;
        !           241:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           242:        usec_delay(50);
        !           243:
        !           244:        /* Select EEPROM */
        !           245:        eecd_reg |= IXGB_EECD_CS;
        !           246:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           247:        usec_delay(50);
        !           248:
        !           249:        /* Clock low */
        !           250:        eecd_reg &= ~IXGB_EECD_SK;
        !           251:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           252:        usec_delay(50);
        !           253:        return;
        !           254: }
        !           255:
        !           256: /******************************************************************************
        !           257:  * Raises then lowers the EEPROM's clock pin
        !           258:  *
        !           259:  * hw - Struct containing variables accessed by shared code
        !           260:  *****************************************************************************/
        !           261: static void
        !           262: ixgb_clock_eeprom(struct ixgb_hw *hw)
        !           263: {
        !           264:        uint32_t eecd_reg;
        !           265:
        !           266:        eecd_reg = IXGB_READ_REG(hw, EECD);
        !           267:
        !           268:        /* Rising edge of clock */
        !           269:        eecd_reg |= IXGB_EECD_SK;
        !           270:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           271:        usec_delay(50);
        !           272:
        !           273:        /* Falling edge of clock */
        !           274:        eecd_reg &= ~IXGB_EECD_SK;
        !           275:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           276:        usec_delay(50);
        !           277:        return;
        !           278: }
        !           279:
        !           280: /******************************************************************************
        !           281:  * Terminates a command by lowering the EEPROM's chip select pin
        !           282:  *
        !           283:  * hw - Struct containing variables accessed by shared code
        !           284:  *****************************************************************************/
        !           285: static void
        !           286: ixgb_cleanup_eeprom(struct ixgb_hw *hw)
        !           287: {
        !           288:        uint32_t eecd_reg;
        !           289:
        !           290:        eecd_reg = IXGB_READ_REG(hw, EECD);
        !           291:
        !           292:        eecd_reg &= ~(IXGB_EECD_CS | IXGB_EECD_DI);
        !           293:
        !           294:        IXGB_WRITE_REG(hw, EECD, eecd_reg);
        !           295:
        !           296:        ixgb_clock_eeprom(hw);
        !           297:        return;
        !           298: }
        !           299:
        !           300: /******************************************************************************
        !           301:  * Waits for the EEPROM to finish the current command.
        !           302:  *
        !           303:  * hw - Struct containing variables accessed by shared code
        !           304:  *
        !           305:  * The command is done when the EEPROM's data out pin goes high.
        !           306:  *
        !           307:  * Returns:
        !           308:  *      TRUE: EEPROM data pin is high before timeout.
        !           309:  *      FALSE:  Time expired.
        !           310:  *****************************************************************************/
        !           311: static boolean_t
        !           312: ixgb_wait_eeprom_command(struct ixgb_hw *hw)
        !           313: {
        !           314:        uint32_t eecd_reg;
        !           315:        uint32_t i;
        !           316:
        !           317:        /* Toggle the CS line.  This in effect tells to EEPROM to actually
        !           318:         * execute the command in question. */
        !           319:        ixgb_standby_eeprom(hw);
        !           320:
        !           321:        /* Now read DO repeatedly until is high (equal to '1').  The EEEPROM
        !           322:         * will signal that the command has been completed by raising the DO
        !           323:         * signal. If DO does not go high in 10 milliseconds, then error out. */
        !           324:        for(i = 0; i < 200; i++) {
        !           325:                eecd_reg = IXGB_READ_REG(hw, EECD);
        !           326:
        !           327:                if(eecd_reg & IXGB_EECD_DO)
        !           328:                        return (TRUE);
        !           329:
        !           330:                usec_delay(50);
        !           331:        }
        !           332:        ASSERT(0);
        !           333:        return (FALSE);
        !           334: }
        !           335:
        !           336: /******************************************************************************
        !           337:  * Verifies that the EEPROM has a valid checksum
        !           338:  *
        !           339:  * hw - Struct containing variables accessed by shared code
        !           340:  *
        !           341:  * Reads the first 64 16 bit words of the EEPROM and sums the values read.
        !           342:  * If the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is
        !           343:  * valid.
        !           344:  *
        !           345:  * Returns:
        !           346:  *  TRUE: Checksum is valid
        !           347:  *  FALSE: Checksum is not valid.
        !           348:  *****************************************************************************/
        !           349: boolean_t
        !           350: ixgb_validate_eeprom_checksum(struct ixgb_hw *hw)
        !           351: {
        !           352:        uint16_t checksum = 0;
        !           353:        uint16_t i;
        !           354:
        !           355:        for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++)
        !           356:                checksum += ixgb_read_eeprom(hw, i);
        !           357:
        !           358:        if(checksum == (uint16_t)EEPROM_SUM)
        !           359:                return (TRUE);
        !           360:        else
        !           361:                return (FALSE);
        !           362: }
        !           363:
        !           364: /******************************************************************************
        !           365:  * Calculates the EEPROM checksum and writes it to the EEPROM
        !           366:  *
        !           367:  * hw - Struct containing variables accessed by shared code
        !           368:  *
        !           369:  * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
        !           370:  * Writes the difference to word offset 63 of the EEPROM.
        !           371:  *****************************************************************************/
        !           372: void
        !           373: ixgb_update_eeprom_checksum(struct ixgb_hw *hw)
        !           374: {
        !           375:        uint16_t checksum = 0;
        !           376:        uint16_t i;
        !           377:
        !           378:        for(i = 0; i < EEPROM_CHECKSUM_REG; i++)
        !           379:                checksum += ixgb_read_eeprom(hw, i);
        !           380:
        !           381:        checksum = (uint16_t)EEPROM_SUM - checksum;
        !           382:
        !           383:        ixgb_write_eeprom(hw, EEPROM_CHECKSUM_REG, checksum);
        !           384:        return;
        !           385: }
        !           386:
        !           387: /******************************************************************************
        !           388:  * Writes a 16 bit word to a given offset in the EEPROM.
        !           389:  *
        !           390:  * hw - Struct containing variables accessed by shared code
        !           391:  * reg - offset within the EEPROM to be written to
        !           392:  * data - 16 bit word to be writen to the EEPROM
        !           393:  *
        !           394:  * If ixgb_update_eeprom_checksum is not called after this function, the
        !           395:  * EEPROM will most likely contain an invalid checksum.
        !           396:  *
        !           397:  *****************************************************************************/
        !           398: void
        !           399: ixgb_write_eeprom(struct ixgb_hw *hw, uint16_t offset, uint16_t data)
        !           400: {
        !           401:        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
        !           402:
        !           403:        /* Prepare the EEPROM for writing */
        !           404:        ixgb_setup_eeprom(hw);
        !           405:
        !           406:        /* Send the 9-bit EWEN (write enable) command to the EEPROM (5-bit
        !           407:         * opcode plus 4-bit dummy).  This puts the EEPROM into write/erase
        !           408:         * mode. */
        !           409:        ixgb_shift_out_bits(hw, EEPROM_EWEN_OPCODE, 5);
        !           410:        ixgb_shift_out_bits(hw, 0, 4);
        !           411:
        !           412:        /* Prepare the EEPROM */
        !           413:        ixgb_standby_eeprom(hw);
        !           414:
        !           415:        /* Send the Write command (3-bit opcode + 6-bit addr) */
        !           416:        ixgb_shift_out_bits(hw, EEPROM_WRITE_OPCODE, 3);
        !           417:        ixgb_shift_out_bits(hw, offset, 6);
        !           418:
        !           419:        /* Send the data */
        !           420:        ixgb_shift_out_bits(hw, data, 16);
        !           421:
        !           422:        ixgb_wait_eeprom_command(hw);
        !           423:
        !           424:        /* Recover from write */
        !           425:        ixgb_standby_eeprom(hw);
        !           426:
        !           427:        /* Send the 9-bit EWDS (write disable) command to the EEPROM (5-bit
        !           428:         * opcode plus 4-bit dummy).  This takes the EEPROM out of write/erase
        !           429:         * mode. */
        !           430:        ixgb_shift_out_bits(hw, EEPROM_EWDS_OPCODE, 5);
        !           431:        ixgb_shift_out_bits(hw, 0, 4);
        !           432:
        !           433:        /* Done with writing */
        !           434:        ixgb_cleanup_eeprom(hw);
        !           435:
        !           436:        /* clear the init_ctrl_reg_1 to signify that the cache is invalidated */
        !           437:        ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);
        !           438:
        !           439:        return;
        !           440: }
        !           441:
        !           442: /******************************************************************************
        !           443:  * Reads a 16 bit word from the EEPROM.
        !           444:  *
        !           445:  * hw - Struct containing variables accessed by shared code
        !           446:  * offset - offset of 16 bit word in the EEPROM to read
        !           447:  *
        !           448:  * Returns:
        !           449:  *  The 16-bit value read from the eeprom
        !           450:  *****************************************************************************/
        !           451: uint16_t
        !           452: ixgb_read_eeprom(struct ixgb_hw *hw, uint16_t offset)
        !           453: {
        !           454:        uint16_t data;
        !           455:
        !           456:        /* Prepare the EEPROM for reading */
        !           457:        ixgb_setup_eeprom(hw);
        !           458:
        !           459:        /* Send the READ command (opcode + addr) */
        !           460:        ixgb_shift_out_bits(hw, EEPROM_READ_OPCODE, 3);
        !           461:        /*
        !           462:         * We have a 64 word EEPROM, there are 6 address bits
        !           463:         */
        !           464:        ixgb_shift_out_bits(hw, offset, 6);
        !           465:
        !           466:        /* Read the data */
        !           467:        data = ixgb_shift_in_bits(hw);
        !           468:
        !           469:        /* End this read operation */
        !           470:        ixgb_standby_eeprom(hw);
        !           471:
        !           472:        return (data);
        !           473: }
        !           474:
        !           475: /******************************************************************************
        !           476:  * Reads eeprom and stores data in shared structure.
        !           477:  * Validates eeprom checksum and eeprom signature.
        !           478:  *
        !           479:  * hw - Struct containing variables accessed by shared code
        !           480:  *
        !           481:  * Returns:
        !           482:  *      TRUE: if eeprom read is successful
        !           483:  *      FALSE: otherwise.
        !           484:  *****************************************************************************/
        !           485: boolean_t
        !           486: ixgb_get_eeprom_data(struct ixgb_hw *hw)
        !           487: {
        !           488:        uint16_t i;
        !           489:        uint16_t checksum = 0;
        !           490:        struct ixgb_ee_map_type *ee_map;
        !           491:
        !           492:        DEBUGFUNC("ixgb_get_eeprom_data");
        !           493:
        !           494:        ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
        !           495:
        !           496:        DEBUGOUT("ixgb_ee: Reading eeprom data\n");
        !           497:        for(i = 0; i < IXGB_EEPROM_SIZE; i++) {
        !           498:                uint16_t ee_data;
        !           499:
        !           500:                ee_data = ixgb_read_eeprom(hw, i);
        !           501:                checksum += ee_data;
        !           502:                hw->eeprom[i] = le16_to_cpu(ee_data);
        !           503:        }
        !           504:
        !           505:        if(checksum != (uint16_t)EEPROM_SUM) {
        !           506:                DEBUGOUT("ixgb_ee: Checksum invalid.\n");
        !           507:                /* clear the init_ctrl_reg_1 to signify that the cache is
        !           508:                 * invalidated */
        !           509:                ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);
        !           510:                return (FALSE);
        !           511:        }
        !           512:
        !           513:        if((ee_map->init_ctrl_reg_1 & le16_to_cpu(EEPROM_ICW1_SIGNATURE_MASK))
        !           514:           != le16_to_cpu(EEPROM_ICW1_SIGNATURE_VALID)) {
        !           515:                DEBUGOUT("ixgb_ee: Signature invalid.\n");
        !           516:                return (FALSE);
        !           517:        }
        !           518:
        !           519:        return (TRUE);
        !           520: }
        !           521:
        !           522: /******************************************************************************
        !           523:  * Local function to check if the eeprom signature is good
        !           524:  * If the eeprom signature is good, calls ixgb)get_eeprom_data.
        !           525:  *
        !           526:  * hw - Struct containing variables accessed by shared code
        !           527:  *
        !           528:  * Returns:
        !           529:  *      TRUE: eeprom signature was good and the eeprom read was successful
        !           530:  *      FALSE: otherwise.
        !           531:  ******************************************************************************/
        !           532: static boolean_t
        !           533: ixgb_check_and_get_eeprom_data(struct ixgb_hw *hw)
        !           534: {
        !           535:        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
        !           536:
        !           537:        if((ee_map->init_ctrl_reg_1 & le16_to_cpu(EEPROM_ICW1_SIGNATURE_MASK))
        !           538:           == le16_to_cpu(EEPROM_ICW1_SIGNATURE_VALID)) {
        !           539:                return (TRUE);
        !           540:        } else {
        !           541:                return ixgb_get_eeprom_data(hw);
        !           542:        }
        !           543: }
        !           544:
        !           545: /******************************************************************************
        !           546:  * return a word from the eeprom
        !           547:  *
        !           548:  * hw - Struct containing variables accessed by shared code
        !           549:  * index - Offset of eeprom word
        !           550:  *
        !           551:  * Returns:
        !           552:  *          Word at indexed offset in eeprom, if valid, 0 otherwise.
        !           553:  ******************************************************************************/
        !           554: uint16_t
        !           555: ixgb_get_eeprom_word(struct ixgb_hw *hw, uint16_t index)
        !           556: {
        !           557:
        !           558:        if((index < IXGB_EEPROM_SIZE) &&
        !           559:           (ixgb_check_and_get_eeprom_data(hw) == TRUE)) {
        !           560:                return (hw->eeprom[index]);
        !           561:        }
        !           562:
        !           563:        return (0);
        !           564: }
        !           565:
        !           566: /******************************************************************************
        !           567:  * return the mac address from EEPROM
        !           568:  *
        !           569:  * hw       - Struct containing variables accessed by shared code
        !           570:  * mac_addr - Ethernet Address if EEPROM contents are valid, 0 otherwise
        !           571:  *
        !           572:  * Returns: None.
        !           573:  ******************************************************************************/
        !           574: void
        !           575: ixgb_get_ee_mac_addr(struct ixgb_hw *hw, uint8_t *mac_addr)
        !           576: {
        !           577:        int i;
        !           578:        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
        !           579:
        !           580:        DEBUGFUNC("ixgb_get_ee_mac_addr");
        !           581:
        !           582:        if(ixgb_check_and_get_eeprom_data(hw) == TRUE) {
        !           583:                for(i = 0; i < IXGB_ETH_LENGTH_OF_ADDRESS; i++) {
        !           584:                        mac_addr[i] = ee_map->mac_addr[i];
        !           585:                        DEBUGOUT2("mac(%d) = %.2X\n", i, mac_addr[i]);
        !           586:                }
        !           587:        }
        !           588: }
        !           589:
        !           590:
        !           591: /******************************************************************************
        !           592:  * return the Printed Board Assembly number from EEPROM
        !           593:  *
        !           594:  * hw - Struct containing variables accessed by shared code
        !           595:  *
        !           596:  * Returns:
        !           597:  *          PBA number if EEPROM contents are valid, 0 otherwise
        !           598:  ******************************************************************************/
        !           599: uint32_t
        !           600: ixgb_get_ee_pba_number(struct ixgb_hw *hw)
        !           601: {
        !           602:        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
        !           603:                return (le16_to_cpu(hw->eeprom[EEPROM_PBA_1_2_REG])
        !           604:                        | (le16_to_cpu(hw->eeprom[EEPROM_PBA_3_4_REG]) << 16));
        !           605:
        !           606:        return (0);
        !           607: }
        !           608:
        !           609:
        !           610: /******************************************************************************
        !           611:  * return the Device Id from EEPROM
        !           612:  *
        !           613:  * hw - Struct containing variables accessed by shared code
        !           614:  *
        !           615:  * Returns:
        !           616:  *          Device Id if EEPROM contents are valid, 0 otherwise
        !           617:  ******************************************************************************/
        !           618: uint16_t
        !           619: ixgb_get_ee_device_id(struct ixgb_hw *hw)
        !           620: {
        !           621:        struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;
        !           622:
        !           623:        if(ixgb_check_and_get_eeprom_data(hw) == TRUE)
        !           624:                return (le16_to_cpu(ee_map->device_id));
        !           625:
        !           626:        return (0);
        !           627: }
        !           628:

CVSweb