root/dev/pci/ixgb_ee.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ixgb_raise_clock
  2. ixgb_lower_clock
  3. ixgb_shift_out_bits
  4. ixgb_shift_in_bits
  5. ixgb_setup_eeprom
  6. ixgb_standby_eeprom
  7. ixgb_clock_eeprom
  8. ixgb_cleanup_eeprom
  9. ixgb_wait_eeprom_command
  10. ixgb_validate_eeprom_checksum
  11. ixgb_update_eeprom_checksum
  12. ixgb_write_eeprom
  13. ixgb_read_eeprom
  14. ixgb_get_eeprom_data
  15. ixgb_check_and_get_eeprom_data
  16. ixgb_get_eeprom_word
  17. ixgb_get_ee_mac_addr
  18. ixgb_get_ee_pba_number
  19. ixgb_get_ee_device_id

    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 

/* [<][>][^][v][top][bottom][index][help] */