Lines Matching +full:no +full:- +full:hw +full:- +full:checksum
2 SPDX-License-Identifier: BSD-3-Clause
4 Copyright (c) 2001-2020, Intel Corporation
24 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
38 static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw);
39 static void e1000_release_nvm_i210(struct e1000_hw *hw);
40 static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words,
42 static s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw);
43 static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data);
46 * e1000_acquire_nvm_i210 - Request for access to EEPROM
47 * @hw: pointer to the HW structure
52 * EEPROM access and return -E1000_ERR_NVM (-1).
54 static s32 e1000_acquire_nvm_i210(struct e1000_hw *hw) in e1000_acquire_nvm_i210() argument
60 ret_val = e1000_acquire_swfw_sync(hw, E1000_SWFW_EEP_SM); in e1000_acquire_nvm_i210()
66 * e1000_release_nvm_i210 - Release exclusive access to EEPROM
67 * @hw: pointer to the HW structure
72 static void e1000_release_nvm_i210(struct e1000_hw *hw) in e1000_release_nvm_i210() argument
76 e1000_release_swfw_sync(hw, E1000_SWFW_EEP_SM); in e1000_release_nvm_i210()
80 * e1000_read_nvm_srrd_i210 - Reads Shadow Ram using EERD register
81 * @hw: pointer to the HW structure
89 s32 e1000_read_nvm_srrd_i210(struct e1000_hw *hw, u16 offset, u16 words, in e1000_read_nvm_srrd_i210() argument
101 count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ? in e1000_read_nvm_srrd_i210()
102 E1000_EERD_EEWR_MAX_COUNT : (words - i); in e1000_read_nvm_srrd_i210()
103 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { in e1000_read_nvm_srrd_i210()
104 status = e1000_read_nvm_eerd(hw, offset, count, in e1000_read_nvm_srrd_i210()
106 hw->nvm.ops.release(hw); in e1000_read_nvm_srrd_i210()
119 * e1000_write_nvm_srwr_i210 - Write to Shadow RAM using EEWR
120 * @hw: pointer to the HW structure
129 * contain an invalid checksum.
131 * If error code is returned, data and Shadow RAM may be inconsistent - buffer
134 s32 e1000_write_nvm_srwr_i210(struct e1000_hw *hw, u16 offset, u16 words, in e1000_write_nvm_srwr_i210() argument
146 count = (words - i) / E1000_EERD_EEWR_MAX_COUNT > 0 ? in e1000_write_nvm_srwr_i210()
147 E1000_EERD_EEWR_MAX_COUNT : (words - i); in e1000_write_nvm_srwr_i210()
148 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { in e1000_write_nvm_srwr_i210()
149 status = e1000_write_nvm_srwr(hw, offset, count, in e1000_write_nvm_srwr_i210()
151 hw->nvm.ops.release(hw); in e1000_write_nvm_srwr_i210()
164 * e1000_write_nvm_srwr - Write to Shadow Ram using EEWR
165 * @hw: pointer to the HW structure
173 * Shadow Ram will most likely contain an invalid checksum.
175 static s32 e1000_write_nvm_srwr(struct e1000_hw *hw, u16 offset, u16 words, in e1000_write_nvm_srwr() argument
178 struct e1000_nvm_info *nvm = &hw->nvm; in e1000_write_nvm_srwr()
189 if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || in e1000_write_nvm_srwr()
192 ret_val = -E1000_ERR_NVM; in e1000_write_nvm_srwr()
197 ret_val = -E1000_ERR_NVM; in e1000_write_nvm_srwr()
203 E1000_WRITE_REG(hw, E1000_SRWR, eewr); in e1000_write_nvm_srwr()
207 E1000_READ_REG(hw, E1000_SRWR)) { in e1000_write_nvm_srwr()
224 /** e1000_read_invm_word_i210 - Reads OTP
225 * @hw: pointer to the HW structure
229 * Reads 16-bit words from the OTP. Return error when the word is not
232 static s32 e1000_read_invm_word_i210(struct e1000_hw *hw, u8 address, u16 *data) in e1000_read_invm_word_i210() argument
234 s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND; in e1000_read_invm_word_i210()
242 invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i)); in e1000_read_invm_word_i210()
267 /** e1000_read_invm_i210 - Read invm wrapper function for I210/I211
268 * @hw: pointer to the HW structure
274 static s32 e1000_read_invm_i210(struct e1000_hw *hw, u16 offset, in e1000_read_invm_i210() argument
284 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, &data[0]); in e1000_read_invm_i210()
285 ret_val |= e1000_read_invm_word_i210(hw, (u8)offset + 1, in e1000_read_invm_i210()
287 ret_val |= e1000_read_invm_word_i210(hw, (u8)offset + 2, in e1000_read_invm_i210()
293 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data); in e1000_read_invm_i210()
300 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data); in e1000_read_invm_i210()
307 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data); in e1000_read_invm_i210()
314 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data); in e1000_read_invm_i210()
321 ret_val = e1000_read_invm_word_i210(hw, (u8)offset, data); in e1000_read_invm_i210()
328 *data = hw->subsystem_device_id; in e1000_read_invm_i210()
331 *data = hw->subsystem_vendor_id; in e1000_read_invm_i210()
334 *data = hw->device_id; in e1000_read_invm_i210()
337 *data = hw->vendor_id; in e1000_read_invm_i210()
348 * e1000_read_invm_version - Reads iNVM version and image type
349 * @hw: pointer to the HW structure
354 s32 e1000_read_invm_version(struct e1000_hw *hw, in e1000_read_invm_version() argument
361 u32 invm_blocks = E1000_INVM_SIZE - (E1000_INVM_ULT_BYTES_SIZE / in e1000_read_invm_version()
364 s32 status = -E1000_ERR_INVM_VALUE_NOT_FOUND; in e1000_read_invm_version()
371 invm_dword = E1000_READ_REG(hw, E1000_INVM_DATA_REG(i)); in e1000_read_invm_version()
377 record = &buffer[invm_blocks - i]; in e1000_read_invm_version()
378 next_record = &buffer[invm_blocks - i + 1]; in e1000_read_invm_version()
418 invm_ver->invm_major = (nvm_version & E1000_INVM_MAJOR_MASK) in e1000_read_invm_version()
420 invm_ver->invm_minor = nvm_version & E1000_INVM_MINOR_MASK; in e1000_read_invm_version()
424 record = &buffer[invm_blocks - i]; in e1000_read_invm_version()
425 next_record = &buffer[invm_blocks - i + 1]; in e1000_read_invm_version()
429 invm_ver->invm_img_type = 0; in e1000_read_invm_version()
437 invm_ver->invm_img_type = in e1000_read_invm_version()
447 * e1000_validate_nvm_checksum_i210 - Validate EEPROM checksum
448 * @hw: pointer to the HW structure
450 * Calculates the EEPROM checksum by reading/adding each word of the EEPROM
453 s32 e1000_validate_nvm_checksum_i210(struct e1000_hw *hw) in e1000_validate_nvm_checksum_i210() argument
460 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { in e1000_validate_nvm_checksum_i210()
467 read_op_ptr = hw->nvm.ops.read; in e1000_validate_nvm_checksum_i210()
468 hw->nvm.ops.read = e1000_read_nvm_eerd; in e1000_validate_nvm_checksum_i210()
470 status = e1000_validate_nvm_checksum_generic(hw); in e1000_validate_nvm_checksum_i210()
473 hw->nvm.ops.read = read_op_ptr; in e1000_validate_nvm_checksum_i210()
475 hw->nvm.ops.release(hw); in e1000_validate_nvm_checksum_i210()
485 * e1000_update_nvm_checksum_i210 - Update EEPROM checksum
486 * @hw: pointer to the HW structure
488 * Updates the EEPROM checksum by reading/adding each word of the EEPROM
489 * up to the checksum. Then calculates the EEPROM checksum and writes the
492 s32 e1000_update_nvm_checksum_i210(struct e1000_hw *hw) in e1000_update_nvm_checksum_i210() argument
495 u16 checksum = 0; in e1000_update_nvm_checksum_i210() local
505 ret_val = e1000_read_nvm_eerd(hw, 0, 1, &nvm_data); in e1000_update_nvm_checksum_i210()
511 if (hw->nvm.ops.acquire(hw) == E1000_SUCCESS) { in e1000_update_nvm_checksum_i210()
513 * Do not use hw->nvm.ops.write, hw->nvm.ops.read in e1000_update_nvm_checksum_i210()
519 ret_val = e1000_read_nvm_eerd(hw, i, 1, &nvm_data); in e1000_update_nvm_checksum_i210()
521 hw->nvm.ops.release(hw); in e1000_update_nvm_checksum_i210()
522 DEBUGOUT("NVM Read Error while updating checksum.\n"); in e1000_update_nvm_checksum_i210()
525 checksum += nvm_data; in e1000_update_nvm_checksum_i210()
527 checksum = (u16) NVM_SUM - checksum; in e1000_update_nvm_checksum_i210()
528 ret_val = e1000_write_nvm_srwr(hw, NVM_CHECKSUM_REG, 1, in e1000_update_nvm_checksum_i210()
529 &checksum); in e1000_update_nvm_checksum_i210()
531 hw->nvm.ops.release(hw); in e1000_update_nvm_checksum_i210()
532 DEBUGOUT("NVM Write Error while updating checksum.\n"); in e1000_update_nvm_checksum_i210()
536 hw->nvm.ops.release(hw); in e1000_update_nvm_checksum_i210()
538 ret_val = e1000_update_flash_i210(hw); in e1000_update_nvm_checksum_i210()
547 * e1000_get_flash_presence_i210 - Check if flash device is detected.
548 * @hw: pointer to the HW structure
551 bool e1000_get_flash_presence_i210(struct e1000_hw *hw) in e1000_get_flash_presence_i210() argument
558 eec = E1000_READ_REG(hw, E1000_EECD); in e1000_get_flash_presence_i210()
567 * e1000_update_flash_i210 - Commit EEPROM to the flash
568 * @hw: pointer to the HW structure
571 s32 e1000_update_flash_i210(struct e1000_hw *hw) in e1000_update_flash_i210() argument
578 ret_val = e1000_pool_flash_update_done_i210(hw); in e1000_update_flash_i210()
579 if (ret_val == -E1000_ERR_NVM) { in e1000_update_flash_i210()
584 flup = E1000_READ_REG(hw, E1000_EECD) | E1000_EECD_FLUPD_I210; in e1000_update_flash_i210()
585 E1000_WRITE_REG(hw, E1000_EECD, flup); in e1000_update_flash_i210()
587 ret_val = e1000_pool_flash_update_done_i210(hw); in e1000_update_flash_i210()
598 * e1000_pool_flash_update_done_i210 - Pool FLUDONE status.
599 * @hw: pointer to the HW structure
602 s32 e1000_pool_flash_update_done_i210(struct e1000_hw *hw) in e1000_pool_flash_update_done_i210() argument
604 s32 ret_val = -E1000_ERR_NVM; in e1000_pool_flash_update_done_i210()
610 reg = E1000_READ_REG(hw, E1000_EECD); in e1000_pool_flash_update_done_i210()
622 * e1000_init_nvm_params_i210 - Initialize i210 NVM function pointers
623 * @hw: pointer to the HW structure
627 static s32 e1000_init_nvm_params_i210(struct e1000_hw *hw) in e1000_init_nvm_params_i210() argument
630 struct e1000_nvm_info *nvm = &hw->nvm; in e1000_init_nvm_params_i210()
634 ret_val = e1000_init_nvm_params_82575(hw); in e1000_init_nvm_params_i210()
635 nvm->ops.acquire = e1000_acquire_nvm_i210; in e1000_init_nvm_params_i210()
636 nvm->ops.release = e1000_release_nvm_i210; in e1000_init_nvm_params_i210()
637 nvm->ops.valid_led_default = e1000_valid_led_default_i210; in e1000_init_nvm_params_i210()
638 if (e1000_get_flash_presence_i210(hw)) { in e1000_init_nvm_params_i210()
639 hw->nvm.type = e1000_nvm_flash_hw; in e1000_init_nvm_params_i210()
640 nvm->ops.read = e1000_read_nvm_srrd_i210; in e1000_init_nvm_params_i210()
641 nvm->ops.write = e1000_write_nvm_srwr_i210; in e1000_init_nvm_params_i210()
642 nvm->ops.validate = e1000_validate_nvm_checksum_i210; in e1000_init_nvm_params_i210()
643 nvm->ops.update = e1000_update_nvm_checksum_i210; in e1000_init_nvm_params_i210()
645 hw->nvm.type = e1000_nvm_invm; in e1000_init_nvm_params_i210()
646 nvm->ops.read = e1000_read_invm_i210; in e1000_init_nvm_params_i210()
647 nvm->ops.write = e1000_null_write_nvm; in e1000_init_nvm_params_i210()
648 nvm->ops.validate = e1000_null_ops_generic; in e1000_init_nvm_params_i210()
649 nvm->ops.update = e1000_null_ops_generic; in e1000_init_nvm_params_i210()
655 * e1000_init_function_pointers_i210 - Init func ptrs.
656 * @hw: pointer to the HW structure
660 void e1000_init_function_pointers_i210(struct e1000_hw *hw) in e1000_init_function_pointers_i210() argument
662 e1000_init_function_pointers_82575(hw); in e1000_init_function_pointers_i210()
663 hw->nvm.ops.init_params = e1000_init_nvm_params_i210; in e1000_init_function_pointers_i210()
667 * e1000_valid_led_default_i210 - Verify a valid default LED config
668 * @hw: pointer to the HW structure
674 static s32 e1000_valid_led_default_i210(struct e1000_hw *hw, u16 *data) in e1000_valid_led_default_i210() argument
680 ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); in e1000_valid_led_default_i210()
687 switch (hw->phy.media_type) { in e1000_valid_led_default_i210()
703 * @hw: pointer to the HW structure
708 static s32 e1000_pll_workaround_i210(struct e1000_hw *hw) in e1000_pll_workaround_i210() argument
716 hw->phy.ops.acquire(hw); in e1000_pll_workaround_i210()
718 wuc = E1000_READ_REG(hw, E1000_WUC); in e1000_pll_workaround_i210()
719 mdicnfg = E1000_READ_REG(hw, E1000_MDICNFG); in e1000_pll_workaround_i210()
721 E1000_WRITE_REG(hw, E1000_MDICNFG, reg_val); in e1000_pll_workaround_i210()
724 ret_val = e1000_read_invm_word_i210(hw, E1000_INVM_AUTOLOAD, in e1000_pll_workaround_i210()
732 e1000_write_phy_reg_mdic(hw, GS40G_PAGE_SELECT, 0xFC); in e1000_pll_workaround_i210()
734 e1000_read_phy_reg_mdic(hw, E1000_PHY_PLL_FREQ_REG, &phy_word); in e1000_pll_workaround_i210()
736 e1000_write_phy_reg_mdic(hw, GS40G_PAGE_SELECT, 0); in e1000_pll_workaround_i210()
742 ret_val = -E1000_ERR_PHY; in e1000_pll_workaround_i210()
745 ctrl = E1000_READ_REG(hw, E1000_CTRL); in e1000_pll_workaround_i210()
746 E1000_WRITE_REG(hw, E1000_CTRL, ctrl|E1000_CTRL_PHY_RST); in e1000_pll_workaround_i210()
748 ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); in e1000_pll_workaround_i210()
750 E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); in e1000_pll_workaround_i210()
752 E1000_WRITE_REG(hw, E1000_WUC, 0); in e1000_pll_workaround_i210()
754 E1000_WRITE_REG(hw, E1000_EEARBC_I210, reg_val); in e1000_pll_workaround_i210()
756 e1000_read_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word); in e1000_pll_workaround_i210()
758 e1000_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word); in e1000_pll_workaround_i210()
761 e1000_write_pci_cfg(hw, E1000_PCI_PMCSR, &pci_word); in e1000_pll_workaround_i210()
763 E1000_WRITE_REG(hw, E1000_EEARBC_I210, reg_val); in e1000_pll_workaround_i210()
766 E1000_WRITE_REG(hw, E1000_WUC, wuc); in e1000_pll_workaround_i210()
769 E1000_WRITE_REG(hw, E1000_MDICNFG, mdicnfg); in e1000_pll_workaround_i210()
771 hw->phy.ops.release(hw); in e1000_pll_workaround_i210()
776 * e1000_get_cfg_done_i210 - Read config done bit
777 * @hw: pointer to the HW structure
780 * completion status. NOTE: silicon which is EEPROM-less will fail trying
782 * E1000_SUCCESS. If we were to return with error, EEPROM-less silicon
785 static s32 e1000_get_cfg_done_i210(struct e1000_hw *hw) in e1000_get_cfg_done_i210() argument
793 if (E1000_READ_REG(hw, E1000_EEMNGCTL_I210) & mask) in e1000_get_cfg_done_i210()
796 timeout--; in e1000_get_cfg_done_i210()
805 * e1000_init_hw_i210 - Init hw for I210/I211
806 * @hw: pointer to the HW structure
808 * Called to initialize hw for i210 hw family.
810 s32 e1000_init_hw_i210(struct e1000_hw *hw) in e1000_init_hw_i210() argument
812 struct e1000_mac_info *mac = &hw->mac; in e1000_init_hw_i210()
816 if ((hw->mac.type >= e1000_i210) && in e1000_init_hw_i210()
817 !(e1000_get_flash_presence_i210(hw))) { in e1000_init_hw_i210()
818 ret_val = e1000_pll_workaround_i210(hw); in e1000_init_hw_i210()
822 hw->phy.ops.get_cfg_done = e1000_get_cfg_done_i210; in e1000_init_hw_i210()
825 mac->ops.id_led_init(hw); in e1000_init_hw_i210()
827 ret_val = e1000_init_hw_base(hw); in e1000_init_hw_i210()