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