1 /* Intel(R) Gigabit Ethernet Linux driver 2 * Copyright(c) 2007-2014 Intel Corporation. 3 * This program is free software; you can redistribute it and/or modify it 4 * under the terms and conditions of the GNU General Public License, 5 * version 2, as published by the Free Software Foundation. 6 * 7 * This program is distributed in the hope it will be useful, but WITHOUT 8 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 9 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 10 * more details. 11 * 12 * You should have received a copy of the GNU General Public License along with 13 * this program; if not, see <http://www.gnu.org/licenses/>. 14 * 15 * The full GNU General Public License is included in this distribution in 16 * the file called "COPYING". 17 * 18 * Contact Information: 19 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 20 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 21 */ 22 23 #include <linux/if_ether.h> 24 #include <linux/delay.h> 25 26 #include "e1000_mac.h" 27 #include "e1000_nvm.h" 28 29 /** 30 * igb_raise_eec_clk - Raise EEPROM clock 31 * @hw: pointer to the HW structure 32 * @eecd: pointer to the EEPROM 33 * 34 * Enable/Raise the EEPROM clock bit. 35 **/ 36 static void igb_raise_eec_clk(struct e1000_hw *hw, u32 *eecd) 37 { 38 *eecd = *eecd | E1000_EECD_SK; 39 wr32(E1000_EECD, *eecd); 40 wrfl(); 41 udelay(hw->nvm.delay_usec); 42 } 43 44 /** 45 * igb_lower_eec_clk - Lower EEPROM clock 46 * @hw: pointer to the HW structure 47 * @eecd: pointer to the EEPROM 48 * 49 * Clear/Lower the EEPROM clock bit. 50 **/ 51 static void igb_lower_eec_clk(struct e1000_hw *hw, u32 *eecd) 52 { 53 *eecd = *eecd & ~E1000_EECD_SK; 54 wr32(E1000_EECD, *eecd); 55 wrfl(); 56 udelay(hw->nvm.delay_usec); 57 } 58 59 /** 60 * igb_shift_out_eec_bits - Shift data bits our to the EEPROM 61 * @hw: pointer to the HW structure 62 * @data: data to send to the EEPROM 63 * @count: number of bits to shift out 64 * 65 * We need to shift 'count' bits out to the EEPROM. So, the value in the 66 * "data" parameter will be shifted out to the EEPROM one bit at a time. 67 * In order to do this, "data" must be broken down into bits. 68 **/ 69 static void igb_shift_out_eec_bits(struct e1000_hw *hw, u16 data, u16 count) 70 { 71 struct e1000_nvm_info *nvm = &hw->nvm; 72 u32 eecd = rd32(E1000_EECD); 73 u32 mask; 74 75 mask = 1u << (count - 1); 76 if (nvm->type == e1000_nvm_eeprom_spi) 77 eecd |= E1000_EECD_DO; 78 79 do { 80 eecd &= ~E1000_EECD_DI; 81 82 if (data & mask) 83 eecd |= E1000_EECD_DI; 84 85 wr32(E1000_EECD, eecd); 86 wrfl(); 87 88 udelay(nvm->delay_usec); 89 90 igb_raise_eec_clk(hw, &eecd); 91 igb_lower_eec_clk(hw, &eecd); 92 93 mask >>= 1; 94 } while (mask); 95 96 eecd &= ~E1000_EECD_DI; 97 wr32(E1000_EECD, eecd); 98 } 99 100 /** 101 * igb_shift_in_eec_bits - Shift data bits in from the EEPROM 102 * @hw: pointer to the HW structure 103 * @count: number of bits to shift in 104 * 105 * In order to read a register from the EEPROM, we need to shift 'count' bits 106 * in from the EEPROM. Bits are "shifted in" by raising the clock input to 107 * the EEPROM (setting the SK bit), and then reading the value of the data out 108 * "DO" bit. During this "shifting in" process the data in "DI" bit should 109 * always be clear. 110 **/ 111 static u16 igb_shift_in_eec_bits(struct e1000_hw *hw, u16 count) 112 { 113 u32 eecd; 114 u32 i; 115 u16 data; 116 117 eecd = rd32(E1000_EECD); 118 119 eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); 120 data = 0; 121 122 for (i = 0; i < count; i++) { 123 data <<= 1; 124 igb_raise_eec_clk(hw, &eecd); 125 126 eecd = rd32(E1000_EECD); 127 128 eecd &= ~E1000_EECD_DI; 129 if (eecd & E1000_EECD_DO) 130 data |= 1; 131 132 igb_lower_eec_clk(hw, &eecd); 133 } 134 135 return data; 136 } 137 138 /** 139 * igb_poll_eerd_eewr_done - Poll for EEPROM read/write completion 140 * @hw: pointer to the HW structure 141 * @ee_reg: EEPROM flag for polling 142 * 143 * Polls the EEPROM status bit for either read or write completion based 144 * upon the value of 'ee_reg'. 145 **/ 146 static s32 igb_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg) 147 { 148 u32 attempts = 100000; 149 u32 i, reg = 0; 150 s32 ret_val = -E1000_ERR_NVM; 151 152 for (i = 0; i < attempts; i++) { 153 if (ee_reg == E1000_NVM_POLL_READ) 154 reg = rd32(E1000_EERD); 155 else 156 reg = rd32(E1000_EEWR); 157 158 if (reg & E1000_NVM_RW_REG_DONE) { 159 ret_val = 0; 160 break; 161 } 162 163 udelay(5); 164 } 165 166 return ret_val; 167 } 168 169 /** 170 * igb_acquire_nvm - Generic request for access to EEPROM 171 * @hw: pointer to the HW structure 172 * 173 * Set the EEPROM access request bit and wait for EEPROM access grant bit. 174 * Return successful if access grant bit set, else clear the request for 175 * EEPROM access and return -E1000_ERR_NVM (-1). 176 **/ 177 s32 igb_acquire_nvm(struct e1000_hw *hw) 178 { 179 u32 eecd = rd32(E1000_EECD); 180 s32 timeout = E1000_NVM_GRANT_ATTEMPTS; 181 s32 ret_val = 0; 182 183 184 wr32(E1000_EECD, eecd | E1000_EECD_REQ); 185 eecd = rd32(E1000_EECD); 186 187 while (timeout) { 188 if (eecd & E1000_EECD_GNT) 189 break; 190 udelay(5); 191 eecd = rd32(E1000_EECD); 192 timeout--; 193 } 194 195 if (!timeout) { 196 eecd &= ~E1000_EECD_REQ; 197 wr32(E1000_EECD, eecd); 198 hw_dbg("Could not acquire NVM grant\n"); 199 ret_val = -E1000_ERR_NVM; 200 } 201 202 return ret_val; 203 } 204 205 /** 206 * igb_standby_nvm - Return EEPROM to standby state 207 * @hw: pointer to the HW structure 208 * 209 * Return the EEPROM to a standby state. 210 **/ 211 static void igb_standby_nvm(struct e1000_hw *hw) 212 { 213 struct e1000_nvm_info *nvm = &hw->nvm; 214 u32 eecd = rd32(E1000_EECD); 215 216 if (nvm->type == e1000_nvm_eeprom_spi) { 217 /* Toggle CS to flush commands */ 218 eecd |= E1000_EECD_CS; 219 wr32(E1000_EECD, eecd); 220 wrfl(); 221 udelay(nvm->delay_usec); 222 eecd &= ~E1000_EECD_CS; 223 wr32(E1000_EECD, eecd); 224 wrfl(); 225 udelay(nvm->delay_usec); 226 } 227 } 228 229 /** 230 * e1000_stop_nvm - Terminate EEPROM command 231 * @hw: pointer to the HW structure 232 * 233 * Terminates the current command by inverting the EEPROM's chip select pin. 234 **/ 235 static void e1000_stop_nvm(struct e1000_hw *hw) 236 { 237 u32 eecd; 238 239 eecd = rd32(E1000_EECD); 240 if (hw->nvm.type == e1000_nvm_eeprom_spi) { 241 /* Pull CS high */ 242 eecd |= E1000_EECD_CS; 243 igb_lower_eec_clk(hw, &eecd); 244 } 245 } 246 247 /** 248 * igb_release_nvm - Release exclusive access to EEPROM 249 * @hw: pointer to the HW structure 250 * 251 * Stop any current commands to the EEPROM and clear the EEPROM request bit. 252 **/ 253 void igb_release_nvm(struct e1000_hw *hw) 254 { 255 u32 eecd; 256 257 e1000_stop_nvm(hw); 258 259 eecd = rd32(E1000_EECD); 260 eecd &= ~E1000_EECD_REQ; 261 wr32(E1000_EECD, eecd); 262 } 263 264 /** 265 * igb_ready_nvm_eeprom - Prepares EEPROM for read/write 266 * @hw: pointer to the HW structure 267 * 268 * Setups the EEPROM for reading and writing. 269 **/ 270 static s32 igb_ready_nvm_eeprom(struct e1000_hw *hw) 271 { 272 struct e1000_nvm_info *nvm = &hw->nvm; 273 u32 eecd = rd32(E1000_EECD); 274 s32 ret_val = 0; 275 u16 timeout = 0; 276 u8 spi_stat_reg; 277 278 279 if (nvm->type == e1000_nvm_eeprom_spi) { 280 /* Clear SK and CS */ 281 eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); 282 wr32(E1000_EECD, eecd); 283 wrfl(); 284 udelay(1); 285 timeout = NVM_MAX_RETRY_SPI; 286 287 /* Read "Status Register" repeatedly until the LSB is cleared. 288 * The EEPROM will signal that the command has been completed 289 * by clearing bit 0 of the internal status register. If it's 290 * not cleared within 'timeout', then error out. 291 */ 292 while (timeout) { 293 igb_shift_out_eec_bits(hw, NVM_RDSR_OPCODE_SPI, 294 hw->nvm.opcode_bits); 295 spi_stat_reg = (u8)igb_shift_in_eec_bits(hw, 8); 296 if (!(spi_stat_reg & NVM_STATUS_RDY_SPI)) 297 break; 298 299 udelay(5); 300 igb_standby_nvm(hw); 301 timeout--; 302 } 303 304 if (!timeout) { 305 hw_dbg("SPI NVM Status error\n"); 306 ret_val = -E1000_ERR_NVM; 307 goto out; 308 } 309 } 310 311 out: 312 return ret_val; 313 } 314 315 /** 316 * igb_read_nvm_spi - Read EEPROM's using SPI 317 * @hw: pointer to the HW structure 318 * @offset: offset of word in the EEPROM to read 319 * @words: number of words to read 320 * @data: word read from the EEPROM 321 * 322 * Reads a 16 bit word from the EEPROM. 323 **/ 324 s32 igb_read_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 325 { 326 struct e1000_nvm_info *nvm = &hw->nvm; 327 u32 i = 0; 328 s32 ret_val; 329 u16 word_in; 330 u8 read_opcode = NVM_READ_OPCODE_SPI; 331 332 /* A check for invalid values: offset too large, too many words, 333 * and not enough words. 334 */ 335 if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || 336 (words == 0)) { 337 hw_dbg("nvm parameter(s) out of bounds\n"); 338 ret_val = -E1000_ERR_NVM; 339 goto out; 340 } 341 342 ret_val = nvm->ops.acquire(hw); 343 if (ret_val) 344 goto out; 345 346 ret_val = igb_ready_nvm_eeprom(hw); 347 if (ret_val) 348 goto release; 349 350 igb_standby_nvm(hw); 351 352 if ((nvm->address_bits == 8) && (offset >= 128)) 353 read_opcode |= NVM_A8_OPCODE_SPI; 354 355 /* Send the READ command (opcode + addr) */ 356 igb_shift_out_eec_bits(hw, read_opcode, nvm->opcode_bits); 357 igb_shift_out_eec_bits(hw, (u16)(offset*2), nvm->address_bits); 358 359 /* Read the data. SPI NVMs increment the address with each byte 360 * read and will roll over if reading beyond the end. This allows 361 * us to read the whole NVM from any offset 362 */ 363 for (i = 0; i < words; i++) { 364 word_in = igb_shift_in_eec_bits(hw, 16); 365 data[i] = (word_in >> 8) | (word_in << 8); 366 } 367 368 release: 369 nvm->ops.release(hw); 370 371 out: 372 return ret_val; 373 } 374 375 /** 376 * igb_read_nvm_eerd - Reads EEPROM using EERD register 377 * @hw: pointer to the HW structure 378 * @offset: offset of word in the EEPROM to read 379 * @words: number of words to read 380 * @data: word read from the EEPROM 381 * 382 * Reads a 16 bit word from the EEPROM using the EERD register. 383 **/ 384 s32 igb_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 385 { 386 struct e1000_nvm_info *nvm = &hw->nvm; 387 u32 i, eerd = 0; 388 s32 ret_val = 0; 389 390 /* A check for invalid values: offset too large, too many words, 391 * and not enough words. 392 */ 393 if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || 394 (words == 0)) { 395 hw_dbg("nvm parameter(s) out of bounds\n"); 396 ret_val = -E1000_ERR_NVM; 397 goto out; 398 } 399 400 for (i = 0; i < words; i++) { 401 eerd = ((offset+i) << E1000_NVM_RW_ADDR_SHIFT) + 402 E1000_NVM_RW_REG_START; 403 404 wr32(E1000_EERD, eerd); 405 ret_val = igb_poll_eerd_eewr_done(hw, E1000_NVM_POLL_READ); 406 if (ret_val) 407 break; 408 409 data[i] = (rd32(E1000_EERD) >> 410 E1000_NVM_RW_REG_DATA); 411 } 412 413 out: 414 return ret_val; 415 } 416 417 /** 418 * igb_write_nvm_spi - Write to EEPROM using SPI 419 * @hw: pointer to the HW structure 420 * @offset: offset within the EEPROM to be written to 421 * @words: number of words to write 422 * @data: 16 bit word(s) to be written to the EEPROM 423 * 424 * Writes data to EEPROM at offset using SPI interface. 425 * 426 * If e1000_update_nvm_checksum is not called after this function , the 427 * EEPROM will most likley contain an invalid checksum. 428 **/ 429 s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 430 { 431 struct e1000_nvm_info *nvm = &hw->nvm; 432 s32 ret_val = -E1000_ERR_NVM; 433 u16 widx = 0; 434 435 /* A check for invalid values: offset too large, too many words, 436 * and not enough words. 437 */ 438 if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || 439 (words == 0)) { 440 hw_dbg("nvm parameter(s) out of bounds\n"); 441 return ret_val; 442 } 443 444 while (widx < words) { 445 u8 write_opcode = NVM_WRITE_OPCODE_SPI; 446 447 ret_val = nvm->ops.acquire(hw); 448 if (ret_val) 449 return ret_val; 450 451 ret_val = igb_ready_nvm_eeprom(hw); 452 if (ret_val) { 453 nvm->ops.release(hw); 454 return ret_val; 455 } 456 457 igb_standby_nvm(hw); 458 459 /* Send the WRITE ENABLE command (8 bit opcode) */ 460 igb_shift_out_eec_bits(hw, NVM_WREN_OPCODE_SPI, 461 nvm->opcode_bits); 462 463 igb_standby_nvm(hw); 464 465 /* Some SPI eeproms use the 8th address bit embedded in the 466 * opcode 467 */ 468 if ((nvm->address_bits == 8) && (offset >= 128)) 469 write_opcode |= NVM_A8_OPCODE_SPI; 470 471 /* Send the Write command (8-bit opcode + addr) */ 472 igb_shift_out_eec_bits(hw, write_opcode, nvm->opcode_bits); 473 igb_shift_out_eec_bits(hw, (u16)((offset + widx) * 2), 474 nvm->address_bits); 475 476 /* Loop to allow for up to whole page write of eeprom */ 477 while (widx < words) { 478 u16 word_out = data[widx]; 479 480 word_out = (word_out >> 8) | (word_out << 8); 481 igb_shift_out_eec_bits(hw, word_out, 16); 482 widx++; 483 484 if ((((offset + widx) * 2) % nvm->page_size) == 0) { 485 igb_standby_nvm(hw); 486 break; 487 } 488 } 489 usleep_range(1000, 2000); 490 nvm->ops.release(hw); 491 } 492 493 return ret_val; 494 } 495 496 /** 497 * igb_read_part_string - Read device part number 498 * @hw: pointer to the HW structure 499 * @part_num: pointer to device part number 500 * @part_num_size: size of part number buffer 501 * 502 * Reads the product board assembly (PBA) number from the EEPROM and stores 503 * the value in part_num. 504 **/ 505 s32 igb_read_part_string(struct e1000_hw *hw, u8 *part_num, u32 part_num_size) 506 { 507 s32 ret_val; 508 u16 nvm_data; 509 u16 pointer; 510 u16 offset; 511 u16 length; 512 513 if (part_num == NULL) { 514 hw_dbg("PBA string buffer was null\n"); 515 ret_val = E1000_ERR_INVALID_ARGUMENT; 516 goto out; 517 } 518 519 ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_0, 1, &nvm_data); 520 if (ret_val) { 521 hw_dbg("NVM Read Error\n"); 522 goto out; 523 } 524 525 ret_val = hw->nvm.ops.read(hw, NVM_PBA_OFFSET_1, 1, &pointer); 526 if (ret_val) { 527 hw_dbg("NVM Read Error\n"); 528 goto out; 529 } 530 531 /* if nvm_data is not ptr guard the PBA must be in legacy format which 532 * means pointer is actually our second data word for the PBA number 533 * and we can decode it into an ascii string 534 */ 535 if (nvm_data != NVM_PBA_PTR_GUARD) { 536 hw_dbg("NVM PBA number is not stored as string\n"); 537 538 /* we will need 11 characters to store the PBA */ 539 if (part_num_size < 11) { 540 hw_dbg("PBA string buffer too small\n"); 541 return E1000_ERR_NO_SPACE; 542 } 543 544 /* extract hex string from data and pointer */ 545 part_num[0] = (nvm_data >> 12) & 0xF; 546 part_num[1] = (nvm_data >> 8) & 0xF; 547 part_num[2] = (nvm_data >> 4) & 0xF; 548 part_num[3] = nvm_data & 0xF; 549 part_num[4] = (pointer >> 12) & 0xF; 550 part_num[5] = (pointer >> 8) & 0xF; 551 part_num[6] = '-'; 552 part_num[7] = 0; 553 part_num[8] = (pointer >> 4) & 0xF; 554 part_num[9] = pointer & 0xF; 555 556 /* put a null character on the end of our string */ 557 part_num[10] = '\0'; 558 559 /* switch all the data but the '-' to hex char */ 560 for (offset = 0; offset < 10; offset++) { 561 if (part_num[offset] < 0xA) 562 part_num[offset] += '0'; 563 else if (part_num[offset] < 0x10) 564 part_num[offset] += 'A' - 0xA; 565 } 566 567 goto out; 568 } 569 570 ret_val = hw->nvm.ops.read(hw, pointer, 1, &length); 571 if (ret_val) { 572 hw_dbg("NVM Read Error\n"); 573 goto out; 574 } 575 576 if (length == 0xFFFF || length == 0) { 577 hw_dbg("NVM PBA number section invalid length\n"); 578 ret_val = E1000_ERR_NVM_PBA_SECTION; 579 goto out; 580 } 581 /* check if part_num buffer is big enough */ 582 if (part_num_size < (((u32)length * 2) - 1)) { 583 hw_dbg("PBA string buffer too small\n"); 584 ret_val = E1000_ERR_NO_SPACE; 585 goto out; 586 } 587 588 /* trim pba length from start of string */ 589 pointer++; 590 length--; 591 592 for (offset = 0; offset < length; offset++) { 593 ret_val = hw->nvm.ops.read(hw, pointer + offset, 1, &nvm_data); 594 if (ret_val) { 595 hw_dbg("NVM Read Error\n"); 596 goto out; 597 } 598 part_num[offset * 2] = (u8)(nvm_data >> 8); 599 part_num[(offset * 2) + 1] = (u8)(nvm_data & 0xFF); 600 } 601 part_num[offset * 2] = '\0'; 602 603 out: 604 return ret_val; 605 } 606 607 /** 608 * igb_read_mac_addr - Read device MAC address 609 * @hw: pointer to the HW structure 610 * 611 * Reads the device MAC address from the EEPROM and stores the value. 612 * Since devices with two ports use the same EEPROM, we increment the 613 * last bit in the MAC address for the second port. 614 **/ 615 s32 igb_read_mac_addr(struct e1000_hw *hw) 616 { 617 u32 rar_high; 618 u32 rar_low; 619 u16 i; 620 621 rar_high = rd32(E1000_RAH(0)); 622 rar_low = rd32(E1000_RAL(0)); 623 624 for (i = 0; i < E1000_RAL_MAC_ADDR_LEN; i++) 625 hw->mac.perm_addr[i] = (u8)(rar_low >> (i*8)); 626 627 for (i = 0; i < E1000_RAH_MAC_ADDR_LEN; i++) 628 hw->mac.perm_addr[i+4] = (u8)(rar_high >> (i*8)); 629 630 for (i = 0; i < ETH_ALEN; i++) 631 hw->mac.addr[i] = hw->mac.perm_addr[i]; 632 633 return 0; 634 } 635 636 /** 637 * igb_validate_nvm_checksum - Validate EEPROM checksum 638 * @hw: pointer to the HW structure 639 * 640 * Calculates the EEPROM checksum by reading/adding each word of the EEPROM 641 * and then verifies that the sum of the EEPROM is equal to 0xBABA. 642 **/ 643 s32 igb_validate_nvm_checksum(struct e1000_hw *hw) 644 { 645 s32 ret_val = 0; 646 u16 checksum = 0; 647 u16 i, nvm_data; 648 649 for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) { 650 ret_val = hw->nvm.ops.read(hw, i, 1, &nvm_data); 651 if (ret_val) { 652 hw_dbg("NVM Read Error\n"); 653 goto out; 654 } 655 checksum += nvm_data; 656 } 657 658 if (checksum != (u16) NVM_SUM) { 659 hw_dbg("NVM Checksum Invalid\n"); 660 ret_val = -E1000_ERR_NVM; 661 goto out; 662 } 663 664 out: 665 return ret_val; 666 } 667 668 /** 669 * igb_update_nvm_checksum - Update EEPROM checksum 670 * @hw: pointer to the HW structure 671 * 672 * Updates the EEPROM checksum by reading/adding each word of the EEPROM 673 * up to the checksum. Then calculates the EEPROM checksum and writes the 674 * value to the EEPROM. 675 **/ 676 s32 igb_update_nvm_checksum(struct e1000_hw *hw) 677 { 678 s32 ret_val; 679 u16 checksum = 0; 680 u16 i, nvm_data; 681 682 for (i = 0; i < NVM_CHECKSUM_REG; i++) { 683 ret_val = hw->nvm.ops.read(hw, i, 1, &nvm_data); 684 if (ret_val) { 685 hw_dbg("NVM Read Error while updating checksum.\n"); 686 goto out; 687 } 688 checksum += nvm_data; 689 } 690 checksum = (u16) NVM_SUM - checksum; 691 ret_val = hw->nvm.ops.write(hw, NVM_CHECKSUM_REG, 1, &checksum); 692 if (ret_val) 693 hw_dbg("NVM Write Error while updating checksum.\n"); 694 695 out: 696 return ret_val; 697 } 698 699 /** 700 * igb_get_fw_version - Get firmware version information 701 * @hw: pointer to the HW structure 702 * @fw_vers: pointer to output structure 703 * 704 * unsupported MAC types will return all 0 version structure 705 **/ 706 void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers) 707 { 708 u16 eeprom_verh, eeprom_verl, etrack_test, fw_version; 709 u8 q, hval, rem, result; 710 u16 comb_verh, comb_verl, comb_offset; 711 712 memset(fw_vers, 0, sizeof(struct e1000_fw_version)); 713 714 /* basic eeprom version numbers and bits used vary by part and by tool 715 * used to create the nvm images. Check which data format we have. 716 */ 717 hw->nvm.ops.read(hw, NVM_ETRACK_HIWORD, 1, &etrack_test); 718 switch (hw->mac.type) { 719 case e1000_i211: 720 igb_read_invm_version(hw, fw_vers); 721 return; 722 case e1000_82575: 723 case e1000_82576: 724 case e1000_82580: 725 /* Use this format, unless EETRACK ID exists, 726 * then use alternate format 727 */ 728 if ((etrack_test & NVM_MAJOR_MASK) != NVM_ETRACK_VALID) { 729 hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version); 730 fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK) 731 >> NVM_MAJOR_SHIFT; 732 fw_vers->eep_minor = (fw_version & NVM_MINOR_MASK) 733 >> NVM_MINOR_SHIFT; 734 fw_vers->eep_build = (fw_version & NVM_IMAGE_ID_MASK); 735 goto etrack_id; 736 } 737 break; 738 case e1000_i210: 739 if (!(igb_get_flash_presence_i210(hw))) { 740 igb_read_invm_version(hw, fw_vers); 741 return; 742 } 743 /* fall through */ 744 case e1000_i350: 745 /* find combo image version */ 746 hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset); 747 if ((comb_offset != 0x0) && 748 (comb_offset != NVM_VER_INVALID)) { 749 750 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset 751 + 1), 1, &comb_verh); 752 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset), 753 1, &comb_verl); 754 755 /* get Option Rom version if it exists and is valid */ 756 if ((comb_verh && comb_verl) && 757 ((comb_verh != NVM_VER_INVALID) && 758 (comb_verl != NVM_VER_INVALID))) { 759 760 fw_vers->or_valid = true; 761 fw_vers->or_major = 762 comb_verl >> NVM_COMB_VER_SHFT; 763 fw_vers->or_build = 764 (comb_verl << NVM_COMB_VER_SHFT) 765 | (comb_verh >> NVM_COMB_VER_SHFT); 766 fw_vers->or_patch = 767 comb_verh & NVM_COMB_VER_MASK; 768 } 769 } 770 break; 771 default: 772 return; 773 } 774 hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version); 775 fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK) 776 >> NVM_MAJOR_SHIFT; 777 778 /* check for old style version format in newer images*/ 779 if ((fw_version & NVM_NEW_DEC_MASK) == 0x0) { 780 eeprom_verl = (fw_version & NVM_COMB_VER_MASK); 781 } else { 782 eeprom_verl = (fw_version & NVM_MINOR_MASK) 783 >> NVM_MINOR_SHIFT; 784 } 785 /* Convert minor value to hex before assigning to output struct 786 * Val to be converted will not be higher than 99, per tool output 787 */ 788 q = eeprom_verl / NVM_HEX_CONV; 789 hval = q * NVM_HEX_TENS; 790 rem = eeprom_verl % NVM_HEX_CONV; 791 result = hval + rem; 792 fw_vers->eep_minor = result; 793 794 etrack_id: 795 if ((etrack_test & NVM_MAJOR_MASK) == NVM_ETRACK_VALID) { 796 hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verl); 797 hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verh); 798 fw_vers->etrack_id = (eeprom_verh << NVM_ETRACK_SHIFT) 799 | eeprom_verl; 800 } 801 } 802