xref: /dragonfly/sys/dev/netif/ig_hal/e1000_82540.c (revision 01a55482)
19c80d176SSepherosa Ziehau /******************************************************************************
29c80d176SSepherosa Ziehau 
3*01a55482SSepherosa Ziehau   Copyright (c) 2001-2019, Intel Corporation
49c80d176SSepherosa Ziehau   All rights reserved.
59c80d176SSepherosa Ziehau 
69c80d176SSepherosa Ziehau   Redistribution and use in source and binary forms, with or without
79c80d176SSepherosa Ziehau   modification, are permitted provided that the following conditions are met:
89c80d176SSepherosa Ziehau 
99c80d176SSepherosa Ziehau    1. Redistributions of source code must retain the above copyright notice,
109c80d176SSepherosa Ziehau       this list of conditions and the following disclaimer.
119c80d176SSepherosa Ziehau 
129c80d176SSepherosa Ziehau    2. Redistributions in binary form must reproduce the above copyright
139c80d176SSepherosa Ziehau       notice, this list of conditions and the following disclaimer in the
149c80d176SSepherosa Ziehau       documentation and/or other materials provided with the distribution.
159c80d176SSepherosa Ziehau 
169c80d176SSepherosa Ziehau    3. Neither the name of the Intel Corporation nor the names of its
179c80d176SSepherosa Ziehau       contributors may be used to endorse or promote products derived from
189c80d176SSepherosa Ziehau       this software without specific prior written permission.
199c80d176SSepherosa Ziehau 
209c80d176SSepherosa Ziehau   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
219c80d176SSepherosa Ziehau   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
229c80d176SSepherosa Ziehau   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
239c80d176SSepherosa Ziehau   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
249c80d176SSepherosa Ziehau   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
259c80d176SSepherosa Ziehau   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
269c80d176SSepherosa Ziehau   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
279c80d176SSepherosa Ziehau   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
289c80d176SSepherosa Ziehau   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
299c80d176SSepherosa Ziehau   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
309c80d176SSepherosa Ziehau   POSSIBILITY OF SUCH DAMAGE.
319c80d176SSepherosa Ziehau 
329c80d176SSepherosa Ziehau ******************************************************************************/
3374dc3754SSepherosa Ziehau /*$FreeBSD$*/
349c80d176SSepherosa Ziehau 
359c80d176SSepherosa Ziehau /*
369c80d176SSepherosa Ziehau  * 82540EM Gigabit Ethernet Controller
379c80d176SSepherosa Ziehau  * 82540EP Gigabit Ethernet Controller
389c80d176SSepherosa Ziehau  * 82545EM Gigabit Ethernet Controller (Copper)
399c80d176SSepherosa Ziehau  * 82545EM Gigabit Ethernet Controller (Fiber)
409c80d176SSepherosa Ziehau  * 82545GM Gigabit Ethernet Controller
419c80d176SSepherosa Ziehau  * 82546EB Gigabit Ethernet Controller (Copper)
429c80d176SSepherosa Ziehau  * 82546EB Gigabit Ethernet Controller (Fiber)
439c80d176SSepherosa Ziehau  * 82546GB Gigabit Ethernet Controller
449c80d176SSepherosa Ziehau  */
459c80d176SSepherosa Ziehau 
469c80d176SSepherosa Ziehau #include "e1000_api.h"
479c80d176SSepherosa Ziehau 
489c80d176SSepherosa Ziehau static s32  e1000_init_phy_params_82540(struct e1000_hw *hw);
499c80d176SSepherosa Ziehau static s32  e1000_init_nvm_params_82540(struct e1000_hw *hw);
509c80d176SSepherosa Ziehau static s32  e1000_init_mac_params_82540(struct e1000_hw *hw);
519c80d176SSepherosa Ziehau static s32  e1000_adjust_serdes_amplitude_82540(struct e1000_hw *hw);
529c80d176SSepherosa Ziehau static void e1000_clear_hw_cntrs_82540(struct e1000_hw *hw);
539c80d176SSepherosa Ziehau static s32  e1000_init_hw_82540(struct e1000_hw *hw);
549c80d176SSepherosa Ziehau static s32  e1000_reset_hw_82540(struct e1000_hw *hw);
559c80d176SSepherosa Ziehau static s32  e1000_set_phy_mode_82540(struct e1000_hw *hw);
569c80d176SSepherosa Ziehau static s32  e1000_set_vco_speed_82540(struct e1000_hw *hw);
579c80d176SSepherosa Ziehau static s32  e1000_setup_copper_link_82540(struct e1000_hw *hw);
589c80d176SSepherosa Ziehau static s32  e1000_setup_fiber_serdes_link_82540(struct e1000_hw *hw);
599c80d176SSepherosa Ziehau static void e1000_power_down_phy_copper_82540(struct e1000_hw *hw);
606a5a645eSSepherosa Ziehau static s32  e1000_read_mac_addr_82540(struct e1000_hw *hw);
619c80d176SSepherosa Ziehau 
629c80d176SSepherosa Ziehau /**
639c80d176SSepherosa Ziehau  * e1000_init_phy_params_82540 - Init PHY func ptrs.
649c80d176SSepherosa Ziehau  * @hw: pointer to the HW structure
659c80d176SSepherosa Ziehau  **/
e1000_init_phy_params_82540(struct e1000_hw * hw)669c80d176SSepherosa Ziehau static s32 e1000_init_phy_params_82540(struct e1000_hw *hw)
679c80d176SSepherosa Ziehau {
689c80d176SSepherosa Ziehau 	struct e1000_phy_info *phy = &hw->phy;
694765c386SMichael Neumann 	s32 ret_val;
709c80d176SSepherosa Ziehau 
719c80d176SSepherosa Ziehau 	phy->addr		= 1;
729c80d176SSepherosa Ziehau 	phy->autoneg_mask	= AUTONEG_ADVERTISE_SPEED_DEFAULT;
739c80d176SSepherosa Ziehau 	phy->reset_delay_us	= 10000;
749c80d176SSepherosa Ziehau 	phy->type		= e1000_phy_m88;
759c80d176SSepherosa Ziehau 
769c80d176SSepherosa Ziehau 	/* Function Pointers */
779c80d176SSepherosa Ziehau 	phy->ops.check_polarity	= e1000_check_polarity_m88;
789c80d176SSepherosa Ziehau 	phy->ops.commit		= e1000_phy_sw_reset_generic;
799c80d176SSepherosa Ziehau 	phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88;
809c80d176SSepherosa Ziehau 	phy->ops.get_cable_length = e1000_get_cable_length_m88;
819c80d176SSepherosa Ziehau 	phy->ops.get_cfg_done	= e1000_get_cfg_done_generic;
829c80d176SSepherosa Ziehau 	phy->ops.read_reg	= e1000_read_phy_reg_m88;
839c80d176SSepherosa Ziehau 	phy->ops.reset		= e1000_phy_hw_reset_generic;
849c80d176SSepherosa Ziehau 	phy->ops.write_reg	= e1000_write_phy_reg_m88;
859c80d176SSepherosa Ziehau 	phy->ops.get_info	= e1000_get_phy_info_m88;
869c80d176SSepherosa Ziehau 	phy->ops.power_up	= e1000_power_up_phy_copper;
879c80d176SSepherosa Ziehau 	phy->ops.power_down	= e1000_power_down_phy_copper_82540;
889c80d176SSepherosa Ziehau 
899c80d176SSepherosa Ziehau 	ret_val = e1000_get_phy_id(hw);
909c80d176SSepherosa Ziehau 	if (ret_val)
919c80d176SSepherosa Ziehau 		goto out;
929c80d176SSepherosa Ziehau 
939c80d176SSepherosa Ziehau 	/* Verify phy id */
949c80d176SSepherosa Ziehau 	switch (hw->mac.type) {
959c80d176SSepherosa Ziehau 	case e1000_82540:
969c80d176SSepherosa Ziehau 	case e1000_82545:
979c80d176SSepherosa Ziehau 	case e1000_82545_rev_3:
989c80d176SSepherosa Ziehau 	case e1000_82546:
999c80d176SSepherosa Ziehau 	case e1000_82546_rev_3:
1009c80d176SSepherosa Ziehau 		if (phy->id == M88E1011_I_PHY_ID)
1019c80d176SSepherosa Ziehau 			break;
1029c80d176SSepherosa Ziehau 		/* Fall Through */
1039c80d176SSepherosa Ziehau 	default:
1049c80d176SSepherosa Ziehau 		ret_val = -E1000_ERR_PHY;
1059c80d176SSepherosa Ziehau 		goto out;
1069c80d176SSepherosa Ziehau 		break;
1079c80d176SSepherosa Ziehau 	}
1089c80d176SSepherosa Ziehau 
1099c80d176SSepherosa Ziehau out:
1109c80d176SSepherosa Ziehau 	return ret_val;
1119c80d176SSepherosa Ziehau }
1129c80d176SSepherosa Ziehau 
1139c80d176SSepherosa Ziehau /**
1149c80d176SSepherosa Ziehau  * e1000_init_nvm_params_82540 - Init NVM func ptrs.
1159c80d176SSepherosa Ziehau  * @hw: pointer to the HW structure
1169c80d176SSepherosa Ziehau  **/
e1000_init_nvm_params_82540(struct e1000_hw * hw)1179c80d176SSepherosa Ziehau static s32 e1000_init_nvm_params_82540(struct e1000_hw *hw)
1189c80d176SSepherosa Ziehau {
1199c80d176SSepherosa Ziehau 	struct e1000_nvm_info *nvm = &hw->nvm;
1209c80d176SSepherosa Ziehau 	u32 eecd = E1000_READ_REG(hw, E1000_EECD);
1219c80d176SSepherosa Ziehau 
1229c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_init_nvm_params_82540");
1239c80d176SSepherosa Ziehau 
1249c80d176SSepherosa Ziehau 	nvm->type = e1000_nvm_eeprom_microwire;
1259c80d176SSepherosa Ziehau 	nvm->delay_usec = 50;
1269c80d176SSepherosa Ziehau 	nvm->opcode_bits = 3;
1279c80d176SSepherosa Ziehau 	switch (nvm->override) {
1289c80d176SSepherosa Ziehau 	case e1000_nvm_override_microwire_large:
1299c80d176SSepherosa Ziehau 		nvm->address_bits = 8;
1309c80d176SSepherosa Ziehau 		nvm->word_size = 256;
1319c80d176SSepherosa Ziehau 		break;
1329c80d176SSepherosa Ziehau 	case e1000_nvm_override_microwire_small:
1339c80d176SSepherosa Ziehau 		nvm->address_bits = 6;
1349c80d176SSepherosa Ziehau 		nvm->word_size = 64;
1359c80d176SSepherosa Ziehau 		break;
1369c80d176SSepherosa Ziehau 	default:
1379c80d176SSepherosa Ziehau 		nvm->address_bits = eecd & E1000_EECD_SIZE ? 8 : 6;
1389c80d176SSepherosa Ziehau 		nvm->word_size = eecd & E1000_EECD_SIZE ? 256 : 64;
1399c80d176SSepherosa Ziehau 		break;
1409c80d176SSepherosa Ziehau 	}
1419c80d176SSepherosa Ziehau 
1429c80d176SSepherosa Ziehau 	/* Function Pointers */
1439c80d176SSepherosa Ziehau 	nvm->ops.acquire	= e1000_acquire_nvm_generic;
1449c80d176SSepherosa Ziehau 	nvm->ops.read		= e1000_read_nvm_microwire;
1459c80d176SSepherosa Ziehau 	nvm->ops.release	= e1000_release_nvm_generic;
1469c80d176SSepherosa Ziehau 	nvm->ops.update		= e1000_update_nvm_checksum_generic;
1479c80d176SSepherosa Ziehau 	nvm->ops.valid_led_default = e1000_valid_led_default_generic;
1489c80d176SSepherosa Ziehau 	nvm->ops.validate	= e1000_validate_nvm_checksum_generic;
1499c80d176SSepherosa Ziehau 	nvm->ops.write		= e1000_write_nvm_microwire;
1509c80d176SSepherosa Ziehau 
1519c80d176SSepherosa Ziehau 	return E1000_SUCCESS;
1529c80d176SSepherosa Ziehau }
1539c80d176SSepherosa Ziehau 
1549c80d176SSepherosa Ziehau /**
1559c80d176SSepherosa Ziehau  * e1000_init_mac_params_82540 - Init MAC func ptrs.
1569c80d176SSepherosa Ziehau  * @hw: pointer to the HW structure
1579c80d176SSepherosa Ziehau  **/
e1000_init_mac_params_82540(struct e1000_hw * hw)1589c80d176SSepherosa Ziehau static s32 e1000_init_mac_params_82540(struct e1000_hw *hw)
1599c80d176SSepherosa Ziehau {
1609c80d176SSepherosa Ziehau 	struct e1000_mac_info *mac = &hw->mac;
1619c80d176SSepherosa Ziehau 	s32 ret_val = E1000_SUCCESS;
1629c80d176SSepherosa Ziehau 
1639c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_init_mac_params_82540");
1649c80d176SSepherosa Ziehau 
1659c80d176SSepherosa Ziehau 	/* Set media type */
1669c80d176SSepherosa Ziehau 	switch (hw->device_id) {
1679c80d176SSepherosa Ziehau 	case E1000_DEV_ID_82545EM_FIBER:
1689c80d176SSepherosa Ziehau 	case E1000_DEV_ID_82545GM_FIBER:
1699c80d176SSepherosa Ziehau 	case E1000_DEV_ID_82546EB_FIBER:
1709c80d176SSepherosa Ziehau 	case E1000_DEV_ID_82546GB_FIBER:
1719c80d176SSepherosa Ziehau 		hw->phy.media_type = e1000_media_type_fiber;
1729c80d176SSepherosa Ziehau 		break;
1739c80d176SSepherosa Ziehau 	case E1000_DEV_ID_82545GM_SERDES:
1749c80d176SSepherosa Ziehau 	case E1000_DEV_ID_82546GB_SERDES:
1759c80d176SSepherosa Ziehau 		hw->phy.media_type = e1000_media_type_internal_serdes;
1769c80d176SSepherosa Ziehau 		break;
1779c80d176SSepherosa Ziehau 	default:
1789c80d176SSepherosa Ziehau 		hw->phy.media_type = e1000_media_type_copper;
1799c80d176SSepherosa Ziehau 		break;
1809c80d176SSepherosa Ziehau 	}
1819c80d176SSepherosa Ziehau 
1829c80d176SSepherosa Ziehau 	/* Set mta register count */
1839c80d176SSepherosa Ziehau 	mac->mta_reg_count = 128;
1849c80d176SSepherosa Ziehau 	/* Set rar entry count */
1859c80d176SSepherosa Ziehau 	mac->rar_entry_count = E1000_RAR_ENTRIES;
1869c80d176SSepherosa Ziehau 
1879c80d176SSepherosa Ziehau 	/* Function pointers */
1889c80d176SSepherosa Ziehau 
1899c80d176SSepherosa Ziehau 	/* bus type/speed/width */
1909c80d176SSepherosa Ziehau 	mac->ops.get_bus_info = e1000_get_bus_info_pci_generic;
1919c80d176SSepherosa Ziehau 	/* function id */
1929c80d176SSepherosa Ziehau 	mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pci;
1939c80d176SSepherosa Ziehau 	/* reset */
1949c80d176SSepherosa Ziehau 	mac->ops.reset_hw = e1000_reset_hw_82540;
1959c80d176SSepherosa Ziehau 	/* hw initialization */
1969c80d176SSepherosa Ziehau 	mac->ops.init_hw = e1000_init_hw_82540;
1979c80d176SSepherosa Ziehau 	/* link setup */
1989c80d176SSepherosa Ziehau 	mac->ops.setup_link = e1000_setup_link_generic;
1999c80d176SSepherosa Ziehau 	/* physical interface setup */
2009c80d176SSepherosa Ziehau 	mac->ops.setup_physical_interface =
2019c80d176SSepherosa Ziehau 		(hw->phy.media_type == e1000_media_type_copper)
2029c80d176SSepherosa Ziehau 			? e1000_setup_copper_link_82540
2039c80d176SSepherosa Ziehau 			: e1000_setup_fiber_serdes_link_82540;
2049c80d176SSepherosa Ziehau 	/* check for link */
2059c80d176SSepherosa Ziehau 	switch (hw->phy.media_type) {
2069c80d176SSepherosa Ziehau 	case e1000_media_type_copper:
2079c80d176SSepherosa Ziehau 		mac->ops.check_for_link = e1000_check_for_copper_link_generic;
2089c80d176SSepherosa Ziehau 		break;
2099c80d176SSepherosa Ziehau 	case e1000_media_type_fiber:
2109c80d176SSepherosa Ziehau 		mac->ops.check_for_link = e1000_check_for_fiber_link_generic;
2119c80d176SSepherosa Ziehau 		break;
2129c80d176SSepherosa Ziehau 	case e1000_media_type_internal_serdes:
2139c80d176SSepherosa Ziehau 		mac->ops.check_for_link = e1000_check_for_serdes_link_generic;
2149c80d176SSepherosa Ziehau 		break;
2159c80d176SSepherosa Ziehau 	default:
2169c80d176SSepherosa Ziehau 		ret_val = -E1000_ERR_CONFIG;
2179c80d176SSepherosa Ziehau 		goto out;
2189c80d176SSepherosa Ziehau 		break;
2199c80d176SSepherosa Ziehau 	}
2209c80d176SSepherosa Ziehau 	/* link info */
2219c80d176SSepherosa Ziehau 	mac->ops.get_link_up_info =
2229c80d176SSepherosa Ziehau 		(hw->phy.media_type == e1000_media_type_copper)
2239c80d176SSepherosa Ziehau 			? e1000_get_speed_and_duplex_copper_generic
2249c80d176SSepherosa Ziehau 			: e1000_get_speed_and_duplex_fiber_serdes_generic;
2259c80d176SSepherosa Ziehau 	/* multicast address update */
2269c80d176SSepherosa Ziehau 	mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic;
2279c80d176SSepherosa Ziehau 	/* writing VFTA */
2289c80d176SSepherosa Ziehau 	mac->ops.write_vfta = e1000_write_vfta_generic;
2299c80d176SSepherosa Ziehau 	/* clearing VFTA */
2309c80d176SSepherosa Ziehau 	mac->ops.clear_vfta = e1000_clear_vfta_generic;
2316a5a645eSSepherosa Ziehau 	/* read mac address */
2326a5a645eSSepherosa Ziehau 	mac->ops.read_mac_addr = e1000_read_mac_addr_82540;
2336a5a645eSSepherosa Ziehau 	/* ID LED init */
2346a5a645eSSepherosa Ziehau 	mac->ops.id_led_init = e1000_id_led_init_generic;
2359c80d176SSepherosa Ziehau 	/* setup LED */
2369c80d176SSepherosa Ziehau 	mac->ops.setup_led = e1000_setup_led_generic;
2379c80d176SSepherosa Ziehau 	/* cleanup LED */
2389c80d176SSepherosa Ziehau 	mac->ops.cleanup_led = e1000_cleanup_led_generic;
2399c80d176SSepherosa Ziehau 	/* turn on/off LED */
2409c80d176SSepherosa Ziehau 	mac->ops.led_on = e1000_led_on_generic;
2419c80d176SSepherosa Ziehau 	mac->ops.led_off = e1000_led_off_generic;
2429c80d176SSepherosa Ziehau 	/* clear hardware counters */
2439c80d176SSepherosa Ziehau 	mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82540;
2449c80d176SSepherosa Ziehau 
2459c80d176SSepherosa Ziehau out:
2469c80d176SSepherosa Ziehau 	return ret_val;
2479c80d176SSepherosa Ziehau }
2489c80d176SSepherosa Ziehau 
2499c80d176SSepherosa Ziehau /**
2509c80d176SSepherosa Ziehau  * e1000_init_function_pointers_82540 - Init func ptrs.
2519c80d176SSepherosa Ziehau  * @hw: pointer to the HW structure
2529c80d176SSepherosa Ziehau  *
2539c80d176SSepherosa Ziehau  * Called to initialize all function pointers and parameters.
2549c80d176SSepherosa Ziehau  **/
e1000_init_function_pointers_82540(struct e1000_hw * hw)2559c80d176SSepherosa Ziehau void e1000_init_function_pointers_82540(struct e1000_hw *hw)
2569c80d176SSepherosa Ziehau {
2579c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_init_function_pointers_82540");
2589c80d176SSepherosa Ziehau 
2599c80d176SSepherosa Ziehau 	hw->mac.ops.init_params = e1000_init_mac_params_82540;
2609c80d176SSepherosa Ziehau 	hw->nvm.ops.init_params = e1000_init_nvm_params_82540;
2619c80d176SSepherosa Ziehau 	hw->phy.ops.init_params = e1000_init_phy_params_82540;
2629c80d176SSepherosa Ziehau }
2639c80d176SSepherosa Ziehau 
2649c80d176SSepherosa Ziehau /**
2659c80d176SSepherosa Ziehau  *  e1000_reset_hw_82540 - Reset hardware
2669c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
2679c80d176SSepherosa Ziehau  *
2689c80d176SSepherosa Ziehau  *  This resets the hardware into a known state.
2699c80d176SSepherosa Ziehau  **/
e1000_reset_hw_82540(struct e1000_hw * hw)2709c80d176SSepherosa Ziehau static s32 e1000_reset_hw_82540(struct e1000_hw *hw)
2719c80d176SSepherosa Ziehau {
2726d5e2922SSepherosa Ziehau 	u32 ctrl, manc;
2739c80d176SSepherosa Ziehau 	s32 ret_val = E1000_SUCCESS;
2749c80d176SSepherosa Ziehau 
2759c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_reset_hw_82540");
2769c80d176SSepherosa Ziehau 
2779c80d176SSepherosa Ziehau 	DEBUGOUT("Masking off all interrupts\n");
2789c80d176SSepherosa Ziehau 	E1000_WRITE_REG(hw, E1000_IMC, 0xFFFFFFFF);
2799c80d176SSepherosa Ziehau 
2809c80d176SSepherosa Ziehau 	E1000_WRITE_REG(hw, E1000_RCTL, 0);
2819c80d176SSepherosa Ziehau 	E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP);
2829c80d176SSepherosa Ziehau 	E1000_WRITE_FLUSH(hw);
2839c80d176SSepherosa Ziehau 
2849c80d176SSepherosa Ziehau 	/*
2859c80d176SSepherosa Ziehau 	 * Delay to allow any outstanding PCI transactions to complete
2869c80d176SSepherosa Ziehau 	 * before resetting the device.
2879c80d176SSepherosa Ziehau 	 */
2889c80d176SSepherosa Ziehau 	msec_delay(10);
2899c80d176SSepherosa Ziehau 
2909c80d176SSepherosa Ziehau 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
2919c80d176SSepherosa Ziehau 
2929c80d176SSepherosa Ziehau 	DEBUGOUT("Issuing a global reset to 82540/82545/82546 MAC\n");
2939c80d176SSepherosa Ziehau 	switch (hw->mac.type) {
2949c80d176SSepherosa Ziehau 	case e1000_82545_rev_3:
2959c80d176SSepherosa Ziehau 	case e1000_82546_rev_3:
2969c80d176SSepherosa Ziehau 		E1000_WRITE_REG(hw, E1000_CTRL_DUP, ctrl | E1000_CTRL_RST);
2979c80d176SSepherosa Ziehau 		break;
2989c80d176SSepherosa Ziehau 	default:
2999c80d176SSepherosa Ziehau 		/*
3009c80d176SSepherosa Ziehau 		 * These controllers can't ack the 64-bit write when
3019c80d176SSepherosa Ziehau 		 * issuing the reset, so we use IO-mapping as a
3029c80d176SSepherosa Ziehau 		 * workaround to issue the reset.
3039c80d176SSepherosa Ziehau 		 */
3049c80d176SSepherosa Ziehau 		E1000_WRITE_REG_IO(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
3059c80d176SSepherosa Ziehau 		break;
3069c80d176SSepherosa Ziehau 	}
3079c80d176SSepherosa Ziehau 
3089c80d176SSepherosa Ziehau 	/* Wait for EEPROM reload */
3099c80d176SSepherosa Ziehau 	msec_delay(5);
3109c80d176SSepherosa Ziehau 
3119c80d176SSepherosa Ziehau 	/* Disable HW ARPs on ASF enabled adapters */
3129c80d176SSepherosa Ziehau 	manc = E1000_READ_REG(hw, E1000_MANC);
3139c80d176SSepherosa Ziehau 	manc &= ~E1000_MANC_ARP_EN;
3149c80d176SSepherosa Ziehau 	E1000_WRITE_REG(hw, E1000_MANC, manc);
3159c80d176SSepherosa Ziehau 
3169c80d176SSepherosa Ziehau 	E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
3176d5e2922SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_ICR);
3189c80d176SSepherosa Ziehau 
3199c80d176SSepherosa Ziehau 	return ret_val;
3209c80d176SSepherosa Ziehau }
3219c80d176SSepherosa Ziehau 
3229c80d176SSepherosa Ziehau /**
3239c80d176SSepherosa Ziehau  *  e1000_init_hw_82540 - Initialize hardware
3249c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
3259c80d176SSepherosa Ziehau  *
3269c80d176SSepherosa Ziehau  *  This inits the hardware readying it for operation.
3279c80d176SSepherosa Ziehau  **/
e1000_init_hw_82540(struct e1000_hw * hw)3289c80d176SSepherosa Ziehau static s32 e1000_init_hw_82540(struct e1000_hw *hw)
3299c80d176SSepherosa Ziehau {
3309c80d176SSepherosa Ziehau 	struct e1000_mac_info *mac = &hw->mac;
3319c80d176SSepherosa Ziehau 	u32 txdctl, ctrl_ext;
3324765c386SMichael Neumann 	s32 ret_val;
3339c80d176SSepherosa Ziehau 	u16 i;
3349c80d176SSepherosa Ziehau 
3359c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_init_hw_82540");
3369c80d176SSepherosa Ziehau 
3379c80d176SSepherosa Ziehau 	/* Initialize identification LED */
3386a5a645eSSepherosa Ziehau 	ret_val = mac->ops.id_led_init(hw);
3399c80d176SSepherosa Ziehau 	if (ret_val) {
3409c80d176SSepherosa Ziehau 		DEBUGOUT("Error initializing identification LED\n");
3419c80d176SSepherosa Ziehau 		/* This is not fatal and we should not stop init due to this */
3429c80d176SSepherosa Ziehau 	}
3439c80d176SSepherosa Ziehau 
3449c80d176SSepherosa Ziehau 	/* Disabling VLAN filtering */
3459c80d176SSepherosa Ziehau 	DEBUGOUT("Initializing the IEEE VLAN\n");
3469c80d176SSepherosa Ziehau 	if (mac->type < e1000_82545_rev_3)
3479c80d176SSepherosa Ziehau 		E1000_WRITE_REG(hw, E1000_VET, 0);
3489c80d176SSepherosa Ziehau 
3499c80d176SSepherosa Ziehau 	mac->ops.clear_vfta(hw);
3509c80d176SSepherosa Ziehau 
3519c80d176SSepherosa Ziehau 	/* Setup the receive address. */
3529c80d176SSepherosa Ziehau 	e1000_init_rx_addrs_generic(hw, mac->rar_entry_count);
3539c80d176SSepherosa Ziehau 
3549c80d176SSepherosa Ziehau 	/* Zero out the Multicast HASH table */
3559c80d176SSepherosa Ziehau 	DEBUGOUT("Zeroing the MTA\n");
3569c80d176SSepherosa Ziehau 	for (i = 0; i < mac->mta_reg_count; i++) {
3579c80d176SSepherosa Ziehau 		E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
3589c80d176SSepherosa Ziehau 		/*
3599c80d176SSepherosa Ziehau 		 * Avoid back to back register writes by adding the register
3609c80d176SSepherosa Ziehau 		 * read (flush).  This is to protect against some strange
3619c80d176SSepherosa Ziehau 		 * bridge configurations that may issue Memory Write Block
3629c80d176SSepherosa Ziehau 		 * (MWB) to our register space.  The *_rev_3 hardware at
3639c80d176SSepherosa Ziehau 		 * least doesn't respond correctly to every other dword in an
3649c80d176SSepherosa Ziehau 		 * MWB to our register space.
3659c80d176SSepherosa Ziehau 		 */
3669c80d176SSepherosa Ziehau 		E1000_WRITE_FLUSH(hw);
3679c80d176SSepherosa Ziehau 	}
3689c80d176SSepherosa Ziehau 
3699c80d176SSepherosa Ziehau 	if (mac->type < e1000_82545_rev_3)
3709c80d176SSepherosa Ziehau 		e1000_pcix_mmrbc_workaround_generic(hw);
3719c80d176SSepherosa Ziehau 
3729c80d176SSepherosa Ziehau 	/* Setup link and flow control */
3739c80d176SSepherosa Ziehau 	ret_val = mac->ops.setup_link(hw);
3749c80d176SSepherosa Ziehau 
3759c80d176SSepherosa Ziehau 	txdctl = E1000_READ_REG(hw, E1000_TXDCTL(0));
3769c80d176SSepherosa Ziehau 	txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) |
3779c80d176SSepherosa Ziehau 		  E1000_TXDCTL_FULL_TX_DESC_WB;
3789c80d176SSepherosa Ziehau 	E1000_WRITE_REG(hw, E1000_TXDCTL(0), txdctl);
3799c80d176SSepherosa Ziehau 
3809c80d176SSepherosa Ziehau 	/*
3819c80d176SSepherosa Ziehau 	 * Clear all of the statistics registers (clear on read).  It is
3829c80d176SSepherosa Ziehau 	 * important that we do this after we have tried to establish link
3839c80d176SSepherosa Ziehau 	 * because the symbol error count will increment wildly if there
3849c80d176SSepherosa Ziehau 	 * is no link.
3859c80d176SSepherosa Ziehau 	 */
3869c80d176SSepherosa Ziehau 	e1000_clear_hw_cntrs_82540(hw);
3879c80d176SSepherosa Ziehau 
3889c80d176SSepherosa Ziehau 	if ((hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER) ||
3899c80d176SSepherosa Ziehau 	    (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3)) {
3909c80d176SSepherosa Ziehau 		ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
3919c80d176SSepherosa Ziehau 		/*
3929c80d176SSepherosa Ziehau 		 * Relaxed ordering must be disabled to avoid a parity
3939c80d176SSepherosa Ziehau 		 * error crash in a PCI slot.
3949c80d176SSepherosa Ziehau 		 */
3959c80d176SSepherosa Ziehau 		ctrl_ext |= E1000_CTRL_EXT_RO_DIS;
3969c80d176SSepherosa Ziehau 		E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
3979c80d176SSepherosa Ziehau 	}
3989c80d176SSepherosa Ziehau 
3999c80d176SSepherosa Ziehau 	return ret_val;
4009c80d176SSepherosa Ziehau }
4019c80d176SSepherosa Ziehau 
4029c80d176SSepherosa Ziehau /**
4039c80d176SSepherosa Ziehau  *  e1000_setup_copper_link_82540 - Configure copper link settings
4049c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
4059c80d176SSepherosa Ziehau  *
4069c80d176SSepherosa Ziehau  *  Calls the appropriate function to configure the link for auto-neg or forced
4079c80d176SSepherosa Ziehau  *  speed and duplex.  Then we check for link, once link is established calls
4089c80d176SSepherosa Ziehau  *  to configure collision distance and flow control are called.  If link is
4099c80d176SSepherosa Ziehau  *  not established, we return -E1000_ERR_PHY (-2).
4109c80d176SSepherosa Ziehau  **/
e1000_setup_copper_link_82540(struct e1000_hw * hw)4119c80d176SSepherosa Ziehau static s32 e1000_setup_copper_link_82540(struct e1000_hw *hw)
4129c80d176SSepherosa Ziehau {
4139c80d176SSepherosa Ziehau 	u32 ctrl;
4144765c386SMichael Neumann 	s32 ret_val;
4159c80d176SSepherosa Ziehau 	u16 data;
4169c80d176SSepherosa Ziehau 
4179c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_setup_copper_link_82540");
4189c80d176SSepherosa Ziehau 
4199c80d176SSepherosa Ziehau 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
4209c80d176SSepherosa Ziehau 	ctrl |= E1000_CTRL_SLU;
4219c80d176SSepherosa Ziehau 	ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
4229c80d176SSepherosa Ziehau 	E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
4239c80d176SSepherosa Ziehau 
4249c80d176SSepherosa Ziehau 	ret_val = e1000_set_phy_mode_82540(hw);
4259c80d176SSepherosa Ziehau 	if (ret_val)
4269c80d176SSepherosa Ziehau 		goto out;
4279c80d176SSepherosa Ziehau 
4289c80d176SSepherosa Ziehau 	if (hw->mac.type == e1000_82545_rev_3 ||
4299c80d176SSepherosa Ziehau 	    hw->mac.type == e1000_82546_rev_3) {
4304be59a01SSepherosa Ziehau 		ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL,
4314be59a01SSepherosa Ziehau 					       &data);
4329c80d176SSepherosa Ziehau 		if (ret_val)
4339c80d176SSepherosa Ziehau 			goto out;
4349c80d176SSepherosa Ziehau 		data |= 0x00000008;
4354be59a01SSepherosa Ziehau 		ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL,
4364be59a01SSepherosa Ziehau 						data);
4379c80d176SSepherosa Ziehau 		if (ret_val)
4389c80d176SSepherosa Ziehau 			goto out;
4399c80d176SSepherosa Ziehau 	}
4409c80d176SSepherosa Ziehau 
4419c80d176SSepherosa Ziehau 	ret_val = e1000_copper_link_setup_m88(hw);
4429c80d176SSepherosa Ziehau 	if (ret_val)
4439c80d176SSepherosa Ziehau 		goto out;
4449c80d176SSepherosa Ziehau 
4459c80d176SSepherosa Ziehau 	ret_val = e1000_setup_copper_link_generic(hw);
4469c80d176SSepherosa Ziehau 
4479c80d176SSepherosa Ziehau out:
4489c80d176SSepherosa Ziehau 	return ret_val;
4499c80d176SSepherosa Ziehau }
4509c80d176SSepherosa Ziehau 
4519c80d176SSepherosa Ziehau /**
4529c80d176SSepherosa Ziehau  *  e1000_setup_fiber_serdes_link_82540 - Setup link for fiber/serdes
4539c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
4549c80d176SSepherosa Ziehau  *
4559c80d176SSepherosa Ziehau  *  Set the output amplitude to the value in the EEPROM and adjust the VCO
4569c80d176SSepherosa Ziehau  *  speed to improve Bit Error Rate (BER) performance.  Configures collision
4579c80d176SSepherosa Ziehau  *  distance and flow control for fiber and serdes links.  Upon successful
4589c80d176SSepherosa Ziehau  *  setup, poll for link.
4599c80d176SSepherosa Ziehau  **/
e1000_setup_fiber_serdes_link_82540(struct e1000_hw * hw)4609c80d176SSepherosa Ziehau static s32 e1000_setup_fiber_serdes_link_82540(struct e1000_hw *hw)
4619c80d176SSepherosa Ziehau {
4629c80d176SSepherosa Ziehau 	struct e1000_mac_info *mac = &hw->mac;
4639c80d176SSepherosa Ziehau 	s32 ret_val = E1000_SUCCESS;
4649c80d176SSepherosa Ziehau 
4659c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_setup_fiber_serdes_link_82540");
4669c80d176SSepherosa Ziehau 
4679c80d176SSepherosa Ziehau 	switch (mac->type) {
4689c80d176SSepherosa Ziehau 	case e1000_82545_rev_3:
4699c80d176SSepherosa Ziehau 	case e1000_82546_rev_3:
4709c80d176SSepherosa Ziehau 		if (hw->phy.media_type == e1000_media_type_internal_serdes) {
4719c80d176SSepherosa Ziehau 			/*
4729c80d176SSepherosa Ziehau 			 * If we're on serdes media, adjust the output
4739c80d176SSepherosa Ziehau 			 * amplitude to value set in the EEPROM.
4749c80d176SSepherosa Ziehau 			 */
4759c80d176SSepherosa Ziehau 			ret_val = e1000_adjust_serdes_amplitude_82540(hw);
4769c80d176SSepherosa Ziehau 			if (ret_val)
4779c80d176SSepherosa Ziehau 				goto out;
4789c80d176SSepherosa Ziehau 		}
4799c80d176SSepherosa Ziehau 		/* Adjust VCO speed to improve BER performance */
4809c80d176SSepherosa Ziehau 		ret_val = e1000_set_vco_speed_82540(hw);
4819c80d176SSepherosa Ziehau 		if (ret_val)
4829c80d176SSepherosa Ziehau 			goto out;
4839c80d176SSepherosa Ziehau 	default:
4849c80d176SSepherosa Ziehau 		break;
4859c80d176SSepherosa Ziehau 	}
4869c80d176SSepherosa Ziehau 
4879c80d176SSepherosa Ziehau 	ret_val = e1000_setup_fiber_serdes_link_generic(hw);
4889c80d176SSepherosa Ziehau 
4899c80d176SSepherosa Ziehau out:
4909c80d176SSepherosa Ziehau 	return ret_val;
4919c80d176SSepherosa Ziehau }
4929c80d176SSepherosa Ziehau 
4939c80d176SSepherosa Ziehau /**
4949c80d176SSepherosa Ziehau  *  e1000_adjust_serdes_amplitude_82540 - Adjust amplitude based on EEPROM
4959c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
4969c80d176SSepherosa Ziehau  *
4979c80d176SSepherosa Ziehau  *  Adjust the SERDES output amplitude based on the EEPROM settings.
4989c80d176SSepherosa Ziehau  **/
e1000_adjust_serdes_amplitude_82540(struct e1000_hw * hw)4999c80d176SSepherosa Ziehau static s32 e1000_adjust_serdes_amplitude_82540(struct e1000_hw *hw)
5009c80d176SSepherosa Ziehau {
5014765c386SMichael Neumann 	s32 ret_val;
5029c80d176SSepherosa Ziehau 	u16 nvm_data;
5039c80d176SSepherosa Ziehau 
5049c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_adjust_serdes_amplitude_82540");
5059c80d176SSepherosa Ziehau 
5069c80d176SSepherosa Ziehau 	ret_val = hw->nvm.ops.read(hw, NVM_SERDES_AMPLITUDE, 1, &nvm_data);
5079c80d176SSepherosa Ziehau 	if (ret_val)
5089c80d176SSepherosa Ziehau 		goto out;
5099c80d176SSepherosa Ziehau 
5109c80d176SSepherosa Ziehau 	if (nvm_data != NVM_RESERVED_WORD) {
5119c80d176SSepherosa Ziehau 		/* Adjust serdes output amplitude only. */
5129c80d176SSepherosa Ziehau 		nvm_data &= NVM_SERDES_AMPLITUDE_MASK;
5134be59a01SSepherosa Ziehau 		ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_EXT_CTRL,
5149c80d176SSepherosa Ziehau 						nvm_data);
5159c80d176SSepherosa Ziehau 		if (ret_val)
5169c80d176SSepherosa Ziehau 			goto out;
5179c80d176SSepherosa Ziehau 	}
5189c80d176SSepherosa Ziehau 
5199c80d176SSepherosa Ziehau out:
5209c80d176SSepherosa Ziehau 	return ret_val;
5219c80d176SSepherosa Ziehau }
5229c80d176SSepherosa Ziehau 
5239c80d176SSepherosa Ziehau /**
5249c80d176SSepherosa Ziehau  *  e1000_set_vco_speed_82540 - Set VCO speed for better performance
5259c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
5269c80d176SSepherosa Ziehau  *
5279c80d176SSepherosa Ziehau  *  Set the VCO speed to improve Bit Error Rate (BER) performance.
5289c80d176SSepherosa Ziehau  **/
e1000_set_vco_speed_82540(struct e1000_hw * hw)5299c80d176SSepherosa Ziehau static s32 e1000_set_vco_speed_82540(struct e1000_hw *hw)
5309c80d176SSepherosa Ziehau {
5314765c386SMichael Neumann 	s32  ret_val;
5329c80d176SSepherosa Ziehau 	u16 default_page = 0;
5339c80d176SSepherosa Ziehau 	u16 phy_data;
5349c80d176SSepherosa Ziehau 
5359c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_set_vco_speed_82540");
5369c80d176SSepherosa Ziehau 
5379c80d176SSepherosa Ziehau 	/* Set PHY register 30, page 5, bit 8 to 0 */
5389c80d176SSepherosa Ziehau 
5394be59a01SSepherosa Ziehau 	ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_PAGE_SELECT,
5409c80d176SSepherosa Ziehau 				       &default_page);
5419c80d176SSepherosa Ziehau 	if (ret_val)
5429c80d176SSepherosa Ziehau 		goto out;
5439c80d176SSepherosa Ziehau 
5449c80d176SSepherosa Ziehau 	ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005);
5459c80d176SSepherosa Ziehau 	if (ret_val)
5469c80d176SSepherosa Ziehau 		goto out;
5479c80d176SSepherosa Ziehau 
5489c80d176SSepherosa Ziehau 	ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
5499c80d176SSepherosa Ziehau 	if (ret_val)
5509c80d176SSepherosa Ziehau 		goto out;
5519c80d176SSepherosa Ziehau 
5529c80d176SSepherosa Ziehau 	phy_data &= ~M88E1000_PHY_VCO_REG_BIT8;
5539c80d176SSepherosa Ziehau 	ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
5549c80d176SSepherosa Ziehau 	if (ret_val)
5559c80d176SSepherosa Ziehau 		goto out;
5569c80d176SSepherosa Ziehau 
5579c80d176SSepherosa Ziehau 	/* Set PHY register 30, page 4, bit 11 to 1 */
5589c80d176SSepherosa Ziehau 
5599c80d176SSepherosa Ziehau 	ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0004);
5609c80d176SSepherosa Ziehau 	if (ret_val)
5619c80d176SSepherosa Ziehau 		goto out;
5629c80d176SSepherosa Ziehau 
5639c80d176SSepherosa Ziehau 	ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
5649c80d176SSepherosa Ziehau 	if (ret_val)
5659c80d176SSepherosa Ziehau 		goto out;
5669c80d176SSepherosa Ziehau 
5679c80d176SSepherosa Ziehau 	phy_data |= M88E1000_PHY_VCO_REG_BIT11;
5689c80d176SSepherosa Ziehau 	ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
5699c80d176SSepherosa Ziehau 	if (ret_val)
5709c80d176SSepherosa Ziehau 		goto out;
5719c80d176SSepherosa Ziehau 
5729c80d176SSepherosa Ziehau 	ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT,
5739c80d176SSepherosa Ziehau 					default_page);
5749c80d176SSepherosa Ziehau 
5759c80d176SSepherosa Ziehau out:
5769c80d176SSepherosa Ziehau 	return ret_val;
5779c80d176SSepherosa Ziehau }
5789c80d176SSepherosa Ziehau 
5799c80d176SSepherosa Ziehau /**
5809c80d176SSepherosa Ziehau  *  e1000_set_phy_mode_82540 - Set PHY to class A mode
5819c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
5829c80d176SSepherosa Ziehau  *
5839c80d176SSepherosa Ziehau  *  Sets the PHY to class A mode and assumes the following operations will
5849c80d176SSepherosa Ziehau  *  follow to enable the new class mode:
5859c80d176SSepherosa Ziehau  *    1.  Do a PHY soft reset.
5869c80d176SSepherosa Ziehau  *    2.  Restart auto-negotiation or force link.
5879c80d176SSepherosa Ziehau  **/
e1000_set_phy_mode_82540(struct e1000_hw * hw)5889c80d176SSepherosa Ziehau static s32 e1000_set_phy_mode_82540(struct e1000_hw *hw)
5899c80d176SSepherosa Ziehau {
5909c80d176SSepherosa Ziehau 	s32 ret_val = E1000_SUCCESS;
5919c80d176SSepherosa Ziehau 	u16 nvm_data;
5929c80d176SSepherosa Ziehau 
5939c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_set_phy_mode_82540");
5949c80d176SSepherosa Ziehau 
5959c80d176SSepherosa Ziehau 	if (hw->mac.type != e1000_82545_rev_3)
5969c80d176SSepherosa Ziehau 		goto out;
5979c80d176SSepherosa Ziehau 
5989c80d176SSepherosa Ziehau 	ret_val = hw->nvm.ops.read(hw, NVM_PHY_CLASS_WORD, 1, &nvm_data);
5999c80d176SSepherosa Ziehau 	if (ret_val) {
6009c80d176SSepherosa Ziehau 		ret_val = -E1000_ERR_PHY;
6019c80d176SSepherosa Ziehau 		goto out;
6029c80d176SSepherosa Ziehau 	}
6039c80d176SSepherosa Ziehau 
6049c80d176SSepherosa Ziehau 	if ((nvm_data != NVM_RESERVED_WORD) && (nvm_data & NVM_PHY_CLASS_A)) {
6059c80d176SSepherosa Ziehau 		ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT,
6069c80d176SSepherosa Ziehau 						0x000B);
6079c80d176SSepherosa Ziehau 		if (ret_val) {
6089c80d176SSepherosa Ziehau 			ret_val = -E1000_ERR_PHY;
6099c80d176SSepherosa Ziehau 			goto out;
6109c80d176SSepherosa Ziehau 		}
6114be59a01SSepherosa Ziehau 		ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL,
6129c80d176SSepherosa Ziehau 						0x8104);
6139c80d176SSepherosa Ziehau 		if (ret_val) {
6149c80d176SSepherosa Ziehau 			ret_val = -E1000_ERR_PHY;
6159c80d176SSepherosa Ziehau 			goto out;
6169c80d176SSepherosa Ziehau 		}
6179c80d176SSepherosa Ziehau 
6189c80d176SSepherosa Ziehau 	}
6199c80d176SSepherosa Ziehau 
6209c80d176SSepherosa Ziehau out:
6219c80d176SSepherosa Ziehau 	return ret_val;
6229c80d176SSepherosa Ziehau }
6239c80d176SSepherosa Ziehau 
6249c80d176SSepherosa Ziehau /**
6259c80d176SSepherosa Ziehau  * e1000_power_down_phy_copper_82540 - Remove link in case of PHY power down
6269c80d176SSepherosa Ziehau  * @hw: pointer to the HW structure
6279c80d176SSepherosa Ziehau  *
6289c80d176SSepherosa Ziehau  * In the case of a PHY power down to save power, or to turn off link during a
6299c80d176SSepherosa Ziehau  * driver unload, or wake on lan is not enabled, remove the link.
6309c80d176SSepherosa Ziehau  **/
e1000_power_down_phy_copper_82540(struct e1000_hw * hw)6319c80d176SSepherosa Ziehau static void e1000_power_down_phy_copper_82540(struct e1000_hw *hw)
6329c80d176SSepherosa Ziehau {
6339c80d176SSepherosa Ziehau 	/* If the management interface is not enabled, then power down */
6349c80d176SSepherosa Ziehau 	if (!(E1000_READ_REG(hw, E1000_MANC) & E1000_MANC_SMBUS_EN))
6359c80d176SSepherosa Ziehau 		e1000_power_down_phy_copper(hw);
6369c80d176SSepherosa Ziehau 
6379c80d176SSepherosa Ziehau 	return;
6389c80d176SSepherosa Ziehau }
6399c80d176SSepherosa Ziehau 
6409c80d176SSepherosa Ziehau /**
6419c80d176SSepherosa Ziehau  *  e1000_clear_hw_cntrs_82540 - Clear device specific hardware counters
6429c80d176SSepherosa Ziehau  *  @hw: pointer to the HW structure
6439c80d176SSepherosa Ziehau  *
6449c80d176SSepherosa Ziehau  *  Clears the hardware counters by reading the counter registers.
6459c80d176SSepherosa Ziehau  **/
e1000_clear_hw_cntrs_82540(struct e1000_hw * hw)6469c80d176SSepherosa Ziehau static void e1000_clear_hw_cntrs_82540(struct e1000_hw *hw)
6479c80d176SSepherosa Ziehau {
6489c80d176SSepherosa Ziehau 	DEBUGFUNC("e1000_clear_hw_cntrs_82540");
6499c80d176SSepherosa Ziehau 
6509c80d176SSepherosa Ziehau 	e1000_clear_hw_cntrs_base_generic(hw);
6519c80d176SSepherosa Ziehau 
6529c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PRC64);
6539c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PRC127);
6549c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PRC255);
6559c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PRC511);
6569c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PRC1023);
6579c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PRC1522);
6589c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PTC64);
6599c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PTC127);
6609c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PTC255);
6619c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PTC511);
6629c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PTC1023);
6639c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_PTC1522);
6649c80d176SSepherosa Ziehau 
6659c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_ALGNERRC);
6669c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_RXERRC);
6679c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_TNCRS);
6689c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_CEXTERR);
6699c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_TSCTC);
6709c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_TSCTFC);
6719c80d176SSepherosa Ziehau 
6729c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_MGTPRC);
6739c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_MGTPDC);
6749c80d176SSepherosa Ziehau 	E1000_READ_REG(hw, E1000_MGTPTC);
6759c80d176SSepherosa Ziehau }
6769c80d176SSepherosa Ziehau 
6776a5a645eSSepherosa Ziehau /**
6786a5a645eSSepherosa Ziehau  *  e1000_read_mac_addr_82540 - Read device MAC address
6796a5a645eSSepherosa Ziehau  *  @hw: pointer to the HW structure
6806a5a645eSSepherosa Ziehau  *
6816a5a645eSSepherosa Ziehau  *  Reads the device MAC address from the EEPROM and stores the value.
6826a5a645eSSepherosa Ziehau  *  Since devices with two ports use the same EEPROM, we increment the
6836a5a645eSSepherosa Ziehau  *  last bit in the MAC address for the second port.
6846a5a645eSSepherosa Ziehau  *
6856a5a645eSSepherosa Ziehau  *  This version is being used over generic because of customer issues
6866a5a645eSSepherosa Ziehau  *  with VmWare and Virtual Box when using generic. It seems in
6876a5a645eSSepherosa Ziehau  *  the emulated 82545, RAR[0] does NOT have a valid address after a
6886a5a645eSSepherosa Ziehau  *  reset, this older method works and using this breaks nothing for
6896a5a645eSSepherosa Ziehau  *  these legacy adapters.
6906a5a645eSSepherosa Ziehau  **/
e1000_read_mac_addr_82540(struct e1000_hw * hw)6916a5a645eSSepherosa Ziehau s32 e1000_read_mac_addr_82540(struct e1000_hw *hw)
6926a5a645eSSepherosa Ziehau {
6936a5a645eSSepherosa Ziehau 	s32  ret_val = E1000_SUCCESS;
6946a5a645eSSepherosa Ziehau 	u16 offset, nvm_data, i;
6956a5a645eSSepherosa Ziehau 
6966a5a645eSSepherosa Ziehau 	DEBUGFUNC("e1000_read_mac_addr");
6976a5a645eSSepherosa Ziehau 
6986a5a645eSSepherosa Ziehau 	for (i = 0; i < ETH_ADDR_LEN; i += 2) {
6996a5a645eSSepherosa Ziehau 		offset = i >> 1;
7006a5a645eSSepherosa Ziehau 		ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data);
7016a5a645eSSepherosa Ziehau 		if (ret_val) {
7026a5a645eSSepherosa Ziehau 			DEBUGOUT("NVM Read Error\n");
7036a5a645eSSepherosa Ziehau 			goto out;
7046a5a645eSSepherosa Ziehau 		}
7056a5a645eSSepherosa Ziehau 		hw->mac.perm_addr[i] = (u8)(nvm_data & 0xFF);
7066a5a645eSSepherosa Ziehau 		hw->mac.perm_addr[i+1] = (u8)(nvm_data >> 8);
7076a5a645eSSepherosa Ziehau 	}
7086a5a645eSSepherosa Ziehau 
7096a5a645eSSepherosa Ziehau 	/* Flip last bit of mac address if we're on second port */
7106a5a645eSSepherosa Ziehau 	if (hw->bus.func == E1000_FUNC_1)
7116a5a645eSSepherosa Ziehau 		hw->mac.perm_addr[5] ^= 1;
7126a5a645eSSepherosa Ziehau 
7136a5a645eSSepherosa Ziehau 	for (i = 0; i < ETH_ADDR_LEN; i++)
7146a5a645eSSepherosa Ziehau 		hw->mac.addr[i] = hw->mac.perm_addr[i];
7156a5a645eSSepherosa Ziehau 
7166a5a645eSSepherosa Ziehau out:
7176a5a645eSSepherosa Ziehau 	return ret_val;
7186a5a645eSSepherosa Ziehau }
719