175eba5b6SRobert Mustacchi /****************************************************************************** 275eba5b6SRobert Mustacchi 3*42cc51e0SRobert Mustacchi Copyright (c) 2001-2015, Intel Corporation 475eba5b6SRobert Mustacchi All rights reserved. 575eba5b6SRobert Mustacchi 675eba5b6SRobert Mustacchi Redistribution and use in source and binary forms, with or without 775eba5b6SRobert Mustacchi modification, are permitted provided that the following conditions are met: 875eba5b6SRobert Mustacchi 975eba5b6SRobert Mustacchi 1. Redistributions of source code must retain the above copyright notice, 1075eba5b6SRobert Mustacchi this list of conditions and the following disclaimer. 1175eba5b6SRobert Mustacchi 1275eba5b6SRobert Mustacchi 2. Redistributions in binary form must reproduce the above copyright 1375eba5b6SRobert Mustacchi notice, this list of conditions and the following disclaimer in the 1475eba5b6SRobert Mustacchi documentation and/or other materials provided with the distribution. 1575eba5b6SRobert Mustacchi 1675eba5b6SRobert Mustacchi 3. Neither the name of the Intel Corporation nor the names of its 1775eba5b6SRobert Mustacchi contributors may be used to endorse or promote products derived from 1875eba5b6SRobert Mustacchi this software without specific prior written permission. 1975eba5b6SRobert Mustacchi 2075eba5b6SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2175eba5b6SRobert Mustacchi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2275eba5b6SRobert Mustacchi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2375eba5b6SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2475eba5b6SRobert Mustacchi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2575eba5b6SRobert Mustacchi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2675eba5b6SRobert Mustacchi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2775eba5b6SRobert Mustacchi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2875eba5b6SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2975eba5b6SRobert Mustacchi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3075eba5b6SRobert Mustacchi POSSIBILITY OF SUCH DAMAGE. 3175eba5b6SRobert Mustacchi 3275eba5b6SRobert Mustacchi ******************************************************************************/ 3375eba5b6SRobert Mustacchi /*$FreeBSD$*/ 3475eba5b6SRobert Mustacchi 3575eba5b6SRobert Mustacchi /* 82571EB Gigabit Ethernet Controller 3675eba5b6SRobert Mustacchi * 82571EB Gigabit Ethernet Controller (Copper) 3775eba5b6SRobert Mustacchi * 82571EB Gigabit Ethernet Controller (Fiber) 3875eba5b6SRobert Mustacchi * 82571EB Dual Port Gigabit Mezzanine Adapter 3975eba5b6SRobert Mustacchi * 82571EB Quad Port Gigabit Mezzanine Adapter 4075eba5b6SRobert Mustacchi * 82571PT Gigabit PT Quad Port Server ExpressModule 4175eba5b6SRobert Mustacchi * 82572EI Gigabit Ethernet Controller (Copper) 4275eba5b6SRobert Mustacchi * 82572EI Gigabit Ethernet Controller (Fiber) 4375eba5b6SRobert Mustacchi * 82572EI Gigabit Ethernet Controller 4475eba5b6SRobert Mustacchi * 82573V Gigabit Ethernet Controller (Copper) 4575eba5b6SRobert Mustacchi * 82573E Gigabit Ethernet Controller (Copper) 4675eba5b6SRobert Mustacchi * 82573L Gigabit Ethernet Controller 4775eba5b6SRobert Mustacchi * 82574L Gigabit Network Connection 4875eba5b6SRobert Mustacchi * 82583V Gigabit Network Connection 4975eba5b6SRobert Mustacchi */ 5075eba5b6SRobert Mustacchi 5175eba5b6SRobert Mustacchi #include "e1000_api.h" 5275eba5b6SRobert Mustacchi 5375eba5b6SRobert Mustacchi static s32 e1000_acquire_nvm_82571(struct e1000_hw *hw); 5475eba5b6SRobert Mustacchi static void e1000_release_nvm_82571(struct e1000_hw *hw); 5575eba5b6SRobert Mustacchi static s32 e1000_write_nvm_82571(struct e1000_hw *hw, u16 offset, 5675eba5b6SRobert Mustacchi u16 words, u16 *data); 5775eba5b6SRobert Mustacchi static s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw); 5875eba5b6SRobert Mustacchi static s32 e1000_validate_nvm_checksum_82571(struct e1000_hw *hw); 5975eba5b6SRobert Mustacchi static s32 e1000_get_cfg_done_82571(struct e1000_hw *hw); 6075eba5b6SRobert Mustacchi static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, 6175eba5b6SRobert Mustacchi bool active); 6275eba5b6SRobert Mustacchi static s32 e1000_reset_hw_82571(struct e1000_hw *hw); 6375eba5b6SRobert Mustacchi static s32 e1000_init_hw_82571(struct e1000_hw *hw); 6475eba5b6SRobert Mustacchi static void e1000_clear_vfta_82571(struct e1000_hw *hw); 6575eba5b6SRobert Mustacchi static bool e1000_check_mng_mode_82574(struct e1000_hw *hw); 6675eba5b6SRobert Mustacchi static s32 e1000_led_on_82574(struct e1000_hw *hw); 6775eba5b6SRobert Mustacchi static s32 e1000_setup_link_82571(struct e1000_hw *hw); 6875eba5b6SRobert Mustacchi static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw); 6975eba5b6SRobert Mustacchi static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw); 7075eba5b6SRobert Mustacchi static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw); 7175eba5b6SRobert Mustacchi static s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data); 7275eba5b6SRobert Mustacchi static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw); 7375eba5b6SRobert Mustacchi static s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw); 7475eba5b6SRobert Mustacchi static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw); 7575eba5b6SRobert Mustacchi static s32 e1000_get_phy_id_82571(struct e1000_hw *hw); 7675eba5b6SRobert Mustacchi static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw); 7775eba5b6SRobert Mustacchi static void e1000_put_hw_semaphore_82573(struct e1000_hw *hw); 7875eba5b6SRobert Mustacchi static s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw); 7975eba5b6SRobert Mustacchi static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw); 8075eba5b6SRobert Mustacchi static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, 8175eba5b6SRobert Mustacchi bool active); 8275eba5b6SRobert Mustacchi static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, 8375eba5b6SRobert Mustacchi bool active); 8475eba5b6SRobert Mustacchi static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw); 8575eba5b6SRobert Mustacchi static s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset, 8675eba5b6SRobert Mustacchi u16 words, u16 *data); 8775eba5b6SRobert Mustacchi static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw); 8875eba5b6SRobert Mustacchi static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw); 8975eba5b6SRobert Mustacchi 9075eba5b6SRobert Mustacchi /** 9175eba5b6SRobert Mustacchi * e1000_init_phy_params_82571 - Init PHY func ptrs. 9275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 9375eba5b6SRobert Mustacchi **/ 9475eba5b6SRobert Mustacchi static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) 9575eba5b6SRobert Mustacchi { 9675eba5b6SRobert Mustacchi struct e1000_phy_info *phy = &hw->phy; 9775eba5b6SRobert Mustacchi s32 ret_val; 9875eba5b6SRobert Mustacchi 9975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_init_phy_params_82571"); 10075eba5b6SRobert Mustacchi 10175eba5b6SRobert Mustacchi if (hw->phy.media_type != e1000_media_type_copper) { 10275eba5b6SRobert Mustacchi phy->type = e1000_phy_none; 10375eba5b6SRobert Mustacchi return E1000_SUCCESS; 10475eba5b6SRobert Mustacchi } 10575eba5b6SRobert Mustacchi 10675eba5b6SRobert Mustacchi phy->addr = 1; 10775eba5b6SRobert Mustacchi phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; 10875eba5b6SRobert Mustacchi phy->reset_delay_us = 100; 10975eba5b6SRobert Mustacchi 11075eba5b6SRobert Mustacchi phy->ops.check_reset_block = e1000_check_reset_block_generic; 11175eba5b6SRobert Mustacchi phy->ops.reset = e1000_phy_hw_reset_generic; 11275eba5b6SRobert Mustacchi phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82571; 11375eba5b6SRobert Mustacchi phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_generic; 11475eba5b6SRobert Mustacchi phy->ops.power_up = e1000_power_up_phy_copper; 11575eba5b6SRobert Mustacchi phy->ops.power_down = e1000_power_down_phy_copper_82571; 11675eba5b6SRobert Mustacchi 11775eba5b6SRobert Mustacchi switch (hw->mac.type) { 11875eba5b6SRobert Mustacchi case e1000_82571: 11975eba5b6SRobert Mustacchi case e1000_82572: 12075eba5b6SRobert Mustacchi phy->type = e1000_phy_igp_2; 12175eba5b6SRobert Mustacchi phy->ops.get_cfg_done = e1000_get_cfg_done_82571; 12275eba5b6SRobert Mustacchi phy->ops.get_info = e1000_get_phy_info_igp; 12375eba5b6SRobert Mustacchi phy->ops.check_polarity = e1000_check_polarity_igp; 12475eba5b6SRobert Mustacchi phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_igp; 12575eba5b6SRobert Mustacchi phy->ops.get_cable_length = e1000_get_cable_length_igp_2; 12675eba5b6SRobert Mustacchi phy->ops.read_reg = e1000_read_phy_reg_igp; 12775eba5b6SRobert Mustacchi phy->ops.write_reg = e1000_write_phy_reg_igp; 12875eba5b6SRobert Mustacchi phy->ops.acquire = e1000_get_hw_semaphore_82571; 12975eba5b6SRobert Mustacchi phy->ops.release = e1000_put_hw_semaphore_82571; 13075eba5b6SRobert Mustacchi break; 13175eba5b6SRobert Mustacchi case e1000_82573: 13275eba5b6SRobert Mustacchi phy->type = e1000_phy_m88; 13375eba5b6SRobert Mustacchi phy->ops.get_cfg_done = e1000_get_cfg_done_generic; 13475eba5b6SRobert Mustacchi phy->ops.get_info = e1000_get_phy_info_m88; 13575eba5b6SRobert Mustacchi phy->ops.check_polarity = e1000_check_polarity_m88; 13675eba5b6SRobert Mustacchi phy->ops.commit = e1000_phy_sw_reset_generic; 13775eba5b6SRobert Mustacchi phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; 13875eba5b6SRobert Mustacchi phy->ops.get_cable_length = e1000_get_cable_length_m88; 13975eba5b6SRobert Mustacchi phy->ops.read_reg = e1000_read_phy_reg_m88; 14075eba5b6SRobert Mustacchi phy->ops.write_reg = e1000_write_phy_reg_m88; 14175eba5b6SRobert Mustacchi phy->ops.acquire = e1000_get_hw_semaphore_82571; 14275eba5b6SRobert Mustacchi phy->ops.release = e1000_put_hw_semaphore_82571; 14375eba5b6SRobert Mustacchi break; 14475eba5b6SRobert Mustacchi case e1000_82574: 14575eba5b6SRobert Mustacchi case e1000_82583: 14675eba5b6SRobert Mustacchi E1000_MUTEX_INIT(&hw->dev_spec._82571.swflag_mutex); 14775eba5b6SRobert Mustacchi 14875eba5b6SRobert Mustacchi phy->type = e1000_phy_bm; 14975eba5b6SRobert Mustacchi phy->ops.get_cfg_done = e1000_get_cfg_done_generic; 15075eba5b6SRobert Mustacchi phy->ops.get_info = e1000_get_phy_info_m88; 15175eba5b6SRobert Mustacchi phy->ops.check_polarity = e1000_check_polarity_m88; 15275eba5b6SRobert Mustacchi phy->ops.commit = e1000_phy_sw_reset_generic; 15375eba5b6SRobert Mustacchi phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; 15475eba5b6SRobert Mustacchi phy->ops.get_cable_length = e1000_get_cable_length_m88; 15575eba5b6SRobert Mustacchi phy->ops.read_reg = e1000_read_phy_reg_bm2; 15675eba5b6SRobert Mustacchi phy->ops.write_reg = e1000_write_phy_reg_bm2; 15775eba5b6SRobert Mustacchi phy->ops.acquire = e1000_get_hw_semaphore_82574; 15875eba5b6SRobert Mustacchi phy->ops.release = e1000_put_hw_semaphore_82574; 15975eba5b6SRobert Mustacchi phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82574; 16075eba5b6SRobert Mustacchi phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82574; 16175eba5b6SRobert Mustacchi break; 16275eba5b6SRobert Mustacchi default: 16375eba5b6SRobert Mustacchi return -E1000_ERR_PHY; 16475eba5b6SRobert Mustacchi break; 16575eba5b6SRobert Mustacchi } 16675eba5b6SRobert Mustacchi 16775eba5b6SRobert Mustacchi /* This can only be done after all function pointers are setup. */ 16875eba5b6SRobert Mustacchi ret_val = e1000_get_phy_id_82571(hw); 16975eba5b6SRobert Mustacchi if (ret_val) { 17075eba5b6SRobert Mustacchi DEBUGOUT("Error getting PHY ID\n"); 17175eba5b6SRobert Mustacchi return ret_val; 17275eba5b6SRobert Mustacchi } 17375eba5b6SRobert Mustacchi 17475eba5b6SRobert Mustacchi /* Verify phy id */ 17575eba5b6SRobert Mustacchi switch (hw->mac.type) { 17675eba5b6SRobert Mustacchi case e1000_82571: 17775eba5b6SRobert Mustacchi case e1000_82572: 17875eba5b6SRobert Mustacchi if (phy->id != IGP01E1000_I_PHY_ID) 17975eba5b6SRobert Mustacchi ret_val = -E1000_ERR_PHY; 18075eba5b6SRobert Mustacchi break; 18175eba5b6SRobert Mustacchi case e1000_82573: 18275eba5b6SRobert Mustacchi if (phy->id != M88E1111_I_PHY_ID) 18375eba5b6SRobert Mustacchi ret_val = -E1000_ERR_PHY; 18475eba5b6SRobert Mustacchi break; 18575eba5b6SRobert Mustacchi case e1000_82574: 18675eba5b6SRobert Mustacchi case e1000_82583: 18775eba5b6SRobert Mustacchi if (phy->id != BME1000_E_PHY_ID_R2) 18875eba5b6SRobert Mustacchi ret_val = -E1000_ERR_PHY; 18975eba5b6SRobert Mustacchi break; 19075eba5b6SRobert Mustacchi default: 19175eba5b6SRobert Mustacchi ret_val = -E1000_ERR_PHY; 19275eba5b6SRobert Mustacchi break; 19375eba5b6SRobert Mustacchi } 19475eba5b6SRobert Mustacchi 19575eba5b6SRobert Mustacchi if (ret_val) 19675eba5b6SRobert Mustacchi DEBUGOUT1("PHY ID unknown: type = 0x%08x\n", phy->id); 19775eba5b6SRobert Mustacchi 19875eba5b6SRobert Mustacchi return ret_val; 19975eba5b6SRobert Mustacchi } 20075eba5b6SRobert Mustacchi 20175eba5b6SRobert Mustacchi /** 20275eba5b6SRobert Mustacchi * e1000_init_nvm_params_82571 - Init NVM func ptrs. 20375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 20475eba5b6SRobert Mustacchi **/ 20575eba5b6SRobert Mustacchi static s32 e1000_init_nvm_params_82571(struct e1000_hw *hw) 20675eba5b6SRobert Mustacchi { 20775eba5b6SRobert Mustacchi struct e1000_nvm_info *nvm = &hw->nvm; 20875eba5b6SRobert Mustacchi u32 eecd = E1000_READ_REG(hw, E1000_EECD); 20975eba5b6SRobert Mustacchi u16 size; 21075eba5b6SRobert Mustacchi 21175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_init_nvm_params_82571"); 21275eba5b6SRobert Mustacchi 21375eba5b6SRobert Mustacchi nvm->opcode_bits = 8; 21475eba5b6SRobert Mustacchi nvm->delay_usec = 1; 21575eba5b6SRobert Mustacchi switch (nvm->override) { 21675eba5b6SRobert Mustacchi case e1000_nvm_override_spi_large: 21775eba5b6SRobert Mustacchi nvm->page_size = 32; 21875eba5b6SRobert Mustacchi nvm->address_bits = 16; 21975eba5b6SRobert Mustacchi break; 22075eba5b6SRobert Mustacchi case e1000_nvm_override_spi_small: 22175eba5b6SRobert Mustacchi nvm->page_size = 8; 22275eba5b6SRobert Mustacchi nvm->address_bits = 8; 22375eba5b6SRobert Mustacchi break; 22475eba5b6SRobert Mustacchi default: 22575eba5b6SRobert Mustacchi nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8; 22675eba5b6SRobert Mustacchi nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8; 22775eba5b6SRobert Mustacchi break; 22875eba5b6SRobert Mustacchi } 22975eba5b6SRobert Mustacchi 23075eba5b6SRobert Mustacchi switch (hw->mac.type) { 23175eba5b6SRobert Mustacchi case e1000_82573: 23275eba5b6SRobert Mustacchi case e1000_82574: 23375eba5b6SRobert Mustacchi case e1000_82583: 23475eba5b6SRobert Mustacchi if (((eecd >> 15) & 0x3) == 0x3) { 23575eba5b6SRobert Mustacchi nvm->type = e1000_nvm_flash_hw; 23675eba5b6SRobert Mustacchi nvm->word_size = 2048; 23775eba5b6SRobert Mustacchi /* Autonomous Flash update bit must be cleared due 23875eba5b6SRobert Mustacchi * to Flash update issue. 23975eba5b6SRobert Mustacchi */ 24075eba5b6SRobert Mustacchi eecd &= ~E1000_EECD_AUPDEN; 24175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_EECD, eecd); 24275eba5b6SRobert Mustacchi break; 24375eba5b6SRobert Mustacchi } 24475eba5b6SRobert Mustacchi /* Fall Through */ 24575eba5b6SRobert Mustacchi default: 24675eba5b6SRobert Mustacchi nvm->type = e1000_nvm_eeprom_spi; 24775eba5b6SRobert Mustacchi size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> 24875eba5b6SRobert Mustacchi E1000_EECD_SIZE_EX_SHIFT); 24975eba5b6SRobert Mustacchi /* Added to a constant, "size" becomes the left-shift value 25075eba5b6SRobert Mustacchi * for setting word_size. 25175eba5b6SRobert Mustacchi */ 25275eba5b6SRobert Mustacchi size += NVM_WORD_SIZE_BASE_SHIFT; 25375eba5b6SRobert Mustacchi 25475eba5b6SRobert Mustacchi /* EEPROM access above 16k is unsupported */ 25575eba5b6SRobert Mustacchi if (size > 14) 25675eba5b6SRobert Mustacchi size = 14; 25775eba5b6SRobert Mustacchi nvm->word_size = 1 << size; 25875eba5b6SRobert Mustacchi break; 25975eba5b6SRobert Mustacchi } 26075eba5b6SRobert Mustacchi 26175eba5b6SRobert Mustacchi /* Function Pointers */ 26275eba5b6SRobert Mustacchi switch (hw->mac.type) { 26375eba5b6SRobert Mustacchi case e1000_82574: 26475eba5b6SRobert Mustacchi case e1000_82583: 26575eba5b6SRobert Mustacchi nvm->ops.acquire = e1000_get_hw_semaphore_82574; 26675eba5b6SRobert Mustacchi nvm->ops.release = e1000_put_hw_semaphore_82574; 26775eba5b6SRobert Mustacchi break; 26875eba5b6SRobert Mustacchi default: 26975eba5b6SRobert Mustacchi nvm->ops.acquire = e1000_acquire_nvm_82571; 27075eba5b6SRobert Mustacchi nvm->ops.release = e1000_release_nvm_82571; 27175eba5b6SRobert Mustacchi break; 27275eba5b6SRobert Mustacchi } 27375eba5b6SRobert Mustacchi nvm->ops.read = e1000_read_nvm_eerd; 27475eba5b6SRobert Mustacchi nvm->ops.update = e1000_update_nvm_checksum_82571; 27575eba5b6SRobert Mustacchi nvm->ops.validate = e1000_validate_nvm_checksum_82571; 27675eba5b6SRobert Mustacchi nvm->ops.valid_led_default = e1000_valid_led_default_82571; 27775eba5b6SRobert Mustacchi nvm->ops.write = e1000_write_nvm_82571; 27875eba5b6SRobert Mustacchi 27975eba5b6SRobert Mustacchi return E1000_SUCCESS; 28075eba5b6SRobert Mustacchi } 28175eba5b6SRobert Mustacchi 28275eba5b6SRobert Mustacchi /** 28375eba5b6SRobert Mustacchi * e1000_init_mac_params_82571 - Init MAC func ptrs. 28475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 28575eba5b6SRobert Mustacchi **/ 28675eba5b6SRobert Mustacchi static s32 e1000_init_mac_params_82571(struct e1000_hw *hw) 28775eba5b6SRobert Mustacchi { 28875eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 28975eba5b6SRobert Mustacchi u32 swsm = 0; 29075eba5b6SRobert Mustacchi u32 swsm2 = 0; 29175eba5b6SRobert Mustacchi bool force_clear_smbi = FALSE; 29275eba5b6SRobert Mustacchi 29375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_init_mac_params_82571"); 29475eba5b6SRobert Mustacchi 29575eba5b6SRobert Mustacchi /* Set media type and media-dependent function pointers */ 29675eba5b6SRobert Mustacchi switch (hw->device_id) { 29775eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_FIBER: 29875eba5b6SRobert Mustacchi case E1000_DEV_ID_82572EI_FIBER: 29975eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_QUAD_FIBER: 30075eba5b6SRobert Mustacchi hw->phy.media_type = e1000_media_type_fiber; 30175eba5b6SRobert Mustacchi mac->ops.setup_physical_interface = 30275eba5b6SRobert Mustacchi e1000_setup_fiber_serdes_link_82571; 30375eba5b6SRobert Mustacchi mac->ops.check_for_link = e1000_check_for_fiber_link_generic; 30475eba5b6SRobert Mustacchi mac->ops.get_link_up_info = 30575eba5b6SRobert Mustacchi e1000_get_speed_and_duplex_fiber_serdes_generic; 30675eba5b6SRobert Mustacchi break; 30775eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_SERDES: 30875eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_SERDES_DUAL: 30975eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_SERDES_QUAD: 31075eba5b6SRobert Mustacchi case E1000_DEV_ID_82572EI_SERDES: 31175eba5b6SRobert Mustacchi hw->phy.media_type = e1000_media_type_internal_serdes; 31275eba5b6SRobert Mustacchi mac->ops.setup_physical_interface = 31375eba5b6SRobert Mustacchi e1000_setup_fiber_serdes_link_82571; 31475eba5b6SRobert Mustacchi mac->ops.check_for_link = e1000_check_for_serdes_link_82571; 31575eba5b6SRobert Mustacchi mac->ops.get_link_up_info = 31675eba5b6SRobert Mustacchi e1000_get_speed_and_duplex_fiber_serdes_generic; 31775eba5b6SRobert Mustacchi break; 31875eba5b6SRobert Mustacchi default: 31975eba5b6SRobert Mustacchi hw->phy.media_type = e1000_media_type_copper; 32075eba5b6SRobert Mustacchi mac->ops.setup_physical_interface = 32175eba5b6SRobert Mustacchi e1000_setup_copper_link_82571; 32275eba5b6SRobert Mustacchi mac->ops.check_for_link = e1000_check_for_copper_link_generic; 32375eba5b6SRobert Mustacchi mac->ops.get_link_up_info = 32475eba5b6SRobert Mustacchi e1000_get_speed_and_duplex_copper_generic; 32575eba5b6SRobert Mustacchi break; 32675eba5b6SRobert Mustacchi } 32775eba5b6SRobert Mustacchi 32875eba5b6SRobert Mustacchi /* Set mta register count */ 32975eba5b6SRobert Mustacchi mac->mta_reg_count = 128; 33075eba5b6SRobert Mustacchi /* Set rar entry count */ 33175eba5b6SRobert Mustacchi mac->rar_entry_count = E1000_RAR_ENTRIES; 33275eba5b6SRobert Mustacchi /* Set if part includes ASF firmware */ 33375eba5b6SRobert Mustacchi mac->asf_firmware_present = TRUE; 33475eba5b6SRobert Mustacchi /* Adaptive IFS supported */ 33575eba5b6SRobert Mustacchi mac->adaptive_ifs = TRUE; 33675eba5b6SRobert Mustacchi 33775eba5b6SRobert Mustacchi /* Function pointers */ 33875eba5b6SRobert Mustacchi 33975eba5b6SRobert Mustacchi /* bus type/speed/width */ 34075eba5b6SRobert Mustacchi mac->ops.get_bus_info = e1000_get_bus_info_pcie_generic; 34175eba5b6SRobert Mustacchi /* reset */ 34275eba5b6SRobert Mustacchi mac->ops.reset_hw = e1000_reset_hw_82571; 34375eba5b6SRobert Mustacchi /* hw initialization */ 34475eba5b6SRobert Mustacchi mac->ops.init_hw = e1000_init_hw_82571; 34575eba5b6SRobert Mustacchi /* link setup */ 34675eba5b6SRobert Mustacchi mac->ops.setup_link = e1000_setup_link_82571; 34775eba5b6SRobert Mustacchi /* multicast address update */ 34875eba5b6SRobert Mustacchi mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; 34975eba5b6SRobert Mustacchi /* writing VFTA */ 35075eba5b6SRobert Mustacchi mac->ops.write_vfta = e1000_write_vfta_generic; 35175eba5b6SRobert Mustacchi /* clearing VFTA */ 35275eba5b6SRobert Mustacchi mac->ops.clear_vfta = e1000_clear_vfta_82571; 35375eba5b6SRobert Mustacchi /* read mac address */ 35475eba5b6SRobert Mustacchi mac->ops.read_mac_addr = e1000_read_mac_addr_82571; 35575eba5b6SRobert Mustacchi /* ID LED init */ 35675eba5b6SRobert Mustacchi mac->ops.id_led_init = e1000_id_led_init_generic; 35775eba5b6SRobert Mustacchi /* setup LED */ 35875eba5b6SRobert Mustacchi mac->ops.setup_led = e1000_setup_led_generic; 35975eba5b6SRobert Mustacchi /* cleanup LED */ 36075eba5b6SRobert Mustacchi mac->ops.cleanup_led = e1000_cleanup_led_generic; 36175eba5b6SRobert Mustacchi /* turn off LED */ 36275eba5b6SRobert Mustacchi mac->ops.led_off = e1000_led_off_generic; 36375eba5b6SRobert Mustacchi /* clear hardware counters */ 36475eba5b6SRobert Mustacchi mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82571; 36575eba5b6SRobert Mustacchi 36675eba5b6SRobert Mustacchi /* MAC-specific function pointers */ 36775eba5b6SRobert Mustacchi switch (hw->mac.type) { 36875eba5b6SRobert Mustacchi case e1000_82573: 36975eba5b6SRobert Mustacchi mac->ops.set_lan_id = e1000_set_lan_id_single_port; 37075eba5b6SRobert Mustacchi mac->ops.check_mng_mode = e1000_check_mng_mode_generic; 37175eba5b6SRobert Mustacchi mac->ops.led_on = e1000_led_on_generic; 37275eba5b6SRobert Mustacchi mac->ops.blink_led = e1000_blink_led_generic; 37375eba5b6SRobert Mustacchi 37475eba5b6SRobert Mustacchi /* FWSM register */ 37575eba5b6SRobert Mustacchi mac->has_fwsm = TRUE; 37675eba5b6SRobert Mustacchi /* ARC supported; valid only if manageability features are 37775eba5b6SRobert Mustacchi * enabled. 37875eba5b6SRobert Mustacchi */ 37975eba5b6SRobert Mustacchi mac->arc_subsystem_valid = !!(E1000_READ_REG(hw, E1000_FWSM) & 38075eba5b6SRobert Mustacchi E1000_FWSM_MODE_MASK); 38175eba5b6SRobert Mustacchi break; 38275eba5b6SRobert Mustacchi case e1000_82574: 38375eba5b6SRobert Mustacchi case e1000_82583: 38475eba5b6SRobert Mustacchi mac->ops.set_lan_id = e1000_set_lan_id_single_port; 38575eba5b6SRobert Mustacchi mac->ops.check_mng_mode = e1000_check_mng_mode_82574; 38675eba5b6SRobert Mustacchi mac->ops.led_on = e1000_led_on_82574; 38775eba5b6SRobert Mustacchi break; 38875eba5b6SRobert Mustacchi default: 38975eba5b6SRobert Mustacchi mac->ops.check_mng_mode = e1000_check_mng_mode_generic; 39075eba5b6SRobert Mustacchi mac->ops.led_on = e1000_led_on_generic; 39175eba5b6SRobert Mustacchi mac->ops.blink_led = e1000_blink_led_generic; 39275eba5b6SRobert Mustacchi 39375eba5b6SRobert Mustacchi /* FWSM register */ 39475eba5b6SRobert Mustacchi mac->has_fwsm = TRUE; 39575eba5b6SRobert Mustacchi break; 39675eba5b6SRobert Mustacchi } 39775eba5b6SRobert Mustacchi 39875eba5b6SRobert Mustacchi /* Ensure that the inter-port SWSM.SMBI lock bit is clear before 39975eba5b6SRobert Mustacchi * first NVM or PHY acess. This should be done for single-port 40075eba5b6SRobert Mustacchi * devices, and for one port only on dual-port devices so that 40175eba5b6SRobert Mustacchi * for those devices we can still use the SMBI lock to synchronize 40275eba5b6SRobert Mustacchi * inter-port accesses to the PHY & NVM. 40375eba5b6SRobert Mustacchi */ 40475eba5b6SRobert Mustacchi switch (hw->mac.type) { 40575eba5b6SRobert Mustacchi case e1000_82571: 40675eba5b6SRobert Mustacchi case e1000_82572: 40775eba5b6SRobert Mustacchi swsm2 = E1000_READ_REG(hw, E1000_SWSM2); 40875eba5b6SRobert Mustacchi 40975eba5b6SRobert Mustacchi if (!(swsm2 & E1000_SWSM2_LOCK)) { 41075eba5b6SRobert Mustacchi /* Only do this for the first interface on this card */ 41175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM2, swsm2 | 41275eba5b6SRobert Mustacchi E1000_SWSM2_LOCK); 41375eba5b6SRobert Mustacchi force_clear_smbi = TRUE; 41475eba5b6SRobert Mustacchi } else { 41575eba5b6SRobert Mustacchi force_clear_smbi = FALSE; 41675eba5b6SRobert Mustacchi } 41775eba5b6SRobert Mustacchi break; 41875eba5b6SRobert Mustacchi default: 41975eba5b6SRobert Mustacchi force_clear_smbi = TRUE; 42075eba5b6SRobert Mustacchi break; 42175eba5b6SRobert Mustacchi } 42275eba5b6SRobert Mustacchi 42375eba5b6SRobert Mustacchi if (force_clear_smbi) { 42475eba5b6SRobert Mustacchi /* Make sure SWSM.SMBI is clear */ 42575eba5b6SRobert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM); 42675eba5b6SRobert Mustacchi if (swsm & E1000_SWSM_SMBI) { 42775eba5b6SRobert Mustacchi /* This bit should not be set on a first interface, and 42875eba5b6SRobert Mustacchi * indicates that the bootagent or EFI code has 42975eba5b6SRobert Mustacchi * improperly left this bit enabled 43075eba5b6SRobert Mustacchi */ 43175eba5b6SRobert Mustacchi DEBUGOUT("Please update your 82571 Bootagent\n"); 43275eba5b6SRobert Mustacchi } 43375eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm & ~E1000_SWSM_SMBI); 43475eba5b6SRobert Mustacchi } 43575eba5b6SRobert Mustacchi 43675eba5b6SRobert Mustacchi /* Initialze device specific counter of SMBI acquisition timeouts. */ 43775eba5b6SRobert Mustacchi hw->dev_spec._82571.smb_counter = 0; 43875eba5b6SRobert Mustacchi 43975eba5b6SRobert Mustacchi return E1000_SUCCESS; 44075eba5b6SRobert Mustacchi } 44175eba5b6SRobert Mustacchi 44275eba5b6SRobert Mustacchi /** 44375eba5b6SRobert Mustacchi * e1000_init_function_pointers_82571 - Init func ptrs. 44475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 44575eba5b6SRobert Mustacchi * 44675eba5b6SRobert Mustacchi * Called to initialize all function pointers and parameters. 44775eba5b6SRobert Mustacchi **/ 44875eba5b6SRobert Mustacchi void e1000_init_function_pointers_82571(struct e1000_hw *hw) 44975eba5b6SRobert Mustacchi { 45075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_init_function_pointers_82571"); 45175eba5b6SRobert Mustacchi 45275eba5b6SRobert Mustacchi hw->mac.ops.init_params = e1000_init_mac_params_82571; 45375eba5b6SRobert Mustacchi hw->nvm.ops.init_params = e1000_init_nvm_params_82571; 45475eba5b6SRobert Mustacchi hw->phy.ops.init_params = e1000_init_phy_params_82571; 45575eba5b6SRobert Mustacchi } 45675eba5b6SRobert Mustacchi 45775eba5b6SRobert Mustacchi /** 45875eba5b6SRobert Mustacchi * e1000_get_phy_id_82571 - Retrieve the PHY ID and revision 45975eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 46075eba5b6SRobert Mustacchi * 46175eba5b6SRobert Mustacchi * Reads the PHY registers and stores the PHY ID and possibly the PHY 46275eba5b6SRobert Mustacchi * revision in the hardware structure. 46375eba5b6SRobert Mustacchi **/ 46475eba5b6SRobert Mustacchi static s32 e1000_get_phy_id_82571(struct e1000_hw *hw) 46575eba5b6SRobert Mustacchi { 46675eba5b6SRobert Mustacchi struct e1000_phy_info *phy = &hw->phy; 46775eba5b6SRobert Mustacchi s32 ret_val; 46875eba5b6SRobert Mustacchi u16 phy_id = 0; 46975eba5b6SRobert Mustacchi 47075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_phy_id_82571"); 47175eba5b6SRobert Mustacchi 47275eba5b6SRobert Mustacchi switch (hw->mac.type) { 47375eba5b6SRobert Mustacchi case e1000_82571: 47475eba5b6SRobert Mustacchi case e1000_82572: 47575eba5b6SRobert Mustacchi /* The 82571 firmware may still be configuring the PHY. 47675eba5b6SRobert Mustacchi * In this case, we cannot access the PHY until the 47775eba5b6SRobert Mustacchi * configuration is done. So we explicitly set the 47875eba5b6SRobert Mustacchi * PHY ID. 47975eba5b6SRobert Mustacchi */ 48075eba5b6SRobert Mustacchi phy->id = IGP01E1000_I_PHY_ID; 48175eba5b6SRobert Mustacchi break; 48275eba5b6SRobert Mustacchi case e1000_82573: 48375eba5b6SRobert Mustacchi return e1000_get_phy_id(hw); 48475eba5b6SRobert Mustacchi break; 48575eba5b6SRobert Mustacchi case e1000_82574: 48675eba5b6SRobert Mustacchi case e1000_82583: 48775eba5b6SRobert Mustacchi ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id); 48875eba5b6SRobert Mustacchi if (ret_val) 48975eba5b6SRobert Mustacchi return ret_val; 49075eba5b6SRobert Mustacchi 49175eba5b6SRobert Mustacchi phy->id = (u32)(phy_id << 16); 49275eba5b6SRobert Mustacchi usec_delay(20); 49375eba5b6SRobert Mustacchi ret_val = phy->ops.read_reg(hw, PHY_ID2, &phy_id); 49475eba5b6SRobert Mustacchi if (ret_val) 49575eba5b6SRobert Mustacchi return ret_val; 49675eba5b6SRobert Mustacchi 49775eba5b6SRobert Mustacchi phy->id |= (u32)(phy_id); 49875eba5b6SRobert Mustacchi phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK); 49975eba5b6SRobert Mustacchi break; 50075eba5b6SRobert Mustacchi default: 50175eba5b6SRobert Mustacchi return -E1000_ERR_PHY; 50275eba5b6SRobert Mustacchi break; 50375eba5b6SRobert Mustacchi } 50475eba5b6SRobert Mustacchi 50575eba5b6SRobert Mustacchi return E1000_SUCCESS; 50675eba5b6SRobert Mustacchi } 50775eba5b6SRobert Mustacchi 50875eba5b6SRobert Mustacchi /** 50975eba5b6SRobert Mustacchi * e1000_get_hw_semaphore_82571 - Acquire hardware semaphore 51075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 51175eba5b6SRobert Mustacchi * 51275eba5b6SRobert Mustacchi * Acquire the HW semaphore to access the PHY or NVM 51375eba5b6SRobert Mustacchi **/ 51475eba5b6SRobert Mustacchi static s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw) 51575eba5b6SRobert Mustacchi { 51675eba5b6SRobert Mustacchi u32 swsm; 51775eba5b6SRobert Mustacchi s32 sw_timeout = hw->nvm.word_size + 1; 51875eba5b6SRobert Mustacchi s32 fw_timeout = hw->nvm.word_size + 1; 51975eba5b6SRobert Mustacchi s32 i = 0; 52075eba5b6SRobert Mustacchi 52175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_hw_semaphore_82571"); 52275eba5b6SRobert Mustacchi 52375eba5b6SRobert Mustacchi /* If we have timedout 3 times on trying to acquire 52475eba5b6SRobert Mustacchi * the inter-port SMBI semaphore, there is old code 52575eba5b6SRobert Mustacchi * operating on the other port, and it is not 52675eba5b6SRobert Mustacchi * releasing SMBI. Modify the number of times that 52775eba5b6SRobert Mustacchi * we try for the semaphore to interwork with this 52875eba5b6SRobert Mustacchi * older code. 52975eba5b6SRobert Mustacchi */ 53075eba5b6SRobert Mustacchi if (hw->dev_spec._82571.smb_counter > 2) 53175eba5b6SRobert Mustacchi sw_timeout = 1; 53275eba5b6SRobert Mustacchi 53375eba5b6SRobert Mustacchi /* Get the SW semaphore */ 53475eba5b6SRobert Mustacchi while (i < sw_timeout) { 53575eba5b6SRobert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM); 53675eba5b6SRobert Mustacchi if (!(swsm & E1000_SWSM_SMBI)) 53775eba5b6SRobert Mustacchi break; 53875eba5b6SRobert Mustacchi 53975eba5b6SRobert Mustacchi usec_delay(50); 54075eba5b6SRobert Mustacchi i++; 54175eba5b6SRobert Mustacchi } 54275eba5b6SRobert Mustacchi 54375eba5b6SRobert Mustacchi if (i == sw_timeout) { 54475eba5b6SRobert Mustacchi DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); 54575eba5b6SRobert Mustacchi hw->dev_spec._82571.smb_counter++; 54675eba5b6SRobert Mustacchi } 54775eba5b6SRobert Mustacchi /* Get the FW semaphore. */ 54875eba5b6SRobert Mustacchi for (i = 0; i < fw_timeout; i++) { 54975eba5b6SRobert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM); 55075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI); 55175eba5b6SRobert Mustacchi 55275eba5b6SRobert Mustacchi /* Semaphore acquired if bit latched */ 55375eba5b6SRobert Mustacchi if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI) 55475eba5b6SRobert Mustacchi break; 55575eba5b6SRobert Mustacchi 55675eba5b6SRobert Mustacchi usec_delay(50); 55775eba5b6SRobert Mustacchi } 55875eba5b6SRobert Mustacchi 55975eba5b6SRobert Mustacchi if (i == fw_timeout) { 56075eba5b6SRobert Mustacchi /* Release semaphores */ 56175eba5b6SRobert Mustacchi e1000_put_hw_semaphore_82571(hw); 56275eba5b6SRobert Mustacchi DEBUGOUT("Driver can't access the NVM\n"); 56375eba5b6SRobert Mustacchi return -E1000_ERR_NVM; 56475eba5b6SRobert Mustacchi } 56575eba5b6SRobert Mustacchi 56675eba5b6SRobert Mustacchi return E1000_SUCCESS; 56775eba5b6SRobert Mustacchi } 56875eba5b6SRobert Mustacchi 56975eba5b6SRobert Mustacchi /** 57075eba5b6SRobert Mustacchi * e1000_put_hw_semaphore_82571 - Release hardware semaphore 57175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 57275eba5b6SRobert Mustacchi * 57375eba5b6SRobert Mustacchi * Release hardware semaphore used to access the PHY or NVM 57475eba5b6SRobert Mustacchi **/ 57575eba5b6SRobert Mustacchi static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw) 57675eba5b6SRobert Mustacchi { 57775eba5b6SRobert Mustacchi u32 swsm; 57875eba5b6SRobert Mustacchi 57975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_put_hw_semaphore_generic"); 58075eba5b6SRobert Mustacchi 58175eba5b6SRobert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM); 58275eba5b6SRobert Mustacchi 58375eba5b6SRobert Mustacchi swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); 58475eba5b6SRobert Mustacchi 58575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm); 58675eba5b6SRobert Mustacchi } 58775eba5b6SRobert Mustacchi 58875eba5b6SRobert Mustacchi /** 58975eba5b6SRobert Mustacchi * e1000_get_hw_semaphore_82573 - Acquire hardware semaphore 59075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 59175eba5b6SRobert Mustacchi * 59275eba5b6SRobert Mustacchi * Acquire the HW semaphore during reset. 59375eba5b6SRobert Mustacchi * 59475eba5b6SRobert Mustacchi **/ 59575eba5b6SRobert Mustacchi static s32 e1000_get_hw_semaphore_82573(struct e1000_hw *hw) 59675eba5b6SRobert Mustacchi { 59775eba5b6SRobert Mustacchi u32 extcnf_ctrl; 59875eba5b6SRobert Mustacchi s32 i = 0; 59975eba5b6SRobert Mustacchi 60075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_hw_semaphore_82573"); 60175eba5b6SRobert Mustacchi 60275eba5b6SRobert Mustacchi extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); 60375eba5b6SRobert Mustacchi do { 60475eba5b6SRobert Mustacchi extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; 60575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl); 60675eba5b6SRobert Mustacchi extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); 60775eba5b6SRobert Mustacchi 60875eba5b6SRobert Mustacchi if (extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP) 60975eba5b6SRobert Mustacchi break; 61075eba5b6SRobert Mustacchi 61175eba5b6SRobert Mustacchi msec_delay(2); 61275eba5b6SRobert Mustacchi i++; 61375eba5b6SRobert Mustacchi } while (i < MDIO_OWNERSHIP_TIMEOUT); 61475eba5b6SRobert Mustacchi 61575eba5b6SRobert Mustacchi if (i == MDIO_OWNERSHIP_TIMEOUT) { 61675eba5b6SRobert Mustacchi /* Release semaphores */ 61775eba5b6SRobert Mustacchi e1000_put_hw_semaphore_82573(hw); 61875eba5b6SRobert Mustacchi DEBUGOUT("Driver can't access the PHY\n"); 61975eba5b6SRobert Mustacchi return -E1000_ERR_PHY; 62075eba5b6SRobert Mustacchi } 62175eba5b6SRobert Mustacchi 62275eba5b6SRobert Mustacchi return E1000_SUCCESS; 62375eba5b6SRobert Mustacchi } 62475eba5b6SRobert Mustacchi 62575eba5b6SRobert Mustacchi /** 62675eba5b6SRobert Mustacchi * e1000_put_hw_semaphore_82573 - Release hardware semaphore 62775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 62875eba5b6SRobert Mustacchi * 62975eba5b6SRobert Mustacchi * Release hardware semaphore used during reset. 63075eba5b6SRobert Mustacchi * 63175eba5b6SRobert Mustacchi **/ 63275eba5b6SRobert Mustacchi static void e1000_put_hw_semaphore_82573(struct e1000_hw *hw) 63375eba5b6SRobert Mustacchi { 63475eba5b6SRobert Mustacchi u32 extcnf_ctrl; 63575eba5b6SRobert Mustacchi 63675eba5b6SRobert Mustacchi DEBUGFUNC("e1000_put_hw_semaphore_82573"); 63775eba5b6SRobert Mustacchi 63875eba5b6SRobert Mustacchi extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); 63975eba5b6SRobert Mustacchi extcnf_ctrl &= ~E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; 64075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl); 64175eba5b6SRobert Mustacchi } 64275eba5b6SRobert Mustacchi 64375eba5b6SRobert Mustacchi /** 64475eba5b6SRobert Mustacchi * e1000_get_hw_semaphore_82574 - Acquire hardware semaphore 64575eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 64675eba5b6SRobert Mustacchi * 64775eba5b6SRobert Mustacchi * Acquire the HW semaphore to access the PHY or NVM. 64875eba5b6SRobert Mustacchi * 64975eba5b6SRobert Mustacchi **/ 65075eba5b6SRobert Mustacchi static s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw) 65175eba5b6SRobert Mustacchi { 65275eba5b6SRobert Mustacchi s32 ret_val; 65375eba5b6SRobert Mustacchi 65475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_hw_semaphore_82574"); 65575eba5b6SRobert Mustacchi 65675eba5b6SRobert Mustacchi E1000_MUTEX_LOCK(&hw->dev_spec._82571.swflag_mutex); 65775eba5b6SRobert Mustacchi ret_val = e1000_get_hw_semaphore_82573(hw); 65875eba5b6SRobert Mustacchi if (ret_val) 65975eba5b6SRobert Mustacchi E1000_MUTEX_UNLOCK(&hw->dev_spec._82571.swflag_mutex); 66075eba5b6SRobert Mustacchi return ret_val; 66175eba5b6SRobert Mustacchi } 66275eba5b6SRobert Mustacchi 66375eba5b6SRobert Mustacchi /** 66475eba5b6SRobert Mustacchi * e1000_put_hw_semaphore_82574 - Release hardware semaphore 66575eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 66675eba5b6SRobert Mustacchi * 66775eba5b6SRobert Mustacchi * Release hardware semaphore used to access the PHY or NVM 66875eba5b6SRobert Mustacchi * 66975eba5b6SRobert Mustacchi **/ 67075eba5b6SRobert Mustacchi static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw) 67175eba5b6SRobert Mustacchi { 67275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_put_hw_semaphore_82574"); 67375eba5b6SRobert Mustacchi 67475eba5b6SRobert Mustacchi e1000_put_hw_semaphore_82573(hw); 67575eba5b6SRobert Mustacchi E1000_MUTEX_UNLOCK(&hw->dev_spec._82571.swflag_mutex); 67675eba5b6SRobert Mustacchi } 67775eba5b6SRobert Mustacchi 67875eba5b6SRobert Mustacchi /** 67975eba5b6SRobert Mustacchi * e1000_set_d0_lplu_state_82574 - Set Low Power Linkup D0 state 68075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 68175eba5b6SRobert Mustacchi * @active: TRUE to enable LPLU, FALSE to disable 68275eba5b6SRobert Mustacchi * 68375eba5b6SRobert Mustacchi * Sets the LPLU D0 state according to the active flag. 68475eba5b6SRobert Mustacchi * LPLU will not be activated unless the 68575eba5b6SRobert Mustacchi * device autonegotiation advertisement meets standards of 68675eba5b6SRobert Mustacchi * either 10 or 10/100 or 10/100/1000 at all duplexes. 68775eba5b6SRobert Mustacchi * This is a function pointer entry point only called by 68875eba5b6SRobert Mustacchi * PHY setup routines. 68975eba5b6SRobert Mustacchi **/ 69075eba5b6SRobert Mustacchi static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active) 69175eba5b6SRobert Mustacchi { 69275eba5b6SRobert Mustacchi u32 data = E1000_READ_REG(hw, E1000_POEMB); 69375eba5b6SRobert Mustacchi 69475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_d0_lplu_state_82574"); 69575eba5b6SRobert Mustacchi 69675eba5b6SRobert Mustacchi if (active) 69775eba5b6SRobert Mustacchi data |= E1000_PHY_CTRL_D0A_LPLU; 69875eba5b6SRobert Mustacchi else 69975eba5b6SRobert Mustacchi data &= ~E1000_PHY_CTRL_D0A_LPLU; 70075eba5b6SRobert Mustacchi 70175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_POEMB, data); 70275eba5b6SRobert Mustacchi return E1000_SUCCESS; 70375eba5b6SRobert Mustacchi } 70475eba5b6SRobert Mustacchi 70575eba5b6SRobert Mustacchi /** 70675eba5b6SRobert Mustacchi * e1000_set_d3_lplu_state_82574 - Sets low power link up state for D3 70775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 70875eba5b6SRobert Mustacchi * @active: boolean used to enable/disable lplu 70975eba5b6SRobert Mustacchi * 71075eba5b6SRobert Mustacchi * The low power link up (lplu) state is set to the power management level D3 71175eba5b6SRobert Mustacchi * when active is TRUE, else clear lplu for D3. LPLU 71275eba5b6SRobert Mustacchi * is used during Dx states where the power conservation is most important. 71375eba5b6SRobert Mustacchi * During driver activity, SmartSpeed should be enabled so performance is 71475eba5b6SRobert Mustacchi * maintained. 71575eba5b6SRobert Mustacchi **/ 71675eba5b6SRobert Mustacchi static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active) 71775eba5b6SRobert Mustacchi { 71875eba5b6SRobert Mustacchi u32 data = E1000_READ_REG(hw, E1000_POEMB); 71975eba5b6SRobert Mustacchi 72075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_d3_lplu_state_82574"); 72175eba5b6SRobert Mustacchi 72275eba5b6SRobert Mustacchi if (!active) { 72375eba5b6SRobert Mustacchi data &= ~E1000_PHY_CTRL_NOND0A_LPLU; 72475eba5b6SRobert Mustacchi } else if ((hw->phy.autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || 72575eba5b6SRobert Mustacchi (hw->phy.autoneg_advertised == E1000_ALL_NOT_GIG) || 72675eba5b6SRobert Mustacchi (hw->phy.autoneg_advertised == E1000_ALL_10_SPEED)) { 72775eba5b6SRobert Mustacchi data |= E1000_PHY_CTRL_NOND0A_LPLU; 72875eba5b6SRobert Mustacchi } 72975eba5b6SRobert Mustacchi 73075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_POEMB, data); 73175eba5b6SRobert Mustacchi return E1000_SUCCESS; 73275eba5b6SRobert Mustacchi } 73375eba5b6SRobert Mustacchi 73475eba5b6SRobert Mustacchi /** 73575eba5b6SRobert Mustacchi * e1000_acquire_nvm_82571 - Request for access to the EEPROM 73675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 73775eba5b6SRobert Mustacchi * 73875eba5b6SRobert Mustacchi * To gain access to the EEPROM, first we must obtain a hardware semaphore. 73975eba5b6SRobert Mustacchi * Then for non-82573 hardware, set the EEPROM access request bit and wait 74075eba5b6SRobert Mustacchi * for EEPROM access grant bit. If the access grant bit is not set, release 74175eba5b6SRobert Mustacchi * hardware semaphore. 74275eba5b6SRobert Mustacchi **/ 74375eba5b6SRobert Mustacchi static s32 e1000_acquire_nvm_82571(struct e1000_hw *hw) 74475eba5b6SRobert Mustacchi { 74575eba5b6SRobert Mustacchi s32 ret_val; 74675eba5b6SRobert Mustacchi 74775eba5b6SRobert Mustacchi DEBUGFUNC("e1000_acquire_nvm_82571"); 74875eba5b6SRobert Mustacchi 74975eba5b6SRobert Mustacchi ret_val = e1000_get_hw_semaphore_82571(hw); 75075eba5b6SRobert Mustacchi if (ret_val) 75175eba5b6SRobert Mustacchi return ret_val; 75275eba5b6SRobert Mustacchi 75375eba5b6SRobert Mustacchi switch (hw->mac.type) { 75475eba5b6SRobert Mustacchi case e1000_82573: 75575eba5b6SRobert Mustacchi break; 75675eba5b6SRobert Mustacchi default: 75775eba5b6SRobert Mustacchi ret_val = e1000_acquire_nvm_generic(hw); 75875eba5b6SRobert Mustacchi break; 75975eba5b6SRobert Mustacchi } 76075eba5b6SRobert Mustacchi 76175eba5b6SRobert Mustacchi if (ret_val) 76275eba5b6SRobert Mustacchi e1000_put_hw_semaphore_82571(hw); 76375eba5b6SRobert Mustacchi 76475eba5b6SRobert Mustacchi return ret_val; 76575eba5b6SRobert Mustacchi } 76675eba5b6SRobert Mustacchi 76775eba5b6SRobert Mustacchi /** 76875eba5b6SRobert Mustacchi * e1000_release_nvm_82571 - Release exclusive access to EEPROM 76975eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 77075eba5b6SRobert Mustacchi * 77175eba5b6SRobert Mustacchi * Stop any current commands to the EEPROM and clear the EEPROM request bit. 77275eba5b6SRobert Mustacchi **/ 77375eba5b6SRobert Mustacchi static void e1000_release_nvm_82571(struct e1000_hw *hw) 77475eba5b6SRobert Mustacchi { 77575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_release_nvm_82571"); 77675eba5b6SRobert Mustacchi 77775eba5b6SRobert Mustacchi e1000_release_nvm_generic(hw); 77875eba5b6SRobert Mustacchi e1000_put_hw_semaphore_82571(hw); 77975eba5b6SRobert Mustacchi } 78075eba5b6SRobert Mustacchi 78175eba5b6SRobert Mustacchi /** 78275eba5b6SRobert Mustacchi * e1000_write_nvm_82571 - Write to EEPROM using appropriate interface 78375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 78475eba5b6SRobert Mustacchi * @offset: offset within the EEPROM to be written to 78575eba5b6SRobert Mustacchi * @words: number of words to write 78675eba5b6SRobert Mustacchi * @data: 16 bit word(s) to be written to the EEPROM 78775eba5b6SRobert Mustacchi * 78875eba5b6SRobert Mustacchi * For non-82573 silicon, write data to EEPROM at offset using SPI interface. 78975eba5b6SRobert Mustacchi * 79075eba5b6SRobert Mustacchi * If e1000_update_nvm_checksum is not called after this function, the 79175eba5b6SRobert Mustacchi * EEPROM will most likely contain an invalid checksum. 79275eba5b6SRobert Mustacchi **/ 79375eba5b6SRobert Mustacchi static s32 e1000_write_nvm_82571(struct e1000_hw *hw, u16 offset, u16 words, 79475eba5b6SRobert Mustacchi u16 *data) 79575eba5b6SRobert Mustacchi { 79675eba5b6SRobert Mustacchi s32 ret_val; 79775eba5b6SRobert Mustacchi 79875eba5b6SRobert Mustacchi DEBUGFUNC("e1000_write_nvm_82571"); 79975eba5b6SRobert Mustacchi 80075eba5b6SRobert Mustacchi switch (hw->mac.type) { 80175eba5b6SRobert Mustacchi case e1000_82573: 80275eba5b6SRobert Mustacchi case e1000_82574: 80375eba5b6SRobert Mustacchi case e1000_82583: 80475eba5b6SRobert Mustacchi ret_val = e1000_write_nvm_eewr_82571(hw, offset, words, data); 80575eba5b6SRobert Mustacchi break; 80675eba5b6SRobert Mustacchi case e1000_82571: 80775eba5b6SRobert Mustacchi case e1000_82572: 80875eba5b6SRobert Mustacchi ret_val = e1000_write_nvm_spi(hw, offset, words, data); 80975eba5b6SRobert Mustacchi break; 81075eba5b6SRobert Mustacchi default: 81175eba5b6SRobert Mustacchi ret_val = -E1000_ERR_NVM; 81275eba5b6SRobert Mustacchi break; 81375eba5b6SRobert Mustacchi } 81475eba5b6SRobert Mustacchi 81575eba5b6SRobert Mustacchi return ret_val; 81675eba5b6SRobert Mustacchi } 81775eba5b6SRobert Mustacchi 81875eba5b6SRobert Mustacchi /** 81975eba5b6SRobert Mustacchi * e1000_update_nvm_checksum_82571 - Update EEPROM checksum 82075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 82175eba5b6SRobert Mustacchi * 82275eba5b6SRobert Mustacchi * Updates the EEPROM checksum by reading/adding each word of the EEPROM 82375eba5b6SRobert Mustacchi * up to the checksum. Then calculates the EEPROM checksum and writes the 82475eba5b6SRobert Mustacchi * value to the EEPROM. 82575eba5b6SRobert Mustacchi **/ 82675eba5b6SRobert Mustacchi static s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw) 82775eba5b6SRobert Mustacchi { 82875eba5b6SRobert Mustacchi u32 eecd; 82975eba5b6SRobert Mustacchi s32 ret_val; 83075eba5b6SRobert Mustacchi u16 i; 83175eba5b6SRobert Mustacchi 83275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_update_nvm_checksum_82571"); 83375eba5b6SRobert Mustacchi 83475eba5b6SRobert Mustacchi ret_val = e1000_update_nvm_checksum_generic(hw); 83575eba5b6SRobert Mustacchi if (ret_val) 83675eba5b6SRobert Mustacchi return ret_val; 83775eba5b6SRobert Mustacchi 83875eba5b6SRobert Mustacchi /* If our nvm is an EEPROM, then we're done 83975eba5b6SRobert Mustacchi * otherwise, commit the checksum to the flash NVM. 84075eba5b6SRobert Mustacchi */ 84175eba5b6SRobert Mustacchi if (hw->nvm.type != e1000_nvm_flash_hw) 84275eba5b6SRobert Mustacchi return E1000_SUCCESS; 84375eba5b6SRobert Mustacchi 84475eba5b6SRobert Mustacchi /* Check for pending operations. */ 84575eba5b6SRobert Mustacchi for (i = 0; i < E1000_FLASH_UPDATES; i++) { 84675eba5b6SRobert Mustacchi msec_delay(1); 84775eba5b6SRobert Mustacchi if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_FLUPD)) 84875eba5b6SRobert Mustacchi break; 84975eba5b6SRobert Mustacchi } 85075eba5b6SRobert Mustacchi 85175eba5b6SRobert Mustacchi if (i == E1000_FLASH_UPDATES) 85275eba5b6SRobert Mustacchi return -E1000_ERR_NVM; 85375eba5b6SRobert Mustacchi 85475eba5b6SRobert Mustacchi /* Reset the firmware if using STM opcode. */ 85575eba5b6SRobert Mustacchi if ((E1000_READ_REG(hw, E1000_FLOP) & 0xFF00) == E1000_STM_OPCODE) { 85675eba5b6SRobert Mustacchi /* The enabling of and the actual reset must be done 85775eba5b6SRobert Mustacchi * in two write cycles. 85875eba5b6SRobert Mustacchi */ 85975eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_HICR, E1000_HICR_FW_RESET_ENABLE); 86075eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 86175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_HICR, E1000_HICR_FW_RESET); 86275eba5b6SRobert Mustacchi } 86375eba5b6SRobert Mustacchi 86475eba5b6SRobert Mustacchi /* Commit the write to flash */ 86575eba5b6SRobert Mustacchi eecd = E1000_READ_REG(hw, E1000_EECD) | E1000_EECD_FLUPD; 86675eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_EECD, eecd); 86775eba5b6SRobert Mustacchi 86875eba5b6SRobert Mustacchi for (i = 0; i < E1000_FLASH_UPDATES; i++) { 86975eba5b6SRobert Mustacchi msec_delay(1); 87075eba5b6SRobert Mustacchi if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_FLUPD)) 87175eba5b6SRobert Mustacchi break; 87275eba5b6SRobert Mustacchi } 87375eba5b6SRobert Mustacchi 87475eba5b6SRobert Mustacchi if (i == E1000_FLASH_UPDATES) 87575eba5b6SRobert Mustacchi return -E1000_ERR_NVM; 87675eba5b6SRobert Mustacchi 87775eba5b6SRobert Mustacchi return E1000_SUCCESS; 87875eba5b6SRobert Mustacchi } 87975eba5b6SRobert Mustacchi 88075eba5b6SRobert Mustacchi /** 88175eba5b6SRobert Mustacchi * e1000_validate_nvm_checksum_82571 - Validate EEPROM checksum 88275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 88375eba5b6SRobert Mustacchi * 88475eba5b6SRobert Mustacchi * Calculates the EEPROM checksum by reading/adding each word of the EEPROM 88575eba5b6SRobert Mustacchi * and then verifies that the sum of the EEPROM is equal to 0xBABA. 88675eba5b6SRobert Mustacchi **/ 88775eba5b6SRobert Mustacchi static s32 e1000_validate_nvm_checksum_82571(struct e1000_hw *hw) 88875eba5b6SRobert Mustacchi { 88975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_validate_nvm_checksum_82571"); 89075eba5b6SRobert Mustacchi 89175eba5b6SRobert Mustacchi if (hw->nvm.type == e1000_nvm_flash_hw) 89275eba5b6SRobert Mustacchi e1000_fix_nvm_checksum_82571(hw); 89375eba5b6SRobert Mustacchi 89475eba5b6SRobert Mustacchi return e1000_validate_nvm_checksum_generic(hw); 89575eba5b6SRobert Mustacchi } 89675eba5b6SRobert Mustacchi 89775eba5b6SRobert Mustacchi /** 89875eba5b6SRobert Mustacchi * e1000_write_nvm_eewr_82571 - Write to EEPROM for 82573 silicon 89975eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 90075eba5b6SRobert Mustacchi * @offset: offset within the EEPROM to be written to 90175eba5b6SRobert Mustacchi * @words: number of words to write 90275eba5b6SRobert Mustacchi * @data: 16 bit word(s) to be written to the EEPROM 90375eba5b6SRobert Mustacchi * 90475eba5b6SRobert Mustacchi * After checking for invalid values, poll the EEPROM to ensure the previous 90575eba5b6SRobert Mustacchi * command has completed before trying to write the next word. After write 90675eba5b6SRobert Mustacchi * poll for completion. 90775eba5b6SRobert Mustacchi * 90875eba5b6SRobert Mustacchi * If e1000_update_nvm_checksum is not called after this function, the 90975eba5b6SRobert Mustacchi * EEPROM will most likely contain an invalid checksum. 91075eba5b6SRobert Mustacchi **/ 91175eba5b6SRobert Mustacchi static s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset, 91275eba5b6SRobert Mustacchi u16 words, u16 *data) 91375eba5b6SRobert Mustacchi { 91475eba5b6SRobert Mustacchi struct e1000_nvm_info *nvm = &hw->nvm; 91575eba5b6SRobert Mustacchi u32 i, eewr = 0; 91675eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 91775eba5b6SRobert Mustacchi 91875eba5b6SRobert Mustacchi DEBUGFUNC("e1000_write_nvm_eewr_82571"); 91975eba5b6SRobert Mustacchi 92075eba5b6SRobert Mustacchi /* A check for invalid values: offset too large, too many words, 92175eba5b6SRobert Mustacchi * and not enough words. 92275eba5b6SRobert Mustacchi */ 92375eba5b6SRobert Mustacchi if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) || 92475eba5b6SRobert Mustacchi (words == 0)) { 92575eba5b6SRobert Mustacchi DEBUGOUT("nvm parameter(s) out of bounds\n"); 92675eba5b6SRobert Mustacchi return -E1000_ERR_NVM; 92775eba5b6SRobert Mustacchi } 92875eba5b6SRobert Mustacchi 92975eba5b6SRobert Mustacchi for (i = 0; i < words; i++) { 930c124a83eSRobert Mustacchi eewr = ((data[i] << E1000_NVM_RW_REG_DATA) | 93175eba5b6SRobert Mustacchi ((offset + i) << E1000_NVM_RW_ADDR_SHIFT) | 932c124a83eSRobert Mustacchi E1000_NVM_RW_REG_START); 93375eba5b6SRobert Mustacchi 93475eba5b6SRobert Mustacchi ret_val = e1000_poll_eerd_eewr_done(hw, E1000_NVM_POLL_WRITE); 93575eba5b6SRobert Mustacchi if (ret_val) 93675eba5b6SRobert Mustacchi break; 93775eba5b6SRobert Mustacchi 93875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_EEWR, eewr); 93975eba5b6SRobert Mustacchi 94075eba5b6SRobert Mustacchi ret_val = e1000_poll_eerd_eewr_done(hw, E1000_NVM_POLL_WRITE); 94175eba5b6SRobert Mustacchi if (ret_val) 94275eba5b6SRobert Mustacchi break; 94375eba5b6SRobert Mustacchi } 94475eba5b6SRobert Mustacchi 94575eba5b6SRobert Mustacchi return ret_val; 94675eba5b6SRobert Mustacchi } 94775eba5b6SRobert Mustacchi 94875eba5b6SRobert Mustacchi /** 94975eba5b6SRobert Mustacchi * e1000_get_cfg_done_82571 - Poll for configuration done 95075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 95175eba5b6SRobert Mustacchi * 95275eba5b6SRobert Mustacchi * Reads the management control register for the config done bit to be set. 95375eba5b6SRobert Mustacchi **/ 95475eba5b6SRobert Mustacchi static s32 e1000_get_cfg_done_82571(struct e1000_hw *hw) 95575eba5b6SRobert Mustacchi { 95675eba5b6SRobert Mustacchi s32 timeout = PHY_CFG_TIMEOUT; 95775eba5b6SRobert Mustacchi 95875eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_cfg_done_82571"); 95975eba5b6SRobert Mustacchi 96075eba5b6SRobert Mustacchi while (timeout) { 96175eba5b6SRobert Mustacchi if (E1000_READ_REG(hw, E1000_EEMNGCTL) & 96275eba5b6SRobert Mustacchi E1000_NVM_CFG_DONE_PORT_0) 96375eba5b6SRobert Mustacchi break; 96475eba5b6SRobert Mustacchi msec_delay(1); 96575eba5b6SRobert Mustacchi timeout--; 96675eba5b6SRobert Mustacchi } 96775eba5b6SRobert Mustacchi if (!timeout) { 96875eba5b6SRobert Mustacchi DEBUGOUT("MNG configuration cycle has not completed.\n"); 96975eba5b6SRobert Mustacchi return -E1000_ERR_RESET; 97075eba5b6SRobert Mustacchi } 97175eba5b6SRobert Mustacchi 97275eba5b6SRobert Mustacchi return E1000_SUCCESS; 97375eba5b6SRobert Mustacchi } 97475eba5b6SRobert Mustacchi 97575eba5b6SRobert Mustacchi /** 97675eba5b6SRobert Mustacchi * e1000_set_d0_lplu_state_82571 - Set Low Power Linkup D0 state 97775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 97875eba5b6SRobert Mustacchi * @active: TRUE to enable LPLU, FALSE to disable 97975eba5b6SRobert Mustacchi * 98075eba5b6SRobert Mustacchi * Sets the LPLU D0 state according to the active flag. When activating LPLU 98175eba5b6SRobert Mustacchi * this function also disables smart speed and vice versa. LPLU will not be 98275eba5b6SRobert Mustacchi * activated unless the device autonegotiation advertisement meets standards 98375eba5b6SRobert Mustacchi * of either 10 or 10/100 or 10/100/1000 at all duplexes. This is a function 98475eba5b6SRobert Mustacchi * pointer entry point only called by PHY setup routines. 98575eba5b6SRobert Mustacchi **/ 98675eba5b6SRobert Mustacchi static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, bool active) 98775eba5b6SRobert Mustacchi { 98875eba5b6SRobert Mustacchi struct e1000_phy_info *phy = &hw->phy; 98975eba5b6SRobert Mustacchi s32 ret_val; 99075eba5b6SRobert Mustacchi u16 data; 99175eba5b6SRobert Mustacchi 99275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_d0_lplu_state_82571"); 99375eba5b6SRobert Mustacchi 99475eba5b6SRobert Mustacchi if (!(phy->ops.read_reg)) 99575eba5b6SRobert Mustacchi return E1000_SUCCESS; 99675eba5b6SRobert Mustacchi 99775eba5b6SRobert Mustacchi ret_val = phy->ops.read_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data); 99875eba5b6SRobert Mustacchi if (ret_val) 99975eba5b6SRobert Mustacchi return ret_val; 100075eba5b6SRobert Mustacchi 100175eba5b6SRobert Mustacchi if (active) { 100275eba5b6SRobert Mustacchi data |= IGP02E1000_PM_D0_LPLU; 100375eba5b6SRobert Mustacchi ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, 100475eba5b6SRobert Mustacchi data); 100575eba5b6SRobert Mustacchi if (ret_val) 100675eba5b6SRobert Mustacchi return ret_val; 100775eba5b6SRobert Mustacchi 100875eba5b6SRobert Mustacchi /* When LPLU is enabled, we should disable SmartSpeed */ 100975eba5b6SRobert Mustacchi ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 101075eba5b6SRobert Mustacchi &data); 101175eba5b6SRobert Mustacchi if (ret_val) 101275eba5b6SRobert Mustacchi return ret_val; 101375eba5b6SRobert Mustacchi data &= ~IGP01E1000_PSCFR_SMART_SPEED; 101475eba5b6SRobert Mustacchi ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 101575eba5b6SRobert Mustacchi data); 101675eba5b6SRobert Mustacchi if (ret_val) 101775eba5b6SRobert Mustacchi return ret_val; 101875eba5b6SRobert Mustacchi } else { 101975eba5b6SRobert Mustacchi data &= ~IGP02E1000_PM_D0_LPLU; 102075eba5b6SRobert Mustacchi ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT, 102175eba5b6SRobert Mustacchi data); 102275eba5b6SRobert Mustacchi /* LPLU and SmartSpeed are mutually exclusive. LPLU is used 102375eba5b6SRobert Mustacchi * during Dx states where the power conservation is most 102475eba5b6SRobert Mustacchi * important. During driver activity we should enable 102575eba5b6SRobert Mustacchi * SmartSpeed, so performance is maintained. 102675eba5b6SRobert Mustacchi */ 102775eba5b6SRobert Mustacchi if (phy->smart_speed == e1000_smart_speed_on) { 102875eba5b6SRobert Mustacchi ret_val = phy->ops.read_reg(hw, 102975eba5b6SRobert Mustacchi IGP01E1000_PHY_PORT_CONFIG, 103075eba5b6SRobert Mustacchi &data); 103175eba5b6SRobert Mustacchi if (ret_val) 103275eba5b6SRobert Mustacchi return ret_val; 103375eba5b6SRobert Mustacchi 103475eba5b6SRobert Mustacchi data |= IGP01E1000_PSCFR_SMART_SPEED; 103575eba5b6SRobert Mustacchi ret_val = phy->ops.write_reg(hw, 103675eba5b6SRobert Mustacchi IGP01E1000_PHY_PORT_CONFIG, 103775eba5b6SRobert Mustacchi data); 103875eba5b6SRobert Mustacchi if (ret_val) 103975eba5b6SRobert Mustacchi return ret_val; 104075eba5b6SRobert Mustacchi } else if (phy->smart_speed == e1000_smart_speed_off) { 104175eba5b6SRobert Mustacchi ret_val = phy->ops.read_reg(hw, 104275eba5b6SRobert Mustacchi IGP01E1000_PHY_PORT_CONFIG, 104375eba5b6SRobert Mustacchi &data); 104475eba5b6SRobert Mustacchi if (ret_val) 104575eba5b6SRobert Mustacchi return ret_val; 104675eba5b6SRobert Mustacchi 104775eba5b6SRobert Mustacchi data &= ~IGP01E1000_PSCFR_SMART_SPEED; 104875eba5b6SRobert Mustacchi ret_val = phy->ops.write_reg(hw, 104975eba5b6SRobert Mustacchi IGP01E1000_PHY_PORT_CONFIG, 105075eba5b6SRobert Mustacchi data); 105175eba5b6SRobert Mustacchi if (ret_val) 105275eba5b6SRobert Mustacchi return ret_val; 105375eba5b6SRobert Mustacchi } 105475eba5b6SRobert Mustacchi } 105575eba5b6SRobert Mustacchi 105675eba5b6SRobert Mustacchi return E1000_SUCCESS; 105775eba5b6SRobert Mustacchi } 105875eba5b6SRobert Mustacchi 105975eba5b6SRobert Mustacchi /** 106075eba5b6SRobert Mustacchi * e1000_reset_hw_82571 - Reset hardware 106175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 106275eba5b6SRobert Mustacchi * 106375eba5b6SRobert Mustacchi * This resets the hardware into a known state. 106475eba5b6SRobert Mustacchi **/ 106575eba5b6SRobert Mustacchi static s32 e1000_reset_hw_82571(struct e1000_hw *hw) 106675eba5b6SRobert Mustacchi { 106775eba5b6SRobert Mustacchi u32 ctrl, ctrl_ext, eecd, tctl; 106875eba5b6SRobert Mustacchi s32 ret_val; 106975eba5b6SRobert Mustacchi 107075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_reset_hw_82571"); 107175eba5b6SRobert Mustacchi 107275eba5b6SRobert Mustacchi /* Prevent the PCI-E bus from sticking if there is no TLP connection 107375eba5b6SRobert Mustacchi * on the last TLP read/write transaction when MAC is reset. 107475eba5b6SRobert Mustacchi */ 107575eba5b6SRobert Mustacchi ret_val = e1000_disable_pcie_master_generic(hw); 107675eba5b6SRobert Mustacchi if (ret_val) 107775eba5b6SRobert Mustacchi DEBUGOUT("PCI-E Master disable polling has failed.\n"); 107875eba5b6SRobert Mustacchi 107975eba5b6SRobert Mustacchi DEBUGOUT("Masking off all interrupts\n"); 108075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); 108175eba5b6SRobert Mustacchi 108275eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_RCTL, 0); 108375eba5b6SRobert Mustacchi tctl = E1000_READ_REG(hw, E1000_TCTL); 108475eba5b6SRobert Mustacchi tctl &= ~E1000_TCTL_EN; 108575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TCTL, tctl); 108675eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 108775eba5b6SRobert Mustacchi 108875eba5b6SRobert Mustacchi msec_delay(10); 108975eba5b6SRobert Mustacchi 109075eba5b6SRobert Mustacchi /* Must acquire the MDIO ownership before MAC reset. 109175eba5b6SRobert Mustacchi * Ownership defaults to firmware after a reset. 109275eba5b6SRobert Mustacchi */ 109375eba5b6SRobert Mustacchi switch (hw->mac.type) { 109475eba5b6SRobert Mustacchi case e1000_82573: 109575eba5b6SRobert Mustacchi ret_val = e1000_get_hw_semaphore_82573(hw); 109675eba5b6SRobert Mustacchi break; 109775eba5b6SRobert Mustacchi case e1000_82574: 109875eba5b6SRobert Mustacchi case e1000_82583: 109975eba5b6SRobert Mustacchi ret_val = e1000_get_hw_semaphore_82574(hw); 110075eba5b6SRobert Mustacchi break; 110175eba5b6SRobert Mustacchi default: 110275eba5b6SRobert Mustacchi break; 110375eba5b6SRobert Mustacchi } 110475eba5b6SRobert Mustacchi 110575eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 110675eba5b6SRobert Mustacchi 110775eba5b6SRobert Mustacchi DEBUGOUT("Issuing a global reset to MAC\n"); 110875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); 110975eba5b6SRobert Mustacchi 111075eba5b6SRobert Mustacchi /* Must release MDIO ownership and mutex after MAC reset. */ 111175eba5b6SRobert Mustacchi switch (hw->mac.type) { 1112c124a83eSRobert Mustacchi case e1000_82573: 1113c124a83eSRobert Mustacchi /* Release mutex only if the hw semaphore is acquired */ 1114c124a83eSRobert Mustacchi if (!ret_val) 1115c124a83eSRobert Mustacchi e1000_put_hw_semaphore_82573(hw); 1116c124a83eSRobert Mustacchi break; 111775eba5b6SRobert Mustacchi case e1000_82574: 111875eba5b6SRobert Mustacchi case e1000_82583: 1119c124a83eSRobert Mustacchi /* Release mutex only if the hw semaphore is acquired */ 1120c124a83eSRobert Mustacchi if (!ret_val) 112175eba5b6SRobert Mustacchi e1000_put_hw_semaphore_82574(hw); 112275eba5b6SRobert Mustacchi break; 112375eba5b6SRobert Mustacchi default: 112475eba5b6SRobert Mustacchi break; 112575eba5b6SRobert Mustacchi } 112675eba5b6SRobert Mustacchi 112775eba5b6SRobert Mustacchi if (hw->nvm.type == e1000_nvm_flash_hw) { 112875eba5b6SRobert Mustacchi usec_delay(10); 112975eba5b6SRobert Mustacchi ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); 113075eba5b6SRobert Mustacchi ctrl_ext |= E1000_CTRL_EXT_EE_RST; 113175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); 113275eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 113375eba5b6SRobert Mustacchi } 113475eba5b6SRobert Mustacchi 113575eba5b6SRobert Mustacchi ret_val = e1000_get_auto_rd_done_generic(hw); 113675eba5b6SRobert Mustacchi if (ret_val) 113775eba5b6SRobert Mustacchi /* We don't want to continue accessing MAC registers. */ 113875eba5b6SRobert Mustacchi return ret_val; 113975eba5b6SRobert Mustacchi 114075eba5b6SRobert Mustacchi /* Phy configuration from NVM just starts after EECD_AUTO_RD is set. 114175eba5b6SRobert Mustacchi * Need to wait for Phy configuration completion before accessing 114275eba5b6SRobert Mustacchi * NVM and Phy. 114375eba5b6SRobert Mustacchi */ 114475eba5b6SRobert Mustacchi 114575eba5b6SRobert Mustacchi switch (hw->mac.type) { 114675eba5b6SRobert Mustacchi case e1000_82571: 114775eba5b6SRobert Mustacchi case e1000_82572: 114875eba5b6SRobert Mustacchi /* REQ and GNT bits need to be cleared when using AUTO_RD 114975eba5b6SRobert Mustacchi * to access the EEPROM. 115075eba5b6SRobert Mustacchi */ 115175eba5b6SRobert Mustacchi eecd = E1000_READ_REG(hw, E1000_EECD); 115275eba5b6SRobert Mustacchi eecd &= ~(E1000_EECD_REQ | E1000_EECD_GNT); 115375eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_EECD, eecd); 115475eba5b6SRobert Mustacchi break; 115575eba5b6SRobert Mustacchi case e1000_82573: 115675eba5b6SRobert Mustacchi case e1000_82574: 115775eba5b6SRobert Mustacchi case e1000_82583: 115875eba5b6SRobert Mustacchi msec_delay(25); 115975eba5b6SRobert Mustacchi break; 116075eba5b6SRobert Mustacchi default: 116175eba5b6SRobert Mustacchi break; 116275eba5b6SRobert Mustacchi } 116375eba5b6SRobert Mustacchi 116475eba5b6SRobert Mustacchi /* Clear any pending interrupt events. */ 116575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); 116675eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICR); 116775eba5b6SRobert Mustacchi 116875eba5b6SRobert Mustacchi if (hw->mac.type == e1000_82571) { 116975eba5b6SRobert Mustacchi /* Install any alternate MAC address into RAR0 */ 117075eba5b6SRobert Mustacchi ret_val = e1000_check_alt_mac_addr_generic(hw); 117175eba5b6SRobert Mustacchi if (ret_val) 117275eba5b6SRobert Mustacchi return ret_val; 117375eba5b6SRobert Mustacchi 117475eba5b6SRobert Mustacchi e1000_set_laa_state_82571(hw, TRUE); 117575eba5b6SRobert Mustacchi } 117675eba5b6SRobert Mustacchi 117775eba5b6SRobert Mustacchi /* Reinitialize the 82571 serdes link state machine */ 117875eba5b6SRobert Mustacchi if (hw->phy.media_type == e1000_media_type_internal_serdes) 117975eba5b6SRobert Mustacchi hw->mac.serdes_link_state = e1000_serdes_link_down; 118075eba5b6SRobert Mustacchi 118175eba5b6SRobert Mustacchi return E1000_SUCCESS; 118275eba5b6SRobert Mustacchi } 118375eba5b6SRobert Mustacchi 118475eba5b6SRobert Mustacchi /** 118575eba5b6SRobert Mustacchi * e1000_init_hw_82571 - Initialize hardware 118675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 118775eba5b6SRobert Mustacchi * 118875eba5b6SRobert Mustacchi * This inits the hardware readying it for operation. 118975eba5b6SRobert Mustacchi **/ 119075eba5b6SRobert Mustacchi static s32 e1000_init_hw_82571(struct e1000_hw *hw) 119175eba5b6SRobert Mustacchi { 119275eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 119375eba5b6SRobert Mustacchi u32 reg_data; 119475eba5b6SRobert Mustacchi s32 ret_val; 119575eba5b6SRobert Mustacchi u16 i, rar_count = mac->rar_entry_count; 119675eba5b6SRobert Mustacchi 119775eba5b6SRobert Mustacchi DEBUGFUNC("e1000_init_hw_82571"); 119875eba5b6SRobert Mustacchi 119975eba5b6SRobert Mustacchi e1000_initialize_hw_bits_82571(hw); 120075eba5b6SRobert Mustacchi 120175eba5b6SRobert Mustacchi /* Initialize identification LED */ 120275eba5b6SRobert Mustacchi ret_val = mac->ops.id_led_init(hw); 120375eba5b6SRobert Mustacchi /* An error is not fatal and we should not stop init due to this */ 120475eba5b6SRobert Mustacchi if (ret_val) 120575eba5b6SRobert Mustacchi DEBUGOUT("Error initializing identification LED\n"); 120675eba5b6SRobert Mustacchi 120775eba5b6SRobert Mustacchi /* Disabling VLAN filtering */ 120875eba5b6SRobert Mustacchi DEBUGOUT("Initializing the IEEE VLAN\n"); 120975eba5b6SRobert Mustacchi mac->ops.clear_vfta(hw); 121075eba5b6SRobert Mustacchi 121175eba5b6SRobert Mustacchi /* Setup the receive address. 121275eba5b6SRobert Mustacchi * If, however, a locally administered address was assigned to the 121375eba5b6SRobert Mustacchi * 82571, we must reserve a RAR for it to work around an issue where 121475eba5b6SRobert Mustacchi * resetting one port will reload the MAC on the other port. 121575eba5b6SRobert Mustacchi */ 121675eba5b6SRobert Mustacchi if (e1000_get_laa_state_82571(hw)) 121775eba5b6SRobert Mustacchi rar_count--; 121875eba5b6SRobert Mustacchi e1000_init_rx_addrs_generic(hw, rar_count); 121975eba5b6SRobert Mustacchi 122075eba5b6SRobert Mustacchi /* Zero out the Multicast HASH table */ 122175eba5b6SRobert Mustacchi DEBUGOUT("Zeroing the MTA\n"); 122275eba5b6SRobert Mustacchi for (i = 0; i < mac->mta_reg_count; i++) 122375eba5b6SRobert Mustacchi E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); 122475eba5b6SRobert Mustacchi 122575eba5b6SRobert Mustacchi /* Setup link and flow control */ 122675eba5b6SRobert Mustacchi ret_val = mac->ops.setup_link(hw); 122775eba5b6SRobert Mustacchi 122875eba5b6SRobert Mustacchi /* Set the transmit descriptor write-back policy */ 122975eba5b6SRobert Mustacchi reg_data = E1000_READ_REG(hw, E1000_TXDCTL(0)); 1230c124a83eSRobert Mustacchi reg_data = ((reg_data & ~E1000_TXDCTL_WTHRESH) | 1231c124a83eSRobert Mustacchi E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC); 123275eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(0), reg_data); 123375eba5b6SRobert Mustacchi 123475eba5b6SRobert Mustacchi /* ...for both queues. */ 123575eba5b6SRobert Mustacchi switch (mac->type) { 123675eba5b6SRobert Mustacchi case e1000_82573: 123775eba5b6SRobert Mustacchi e1000_enable_tx_pkt_filtering_generic(hw); 123875eba5b6SRobert Mustacchi /* fall through */ 123975eba5b6SRobert Mustacchi case e1000_82574: 124075eba5b6SRobert Mustacchi case e1000_82583: 124175eba5b6SRobert Mustacchi reg_data = E1000_READ_REG(hw, E1000_GCR); 124275eba5b6SRobert Mustacchi reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; 124375eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_GCR, reg_data); 124475eba5b6SRobert Mustacchi break; 124575eba5b6SRobert Mustacchi default: 124675eba5b6SRobert Mustacchi reg_data = E1000_READ_REG(hw, E1000_TXDCTL(1)); 1247c124a83eSRobert Mustacchi reg_data = ((reg_data & ~E1000_TXDCTL_WTHRESH) | 124875eba5b6SRobert Mustacchi E1000_TXDCTL_FULL_TX_DESC_WB | 1249c124a83eSRobert Mustacchi E1000_TXDCTL_COUNT_DESC); 125075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(1), reg_data); 125175eba5b6SRobert Mustacchi break; 125275eba5b6SRobert Mustacchi } 125375eba5b6SRobert Mustacchi 125475eba5b6SRobert Mustacchi /* Clear all of the statistics registers (clear on read). It is 125575eba5b6SRobert Mustacchi * important that we do this after we have tried to establish link 125675eba5b6SRobert Mustacchi * because the symbol error count will increment wildly if there 125775eba5b6SRobert Mustacchi * is no link. 125875eba5b6SRobert Mustacchi */ 125975eba5b6SRobert Mustacchi e1000_clear_hw_cntrs_82571(hw); 126075eba5b6SRobert Mustacchi 126175eba5b6SRobert Mustacchi return ret_val; 126275eba5b6SRobert Mustacchi } 126375eba5b6SRobert Mustacchi 126475eba5b6SRobert Mustacchi /** 126575eba5b6SRobert Mustacchi * e1000_initialize_hw_bits_82571 - Initialize hardware-dependent bits 126675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 126775eba5b6SRobert Mustacchi * 126875eba5b6SRobert Mustacchi * Initializes required hardware-dependent bits needed for normal operation. 126975eba5b6SRobert Mustacchi **/ 127075eba5b6SRobert Mustacchi static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) 127175eba5b6SRobert Mustacchi { 127275eba5b6SRobert Mustacchi u32 reg; 127375eba5b6SRobert Mustacchi 127475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_initialize_hw_bits_82571"); 127575eba5b6SRobert Mustacchi 127675eba5b6SRobert Mustacchi /* Transmit Descriptor Control 0 */ 127775eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_TXDCTL(0)); 127875eba5b6SRobert Mustacchi reg |= (1 << 22); 127975eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(0), reg); 128075eba5b6SRobert Mustacchi 128175eba5b6SRobert Mustacchi /* Transmit Descriptor Control 1 */ 128275eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_TXDCTL(1)); 128375eba5b6SRobert Mustacchi reg |= (1 << 22); 128475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(1), reg); 128575eba5b6SRobert Mustacchi 128675eba5b6SRobert Mustacchi /* Transmit Arbitration Control 0 */ 128775eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_TARC(0)); 128875eba5b6SRobert Mustacchi reg &= ~(0xF << 27); /* 30:27 */ 128975eba5b6SRobert Mustacchi switch (hw->mac.type) { 129075eba5b6SRobert Mustacchi case e1000_82571: 129175eba5b6SRobert Mustacchi case e1000_82572: 129275eba5b6SRobert Mustacchi reg |= (1 << 23) | (1 << 24) | (1 << 25) | (1 << 26); 129375eba5b6SRobert Mustacchi break; 129475eba5b6SRobert Mustacchi case e1000_82574: 129575eba5b6SRobert Mustacchi case e1000_82583: 129675eba5b6SRobert Mustacchi reg |= (1 << 26); 129775eba5b6SRobert Mustacchi break; 129875eba5b6SRobert Mustacchi default: 129975eba5b6SRobert Mustacchi break; 130075eba5b6SRobert Mustacchi } 130175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TARC(0), reg); 130275eba5b6SRobert Mustacchi 130375eba5b6SRobert Mustacchi /* Transmit Arbitration Control 1 */ 130475eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_TARC(1)); 130575eba5b6SRobert Mustacchi switch (hw->mac.type) { 130675eba5b6SRobert Mustacchi case e1000_82571: 130775eba5b6SRobert Mustacchi case e1000_82572: 130875eba5b6SRobert Mustacchi reg &= ~((1 << 29) | (1 << 30)); 130975eba5b6SRobert Mustacchi reg |= (1 << 22) | (1 << 24) | (1 << 25) | (1 << 26); 131075eba5b6SRobert Mustacchi if (E1000_READ_REG(hw, E1000_TCTL) & E1000_TCTL_MULR) 131175eba5b6SRobert Mustacchi reg &= ~(1 << 28); 131275eba5b6SRobert Mustacchi else 131375eba5b6SRobert Mustacchi reg |= (1 << 28); 131475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TARC(1), reg); 131575eba5b6SRobert Mustacchi break; 131675eba5b6SRobert Mustacchi default: 131775eba5b6SRobert Mustacchi break; 131875eba5b6SRobert Mustacchi } 131975eba5b6SRobert Mustacchi 132075eba5b6SRobert Mustacchi /* Device Control */ 132175eba5b6SRobert Mustacchi switch (hw->mac.type) { 132275eba5b6SRobert Mustacchi case e1000_82573: 132375eba5b6SRobert Mustacchi case e1000_82574: 132475eba5b6SRobert Mustacchi case e1000_82583: 132575eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_CTRL); 132675eba5b6SRobert Mustacchi reg &= ~(1 << 29); 132775eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, reg); 132875eba5b6SRobert Mustacchi break; 132975eba5b6SRobert Mustacchi default: 133075eba5b6SRobert Mustacchi break; 133175eba5b6SRobert Mustacchi } 133275eba5b6SRobert Mustacchi 133375eba5b6SRobert Mustacchi /* Extended Device Control */ 133475eba5b6SRobert Mustacchi switch (hw->mac.type) { 133575eba5b6SRobert Mustacchi case e1000_82573: 133675eba5b6SRobert Mustacchi case e1000_82574: 133775eba5b6SRobert Mustacchi case e1000_82583: 133875eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_CTRL_EXT); 133975eba5b6SRobert Mustacchi reg &= ~(1 << 23); 134075eba5b6SRobert Mustacchi reg |= (1 << 22); 134175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg); 134275eba5b6SRobert Mustacchi break; 134375eba5b6SRobert Mustacchi default: 134475eba5b6SRobert Mustacchi break; 134575eba5b6SRobert Mustacchi } 134675eba5b6SRobert Mustacchi 134775eba5b6SRobert Mustacchi if (hw->mac.type == e1000_82571) { 134875eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_PBA_ECC); 134975eba5b6SRobert Mustacchi reg |= E1000_PBA_ECC_CORR_EN; 135075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_PBA_ECC, reg); 135175eba5b6SRobert Mustacchi } 135275eba5b6SRobert Mustacchi 135375eba5b6SRobert Mustacchi /* Workaround for hardware errata. 135475eba5b6SRobert Mustacchi * Ensure that DMA Dynamic Clock gating is disabled on 82571 and 82572 135575eba5b6SRobert Mustacchi */ 135675eba5b6SRobert Mustacchi if ((hw->mac.type == e1000_82571) || 135775eba5b6SRobert Mustacchi (hw->mac.type == e1000_82572)) { 135875eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_CTRL_EXT); 135975eba5b6SRobert Mustacchi reg &= ~E1000_CTRL_EXT_DMA_DYN_CLK_EN; 136075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg); 136175eba5b6SRobert Mustacchi } 136275eba5b6SRobert Mustacchi 136375eba5b6SRobert Mustacchi /* Disable IPv6 extension header parsing because some malformed 136475eba5b6SRobert Mustacchi * IPv6 headers can hang the Rx. 136575eba5b6SRobert Mustacchi */ 136675eba5b6SRobert Mustacchi if (hw->mac.type <= e1000_82573) { 136775eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_RFCTL); 136875eba5b6SRobert Mustacchi reg |= (E1000_RFCTL_IPV6_EX_DIS | E1000_RFCTL_NEW_IPV6_EXT_DIS); 136975eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_RFCTL, reg); 137075eba5b6SRobert Mustacchi } 137175eba5b6SRobert Mustacchi 137275eba5b6SRobert Mustacchi /* PCI-Ex Control Registers */ 137375eba5b6SRobert Mustacchi switch (hw->mac.type) { 137475eba5b6SRobert Mustacchi case e1000_82574: 137575eba5b6SRobert Mustacchi case e1000_82583: 137675eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_GCR); 137775eba5b6SRobert Mustacchi reg |= (1 << 22); 137875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_GCR, reg); 137975eba5b6SRobert Mustacchi 138075eba5b6SRobert Mustacchi /* Workaround for hardware errata. 138175eba5b6SRobert Mustacchi * apply workaround for hardware errata documented in errata 138275eba5b6SRobert Mustacchi * docs Fixes issue where some error prone or unreliable PCIe 138375eba5b6SRobert Mustacchi * completions are occurring, particularly with ASPM enabled. 138475eba5b6SRobert Mustacchi * Without fix, issue can cause Tx timeouts. 138575eba5b6SRobert Mustacchi */ 138675eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_GCR2); 138775eba5b6SRobert Mustacchi reg |= 1; 138875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_GCR2, reg); 138975eba5b6SRobert Mustacchi break; 139075eba5b6SRobert Mustacchi default: 139175eba5b6SRobert Mustacchi break; 139275eba5b6SRobert Mustacchi } 139375eba5b6SRobert Mustacchi 139475eba5b6SRobert Mustacchi return; 139575eba5b6SRobert Mustacchi } 139675eba5b6SRobert Mustacchi 139775eba5b6SRobert Mustacchi /** 139875eba5b6SRobert Mustacchi * e1000_clear_vfta_82571 - Clear VLAN filter table 139975eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 140075eba5b6SRobert Mustacchi * 140175eba5b6SRobert Mustacchi * Clears the register array which contains the VLAN filter table by 140275eba5b6SRobert Mustacchi * setting all the values to 0. 140375eba5b6SRobert Mustacchi **/ 140475eba5b6SRobert Mustacchi static void e1000_clear_vfta_82571(struct e1000_hw *hw) 140575eba5b6SRobert Mustacchi { 140675eba5b6SRobert Mustacchi u32 offset; 140775eba5b6SRobert Mustacchi u32 vfta_value = 0; 140875eba5b6SRobert Mustacchi u32 vfta_offset = 0; 140975eba5b6SRobert Mustacchi u32 vfta_bit_in_reg = 0; 141075eba5b6SRobert Mustacchi 141175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_clear_vfta_82571"); 141275eba5b6SRobert Mustacchi 141375eba5b6SRobert Mustacchi switch (hw->mac.type) { 141475eba5b6SRobert Mustacchi case e1000_82573: 141575eba5b6SRobert Mustacchi case e1000_82574: 141675eba5b6SRobert Mustacchi case e1000_82583: 141775eba5b6SRobert Mustacchi if (hw->mng_cookie.vlan_id != 0) { 141875eba5b6SRobert Mustacchi /* The VFTA is a 4096b bit-field, each identifying 141975eba5b6SRobert Mustacchi * a single VLAN ID. The following operations 142075eba5b6SRobert Mustacchi * determine which 32b entry (i.e. offset) into the 142175eba5b6SRobert Mustacchi * array we want to set the VLAN ID (i.e. bit) of 142275eba5b6SRobert Mustacchi * the manageability unit. 142375eba5b6SRobert Mustacchi */ 142475eba5b6SRobert Mustacchi vfta_offset = (hw->mng_cookie.vlan_id >> 142575eba5b6SRobert Mustacchi E1000_VFTA_ENTRY_SHIFT) & 142675eba5b6SRobert Mustacchi E1000_VFTA_ENTRY_MASK; 142775eba5b6SRobert Mustacchi vfta_bit_in_reg = 142875eba5b6SRobert Mustacchi 1 << (hw->mng_cookie.vlan_id & 142975eba5b6SRobert Mustacchi E1000_VFTA_ENTRY_BIT_SHIFT_MASK); 143075eba5b6SRobert Mustacchi } 143175eba5b6SRobert Mustacchi break; 143275eba5b6SRobert Mustacchi default: 143375eba5b6SRobert Mustacchi break; 143475eba5b6SRobert Mustacchi } 143575eba5b6SRobert Mustacchi for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { 143675eba5b6SRobert Mustacchi /* If the offset we want to clear is the same offset of the 143775eba5b6SRobert Mustacchi * manageability VLAN ID, then clear all bits except that of 143875eba5b6SRobert Mustacchi * the manageability unit. 143975eba5b6SRobert Mustacchi */ 144075eba5b6SRobert Mustacchi vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0; 144175eba5b6SRobert Mustacchi E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, vfta_value); 144275eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 144375eba5b6SRobert Mustacchi } 144475eba5b6SRobert Mustacchi } 144575eba5b6SRobert Mustacchi 144675eba5b6SRobert Mustacchi /** 144775eba5b6SRobert Mustacchi * e1000_check_mng_mode_82574 - Check manageability is enabled 144875eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 144975eba5b6SRobert Mustacchi * 145075eba5b6SRobert Mustacchi * Reads the NVM Initialization Control Word 2 and returns TRUE 145175eba5b6SRobert Mustacchi * (>0) if any manageability is enabled, else FALSE (0). 145275eba5b6SRobert Mustacchi **/ 145375eba5b6SRobert Mustacchi static bool e1000_check_mng_mode_82574(struct e1000_hw *hw) 145475eba5b6SRobert Mustacchi { 145575eba5b6SRobert Mustacchi u16 data; 1456c124a83eSRobert Mustacchi s32 ret_val; 145775eba5b6SRobert Mustacchi 145875eba5b6SRobert Mustacchi DEBUGFUNC("e1000_check_mng_mode_82574"); 145975eba5b6SRobert Mustacchi 1460c124a83eSRobert Mustacchi ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &data); 1461c124a83eSRobert Mustacchi if (ret_val) 1462c124a83eSRobert Mustacchi return FALSE; 1463c124a83eSRobert Mustacchi 146475eba5b6SRobert Mustacchi return (data & E1000_NVM_INIT_CTRL2_MNGM) != 0; 146575eba5b6SRobert Mustacchi } 146675eba5b6SRobert Mustacchi 146775eba5b6SRobert Mustacchi /** 146875eba5b6SRobert Mustacchi * e1000_led_on_82574 - Turn LED on 146975eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 147075eba5b6SRobert Mustacchi * 147175eba5b6SRobert Mustacchi * Turn LED on. 147275eba5b6SRobert Mustacchi **/ 147375eba5b6SRobert Mustacchi static s32 e1000_led_on_82574(struct e1000_hw *hw) 147475eba5b6SRobert Mustacchi { 147575eba5b6SRobert Mustacchi u32 ctrl; 147675eba5b6SRobert Mustacchi u32 i; 147775eba5b6SRobert Mustacchi 147875eba5b6SRobert Mustacchi DEBUGFUNC("e1000_led_on_82574"); 147975eba5b6SRobert Mustacchi 148075eba5b6SRobert Mustacchi ctrl = hw->mac.ledctl_mode2; 148175eba5b6SRobert Mustacchi if (!(E1000_STATUS_LU & E1000_READ_REG(hw, E1000_STATUS))) { 148275eba5b6SRobert Mustacchi /* If no link, then turn LED on by setting the invert bit 148375eba5b6SRobert Mustacchi * for each LED that's "on" (0x0E) in ledctl_mode2. 148475eba5b6SRobert Mustacchi */ 148575eba5b6SRobert Mustacchi for (i = 0; i < 4; i++) 148675eba5b6SRobert Mustacchi if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == 148775eba5b6SRobert Mustacchi E1000_LEDCTL_MODE_LED_ON) 148875eba5b6SRobert Mustacchi ctrl |= (E1000_LEDCTL_LED0_IVRT << (i * 8)); 148975eba5b6SRobert Mustacchi } 149075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, ctrl); 149175eba5b6SRobert Mustacchi 149275eba5b6SRobert Mustacchi return E1000_SUCCESS; 149375eba5b6SRobert Mustacchi } 149475eba5b6SRobert Mustacchi 149575eba5b6SRobert Mustacchi /** 149675eba5b6SRobert Mustacchi * e1000_check_phy_82574 - check 82574 phy hung state 149775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 149875eba5b6SRobert Mustacchi * 149975eba5b6SRobert Mustacchi * Returns whether phy is hung or not 150075eba5b6SRobert Mustacchi **/ 150175eba5b6SRobert Mustacchi bool e1000_check_phy_82574(struct e1000_hw *hw) 150275eba5b6SRobert Mustacchi { 150375eba5b6SRobert Mustacchi u16 status_1kbt = 0; 150475eba5b6SRobert Mustacchi u16 receive_errors = 0; 150575eba5b6SRobert Mustacchi s32 ret_val; 150675eba5b6SRobert Mustacchi 150775eba5b6SRobert Mustacchi DEBUGFUNC("e1000_check_phy_82574"); 150875eba5b6SRobert Mustacchi 150975eba5b6SRobert Mustacchi /* Read PHY Receive Error counter first, if its is max - all F's then 151075eba5b6SRobert Mustacchi * read the Base1000T status register If both are max then PHY is hung. 151175eba5b6SRobert Mustacchi */ 151275eba5b6SRobert Mustacchi ret_val = hw->phy.ops.read_reg(hw, E1000_RECEIVE_ERROR_COUNTER, 151375eba5b6SRobert Mustacchi &receive_errors); 151475eba5b6SRobert Mustacchi if (ret_val) 151575eba5b6SRobert Mustacchi return FALSE; 151675eba5b6SRobert Mustacchi if (receive_errors == E1000_RECEIVE_ERROR_MAX) { 151775eba5b6SRobert Mustacchi ret_val = hw->phy.ops.read_reg(hw, E1000_BASE1000T_STATUS, 151875eba5b6SRobert Mustacchi &status_1kbt); 151975eba5b6SRobert Mustacchi if (ret_val) 152075eba5b6SRobert Mustacchi return FALSE; 152175eba5b6SRobert Mustacchi if ((status_1kbt & E1000_IDLE_ERROR_COUNT_MASK) == 152275eba5b6SRobert Mustacchi E1000_IDLE_ERROR_COUNT_MASK) 152375eba5b6SRobert Mustacchi return TRUE; 152475eba5b6SRobert Mustacchi } 152575eba5b6SRobert Mustacchi 152675eba5b6SRobert Mustacchi return FALSE; 152775eba5b6SRobert Mustacchi } 152875eba5b6SRobert Mustacchi 152975eba5b6SRobert Mustacchi 153075eba5b6SRobert Mustacchi /** 153175eba5b6SRobert Mustacchi * e1000_setup_link_82571 - Setup flow control and link settings 153275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 153375eba5b6SRobert Mustacchi * 153475eba5b6SRobert Mustacchi * Determines which flow control settings to use, then configures flow 153575eba5b6SRobert Mustacchi * control. Calls the appropriate media-specific link configuration 153675eba5b6SRobert Mustacchi * function. Assuming the adapter has a valid link partner, a valid link 153775eba5b6SRobert Mustacchi * should be established. Assumes the hardware has previously been reset 153875eba5b6SRobert Mustacchi * and the transmitter and receiver are not enabled. 153975eba5b6SRobert Mustacchi **/ 154075eba5b6SRobert Mustacchi static s32 e1000_setup_link_82571(struct e1000_hw *hw) 154175eba5b6SRobert Mustacchi { 154275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_setup_link_82571"); 154375eba5b6SRobert Mustacchi 154475eba5b6SRobert Mustacchi /* 82573 does not have a word in the NVM to determine 154575eba5b6SRobert Mustacchi * the default flow control setting, so we explicitly 154675eba5b6SRobert Mustacchi * set it to full. 154775eba5b6SRobert Mustacchi */ 154875eba5b6SRobert Mustacchi switch (hw->mac.type) { 154975eba5b6SRobert Mustacchi case e1000_82573: 155075eba5b6SRobert Mustacchi case e1000_82574: 155175eba5b6SRobert Mustacchi case e1000_82583: 155275eba5b6SRobert Mustacchi if (hw->fc.requested_mode == e1000_fc_default) 155375eba5b6SRobert Mustacchi hw->fc.requested_mode = e1000_fc_full; 155475eba5b6SRobert Mustacchi break; 155575eba5b6SRobert Mustacchi default: 155675eba5b6SRobert Mustacchi break; 155775eba5b6SRobert Mustacchi } 155875eba5b6SRobert Mustacchi 155975eba5b6SRobert Mustacchi return e1000_setup_link_generic(hw); 156075eba5b6SRobert Mustacchi } 156175eba5b6SRobert Mustacchi 156275eba5b6SRobert Mustacchi /** 156375eba5b6SRobert Mustacchi * e1000_setup_copper_link_82571 - Configure copper link settings 156475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 156575eba5b6SRobert Mustacchi * 156675eba5b6SRobert Mustacchi * Configures the link for auto-neg or forced speed and duplex. Then we check 156775eba5b6SRobert Mustacchi * for link, once link is established calls to configure collision distance 156875eba5b6SRobert Mustacchi * and flow control are called. 156975eba5b6SRobert Mustacchi **/ 157075eba5b6SRobert Mustacchi static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw) 157175eba5b6SRobert Mustacchi { 157275eba5b6SRobert Mustacchi u32 ctrl; 157375eba5b6SRobert Mustacchi s32 ret_val; 157475eba5b6SRobert Mustacchi 157575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_setup_copper_link_82571"); 157675eba5b6SRobert Mustacchi 157775eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 157875eba5b6SRobert Mustacchi ctrl |= E1000_CTRL_SLU; 157975eba5b6SRobert Mustacchi ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 158075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 158175eba5b6SRobert Mustacchi 158275eba5b6SRobert Mustacchi switch (hw->phy.type) { 158375eba5b6SRobert Mustacchi case e1000_phy_m88: 158475eba5b6SRobert Mustacchi case e1000_phy_bm: 158575eba5b6SRobert Mustacchi ret_val = e1000_copper_link_setup_m88(hw); 158675eba5b6SRobert Mustacchi break; 158775eba5b6SRobert Mustacchi case e1000_phy_igp_2: 158875eba5b6SRobert Mustacchi ret_val = e1000_copper_link_setup_igp(hw); 158975eba5b6SRobert Mustacchi break; 159075eba5b6SRobert Mustacchi default: 159175eba5b6SRobert Mustacchi return -E1000_ERR_PHY; 159275eba5b6SRobert Mustacchi break; 159375eba5b6SRobert Mustacchi } 159475eba5b6SRobert Mustacchi 159575eba5b6SRobert Mustacchi if (ret_val) 159675eba5b6SRobert Mustacchi return ret_val; 159775eba5b6SRobert Mustacchi 159875eba5b6SRobert Mustacchi return e1000_setup_copper_link_generic(hw); 159975eba5b6SRobert Mustacchi } 160075eba5b6SRobert Mustacchi 160175eba5b6SRobert Mustacchi /** 160275eba5b6SRobert Mustacchi * e1000_setup_fiber_serdes_link_82571 - Setup link for fiber/serdes 160375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 160475eba5b6SRobert Mustacchi * 160575eba5b6SRobert Mustacchi * Configures collision distance and flow control for fiber and serdes links. 160675eba5b6SRobert Mustacchi * Upon successful setup, poll for link. 160775eba5b6SRobert Mustacchi **/ 160875eba5b6SRobert Mustacchi static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw) 160975eba5b6SRobert Mustacchi { 161075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_setup_fiber_serdes_link_82571"); 161175eba5b6SRobert Mustacchi 161275eba5b6SRobert Mustacchi switch (hw->mac.type) { 161375eba5b6SRobert Mustacchi case e1000_82571: 161475eba5b6SRobert Mustacchi case e1000_82572: 161575eba5b6SRobert Mustacchi /* If SerDes loopback mode is entered, there is no form 161675eba5b6SRobert Mustacchi * of reset to take the adapter out of that mode. So we 161775eba5b6SRobert Mustacchi * have to explicitly take the adapter out of loopback 161875eba5b6SRobert Mustacchi * mode. This prevents drivers from twiddling their thumbs 161975eba5b6SRobert Mustacchi * if another tool failed to take it out of loopback mode. 162075eba5b6SRobert Mustacchi */ 162175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_SCTL, 162275eba5b6SRobert Mustacchi E1000_SCTL_DISABLE_SERDES_LOOPBACK); 162375eba5b6SRobert Mustacchi break; 162475eba5b6SRobert Mustacchi default: 162575eba5b6SRobert Mustacchi break; 162675eba5b6SRobert Mustacchi } 162775eba5b6SRobert Mustacchi 162875eba5b6SRobert Mustacchi return e1000_setup_fiber_serdes_link_generic(hw); 162975eba5b6SRobert Mustacchi } 163075eba5b6SRobert Mustacchi 163175eba5b6SRobert Mustacchi /** 163275eba5b6SRobert Mustacchi * e1000_check_for_serdes_link_82571 - Check for link (Serdes) 163375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 163475eba5b6SRobert Mustacchi * 163575eba5b6SRobert Mustacchi * Reports the link state as up or down. 163675eba5b6SRobert Mustacchi * 163775eba5b6SRobert Mustacchi * If autonegotiation is supported by the link partner, the link state is 163875eba5b6SRobert Mustacchi * determined by the result of autonegotiation. This is the most likely case. 163975eba5b6SRobert Mustacchi * If autonegotiation is not supported by the link partner, and the link 164075eba5b6SRobert Mustacchi * has a valid signal, force the link up. 164175eba5b6SRobert Mustacchi * 164275eba5b6SRobert Mustacchi * The link state is represented internally here by 4 states: 164375eba5b6SRobert Mustacchi * 164475eba5b6SRobert Mustacchi * 1) down 164575eba5b6SRobert Mustacchi * 2) autoneg_progress 164675eba5b6SRobert Mustacchi * 3) autoneg_complete (the link successfully autonegotiated) 164775eba5b6SRobert Mustacchi * 4) forced_up (the link has been forced up, it did not autonegotiate) 164875eba5b6SRobert Mustacchi * 164975eba5b6SRobert Mustacchi **/ 165075eba5b6SRobert Mustacchi static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) 165175eba5b6SRobert Mustacchi { 165275eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 165375eba5b6SRobert Mustacchi u32 rxcw; 165475eba5b6SRobert Mustacchi u32 ctrl; 165575eba5b6SRobert Mustacchi u32 status; 165675eba5b6SRobert Mustacchi u32 txcw; 165775eba5b6SRobert Mustacchi u32 i; 165875eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 165975eba5b6SRobert Mustacchi 166075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_check_for_serdes_link_82571"); 166175eba5b6SRobert Mustacchi 166275eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 166375eba5b6SRobert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS); 166475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_RXCW); 166575eba5b6SRobert Mustacchi /* SYNCH bit and IV bit are sticky */ 166675eba5b6SRobert Mustacchi usec_delay(10); 166775eba5b6SRobert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW); 166875eba5b6SRobert Mustacchi 166975eba5b6SRobert Mustacchi if ((rxcw & E1000_RXCW_SYNCH) && !(rxcw & E1000_RXCW_IV)) { 167075eba5b6SRobert Mustacchi /* Receiver is synchronized with no invalid bits. */ 167175eba5b6SRobert Mustacchi switch (mac->serdes_link_state) { 167275eba5b6SRobert Mustacchi case e1000_serdes_link_autoneg_complete: 167375eba5b6SRobert Mustacchi if (!(status & E1000_STATUS_LU)) { 167475eba5b6SRobert Mustacchi /* We have lost link, retry autoneg before 167575eba5b6SRobert Mustacchi * reporting link failure 167675eba5b6SRobert Mustacchi */ 167775eba5b6SRobert Mustacchi mac->serdes_link_state = 167875eba5b6SRobert Mustacchi e1000_serdes_link_autoneg_progress; 167975eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 168075eba5b6SRobert Mustacchi DEBUGOUT("AN_UP -> AN_PROG\n"); 168175eba5b6SRobert Mustacchi } else { 168275eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 168375eba5b6SRobert Mustacchi } 168475eba5b6SRobert Mustacchi break; 168575eba5b6SRobert Mustacchi 168675eba5b6SRobert Mustacchi case e1000_serdes_link_forced_up: 168775eba5b6SRobert Mustacchi /* If we are receiving /C/ ordered sets, re-enable 168875eba5b6SRobert Mustacchi * auto-negotiation in the TXCW register and disable 168975eba5b6SRobert Mustacchi * forced link in the Device Control register in an 169075eba5b6SRobert Mustacchi * attempt to auto-negotiate with our link partner. 169175eba5b6SRobert Mustacchi */ 169275eba5b6SRobert Mustacchi if (rxcw & E1000_RXCW_C) { 169375eba5b6SRobert Mustacchi /* Enable autoneg, and unforce link up */ 169475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); 169575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, 169675eba5b6SRobert Mustacchi (ctrl & ~E1000_CTRL_SLU)); 169775eba5b6SRobert Mustacchi mac->serdes_link_state = 169875eba5b6SRobert Mustacchi e1000_serdes_link_autoneg_progress; 169975eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 170075eba5b6SRobert Mustacchi DEBUGOUT("FORCED_UP -> AN_PROG\n"); 170175eba5b6SRobert Mustacchi } else { 170275eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 170375eba5b6SRobert Mustacchi } 170475eba5b6SRobert Mustacchi break; 170575eba5b6SRobert Mustacchi 170675eba5b6SRobert Mustacchi case e1000_serdes_link_autoneg_progress: 170775eba5b6SRobert Mustacchi if (rxcw & E1000_RXCW_C) { 170875eba5b6SRobert Mustacchi /* We received /C/ ordered sets, meaning the 170975eba5b6SRobert Mustacchi * link partner has autonegotiated, and we can 171075eba5b6SRobert Mustacchi * trust the Link Up (LU) status bit. 171175eba5b6SRobert Mustacchi */ 171275eba5b6SRobert Mustacchi if (status & E1000_STATUS_LU) { 171375eba5b6SRobert Mustacchi mac->serdes_link_state = 171475eba5b6SRobert Mustacchi e1000_serdes_link_autoneg_complete; 171575eba5b6SRobert Mustacchi DEBUGOUT("AN_PROG -> AN_UP\n"); 171675eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 171775eba5b6SRobert Mustacchi } else { 171875eba5b6SRobert Mustacchi /* Autoneg completed, but failed. */ 171975eba5b6SRobert Mustacchi mac->serdes_link_state = 172075eba5b6SRobert Mustacchi e1000_serdes_link_down; 172175eba5b6SRobert Mustacchi DEBUGOUT("AN_PROG -> DOWN\n"); 172275eba5b6SRobert Mustacchi } 172375eba5b6SRobert Mustacchi } else { 172475eba5b6SRobert Mustacchi /* The link partner did not autoneg. 172575eba5b6SRobert Mustacchi * Force link up and full duplex, and change 172675eba5b6SRobert Mustacchi * state to forced. 172775eba5b6SRobert Mustacchi */ 172875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, 172975eba5b6SRobert Mustacchi (mac->txcw & ~E1000_TXCW_ANE)); 173075eba5b6SRobert Mustacchi ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); 173175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 173275eba5b6SRobert Mustacchi 173375eba5b6SRobert Mustacchi /* Configure Flow Control after link up. */ 173475eba5b6SRobert Mustacchi ret_val = 173575eba5b6SRobert Mustacchi e1000_config_fc_after_link_up_generic(hw); 173675eba5b6SRobert Mustacchi if (ret_val) { 173775eba5b6SRobert Mustacchi DEBUGOUT("Error config flow control\n"); 173875eba5b6SRobert Mustacchi break; 173975eba5b6SRobert Mustacchi } 174075eba5b6SRobert Mustacchi mac->serdes_link_state = 174175eba5b6SRobert Mustacchi e1000_serdes_link_forced_up; 174275eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 174375eba5b6SRobert Mustacchi DEBUGOUT("AN_PROG -> FORCED_UP\n"); 174475eba5b6SRobert Mustacchi } 174575eba5b6SRobert Mustacchi break; 174675eba5b6SRobert Mustacchi 174775eba5b6SRobert Mustacchi case e1000_serdes_link_down: 174875eba5b6SRobert Mustacchi default: 174975eba5b6SRobert Mustacchi /* The link was down but the receiver has now gained 175075eba5b6SRobert Mustacchi * valid sync, so lets see if we can bring the link 175175eba5b6SRobert Mustacchi * up. 175275eba5b6SRobert Mustacchi */ 175375eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); 175475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & 175575eba5b6SRobert Mustacchi ~E1000_CTRL_SLU)); 175675eba5b6SRobert Mustacchi mac->serdes_link_state = 175775eba5b6SRobert Mustacchi e1000_serdes_link_autoneg_progress; 175875eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 175975eba5b6SRobert Mustacchi DEBUGOUT("DOWN -> AN_PROG\n"); 176075eba5b6SRobert Mustacchi break; 176175eba5b6SRobert Mustacchi } 176275eba5b6SRobert Mustacchi } else { 176375eba5b6SRobert Mustacchi if (!(rxcw & E1000_RXCW_SYNCH)) { 176475eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 176575eba5b6SRobert Mustacchi mac->serdes_link_state = e1000_serdes_link_down; 176675eba5b6SRobert Mustacchi DEBUGOUT("ANYSTATE -> DOWN\n"); 176775eba5b6SRobert Mustacchi } else { 176875eba5b6SRobert Mustacchi /* Check several times, if SYNCH bit and CONFIG 176975eba5b6SRobert Mustacchi * bit both are consistently 1 then simply ignore 177075eba5b6SRobert Mustacchi * the IV bit and restart Autoneg 177175eba5b6SRobert Mustacchi */ 177275eba5b6SRobert Mustacchi for (i = 0; i < AN_RETRY_COUNT; i++) { 177375eba5b6SRobert Mustacchi usec_delay(10); 177475eba5b6SRobert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW); 177575eba5b6SRobert Mustacchi if ((rxcw & E1000_RXCW_SYNCH) && 177675eba5b6SRobert Mustacchi (rxcw & E1000_RXCW_C)) 177775eba5b6SRobert Mustacchi continue; 177875eba5b6SRobert Mustacchi 177975eba5b6SRobert Mustacchi if (rxcw & E1000_RXCW_IV) { 178075eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 178175eba5b6SRobert Mustacchi mac->serdes_link_state = 178275eba5b6SRobert Mustacchi e1000_serdes_link_down; 178375eba5b6SRobert Mustacchi DEBUGOUT("ANYSTATE -> DOWN\n"); 178475eba5b6SRobert Mustacchi break; 178575eba5b6SRobert Mustacchi } 178675eba5b6SRobert Mustacchi } 178775eba5b6SRobert Mustacchi 178875eba5b6SRobert Mustacchi if (i == AN_RETRY_COUNT) { 178975eba5b6SRobert Mustacchi txcw = E1000_READ_REG(hw, E1000_TXCW); 179075eba5b6SRobert Mustacchi txcw |= E1000_TXCW_ANE; 179175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, txcw); 179275eba5b6SRobert Mustacchi mac->serdes_link_state = 179375eba5b6SRobert Mustacchi e1000_serdes_link_autoneg_progress; 179475eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 179575eba5b6SRobert Mustacchi DEBUGOUT("ANYSTATE -> AN_PROG\n"); 179675eba5b6SRobert Mustacchi } 179775eba5b6SRobert Mustacchi } 179875eba5b6SRobert Mustacchi } 179975eba5b6SRobert Mustacchi 180075eba5b6SRobert Mustacchi return ret_val; 180175eba5b6SRobert Mustacchi } 180275eba5b6SRobert Mustacchi 180375eba5b6SRobert Mustacchi /** 180475eba5b6SRobert Mustacchi * e1000_valid_led_default_82571 - Verify a valid default LED config 180575eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 180675eba5b6SRobert Mustacchi * @data: pointer to the NVM (EEPROM) 180775eba5b6SRobert Mustacchi * 180875eba5b6SRobert Mustacchi * Read the EEPROM for the current default LED configuration. If the 180975eba5b6SRobert Mustacchi * LED configuration is not valid, set to a valid LED configuration. 181075eba5b6SRobert Mustacchi **/ 181175eba5b6SRobert Mustacchi static s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data) 181275eba5b6SRobert Mustacchi { 181375eba5b6SRobert Mustacchi s32 ret_val; 181475eba5b6SRobert Mustacchi 181575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_valid_led_default_82571"); 181675eba5b6SRobert Mustacchi 181775eba5b6SRobert Mustacchi ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); 181875eba5b6SRobert Mustacchi if (ret_val) { 181975eba5b6SRobert Mustacchi DEBUGOUT("NVM Read Error\n"); 182075eba5b6SRobert Mustacchi return ret_val; 182175eba5b6SRobert Mustacchi } 182275eba5b6SRobert Mustacchi 182375eba5b6SRobert Mustacchi switch (hw->mac.type) { 182475eba5b6SRobert Mustacchi case e1000_82573: 182575eba5b6SRobert Mustacchi case e1000_82574: 182675eba5b6SRobert Mustacchi case e1000_82583: 182775eba5b6SRobert Mustacchi if (*data == ID_LED_RESERVED_F746) 182875eba5b6SRobert Mustacchi *data = ID_LED_DEFAULT_82573; 182975eba5b6SRobert Mustacchi break; 183075eba5b6SRobert Mustacchi default: 183175eba5b6SRobert Mustacchi if (*data == ID_LED_RESERVED_0000 || 183275eba5b6SRobert Mustacchi *data == ID_LED_RESERVED_FFFF) 183375eba5b6SRobert Mustacchi *data = ID_LED_DEFAULT; 183475eba5b6SRobert Mustacchi break; 183575eba5b6SRobert Mustacchi } 183675eba5b6SRobert Mustacchi 183775eba5b6SRobert Mustacchi return E1000_SUCCESS; 183875eba5b6SRobert Mustacchi } 183975eba5b6SRobert Mustacchi 184075eba5b6SRobert Mustacchi /** 184175eba5b6SRobert Mustacchi * e1000_get_laa_state_82571 - Get locally administered address state 184275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 184375eba5b6SRobert Mustacchi * 184475eba5b6SRobert Mustacchi * Retrieve and return the current locally administered address state. 184575eba5b6SRobert Mustacchi **/ 184675eba5b6SRobert Mustacchi bool e1000_get_laa_state_82571(struct e1000_hw *hw) 184775eba5b6SRobert Mustacchi { 184875eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_laa_state_82571"); 184975eba5b6SRobert Mustacchi 185075eba5b6SRobert Mustacchi if (hw->mac.type != e1000_82571) 185175eba5b6SRobert Mustacchi return FALSE; 185275eba5b6SRobert Mustacchi 185375eba5b6SRobert Mustacchi return hw->dev_spec._82571.laa_is_present; 185475eba5b6SRobert Mustacchi } 185575eba5b6SRobert Mustacchi 185675eba5b6SRobert Mustacchi /** 185775eba5b6SRobert Mustacchi * e1000_set_laa_state_82571 - Set locally administered address state 185875eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 185975eba5b6SRobert Mustacchi * @state: enable/disable locally administered address 186075eba5b6SRobert Mustacchi * 186175eba5b6SRobert Mustacchi * Enable/Disable the current locally administered address state. 186275eba5b6SRobert Mustacchi **/ 186375eba5b6SRobert Mustacchi void e1000_set_laa_state_82571(struct e1000_hw *hw, bool state) 186475eba5b6SRobert Mustacchi { 186575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_laa_state_82571"); 186675eba5b6SRobert Mustacchi 186775eba5b6SRobert Mustacchi if (hw->mac.type != e1000_82571) 186875eba5b6SRobert Mustacchi return; 186975eba5b6SRobert Mustacchi 187075eba5b6SRobert Mustacchi hw->dev_spec._82571.laa_is_present = state; 187175eba5b6SRobert Mustacchi 187275eba5b6SRobert Mustacchi /* If workaround is activated... */ 187375eba5b6SRobert Mustacchi if (state) 187475eba5b6SRobert Mustacchi /* Hold a copy of the LAA in RAR[14] This is done so that 187575eba5b6SRobert Mustacchi * between the time RAR[0] gets clobbered and the time it 187675eba5b6SRobert Mustacchi * gets fixed, the actual LAA is in one of the RARs and no 187775eba5b6SRobert Mustacchi * incoming packets directed to this port are dropped. 187875eba5b6SRobert Mustacchi * Eventually the LAA will be in RAR[0] and RAR[14]. 187975eba5b6SRobert Mustacchi */ 188075eba5b6SRobert Mustacchi hw->mac.ops.rar_set(hw, hw->mac.addr, 188175eba5b6SRobert Mustacchi hw->mac.rar_entry_count - 1); 188275eba5b6SRobert Mustacchi return; 188375eba5b6SRobert Mustacchi } 188475eba5b6SRobert Mustacchi 188575eba5b6SRobert Mustacchi /** 188675eba5b6SRobert Mustacchi * e1000_fix_nvm_checksum_82571 - Fix EEPROM checksum 188775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 188875eba5b6SRobert Mustacchi * 188975eba5b6SRobert Mustacchi * Verifies that the EEPROM has completed the update. After updating the 189075eba5b6SRobert Mustacchi * EEPROM, we need to check bit 15 in work 0x23 for the checksum fix. If 189175eba5b6SRobert Mustacchi * the checksum fix is not implemented, we need to set the bit and update 189275eba5b6SRobert Mustacchi * the checksum. Otherwise, if bit 15 is set and the checksum is incorrect, 189375eba5b6SRobert Mustacchi * we need to return bad checksum. 189475eba5b6SRobert Mustacchi **/ 189575eba5b6SRobert Mustacchi static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw) 189675eba5b6SRobert Mustacchi { 189775eba5b6SRobert Mustacchi struct e1000_nvm_info *nvm = &hw->nvm; 189875eba5b6SRobert Mustacchi s32 ret_val; 189975eba5b6SRobert Mustacchi u16 data; 190075eba5b6SRobert Mustacchi 190175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_fix_nvm_checksum_82571"); 190275eba5b6SRobert Mustacchi 190375eba5b6SRobert Mustacchi if (nvm->type != e1000_nvm_flash_hw) 190475eba5b6SRobert Mustacchi return E1000_SUCCESS; 190575eba5b6SRobert Mustacchi 190675eba5b6SRobert Mustacchi /* Check bit 4 of word 10h. If it is 0, firmware is done updating 190775eba5b6SRobert Mustacchi * 10h-12h. Checksum may need to be fixed. 190875eba5b6SRobert Mustacchi */ 190975eba5b6SRobert Mustacchi ret_val = nvm->ops.read(hw, 0x10, 1, &data); 191075eba5b6SRobert Mustacchi if (ret_val) 191175eba5b6SRobert Mustacchi return ret_val; 191275eba5b6SRobert Mustacchi 191375eba5b6SRobert Mustacchi if (!(data & 0x10)) { 191475eba5b6SRobert Mustacchi /* Read 0x23 and check bit 15. This bit is a 1 191575eba5b6SRobert Mustacchi * when the checksum has already been fixed. If 191675eba5b6SRobert Mustacchi * the checksum is still wrong and this bit is a 191775eba5b6SRobert Mustacchi * 1, we need to return bad checksum. Otherwise, 191875eba5b6SRobert Mustacchi * we need to set this bit to a 1 and update the 191975eba5b6SRobert Mustacchi * checksum. 192075eba5b6SRobert Mustacchi */ 192175eba5b6SRobert Mustacchi ret_val = nvm->ops.read(hw, 0x23, 1, &data); 192275eba5b6SRobert Mustacchi if (ret_val) 192375eba5b6SRobert Mustacchi return ret_val; 192475eba5b6SRobert Mustacchi 192575eba5b6SRobert Mustacchi if (!(data & 0x8000)) { 192675eba5b6SRobert Mustacchi data |= 0x8000; 192775eba5b6SRobert Mustacchi ret_val = nvm->ops.write(hw, 0x23, 1, &data); 192875eba5b6SRobert Mustacchi if (ret_val) 192975eba5b6SRobert Mustacchi return ret_val; 193075eba5b6SRobert Mustacchi ret_val = nvm->ops.update(hw); 193175eba5b6SRobert Mustacchi if (ret_val) 193275eba5b6SRobert Mustacchi return ret_val; 193375eba5b6SRobert Mustacchi } 193475eba5b6SRobert Mustacchi } 193575eba5b6SRobert Mustacchi 193675eba5b6SRobert Mustacchi return E1000_SUCCESS; 193775eba5b6SRobert Mustacchi } 193875eba5b6SRobert Mustacchi 193975eba5b6SRobert Mustacchi 194075eba5b6SRobert Mustacchi /** 194175eba5b6SRobert Mustacchi * e1000_read_mac_addr_82571 - Read device MAC address 194275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 194375eba5b6SRobert Mustacchi **/ 194475eba5b6SRobert Mustacchi static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw) 194575eba5b6SRobert Mustacchi { 194675eba5b6SRobert Mustacchi DEBUGFUNC("e1000_read_mac_addr_82571"); 194775eba5b6SRobert Mustacchi 194875eba5b6SRobert Mustacchi if (hw->mac.type == e1000_82571) { 194975eba5b6SRobert Mustacchi s32 ret_val; 195075eba5b6SRobert Mustacchi 195175eba5b6SRobert Mustacchi /* If there's an alternate MAC address place it in RAR0 195275eba5b6SRobert Mustacchi * so that it will override the Si installed default perm 195375eba5b6SRobert Mustacchi * address. 195475eba5b6SRobert Mustacchi */ 195575eba5b6SRobert Mustacchi ret_val = e1000_check_alt_mac_addr_generic(hw); 195675eba5b6SRobert Mustacchi if (ret_val) 195775eba5b6SRobert Mustacchi return ret_val; 195875eba5b6SRobert Mustacchi } 195975eba5b6SRobert Mustacchi 196075eba5b6SRobert Mustacchi return e1000_read_mac_addr_generic(hw); 196175eba5b6SRobert Mustacchi } 196275eba5b6SRobert Mustacchi 196375eba5b6SRobert Mustacchi /** 196475eba5b6SRobert Mustacchi * e1000_power_down_phy_copper_82571 - Remove link during PHY power down 196575eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 196675eba5b6SRobert Mustacchi * 196775eba5b6SRobert Mustacchi * In the case of a PHY power down to save power, or to turn off link during a 196875eba5b6SRobert Mustacchi * driver unload, or wake on lan is not enabled, remove the link. 196975eba5b6SRobert Mustacchi **/ 197075eba5b6SRobert Mustacchi static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw) 197175eba5b6SRobert Mustacchi { 197275eba5b6SRobert Mustacchi struct e1000_phy_info *phy = &hw->phy; 197375eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 197475eba5b6SRobert Mustacchi 197575eba5b6SRobert Mustacchi if (!phy->ops.check_reset_block) 197675eba5b6SRobert Mustacchi return; 197775eba5b6SRobert Mustacchi 197875eba5b6SRobert Mustacchi /* If the management interface is not enabled, then power down */ 197975eba5b6SRobert Mustacchi if (!(mac->ops.check_mng_mode(hw) || phy->ops.check_reset_block(hw))) 198075eba5b6SRobert Mustacchi e1000_power_down_phy_copper(hw); 198175eba5b6SRobert Mustacchi 198275eba5b6SRobert Mustacchi return; 198375eba5b6SRobert Mustacchi } 198475eba5b6SRobert Mustacchi 198575eba5b6SRobert Mustacchi /** 198675eba5b6SRobert Mustacchi * e1000_clear_hw_cntrs_82571 - Clear device specific hardware counters 198775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 198875eba5b6SRobert Mustacchi * 198975eba5b6SRobert Mustacchi * Clears the hardware counters by reading the counter registers. 199075eba5b6SRobert Mustacchi **/ 199175eba5b6SRobert Mustacchi static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw) 199275eba5b6SRobert Mustacchi { 199375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_clear_hw_cntrs_82571"); 199475eba5b6SRobert Mustacchi 199575eba5b6SRobert Mustacchi e1000_clear_hw_cntrs_base_generic(hw); 199675eba5b6SRobert Mustacchi 199775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PRC64); 199875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PRC127); 199975eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PRC255); 200075eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PRC511); 200175eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PRC1023); 200275eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PRC1522); 200375eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PTC64); 200475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PTC127); 200575eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PTC255); 200675eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PTC511); 200775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PTC1023); 200875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_PTC1522); 200975eba5b6SRobert Mustacchi 201075eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ALGNERRC); 201175eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_RXERRC); 201275eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TNCRS); 201375eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_CEXTERR); 201475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TSCTC); 201575eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TSCTFC); 201675eba5b6SRobert Mustacchi 201775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_MGTPRC); 201875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_MGTPDC); 201975eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_MGTPTC); 202075eba5b6SRobert Mustacchi 202175eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_IAC); 202275eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICRXOC); 202375eba5b6SRobert Mustacchi 202475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICRXPTC); 202575eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICRXATC); 202675eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICTXPTC); 202775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICTXATC); 202875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICTXQEC); 202975eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICTXQMTC); 203075eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ICRXDMTC); 203175eba5b6SRobert Mustacchi } 2032