[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

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