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