1 /******************************************************************************
   2 
   3   Copyright (c) 2001-2013, 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 /*$FreeBSD$*/
  34 
  35 #include "e1000_api.h"
  36 
  37 
  38 static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw);
  39 static void e1000_release_nvm_i210(struct e1000_hw *hw);
  40 static s32 e1000_get_hw_semaphore_i210(struct e1000_hw *hw);
  41 static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
  42                                 u16 *data);
  43 static s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw);
  44 static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data);
  45 static s32 e1000_read_nvm_i211(struct e1000_hw *hw, u16 offset, u16 words,
  46                                u16 *data);
  47 
  48 /**
  49  *  e1000_acquire_nvm_i210 - Request for access to EEPROM
  50  *  @hw: pointer to the HW structure
  51  *
  52  *  Acquire the necessary semaphores for exclusive access to the EEPROM.
  53  *  Set the EEPROM access request bit and wait for EEPROM access grant bit.
  54  *  Return successful if access grant bit set, else clear the request for
  55  *  EEPROM access and return -E1000_ERR_NVM (-1).
  56  **/
  57 static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw)
  58 {
  59         s32 ret_val;
  60 
  61         DEBUGFUNC("e1000_acquire_nvm_i210");
  62 
  63         ret_val = e1000_acquire_swfw_sync_i210(hw, E1000_SWFW_EEP_SM);
  64 
  65         return ret_val;
  66 }
  67 
  68 /**
  69  *  e1000_release_nvm_i210 - Release exclusive access to EEPROM
  70  *  @hw: pointer to the HW structure
  71  *
  72  *  Stop any current commands to the EEPROM and clear the EEPROM request bit,
  73  *  then release the semaphores acquired.
  74  **/
  75 static void e1000_release_nvm_i210(struct e1000_hw *hw)
  76 {
  77         DEBUGFUNC("e1000_release_nvm_i210");
  78 
  79         e1000_release_swfw_sync_i210(hw, E1000_SWFW_EEP_SM);
  80 }
  81 
  82 /**
  83  *  e1000_acquire_swfw_sync_i210 - Acquire SW/FW semaphore
  84  *  @hw: pointer to the HW structure
  85  *  @mask: specifies which semaphore to acquire
  86  *
  87  *  Acquire the SW/FW semaphore to access the PHY or NVM.  The mask
  88  *  will also specify which port we're acquiring the lock for.
  89  **/
  90 s32 e1000_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
  91 {
  92         u32 swfw_sync;
  93         u32 swmask = mask;
  94         u32 fwmask = mask << 16;
  95         s32 ret_val = E1000_SUCCESS;
  96         s32 i = 0, timeout = 200; /* FIXME: find real value to use here */
  97 
  98         DEBUGFUNC("e1000_acquire_swfw_sync_i210");
  99 
 100         while (i < timeout) {
 101                 if (e1000_get_hw_semaphore_i210(hw)) {
 102                         ret_val = -E1000_ERR_SWFW_SYNC;
 103                         goto out;
 104                 }
 105 
 106                 swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC);
 107                 if (!(swfw_sync & (fwmask | swmask)))
 108                         break;
 109 
 110                 /*
 111                  * Firmware currently using resource (fwmask)
 112                  * or other software thread using resource (swmask)
 113                  */
 114                 e1000_put_hw_semaphore_generic(hw);
 115                 msec_delay_irq(5);
 116                 i++;
 117         }
 118 
 119         if (i == timeout) {
 120                 DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n");
 121                 ret_val = -E1000_ERR_SWFW_SYNC;
 122                 goto out;
 123         }
 124 
 125         swfw_sync |= swmask;
 126         E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
 127 
 128         e1000_put_hw_semaphore_generic(hw);
 129 
 130 out:
 131         return ret_val;
 132 }
 133 
 134 /**
 135  *  e1000_release_swfw_sync_i210 - Release SW/FW semaphore
 136  *  @hw: pointer to the HW structure
 137  *  @mask: specifies which semaphore to acquire
 138  *
 139  *  Release the SW/FW semaphore used to access the PHY or NVM.  The mask
 140  *  will also specify which port we're releasing the lock for.
 141  **/
 142 void e1000_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
 143 {
 144         u32 swfw_sync;
 145 
 146         DEBUGFUNC("e1000_release_swfw_sync_i210");
 147 
 148         while (e1000_get_hw_semaphore_i210(hw) != E1000_SUCCESS)
 149                 ; /* Empty */
 150 
 151         swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC);
 152         swfw_sync &= ~mask;
 153         E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
 154 
 155         e1000_put_hw_semaphore_generic(hw);
 156 }
 157 
 158 /**
 159  *  e1000_get_hw_semaphore_i210 - Acquire hardware semaphore
 160  *  @hw: pointer to the HW structure
 161  *
 162  *  Acquire the HW semaphore to access the PHY or NVM
 163  **/
 164 static s32 e1000_get_hw_semaphore_i210(struct e1000_hw *hw)
 165 {
 166         u32 swsm;
 167         s32 timeout = hw->nvm.word_size + 1;
 168         s32 i = 0;
 169 
 170         DEBUGFUNC("e1000_get_hw_semaphore_i210");
 171 
 172         /* Get the SW semaphore */
 173         while (i < timeout) {
 174                 swsm = E1000_READ_REG(hw, E1000_SWSM);
 175                 if (!(swsm & E1000_SWSM_SMBI))
 176                         break;
 177 
 178                 usec_delay(50);
 179                 i++;
 180         }
 181 
 182         if (i == timeout) {
 183                 /*
 184                  * In rare circumstances, the driver may not have released the
 185                  * SW semaphore. Clear the semaphore once before giving up.
 186                  */
 187                 if (hw->dev_spec._82575.clear_semaphore_once) {
 188                         hw->dev_spec._82575.clear_semaphore_once = FALSE;
 189                         e1000_put_hw_semaphore_generic(hw);
 190                         for (i = 0; i < timeout; i++) {
 191                                 swsm = E1000_READ_REG(hw, E1000_SWSM);
 192                                 if (!(swsm & E1000_SWSM_SMBI))
 193                                         break;
 194 
 195                                 usec_delay(50);
 196                         }
 197                 }
 198 
 199                 /* If we do not have the semaphore here, we have to give up. */
 200                 if (i == timeout) {
 201                         DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
 202                         return -E1000_ERR_NVM;
 203                 }
 204         }
 205 
 206         /* Get the FW semaphore. */
 207         for (i = 0; i < timeout; i++) {
 208                 swsm = E1000_READ_REG(hw, E1000_SWSM);
 209                 E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI);
 210 
 211                 /* Semaphore acquired if bit latched */
 212                 if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI)
 213                         break;
 214 
 215                 usec_delay(50);
 216         }
 217 
 218         if (i == timeout) {
 219                 /* Release semaphores */
 220                 e1000_put_hw_semaphore_generic(hw);
 221                 DEBUGOUT("Driver can't access the NVM\n");
 222                 return -E1000_ERR_NVM;
 223         }
 224 
 225         return E1000_SUCCESS;
 226 }
 227 
 228 /**
 229  *  e1000_read_nvm_srrd_i210 - Reads Shadow Ram using EERD register
 230  *  @hw: pointer to the HW structure
 231  *  @offset: offset of word in the Shadow Ram to read
 232  *  @words: number of words to read
 233  *  @data: word read from the Shadow Ram
 234  *
 235  *  Reads a 16 bit word from the Shadow Ram using the EERD register.
 236  *  Uses necessary synchronization semaphores.
 237  **/
 238 s32 e1000_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, u16 words,
 239                              u16 *data)
 240 {
 241         s32 status = E1000_SUCCESS;
 242         u16 i, count;
 243 
 244         DEBUGFUNC("e1000_read_nvm_srrd_i210");
 245 
 246         /* We cannot hold synchronization semaphores for too long,
 247          * because of forceful takeover procedure. However it is more efficient
 248          * to read in bursts than synchronizing access for each word. */
 249         for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
 250                 count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
 251                         E1000_EERD_EEWR_MAX_COUNT : (words - i);
 252                 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
 253                         status = e1000_read_nvm_eerd(hw, offset, count,
 254                                                      data + i);
 255                         hw->nvm.ops.release(hw);
 256                 } else {
 257                         status = E1000_ERR_SWFW_SYNC;
 258                 }
 259 
 260                 if (status != E1000_SUCCESS)
 261                         break;
 262         }
 263 
 264         return status;
 265 }
 266 
 267 /**
 268  *  e1000_write_nvm_srwr_i210 - Write to Shadow RAM using EEWR
 269  *  @hw: pointer to the HW structure
 270  *  @offset: offset within the Shadow RAM to be written to
 271  *  @words: number of words to write
 272  *  @data: 16 bit word(s) to be written to the Shadow RAM
 273  *
 274  *  Writes data to Shadow RAM at offset using EEWR register.
 275  *
 276  *  If e1000_update_nvm_checksum is not called after this function , the
 277  *  data will not be committed to FLASH and also Shadow RAM will most likely
 278  *  contain an invalid checksum.
 279  *
 280  *  If error code is returned, data and Shadow RAM may be inconsistent - buffer
 281  *  partially written.
 282  **/
 283 s32 e1000_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, u16 words,
 284                               u16 *data)
 285 {
 286         s32 status = E1000_SUCCESS;
 287         u16 i, count;
 288 
 289         DEBUGFUNC("e1000_write_nvm_srwr_i210");
 290 
 291         /* We cannot hold synchronization semaphores for too long,
 292          * because of forceful takeover procedure. However it is more efficient
 293          * to write in bursts than synchronizing access for each word. */
 294         for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
 295                 count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
 296                         E1000_EERD_EEWR_MAX_COUNT : (words - i);
 297                 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
 298                         status = e1000_write_nvm_srwr(hw, offset, count,
 299                                                       data + i);
 300                         hw->nvm.ops.release(hw);
 301                 } else {
 302                         status = E1000_ERR_SWFW_SYNC;
 303                 }
 304 
 305                 if (status != E1000_SUCCESS)
 306                         break;
 307         }
 308 
 309         return status;
 310 }
 311 
 312 /**
 313  *  e1000_write_nvm_srwr - Write to Shadow Ram using EEWR
 314  *  @hw: pointer to the HW structure
 315  *  @offset: offset within the Shadow Ram to be written to
 316  *  @words: number of words to write
 317  *  @data: 16 bit word(s) to be written to the Shadow Ram
 318  *
 319  *  Writes data to Shadow Ram at offset using EEWR register.
 320  *
 321  *  If e1000_update_nvm_checksum is not called after this function , the
 322  *  Shadow Ram will most likely contain an invalid checksum.
 323  **/
 324 static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
 325                                 u16 *data)
 326 {
 327         struct e1000_nvm_info *nvm = &hw->nvm;
 328         u32 i, k, eewr = 0;
 329         u32 attempts = 100000;
 330         s32 ret_val = E1000_SUCCESS;
 331 
 332         DEBUGFUNC("e1000_write_nvm_srwr");
 333 
 334         /*
 335          * A check for invalid values:  offset too large, too many words,
 336          * too many words for the offset, and not enough words.
 337          */
 338         if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
 339             (words == 0)) {
 340                 DEBUGOUT("nvm parameter(s) out of bounds\n");
 341                 ret_val = -E1000_ERR_NVM;
 342                 goto out;
 343         }
 344 
 345         for (i = 0; i < words; i++) {
 346                 eewr = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) |
 347                         (data[i] << E1000_NVM_RW_REG_DATA) |
 348                         E1000_NVM_RW_REG_START;
 349 
 350                 E1000_WRITE_REG(hw, E1000_SRWR, eewr);
 351 
 352                 for (k = 0; k < attempts; k++) {
 353                         if (E1000_NVM_RW_REG_DONE &
 354                             E1000_READ_REG(hw, E1000_SRWR)) {
 355                                 ret_val = E1000_SUCCESS;
 356                                 break;
 357                         }
 358                         usec_delay(5);
 359                 }
 360 
 361                 if (ret_val != E1000_SUCCESS) {
 362                         DEBUGOUT("Shadow RAM write EEWR timed out\n");
 363                         break;
 364                 }
 365         }
 366 
 367 out:
 368         return ret_val;
 369 }
 370 
 371 /**
 372  *  e1000_read_nvm_i211 - Read NVM wrapper function for I211
 373  *  @hw: pointer to the HW structure
 374  *  @address: the word address (aka eeprom offset) to read
 375  *  @data: pointer to the data read
 376  *
 377  *  Wrapper function to return data formerly found in the NVM.
 378  **/
 379 static s32 e1000_read_nvm_i211(struct e1000_hw *hw, u16 offset,
 380                                u16 words, u16 *data)
 381 {
 382         s32 ret_val = E1000_SUCCESS;
 383 
 384         DEBUGFUNC("e1000_read_nvm_i211");
 385 
 386         /* Only the MAC addr is required to be present in the iNVM */
 387         switch (offset) {
 388         case NVM_MAC_ADDR:
 389                 ret_val = e1000_read_invm_i211(hw, (u8)offset, &data[0]);
 390                 ret_val |= e1000_read_invm_i211(hw, (u8)offset+1, &data[1]);
 391                 ret_val |= e1000_read_invm_i211(hw, (u8)offset+2, &data[2]);
 392                 if (ret_val != E1000_SUCCESS)
 393                         DEBUGOUT("MAC Addr not found in iNVM\n");
 394                 break;
 395         case NVM_INIT_CTRL_2:
 396                 ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
 397                 if (ret_val != E1000_SUCCESS) {
 398                         *data = NVM_INIT_CTRL_2_DEFAULT_I211;
 399                         ret_val = E1000_SUCCESS;
 400                 }
 401                 break;
 402         case NVM_INIT_CTRL_4:
 403                 ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
 404                 if (ret_val != E1000_SUCCESS) {
 405                         *data = NVM_INIT_CTRL_4_DEFAULT_I211;
 406                         ret_val = E1000_SUCCESS;
 407                 }
 408                 break;
 409         case NVM_LED_1_CFG:
 410                 ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
 411                 if (ret_val != E1000_SUCCESS) {
 412                         *data = NVM_LED_1_CFG_DEFAULT_I211;
 413                         ret_val = E1000_SUCCESS;
 414                 }
 415                 break;
 416         case NVM_LED_0_2_CFG:
 417                 ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
 418                 if (ret_val != E1000_SUCCESS) {
 419                         *data = NVM_LED_0_2_CFG_DEFAULT_I211;
 420                         ret_val = E1000_SUCCESS;
 421                 }
 422                 break;
 423         case NVM_ID_LED_SETTINGS:
 424                 ret_val = e1000_read_invm_i211(hw, (u8)offset, data);
 425                 if (ret_val != E1000_SUCCESS) {
 426                         *data = ID_LED_RESERVED_FFFF;
 427                         ret_val = E1000_SUCCESS;
 428                 }
 429                 break;
 430         case NVM_SUB_DEV_ID:
 431                 *data = hw->subsystem_device_id;
 432                 break;
 433         case NVM_SUB_VEN_ID:
 434                 *data = hw->subsystem_vendor_id;
 435                 break;
 436         case NVM_DEV_ID:
 437                 *data = hw->device_id;
 438                 break;
 439         case NVM_VEN_ID:
 440                 *data = hw->vendor_id;
 441                 break;
 442         default:
 443                 DEBUGOUT1("NVM word 0x%02x is not mapped.\n", offset);
 444                 *data = NVM_RESERVED_WORD;
 445                 break;
 446         }
 447         return ret_val;
 448 }
 449 
 450 /**
 451  *  e1000_read_invm_i211 - Reads OTP
 452  *  @hw: pointer to the HW structure
 453  *  @address: the word address (aka eeprom offset) to read
 454  *  @data: pointer to the data read
 455  *
 456  *  Reads 16-bit words from the OTP. Return error when the word is not
 457  *  stored in OTP.
 458  **/
 459 s32 e1000_read_invm_i211(struct e1000_hw *hw, u8 address, u16 *data)
 460 {
 461         s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND;
 462         u32 invm_dword;
 463         u16 i;
 464         u8 record_type, word_address;
 465 
 466         DEBUGFUNC("e1000_read_invm_i211");
 467 
 468         for (i = 0; i < E1000_INVM_SIZE; i++) {
 469                 invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i));
 470                 /* Get record type */
 471                 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
 472                 if (record_type == E1000_INVM_UNINITIALIZED_STRUCTURE)
 473                         break;
 474                 if (record_type == E1000_INVM_CSR_AUTOLOAD_STRUCTURE)
 475                         i += E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
 476                 if (record_type == E1000_INVM_RSA_KEY_SHA256_STRUCTURE)
 477                         i += E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
 478                 if (record_type == E1000_INVM_WORD_AUTOLOAD_STRUCTURE) {
 479                         word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
 480                         if (word_address == address) {
 481                                 *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
 482                                 DEBUGOUT2("Read INVM Word 0x%02x = %x",
 483                                           address, *data);
 484                                 status = E1000_SUCCESS;
 485                                 break;
 486                         }
 487                 }
 488         }
 489         if (status != E1000_SUCCESS)
 490                 DEBUGOUT1("Requested word 0x%02x not found in OTP\n", address);
 491         return status;
 492 }
 493 
 494 /**
 495  *  e1000_validate_nvm_checksum_i210 - Validate EEPROM checksum
 496  *  @hw: pointer to the HW structure
 497  *
 498  *  Calculates the EEPROM checksum by reading/adding each word of the EEPROM
 499  *  and then verifies that the sum of the EEPROM is equal to 0xBABA.
 500  **/
 501 s32 e1000_validate_nvm_checksum_i210(struct e1000_hw *hw)
 502 {
 503         s32 status = E1000_SUCCESS;
 504         s32 (*read_op_ptr)(struct e1000_hw *, u16, u16, u16 *);
 505 
 506         DEBUGFUNC("e1000_validate_nvm_checksum_i210");
 507 
 508         if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
 509 
 510                 /*
 511                  * Replace the read function with semaphore grabbing with
 512                  * the one that skips this for a while.
 513                  * We have semaphore taken already here.
 514                  */
 515                 read_op_ptr = hw->nvm.ops.read;
 516                 hw->nvm.ops.read = e1000_read_nvm_eerd;
 517 
 518                 status = e1000_validate_nvm_checksum_generic(hw);
 519 
 520                 /* Revert original read operation. */
 521                 hw->nvm.ops.read = read_op_ptr;
 522 
 523                 hw->nvm.ops.release(hw);
 524         } else {
 525                 status = E1000_ERR_SWFW_SYNC;
 526         }
 527 
 528         return status;
 529 }
 530 
 531 
 532 /**
 533  *  e1000_update_nvm_checksum_i210 - Update EEPROM checksum
 534  *  @hw: pointer to the HW structure
 535  *
 536  *  Updates the EEPROM checksum by reading/adding each word of the EEPROM
 537  *  up to the checksum.  Then calculates the EEPROM checksum and writes the
 538  *  value to the EEPROM. Next commit EEPROM data onto the Flash.
 539  **/
 540 s32 e1000_update_nvm_checksum_i210(struct e1000_hw *hw)
 541 {
 542         s32 ret_val = E1000_SUCCESS;
 543         u16 checksum = 0;
 544         u16 i, nvm_data;
 545 
 546         DEBUGFUNC("e1000_update_nvm_checksum_i210");
 547 
 548         /*
 549          * Read the first word from the EEPROM. If this times out or fails, do
 550          * not continue or we could be in for a very long wait while every
 551          * EEPROM read fails
 552          */
 553         ret_val = e1000_read_nvm_eerd(hw, 0, 1, &nvm_data);
 554         if (ret_val != E1000_SUCCESS) {
 555                 DEBUGOUT("EEPROM read failed\n");
 556                 goto out;
 557         }
 558 
 559         if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
 560                 /*
 561                  * Do not use hw->nvm.ops.write, hw->nvm.ops.read
 562                  * because we do not want to take the synchronization
 563                  * semaphores twice here.
 564                  */
 565 
 566                 for (i = 0; i < NVM_CHECKSUM_REG; i++) {
 567                         ret_val = e1000_read_nvm_eerd(hw, i, 1, &nvm_data);
 568                         if (ret_val) {
 569                                 hw->nvm.ops.release(hw);
 570                                 DEBUGOUT("NVM Read Error while updating checksum.\n");
 571                                 goto out;
 572                         }
 573                         checksum += nvm_data;
 574                 }
 575                 checksum = (u16) NVM_SUM - checksum;
 576                 ret_val = e1000_write_nvm_srwr(hw, NVM_CHECKSUM_REG, 1,
 577                                                 &checksum);
 578                 if (ret_val != E1000_SUCCESS) {
 579                         hw->nvm.ops.release(hw);
 580                         DEBUGOUT("NVM Write Error while updating checksum.\n");
 581                         goto out;
 582                 }
 583 
 584                 hw->nvm.ops.release(hw);
 585 
 586                 ret_val = e1000_update_flash_i210(hw);
 587         } else {
 588                 ret_val = E1000_ERR_SWFW_SYNC;
 589         }
 590 out:
 591         return ret_val;
 592 }
 593 
 594 /**
 595  *  e1000_update_flash_i210 - Commit EEPROM to the flash
 596  *  @hw: pointer to the HW structure
 597  *
 598  **/
 599 s32 e1000_update_flash_i210(struct e1000_hw *hw)
 600 {
 601         s32 ret_val = E1000_SUCCESS;
 602         u32 flup;
 603 
 604         DEBUGFUNC("e1000_update_flash_i210");
 605 
 606         ret_val = e1000_pool_flash_update_done_i210(hw);
 607         if (ret_val == -E1000_ERR_NVM) {
 608                 DEBUGOUT("Flash update time out\n");
 609                 goto out;
 610         }
 611 
 612         flup = E1000_READ_REG(hw, E1000_EECD) | E1000_EECD_FLUPD_I210;
 613         E1000_WRITE_REG(hw, E1000_EECD, flup);
 614 
 615         ret_val = e1000_pool_flash_update_done_i210(hw);
 616         if (ret_val == E1000_SUCCESS)
 617                 DEBUGOUT("Flash update complete\n");
 618         else
 619                 DEBUGOUT("Flash update time out\n");
 620 
 621 out:
 622         return ret_val;
 623 }
 624 
 625 /**
 626  *  e1000_pool_flash_update_done_i210 - Pool FLUDONE status.
 627  *  @hw: pointer to the HW structure
 628  *
 629  **/
 630 s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw)
 631 {
 632         s32 ret_val = -E1000_ERR_NVM;
 633         u32 i, reg;
 634 
 635         DEBUGFUNC("e1000_pool_flash_update_done_i210");
 636 
 637         for (i = 0; i < E1000_FLUDONE_ATTEMPTS; i++) {
 638                 reg = E1000_READ_REG(hw, E1000_EECD);
 639                 if (reg & E1000_EECD_FLUDONE_I210) {
 640                         ret_val = E1000_SUCCESS;
 641                         break;
 642                 }
 643                 usec_delay(5);
 644         }
 645 
 646         return ret_val;
 647 }
 648 
 649 /**
 650  *  e1000_init_nvm_params_i210 - Initialize i210 NVM function pointers
 651  *  @hw: pointer to the HW structure
 652  *
 653  *  Initialize the i210 NVM parameters and function pointers.
 654  **/
 655 static s32 e1000_init_nvm_params_i210(struct e1000_hw *hw)
 656 {
 657         s32 ret_val = E1000_SUCCESS;
 658         struct e1000_nvm_info *nvm = &hw->nvm;
 659 
 660         DEBUGFUNC("e1000_init_nvm_params_i210");
 661 
 662         ret_val = e1000_init_nvm_params_82575(hw);
 663 
 664         nvm->ops.acquire = e1000_acquire_nvm_i210;
 665         nvm->ops.release = e1000_release_nvm_i210;
 666         nvm->ops.read    = e1000_read_nvm_srrd_i210;
 667         nvm->ops.write   = e1000_write_nvm_srwr_i210;
 668         nvm->ops.valid_led_default = e1000_valid_led_default_i210;
 669         nvm->ops.validate = e1000_validate_nvm_checksum_i210;
 670         nvm->ops.update   = e1000_update_nvm_checksum_i210;
 671 
 672         return ret_val;
 673 }
 674 
 675 /**
 676  *  e1000_init_nvm_params_i211 - Initialize i211 NVM function pointers
 677  *  @hw: pointer to the HW structure
 678  *
 679  *  Initialize the NVM parameters and function pointers for i211.
 680  **/
 681 static s32 e1000_init_nvm_params_i211(struct e1000_hw *hw)
 682 {
 683         struct e1000_nvm_info *nvm = &hw->nvm;
 684 
 685         DEBUGFUNC("e1000_init_nvm_params_i211");
 686 
 687         nvm->ops.acquire  = e1000_acquire_nvm_i210;
 688         nvm->ops.release  = e1000_release_nvm_i210;
 689         nvm->ops.read     = e1000_read_nvm_i211;
 690         nvm->ops.valid_led_default = e1000_valid_led_default_i210;
 691         nvm->ops.write    = e1000_null_write_nvm;
 692         nvm->ops.validate = e1000_null_ops_generic;
 693         nvm->ops.update   = e1000_null_ops_generic;
 694 
 695         return E1000_SUCCESS;
 696 }
 697 
 698 /**
 699  *  e1000_init_function_pointers_i210 - Init func ptrs.
 700  *  @hw: pointer to the HW structure
 701  *
 702  *  Called to initialize all function pointers and parameters.
 703  **/
 704 void e1000_init_function_pointers_i210(struct e1000_hw *hw)
 705 {
 706         e1000_init_function_pointers_82575(hw);
 707 
 708         switch (hw->mac.type) {
 709         case e1000_i210:
 710                 hw->nvm.ops.init_params = e1000_init_nvm_params_i210;
 711                 break;
 712         case e1000_i211:
 713                 hw->nvm.ops.init_params = e1000_init_nvm_params_i211;
 714                 break;
 715         default:
 716                 break;
 717         }
 718         return;
 719 }
 720 
 721 /**
 722  *  e1000_valid_led_default_i210 - Verify a valid default LED config
 723  *  @hw: pointer to the HW structure
 724  *  @data: pointer to the NVM (EEPROM)
 725  *
 726  *  Read the EEPROM for the current default LED configuration.  If the
 727  *  LED configuration is not valid, set to a valid LED configuration.
 728  **/
 729 static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data)
 730 {
 731         s32 ret_val;
 732 
 733         DEBUGFUNC("e1000_valid_led_default_i210");
 734 
 735         ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
 736         if (ret_val) {
 737                 DEBUGOUT("NVM Read Error\n");
 738                 goto out;
 739         }
 740 
 741         if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) {
 742                 switch (hw->phy.media_type) {
 743                 case e1000_media_type_internal_serdes:
 744                         *data = ID_LED_DEFAULT_I210_SERDES;
 745                         break;
 746                 case e1000_media_type_copper:
 747                 default:
 748                         *data = ID_LED_DEFAULT_I210;
 749                         break;
 750                 }
 751         }
 752 out:
 753         return ret_val;
 754 }