linux/drivers/net/ethernet/intel/igb/e1000_i210.c
<<
>>
Prefs
   1/* Intel(R) Gigabit Ethernet Linux driver
   2 * Copyright(c) 2007-2014 Intel Corporation.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, see <http://www.gnu.org/licenses/>.
  15 *
  16 * The full GNU General Public License is included in this distribution in
  17 * the file called "COPYING".
  18 *
  19 * Contact Information:
  20 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
  21 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  22 */
  23
  24/* e1000_i210
  25 * e1000_i211
  26 */
  27
  28#include <linux/types.h>
  29#include <linux/if_ether.h>
  30
  31#include "e1000_hw.h"
  32#include "e1000_i210.h"
  33
  34static s32 igb_update_flash_i210(struct e1000_hw *hw);
  35
  36/**
  37 * igb_get_hw_semaphore_i210 - Acquire hardware semaphore
  38 *  @hw: pointer to the HW structure
  39 *
  40 *  Acquire the HW semaphore to access the PHY or NVM
  41 */
  42static s32 igb_get_hw_semaphore_i210(struct e1000_hw *hw)
  43{
  44        u32 swsm;
  45        s32 timeout = hw->nvm.word_size + 1;
  46        s32 i = 0;
  47
  48        /* Get the SW semaphore */
  49        while (i < timeout) {
  50                swsm = rd32(E1000_SWSM);
  51                if (!(swsm & E1000_SWSM_SMBI))
  52                        break;
  53
  54                udelay(50);
  55                i++;
  56        }
  57
  58        if (i == timeout) {
  59                /* In rare circumstances, the SW semaphore may already be held
  60                 * unintentionally. Clear the semaphore once before giving up.
  61                 */
  62                if (hw->dev_spec._82575.clear_semaphore_once) {
  63                        hw->dev_spec._82575.clear_semaphore_once = false;
  64                        igb_put_hw_semaphore(hw);
  65                        for (i = 0; i < timeout; i++) {
  66                                swsm = rd32(E1000_SWSM);
  67                                if (!(swsm & E1000_SWSM_SMBI))
  68                                        break;
  69
  70                                udelay(50);
  71                        }
  72                }
  73
  74                /* If we do not have the semaphore here, we have to give up. */
  75                if (i == timeout) {
  76                        hw_dbg("Driver can't access device - SMBI bit is set.\n");
  77                        return -E1000_ERR_NVM;
  78                }
  79        }
  80
  81        /* Get the FW semaphore. */
  82        for (i = 0; i < timeout; i++) {
  83                swsm = rd32(E1000_SWSM);
  84                wr32(E1000_SWSM, swsm | E1000_SWSM_SWESMBI);
  85
  86                /* Semaphore acquired if bit latched */
  87                if (rd32(E1000_SWSM) & E1000_SWSM_SWESMBI)
  88                        break;
  89
  90                udelay(50);
  91        }
  92
  93        if (i == timeout) {
  94                /* Release semaphores */
  95                igb_put_hw_semaphore(hw);
  96                hw_dbg("Driver can't access the NVM\n");
  97                return -E1000_ERR_NVM;
  98        }
  99
 100        return 0;
 101}
 102
 103/**
 104 *  igb_acquire_nvm_i210 - Request for access to EEPROM
 105 *  @hw: pointer to the HW structure
 106 *
 107 *  Acquire the necessary semaphores for exclusive access to the EEPROM.
 108 *  Set the EEPROM access request bit and wait for EEPROM access grant bit.
 109 *  Return successful if access grant bit set, else clear the request for
 110 *  EEPROM access and return -E1000_ERR_NVM (-1).
 111 **/
 112static s32 igb_acquire_nvm_i210(struct e1000_hw *hw)
 113{
 114        return igb_acquire_swfw_sync_i210(hw, E1000_SWFW_EEP_SM);
 115}
 116
 117/**
 118 *  igb_release_nvm_i210 - Release exclusive access to EEPROM
 119 *  @hw: pointer to the HW structure
 120 *
 121 *  Stop any current commands to the EEPROM and clear the EEPROM request bit,
 122 *  then release the semaphores acquired.
 123 **/
 124static void igb_release_nvm_i210(struct e1000_hw *hw)
 125{
 126        igb_release_swfw_sync_i210(hw, E1000_SWFW_EEP_SM);
 127}
 128
 129/**
 130 *  igb_acquire_swfw_sync_i210 - Acquire SW/FW semaphore
 131 *  @hw: pointer to the HW structure
 132 *  @mask: specifies which semaphore to acquire
 133 *
 134 *  Acquire the SW/FW semaphore to access the PHY or NVM.  The mask
 135 *  will also specify which port we're acquiring the lock for.
 136 **/
 137s32 igb_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
 138{
 139        u32 swfw_sync;
 140        u32 swmask = mask;
 141        u32 fwmask = mask << 16;
 142        s32 ret_val = 0;
 143        s32 i = 0, timeout = 200; /* FIXME: find real value to use here */
 144
 145        while (i < timeout) {
 146                if (igb_get_hw_semaphore_i210(hw)) {
 147                        ret_val = -E1000_ERR_SWFW_SYNC;
 148                        goto out;
 149                }
 150
 151                swfw_sync = rd32(E1000_SW_FW_SYNC);
 152                if (!(swfw_sync & (fwmask | swmask)))
 153                        break;
 154
 155                /* Firmware currently using resource (fwmask) */
 156                igb_put_hw_semaphore(hw);
 157                mdelay(5);
 158                i++;
 159        }
 160
 161        if (i == timeout) {
 162                hw_dbg("Driver can't access resource, SW_FW_SYNC timeout.\n");
 163                ret_val = -E1000_ERR_SWFW_SYNC;
 164                goto out;
 165        }
 166
 167        swfw_sync |= swmask;
 168        wr32(E1000_SW_FW_SYNC, swfw_sync);
 169
 170        igb_put_hw_semaphore(hw);
 171out:
 172        return ret_val;
 173}
 174
 175/**
 176 *  igb_release_swfw_sync_i210 - Release SW/FW semaphore
 177 *  @hw: pointer to the HW structure
 178 *  @mask: specifies which semaphore to acquire
 179 *
 180 *  Release the SW/FW semaphore used to access the PHY or NVM.  The mask
 181 *  will also specify which port we're releasing the lock for.
 182 **/
 183void igb_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
 184{
 185        u32 swfw_sync;
 186
 187        while (igb_get_hw_semaphore_i210(hw))
 188                ; /* Empty */
 189
 190        swfw_sync = rd32(E1000_SW_FW_SYNC);
 191        swfw_sync &= ~mask;
 192        wr32(E1000_SW_FW_SYNC, swfw_sync);
 193
 194        igb_put_hw_semaphore(hw);
 195}
 196
 197/**
 198 *  igb_read_nvm_srrd_i210 - Reads Shadow Ram using EERD register
 199 *  @hw: pointer to the HW structure
 200 *  @offset: offset of word in the Shadow Ram to read
 201 *  @words: number of words to read
 202 *  @data: word read from the Shadow Ram
 203 *
 204 *  Reads a 16 bit word from the Shadow Ram using the EERD register.
 205 *  Uses necessary synchronization semaphores.
 206 **/
 207static s32 igb_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, u16 words,
 208                                  u16 *data)
 209{
 210        s32 status = 0;
 211        u16 i, count;
 212
 213        /* We cannot hold synchronization semaphores for too long,
 214         * because of forceful takeover procedure. However it is more efficient
 215         * to read in bursts than synchronizing access for each word.
 216         */
 217        for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
 218                count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
 219                        E1000_EERD_EEWR_MAX_COUNT : (words - i);
 220                if (!(hw->nvm.ops.acquire(hw))) {
 221                        status = igb_read_nvm_eerd(hw, offset, count,
 222                                                     data + i);
 223                        hw->nvm.ops.release(hw);
 224                } else {
 225                        status = E1000_ERR_SWFW_SYNC;
 226                }
 227
 228                if (status)
 229                        break;
 230        }
 231
 232        return status;
 233}
 234
 235/**
 236 *  igb_write_nvm_srwr - Write to Shadow Ram using EEWR
 237 *  @hw: pointer to the HW structure
 238 *  @offset: offset within the Shadow Ram to be written to
 239 *  @words: number of words to write
 240 *  @data: 16 bit word(s) to be written to the Shadow Ram
 241 *
 242 *  Writes data to Shadow Ram at offset using EEWR register.
 243 *
 244 *  If igb_update_nvm_checksum is not called after this function , the
 245 *  Shadow Ram will most likely contain an invalid checksum.
 246 **/
 247static s32 igb_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
 248                                u16 *data)
 249{
 250        struct e1000_nvm_info *nvm = &hw->nvm;
 251        u32 i, k, eewr = 0;
 252        u32 attempts = 100000;
 253        s32 ret_val = 0;
 254
 255        /* A check for invalid values:  offset too large, too many words,
 256         * too many words for the offset, and not enough words.
 257         */
 258        if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
 259            (words == 0)) {
 260                hw_dbg("nvm parameter(s) out of bounds\n");
 261                ret_val = -E1000_ERR_NVM;
 262                goto out;
 263        }
 264
 265        for (i = 0; i < words; i++) {
 266                eewr = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) |
 267                        (data[i] << E1000_NVM_RW_REG_DATA) |
 268                        E1000_NVM_RW_REG_START;
 269
 270                wr32(E1000_SRWR, eewr);
 271
 272                for (k = 0; k < attempts; k++) {
 273                        if (E1000_NVM_RW_REG_DONE &
 274                            rd32(E1000_SRWR)) {
 275                                ret_val = 0;
 276                                break;
 277                        }
 278                        udelay(5);
 279        }
 280
 281                if (ret_val) {
 282                        hw_dbg("Shadow RAM write EEWR timed out\n");
 283                        break;
 284                }
 285        }
 286
 287out:
 288        return ret_val;
 289}
 290
 291/**
 292 *  igb_write_nvm_srwr_i210 - Write to Shadow RAM using EEWR
 293 *  @hw: pointer to the HW structure
 294 *  @offset: offset within the Shadow RAM to be written to
 295 *  @words: number of words to write
 296 *  @data: 16 bit word(s) to be written to the Shadow RAM
 297 *
 298 *  Writes data to Shadow RAM at offset using EEWR register.
 299 *
 300 *  If e1000_update_nvm_checksum is not called after this function , the
 301 *  data will not be committed to FLASH and also Shadow RAM will most likely
 302 *  contain an invalid checksum.
 303 *
 304 *  If error code is returned, data and Shadow RAM may be inconsistent - buffer
 305 *  partially written.
 306 **/
 307static s32 igb_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, u16 words,
 308                                   u16 *data)
 309{
 310        s32 status = 0;
 311        u16 i, count;
 312
 313        /* We cannot hold synchronization semaphores for too long,
 314         * because of forceful takeover procedure. However it is more efficient
 315         * to write in bursts than synchronizing access for each word.
 316         */
 317        for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
 318                count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
 319                        E1000_EERD_EEWR_MAX_COUNT : (words - i);
 320                if (!(hw->nvm.ops.acquire(hw))) {
 321                        status = igb_write_nvm_srwr(hw, offset, count,
 322                                                      data + i);
 323                        hw->nvm.ops.release(hw);
 324                } else {
 325                        status = E1000_ERR_SWFW_SYNC;
 326                }
 327
 328                if (status)
 329                        break;
 330        }
 331
 332        return status;
 333}
 334
 335/**
 336 *  igb_read_invm_word_i210 - Reads OTP
 337 *  @hw: pointer to the HW structure
 338 *  @address: the word address (aka eeprom offset) to read
 339 *  @data: pointer to the data read
 340 *
 341 *  Reads 16-bit words from the OTP. Return error when the word is not
 342 *  stored in OTP.
 343 **/
 344static s32 igb_read_invm_word_i210(struct e1000_hw *hw, u8 address, u16 *data)
 345{
 346        s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND;
 347        u32 invm_dword;
 348        u16 i;
 349        u8 record_type, word_address;
 350
 351        for (i = 0; i < E1000_INVM_SIZE; i++) {
 352                invm_dword = rd32(E1000_INVM_DATA_REG(i));
 353                /* Get record type */
 354                record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
 355                if (record_type == E1000_INVM_UNINITIALIZED_STRUCTURE)
 356                        break;
 357                if (record_type == E1000_INVM_CSR_AUTOLOAD_STRUCTURE)
 358                        i += E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
 359                if (record_type == E1000_INVM_RSA_KEY_SHA256_STRUCTURE)
 360                        i += E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
 361                if (record_type == E1000_INVM_WORD_AUTOLOAD_STRUCTURE) {
 362                        word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
 363                        if (word_address == address) {
 364                                *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
 365                                hw_dbg("Read INVM Word 0x%02x = %x\n",
 366                                          address, *data);
 367                                status = 0;
 368                                break;
 369                        }
 370                }
 371        }
 372        if (status)
 373                hw_dbg("Requested word 0x%02x not found in OTP\n", address);
 374        return status;
 375}
 376
 377/**
 378 * igb_read_invm_i210 - Read invm wrapper function for I210/I211
 379 *  @hw: pointer to the HW structure
 380 *  @words: number of words to read
 381 *  @data: pointer to the data read
 382 *
 383 *  Wrapper function to return data formerly found in the NVM.
 384 **/
 385static s32 igb_read_invm_i210(struct e1000_hw *hw, u16 offset,
 386                                u16 words __always_unused, u16 *data)
 387{
 388        s32 ret_val = 0;
 389
 390        /* Only the MAC addr is required to be present in the iNVM */
 391        switch (offset) {
 392        case NVM_MAC_ADDR:
 393                ret_val = igb_read_invm_word_i210(hw, (u8)offset, &data[0]);
 394                ret_val |= igb_read_invm_word_i210(hw, (u8)offset+1,
 395                                                     &data[1]);
 396                ret_val |= igb_read_invm_word_i210(hw, (u8)offset+2,
 397                                                     &data[2]);
 398                if (ret_val)
 399                        hw_dbg("MAC Addr not found in iNVM\n");
 400                break;
 401        case NVM_INIT_CTRL_2:
 402                ret_val = igb_read_invm_word_i210(hw, (u8)offset, data);
 403                if (ret_val) {
 404                        *data = NVM_INIT_CTRL_2_DEFAULT_I211;
 405                        ret_val = 0;
 406                }
 407                break;
 408        case NVM_INIT_CTRL_4:
 409                ret_val = igb_read_invm_word_i210(hw, (u8)offset, data);
 410                if (ret_val) {
 411                        *data = NVM_INIT_CTRL_4_DEFAULT_I211;
 412                        ret_val = 0;
 413                }
 414                break;
 415        case NVM_LED_1_CFG:
 416                ret_val = igb_read_invm_word_i210(hw, (u8)offset, data);
 417                if (ret_val) {
 418                        *data = NVM_LED_1_CFG_DEFAULT_I211;
 419                        ret_val = 0;
 420                }
 421                break;
 422        case NVM_LED_0_2_CFG:
 423                ret_val = igb_read_invm_word_i210(hw, (u8)offset, data);
 424                if (ret_val) {
 425                        *data = NVM_LED_0_2_CFG_DEFAULT_I211;
 426                        ret_val = 0;
 427                }
 428                break;
 429        case NVM_ID_LED_SETTINGS:
 430                ret_val = igb_read_invm_word_i210(hw, (u8)offset, data);
 431                if (ret_val) {
 432                        *data = ID_LED_RESERVED_FFFF;
 433                        ret_val = 0;
 434                }
 435                break;
 436        case NVM_SUB_DEV_ID:
 437                *data = hw->subsystem_device_id;
 438                break;
 439        case NVM_SUB_VEN_ID:
 440                *data = hw->subsystem_vendor_id;
 441                break;
 442        case NVM_DEV_ID:
 443                *data = hw->device_id;
 444                break;
 445        case NVM_VEN_ID:
 446                *data = hw->vendor_id;
 447                break;
 448        default:
 449                hw_dbg("NVM word 0x%02x is not mapped.\n", offset);
 450                *data = NVM_RESERVED_WORD;
 451                break;
 452        }
 453        return ret_val;
 454}
 455
 456/**
 457 *  igb_read_invm_version - Reads iNVM version and image type
 458 *  @hw: pointer to the HW structure
 459 *  @invm_ver: version structure for the version read
 460 *
 461 *  Reads iNVM version and image type.
 462 **/
 463s32 igb_read_invm_version(struct e1000_hw *hw,
 464                          struct e1000_fw_version *invm_ver) {
 465        u32 *record = NULL;
 466        u32 *next_record = NULL;
 467        u32 i = 0;
 468        u32 invm_dword = 0;
 469        u32 invm_blocks = E1000_INVM_SIZE - (E1000_INVM_ULT_BYTES_SIZE /
 470                                             E1000_INVM_RECORD_SIZE_IN_BYTES);
 471        u32 buffer[E1000_INVM_SIZE];
 472        s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND;
 473        u16 version = 0;
 474
 475        /* Read iNVM memory */
 476        for (i = 0; i < E1000_INVM_SIZE; i++) {
 477                invm_dword = rd32(E1000_INVM_DATA_REG(i));
 478                buffer[i] = invm_dword;
 479        }
 480
 481        /* Read version number */
 482        for (i = 1; i < invm_blocks; i++) {
 483                record = &buffer[invm_blocks - i];
 484                next_record = &buffer[invm_blocks - i + 1];
 485
 486                /* Check if we have first version location used */
 487                if ((i == 1) && ((*record & E1000_INVM_VER_FIELD_ONE) == 0)) {
 488                        version = 0;
 489                        status = 0;
 490                        break;
 491                }
 492                /* Check if we have second version location used */
 493                else if ((i == 1) &&
 494                         ((*record & E1000_INVM_VER_FIELD_TWO) == 0)) {
 495                        version = (*record & E1000_INVM_VER_FIELD_ONE) >> 3;
 496                        status = 0;
 497                        break;
 498                }
 499                /* Check if we have odd version location
 500                 * used and it is the last one used
 501                 */
 502                else if ((((*record & E1000_INVM_VER_FIELD_ONE) == 0) &&
 503                         ((*record & 0x3) == 0)) || (((*record & 0x3) != 0) &&
 504                         (i != 1))) {
 505                        version = (*next_record & E1000_INVM_VER_FIELD_TWO)
 506                                  >> 13;
 507                        status = 0;
 508                        break;
 509                }
 510                /* Check if we have even version location
 511                 * used and it is the last one used
 512                 */
 513                else if (((*record & E1000_INVM_VER_FIELD_TWO) == 0) &&
 514                         ((*record & 0x3) == 0)) {
 515                        version = (*record & E1000_INVM_VER_FIELD_ONE) >> 3;
 516                        status = 0;
 517                        break;
 518                }
 519        }
 520
 521        if (!status) {
 522                invm_ver->invm_major = (version & E1000_INVM_MAJOR_MASK)
 523                                        >> E1000_INVM_MAJOR_SHIFT;
 524                invm_ver->invm_minor = version & E1000_INVM_MINOR_MASK;
 525        }
 526        /* Read Image Type */
 527        for (i = 1; i < invm_blocks; i++) {
 528                record = &buffer[invm_blocks - i];
 529                next_record = &buffer[invm_blocks - i + 1];
 530
 531                /* Check if we have image type in first location used */
 532                if ((i == 1) && ((*record & E1000_INVM_IMGTYPE_FIELD) == 0)) {
 533                        invm_ver->invm_img_type = 0;
 534                        status = 0;
 535                        break;
 536                }
 537                /* Check if we have image type in first location used */
 538                else if ((((*record & 0x3) == 0) &&
 539                         ((*record & E1000_INVM_IMGTYPE_FIELD) == 0)) ||
 540                         ((((*record & 0x3) != 0) && (i != 1)))) {
 541                        invm_ver->invm_img_type =
 542                                (*next_record & E1000_INVM_IMGTYPE_FIELD) >> 23;
 543                        status = 0;
 544                        break;
 545                }
 546        }
 547        return status;
 548}
 549
 550/**
 551 *  igb_validate_nvm_checksum_i210 - Validate EEPROM checksum
 552 *  @hw: pointer to the HW structure
 553 *
 554 *  Calculates the EEPROM checksum by reading/adding each word of the EEPROM
 555 *  and then verifies that the sum of the EEPROM is equal to 0xBABA.
 556 **/
 557static s32 igb_validate_nvm_checksum_i210(struct e1000_hw *hw)
 558{
 559        s32 status = 0;
 560        s32 (*read_op_ptr)(struct e1000_hw *, u16, u16, u16 *);
 561
 562        if (!(hw->nvm.ops.acquire(hw))) {
 563
 564                /* Replace the read function with semaphore grabbing with
 565                 * the one that skips this for a while.
 566                 * We have semaphore taken already here.
 567                 */
 568                read_op_ptr = hw->nvm.ops.read;
 569                hw->nvm.ops.read = igb_read_nvm_eerd;
 570
 571                status = igb_validate_nvm_checksum(hw);
 572
 573                /* Revert original read operation. */
 574                hw->nvm.ops.read = read_op_ptr;
 575
 576                hw->nvm.ops.release(hw);
 577        } else {
 578                status = E1000_ERR_SWFW_SYNC;
 579        }
 580
 581        return status;
 582}
 583
 584/**
 585 *  igb_update_nvm_checksum_i210 - Update EEPROM checksum
 586 *  @hw: pointer to the HW structure
 587 *
 588 *  Updates the EEPROM checksum by reading/adding each word of the EEPROM
 589 *  up to the checksum.  Then calculates the EEPROM checksum and writes the
 590 *  value to the EEPROM. Next commit EEPROM data onto the Flash.
 591 **/
 592static s32 igb_update_nvm_checksum_i210(struct e1000_hw *hw)
 593{
 594        s32 ret_val = 0;
 595        u16 checksum = 0;
 596        u16 i, nvm_data;
 597
 598        /* Read the first word from the EEPROM. If this times out or fails, do
 599         * not continue or we could be in for a very long wait while every
 600         * EEPROM read fails
 601         */
 602        ret_val = igb_read_nvm_eerd(hw, 0, 1, &nvm_data);
 603        if (ret_val) {
 604                hw_dbg("EEPROM read failed\n");
 605                goto out;
 606        }
 607
 608        if (!(hw->nvm.ops.acquire(hw))) {
 609                /* Do not use hw->nvm.ops.write, hw->nvm.ops.read
 610                 * because we do not want to take the synchronization
 611                 * semaphores twice here.
 612                 */
 613
 614                for (i = 0; i < NVM_CHECKSUM_REG; i++) {
 615                        ret_val = igb_read_nvm_eerd(hw, i, 1, &nvm_data);
 616                        if (ret_val) {
 617                                hw->nvm.ops.release(hw);
 618                                hw_dbg("NVM Read Error while updating checksum.\n");
 619                                goto out;
 620                        }
 621                        checksum += nvm_data;
 622                }
 623                checksum = (u16) NVM_SUM - checksum;
 624                ret_val = igb_write_nvm_srwr(hw, NVM_CHECKSUM_REG, 1,
 625                                                &checksum);
 626                if (ret_val) {
 627                        hw->nvm.ops.release(hw);
 628                        hw_dbg("NVM Write Error while updating checksum.\n");
 629                        goto out;
 630                }
 631
 632                hw->nvm.ops.release(hw);
 633
 634                ret_val = igb_update_flash_i210(hw);
 635        } else {
 636                ret_val = -E1000_ERR_SWFW_SYNC;
 637        }
 638out:
 639        return ret_val;
 640}
 641
 642/**
 643 *  igb_pool_flash_update_done_i210 - Pool FLUDONE status.
 644 *  @hw: pointer to the HW structure
 645 *
 646 **/
 647static s32 igb_pool_flash_update_done_i210(struct e1000_hw *hw)
 648{
 649        s32 ret_val = -E1000_ERR_NVM;
 650        u32 i, reg;
 651
 652        for (i = 0; i < E1000_FLUDONE_ATTEMPTS; i++) {
 653                reg = rd32(E1000_EECD);
 654                if (reg & E1000_EECD_FLUDONE_I210) {
 655                        ret_val = 0;
 656                        break;
 657                }
 658                udelay(5);
 659        }
 660
 661        return ret_val;
 662}
 663
 664/**
 665 *  igb_get_flash_presence_i210 - Check if flash device is detected.
 666 *  @hw: pointer to the HW structure
 667 *
 668 **/
 669bool igb_get_flash_presence_i210(struct e1000_hw *hw)
 670{
 671        u32 eec = 0;
 672        bool ret_val = false;
 673
 674        eec = rd32(E1000_EECD);
 675        if (eec & E1000_EECD_FLASH_DETECTED_I210)
 676                ret_val = true;
 677
 678        return ret_val;
 679}
 680
 681/**
 682 *  igb_update_flash_i210 - Commit EEPROM to the flash
 683 *  @hw: pointer to the HW structure
 684 *
 685 **/
 686static s32 igb_update_flash_i210(struct e1000_hw *hw)
 687{
 688        s32 ret_val = 0;
 689        u32 flup;
 690
 691        ret_val = igb_pool_flash_update_done_i210(hw);
 692        if (ret_val == -E1000_ERR_NVM) {
 693                hw_dbg("Flash update time out\n");
 694                goto out;
 695        }
 696
 697        flup = rd32(E1000_EECD) | E1000_EECD_FLUPD_I210;
 698        wr32(E1000_EECD, flup);
 699
 700        ret_val = igb_pool_flash_update_done_i210(hw);
 701        if (ret_val)
 702                hw_dbg("Flash update complete\n");
 703        else
 704                hw_dbg("Flash update time out\n");
 705
 706out:
 707        return ret_val;
 708}
 709
 710/**
 711 *  igb_valid_led_default_i210 - Verify a valid default LED config
 712 *  @hw: pointer to the HW structure
 713 *  @data: pointer to the NVM (EEPROM)
 714 *
 715 *  Read the EEPROM for the current default LED configuration.  If the
 716 *  LED configuration is not valid, set to a valid LED configuration.
 717 **/
 718s32 igb_valid_led_default_i210(struct e1000_hw *hw, u16 *data)
 719{
 720        s32 ret_val;
 721
 722        ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
 723        if (ret_val) {
 724                hw_dbg("NVM Read Error\n");
 725                goto out;
 726        }
 727
 728        if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) {
 729                switch (hw->phy.media_type) {
 730                case e1000_media_type_internal_serdes:
 731                        *data = ID_LED_DEFAULT_I210_SERDES;
 732                        break;
 733                case e1000_media_type_copper:
 734                default:
 735                        *data = ID_LED_DEFAULT_I210;
 736                        break;
 737                }
 738        }
 739out:
 740        return ret_val;
 741}
 742
 743/**
 744 *  __igb_access_xmdio_reg - Read/write XMDIO register
 745 *  @hw: pointer to the HW structure
 746 *  @address: XMDIO address to program
 747 *  @dev_addr: device address to program
 748 *  @data: pointer to value to read/write from/to the XMDIO address
 749 *  @read: boolean flag to indicate read or write
 750 **/
 751static s32 __igb_access_xmdio_reg(struct e1000_hw *hw, u16 address,
 752                                  u8 dev_addr, u16 *data, bool read)
 753{
 754        s32 ret_val = 0;
 755
 756        ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, dev_addr);
 757        if (ret_val)
 758                return ret_val;
 759
 760        ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAAD, address);
 761        if (ret_val)
 762                return ret_val;
 763
 764        ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, E1000_MMDAC_FUNC_DATA |
 765                                                         dev_addr);
 766        if (ret_val)
 767                return ret_val;
 768
 769        if (read)
 770                ret_val = hw->phy.ops.read_reg(hw, E1000_MMDAAD, data);
 771        else
 772                ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAAD, *data);
 773        if (ret_val)
 774                return ret_val;
 775
 776        /* Recalibrate the device back to 0 */
 777        ret_val = hw->phy.ops.write_reg(hw, E1000_MMDAC, 0);
 778        if (ret_val)
 779                return ret_val;
 780
 781        return ret_val;
 782}
 783
 784/**
 785 *  igb_read_xmdio_reg - Read XMDIO register
 786 *  @hw: pointer to the HW structure
 787 *  @addr: XMDIO address to program
 788 *  @dev_addr: device address to program
 789 *  @data: value to be read from the EMI address
 790 **/
 791s32 igb_read_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 *data)
 792{
 793        return __igb_access_xmdio_reg(hw, addr, dev_addr, data, true);
 794}
 795
 796/**
 797 *  igb_write_xmdio_reg - Write XMDIO register
 798 *  @hw: pointer to the HW structure
 799 *  @addr: XMDIO address to program
 800 *  @dev_addr: device address to program
 801 *  @data: value to be written to the XMDIO address
 802 **/
 803s32 igb_write_xmdio_reg(struct e1000_hw *hw, u16 addr, u8 dev_addr, u16 data)
 804{
 805        return __igb_access_xmdio_reg(hw, addr, dev_addr, &data, false);
 806}
 807
 808/**
 809 *  igb_init_nvm_params_i210 - Init NVM func ptrs.
 810 *  @hw: pointer to the HW structure
 811 **/
 812s32 igb_init_nvm_params_i210(struct e1000_hw *hw)
 813{
 814        s32 ret_val = 0;
 815        struct e1000_nvm_info *nvm = &hw->nvm;
 816
 817        nvm->ops.acquire = igb_acquire_nvm_i210;
 818        nvm->ops.release = igb_release_nvm_i210;
 819        nvm->ops.valid_led_default = igb_valid_led_default_i210;
 820
 821        /* NVM Function Pointers */
 822        if (igb_get_flash_presence_i210(hw)) {
 823                hw->nvm.type = e1000_nvm_flash_hw;
 824                nvm->ops.read    = igb_read_nvm_srrd_i210;
 825                nvm->ops.write   = igb_write_nvm_srwr_i210;
 826                nvm->ops.validate = igb_validate_nvm_checksum_i210;
 827                nvm->ops.update   = igb_update_nvm_checksum_i210;
 828        } else {
 829                hw->nvm.type = e1000_nvm_invm;
 830                nvm->ops.read     = igb_read_invm_i210;
 831                nvm->ops.write    = NULL;
 832                nvm->ops.validate = NULL;
 833                nvm->ops.update   = NULL;
 834        }
 835        return ret_val;
 836}
 837
 838/**
 839 * igb_pll_workaround_i210
 840 * @hw: pointer to the HW structure
 841 *
 842 * Works around an errata in the PLL circuit where it occasionally
 843 * provides the wrong clock frequency after power up.
 844 **/
 845s32 igb_pll_workaround_i210(struct e1000_hw *hw)
 846{
 847        s32 ret_val;
 848        u32 wuc, mdicnfg, ctrl, ctrl_ext, reg_val;
 849        u16 nvm_word, phy_word, pci_word, tmp_nvm;
 850        int i;
 851
 852        /* Get and set needed register values */
 853        wuc = rd32(E1000_WUC);
 854        mdicnfg = rd32(E1000_MDICNFG);
 855        reg_val = mdicnfg & ~E1000_MDICNFG_EXT_MDIO;
 856        wr32(E1000_MDICNFG, reg_val);
 857
 858        /* Get data from NVM, or set default */
 859        ret_val = igb_read_invm_word_i210(hw, E1000_INVM_AUTOLOAD,
 860                                          &nvm_word);
 861        if (ret_val)
 862                nvm_word = E1000_INVM_DEFAULT_AL;
 863        tmp_nvm = nvm_word | E1000_INVM_PLL_WO_VAL;
 864        for (i = 0; i < E1000_MAX_PLL_TRIES; i++) {
 865                /* check current state directly from internal PHY */
 866                igb_read_phy_reg_gs40g(hw, (E1000_PHY_PLL_FREQ_PAGE |
 867                                         E1000_PHY_PLL_FREQ_REG), &phy_word);
 868                if ((phy_word & E1000_PHY_PLL_UNCONF)
 869                    != E1000_PHY_PLL_UNCONF) {
 870                        ret_val = 0;
 871                        break;
 872                } else {
 873                        ret_val = -E1000_ERR_PHY;
 874                }
 875                /* directly reset the internal PHY */
 876                ctrl = rd32(E1000_CTRL);
 877                wr32(E1000_CTRL, ctrl|E1000_CTRL_PHY_RST);
 878
 879                ctrl_ext = rd32(E1000_CTRL_EXT);
 880                ctrl_ext |= (E1000_CTRL_EXT_PHYPDEN | E1000_CTRL_EXT_SDLPE);
 881                wr32(E1000_CTRL_EXT, ctrl_ext);
 882
 883                wr32(E1000_WUC, 0);
 884                reg_val = (E1000_INVM_AUTOLOAD << 4) | (tmp_nvm << 16);
 885                wr32(E1000_EEARBC_I210, reg_val);
 886
 887                igb_read_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word);
 888                pci_word |= E1000_PCI_PMCSR_D3;
 889                igb_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word);
 890                usleep_range(1000, 2000);
 891                pci_word &= ~E1000_PCI_PMCSR_D3;
 892                igb_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word);
 893                reg_val = (E1000_INVM_AUTOLOAD << 4) | (nvm_word << 16);
 894                wr32(E1000_EEARBC_I210, reg_val);
 895
 896                /* restore WUC register */
 897                wr32(E1000_WUC, wuc);
 898        }
 899        /* restore MDICNFG setting */
 900        wr32(E1000_MDICNFG, mdicnfg);
 901        return ret_val;
 902}
 903