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 * 82543GC Gigabit Ethernet Controller (Fiber)
379c80d176SSepherosa Ziehau * 82543GC Gigabit Ethernet Controller (Copper)
389c80d176SSepherosa Ziehau * 82544EI Gigabit Ethernet Controller (Copper)
399c80d176SSepherosa Ziehau * 82544EI Gigabit Ethernet Controller (Fiber)
409c80d176SSepherosa Ziehau * 82544GC Gigabit Ethernet Controller (Copper)
419c80d176SSepherosa Ziehau * 82544GC Gigabit Ethernet Controller (LOM)
429c80d176SSepherosa Ziehau */
439c80d176SSepherosa Ziehau
449c80d176SSepherosa Ziehau #include "e1000_api.h"
459c80d176SSepherosa Ziehau
469c80d176SSepherosa Ziehau static s32 e1000_init_phy_params_82543(struct e1000_hw *hw);
479c80d176SSepherosa Ziehau static s32 e1000_init_nvm_params_82543(struct e1000_hw *hw);
489c80d176SSepherosa Ziehau static s32 e1000_init_mac_params_82543(struct e1000_hw *hw);
499c80d176SSepherosa Ziehau static s32 e1000_read_phy_reg_82543(struct e1000_hw *hw, u32 offset,
509c80d176SSepherosa Ziehau u16 *data);
519c80d176SSepherosa Ziehau static s32 e1000_write_phy_reg_82543(struct e1000_hw *hw, u32 offset,
529c80d176SSepherosa Ziehau u16 data);
539c80d176SSepherosa Ziehau static s32 e1000_phy_force_speed_duplex_82543(struct e1000_hw *hw);
549c80d176SSepherosa Ziehau static s32 e1000_phy_hw_reset_82543(struct e1000_hw *hw);
559c80d176SSepherosa Ziehau static s32 e1000_reset_hw_82543(struct e1000_hw *hw);
569c80d176SSepherosa Ziehau static s32 e1000_init_hw_82543(struct e1000_hw *hw);
579c80d176SSepherosa Ziehau static s32 e1000_setup_link_82543(struct e1000_hw *hw);
589c80d176SSepherosa Ziehau static s32 e1000_setup_copper_link_82543(struct e1000_hw *hw);
599c80d176SSepherosa Ziehau static s32 e1000_setup_fiber_link_82543(struct e1000_hw *hw);
609c80d176SSepherosa Ziehau static s32 e1000_check_for_copper_link_82543(struct e1000_hw *hw);
619c80d176SSepherosa Ziehau static s32 e1000_check_for_fiber_link_82543(struct e1000_hw *hw);
629c80d176SSepherosa Ziehau static s32 e1000_led_on_82543(struct e1000_hw *hw);
639c80d176SSepherosa Ziehau static s32 e1000_led_off_82543(struct e1000_hw *hw);
649c80d176SSepherosa Ziehau static void e1000_write_vfta_82543(struct e1000_hw *hw, u32 offset,
659c80d176SSepherosa Ziehau u32 value);
669c80d176SSepherosa Ziehau static void e1000_clear_hw_cntrs_82543(struct e1000_hw *hw);
679c80d176SSepherosa Ziehau static s32 e1000_config_mac_to_phy_82543(struct e1000_hw *hw);
689c80d176SSepherosa Ziehau static bool e1000_init_phy_disabled_82543(struct e1000_hw *hw);
699c80d176SSepherosa Ziehau static void e1000_lower_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl);
709c80d176SSepherosa Ziehau static s32 e1000_polarity_reversal_workaround_82543(struct e1000_hw *hw);
719c80d176SSepherosa Ziehau static void e1000_raise_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl);
729c80d176SSepherosa Ziehau static u16 e1000_shift_in_mdi_bits_82543(struct e1000_hw *hw);
739c80d176SSepherosa Ziehau static void e1000_shift_out_mdi_bits_82543(struct e1000_hw *hw, u32 data,
749c80d176SSepherosa Ziehau u16 count);
759c80d176SSepherosa Ziehau static bool e1000_tbi_compatibility_enabled_82543(struct e1000_hw *hw);
769c80d176SSepherosa Ziehau static void e1000_set_tbi_sbp_82543(struct e1000_hw *hw, bool state);
779c80d176SSepherosa Ziehau
789c80d176SSepherosa Ziehau /**
799c80d176SSepherosa Ziehau * e1000_init_phy_params_82543 - Init PHY func ptrs.
809c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
819c80d176SSepherosa Ziehau **/
e1000_init_phy_params_82543(struct e1000_hw * hw)829c80d176SSepherosa Ziehau static s32 e1000_init_phy_params_82543(struct e1000_hw *hw)
839c80d176SSepherosa Ziehau {
849c80d176SSepherosa Ziehau struct e1000_phy_info *phy = &hw->phy;
859c80d176SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
869c80d176SSepherosa Ziehau
879c80d176SSepherosa Ziehau DEBUGFUNC("e1000_init_phy_params_82543");
889c80d176SSepherosa Ziehau
899c80d176SSepherosa Ziehau if (hw->phy.media_type != e1000_media_type_copper) {
909c80d176SSepherosa Ziehau phy->type = e1000_phy_none;
919c80d176SSepherosa Ziehau goto out;
929c80d176SSepherosa Ziehau } else {
939c80d176SSepherosa Ziehau phy->ops.power_up = e1000_power_up_phy_copper;
949c80d176SSepherosa Ziehau phy->ops.power_down = e1000_power_down_phy_copper;
959c80d176SSepherosa Ziehau }
969c80d176SSepherosa Ziehau
979c80d176SSepherosa Ziehau phy->addr = 1;
989c80d176SSepherosa Ziehau phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
999c80d176SSepherosa Ziehau phy->reset_delay_us = 10000;
1009c80d176SSepherosa Ziehau phy->type = e1000_phy_m88;
1019c80d176SSepherosa Ziehau
1029c80d176SSepherosa Ziehau /* Function Pointers */
1039c80d176SSepherosa Ziehau phy->ops.check_polarity = e1000_check_polarity_m88;
1049c80d176SSepherosa Ziehau phy->ops.commit = e1000_phy_sw_reset_generic;
1059c80d176SSepherosa Ziehau phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_82543;
1069c80d176SSepherosa Ziehau phy->ops.get_cable_length = e1000_get_cable_length_m88;
1079c80d176SSepherosa Ziehau phy->ops.get_cfg_done = e1000_get_cfg_done_generic;
1089c80d176SSepherosa Ziehau phy->ops.read_reg = (hw->mac.type == e1000_82543)
1099c80d176SSepherosa Ziehau ? e1000_read_phy_reg_82543
1109c80d176SSepherosa Ziehau : e1000_read_phy_reg_m88;
1119c80d176SSepherosa Ziehau phy->ops.reset = (hw->mac.type == e1000_82543)
1129c80d176SSepherosa Ziehau ? e1000_phy_hw_reset_82543
1139c80d176SSepherosa Ziehau : e1000_phy_hw_reset_generic;
1149c80d176SSepherosa Ziehau phy->ops.write_reg = (hw->mac.type == e1000_82543)
1159c80d176SSepherosa Ziehau ? e1000_write_phy_reg_82543
1169c80d176SSepherosa Ziehau : e1000_write_phy_reg_m88;
1179c80d176SSepherosa Ziehau phy->ops.get_info = e1000_get_phy_info_m88;
1189c80d176SSepherosa Ziehau
1199c80d176SSepherosa Ziehau /*
1209c80d176SSepherosa Ziehau * The external PHY of the 82543 can be in a funky state.
1219c80d176SSepherosa Ziehau * Resetting helps us read the PHY registers for acquiring
1229c80d176SSepherosa Ziehau * the PHY ID.
1239c80d176SSepherosa Ziehau */
1249c80d176SSepherosa Ziehau if (!e1000_init_phy_disabled_82543(hw)) {
1259c80d176SSepherosa Ziehau ret_val = phy->ops.reset(hw);
1269c80d176SSepherosa Ziehau if (ret_val) {
1279c80d176SSepherosa Ziehau DEBUGOUT("Resetting PHY during init failed.\n");
1289c80d176SSepherosa Ziehau goto out;
1299c80d176SSepherosa Ziehau }
1309c80d176SSepherosa Ziehau msec_delay(20);
1319c80d176SSepherosa Ziehau }
1329c80d176SSepherosa Ziehau
1339c80d176SSepherosa Ziehau ret_val = e1000_get_phy_id(hw);
1349c80d176SSepherosa Ziehau if (ret_val)
1359c80d176SSepherosa Ziehau goto out;
1369c80d176SSepherosa Ziehau
1379c80d176SSepherosa Ziehau /* Verify phy id */
1389c80d176SSepherosa Ziehau switch (hw->mac.type) {
1399c80d176SSepherosa Ziehau case e1000_82543:
1409c80d176SSepherosa Ziehau if (phy->id != M88E1000_E_PHY_ID) {
1419c80d176SSepherosa Ziehau ret_val = -E1000_ERR_PHY;
1429c80d176SSepherosa Ziehau goto out;
1439c80d176SSepherosa Ziehau }
1449c80d176SSepherosa Ziehau break;
1459c80d176SSepherosa Ziehau case e1000_82544:
1469c80d176SSepherosa Ziehau if (phy->id != M88E1000_I_PHY_ID) {
1479c80d176SSepherosa Ziehau ret_val = -E1000_ERR_PHY;
1489c80d176SSepherosa Ziehau goto out;
1499c80d176SSepherosa Ziehau }
1509c80d176SSepherosa Ziehau break;
1519c80d176SSepherosa Ziehau default:
1529c80d176SSepherosa Ziehau ret_val = -E1000_ERR_PHY;
1539c80d176SSepherosa Ziehau goto out;
1549c80d176SSepherosa Ziehau break;
1559c80d176SSepherosa Ziehau }
1569c80d176SSepherosa Ziehau
1579c80d176SSepherosa Ziehau out:
1589c80d176SSepherosa Ziehau return ret_val;
1599c80d176SSepherosa Ziehau }
1609c80d176SSepherosa Ziehau
1619c80d176SSepherosa Ziehau /**
1629c80d176SSepherosa Ziehau * e1000_init_nvm_params_82543 - Init NVM func ptrs.
1639c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
1649c80d176SSepherosa Ziehau **/
e1000_init_nvm_params_82543(struct e1000_hw * hw)1659c80d176SSepherosa Ziehau static s32 e1000_init_nvm_params_82543(struct e1000_hw *hw)
1669c80d176SSepherosa Ziehau {
1679c80d176SSepherosa Ziehau struct e1000_nvm_info *nvm = &hw->nvm;
1689c80d176SSepherosa Ziehau
1699c80d176SSepherosa Ziehau DEBUGFUNC("e1000_init_nvm_params_82543");
1709c80d176SSepherosa Ziehau
1719c80d176SSepherosa Ziehau nvm->type = e1000_nvm_eeprom_microwire;
1729c80d176SSepherosa Ziehau nvm->word_size = 64;
1739c80d176SSepherosa Ziehau nvm->delay_usec = 50;
1749c80d176SSepherosa Ziehau nvm->address_bits = 6;
1759c80d176SSepherosa Ziehau nvm->opcode_bits = 3;
1769c80d176SSepherosa Ziehau
1779c80d176SSepherosa Ziehau /* Function Pointers */
1789c80d176SSepherosa Ziehau nvm->ops.read = e1000_read_nvm_microwire;
1799c80d176SSepherosa Ziehau nvm->ops.update = e1000_update_nvm_checksum_generic;
1809c80d176SSepherosa Ziehau nvm->ops.valid_led_default = e1000_valid_led_default_generic;
1819c80d176SSepherosa Ziehau nvm->ops.validate = e1000_validate_nvm_checksum_generic;
1829c80d176SSepherosa Ziehau nvm->ops.write = e1000_write_nvm_microwire;
1839c80d176SSepherosa Ziehau
1849c80d176SSepherosa Ziehau return E1000_SUCCESS;
1859c80d176SSepherosa Ziehau }
1869c80d176SSepherosa Ziehau
1879c80d176SSepherosa Ziehau /**
1889c80d176SSepherosa Ziehau * e1000_init_mac_params_82543 - Init MAC func ptrs.
1899c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
1909c80d176SSepherosa Ziehau **/
e1000_init_mac_params_82543(struct e1000_hw * hw)1919c80d176SSepherosa Ziehau static s32 e1000_init_mac_params_82543(struct e1000_hw *hw)
1929c80d176SSepherosa Ziehau {
1939c80d176SSepherosa Ziehau struct e1000_mac_info *mac = &hw->mac;
1949c80d176SSepherosa Ziehau
1959c80d176SSepherosa Ziehau DEBUGFUNC("e1000_init_mac_params_82543");
1969c80d176SSepherosa Ziehau
1979c80d176SSepherosa Ziehau /* Set media type */
1989c80d176SSepherosa Ziehau switch (hw->device_id) {
1999c80d176SSepherosa Ziehau case E1000_DEV_ID_82543GC_FIBER:
2009c80d176SSepherosa Ziehau case E1000_DEV_ID_82544EI_FIBER:
2019c80d176SSepherosa Ziehau hw->phy.media_type = e1000_media_type_fiber;
2029c80d176SSepherosa Ziehau break;
2039c80d176SSepherosa Ziehau default:
2049c80d176SSepherosa Ziehau hw->phy.media_type = e1000_media_type_copper;
2059c80d176SSepherosa Ziehau break;
2069c80d176SSepherosa Ziehau }
2079c80d176SSepherosa Ziehau
2089c80d176SSepherosa Ziehau /* Set mta register count */
2099c80d176SSepherosa Ziehau mac->mta_reg_count = 128;
2109c80d176SSepherosa Ziehau /* Set rar entry count */
2119c80d176SSepherosa Ziehau mac->rar_entry_count = E1000_RAR_ENTRIES;
2129c80d176SSepherosa Ziehau
2139c80d176SSepherosa Ziehau /* Function pointers */
2149c80d176SSepherosa Ziehau
2159c80d176SSepherosa Ziehau /* bus type/speed/width */
2169c80d176SSepherosa Ziehau mac->ops.get_bus_info = e1000_get_bus_info_pci_generic;
2179c80d176SSepherosa Ziehau /* function id */
2189c80d176SSepherosa Ziehau mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pci;
2199c80d176SSepherosa Ziehau /* reset */
2209c80d176SSepherosa Ziehau mac->ops.reset_hw = e1000_reset_hw_82543;
2219c80d176SSepherosa Ziehau /* hw initialization */
2229c80d176SSepherosa Ziehau mac->ops.init_hw = e1000_init_hw_82543;
2239c80d176SSepherosa Ziehau /* link setup */
2249c80d176SSepherosa Ziehau mac->ops.setup_link = e1000_setup_link_82543;
2259c80d176SSepherosa Ziehau /* physical interface setup */
2269c80d176SSepherosa Ziehau mac->ops.setup_physical_interface =
2279c80d176SSepherosa Ziehau (hw->phy.media_type == e1000_media_type_copper)
2284be59a01SSepherosa Ziehau ? e1000_setup_copper_link_82543 : e1000_setup_fiber_link_82543;
2299c80d176SSepherosa Ziehau /* check for link */
2309c80d176SSepherosa Ziehau mac->ops.check_for_link =
2319c80d176SSepherosa Ziehau (hw->phy.media_type == e1000_media_type_copper)
2329c80d176SSepherosa Ziehau ? e1000_check_for_copper_link_82543
2339c80d176SSepherosa Ziehau : e1000_check_for_fiber_link_82543;
2349c80d176SSepherosa Ziehau /* link info */
2359c80d176SSepherosa Ziehau mac->ops.get_link_up_info =
2369c80d176SSepherosa Ziehau (hw->phy.media_type == e1000_media_type_copper)
2379c80d176SSepherosa Ziehau ? e1000_get_speed_and_duplex_copper_generic
2389c80d176SSepherosa Ziehau : e1000_get_speed_and_duplex_fiber_serdes_generic;
2399c80d176SSepherosa Ziehau /* multicast address update */
2409c80d176SSepherosa Ziehau mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic;
2419c80d176SSepherosa Ziehau /* writing VFTA */
2429c80d176SSepherosa Ziehau mac->ops.write_vfta = e1000_write_vfta_82543;
2439c80d176SSepherosa Ziehau /* clearing VFTA */
2449c80d176SSepherosa Ziehau mac->ops.clear_vfta = e1000_clear_vfta_generic;
2459c80d176SSepherosa Ziehau /* turn on/off LED */
2469c80d176SSepherosa Ziehau mac->ops.led_on = e1000_led_on_82543;
2479c80d176SSepherosa Ziehau mac->ops.led_off = e1000_led_off_82543;
2489c80d176SSepherosa Ziehau /* clear hardware counters */
2499c80d176SSepherosa Ziehau mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82543;
2509c80d176SSepherosa Ziehau
2519c80d176SSepherosa Ziehau /* Set tbi compatibility */
2529c80d176SSepherosa Ziehau if ((hw->mac.type != e1000_82543) ||
2539c80d176SSepherosa Ziehau (hw->phy.media_type == e1000_media_type_fiber))
2549c80d176SSepherosa Ziehau e1000_set_tbi_compatibility_82543(hw, FALSE);
2559c80d176SSepherosa Ziehau
2569c80d176SSepherosa Ziehau return E1000_SUCCESS;
2579c80d176SSepherosa Ziehau }
2589c80d176SSepherosa Ziehau
2599c80d176SSepherosa Ziehau /**
2609c80d176SSepherosa Ziehau * e1000_init_function_pointers_82543 - Init func ptrs.
2619c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
2629c80d176SSepherosa Ziehau *
2639c80d176SSepherosa Ziehau * Called to initialize all function pointers and parameters.
2649c80d176SSepherosa Ziehau **/
e1000_init_function_pointers_82543(struct e1000_hw * hw)2659c80d176SSepherosa Ziehau void e1000_init_function_pointers_82543(struct e1000_hw *hw)
2669c80d176SSepherosa Ziehau {
2679c80d176SSepherosa Ziehau DEBUGFUNC("e1000_init_function_pointers_82543");
2689c80d176SSepherosa Ziehau
2699c80d176SSepherosa Ziehau hw->mac.ops.init_params = e1000_init_mac_params_82543;
2709c80d176SSepherosa Ziehau hw->nvm.ops.init_params = e1000_init_nvm_params_82543;
2719c80d176SSepherosa Ziehau hw->phy.ops.init_params = e1000_init_phy_params_82543;
2729c80d176SSepherosa Ziehau }
2739c80d176SSepherosa Ziehau
2749c80d176SSepherosa Ziehau /**
2759c80d176SSepherosa Ziehau * e1000_tbi_compatibility_enabled_82543 - Returns TBI compat status
2769c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
2779c80d176SSepherosa Ziehau *
2789c80d176SSepherosa Ziehau * Returns the current status of 10-bit Interface (TBI) compatibility
2799c80d176SSepherosa Ziehau * (enabled/disabled).
2809c80d176SSepherosa Ziehau **/
e1000_tbi_compatibility_enabled_82543(struct e1000_hw * hw)2819c80d176SSepherosa Ziehau static bool e1000_tbi_compatibility_enabled_82543(struct e1000_hw *hw)
2829c80d176SSepherosa Ziehau {
2839c80d176SSepherosa Ziehau struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543;
2849c80d176SSepherosa Ziehau bool state = FALSE;
2859c80d176SSepherosa Ziehau
2869c80d176SSepherosa Ziehau DEBUGFUNC("e1000_tbi_compatibility_enabled_82543");
2879c80d176SSepherosa Ziehau
2889c80d176SSepherosa Ziehau if (hw->mac.type != e1000_82543) {
2899c80d176SSepherosa Ziehau DEBUGOUT("TBI compatibility workaround for 82543 only.\n");
2909c80d176SSepherosa Ziehau goto out;
2919c80d176SSepherosa Ziehau }
2929c80d176SSepherosa Ziehau
2934be59a01SSepherosa Ziehau state = !!(dev_spec->tbi_compatibility & TBI_COMPAT_ENABLED);
2949c80d176SSepherosa Ziehau
2959c80d176SSepherosa Ziehau out:
2969c80d176SSepherosa Ziehau return state;
2979c80d176SSepherosa Ziehau }
2989c80d176SSepherosa Ziehau
2999c80d176SSepherosa Ziehau /**
3009c80d176SSepherosa Ziehau * e1000_set_tbi_compatibility_82543 - Set TBI compatibility
3019c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
3029c80d176SSepherosa Ziehau * @state: enable/disable TBI compatibility
3039c80d176SSepherosa Ziehau *
3049c80d176SSepherosa Ziehau * Enables or disabled 10-bit Interface (TBI) compatibility.
3059c80d176SSepherosa Ziehau **/
e1000_set_tbi_compatibility_82543(struct e1000_hw * hw,bool state)3069c80d176SSepherosa Ziehau void e1000_set_tbi_compatibility_82543(struct e1000_hw *hw, bool state)
3079c80d176SSepherosa Ziehau {
3089c80d176SSepherosa Ziehau struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543;
3099c80d176SSepherosa Ziehau
3109c80d176SSepherosa Ziehau DEBUGFUNC("e1000_set_tbi_compatibility_82543");
3119c80d176SSepherosa Ziehau
3129c80d176SSepherosa Ziehau if (hw->mac.type != e1000_82543) {
3139c80d176SSepherosa Ziehau DEBUGOUT("TBI compatibility workaround for 82543 only.\n");
3149c80d176SSepherosa Ziehau goto out;
3159c80d176SSepherosa Ziehau }
3169c80d176SSepherosa Ziehau
3179c80d176SSepherosa Ziehau if (state)
3189c80d176SSepherosa Ziehau dev_spec->tbi_compatibility |= TBI_COMPAT_ENABLED;
3199c80d176SSepherosa Ziehau else
3209c80d176SSepherosa Ziehau dev_spec->tbi_compatibility &= ~TBI_COMPAT_ENABLED;
3219c80d176SSepherosa Ziehau
3229c80d176SSepherosa Ziehau out:
3239c80d176SSepherosa Ziehau return;
3249c80d176SSepherosa Ziehau }
3259c80d176SSepherosa Ziehau
3269c80d176SSepherosa Ziehau /**
3279c80d176SSepherosa Ziehau * e1000_tbi_sbp_enabled_82543 - Returns TBI SBP status
3289c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
3299c80d176SSepherosa Ziehau *
3309c80d176SSepherosa Ziehau * Returns the current status of 10-bit Interface (TBI) store bad packet (SBP)
3319c80d176SSepherosa Ziehau * (enabled/disabled).
3329c80d176SSepherosa Ziehau **/
e1000_tbi_sbp_enabled_82543(struct e1000_hw * hw)3339c80d176SSepherosa Ziehau bool e1000_tbi_sbp_enabled_82543(struct e1000_hw *hw)
3349c80d176SSepherosa Ziehau {
3359c80d176SSepherosa Ziehau struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543;
3369c80d176SSepherosa Ziehau bool state = FALSE;
3379c80d176SSepherosa Ziehau
3389c80d176SSepherosa Ziehau DEBUGFUNC("e1000_tbi_sbp_enabled_82543");
3399c80d176SSepherosa Ziehau
3409c80d176SSepherosa Ziehau if (hw->mac.type != e1000_82543) {
3419c80d176SSepherosa Ziehau DEBUGOUT("TBI compatibility workaround for 82543 only.\n");
3429c80d176SSepherosa Ziehau goto out;
3439c80d176SSepherosa Ziehau }
3449c80d176SSepherosa Ziehau
3454be59a01SSepherosa Ziehau state = !!(dev_spec->tbi_compatibility & TBI_SBP_ENABLED);
3469c80d176SSepherosa Ziehau
3479c80d176SSepherosa Ziehau out:
3489c80d176SSepherosa Ziehau return state;
3499c80d176SSepherosa Ziehau }
3509c80d176SSepherosa Ziehau
3519c80d176SSepherosa Ziehau /**
3529c80d176SSepherosa Ziehau * e1000_set_tbi_sbp_82543 - Set TBI SBP
3539c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
3549c80d176SSepherosa Ziehau * @state: enable/disable TBI store bad packet
3559c80d176SSepherosa Ziehau *
3569c80d176SSepherosa Ziehau * Enables or disabled 10-bit Interface (TBI) store bad packet (SBP).
3579c80d176SSepherosa Ziehau **/
e1000_set_tbi_sbp_82543(struct e1000_hw * hw,bool state)3589c80d176SSepherosa Ziehau static void e1000_set_tbi_sbp_82543(struct e1000_hw *hw, bool state)
3599c80d176SSepherosa Ziehau {
3609c80d176SSepherosa Ziehau struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543;
3619c80d176SSepherosa Ziehau
3629c80d176SSepherosa Ziehau DEBUGFUNC("e1000_set_tbi_sbp_82543");
3639c80d176SSepherosa Ziehau
3649c80d176SSepherosa Ziehau if (state && e1000_tbi_compatibility_enabled_82543(hw))
3659c80d176SSepherosa Ziehau dev_spec->tbi_compatibility |= TBI_SBP_ENABLED;
3669c80d176SSepherosa Ziehau else
3679c80d176SSepherosa Ziehau dev_spec->tbi_compatibility &= ~TBI_SBP_ENABLED;
3689c80d176SSepherosa Ziehau
3699c80d176SSepherosa Ziehau return;
3709c80d176SSepherosa Ziehau }
3719c80d176SSepherosa Ziehau
3729c80d176SSepherosa Ziehau /**
3739c80d176SSepherosa Ziehau * e1000_init_phy_disabled_82543 - Returns init PHY status
3749c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
3759c80d176SSepherosa Ziehau *
3769c80d176SSepherosa Ziehau * Returns the current status of whether PHY initialization is disabled.
3779c80d176SSepherosa Ziehau * True if PHY initialization is disabled else FALSE.
3789c80d176SSepherosa Ziehau **/
e1000_init_phy_disabled_82543(struct e1000_hw * hw)3799c80d176SSepherosa Ziehau static bool e1000_init_phy_disabled_82543(struct e1000_hw *hw)
3809c80d176SSepherosa Ziehau {
3819c80d176SSepherosa Ziehau struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543;
3829c80d176SSepherosa Ziehau bool ret_val;
3839c80d176SSepherosa Ziehau
3849c80d176SSepherosa Ziehau DEBUGFUNC("e1000_init_phy_disabled_82543");
3859c80d176SSepherosa Ziehau
3869c80d176SSepherosa Ziehau if (hw->mac.type != e1000_82543) {
3879c80d176SSepherosa Ziehau ret_val = FALSE;
3889c80d176SSepherosa Ziehau goto out;
3899c80d176SSepherosa Ziehau }
3909c80d176SSepherosa Ziehau
3919c80d176SSepherosa Ziehau ret_val = dev_spec->init_phy_disabled;
3929c80d176SSepherosa Ziehau
3939c80d176SSepherosa Ziehau out:
3949c80d176SSepherosa Ziehau return ret_val;
3959c80d176SSepherosa Ziehau }
3969c80d176SSepherosa Ziehau
3979c80d176SSepherosa Ziehau /**
3989c80d176SSepherosa Ziehau * e1000_tbi_adjust_stats_82543 - Adjust stats when TBI enabled
3999c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
4009c80d176SSepherosa Ziehau * @stats: Struct containing statistic register values
4019c80d176SSepherosa Ziehau * @frame_len: The length of the frame in question
4029c80d176SSepherosa Ziehau * @mac_addr: The Ethernet destination address of the frame in question
4039c80d176SSepherosa Ziehau * @max_frame_size: The maximum frame size
4049c80d176SSepherosa Ziehau *
4059c80d176SSepherosa Ziehau * Adjusts the statistic counters when a frame is accepted by TBI_ACCEPT
4069c80d176SSepherosa Ziehau **/
e1000_tbi_adjust_stats_82543(struct e1000_hw * hw,struct e1000_hw_stats * stats,u32 frame_len,u8 * mac_addr,u32 max_frame_size)4079c80d176SSepherosa Ziehau void e1000_tbi_adjust_stats_82543(struct e1000_hw *hw,
4089c80d176SSepherosa Ziehau struct e1000_hw_stats *stats, u32 frame_len,
4099c80d176SSepherosa Ziehau u8 *mac_addr, u32 max_frame_size)
4109c80d176SSepherosa Ziehau {
4119c80d176SSepherosa Ziehau if (!(e1000_tbi_sbp_enabled_82543(hw)))
4129c80d176SSepherosa Ziehau goto out;
4139c80d176SSepherosa Ziehau
4149c80d176SSepherosa Ziehau /* First adjust the frame length. */
4159c80d176SSepherosa Ziehau frame_len--;
4169c80d176SSepherosa Ziehau /*
4179c80d176SSepherosa Ziehau * We need to adjust the statistics counters, since the hardware
4189c80d176SSepherosa Ziehau * counters overcount this packet as a CRC error and undercount
4199c80d176SSepherosa Ziehau * the packet as a good packet
4209c80d176SSepherosa Ziehau */
4219c80d176SSepherosa Ziehau /* This packet should not be counted as a CRC error. */
4229c80d176SSepherosa Ziehau stats->crcerrs--;
4239c80d176SSepherosa Ziehau /* This packet does count as a Good Packet Received. */
4249c80d176SSepherosa Ziehau stats->gprc++;
4259c80d176SSepherosa Ziehau
4269c80d176SSepherosa Ziehau /* Adjust the Good Octets received counters */
4279c80d176SSepherosa Ziehau stats->gorc += frame_len;
4289c80d176SSepherosa Ziehau
4299c80d176SSepherosa Ziehau /*
4309c80d176SSepherosa Ziehau * Is this a broadcast or multicast? Check broadcast first,
4319c80d176SSepherosa Ziehau * since the test for a multicast frame will test positive on
4329c80d176SSepherosa Ziehau * a broadcast frame.
4339c80d176SSepherosa Ziehau */
4349c80d176SSepherosa Ziehau if ((mac_addr[0] == 0xff) && (mac_addr[1] == 0xff))
4359c80d176SSepherosa Ziehau /* Broadcast packet */
4369c80d176SSepherosa Ziehau stats->bprc++;
4379c80d176SSepherosa Ziehau else if (*mac_addr & 0x01)
4389c80d176SSepherosa Ziehau /* Multicast packet */
4399c80d176SSepherosa Ziehau stats->mprc++;
4409c80d176SSepherosa Ziehau
4419c80d176SSepherosa Ziehau /*
4429c80d176SSepherosa Ziehau * In this case, the hardware has over counted the number of
4439c80d176SSepherosa Ziehau * oversize frames.
4449c80d176SSepherosa Ziehau */
4459c80d176SSepherosa Ziehau if ((frame_len == max_frame_size) && (stats->roc > 0))
4469c80d176SSepherosa Ziehau stats->roc--;
4479c80d176SSepherosa Ziehau
4489c80d176SSepherosa Ziehau /*
4499c80d176SSepherosa Ziehau * Adjust the bin counters when the extra byte put the frame in the
4509c80d176SSepherosa Ziehau * wrong bin. Remember that the frame_len was adjusted above.
4519c80d176SSepherosa Ziehau */
4529c80d176SSepherosa Ziehau if (frame_len == 64) {
4539c80d176SSepherosa Ziehau stats->prc64++;
4549c80d176SSepherosa Ziehau stats->prc127--;
4559c80d176SSepherosa Ziehau } else if (frame_len == 127) {
4569c80d176SSepherosa Ziehau stats->prc127++;
4579c80d176SSepherosa Ziehau stats->prc255--;
4589c80d176SSepherosa Ziehau } else if (frame_len == 255) {
4599c80d176SSepherosa Ziehau stats->prc255++;
4609c80d176SSepherosa Ziehau stats->prc511--;
4619c80d176SSepherosa Ziehau } else if (frame_len == 511) {
4629c80d176SSepherosa Ziehau stats->prc511++;
4639c80d176SSepherosa Ziehau stats->prc1023--;
4649c80d176SSepherosa Ziehau } else if (frame_len == 1023) {
4659c80d176SSepherosa Ziehau stats->prc1023++;
4669c80d176SSepherosa Ziehau stats->prc1522--;
4679c80d176SSepherosa Ziehau } else if (frame_len == 1522) {
4689c80d176SSepherosa Ziehau stats->prc1522++;
4699c80d176SSepherosa Ziehau }
4709c80d176SSepherosa Ziehau
4719c80d176SSepherosa Ziehau out:
4729c80d176SSepherosa Ziehau return;
4739c80d176SSepherosa Ziehau }
4749c80d176SSepherosa Ziehau
4759c80d176SSepherosa Ziehau /**
4769c80d176SSepherosa Ziehau * e1000_read_phy_reg_82543 - Read PHY register
4779c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
4789c80d176SSepherosa Ziehau * @offset: register offset to be read
4799c80d176SSepherosa Ziehau * @data: pointer to the read data
4809c80d176SSepherosa Ziehau *
4819c80d176SSepherosa Ziehau * Reads the PHY at offset and stores the information read to data.
4829c80d176SSepherosa Ziehau **/
e1000_read_phy_reg_82543(struct e1000_hw * hw,u32 offset,u16 * data)4839c80d176SSepherosa Ziehau static s32 e1000_read_phy_reg_82543(struct e1000_hw *hw, u32 offset, u16 *data)
4849c80d176SSepherosa Ziehau {
4859c80d176SSepherosa Ziehau u32 mdic;
4869c80d176SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
4879c80d176SSepherosa Ziehau
4889c80d176SSepherosa Ziehau DEBUGFUNC("e1000_read_phy_reg_82543");
4899c80d176SSepherosa Ziehau
4909c80d176SSepherosa Ziehau if (offset > MAX_PHY_REG_ADDRESS) {
4919c80d176SSepherosa Ziehau DEBUGOUT1("PHY Address %d is out of range\n", offset);
4929c80d176SSepherosa Ziehau ret_val = -E1000_ERR_PARAM;
4939c80d176SSepherosa Ziehau goto out;
4949c80d176SSepherosa Ziehau }
4959c80d176SSepherosa Ziehau
4969c80d176SSepherosa Ziehau /*
4979c80d176SSepherosa Ziehau * We must first send a preamble through the MDIO pin to signal the
4989c80d176SSepherosa Ziehau * beginning of an MII instruction. This is done by sending 32
4999c80d176SSepherosa Ziehau * consecutive "1" bits.
5009c80d176SSepherosa Ziehau */
5019c80d176SSepherosa Ziehau e1000_shift_out_mdi_bits_82543(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
5029c80d176SSepherosa Ziehau
5039c80d176SSepherosa Ziehau /*
5049c80d176SSepherosa Ziehau * Now combine the next few fields that are required for a read
5059c80d176SSepherosa Ziehau * operation. We use this method instead of calling the
5069c80d176SSepherosa Ziehau * e1000_shift_out_mdi_bits routine five different times. The format
5079c80d176SSepherosa Ziehau * of an MII read instruction consists of a shift out of 14 bits and
5089c80d176SSepherosa Ziehau * is defined as follows:
5099c80d176SSepherosa Ziehau * <Preamble><SOF><Op Code><Phy Addr><Offset>
5109c80d176SSepherosa Ziehau * followed by a shift in of 18 bits. This first two bits shifted in
5119c80d176SSepherosa Ziehau * are TurnAround bits used to avoid contention on the MDIO pin when a
5129c80d176SSepherosa Ziehau * READ operation is performed. These two bits are thrown away
5139c80d176SSepherosa Ziehau * followed by a shift in of 16 bits which contains the desired data.
5149c80d176SSepherosa Ziehau */
5159c80d176SSepherosa Ziehau mdic = (offset | (hw->phy.addr << 5) |
5169c80d176SSepherosa Ziehau (PHY_OP_READ << 10) | (PHY_SOF << 12));
5179c80d176SSepherosa Ziehau
5189c80d176SSepherosa Ziehau e1000_shift_out_mdi_bits_82543(hw, mdic, 14);
5199c80d176SSepherosa Ziehau
5209c80d176SSepherosa Ziehau /*
5219c80d176SSepherosa Ziehau * Now that we've shifted out the read command to the MII, we need to
5229c80d176SSepherosa Ziehau * "shift in" the 16-bit value (18 total bits) of the requested PHY
5239c80d176SSepherosa Ziehau * register address.
5249c80d176SSepherosa Ziehau */
5259c80d176SSepherosa Ziehau *data = e1000_shift_in_mdi_bits_82543(hw);
5269c80d176SSepherosa Ziehau
5279c80d176SSepherosa Ziehau out:
5289c80d176SSepherosa Ziehau return ret_val;
5299c80d176SSepherosa Ziehau }
5309c80d176SSepherosa Ziehau
5319c80d176SSepherosa Ziehau /**
5329c80d176SSepherosa Ziehau * e1000_write_phy_reg_82543 - Write PHY register
5339c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
5349c80d176SSepherosa Ziehau * @offset: register offset to be written
5359c80d176SSepherosa Ziehau * @data: pointer to the data to be written at offset
5369c80d176SSepherosa Ziehau *
5379c80d176SSepherosa Ziehau * Writes data to the PHY at offset.
5389c80d176SSepherosa Ziehau **/
e1000_write_phy_reg_82543(struct e1000_hw * hw,u32 offset,u16 data)5399c80d176SSepherosa Ziehau static s32 e1000_write_phy_reg_82543(struct e1000_hw *hw, u32 offset, u16 data)
5409c80d176SSepherosa Ziehau {
5419c80d176SSepherosa Ziehau u32 mdic;
5429c80d176SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
5439c80d176SSepherosa Ziehau
5449c80d176SSepherosa Ziehau DEBUGFUNC("e1000_write_phy_reg_82543");
5459c80d176SSepherosa Ziehau
5469c80d176SSepherosa Ziehau if (offset > MAX_PHY_REG_ADDRESS) {
5479c80d176SSepherosa Ziehau DEBUGOUT1("PHY Address %d is out of range\n", offset);
5489c80d176SSepherosa Ziehau ret_val = -E1000_ERR_PARAM;
5499c80d176SSepherosa Ziehau goto out;
5509c80d176SSepherosa Ziehau }
5519c80d176SSepherosa Ziehau
5529c80d176SSepherosa Ziehau /*
5539c80d176SSepherosa Ziehau * We'll need to use the SW defined pins to shift the write command
5549c80d176SSepherosa Ziehau * out to the PHY. We first send a preamble to the PHY to signal the
5559c80d176SSepherosa Ziehau * beginning of the MII instruction. This is done by sending 32
5569c80d176SSepherosa Ziehau * consecutive "1" bits.
5579c80d176SSepherosa Ziehau */
5589c80d176SSepherosa Ziehau e1000_shift_out_mdi_bits_82543(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
5599c80d176SSepherosa Ziehau
5609c80d176SSepherosa Ziehau /*
5619c80d176SSepherosa Ziehau * Now combine the remaining required fields that will indicate a
5629c80d176SSepherosa Ziehau * write operation. We use this method instead of calling the
5639c80d176SSepherosa Ziehau * e1000_shift_out_mdi_bits routine for each field in the command. The
5649c80d176SSepherosa Ziehau * format of a MII write instruction is as follows:
5659c80d176SSepherosa Ziehau * <Preamble><SOF><Op Code><Phy Addr><Reg Addr><Turnaround><Data>.
5669c80d176SSepherosa Ziehau */
5679c80d176SSepherosa Ziehau mdic = ((PHY_TURNAROUND) | (offset << 2) | (hw->phy.addr << 7) |
5689c80d176SSepherosa Ziehau (PHY_OP_WRITE << 12) | (PHY_SOF << 14));
5699c80d176SSepherosa Ziehau mdic <<= 16;
5709c80d176SSepherosa Ziehau mdic |= (u32)data;
5719c80d176SSepherosa Ziehau
5729c80d176SSepherosa Ziehau e1000_shift_out_mdi_bits_82543(hw, mdic, 32);
5739c80d176SSepherosa Ziehau
5749c80d176SSepherosa Ziehau out:
5759c80d176SSepherosa Ziehau return ret_val;
5769c80d176SSepherosa Ziehau }
5779c80d176SSepherosa Ziehau
5789c80d176SSepherosa Ziehau /**
5799c80d176SSepherosa Ziehau * e1000_raise_mdi_clk_82543 - Raise Management Data Input clock
5809c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
5819c80d176SSepherosa Ziehau * @ctrl: pointer to the control register
5829c80d176SSepherosa Ziehau *
5839c80d176SSepherosa Ziehau * Raise the management data input clock by setting the MDC bit in the control
5849c80d176SSepherosa Ziehau * register.
5859c80d176SSepherosa Ziehau **/
e1000_raise_mdi_clk_82543(struct e1000_hw * hw,u32 * ctrl)5869c80d176SSepherosa Ziehau static void e1000_raise_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl)
5879c80d176SSepherosa Ziehau {
5889c80d176SSepherosa Ziehau /*
5899c80d176SSepherosa Ziehau * Raise the clock input to the Management Data Clock (by setting the
5909c80d176SSepherosa Ziehau * MDC bit), and then delay a sufficient amount of time.
5919c80d176SSepherosa Ziehau */
5929c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, (*ctrl | E1000_CTRL_MDC));
5939c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
5949c80d176SSepherosa Ziehau usec_delay(10);
5959c80d176SSepherosa Ziehau }
5969c80d176SSepherosa Ziehau
5979c80d176SSepherosa Ziehau /**
5989c80d176SSepherosa Ziehau * e1000_lower_mdi_clk_82543 - Lower Management Data Input clock
5999c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
6009c80d176SSepherosa Ziehau * @ctrl: pointer to the control register
6019c80d176SSepherosa Ziehau *
6029c80d176SSepherosa Ziehau * Lower the management data input clock by clearing the MDC bit in the
6039c80d176SSepherosa Ziehau * control register.
6049c80d176SSepherosa Ziehau **/
e1000_lower_mdi_clk_82543(struct e1000_hw * hw,u32 * ctrl)6059c80d176SSepherosa Ziehau static void e1000_lower_mdi_clk_82543(struct e1000_hw *hw, u32 *ctrl)
6069c80d176SSepherosa Ziehau {
6079c80d176SSepherosa Ziehau /*
6089c80d176SSepherosa Ziehau * Lower the clock input to the Management Data Clock (by clearing the
6099c80d176SSepherosa Ziehau * MDC bit), and then delay a sufficient amount of time.
6109c80d176SSepherosa Ziehau */
6119c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, (*ctrl & ~E1000_CTRL_MDC));
6129c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
6139c80d176SSepherosa Ziehau usec_delay(10);
6149c80d176SSepherosa Ziehau }
6159c80d176SSepherosa Ziehau
6169c80d176SSepherosa Ziehau /**
6179c80d176SSepherosa Ziehau * e1000_shift_out_mdi_bits_82543 - Shift data bits our to the PHY
6189c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
6199c80d176SSepherosa Ziehau * @data: data to send to the PHY
6209c80d176SSepherosa Ziehau * @count: number of bits to shift out
6219c80d176SSepherosa Ziehau *
6229c80d176SSepherosa Ziehau * We need to shift 'count' bits out to the PHY. So, the value in the
6239c80d176SSepherosa Ziehau * "data" parameter will be shifted out to the PHY one bit at a time.
6249c80d176SSepherosa Ziehau * In order to do this, "data" must be broken down into bits.
6259c80d176SSepherosa Ziehau **/
e1000_shift_out_mdi_bits_82543(struct e1000_hw * hw,u32 data,u16 count)6269c80d176SSepherosa Ziehau static void e1000_shift_out_mdi_bits_82543(struct e1000_hw *hw, u32 data,
6279c80d176SSepherosa Ziehau u16 count)
6289c80d176SSepherosa Ziehau {
6299c80d176SSepherosa Ziehau u32 ctrl, mask;
6309c80d176SSepherosa Ziehau
6319c80d176SSepherosa Ziehau /*
6329c80d176SSepherosa Ziehau * We need to shift "count" number of bits out to the PHY. So, the
6339c80d176SSepherosa Ziehau * value in the "data" parameter will be shifted out to the PHY one
6349c80d176SSepherosa Ziehau * bit at a time. In order to do this, "data" must be broken down
6359c80d176SSepherosa Ziehau * into bits.
6369c80d176SSepherosa Ziehau */
6379c80d176SSepherosa Ziehau mask = 0x01;
6389c80d176SSepherosa Ziehau mask <<= (count - 1);
6399c80d176SSepherosa Ziehau
6409c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
6419c80d176SSepherosa Ziehau
6429c80d176SSepherosa Ziehau /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */
6439c80d176SSepherosa Ziehau ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR);
6449c80d176SSepherosa Ziehau
6459c80d176SSepherosa Ziehau while (mask) {
6469c80d176SSepherosa Ziehau /*
6479c80d176SSepherosa Ziehau * A "1" is shifted out to the PHY by setting the MDIO bit to
6489c80d176SSepherosa Ziehau * "1" and then raising and lowering the Management Data Clock.
6499c80d176SSepherosa Ziehau * A "0" is shifted out to the PHY by setting the MDIO bit to
6509c80d176SSepherosa Ziehau * "0" and then raising and lowering the clock.
6519c80d176SSepherosa Ziehau */
6524be59a01SSepherosa Ziehau if (data & mask)
6534be59a01SSepherosa Ziehau ctrl |= E1000_CTRL_MDIO;
6544be59a01SSepherosa Ziehau else
6554be59a01SSepherosa Ziehau ctrl &= ~E1000_CTRL_MDIO;
6569c80d176SSepherosa Ziehau
6579c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
6589c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
6599c80d176SSepherosa Ziehau
6609c80d176SSepherosa Ziehau usec_delay(10);
6619c80d176SSepherosa Ziehau
6629c80d176SSepherosa Ziehau e1000_raise_mdi_clk_82543(hw, &ctrl);
6639c80d176SSepherosa Ziehau e1000_lower_mdi_clk_82543(hw, &ctrl);
6649c80d176SSepherosa Ziehau
6659c80d176SSepherosa Ziehau mask >>= 1;
6669c80d176SSepherosa Ziehau }
6679c80d176SSepherosa Ziehau }
6689c80d176SSepherosa Ziehau
6699c80d176SSepherosa Ziehau /**
6709c80d176SSepherosa Ziehau * e1000_shift_in_mdi_bits_82543 - Shift data bits in from the PHY
6719c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
6729c80d176SSepherosa Ziehau *
6739c80d176SSepherosa Ziehau * In order to read a register from the PHY, we need to shift 18 bits
6749c80d176SSepherosa Ziehau * in from the PHY. Bits are "shifted in" by raising the clock input to
6759c80d176SSepherosa Ziehau * the PHY (setting the MDC bit), and then reading the value of the data out
6769c80d176SSepherosa Ziehau * MDIO bit.
6779c80d176SSepherosa Ziehau **/
e1000_shift_in_mdi_bits_82543(struct e1000_hw * hw)6789c80d176SSepherosa Ziehau static u16 e1000_shift_in_mdi_bits_82543(struct e1000_hw *hw)
6799c80d176SSepherosa Ziehau {
6809c80d176SSepherosa Ziehau u32 ctrl;
6819c80d176SSepherosa Ziehau u16 data = 0;
6829c80d176SSepherosa Ziehau u8 i;
6839c80d176SSepherosa Ziehau
6849c80d176SSepherosa Ziehau /*
6859c80d176SSepherosa Ziehau * In order to read a register from the PHY, we need to shift in a
6869c80d176SSepherosa Ziehau * total of 18 bits from the PHY. The first two bit (turnaround)
6879c80d176SSepherosa Ziehau * times are used to avoid contention on the MDIO pin when a read
6889c80d176SSepherosa Ziehau * operation is performed. These two bits are ignored by us and
6899c80d176SSepherosa Ziehau * thrown away. Bits are "shifted in" by raising the input to the
6909c80d176SSepherosa Ziehau * Management Data Clock (setting the MDC bit) and then reading the
6919c80d176SSepherosa Ziehau * value of the MDIO bit.
6929c80d176SSepherosa Ziehau */
6939c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
6949c80d176SSepherosa Ziehau
6959c80d176SSepherosa Ziehau /*
6969c80d176SSepherosa Ziehau * Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as
6979c80d176SSepherosa Ziehau * input.
6989c80d176SSepherosa Ziehau */
6999c80d176SSepherosa Ziehau ctrl &= ~E1000_CTRL_MDIO_DIR;
7009c80d176SSepherosa Ziehau ctrl &= ~E1000_CTRL_MDIO;
7019c80d176SSepherosa Ziehau
7029c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
7039c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
7049c80d176SSepherosa Ziehau
7059c80d176SSepherosa Ziehau /*
7069c80d176SSepherosa Ziehau * Raise and lower the clock before reading in the data. This accounts
7079c80d176SSepherosa Ziehau * for the turnaround bits. The first clock occurred when we clocked
7089c80d176SSepherosa Ziehau * out the last bit of the Register Address.
7099c80d176SSepherosa Ziehau */
7109c80d176SSepherosa Ziehau e1000_raise_mdi_clk_82543(hw, &ctrl);
7119c80d176SSepherosa Ziehau e1000_lower_mdi_clk_82543(hw, &ctrl);
7129c80d176SSepherosa Ziehau
7139c80d176SSepherosa Ziehau for (data = 0, i = 0; i < 16; i++) {
7149c80d176SSepherosa Ziehau data <<= 1;
7159c80d176SSepherosa Ziehau e1000_raise_mdi_clk_82543(hw, &ctrl);
7169c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
7179c80d176SSepherosa Ziehau /* Check to see if we shifted in a "1". */
7189c80d176SSepherosa Ziehau if (ctrl & E1000_CTRL_MDIO)
7199c80d176SSepherosa Ziehau data |= 1;
7209c80d176SSepherosa Ziehau e1000_lower_mdi_clk_82543(hw, &ctrl);
7219c80d176SSepherosa Ziehau }
7229c80d176SSepherosa Ziehau
7239c80d176SSepherosa Ziehau e1000_raise_mdi_clk_82543(hw, &ctrl);
7249c80d176SSepherosa Ziehau e1000_lower_mdi_clk_82543(hw, &ctrl);
7259c80d176SSepherosa Ziehau
7269c80d176SSepherosa Ziehau return data;
7279c80d176SSepherosa Ziehau }
7289c80d176SSepherosa Ziehau
7299c80d176SSepherosa Ziehau /**
7309c80d176SSepherosa Ziehau * e1000_phy_force_speed_duplex_82543 - Force speed/duplex for PHY
7319c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
7329c80d176SSepherosa Ziehau *
7339c80d176SSepherosa Ziehau * Calls the function to force speed and duplex for the m88 PHY, and
7349c80d176SSepherosa Ziehau * if the PHY is not auto-negotiating and the speed is forced to 10Mbit,
7359c80d176SSepherosa Ziehau * then call the function for polarity reversal workaround.
7369c80d176SSepherosa Ziehau **/
e1000_phy_force_speed_duplex_82543(struct e1000_hw * hw)7379c80d176SSepherosa Ziehau static s32 e1000_phy_force_speed_duplex_82543(struct e1000_hw *hw)
7389c80d176SSepherosa Ziehau {
7399c80d176SSepherosa Ziehau s32 ret_val;
7409c80d176SSepherosa Ziehau
7419c80d176SSepherosa Ziehau DEBUGFUNC("e1000_phy_force_speed_duplex_82543");
7429c80d176SSepherosa Ziehau
7439c80d176SSepherosa Ziehau ret_val = e1000_phy_force_speed_duplex_m88(hw);
7449c80d176SSepherosa Ziehau if (ret_val)
7459c80d176SSepherosa Ziehau goto out;
7469c80d176SSepherosa Ziehau
7474be59a01SSepherosa Ziehau if (!hw->mac.autoneg && (hw->mac.forced_speed_duplex &
7484be59a01SSepherosa Ziehau E1000_ALL_10_SPEED))
7499c80d176SSepherosa Ziehau ret_val = e1000_polarity_reversal_workaround_82543(hw);
7509c80d176SSepherosa Ziehau
7519c80d176SSepherosa Ziehau out:
7529c80d176SSepherosa Ziehau return ret_val;
7539c80d176SSepherosa Ziehau }
7549c80d176SSepherosa Ziehau
7559c80d176SSepherosa Ziehau /**
7569c80d176SSepherosa Ziehau * e1000_polarity_reversal_workaround_82543 - Workaround polarity reversal
7579c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
7589c80d176SSepherosa Ziehau *
7599c80d176SSepherosa Ziehau * When forcing link to 10 Full or 10 Half, the PHY can reverse the polarity
7609c80d176SSepherosa Ziehau * inadvertently. To workaround the issue, we disable the transmitter on
7619c80d176SSepherosa Ziehau * the PHY until we have established the link partner's link parameters.
7629c80d176SSepherosa Ziehau **/
e1000_polarity_reversal_workaround_82543(struct e1000_hw * hw)7639c80d176SSepherosa Ziehau static s32 e1000_polarity_reversal_workaround_82543(struct e1000_hw *hw)
7649c80d176SSepherosa Ziehau {
7659c80d176SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
7669c80d176SSepherosa Ziehau u16 mii_status_reg;
7679c80d176SSepherosa Ziehau u16 i;
7689c80d176SSepherosa Ziehau bool link;
7699c80d176SSepherosa Ziehau
7709c80d176SSepherosa Ziehau if (!(hw->phy.ops.write_reg))
7719c80d176SSepherosa Ziehau goto out;
7729c80d176SSepherosa Ziehau
7739c80d176SSepherosa Ziehau /* Polarity reversal workaround for forced 10F/10H links. */
7749c80d176SSepherosa Ziehau
7759c80d176SSepherosa Ziehau /* Disable the transmitter on the PHY */
7769c80d176SSepherosa Ziehau
7779c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
7789c80d176SSepherosa Ziehau if (ret_val)
7799c80d176SSepherosa Ziehau goto out;
7809c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFFF);
7819c80d176SSepherosa Ziehau if (ret_val)
7829c80d176SSepherosa Ziehau goto out;
7839c80d176SSepherosa Ziehau
7849c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000);
7859c80d176SSepherosa Ziehau if (ret_val)
7869c80d176SSepherosa Ziehau goto out;
7879c80d176SSepherosa Ziehau
7889c80d176SSepherosa Ziehau /*
7899c80d176SSepherosa Ziehau * This loop will early-out if the NO link condition has been met.
7909c80d176SSepherosa Ziehau * In other words, DO NOT use e1000_phy_has_link_generic() here.
7919c80d176SSepherosa Ziehau */
7929c80d176SSepherosa Ziehau for (i = PHY_FORCE_TIME; i > 0; i--) {
7939c80d176SSepherosa Ziehau /*
7949c80d176SSepherosa Ziehau * Read the MII Status Register and wait for Link Status bit
7959c80d176SSepherosa Ziehau * to be clear.
7969c80d176SSepherosa Ziehau */
7979c80d176SSepherosa Ziehau
7989c80d176SSepherosa Ziehau ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
7999c80d176SSepherosa Ziehau if (ret_val)
8009c80d176SSepherosa Ziehau goto out;
8019c80d176SSepherosa Ziehau
8029c80d176SSepherosa Ziehau ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
8039c80d176SSepherosa Ziehau if (ret_val)
8049c80d176SSepherosa Ziehau goto out;
8059c80d176SSepherosa Ziehau
806379ebbe7SSepherosa Ziehau if (!(mii_status_reg & ~MII_SR_LINK_STATUS))
8079c80d176SSepherosa Ziehau break;
8089c80d176SSepherosa Ziehau msec_delay_irq(100);
8099c80d176SSepherosa Ziehau }
8109c80d176SSepherosa Ziehau
8119c80d176SSepherosa Ziehau /* Recommended delay time after link has been lost */
8129c80d176SSepherosa Ziehau msec_delay_irq(1000);
8139c80d176SSepherosa Ziehau
8149c80d176SSepherosa Ziehau /* Now we will re-enable the transmitter on the PHY */
8159c80d176SSepherosa Ziehau
8169c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0019);
8179c80d176SSepherosa Ziehau if (ret_val)
8189c80d176SSepherosa Ziehau goto out;
8199c80d176SSepherosa Ziehau msec_delay_irq(50);
8209c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFFF0);
8219c80d176SSepherosa Ziehau if (ret_val)
8229c80d176SSepherosa Ziehau goto out;
8239c80d176SSepherosa Ziehau msec_delay_irq(50);
8249c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0xFF00);
8259c80d176SSepherosa Ziehau if (ret_val)
8269c80d176SSepherosa Ziehau goto out;
8279c80d176SSepherosa Ziehau msec_delay_irq(50);
8289c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, 0x0000);
8299c80d176SSepherosa Ziehau if (ret_val)
8309c80d176SSepherosa Ziehau goto out;
8319c80d176SSepherosa Ziehau
8329c80d176SSepherosa Ziehau ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0000);
8339c80d176SSepherosa Ziehau if (ret_val)
8349c80d176SSepherosa Ziehau goto out;
8359c80d176SSepherosa Ziehau
8369c80d176SSepherosa Ziehau /*
8379c80d176SSepherosa Ziehau * Read the MII Status Register and wait for Link Status bit
8389c80d176SSepherosa Ziehau * to be set.
8399c80d176SSepherosa Ziehau */
8409c80d176SSepherosa Ziehau ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_TIME, 100000, &link);
8419c80d176SSepherosa Ziehau if (ret_val)
8429c80d176SSepherosa Ziehau goto out;
8439c80d176SSepherosa Ziehau
8449c80d176SSepherosa Ziehau out:
8459c80d176SSepherosa Ziehau return ret_val;
8469c80d176SSepherosa Ziehau }
8479c80d176SSepherosa Ziehau
8489c80d176SSepherosa Ziehau /**
8499c80d176SSepherosa Ziehau * e1000_phy_hw_reset_82543 - PHY hardware reset
8509c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
8519c80d176SSepherosa Ziehau *
8529c80d176SSepherosa Ziehau * Sets the PHY_RESET_DIR bit in the extended device control register
8539c80d176SSepherosa Ziehau * to put the PHY into a reset and waits for completion. Once the reset
8549c80d176SSepherosa Ziehau * has been accomplished, clear the PHY_RESET_DIR bit to take the PHY out
8559c80d176SSepherosa Ziehau * of reset.
8569c80d176SSepherosa Ziehau **/
e1000_phy_hw_reset_82543(struct e1000_hw * hw)8579c80d176SSepherosa Ziehau static s32 e1000_phy_hw_reset_82543(struct e1000_hw *hw)
8589c80d176SSepherosa Ziehau {
8599c80d176SSepherosa Ziehau u32 ctrl_ext;
8609c80d176SSepherosa Ziehau s32 ret_val;
8619c80d176SSepherosa Ziehau
8629c80d176SSepherosa Ziehau DEBUGFUNC("e1000_phy_hw_reset_82543");
8639c80d176SSepherosa Ziehau
8649c80d176SSepherosa Ziehau /*
8659c80d176SSepherosa Ziehau * Read the Extended Device Control Register, assert the PHY_RESET_DIR
8669c80d176SSepherosa Ziehau * bit to put the PHY into reset...
8679c80d176SSepherosa Ziehau */
8689c80d176SSepherosa Ziehau ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
8699c80d176SSepherosa Ziehau ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR;
8709c80d176SSepherosa Ziehau ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA;
8719c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
8729c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
8739c80d176SSepherosa Ziehau
8749c80d176SSepherosa Ziehau msec_delay(10);
8759c80d176SSepherosa Ziehau
8769c80d176SSepherosa Ziehau /* ...then take it out of reset. */
8779c80d176SSepherosa Ziehau ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA;
8789c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
8799c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
8809c80d176SSepherosa Ziehau
8819c80d176SSepherosa Ziehau usec_delay(150);
8829c80d176SSepherosa Ziehau
8839c80d176SSepherosa Ziehau if (!(hw->phy.ops.get_cfg_done))
8849c80d176SSepherosa Ziehau return E1000_SUCCESS;
8859c80d176SSepherosa Ziehau
8869c80d176SSepherosa Ziehau ret_val = hw->phy.ops.get_cfg_done(hw);
8879c80d176SSepherosa Ziehau
8889c80d176SSepherosa Ziehau return ret_val;
8899c80d176SSepherosa Ziehau }
8909c80d176SSepherosa Ziehau
8919c80d176SSepherosa Ziehau /**
8929c80d176SSepherosa Ziehau * e1000_reset_hw_82543 - Reset hardware
8939c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
8949c80d176SSepherosa Ziehau *
8959c80d176SSepherosa Ziehau * This resets the hardware into a known state.
8969c80d176SSepherosa Ziehau **/
e1000_reset_hw_82543(struct e1000_hw * hw)8979c80d176SSepherosa Ziehau static s32 e1000_reset_hw_82543(struct e1000_hw *hw)
8989c80d176SSepherosa Ziehau {
8996d5e2922SSepherosa Ziehau u32 ctrl;
9009c80d176SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
9019c80d176SSepherosa Ziehau
9029c80d176SSepherosa Ziehau DEBUGFUNC("e1000_reset_hw_82543");
9039c80d176SSepherosa Ziehau
9049c80d176SSepherosa Ziehau DEBUGOUT("Masking off all interrupts\n");
9059c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
9069c80d176SSepherosa Ziehau
9079c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_RCTL, 0);
9089c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP);
9099c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
9109c80d176SSepherosa Ziehau
9119c80d176SSepherosa Ziehau e1000_set_tbi_sbp_82543(hw, FALSE);
9129c80d176SSepherosa Ziehau
9139c80d176SSepherosa Ziehau /*
9149c80d176SSepherosa Ziehau * Delay to allow any outstanding PCI transactions to complete before
9159c80d176SSepherosa Ziehau * resetting the device
9169c80d176SSepherosa Ziehau */
9179c80d176SSepherosa Ziehau msec_delay(10);
9189c80d176SSepherosa Ziehau
9199c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
9209c80d176SSepherosa Ziehau
9219c80d176SSepherosa Ziehau DEBUGOUT("Issuing a global reset to 82543/82544 MAC\n");
9229c80d176SSepherosa Ziehau if (hw->mac.type == e1000_82543) {
9239c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
9249c80d176SSepherosa Ziehau } else {
9259c80d176SSepherosa Ziehau /*
9269c80d176SSepherosa Ziehau * The 82544 can't ACK the 64-bit write when issuing the
9279c80d176SSepherosa Ziehau * reset, so use IO-mapping as a workaround.
9289c80d176SSepherosa Ziehau */
9299c80d176SSepherosa Ziehau E1000_WRITE_REG_IO(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
9309c80d176SSepherosa Ziehau }
9319c80d176SSepherosa Ziehau
9329c80d176SSepherosa Ziehau /*
9339c80d176SSepherosa Ziehau * After MAC reset, force reload of NVM to restore power-on
9349c80d176SSepherosa Ziehau * settings to device.
9359c80d176SSepherosa Ziehau */
9369c80d176SSepherosa Ziehau hw->nvm.ops.reload(hw);
9379c80d176SSepherosa Ziehau msec_delay(2);
9389c80d176SSepherosa Ziehau
9399c80d176SSepherosa Ziehau /* Masking off and clearing any pending interrupts */
9409c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
9416d5e2922SSepherosa Ziehau E1000_READ_REG(hw, E1000_ICR);
9429c80d176SSepherosa Ziehau
9439c80d176SSepherosa Ziehau return ret_val;
9449c80d176SSepherosa Ziehau }
9459c80d176SSepherosa Ziehau
9469c80d176SSepherosa Ziehau /**
9479c80d176SSepherosa Ziehau * e1000_init_hw_82543 - Initialize hardware
9489c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
9499c80d176SSepherosa Ziehau *
9509c80d176SSepherosa Ziehau * This inits the hardware readying it for operation.
9519c80d176SSepherosa Ziehau **/
e1000_init_hw_82543(struct e1000_hw * hw)9529c80d176SSepherosa Ziehau static s32 e1000_init_hw_82543(struct e1000_hw *hw)
9539c80d176SSepherosa Ziehau {
9549c80d176SSepherosa Ziehau struct e1000_mac_info *mac = &hw->mac;
9559c80d176SSepherosa Ziehau struct e1000_dev_spec_82543 *dev_spec = &hw->dev_spec._82543;
9569c80d176SSepherosa Ziehau u32 ctrl;
9579c80d176SSepherosa Ziehau s32 ret_val;
9589c80d176SSepherosa Ziehau u16 i;
9599c80d176SSepherosa Ziehau
9609c80d176SSepherosa Ziehau DEBUGFUNC("e1000_init_hw_82543");
9619c80d176SSepherosa Ziehau
9629c80d176SSepherosa Ziehau /* Disabling VLAN filtering */
9639c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_VET, 0);
9649c80d176SSepherosa Ziehau mac->ops.clear_vfta(hw);
9659c80d176SSepherosa Ziehau
9669c80d176SSepherosa Ziehau /* Setup the receive address. */
9679c80d176SSepherosa Ziehau e1000_init_rx_addrs_generic(hw, mac->rar_entry_count);
9689c80d176SSepherosa Ziehau
9699c80d176SSepherosa Ziehau /* Zero out the Multicast HASH table */
9709c80d176SSepherosa Ziehau DEBUGOUT("Zeroing the MTA\n");
9719c80d176SSepherosa Ziehau for (i = 0; i < mac->mta_reg_count; i++) {
9729c80d176SSepherosa Ziehau E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
9739c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
9749c80d176SSepherosa Ziehau }
9759c80d176SSepherosa Ziehau
9769c80d176SSepherosa Ziehau /*
9779c80d176SSepherosa Ziehau * Set the PCI priority bit correctly in the CTRL register. This
9789c80d176SSepherosa Ziehau * determines if the adapter gives priority to receives, or if it
9799c80d176SSepherosa Ziehau * gives equal priority to transmits and receives.
9809c80d176SSepherosa Ziehau */
9819c80d176SSepherosa Ziehau if (hw->mac.type == e1000_82543 && dev_spec->dma_fairness) {
9829c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
9839c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_PRIOR);
9849c80d176SSepherosa Ziehau }
9859c80d176SSepherosa Ziehau
9869c80d176SSepherosa Ziehau e1000_pcix_mmrbc_workaround_generic(hw);
9879c80d176SSepherosa Ziehau
9889c80d176SSepherosa Ziehau /* Setup link and flow control */
9899c80d176SSepherosa Ziehau ret_val = mac->ops.setup_link(hw);
9909c80d176SSepherosa Ziehau
9919c80d176SSepherosa Ziehau /*
9929c80d176SSepherosa Ziehau * Clear all of the statistics registers (clear on read). It is
9939c80d176SSepherosa Ziehau * important that we do this after we have tried to establish link
9949c80d176SSepherosa Ziehau * because the symbol error count will increment wildly if there
9959c80d176SSepherosa Ziehau * is no link.
9969c80d176SSepherosa Ziehau */
9979c80d176SSepherosa Ziehau e1000_clear_hw_cntrs_82543(hw);
9989c80d176SSepherosa Ziehau
9999c80d176SSepherosa Ziehau return ret_val;
10009c80d176SSepherosa Ziehau }
10019c80d176SSepherosa Ziehau
10029c80d176SSepherosa Ziehau /**
10039c80d176SSepherosa Ziehau * e1000_setup_link_82543 - Setup flow control and link settings
10049c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
10059c80d176SSepherosa Ziehau *
10069c80d176SSepherosa Ziehau * Read the EEPROM to determine the initial polarity value and write the
10079c80d176SSepherosa Ziehau * extended device control register with the information before calling
10089c80d176SSepherosa Ziehau * the generic setup link function, which does the following:
10099c80d176SSepherosa Ziehau * Determines which flow control settings to use, then configures flow
10109c80d176SSepherosa Ziehau * control. Calls the appropriate media-specific link configuration
10119c80d176SSepherosa Ziehau * function. Assuming the adapter has a valid link partner, a valid link
10129c80d176SSepherosa Ziehau * should be established. Assumes the hardware has previously been reset
10139c80d176SSepherosa Ziehau * and the transmitter and receiver are not enabled.
10149c80d176SSepherosa Ziehau **/
e1000_setup_link_82543(struct e1000_hw * hw)10159c80d176SSepherosa Ziehau static s32 e1000_setup_link_82543(struct e1000_hw *hw)
10169c80d176SSepherosa Ziehau {
10179c80d176SSepherosa Ziehau u32 ctrl_ext;
10189c80d176SSepherosa Ziehau s32 ret_val;
10199c80d176SSepherosa Ziehau u16 data;
10209c80d176SSepherosa Ziehau
10219c80d176SSepherosa Ziehau DEBUGFUNC("e1000_setup_link_82543");
10229c80d176SSepherosa Ziehau
10239c80d176SSepherosa Ziehau /*
10249c80d176SSepherosa Ziehau * Take the 4 bits from NVM word 0xF that determine the initial
10259c80d176SSepherosa Ziehau * polarity value for the SW controlled pins, and setup the
10269c80d176SSepherosa Ziehau * Extended Device Control reg with that info.
10279c80d176SSepherosa Ziehau * This is needed because one of the SW controlled pins is used for
10289c80d176SSepherosa Ziehau * signal detection. So this should be done before phy setup.
10299c80d176SSepherosa Ziehau */
10309c80d176SSepherosa Ziehau if (hw->mac.type == e1000_82543) {
10319c80d176SSepherosa Ziehau ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &data);
10329c80d176SSepherosa Ziehau if (ret_val) {
10339c80d176SSepherosa Ziehau DEBUGOUT("NVM Read Error\n");
10349c80d176SSepherosa Ziehau ret_val = -E1000_ERR_NVM;
10359c80d176SSepherosa Ziehau goto out;
10369c80d176SSepherosa Ziehau }
10379c80d176SSepherosa Ziehau ctrl_ext = ((data & NVM_WORD0F_SWPDIO_EXT_MASK) <<
10389c80d176SSepherosa Ziehau NVM_SWDPIO_EXT_SHIFT);
10399c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
10409c80d176SSepherosa Ziehau }
10419c80d176SSepherosa Ziehau
10429c80d176SSepherosa Ziehau ret_val = e1000_setup_link_generic(hw);
10439c80d176SSepherosa Ziehau
10449c80d176SSepherosa Ziehau out:
10459c80d176SSepherosa Ziehau return ret_val;
10469c80d176SSepherosa Ziehau }
10479c80d176SSepherosa Ziehau
10489c80d176SSepherosa Ziehau /**
10499c80d176SSepherosa Ziehau * e1000_setup_copper_link_82543 - Configure copper link settings
10509c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
10519c80d176SSepherosa Ziehau *
10529c80d176SSepherosa Ziehau * Configures the link for auto-neg or forced speed and duplex. Then we check
10539c80d176SSepherosa Ziehau * for link, once link is established calls to configure collision distance
10549c80d176SSepherosa Ziehau * and flow control are called.
10559c80d176SSepherosa Ziehau **/
e1000_setup_copper_link_82543(struct e1000_hw * hw)10569c80d176SSepherosa Ziehau static s32 e1000_setup_copper_link_82543(struct e1000_hw *hw)
10579c80d176SSepherosa Ziehau {
10589c80d176SSepherosa Ziehau u32 ctrl;
10599c80d176SSepherosa Ziehau s32 ret_val;
10609c80d176SSepherosa Ziehau bool link;
10619c80d176SSepherosa Ziehau
10629c80d176SSepherosa Ziehau DEBUGFUNC("e1000_setup_copper_link_82543");
10639c80d176SSepherosa Ziehau
10649c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL) | E1000_CTRL_SLU;
10659c80d176SSepherosa Ziehau /*
10669c80d176SSepherosa Ziehau * With 82543, we need to force speed and duplex on the MAC
10679c80d176SSepherosa Ziehau * equal to what the PHY speed and duplex configuration is.
10689c80d176SSepherosa Ziehau * In addition, we need to perform a hardware reset on the
10699c80d176SSepherosa Ziehau * PHY to take it out of reset.
10709c80d176SSepherosa Ziehau */
10719c80d176SSepherosa Ziehau if (hw->mac.type == e1000_82543) {
10729c80d176SSepherosa Ziehau ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
10739c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
10749c80d176SSepherosa Ziehau ret_val = hw->phy.ops.reset(hw);
10759c80d176SSepherosa Ziehau if (ret_val)
10769c80d176SSepherosa Ziehau goto out;
10779c80d176SSepherosa Ziehau } else {
10789c80d176SSepherosa Ziehau ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
10799c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
10809c80d176SSepherosa Ziehau }
10819c80d176SSepherosa Ziehau
10829c80d176SSepherosa Ziehau /* Set MDI/MDI-X, Polarity Reversal, and downshift settings */
10839c80d176SSepherosa Ziehau ret_val = e1000_copper_link_setup_m88(hw);
10849c80d176SSepherosa Ziehau if (ret_val)
10859c80d176SSepherosa Ziehau goto out;
10869c80d176SSepherosa Ziehau
10879c80d176SSepherosa Ziehau if (hw->mac.autoneg) {
10889c80d176SSepherosa Ziehau /*
10899c80d176SSepherosa Ziehau * Setup autoneg and flow control advertisement and perform
10909c80d176SSepherosa Ziehau * autonegotiation.
10919c80d176SSepherosa Ziehau */
10929c80d176SSepherosa Ziehau ret_val = e1000_copper_link_autoneg(hw);
10939c80d176SSepherosa Ziehau if (ret_val)
10949c80d176SSepherosa Ziehau goto out;
10959c80d176SSepherosa Ziehau } else {
10969c80d176SSepherosa Ziehau /*
10979c80d176SSepherosa Ziehau * PHY will be set to 10H, 10F, 100H or 100F
10989c80d176SSepherosa Ziehau * depending on user settings.
10999c80d176SSepherosa Ziehau */
11009c80d176SSepherosa Ziehau DEBUGOUT("Forcing Speed and Duplex\n");
11019c80d176SSepherosa Ziehau ret_val = e1000_phy_force_speed_duplex_82543(hw);
11029c80d176SSepherosa Ziehau if (ret_val) {
11039c80d176SSepherosa Ziehau DEBUGOUT("Error Forcing Speed and Duplex\n");
11049c80d176SSepherosa Ziehau goto out;
11059c80d176SSepherosa Ziehau }
11069c80d176SSepherosa Ziehau }
11079c80d176SSepherosa Ziehau
11089c80d176SSepherosa Ziehau /*
11099c80d176SSepherosa Ziehau * Check link status. Wait up to 100 microseconds for link to become
11109c80d176SSepherosa Ziehau * valid.
11119c80d176SSepherosa Ziehau */
11124be59a01SSepherosa Ziehau ret_val = e1000_phy_has_link_generic(hw, COPPER_LINK_UP_LIMIT, 10,
11139c80d176SSepherosa Ziehau &link);
11149c80d176SSepherosa Ziehau if (ret_val)
11159c80d176SSepherosa Ziehau goto out;
11169c80d176SSepherosa Ziehau
11179c80d176SSepherosa Ziehau
11189c80d176SSepherosa Ziehau if (link) {
11199c80d176SSepherosa Ziehau DEBUGOUT("Valid link established!!!\n");
11209c80d176SSepherosa Ziehau /* Config the MAC and PHY after link is up */
11219c80d176SSepherosa Ziehau if (hw->mac.type == e1000_82544) {
11224be59a01SSepherosa Ziehau hw->mac.ops.config_collision_dist(hw);
11239c80d176SSepherosa Ziehau } else {
11249c80d176SSepherosa Ziehau ret_val = e1000_config_mac_to_phy_82543(hw);
11259c80d176SSepherosa Ziehau if (ret_val)
11269c80d176SSepherosa Ziehau goto out;
11279c80d176SSepherosa Ziehau }
11289c80d176SSepherosa Ziehau ret_val = e1000_config_fc_after_link_up_generic(hw);
11299c80d176SSepherosa Ziehau } else {
11309c80d176SSepherosa Ziehau DEBUGOUT("Unable to establish link!!!\n");
11319c80d176SSepherosa Ziehau }
11329c80d176SSepherosa Ziehau
11339c80d176SSepherosa Ziehau out:
11349c80d176SSepherosa Ziehau return ret_val;
11359c80d176SSepherosa Ziehau }
11369c80d176SSepherosa Ziehau
11379c80d176SSepherosa Ziehau /**
11389c80d176SSepherosa Ziehau * e1000_setup_fiber_link_82543 - Setup link for fiber
11399c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
11409c80d176SSepherosa Ziehau *
11419c80d176SSepherosa Ziehau * Configures collision distance and flow control for fiber links. Upon
11429c80d176SSepherosa Ziehau * successful setup, poll for link.
11439c80d176SSepherosa Ziehau **/
e1000_setup_fiber_link_82543(struct e1000_hw * hw)11449c80d176SSepherosa Ziehau static s32 e1000_setup_fiber_link_82543(struct e1000_hw *hw)
11459c80d176SSepherosa Ziehau {
11469c80d176SSepherosa Ziehau u32 ctrl;
11479c80d176SSepherosa Ziehau s32 ret_val;
11489c80d176SSepherosa Ziehau
11499c80d176SSepherosa Ziehau DEBUGFUNC("e1000_setup_fiber_link_82543");
11509c80d176SSepherosa Ziehau
11519c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
11529c80d176SSepherosa Ziehau
11539c80d176SSepherosa Ziehau /* Take the link out of reset */
11549c80d176SSepherosa Ziehau ctrl &= ~E1000_CTRL_LRST;
11559c80d176SSepherosa Ziehau
11564be59a01SSepherosa Ziehau hw->mac.ops.config_collision_dist(hw);
11579c80d176SSepherosa Ziehau
11589c80d176SSepherosa Ziehau ret_val = e1000_commit_fc_settings_generic(hw);
11599c80d176SSepherosa Ziehau if (ret_val)
11609c80d176SSepherosa Ziehau goto out;
11619c80d176SSepherosa Ziehau
11629c80d176SSepherosa Ziehau DEBUGOUT("Auto-negotiation enabled\n");
11639c80d176SSepherosa Ziehau
11649c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
11659c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
11669c80d176SSepherosa Ziehau msec_delay(1);
11679c80d176SSepherosa Ziehau
11689c80d176SSepherosa Ziehau /*
11699c80d176SSepherosa Ziehau * For these adapters, the SW definable pin 1 is cleared when the
11709c80d176SSepherosa Ziehau * optics detect a signal. If we have a signal, then poll for a
11719c80d176SSepherosa Ziehau * "Link-Up" indication.
11729c80d176SSepherosa Ziehau */
11734be59a01SSepherosa Ziehau if (!(E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1))
11749c80d176SSepherosa Ziehau ret_val = e1000_poll_fiber_serdes_link_generic(hw);
11754be59a01SSepherosa Ziehau else
11769c80d176SSepherosa Ziehau DEBUGOUT("No signal detected\n");
11779c80d176SSepherosa Ziehau
11789c80d176SSepherosa Ziehau out:
11799c80d176SSepherosa Ziehau return ret_val;
11809c80d176SSepherosa Ziehau }
11819c80d176SSepherosa Ziehau
11829c80d176SSepherosa Ziehau /**
11839c80d176SSepherosa Ziehau * e1000_check_for_copper_link_82543 - Check for link (Copper)
11849c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
11859c80d176SSepherosa Ziehau *
11869c80d176SSepherosa Ziehau * Checks the phy for link, if link exists, do the following:
11879c80d176SSepherosa Ziehau * - check for downshift
11889c80d176SSepherosa Ziehau * - do polarity workaround (if necessary)
11899c80d176SSepherosa Ziehau * - configure collision distance
11909c80d176SSepherosa Ziehau * - configure flow control after link up
11919c80d176SSepherosa Ziehau * - configure tbi compatibility
11929c80d176SSepherosa Ziehau **/
e1000_check_for_copper_link_82543(struct e1000_hw * hw)11939c80d176SSepherosa Ziehau static s32 e1000_check_for_copper_link_82543(struct e1000_hw *hw)
11949c80d176SSepherosa Ziehau {
11959c80d176SSepherosa Ziehau struct e1000_mac_info *mac = &hw->mac;
11969c80d176SSepherosa Ziehau u32 icr, rctl;
11979c80d176SSepherosa Ziehau s32 ret_val;
11989c80d176SSepherosa Ziehau u16 speed, duplex;
11999c80d176SSepherosa Ziehau bool link;
12009c80d176SSepherosa Ziehau
12019c80d176SSepherosa Ziehau DEBUGFUNC("e1000_check_for_copper_link_82543");
12029c80d176SSepherosa Ziehau
12039c80d176SSepherosa Ziehau if (!mac->get_link_status) {
12049c80d176SSepherosa Ziehau ret_val = E1000_SUCCESS;
12059c80d176SSepherosa Ziehau goto out;
12069c80d176SSepherosa Ziehau }
12079c80d176SSepherosa Ziehau
12089c80d176SSepherosa Ziehau ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link);
12099c80d176SSepherosa Ziehau if (ret_val)
12109c80d176SSepherosa Ziehau goto out;
12119c80d176SSepherosa Ziehau
12129c80d176SSepherosa Ziehau if (!link)
12139c80d176SSepherosa Ziehau goto out; /* No link detected */
12149c80d176SSepherosa Ziehau
12159c80d176SSepherosa Ziehau mac->get_link_status = FALSE;
12169c80d176SSepherosa Ziehau
12179c80d176SSepherosa Ziehau e1000_check_downshift_generic(hw);
12189c80d176SSepherosa Ziehau
12199c80d176SSepherosa Ziehau /*
12209c80d176SSepherosa Ziehau * If we are forcing speed/duplex, then we can return since
12219c80d176SSepherosa Ziehau * we have already determined whether we have link or not.
12229c80d176SSepherosa Ziehau */
12239c80d176SSepherosa Ziehau if (!mac->autoneg) {
12249c80d176SSepherosa Ziehau /*
12259c80d176SSepherosa Ziehau * If speed and duplex are forced to 10H or 10F, then we will
12269c80d176SSepherosa Ziehau * implement the polarity reversal workaround. We disable
12279c80d176SSepherosa Ziehau * interrupts first, and upon returning, place the devices
12289c80d176SSepherosa Ziehau * interrupt state to its previous value except for the link
12299c80d176SSepherosa Ziehau * status change interrupt which will happened due to the
12309c80d176SSepherosa Ziehau * execution of this workaround.
12319c80d176SSepherosa Ziehau */
12329c80d176SSepherosa Ziehau if (mac->forced_speed_duplex & E1000_ALL_10_SPEED) {
12339c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_IMC, 0xFFFFFFFF);
12349c80d176SSepherosa Ziehau ret_val = e1000_polarity_reversal_workaround_82543(hw);
12359c80d176SSepherosa Ziehau icr = E1000_READ_REG(hw, E1000_ICR);
12369c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_ICS, (icr & ~E1000_ICS_LSC));
12379c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_IMS, IMS_ENABLE_MASK);
12389c80d176SSepherosa Ziehau }
12399c80d176SSepherosa Ziehau
12409c80d176SSepherosa Ziehau ret_val = -E1000_ERR_CONFIG;
12419c80d176SSepherosa Ziehau goto out;
12429c80d176SSepherosa Ziehau }
12439c80d176SSepherosa Ziehau
12449c80d176SSepherosa Ziehau /*
12459c80d176SSepherosa Ziehau * We have a M88E1000 PHY and Auto-Neg is enabled. If we
12469c80d176SSepherosa Ziehau * have Si on board that is 82544 or newer, Auto
12479c80d176SSepherosa Ziehau * Speed Detection takes care of MAC speed/duplex
12489c80d176SSepherosa Ziehau * configuration. So we only need to configure Collision
12499c80d176SSepherosa Ziehau * Distance in the MAC. Otherwise, we need to force
12509c80d176SSepherosa Ziehau * speed/duplex on the MAC to the current PHY speed/duplex
12519c80d176SSepherosa Ziehau * settings.
12529c80d176SSepherosa Ziehau */
12539c80d176SSepherosa Ziehau if (mac->type == e1000_82544)
12544be59a01SSepherosa Ziehau hw->mac.ops.config_collision_dist(hw);
12559c80d176SSepherosa Ziehau else {
12569c80d176SSepherosa Ziehau ret_val = e1000_config_mac_to_phy_82543(hw);
12579c80d176SSepherosa Ziehau if (ret_val) {
12589c80d176SSepherosa Ziehau DEBUGOUT("Error configuring MAC to PHY settings\n");
12599c80d176SSepherosa Ziehau goto out;
12609c80d176SSepherosa Ziehau }
12619c80d176SSepherosa Ziehau }
12629c80d176SSepherosa Ziehau
12639c80d176SSepherosa Ziehau /*
12649c80d176SSepherosa Ziehau * Configure Flow Control now that Auto-Neg has completed.
12659c80d176SSepherosa Ziehau * First, we need to restore the desired flow control
12669c80d176SSepherosa Ziehau * settings because we may have had to re-autoneg with a
12679c80d176SSepherosa Ziehau * different link partner.
12689c80d176SSepherosa Ziehau */
12699c80d176SSepherosa Ziehau ret_val = e1000_config_fc_after_link_up_generic(hw);
12704be59a01SSepherosa Ziehau if (ret_val)
12719c80d176SSepherosa Ziehau DEBUGOUT("Error configuring flow control\n");
12729c80d176SSepherosa Ziehau
12739c80d176SSepherosa Ziehau /*
12749c80d176SSepherosa Ziehau * At this point we know that we are on copper and we have
12759c80d176SSepherosa Ziehau * auto-negotiated link. These are conditions for checking the link
12769c80d176SSepherosa Ziehau * partner capability register. We use the link speed to determine if
12779c80d176SSepherosa Ziehau * TBI compatibility needs to be turned on or off. If the link is not
12789c80d176SSepherosa Ziehau * at gigabit speed, then TBI compatibility is not needed. If we are
12799c80d176SSepherosa Ziehau * at gigabit speed, we turn on TBI compatibility.
12809c80d176SSepherosa Ziehau */
12819c80d176SSepherosa Ziehau if (e1000_tbi_compatibility_enabled_82543(hw)) {
12829c80d176SSepherosa Ziehau ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex);
12839c80d176SSepherosa Ziehau if (ret_val) {
12849c80d176SSepherosa Ziehau DEBUGOUT("Error getting link speed and duplex\n");
12859c80d176SSepherosa Ziehau return ret_val;
12869c80d176SSepherosa Ziehau }
12879c80d176SSepherosa Ziehau if (speed != SPEED_1000) {
12889c80d176SSepherosa Ziehau /*
12899c80d176SSepherosa Ziehau * If link speed is not set to gigabit speed,
12909c80d176SSepherosa Ziehau * we do not need to enable TBI compatibility.
12919c80d176SSepherosa Ziehau */
12929c80d176SSepherosa Ziehau if (e1000_tbi_sbp_enabled_82543(hw)) {
12939c80d176SSepherosa Ziehau /*
12949c80d176SSepherosa Ziehau * If we previously were in the mode,
12959c80d176SSepherosa Ziehau * turn it off.
12969c80d176SSepherosa Ziehau */
12979c80d176SSepherosa Ziehau e1000_set_tbi_sbp_82543(hw, FALSE);
12989c80d176SSepherosa Ziehau rctl = E1000_READ_REG(hw, E1000_RCTL);
12999c80d176SSepherosa Ziehau rctl &= ~E1000_RCTL_SBP;
13009c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_RCTL, rctl);
13019c80d176SSepherosa Ziehau }
13029c80d176SSepherosa Ziehau } else {
13039c80d176SSepherosa Ziehau /*
13049c80d176SSepherosa Ziehau * If TBI compatibility is was previously off,
13059c80d176SSepherosa Ziehau * turn it on. For compatibility with a TBI link
13069c80d176SSepherosa Ziehau * partner, we will store bad packets. Some
13079c80d176SSepherosa Ziehau * frames have an additional byte on the end and
13089c80d176SSepherosa Ziehau * will look like CRC errors to to the hardware.
13099c80d176SSepherosa Ziehau */
13109c80d176SSepherosa Ziehau if (!e1000_tbi_sbp_enabled_82543(hw)) {
13119c80d176SSepherosa Ziehau e1000_set_tbi_sbp_82543(hw, TRUE);
13129c80d176SSepherosa Ziehau rctl = E1000_READ_REG(hw, E1000_RCTL);
13139c80d176SSepherosa Ziehau rctl |= E1000_RCTL_SBP;
13149c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_RCTL, rctl);
13159c80d176SSepherosa Ziehau }
13169c80d176SSepherosa Ziehau }
13179c80d176SSepherosa Ziehau }
13189c80d176SSepherosa Ziehau out:
13199c80d176SSepherosa Ziehau return ret_val;
13209c80d176SSepherosa Ziehau }
13219c80d176SSepherosa Ziehau
13229c80d176SSepherosa Ziehau /**
13239c80d176SSepherosa Ziehau * e1000_check_for_fiber_link_82543 - Check for link (Fiber)
13249c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
13259c80d176SSepherosa Ziehau *
13269c80d176SSepherosa Ziehau * Checks for link up on the hardware. If link is not up and we have
13279c80d176SSepherosa Ziehau * a signal, then we need to force link up.
13289c80d176SSepherosa Ziehau **/
e1000_check_for_fiber_link_82543(struct e1000_hw * hw)13299c80d176SSepherosa Ziehau static s32 e1000_check_for_fiber_link_82543(struct e1000_hw *hw)
13309c80d176SSepherosa Ziehau {
13319c80d176SSepherosa Ziehau struct e1000_mac_info *mac = &hw->mac;
13329c80d176SSepherosa Ziehau u32 rxcw, ctrl, status;
13339c80d176SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
13349c80d176SSepherosa Ziehau
13359c80d176SSepherosa Ziehau DEBUGFUNC("e1000_check_for_fiber_link_82543");
13369c80d176SSepherosa Ziehau
13379c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
13389c80d176SSepherosa Ziehau status = E1000_READ_REG(hw, E1000_STATUS);
13399c80d176SSepherosa Ziehau rxcw = E1000_READ_REG(hw, E1000_RXCW);
13409c80d176SSepherosa Ziehau
13419c80d176SSepherosa Ziehau /*
13429c80d176SSepherosa Ziehau * If we don't have link (auto-negotiation failed or link partner
13439c80d176SSepherosa Ziehau * cannot auto-negotiate), the cable is plugged in (we have signal),
13449c80d176SSepherosa Ziehau * and our link partner is not trying to auto-negotiate with us (we
13459c80d176SSepherosa Ziehau * are receiving idles or data), we need to force link up. We also
13469c80d176SSepherosa Ziehau * need to give auto-negotiation time to complete, in case the cable
13479c80d176SSepherosa Ziehau * was just plugged in. The autoneg_failed flag does this.
13489c80d176SSepherosa Ziehau */
13499c80d176SSepherosa Ziehau /* (ctrl & E1000_CTRL_SWDPIN1) == 0 == have signal */
13509c80d176SSepherosa Ziehau if ((!(ctrl & E1000_CTRL_SWDPIN1)) &&
13519c80d176SSepherosa Ziehau (!(status & E1000_STATUS_LU)) &&
13529c80d176SSepherosa Ziehau (!(rxcw & E1000_RXCW_C))) {
1353379ebbe7SSepherosa Ziehau if (!mac->autoneg_failed) {
1354379ebbe7SSepherosa Ziehau mac->autoneg_failed = TRUE;
13559c80d176SSepherosa Ziehau ret_val = 0;
13569c80d176SSepherosa Ziehau goto out;
13579c80d176SSepherosa Ziehau }
13589c80d176SSepherosa Ziehau DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n");
13599c80d176SSepherosa Ziehau
13609c80d176SSepherosa Ziehau /* Disable auto-negotiation in the TXCW register */
13619c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE));
13629c80d176SSepherosa Ziehau
13639c80d176SSepherosa Ziehau /* Force link-up and also force full-duplex. */
13649c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
13659c80d176SSepherosa Ziehau ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
13669c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
13679c80d176SSepherosa Ziehau
13689c80d176SSepherosa Ziehau /* Configure Flow Control after forcing link up. */
13699c80d176SSepherosa Ziehau ret_val = e1000_config_fc_after_link_up_generic(hw);
13709c80d176SSepherosa Ziehau if (ret_val) {
13719c80d176SSepherosa Ziehau DEBUGOUT("Error configuring flow control\n");
13729c80d176SSepherosa Ziehau goto out;
13739c80d176SSepherosa Ziehau }
13749c80d176SSepherosa Ziehau } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
13759c80d176SSepherosa Ziehau /*
13769c80d176SSepherosa Ziehau * If we are forcing link and we are receiving /C/ ordered
13779c80d176SSepherosa Ziehau * sets, re-enable auto-negotiation in the TXCW register
13789c80d176SSepherosa Ziehau * and disable forced link in the Device Control register
13799c80d176SSepherosa Ziehau * in an attempt to auto-negotiate with our link partner.
13809c80d176SSepherosa Ziehau */
13819c80d176SSepherosa Ziehau DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n");
13829c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw);
13839c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU));
13849c80d176SSepherosa Ziehau
13859c80d176SSepherosa Ziehau mac->serdes_has_link = TRUE;
13869c80d176SSepherosa Ziehau }
13879c80d176SSepherosa Ziehau
13889c80d176SSepherosa Ziehau out:
13899c80d176SSepherosa Ziehau return ret_val;
13909c80d176SSepherosa Ziehau }
13919c80d176SSepherosa Ziehau
13929c80d176SSepherosa Ziehau /**
13939c80d176SSepherosa Ziehau * e1000_config_mac_to_phy_82543 - Configure MAC to PHY settings
13949c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
13959c80d176SSepherosa Ziehau *
13969c80d176SSepherosa Ziehau * For the 82543 silicon, we need to set the MAC to match the settings
13979c80d176SSepherosa Ziehau * of the PHY, even if the PHY is auto-negotiating.
13989c80d176SSepherosa Ziehau **/
e1000_config_mac_to_phy_82543(struct e1000_hw * hw)13999c80d176SSepherosa Ziehau static s32 e1000_config_mac_to_phy_82543(struct e1000_hw *hw)
14009c80d176SSepherosa Ziehau {
14019c80d176SSepherosa Ziehau u32 ctrl;
14029c80d176SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
14039c80d176SSepherosa Ziehau u16 phy_data;
14049c80d176SSepherosa Ziehau
14059c80d176SSepherosa Ziehau DEBUGFUNC("e1000_config_mac_to_phy_82543");
14069c80d176SSepherosa Ziehau
14079c80d176SSepherosa Ziehau if (!(hw->phy.ops.read_reg))
14089c80d176SSepherosa Ziehau goto out;
14099c80d176SSepherosa Ziehau
14109c80d176SSepherosa Ziehau /* Set the bits to force speed and duplex */
14119c80d176SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
14129c80d176SSepherosa Ziehau ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
14139c80d176SSepherosa Ziehau ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS);
14149c80d176SSepherosa Ziehau
14159c80d176SSepherosa Ziehau /*
14169c80d176SSepherosa Ziehau * Set up duplex in the Device Control and Transmit Control
14179c80d176SSepherosa Ziehau * registers depending on negotiated values.
14189c80d176SSepherosa Ziehau */
14199c80d176SSepherosa Ziehau ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
14209c80d176SSepherosa Ziehau if (ret_val)
14219c80d176SSepherosa Ziehau goto out;
14229c80d176SSepherosa Ziehau
14239c80d176SSepherosa Ziehau ctrl &= ~E1000_CTRL_FD;
14249c80d176SSepherosa Ziehau if (phy_data & M88E1000_PSSR_DPLX)
14259c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_FD;
14269c80d176SSepherosa Ziehau
14274be59a01SSepherosa Ziehau hw->mac.ops.config_collision_dist(hw);
14289c80d176SSepherosa Ziehau
14299c80d176SSepherosa Ziehau /*
14309c80d176SSepherosa Ziehau * Set up speed in the Device Control register depending on
14319c80d176SSepherosa Ziehau * negotiated values.
14329c80d176SSepherosa Ziehau */
14339c80d176SSepherosa Ziehau if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)
14349c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SPD_1000;
14359c80d176SSepherosa Ziehau else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)
14369c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SPD_100;
14379c80d176SSepherosa Ziehau
14389c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
14399c80d176SSepherosa Ziehau
14409c80d176SSepherosa Ziehau out:
14419c80d176SSepherosa Ziehau return ret_val;
14429c80d176SSepherosa Ziehau }
14439c80d176SSepherosa Ziehau
14449c80d176SSepherosa Ziehau /**
14459c80d176SSepherosa Ziehau * e1000_write_vfta_82543 - Write value to VLAN filter table
14469c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
14479c80d176SSepherosa Ziehau * @offset: the 32-bit offset in which to write the value to.
14489c80d176SSepherosa Ziehau * @value: the 32-bit value to write at location offset.
14499c80d176SSepherosa Ziehau *
14509c80d176SSepherosa Ziehau * This writes a 32-bit value to a 32-bit offset in the VLAN filter
14519c80d176SSepherosa Ziehau * table.
14529c80d176SSepherosa Ziehau **/
e1000_write_vfta_82543(struct e1000_hw * hw,u32 offset,u32 value)14539c80d176SSepherosa Ziehau static void e1000_write_vfta_82543(struct e1000_hw *hw, u32 offset, u32 value)
14549c80d176SSepherosa Ziehau {
14559c80d176SSepherosa Ziehau u32 temp;
14569c80d176SSepherosa Ziehau
14579c80d176SSepherosa Ziehau DEBUGFUNC("e1000_write_vfta_82543");
14589c80d176SSepherosa Ziehau
14599c80d176SSepherosa Ziehau if ((hw->mac.type == e1000_82544) && (offset & 1)) {
14609c80d176SSepherosa Ziehau temp = E1000_READ_REG_ARRAY(hw, E1000_VFTA, offset - 1);
14619c80d176SSepherosa Ziehau E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value);
14629c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
14639c80d176SSepherosa Ziehau E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset - 1, temp);
14649c80d176SSepherosa Ziehau E1000_WRITE_FLUSH(hw);
14659c80d176SSepherosa Ziehau } else {
14669c80d176SSepherosa Ziehau e1000_write_vfta_generic(hw, offset, value);
14679c80d176SSepherosa Ziehau }
14689c80d176SSepherosa Ziehau }
14699c80d176SSepherosa Ziehau
14709c80d176SSepherosa Ziehau /**
14719c80d176SSepherosa Ziehau * e1000_led_on_82543 - Turn on SW controllable LED
14729c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
14739c80d176SSepherosa Ziehau *
14749c80d176SSepherosa Ziehau * Turns the SW defined LED on.
14759c80d176SSepherosa Ziehau **/
e1000_led_on_82543(struct e1000_hw * hw)14769c80d176SSepherosa Ziehau static s32 e1000_led_on_82543(struct e1000_hw *hw)
14779c80d176SSepherosa Ziehau {
14789c80d176SSepherosa Ziehau u32 ctrl = E1000_READ_REG(hw, E1000_CTRL);
14799c80d176SSepherosa Ziehau
14809c80d176SSepherosa Ziehau DEBUGFUNC("e1000_led_on_82543");
14819c80d176SSepherosa Ziehau
14829c80d176SSepherosa Ziehau if (hw->mac.type == e1000_82544 &&
14839c80d176SSepherosa Ziehau hw->phy.media_type == e1000_media_type_copper) {
14849c80d176SSepherosa Ziehau /* Clear SW-definable Pin 0 to turn on the LED */
14859c80d176SSepherosa Ziehau ctrl &= ~E1000_CTRL_SWDPIN0;
14869c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SWDPIO0;
14879c80d176SSepherosa Ziehau } else {
14889c80d176SSepherosa Ziehau /* Fiber 82544 and all 82543 use this method */
14899c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SWDPIN0;
14909c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SWDPIO0;
14919c80d176SSepherosa Ziehau }
14929c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
14939c80d176SSepherosa Ziehau
14949c80d176SSepherosa Ziehau return E1000_SUCCESS;
14959c80d176SSepherosa Ziehau }
14969c80d176SSepherosa Ziehau
14979c80d176SSepherosa Ziehau /**
14989c80d176SSepherosa Ziehau * e1000_led_off_82543 - Turn off SW controllable LED
14999c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
15009c80d176SSepherosa Ziehau *
15019c80d176SSepherosa Ziehau * Turns the SW defined LED off.
15029c80d176SSepherosa Ziehau **/
e1000_led_off_82543(struct e1000_hw * hw)15039c80d176SSepherosa Ziehau static s32 e1000_led_off_82543(struct e1000_hw *hw)
15049c80d176SSepherosa Ziehau {
15059c80d176SSepherosa Ziehau u32 ctrl = E1000_READ_REG(hw, E1000_CTRL);
15069c80d176SSepherosa Ziehau
15079c80d176SSepherosa Ziehau DEBUGFUNC("e1000_led_off_82543");
15089c80d176SSepherosa Ziehau
15099c80d176SSepherosa Ziehau if (hw->mac.type == e1000_82544 &&
15109c80d176SSepherosa Ziehau hw->phy.media_type == e1000_media_type_copper) {
15119c80d176SSepherosa Ziehau /* Set SW-definable Pin 0 to turn off the LED */
15129c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SWDPIN0;
15139c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SWDPIO0;
15149c80d176SSepherosa Ziehau } else {
15159c80d176SSepherosa Ziehau ctrl &= ~E1000_CTRL_SWDPIN0;
15169c80d176SSepherosa Ziehau ctrl |= E1000_CTRL_SWDPIO0;
15179c80d176SSepherosa Ziehau }
15189c80d176SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
15199c80d176SSepherosa Ziehau
15209c80d176SSepherosa Ziehau return E1000_SUCCESS;
15219c80d176SSepherosa Ziehau }
15229c80d176SSepherosa Ziehau
15239c80d176SSepherosa Ziehau /**
15249c80d176SSepherosa Ziehau * e1000_clear_hw_cntrs_82543 - Clear device specific hardware counters
15259c80d176SSepherosa Ziehau * @hw: pointer to the HW structure
15269c80d176SSepherosa Ziehau *
15279c80d176SSepherosa Ziehau * Clears the hardware counters by reading the counter registers.
15289c80d176SSepherosa Ziehau **/
e1000_clear_hw_cntrs_82543(struct e1000_hw * hw)15299c80d176SSepherosa Ziehau static void e1000_clear_hw_cntrs_82543(struct e1000_hw *hw)
15309c80d176SSepherosa Ziehau {
15319c80d176SSepherosa Ziehau DEBUGFUNC("e1000_clear_hw_cntrs_82543");
15329c80d176SSepherosa Ziehau
15339c80d176SSepherosa Ziehau e1000_clear_hw_cntrs_base_generic(hw);
15349c80d176SSepherosa Ziehau
15359c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PRC64);
15369c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PRC127);
15379c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PRC255);
15389c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PRC511);
15399c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PRC1023);
15409c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PRC1522);
15419c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PTC64);
15429c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PTC127);
15439c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PTC255);
15449c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PTC511);
15459c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PTC1023);
15469c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_PTC1522);
15479c80d176SSepherosa Ziehau
15489c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_ALGNERRC);
15499c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_RXERRC);
15509c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_TNCRS);
15519c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_CEXTERR);
15529c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_TSCTC);
15539c80d176SSepherosa Ziehau E1000_READ_REG(hw, E1000_TSCTFC);
15549c80d176SSepherosa Ziehau }
1555