75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/******************************************************************************
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
49b7860084dbba18bc00b29413d6182197f9fe93Robert Mustacchi Copyright (c) 2001-2015, Intel Corporation
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi All rights reserved.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi Redistribution and use in source and binary forms, with or without
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi modification, are permitted provided that the following conditions are met:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi 1. Redistributions of source code must retain the above copyright notice,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi this list of conditions and the following disclaimer.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi 2. Redistributions in binary form must reproduce the above copyright
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi notice, this list of conditions and the following disclaimer in the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi documentation and/or other materials provided with the distribution.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi 3. Neither the name of the Intel Corporation nor the names of its
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi contributors may be used to endorse or promote products derived from
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi this software without specific prior written permission.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi POSSIBILITY OF SUCH DAMAGE.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi******************************************************************************/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/*$FreeBSD$*/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/* 82571EB Gigabit Ethernet Controller
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82571EB Gigabit Ethernet Controller (Copper)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82571EB Gigabit Ethernet Controller (Fiber)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82571EB Dual Port Gigabit Mezzanine Adapter
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82571EB Quad Port Gigabit Mezzanine Adapter
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82571PT Gigabit PT Quad Port Server ExpressModule
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82572EI Gigabit Ethernet Controller (Copper)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82572EI Gigabit Ethernet Controller (Fiber)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82572EI Gigabit Ethernet Controller
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82573V Gigabit Ethernet Controller (Copper)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82573E Gigabit Ethernet Controller (Copper)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82573L Gigabit Ethernet Controller
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82574L Gigabit Network Connection
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82583V Gigabit Network Connection
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi#include "e1000_api.h"
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_acquire_nvm_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_release_nvm_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_write_nvm_82571(struct e1000_hw *hw, u16 offset,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 words, u16 *data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_validate_nvm_checksum_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_cfg_done_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi bool active);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_reset_hw_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_hw_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_clear_vfta_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic bool e1000_check_mng_mode_82574(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_led_on_82574(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_setup_link_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_setup_copper_link_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_phy_id_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_put_hw_semaphore_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_put_hw_semaphore_82573(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_put_hw_semaphore_82574(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi bool active);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi bool active);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_initialize_hw_bits_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 words, u16 *data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_read_mac_addr_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_power_down_phy_copper_82571(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_phy_params_82571 - Init PHY func ptrs.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_phy_params_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_phy_info *phy = &hw->phy;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_phy_params_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->phy.media_type != e1000_media_type_copper) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->type = e1000_phy_none;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->addr = 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->reset_delay_us = 100;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.check_reset_block = e1000_check_reset_block_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.reset = e1000_phy_hw_reset_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.power_up = e1000_power_up_phy_copper;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.power_down = e1000_power_down_phy_copper_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->type = e1000_phy_igp_2;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_cfg_done = e1000_get_cfg_done_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_info = e1000_get_phy_info_igp;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.check_polarity = e1000_check_polarity_igp;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_igp;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_cable_length = e1000_get_cable_length_igp_2;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.read_reg = e1000_read_phy_reg_igp;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.write_reg = e1000_write_phy_reg_igp;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.acquire = e1000_get_hw_semaphore_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.release = e1000_put_hw_semaphore_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->type = e1000_phy_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_cfg_done = e1000_get_cfg_done_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_info = e1000_get_phy_info_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.check_polarity = e1000_check_polarity_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.commit = e1000_phy_sw_reset_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_cable_length = e1000_get_cable_length_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.read_reg = e1000_read_phy_reg_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.write_reg = e1000_write_phy_reg_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.acquire = e1000_get_hw_semaphore_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.release = e1000_put_hw_semaphore_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_MUTEX_INIT(&hw->dev_spec._82571.swflag_mutex);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->type = e1000_phy_bm;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_cfg_done = e1000_get_cfg_done_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_info = e1000_get_phy_info_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.check_polarity = e1000_check_polarity_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.commit = e1000_phy_sw_reset_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.get_cable_length = e1000_get_cable_length_m88;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.read_reg = e1000_read_phy_reg_bm2;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.write_reg = e1000_write_phy_reg_bm2;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.acquire = e1000_get_hw_semaphore_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.release = e1000_put_hw_semaphore_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* This can only be done after all function pointers are setup. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_get_phy_id_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Error getting PHY ID\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Verify phy id */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (phy->id != IGP01E1000_I_PHY_ID)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (phy->id != M88E1111_I_PHY_ID)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (phy->id != BME1000_E_PHY_ID_R2)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT1("PHY ID unknown: type = 0x%08x\n", phy->id);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_nvm_params_82571 - Init NVM func ptrs.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_nvm_params_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_nvm_info *nvm = &hw->nvm;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 eecd = E1000_READ_REG(hw, E1000_EECD);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 size;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_nvm_params_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->opcode_bits = 8;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->delay_usec = 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (nvm->override) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_nvm_override_spi_large:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->page_size = 32;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->address_bits = 16;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_nvm_override_spi_small:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->page_size = 8;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->address_bits = 8;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (((eecd >> 15) & 0x3) == 0x3) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->type = e1000_nvm_flash_hw;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->word_size = 2048;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Autonomous Flash update bit must be cleared due
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * to Flash update issue.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi eecd &= ~E1000_EECD_AUPDEN;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_EECD, eecd);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Fall Through */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->type = e1000_nvm_eeprom_spi;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >>
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_EECD_SIZE_EX_SHIFT);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Added to a constant, "size" becomes the left-shift value
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * for setting word_size.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi size += NVM_WORD_SIZE_BASE_SHIFT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* EEPROM access above 16k is unsupported */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (size > 14)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi size = 14;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->word_size = 1 << size;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Function Pointers */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.acquire = e1000_get_hw_semaphore_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.release = e1000_put_hw_semaphore_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.acquire = e1000_acquire_nvm_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.release = e1000_release_nvm_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.read = e1000_read_nvm_eerd;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.update = e1000_update_nvm_checksum_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.validate = e1000_validate_nvm_checksum_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.valid_led_default = e1000_valid_led_default_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi nvm->ops.write = e1000_write_nvm_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_mac_params_82571 - Init MAC func ptrs.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_mac_params_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mac_info *mac = &hw->mac;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 swsm = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 swsm2 = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi bool force_clear_smbi = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_mac_params_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Set media type and media-dependent function pointers */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->device_id) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case E1000_DEV_ID_82571EB_FIBER:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case E1000_DEV_ID_82572EI_FIBER:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case E1000_DEV_ID_82571EB_QUAD_FIBER:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.media_type = e1000_media_type_fiber;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.setup_physical_interface =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_setup_fiber_serdes_link_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.check_for_link = e1000_check_for_fiber_link_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.get_link_up_info =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_get_speed_and_duplex_fiber_serdes_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case E1000_DEV_ID_82571EB_SERDES:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case E1000_DEV_ID_82571EB_SERDES_DUAL:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case E1000_DEV_ID_82571EB_SERDES_QUAD:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case E1000_DEV_ID_82572EI_SERDES:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.media_type = e1000_media_type_internal_serdes;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.setup_physical_interface =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_setup_fiber_serdes_link_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.check_for_link = e1000_check_for_serdes_link_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.get_link_up_info =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_get_speed_and_duplex_fiber_serdes_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.media_type = e1000_media_type_copper;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.setup_physical_interface =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_setup_copper_link_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.check_for_link = e1000_check_for_copper_link_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.get_link_up_info =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_get_speed_and_duplex_copper_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Set mta register count */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->mta_reg_count = 128;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Set rar entry count */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->rar_entry_count = E1000_RAR_ENTRIES;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Set if part includes ASF firmware */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->asf_firmware_present = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Adaptive IFS supported */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->adaptive_ifs = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Function pointers */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* bus type/speed/width */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.get_bus_info = e1000_get_bus_info_pcie_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* reset */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.reset_hw = e1000_reset_hw_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* hw initialization */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.init_hw = e1000_init_hw_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* link setup */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.setup_link = e1000_setup_link_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* multicast address update */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* writing VFTA */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.write_vfta = e1000_write_vfta_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* clearing VFTA */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.clear_vfta = e1000_clear_vfta_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* read mac address */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.read_mac_addr = e1000_read_mac_addr_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* ID LED init */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.id_led_init = e1000_id_led_init_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* setup LED */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.setup_led = e1000_setup_led_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* cleanup LED */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.cleanup_led = e1000_cleanup_led_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* turn off LED */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.led_off = e1000_led_off_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* clear hardware counters */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* MAC-specific function pointers */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.set_lan_id = e1000_set_lan_id_single_port;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.check_mng_mode = e1000_check_mng_mode_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.led_on = e1000_led_on_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.blink_led = e1000_blink_led_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* FWSM register */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->has_fwsm = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* ARC supported; valid only if manageability features are
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * enabled.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->arc_subsystem_valid = !!(E1000_READ_REG(hw, E1000_FWSM) &
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_FWSM_MODE_MASK);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.set_lan_id = e1000_set_lan_id_single_port;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.check_mng_mode = e1000_check_mng_mode_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.led_on = e1000_led_on_82574;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.check_mng_mode = e1000_check_mng_mode_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.led_on = e1000_led_on_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.blink_led = e1000_blink_led_generic;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* FWSM register */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->has_fwsm = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Ensure that the inter-port SWSM.SMBI lock bit is clear before
ea4c6b78cebe2a3687fa43deeedf6212a124d817Robert Mustacchi * first NVM or PHY access. This should be done for single-port
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * devices, and for one port only on dual-port devices so that
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * for those devices we can still use the SMBI lock to synchronize
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * inter-port accesses to the PHY & NVM.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi swsm2 = E1000_READ_REG(hw, E1000_SWSM2);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(swsm2 & E1000_SWSM2_LOCK)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Only do this for the first interface on this card */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM2, swsm2 |
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_SWSM2_LOCK);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi force_clear_smbi = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi force_clear_smbi = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi force_clear_smbi = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (force_clear_smbi) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Make sure SWSM.SMBI is clear */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (swsm & E1000_SWSM_SMBI) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* This bit should not be set on a first interface, and
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * indicates that the bootagent or EFI code has
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * improperly left this bit enabled
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Please update your 82571 Bootagent\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm & ~E1000_SWSM_SMBI);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Initialze device specific counter of SMBI acquisition timeouts. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->dev_spec._82571.smb_counter = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_function_pointers_82571 - Init func ptrs.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Called to initialize all function pointers and parameters.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchivoid e1000_init_function_pointers_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_function_pointers_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->mac.ops.init_params = e1000_init_mac_params_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->nvm.ops.init_params = e1000_init_nvm_params_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.ops.init_params = e1000_init_phy_params_82571;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_phy_id_82571 - Retrieve the PHY ID and revision
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Reads the PHY registers and stores the PHY ID and possibly the PHY
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * revision in the hardware structure.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_phy_id_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_phy_info *phy = &hw->phy;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 phy_id = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_phy_id_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* The 82571 firmware may still be configuring the PHY.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * In this case, we cannot access the PHY until the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * configuration is done. So we explicitly set the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * PHY ID.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->id = IGP01E1000_I_PHY_ID;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return e1000_get_phy_id(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->id = (u32)(phy_id << 16);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi usec_delay(20);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.read_reg(hw, PHY_ID2, &phy_id);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->id |= (u32)(phy_id);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_hw_semaphore_82571 - Acquire hardware semaphore
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Acquire the HW semaphore to access the PHY or NVM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 swsm;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 sw_timeout = hw->nvm.word_size + 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 fw_timeout = hw->nvm.word_size + 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 i = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_hw_semaphore_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If we have timedout 3 times on trying to acquire
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the inter-port SMBI semaphore, there is old code
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * operating on the other port, and it is not
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * releasing SMBI. Modify the number of times that
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * we try for the semaphore to interwork with this
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * older code.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->dev_spec._82571.smb_counter > 2)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi sw_timeout = 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Get the SW semaphore */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi while (i < sw_timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(swsm & E1000_SWSM_SMBI))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi usec_delay(50);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi i++;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (i == sw_timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->dev_spec._82571.smb_counter++;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Get the FW semaphore. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < fw_timeout; i++) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Semaphore acquired if bit latched */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi usec_delay(50);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (i == fw_timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Release semaphores */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_put_hw_semaphore_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Driver can't access the NVM\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_NVM;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_put_hw_semaphore_82571 - Release hardware semaphore
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Release hardware semaphore used to access the PHY or NVM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_put_hw_semaphore_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 swsm;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_put_hw_semaphore_generic");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_hw_semaphore_82573 - Acquire hardware semaphore
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Acquire the HW semaphore during reset.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_hw_semaphore_82573(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 extcnf_ctrl;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 i = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_hw_semaphore_82573");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi do {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msec_delay(2);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi i++;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } while (i < MDIO_OWNERSHIP_TIMEOUT);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (i == MDIO_OWNERSHIP_TIMEOUT) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Release semaphores */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_put_hw_semaphore_82573(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Driver can't access the PHY\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_put_hw_semaphore_82573 - Release hardware semaphore
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Release hardware semaphore used during reset.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_put_hw_semaphore_82573(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 extcnf_ctrl;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_put_hw_semaphore_82573");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi extcnf_ctrl &= ~E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_hw_semaphore_82574 - Acquire hardware semaphore
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Acquire the HW semaphore to access the PHY or NVM.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_hw_semaphore_82574");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_MUTEX_LOCK(&hw->dev_spec._82571.swflag_mutex);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_get_hw_semaphore_82573(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_MUTEX_UNLOCK(&hw->dev_spec._82571.swflag_mutex);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_put_hw_semaphore_82574 - Release hardware semaphore
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Release hardware semaphore used to access the PHY or NVM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_put_hw_semaphore_82574(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_put_hw_semaphore_82574");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_put_hw_semaphore_82573(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_MUTEX_UNLOCK(&hw->dev_spec._82571.swflag_mutex);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_set_d0_lplu_state_82574 - Set Low Power Linkup D0 state
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @active: TRUE to enable LPLU, FALSE to disable
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Sets the LPLU D0 state according to the active flag.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * LPLU will not be activated unless the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * device autonegotiation advertisement meets standards of
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * either 10 or 10/100 or 10/100/1000 at all duplexes.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * This is a function pointer entry point only called by
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * PHY setup routines.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 data = E1000_READ_REG(hw, E1000_POEMB);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_set_d0_lplu_state_82574");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (active)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data |= E1000_PHY_CTRL_D0A_LPLU;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi else
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data &= ~E1000_PHY_CTRL_D0A_LPLU;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_POEMB, data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_set_d3_lplu_state_82574 - Sets low power link up state for D3
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @active: boolean used to enable/disable lplu
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * The low power link up (lplu) state is set to the power management level D3
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * when active is TRUE, else clear lplu for D3. LPLU
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * is used during Dx states where the power conservation is most important.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * During driver activity, SmartSpeed should be enabled so performance is
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * maintained.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 data = E1000_READ_REG(hw, E1000_POEMB);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_set_d3_lplu_state_82574");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!active) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data &= ~E1000_PHY_CTRL_NOND0A_LPLU;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else if ((hw->phy.autoneg_advertised == E1000_ALL_SPEED_DUPLEX) ||
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (hw->phy.autoneg_advertised == E1000_ALL_NOT_GIG) ||
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (hw->phy.autoneg_advertised == E1000_ALL_10_SPEED)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data |= E1000_PHY_CTRL_NOND0A_LPLU;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_POEMB, data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_acquire_nvm_82571 - Request for access to the EEPROM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * To gain access to the EEPROM, first we must obtain a hardware semaphore.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Then for non-82573 hardware, set the EEPROM access request bit and wait
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * for EEPROM access grant bit. If the access grant bit is not set, release
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * hardware semaphore.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_acquire_nvm_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_acquire_nvm_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_get_hw_semaphore_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_acquire_nvm_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_put_hw_semaphore_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_release_nvm_82571 - Release exclusive access to EEPROM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Stop any current commands to the EEPROM and clear the EEPROM request bit.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_release_nvm_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_release_nvm_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_release_nvm_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_put_hw_semaphore_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_write_nvm_82571 - Write to EEPROM using appropriate interface
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @offset: offset within the EEPROM to be written to
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @words: number of words to write
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @data: 16 bit word(s) to be written to the EEPROM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * For non-82573 silicon, write data to EEPROM at offset using SPI interface.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * If e1000_update_nvm_checksum is not called after this function, the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * EEPROM will most likely contain an invalid checksum.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_write_nvm_82571(struct e1000_hw *hw, u16 offset, u16 words,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 *data)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_write_nvm_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_write_nvm_eewr_82571(hw, offset, words, data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_write_nvm_spi(hw, offset, words, data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_NVM;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_update_nvm_checksum_82571 - Update EEPROM checksum
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Updates the EEPROM checksum by reading/adding each word of the EEPROM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * up to the checksum. Then calculates the EEPROM checksum and writes the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * value to the EEPROM.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 eecd;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 i;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_update_nvm_checksum_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_update_nvm_checksum_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If our nvm is an EEPROM, then we're done
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * otherwise, commit the checksum to the flash NVM.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->nvm.type != e1000_nvm_flash_hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Check for pending operations. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < E1000_FLASH_UPDATES; i++) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msec_delay(1);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_FLUPD))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (i == E1000_FLASH_UPDATES)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_NVM;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Reset the firmware if using STM opcode. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if ((E1000_READ_REG(hw, E1000_FLOP) & 0xFF00) == E1000_STM_OPCODE) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* The enabling of and the actual reset must be done
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * in two write cycles.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_HICR, E1000_HICR_FW_RESET_ENABLE);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_FLUSH(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_HICR, E1000_HICR_FW_RESET);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Commit the write to flash */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi eecd = E1000_READ_REG(hw, E1000_EECD) | E1000_EECD_FLUPD;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_EECD, eecd);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < E1000_FLASH_UPDATES; i++) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msec_delay(1);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_FLUPD))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (i == E1000_FLASH_UPDATES)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_NVM;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_validate_nvm_checksum_82571 - Validate EEPROM checksum
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Calculates the EEPROM checksum by reading/adding each word of the EEPROM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * and then verifies that the sum of the EEPROM is equal to 0xBABA.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_validate_nvm_checksum_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_validate_nvm_checksum_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->nvm.type == e1000_nvm_flash_hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_fix_nvm_checksum_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return e1000_validate_nvm_checksum_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_write_nvm_eewr_82571 - Write to EEPROM for 82573 silicon
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @offset: offset within the EEPROM to be written to
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @words: number of words to write
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @data: 16 bit word(s) to be written to the EEPROM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * After checking for invalid values, poll the EEPROM to ensure the previous
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * command has completed before trying to write the next word. After write
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * poll for completion.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * If e1000_update_nvm_checksum is not called after this function, the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * EEPROM will most likely contain an invalid checksum.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 words, u16 *data)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_nvm_info *nvm = &hw->nvm;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 i, eewr = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val = E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_write_nvm_eewr_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* A check for invalid values: offset too large, too many words,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * and not enough words.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if ((offset >= nvm->word_size) || (words > (nvm->word_size - offset)) ||
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (words == 0)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("nvm parameter(s) out of bounds\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_NVM;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < words; i++) {
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi eewr = ((data[i] << E1000_NVM_RW_REG_DATA) |
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi ((offset + i) << E1000_NVM_RW_ADDR_SHIFT) |
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi E1000_NVM_RW_REG_START);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_poll_eerd_eewr_done(hw, E1000_NVM_POLL_WRITE);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_EEWR, eewr);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_poll_eerd_eewr_done(hw, E1000_NVM_POLL_WRITE);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_cfg_done_82571 - Poll for configuration done
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Reads the management control register for the config done bit to be set.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_cfg_done_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 timeout = PHY_CFG_TIMEOUT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_cfg_done_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi while (timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (E1000_READ_REG(hw, E1000_EEMNGCTL) &
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_NVM_CFG_DONE_PORT_0)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msec_delay(1);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi timeout--;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("MNG configuration cycle has not completed.\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_RESET;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_set_d0_lplu_state_82571 - Set Low Power Linkup D0 state
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @active: TRUE to enable LPLU, FALSE to disable
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Sets the LPLU D0 state according to the active flag. When activating LPLU
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * this function also disables smart speed and vice versa. LPLU will not be
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * activated unless the device autonegotiation advertisement meets standards
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * of either 10 or 10/100 or 10/100/1000 at all duplexes. This is a function
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * pointer entry point only called by PHY setup routines.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, bool active)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_phy_info *phy = &hw->phy;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 data;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_set_d0_lplu_state_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(phy->ops.read_reg))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.read_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (active) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data |= IGP02E1000_PM_D0_LPLU;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* When LPLU is enabled, we should disable SmartSpeed */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi &data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data &= ~IGP01E1000_PSCFR_SMART_SPEED;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data &= ~IGP02E1000_PM_D0_LPLU;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* LPLU and SmartSpeed are mutually exclusive. LPLU is used
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * during Dx states where the power conservation is most
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * important. During driver activity we should enable
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * SmartSpeed, so performance is maintained.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (phy->smart_speed == e1000_smart_speed_on) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.read_reg(hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi IGP01E1000_PHY_PORT_CONFIG,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi &data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data |= IGP01E1000_PSCFR_SMART_SPEED;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.write_reg(hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi IGP01E1000_PHY_PORT_CONFIG,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else if (phy->smart_speed == e1000_smart_speed_off) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.read_reg(hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi IGP01E1000_PHY_PORT_CONFIG,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi &data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data &= ~IGP01E1000_PSCFR_SMART_SPEED;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = phy->ops.write_reg(hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi IGP01E1000_PHY_PORT_CONFIG,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_reset_hw_82571 - Reset hardware
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * This resets the hardware into a known state.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_reset_hw_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 ctrl, ctrl_ext, eecd, tctl;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_reset_hw_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Prevent the PCI-E bus from sticking if there is no TLP connection
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * on the last TLP read/write transaction when MAC is reset.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_disable_pcie_master_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("PCI-E Master disable polling has failed.\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Masking off all interrupts\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_RCTL, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi tctl = E1000_READ_REG(hw, E1000_TCTL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi tctl &= ~E1000_TCTL_EN;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TCTL, tctl);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_FLUSH(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msec_delay(10);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Must acquire the MDIO ownership before MAC reset.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Ownership defaults to firmware after a reset.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_get_hw_semaphore_82573(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_get_hw_semaphore_82574(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Issuing a global reset to MAC\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Must release MDIO ownership and mutex after MAC reset. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi case e1000_82573:
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi /* Release mutex only if the hw semaphore is acquired */
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi if (!ret_val)
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi e1000_put_hw_semaphore_82573(hw);
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi /* Release mutex only if the hw semaphore is acquired */
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi if (!ret_val)
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi e1000_put_hw_semaphore_82574(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->nvm.type == e1000_nvm_flash_hw) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi usec_delay(10);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl_ext |= E1000_CTRL_EXT_EE_RST;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_FLUSH(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_get_auto_rd_done_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* We don't want to continue accessing MAC registers. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Phy configuration from NVM just starts after EECD_AUTO_RD is set.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Need to wait for Phy configuration completion before accessing
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * NVM and Phy.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* REQ and GNT bits need to be cleared when using AUTO_RD
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * to access the EEPROM.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi eecd = E1000_READ_REG(hw, E1000_EECD);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi eecd &= ~(E1000_EECD_REQ | E1000_EECD_GNT);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_EECD, eecd);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msec_delay(25);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Clear any pending interrupt events. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICR);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->mac.type == e1000_82571) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Install any alternate MAC address into RAR0 */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_check_alt_mac_addr_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_set_laa_state_82571(hw, TRUE);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Reinitialize the 82571 serdes link state machine */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->phy.media_type == e1000_media_type_internal_serdes)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->mac.serdes_link_state = e1000_serdes_link_down;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_hw_82571 - Initialize hardware
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * This inits the hardware readying it for operation.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_hw_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mac_info *mac = &hw->mac;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 reg_data;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 i, rar_count = mac->rar_entry_count;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_hw_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_initialize_hw_bits_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Initialize identification LED */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = mac->ops.id_led_init(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* An error is not fatal and we should not stop init due to this */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Error initializing identification LED\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Disabling VLAN filtering */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Initializing the IEEE VLAN\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.clear_vfta(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Setup the receive address.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * If, however, a locally administered address was assigned to the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 82571, we must reserve a RAR for it to work around an issue where
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * resetting one port will reload the MAC on the other port.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (e1000_get_laa_state_82571(hw))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi rar_count--;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_init_rx_addrs_generic(hw, rar_count);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Zero out the Multicast HASH table */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Zeroing the MTA\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < mac->mta_reg_count; i++)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Setup link and flow control */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = mac->ops.setup_link(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Set the transmit descriptor write-back policy */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg_data = E1000_READ_REG(hw, E1000_TXDCTL(0));
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi reg_data = ((reg_data & ~E1000_TXDCTL_WTHRESH) |
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(0), reg_data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* ...for both queues. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (mac->type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_enable_tx_pkt_filtering_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* fall through */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg_data = E1000_READ_REG(hw, E1000_GCR);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_GCR, reg_data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg_data = E1000_READ_REG(hw, E1000_TXDCTL(1));
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi reg_data = ((reg_data & ~E1000_TXDCTL_WTHRESH) |
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi E1000_TXDCTL_FULL_TX_DESC_WB |
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi E1000_TXDCTL_COUNT_DESC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(1), reg_data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Clear all of the statistics registers (clear on read). It is
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * important that we do this after we have tried to establish link
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * because the symbol error count will increment wildly if there
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * is no link.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_clear_hw_cntrs_82571(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_initialize_hw_bits_82571 - Initialize hardware-dependent bits
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Initializes required hardware-dependent bits needed for normal operation.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_initialize_hw_bits_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 reg;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_initialize_hw_bits_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Transmit Descriptor Control 0 */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_TXDCTL(0));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 22);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(0), reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Transmit Descriptor Control 1 */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_TXDCTL(1));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 22);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXDCTL(1), reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Transmit Arbitration Control 0 */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_TARC(0));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg &= ~(0xF << 27); /* 30:27 */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 23) | (1 << 24) | (1 << 25) | (1 << 26);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 26);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TARC(0), reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Transmit Arbitration Control 1 */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_TARC(1));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg &= ~((1 << 29) | (1 << 30));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 22) | (1 << 24) | (1 << 25) | (1 << 26);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (E1000_READ_REG(hw, E1000_TCTL) & E1000_TCTL_MULR)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg &= ~(1 << 28);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi else
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 28);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TARC(1), reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Device Control */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg &= ~(1 << 29);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Extended Device Control */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg &= ~(1 << 23);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 22);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->mac.type == e1000_82571) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_PBA_ECC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= E1000_PBA_ECC_CORR_EN;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_PBA_ECC, reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Workaround for hardware errata.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Ensure that DMA Dynamic Clock gating is disabled on 82571 and 82572
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if ((hw->mac.type == e1000_82571) ||
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (hw->mac.type == e1000_82572)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg &= ~E1000_CTRL_EXT_DMA_DYN_CLK_EN;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Disable IPv6 extension header parsing because some malformed
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * IPv6 headers can hang the Rx.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->mac.type <= e1000_82573) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_RFCTL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (E1000_RFCTL_IPV6_EX_DIS | E1000_RFCTL_NEW_IPV6_EXT_DIS);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_RFCTL, reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* PCI-Ex Control Registers */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_GCR);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= (1 << 22);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_GCR, reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Workaround for hardware errata.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * apply workaround for hardware errata documented in errata
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * docs Fixes issue where some error prone or unreliable PCIe
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * completions are occurring, particularly with ASPM enabled.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Without fix, issue can cause Tx timeouts.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg = E1000_READ_REG(hw, E1000_GCR2);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi reg |= 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_GCR2, reg);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_clear_vfta_82571 - Clear VLAN filter table
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Clears the register array which contains the VLAN filter table by
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * setting all the values to 0.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_clear_vfta_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 offset;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 vfta_value = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 vfta_offset = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 vfta_bit_in_reg = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_clear_vfta_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->mng_cookie.vlan_id != 0) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* The VFTA is a 4096b bit-field, each identifying
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * a single VLAN ID. The following operations
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * determine which 32b entry (i.e. offset) into the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * array we want to set the VLAN ID (i.e. bit) of
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the manageability unit.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi vfta_offset = (hw->mng_cookie.vlan_id >>
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_VFTA_ENTRY_SHIFT) &
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_VFTA_ENTRY_MASK;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi vfta_bit_in_reg =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi 1 << (hw->mng_cookie.vlan_id &
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_VFTA_ENTRY_BIT_SHIFT_MASK);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If the offset we want to clear is the same offset of the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * manageability VLAN ID, then clear all bits except that of
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the manageability unit.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, vfta_value);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_FLUSH(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_check_mng_mode_82574 - Check manageability is enabled
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Reads the NVM Initialization Control Word 2 and returns TRUE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * (>0) if any manageability is enabled, else FALSE (0).
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic bool e1000_check_mng_mode_82574(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 data;
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_check_mng_mode_82574");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &data);
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi if (ret_val)
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi return FALSE;
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return (data & E1000_NVM_INIT_CTRL2_MNGM) != 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_led_on_82574 - Turn LED on
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Turn LED on.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_led_on_82574(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 ctrl;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 i;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_led_on_82574");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl = hw->mac.ledctl_mode2;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(E1000_STATUS_LU & E1000_READ_REG(hw, E1000_STATUS))) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If no link, then turn LED on by setting the invert bit
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * for each LED that's "on" (0x0E) in ledctl_mode2.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < 4; i++)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) ==
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_LEDCTL_MODE_LED_ON)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl |= (E1000_LEDCTL_LED0_IVRT << (i * 8));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, ctrl);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_check_phy_82574 - check 82574 phy hung state
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Returns whether phy is hung or not
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchibool e1000_check_phy_82574(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 status_1kbt = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 receive_errors = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_check_phy_82574");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Read PHY Receive Error counter first, if its is max - all F's then
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * read the Base1000T status register If both are max then PHY is hung.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = hw->phy.ops.read_reg(hw, E1000_RECEIVE_ERROR_COUNTER,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi &receive_errors);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (receive_errors == E1000_RECEIVE_ERROR_MAX) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = hw->phy.ops.read_reg(hw, E1000_BASE1000T_STATUS,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi &status_1kbt);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if ((status_1kbt & E1000_IDLE_ERROR_COUNT_MASK) ==
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_IDLE_ERROR_COUNT_MASK)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_setup_link_82571 - Setup flow control and link settings
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Determines which flow control settings to use, then configures flow
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * control. Calls the appropriate media-specific link configuration
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * function. Assuming the adapter has a valid link partner, a valid link
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * should be established. Assumes the hardware has previously been reset
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * and the transmitter and receiver are not enabled.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_setup_link_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_setup_link_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* 82573 does not have a word in the NVM to determine
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the default flow control setting, so we explicitly
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * set it to full.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->fc.requested_mode == e1000_fc_default)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->fc.requested_mode = e1000_fc_full;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return e1000_setup_link_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_setup_copper_link_82571 - Configure copper link settings
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Configures the link for auto-neg or forced speed and duplex. Then we check
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * for link, once link is established calls to configure collision distance
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * and flow control are called.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_setup_copper_link_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 ctrl;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_setup_copper_link_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl |= E1000_CTRL_SLU;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->phy.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_phy_m88:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_phy_bm:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_copper_link_setup_m88(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_phy_igp_2:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_copper_link_setup_igp(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return e1000_setup_copper_link_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_setup_fiber_serdes_link_82571 - Setup link for fiber/serdes
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Configures collision distance and flow control for fiber and serdes links.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Upon successful setup, poll for link.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_setup_fiber_serdes_link_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82571:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82572:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If SerDes loopback mode is entered, there is no form
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * of reset to take the adapter out of that mode. So we
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * have to explicitly take the adapter out of loopback
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * mode. This prevents drivers from twiddling their thumbs
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * if another tool failed to take it out of loopback mode.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_SCTL,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_SCTL_DISABLE_SERDES_LOOPBACK);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return e1000_setup_fiber_serdes_link_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_check_for_serdes_link_82571 - Check for link (Serdes)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Reports the link state as up or down.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * If autonegotiation is supported by the link partner, the link state is
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * determined by the result of autonegotiation. This is the most likely case.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * If autonegotiation is not supported by the link partner, and the link
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * has a valid signal, force the link up.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * The link state is represented internally here by 4 states:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 1) down
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 2) autoneg_progress
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 3) autoneg_complete (the link successfully autonegotiated)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 4) forced_up (the link has been forced up, it did not autonegotiate)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mac_info *mac = &hw->mac;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 rxcw;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 ctrl;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 status;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 txcw;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 i;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val = E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_check_for_serdes_link_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_RXCW);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* SYNCH bit and IV bit are sticky */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi usec_delay(10);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if ((rxcw & E1000_RXCW_SYNCH) && !(rxcw & E1000_RXCW_IV)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Receiver is synchronized with no invalid bits. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (mac->serdes_link_state) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_serdes_link_autoneg_complete:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(status & E1000_STATUS_LU)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* We have lost link, retry autoneg before
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * reporting link failure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_autoneg_progress;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("AN_UP -> AN_PROG\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_serdes_link_forced_up:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If we are receiving /C/ ordered sets, re-enable
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * auto-negotiation in the TXCW register and disable
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * forced link in the Device Control register in an
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * attempt to auto-negotiate with our link partner.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (rxcw & E1000_RXCW_C) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Enable autoneg, and unforce link up */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (ctrl & ~E1000_CTRL_SLU));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_autoneg_progress;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("FORCED_UP -> AN_PROG\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_serdes_link_autoneg_progress:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (rxcw & E1000_RXCW_C) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* We received /C/ ordered sets, meaning the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * link partner has autonegotiated, and we can
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * trust the Link Up (LU) status bit.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (status & E1000_STATUS_LU) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_autoneg_complete;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("AN_PROG -> AN_UP\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Autoneg completed, but failed. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_down;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("AN_PROG -> DOWN\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* The link partner did not autoneg.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Force link up and full duplex, and change
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * state to forced.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (mac->txcw & ~E1000_TXCW_ANE));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Configure Flow Control after link up. */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_config_fc_after_link_up_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Error config flow control\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_forced_up;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("AN_PROG -> FORCED_UP\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_serdes_link_down:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* The link was down but the receiver has now gained
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * valid sync, so lets see if we can bring the link
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * up.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, (ctrl &
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ~E1000_CTRL_SLU));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_autoneg_progress;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("DOWN -> AN_PROG\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(rxcw & E1000_RXCW_SYNCH)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state = e1000_serdes_link_down;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("ANYSTATE -> DOWN\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Check several times, if SYNCH bit and CONFIG
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * bit both are consistently 1 then simply ignore
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the IV bit and restart Autoneg
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < AN_RETRY_COUNT; i++) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi usec_delay(10);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if ((rxcw & E1000_RXCW_SYNCH) &&
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (rxcw & E1000_RXCW_C))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi continue;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (rxcw & E1000_RXCW_IV) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_down;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("ANYSTATE -> DOWN\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (i == AN_RETRY_COUNT) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi txcw = E1000_READ_REG(hw, E1000_TXCW);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi txcw |= E1000_TXCW_ANE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, txcw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_link_state =
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_serdes_link_autoneg_progress;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->serdes_has_link = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("ANYSTATE -> AN_PROG\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_valid_led_default_82571 - Verify a valid default LED config
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @data: pointer to the NVM (EEPROM)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Read the EEPROM for the current default LED configuration. If the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * LED configuration is not valid, set to a valid LED configuration.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_valid_led_default_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("NVM Read Error\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (hw->mac.type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82573:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82574:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_82583:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (*data == ID_LED_RESERVED_F746)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *data = ID_LED_DEFAULT_82573;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (*data == ID_LED_RESERVED_0000 ||
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *data == ID_LED_RESERVED_FFFF)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *data = ID_LED_DEFAULT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_laa_state_82571 - Get locally administered address state
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Retrieve and return the current locally administered address state.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchibool e1000_get_laa_state_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_laa_state_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->mac.type != e1000_82571)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return hw->dev_spec._82571.laa_is_present;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_set_laa_state_82571 - Set locally administered address state
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @state: enable/disable locally administered address
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Enable/Disable the current locally administered address state.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchivoid e1000_set_laa_state_82571(struct e1000_hw *hw, bool state)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_set_laa_state_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->mac.type != e1000_82571)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->dev_spec._82571.laa_is_present = state;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If workaround is activated... */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (state)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Hold a copy of the LAA in RAR[14] This is done so that
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * between the time RAR[0] gets clobbered and the time it
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * gets fixed, the actual LAA is in one of the RARs and no
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * incoming packets directed to this port are dropped.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Eventually the LAA will be in RAR[0] and RAR[14].
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->mac.ops.rar_set(hw, hw->mac.addr,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->mac.rar_entry_count - 1);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_fix_nvm_checksum_82571 - Fix EEPROM checksum
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Verifies that the EEPROM has completed the update. After updating the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * EEPROM, we need to check bit 15 in work 0x23 for the checksum fix. If
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the checksum fix is not implemented, we need to set the bit and update
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the checksum. Otherwise, if bit 15 is set and the checksum is incorrect,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * we need to return bad checksum.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_nvm_info *nvm = &hw->nvm;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 data;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_fix_nvm_checksum_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (nvm->type != e1000_nvm_flash_hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Check bit 4 of word 10h. If it is 0, firmware is done updating
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 10h-12h. Checksum may need to be fixed.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = nvm->ops.read(hw, 0x10, 1, &data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(data & 0x10)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Read 0x23 and check bit 15. This bit is a 1
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * when the checksum has already been fixed. If
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the checksum is still wrong and this bit is a
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 1, we need to return bad checksum. Otherwise,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * we need to set this bit to a 1 and update the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * checksum.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = nvm->ops.read(hw, 0x23, 1, &data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(data & 0x8000)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi data |= 0x8000;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = nvm->ops.write(hw, 0x23, 1, &data);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = nvm->ops.update(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_read_mac_addr_82571 - Read device MAC address
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_read_mac_addr_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_read_mac_addr_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (hw->mac.type == e1000_82571) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If there's an alternate MAC address place it in RAR0
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * so that it will override the Si installed default perm
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * address.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = e1000_check_alt_mac_addr_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return e1000_read_mac_addr_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_power_down_phy_copper_82571 - Remove link during PHY power down
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * In the case of a PHY power down to save power, or to turn off link during a
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * driver unload, or wake on lan is not enabled, remove the link.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_power_down_phy_copper_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_phy_info *phy = &hw->phy;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mac_info *mac = &hw->mac;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!phy->ops.check_reset_block)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If the management interface is not enabled, then power down */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(mac->ops.check_mng_mode(hw) || phy->ops.check_reset_block(hw)))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_power_down_phy_copper(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_clear_hw_cntrs_82571 - Clear device specific hardware counters
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Clears the hardware counters by reading the counter registers.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_clear_hw_cntrs_82571");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_clear_hw_cntrs_base_generic(hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PRC64);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PRC127);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PRC255);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PRC511);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PRC1023);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PRC1522);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PTC64);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PTC127);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PTC255);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PTC511);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PTC1023);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_PTC1522);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ALGNERRC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_RXERRC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_TNCRS);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_CEXTERR);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_TSCTC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_TSCTFC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_MGTPRC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_MGTPDC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_MGTPTC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_IAC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICRXOC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICRXPTC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICRXATC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICTXPTC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICTXATC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICTXQEC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICTXQMTC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_READ_REG(hw, E1000_ICRXDMTC);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}