FreeBSD kernel E1000 device code
e1000_i210.c
Go to the documentation of this file.
1/******************************************************************************
2 SPDX-License-Identifier: BSD-3-Clause
3
4 Copyright (c) 2001-2020, Intel Corporation
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9
10 1. Redistributions of source code must retain the above copyright notice,
11 this list of conditions and the following disclaimer.
12
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
16
17 3. Neither the name of the Intel Corporation nor the names of its
18 contributors may be used to endorse or promote products derived from
19 this software without specific prior written permission.
20
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 POSSIBILITY OF SUCH DAMAGE.
32
33******************************************************************************/
34/*$FreeBSD$*/
35
36#include "e1000_api.h"
37
38
39static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw);
40static void e1000_release_nvm_i210(struct e1000_hw *hw);
41static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
42 u16 *data);
44static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data);
45
56{
57 s32 ret_val;
58
59 DEBUGFUNC("e1000_acquire_nvm_i210");
60
62
63 return ret_val;
64}
65
73static void e1000_release_nvm_i210(struct e1000_hw *hw)
74{
75 DEBUGFUNC("e1000_release_nvm_i210");
76
78}
79
90s32 e1000_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, u16 words,
91 u16 *data)
92{
93 s32 status = E1000_SUCCESS;
94 u16 i, count;
95
96 DEBUGFUNC("e1000_read_nvm_srrd_i210");
97
98 /* We cannot hold synchronization semaphores for too long,
99 * because of forceful takeover procedure. However it is more efficient
100 * to read in bursts than synchronizing access for each word. */
101 for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
102 count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
103 E1000_EERD_EEWR_MAX_COUNT : (words - i);
104 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
105 status = e1000_read_nvm_eerd(hw, offset, count,
106 data + i);
107 hw->nvm.ops.release(hw);
108 } else {
109 status = E1000_ERR_SWFW_SYNC;
110 }
111
112 if (status != E1000_SUCCESS)
113 break;
114 }
115
116 return status;
117}
118
135s32 e1000_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, u16 words,
136 u16 *data)
137{
138 s32 status = E1000_SUCCESS;
139 u16 i, count;
140
141 DEBUGFUNC("e1000_write_nvm_srwr_i210");
142
143 /* We cannot hold synchronization semaphores for too long,
144 * because of forceful takeover procedure. However it is more efficient
145 * to write in bursts than synchronizing access for each word. */
146 for (i = 0; i < words; i += E1000_EERD_EEWR_MAX_COUNT) {
147 count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ?
148 E1000_EERD_EEWR_MAX_COUNT : (words - i);
149 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
150 status = e1000_write_nvm_srwr(hw, offset, count,
151 data + i);
152 hw->nvm.ops.release(hw);
153 } else {
154 status = E1000_ERR_SWFW_SYNC;
155 }
156
157 if (status != E1000_SUCCESS)
158 break;
159 }
160
161 return status;
162}
163
176static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
177 u16 *data)
178{
179 struct e1000_nvm_info *nvm = &hw->nvm;
180 u32 i, k, eewr = 0;
181 u32 attempts = 100000;
182 s32 ret_val = E1000_SUCCESS;
183
184 DEBUGFUNC("e1000_write_nvm_srwr");
185
186 /*
187 * A check for invalid values: offset too large, too many words,
188 * too many words for the offset, and not enough words.
189 */
190 if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
191 (words == 0)) {
192 DEBUGOUT("nvm parameter(s) out of bounds\n");
193 ret_val = -E1000_ERR_NVM;
194 goto out;
195 }
196
197 for (i = 0; i < words; i++) {
198 ret_val = -E1000_ERR_NVM;
199
200 eewr = ((offset + i) << E1000_NVM_RW_ADDR_SHIFT) |
201 (data[i] << E1000_NVM_RW_REG_DATA) |
203
204 E1000_WRITE_REG(hw, E1000_SRWR, eewr);
205
206 for (k = 0; k < attempts; k++) {
209 ret_val = E1000_SUCCESS;
210 break;
211 }
212 usec_delay(5);
213 }
214
215 if (ret_val != E1000_SUCCESS) {
216 DEBUGOUT("Shadow RAM write EEWR timed out\n");
217 break;
218 }
219 }
220
221out:
222 return ret_val;
223}
224
233static s32 e1000_read_invm_word_i210(struct e1000_hw *hw, u8 address, u16 *data)
234{
236 u32 invm_dword;
237 u16 i;
238 u8 record_type, word_address;
239
240 DEBUGFUNC("e1000_read_invm_word_i210");
241
242 for (i = 0; i < E1000_INVM_SIZE; i++) {
243 invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i));
244 /* Get record type */
245 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
246 if (record_type == E1000_INVM_UNINITIALIZED_STRUCTURE)
247 break;
248 if (record_type == E1000_INVM_CSR_AUTOLOAD_STRUCTURE)
250 if (record_type == E1000_INVM_RSA_KEY_SHA256_STRUCTURE)
252 if (record_type == E1000_INVM_WORD_AUTOLOAD_STRUCTURE) {
253 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
254 if (word_address == address) {
255 *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
256 DEBUGOUT2("Read INVM Word 0x%02x = %x",
257 address, *data);
258 status = E1000_SUCCESS;
259 break;
260 }
261 }
262 }
263 if (status != E1000_SUCCESS)
264 DEBUGOUT1("Requested word 0x%02x not found in OTP\n", address);
265 return status;
266}
267
275static s32 e1000_read_invm_i210(struct e1000_hw *hw, u16 offset,
276 u16 E1000_UNUSEDARG words, u16 *data)
277{
278 s32 ret_val = E1000_SUCCESS;
279
280 DEBUGFUNC("e1000_read_invm_i210");
281
282 /* Only the MAC addr is required to be present in the iNVM */
283 switch (offset) {
284 case NVM_MAC_ADDR:
285 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, &data[0]);
286 ret_val |= e1000_read_invm_word_i210(hw, (u8)offset + 1,
287 &data[1]);
288 ret_val |= e1000_read_invm_word_i210(hw, (u8)offset + 2,
289 &data[2]);
290 if (ret_val != E1000_SUCCESS)
291 DEBUGOUT("MAC Addr not found in iNVM\n");
292 break;
293 case NVM_INIT_CTRL_2:
294 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
295 if (ret_val != E1000_SUCCESS) {
297 ret_val = E1000_SUCCESS;
298 }
299 break;
300 case NVM_INIT_CTRL_4:
301 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
302 if (ret_val != E1000_SUCCESS) {
304 ret_val = E1000_SUCCESS;
305 }
306 break;
307 case NVM_LED_1_CFG:
308 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
309 if (ret_val != E1000_SUCCESS) {
311 ret_val = E1000_SUCCESS;
312 }
313 break;
314 case NVM_LED_0_2_CFG:
315 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
316 if (ret_val != E1000_SUCCESS) {
318 ret_val = E1000_SUCCESS;
319 }
320 break;
322 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data);
323 if (ret_val != E1000_SUCCESS) {
324 *data = ID_LED_RESERVED_FFFF;
325 ret_val = E1000_SUCCESS;
326 }
327 break;
328 case NVM_SUB_DEV_ID:
329 *data = hw->subsystem_device_id;
330 break;
331 case NVM_SUB_VEN_ID:
332 *data = hw->subsystem_vendor_id;
333 break;
334 case NVM_DEV_ID:
335 *data = hw->device_id;
336 break;
337 case NVM_VEN_ID:
338 *data = hw->vendor_id;
339 break;
340 default:
341 DEBUGOUT1("NVM word 0x%02x is not mapped.\n", offset);
342 *data = NVM_RESERVED_WORD;
343 break;
344 }
345 return ret_val;
346}
347
356 struct e1000_fw_version *invm_ver)
357{
358 u32 *record = NULL;
359 u32 *next_record = NULL;
360 u32 i = 0;
361 u32 invm_dword = 0;
364 u32 buffer[E1000_INVM_SIZE];
366 u16 version = 0;
367
368 DEBUGFUNC("e1000_read_invm_version");
369
370 /* Read iNVM memory */
371 for (i = 0; i < E1000_INVM_SIZE; i++) {
372 invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i));
373 buffer[i] = invm_dword;
374 }
375
376 /* Read version number */
377 for (i = 1; i < invm_blocks; i++) {
378 record = &buffer[invm_blocks - i];
379 next_record = &buffer[invm_blocks - i + 1];
380
381 /* Check if we have first version location used */
382 if ((i == 1) && ((*record & E1000_INVM_VER_FIELD_ONE) == 0)) {
383 version = 0;
384 status = E1000_SUCCESS;
385 break;
386 }
387 /* Check if we have second version location used */
388 else if ((i == 1) &&
389 ((*record & E1000_INVM_VER_FIELD_TWO) == 0)) {
390 version = (*record & E1000_INVM_VER_FIELD_ONE) >> 3;
391 status = E1000_SUCCESS;
392 break;
393 }
394 /*
395 * Check if we have odd version location
396 * used and it is the last one used
397 */
398 else if ((((*record & E1000_INVM_VER_FIELD_ONE) == 0) &&
399 ((*record & 0x3) == 0)) || (((*record & 0x3) != 0) &&
400 (i != 1))) {
401 version = (*next_record & E1000_INVM_VER_FIELD_TWO)
402 >> 13;
403 status = E1000_SUCCESS;
404 break;
405 }
406 /*
407 * Check if we have even version location
408 * used and it is the last one used
409 */
410 else if (((*record & E1000_INVM_VER_FIELD_TWO) == 0) &&
411 ((*record & 0x3) == 0)) {
412 version = (*record & E1000_INVM_VER_FIELD_ONE) >> 3;
413 status = E1000_SUCCESS;
414 break;
415 }
416 }
417
418 if (status == E1000_SUCCESS) {
419 invm_ver->invm_major = (version & E1000_INVM_MAJOR_MASK)
421 invm_ver->invm_minor = version & E1000_INVM_MINOR_MASK;
422 }
423 /* Read Image Type */
424 for (i = 1; i < invm_blocks; i++) {
425 record = &buffer[invm_blocks - i];
426 next_record = &buffer[invm_blocks - i + 1];
427
428 /* Check if we have image type in first location used */
429 if ((i == 1) && ((*record & E1000_INVM_IMGTYPE_FIELD) == 0)) {
430 invm_ver->invm_img_type = 0;
431 status = E1000_SUCCESS;
432 break;
433 }
434 /* Check if we have image type in first location used */
435 else if ((((*record & 0x3) == 0) &&
436 ((*record & E1000_INVM_IMGTYPE_FIELD) == 0)) ||
437 ((((*record & 0x3) != 0) && (i != 1)))) {
438 invm_ver->invm_img_type =
439 (*next_record & E1000_INVM_IMGTYPE_FIELD) >> 23;
440 status = E1000_SUCCESS;
441 break;
442 }
443 }
444 return status;
445}
446
455{
456 s32 status = E1000_SUCCESS;
457 s32 (*read_op_ptr)(struct e1000_hw *, u16, u16, u16 *);
458
459 DEBUGFUNC("e1000_validate_nvm_checksum_i210");
460
461 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
462
463 /*
464 * Replace the read function with semaphore grabbing with
465 * the one that skips this for a while.
466 * We have semaphore taken already here.
467 */
468 read_op_ptr = hw->nvm.ops.read;
470
472
473 /* Revert original read operation. */
474 hw->nvm.ops.read = read_op_ptr;
475
476 hw->nvm.ops.release(hw);
477 } else {
478 status = E1000_ERR_SWFW_SYNC;
479 }
480
481 return status;
482}
483
484
494{
495 s32 ret_val;
496 u16 checksum = 0;
497 u16 i, nvm_data;
498
499 DEBUGFUNC("e1000_update_nvm_checksum_i210");
500
501 /*
502 * Read the first word from the EEPROM. If this times out or fails, do
503 * not continue or we could be in for a very long wait while every
504 * EEPROM read fails
505 */
506 ret_val = e1000_read_nvm_eerd(hw, 0, 1, &nvm_data);
507 if (ret_val != E1000_SUCCESS) {
508 DEBUGOUT("EEPROM read failed\n");
509 goto out;
510 }
511
512 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) {
513 /*
514 * Do not use hw->nvm.ops.write, hw->nvm.ops.read
515 * because we do not want to take the synchronization
516 * semaphores twice here.
517 */
518
519 for (i = 0; i < NVM_CHECKSUM_REG; i++) {
520 ret_val = e1000_read_nvm_eerd(hw, i, 1, &nvm_data);
521 if (ret_val) {
522 hw->nvm.ops.release(hw);
523 DEBUGOUT("NVM Read Error while updating checksum.\n");
524 goto out;
525 }
526 checksum += nvm_data;
527 }
528 checksum = (u16) NVM_SUM - checksum;
529 ret_val = e1000_write_nvm_srwr(hw, NVM_CHECKSUM_REG, 1,
530 &checksum);
531 if (ret_val != E1000_SUCCESS) {
532 hw->nvm.ops.release(hw);
533 DEBUGOUT("NVM Write Error while updating checksum.\n");
534 goto out;
535 }
536
537 hw->nvm.ops.release(hw);
538
539 ret_val = e1000_update_flash_i210(hw);
540 } else {
541 ret_val = E1000_ERR_SWFW_SYNC;
542 }
543out:
544 return ret_val;
545}
546
553{
554 u32 eec = 0;
555 bool ret_val = false;
556
557 DEBUGFUNC("e1000_get_flash_presence_i210");
558
559 eec = E1000_READ_REG(hw, E1000_EECD);
560
562 ret_val = true;
563
564 return ret_val;
565}
566
573{
574 s32 ret_val;
575 u32 flup;
576
577 DEBUGFUNC("e1000_update_flash_i210");
578
580 if (ret_val == -E1000_ERR_NVM) {
581 DEBUGOUT("Flash update time out\n");
582 goto out;
583 }
584
586 E1000_WRITE_REG(hw, E1000_EECD, flup);
587
589 if (ret_val == E1000_SUCCESS)
590 DEBUGOUT("Flash update complete\n");
591 else
592 DEBUGOUT("Flash update time out\n");
593
594out:
595 return ret_val;
596}
597
604{
605 s32 ret_val = -E1000_ERR_NVM;
606 u32 i, reg;
607
608 DEBUGFUNC("e1000_pool_flash_update_done_i210");
609
610 for (i = 0; i < E1000_FLUDONE_ATTEMPTS; i++) {
611 reg = E1000_READ_REG(hw, E1000_EECD);
612 if (reg & E1000_EECD_FLUDONE_I210) {
613 ret_val = E1000_SUCCESS;
614 break;
615 }
616 usec_delay(5);
617 }
618
619 return ret_val;
620}
621
629{
630 s32 ret_val;
631 struct e1000_nvm_info *nvm = &hw->nvm;
632
633 DEBUGFUNC("e1000_init_nvm_params_i210");
634
635 ret_val = e1000_init_nvm_params_82575(hw);
645 } else {
646 hw->nvm.type = e1000_nvm_invm;
651 }
652 return ret_val;
653}
654
662{
665}
666
676{
677 s32 ret_val;
678
679 DEBUGFUNC("e1000_valid_led_default_i210");
680
681 ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
682 if (ret_val) {
683 DEBUGOUT("NVM Read Error\n");
684 goto out;
685 }
686
687 if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) {
688 switch (hw->phy.media_type) {
691 break;
693 default:
694 *data = ID_LED_DEFAULT_I210;
695 break;
696 }
697 }
698out:
699 return ret_val;
700}
701
710{
711 s32 ret_val;
712 u32 wuc, mdicnfg, ctrl, ctrl_ext, reg_val;
713 u16 nvm_word, phy_word, pci_word, tmp_nvm;
714 int i;
715
716 /* Get PHY semaphore */
717 hw->phy.ops.acquire(hw);
718 /* Get and set needed register values */
719 wuc = E1000_READ_REG(hw, E1000_WUC);
720 mdicnfg = E1000_READ_REG(hw, E1000_MDICNFG);
721 reg_val = mdicnfg & ~E1000_MDICNFG_EXT_MDIO;
722 E1000_WRITE_REG(hw, E1000_MDICNFG, reg_val);
723
724 /* Get data from NVM, or set default */
726 &nvm_word);
727 if (ret_val != E1000_SUCCESS)
728 nvm_word = E1000_INVM_DEFAULT_AL;
729 tmp_nvm = nvm_word | E1000_INVM_PLL_WO_VAL;
730 phy_word = E1000_PHY_PLL_UNCONF;
731 for (i = 0; i < E1000_MAX_PLL_TRIES; i++) {
732 /* check current state directly from internal PHY */
734 usec_delay(20);
736 usec_delay(20);
738 if ((phy_word & E1000_PHY_PLL_UNCONF)
740 ret_val = E1000_SUCCESS;
741 break;
742 } else {
743 ret_val = -E1000_ERR_PHY;
744 }
745 /* directly reset the internal PHY */
746 ctrl = E1000_READ_REG(hw, E1000_CTRL);
748
749 ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
751 E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
752
754 reg_val = (E1000_INVM_AUTOLOAD << 4) | (tmp_nvm << 16);
756
757 e1000_read_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word);
758 pci_word |= E1000_PCI_PMCSR_D3;
759 e1000_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word);
760 msec_delay(1);
761 pci_word &= ~E1000_PCI_PMCSR_D3;
762 e1000_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word);
763 reg_val = (E1000_INVM_AUTOLOAD << 4) | (nvm_word << 16);
765
766 /* restore WUC register */
767 E1000_WRITE_REG(hw, E1000_WUC, wuc);
768 }
769 /* restore MDICNFG setting */
770 E1000_WRITE_REG(hw, E1000_MDICNFG, mdicnfg);
771 /* Release PHY semaphore */
772 hw->phy.ops.release(hw);
773 return ret_val;
774}
775
787{
788 s32 timeout = PHY_CFG_TIMEOUT;
790
791 DEBUGFUNC("e1000_get_cfg_done_i210");
792
793 while (timeout) {
794 if (E1000_READ_REG(hw, E1000_EEMNGCTL_I210) & mask)
795 break;
796 msec_delay(1);
797 timeout--;
798 }
799 if (!timeout)
800 DEBUGOUT("MNG configuration cycle has not completed.\n");
801
802 return E1000_SUCCESS;
803}
804
812{
813 struct e1000_mac_info *mac = &hw->mac;
814 s32 ret_val;
815
816 DEBUGFUNC("e1000_init_hw_i210");
817 if ((hw->mac.type >= e1000_i210) &&
819 ret_val = e1000_pll_workaround_i210(hw);
820 if (ret_val != E1000_SUCCESS)
821 return ret_val;
822 }
824
825 /* Initialize identification LED */
826 mac->ops.id_led_init(hw);
827
828 ret_val = e1000_init_hw_base(hw);
829 return ret_val;
830}
s32 e1000_init_nvm_params_82575(struct e1000_hw *hw)
Definition: e1000_82575.c:441
void e1000_init_function_pointers_82575(struct e1000_hw *hw)
Definition: e1000_82575.c:526
s32 e1000_init_hw_base(struct e1000_hw *hw)
Definition: e1000_base.c:92
#define ID_LED_RESERVED_0000
#define NVM_DEV_ID
#define E1000_ERR_PHY
#define E1000_EECD_FLUDONE_I210
#define E1000_NVM_RW_REG_DONE
#define E1000_EECD_FLUPD_I210
#define E1000_CTRL_EXT_PHYPDEN
Definition: e1000_defines.h:98
#define E1000_FLUDONE_ATTEMPTS
#define NVM_INIT_CTRL_2
#define E1000_CTRL_EXT_SDLPE
Definition: e1000_defines.h:81
#define NVM_VEN_ID
#define NVM_SUB_DEV_ID
#define NVM_INIT_CTRL_4
#define NVM_LED_1_CFG
#define E1000_NVM_RW_REG_DATA
#define E1000_NVM_RW_ADDR_SHIFT
#define ID_LED_RESERVED_FFFF
#define E1000_CTRL_PHY_RST
#define E1000_EECD_FLASH_DETECTED_I210
#define PHY_CFG_TIMEOUT
#define NVM_LED_0_2_CFG
#define NVM_SUB_VEN_ID
#define E1000_NVM_CFG_DONE_PORT_0
#define E1000_ERR_SWFW_SYNC
#define E1000_SWFW_EEP_SM
#define E1000_ERR_INVM_VALUE_NOT_FOUND
#define E1000_NVM_RW_REG_START
#define NVM_RESERVED_WORD
#define NVM_CHECKSUM_REG
#define NVM_SUM
#define E1000_SUCCESS
#define E1000_UNUSEDARG
#define E1000_EERD_EEWR_MAX_COUNT
#define E1000_ERR_NVM
#define NVM_ID_LED_SETTINGS
#define NVM_MAC_ADDR
void e1000_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value)
Definition: e1000_osdep.c:45
@ e1000_i210
Definition: e1000_hw.h:274
@ e1000_media_type_internal_serdes
Definition: e1000_hw.h:285
@ e1000_media_type_copper
Definition: e1000_hw.h:283
@ e1000_nvm_invm
Definition: e1000_hw.h:295
@ e1000_nvm_flash_hw
Definition: e1000_hw.h:294
void e1000_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value)
Definition: e1000_osdep.c:51
static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:55
static s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:603
static s32 e1000_init_nvm_params_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:628
s32 e1000_validate_nvm_checksum_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:454
static void e1000_release_nvm_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:73
s32 e1000_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
Definition: e1000_i210.c:135
bool e1000_get_flash_presence_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:552
s32 e1000_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
Definition: e1000_i210.c:90
static s32 e1000_pll_workaround_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:709
static s32 e1000_get_cfg_done_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:786
static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
Definition: e1000_i210.c:176
s32 e1000_init_hw_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:811
s32 e1000_read_invm_version(struct e1000_hw *hw, struct e1000_fw_version *invm_ver)
Definition: e1000_i210.c:355
static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data)
Definition: e1000_i210.c:675
void e1000_init_function_pointers_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:661
static s32 e1000_read_invm_word_i210(struct e1000_hw *hw, u8 address, u16 *data)
Definition: e1000_i210.c:233
s32 e1000_update_nvm_checksum_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:493
s32 e1000_update_flash_i210(struct e1000_hw *hw)
Definition: e1000_i210.c:572
static s32 e1000_read_invm_i210(struct e1000_hw *hw, u16 offset, u16 E1000_UNUSEDARG words, u16 *data)
Definition: e1000_i210.c:275
#define NVM_LED_1_CFG_DEFAULT_I211
Definition: e1000_i210.h:92
#define INVM_DWORD_TO_RECORD_TYPE(invm_dword)
Definition: e1000_i210.h:54
#define NVM_INIT_CTRL_2_DEFAULT_I211
Definition: e1000_i210.h:90
#define E1000_PCI_PMCSR_D3
Definition: e1000_i210.h:97
#define E1000_INVM_AUTOLOAD
Definition: e1000_i210.h:103
#define E1000_INVM_DEFAULT_AL
Definition: e1000_i210.h:102
#define E1000_INVM_ULT_BYTES_SIZE
Definition: e1000_i210.h:72
#define E1000_INVM_MINOR_MASK
Definition: e1000_i210.h:79
#define ID_LED_DEFAULT_I210_SERDES
Definition: e1000_i210.h:85
#define INVM_DWORD_TO_WORD_ADDRESS(invm_dword)
Definition: e1000_i210.h:56
#define E1000_INVM_VER_FIELD_ONE
Definition: e1000_i210.h:74
#define E1000_INVM_MAJOR_SHIFT
Definition: e1000_i210.h:80
#define E1000_PCI_PMCSR
Definition: e1000_i210.h:96
#define E1000_PHY_PLL_UNCONF
Definition: e1000_i210.h:99
#define E1000_INVM_RECORD_SIZE_IN_BYTES
Definition: e1000_i210.h:73
#define E1000_INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS
Definition: e1000_i210.h:71
#define NVM_INIT_CTRL_4_DEFAULT_I211
Definition: e1000_i210.h:91
#define E1000_INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS
Definition: e1000_i210.h:70
@ E1000_INVM_RSA_KEY_SHA256_STRUCTURE
Definition: e1000_i210.h:66
@ E1000_INVM_UNINITIALIZED_STRUCTURE
Definition: e1000_i210.h:62
@ E1000_INVM_CSR_AUTOLOAD_STRUCTURE
Definition: e1000_i210.h:64
@ E1000_INVM_WORD_AUTOLOAD_STRUCTURE
Definition: e1000_i210.h:63
#define NVM_LED_0_2_CFG_DEFAULT_I211
Definition: e1000_i210.h:93
#define E1000_INVM_PLL_WO_VAL
Definition: e1000_i210.h:104
#define INVM_DWORD_TO_WORD_DATA(invm_dword)
Definition: e1000_i210.h:58
#define E1000_INVM_VER_FIELD_TWO
Definition: e1000_i210.h:75
#define E1000_INVM_MAJOR_MASK
Definition: e1000_i210.h:78
#define E1000_MAX_PLL_TRIES
Definition: e1000_i210.h:98
#define ID_LED_DEFAULT_I210
Definition: e1000_i210.h:82
#define E1000_PHY_PLL_FREQ_REG
Definition: e1000_i210.h:101
#define E1000_INVM_IMGTYPE_FIELD
Definition: e1000_i210.h:76
s32 e1000_acquire_swfw_sync(struct e1000_hw *hw, u16 mask)
Definition: e1000_mac.c:2301
void e1000_release_swfw_sync(struct e1000_hw *hw, u16 mask)
Definition: e1000_mac.c:2354
s32 e1000_null_ops_generic(struct e1000_hw E1000_UNUSEDARG *hw)
Definition: e1000_mac.c:88
s32 e1000_null_write_nvm(struct e1000_hw E1000_UNUSEDARG *hw, u16 E1000_UNUSEDARG a, u16 E1000_UNUSEDARG b, u16 E1000_UNUSEDARG *c)
Definition: e1000_nvm.c:107
s32 e1000_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
Definition: e1000_nvm.c:563
s32 e1000_validate_nvm_checksum_generic(struct e1000_hw *hw)
Definition: e1000_nvm.c:1202
#define DEBUGOUT1(...)
Definition: e1000_osdep.h:111
#define DEBUGOUT2(...)
Definition: e1000_osdep.h:112
#define msec_delay(x)
Definition: e1000_osdep.h:103
#define usec_delay(x)
Definition: e1000_osdep.h:101
uint8_t u8
Definition: e1000_osdep.h:124
#define DEBUGFUNC(F)
Definition: e1000_osdep.h:115
#define E1000_WRITE_REG(hw, reg, value)
Definition: e1000_osdep.h:196
uint16_t u16
Definition: e1000_osdep.h:123
#define DEBUGOUT(...)
Definition: e1000_osdep.h:109
#define E1000_READ_REG(hw, reg)
Definition: e1000_osdep.h:191
int32_t s32
Definition: e1000_osdep.h:126
uint32_t u32
Definition: e1000_osdep.h:122
s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data)
Definition: e1000_phy.c:291
s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data)
Definition: e1000_phy.c:356
#define GS40G_PAGE_SELECT
Definition: e1000_phy.h:145
#define E1000_EEARBC_I210
Definition: e1000_regs.h:122
#define E1000_EEMNGCTL_I210
Definition: e1000_regs.h:120
#define E1000_WUC
Definition: e1000_regs.h:505
#define E1000_SRWR
Definition: e1000_regs.h:175
#define E1000_INVM_SIZE
Definition: e1000_regs.h:192
#define E1000_MDICNFG
Definition: e1000_regs.h:47
#define E1000_CTRL
Definition: e1000_regs.h:39
#define E1000_EECD
Definition: e1000_regs.h:42
#define E1000_CTRL_EXT
Definition: e1000_regs.h:44
#define E1000_INVM_DATA_REG(_n)
Definition: e1000_regs.h:191
u16 vendor_id
Definition: e1000_hw.h:1050
u16 subsystem_device_id
Definition: e1000_hw.h:1049
u16 subsystem_vendor_id
Definition: e1000_hw.h:1048
struct e1000_mac_info mac
Definition: e1000_hw.h:1028
struct e1000_nvm_info nvm
Definition: e1000_hw.h:1031
u16 device_id
Definition: e1000_hw.h:1047
struct e1000_phy_info phy
Definition: e1000_hw.h:1030
enum e1000_mac_type type
Definition: e1000_hw.h:815
struct e1000_mac_operations ops
Definition: e1000_hw.h:811
s32(* id_led_init)(struct e1000_hw *)
Definition: e1000_hw.h:725
struct e1000_nvm_operations ops
Definition: e1000_hw.h:889
enum e1000_nvm_type type
Definition: e1000_hw.h:890
void(* release)(struct e1000_hw *)
Definition: e1000_hw.h:802
s32(* init_params)(struct e1000_hw *)
Definition: e1000_hw.h:799
s32(* write)(struct e1000_hw *, u16, u16, u16 *)
Definition: e1000_hw.h:807
s32(* validate)(struct e1000_hw *)
Definition: e1000_hw.h:806
s32(* update)(struct e1000_hw *)
Definition: e1000_hw.h:804
s32(* read)(struct e1000_hw *, u16, u16, u16 *)
Definition: e1000_hw.h:801
s32(* acquire)(struct e1000_hw *)
Definition: e1000_hw.h:800
s32(* valid_led_default)(struct e1000_hw *, u16 *)
Definition: e1000_hw.h:805
enum e1000_media_type media_type
Definition: e1000_hw.h:871
struct e1000_phy_operations ops
Definition: e1000_hw.h:856
s32(* get_cfg_done)(struct e1000_hw *hw)
Definition: e1000_hw.h:777
void(* release)(struct e1000_hw *)
Definition: e1000_hw.h:784
s32(* acquire)(struct e1000_hw *)
Definition: e1000_hw.h:771