175eba5b6SRobert Mustacchi /****************************************************************************** 275eba5b6SRobert Mustacchi 3*42cc51e0SRobert Mustacchi Copyright (c) 2001-2015, Intel Corporation 475eba5b6SRobert Mustacchi All rights reserved. 575eba5b6SRobert Mustacchi 675eba5b6SRobert Mustacchi Redistribution and use in source and binary forms, with or without 775eba5b6SRobert Mustacchi modification, are permitted provided that the following conditions are met: 875eba5b6SRobert Mustacchi 975eba5b6SRobert Mustacchi 1. Redistributions of source code must retain the above copyright notice, 1075eba5b6SRobert Mustacchi this list of conditions and the following disclaimer. 1175eba5b6SRobert Mustacchi 1275eba5b6SRobert Mustacchi 2. Redistributions in binary form must reproduce the above copyright 1375eba5b6SRobert Mustacchi notice, this list of conditions and the following disclaimer in the 1475eba5b6SRobert Mustacchi documentation and/or other materials provided with the distribution. 1575eba5b6SRobert Mustacchi 1675eba5b6SRobert Mustacchi 3. Neither the name of the Intel Corporation nor the names of its 1775eba5b6SRobert Mustacchi contributors may be used to endorse or promote products derived from 1875eba5b6SRobert Mustacchi this software without specific prior written permission. 1975eba5b6SRobert Mustacchi 2075eba5b6SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2175eba5b6SRobert Mustacchi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2275eba5b6SRobert Mustacchi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2375eba5b6SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2475eba5b6SRobert Mustacchi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2575eba5b6SRobert Mustacchi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2675eba5b6SRobert Mustacchi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2775eba5b6SRobert Mustacchi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2875eba5b6SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2975eba5b6SRobert Mustacchi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3075eba5b6SRobert Mustacchi POSSIBILITY OF SUCH DAMAGE. 3175eba5b6SRobert Mustacchi 3275eba5b6SRobert Mustacchi ******************************************************************************/ 3375eba5b6SRobert Mustacchi /*$FreeBSD$*/ 3475eba5b6SRobert Mustacchi 3575eba5b6SRobert Mustacchi #include "e1000_api.h" 3675eba5b6SRobert Mustacchi 3775eba5b6SRobert Mustacchi static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw); 3875eba5b6SRobert Mustacchi static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw); 3975eba5b6SRobert Mustacchi static void e1000_config_collision_dist_generic(struct e1000_hw *hw); 40c124a83eSRobert Mustacchi static int e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); 4175eba5b6SRobert Mustacchi 4275eba5b6SRobert Mustacchi /** 4375eba5b6SRobert Mustacchi * e1000_init_mac_ops_generic - Initialize MAC function pointers 4475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 4575eba5b6SRobert Mustacchi * 4675eba5b6SRobert Mustacchi * Setups up the function pointers to no-op functions 4775eba5b6SRobert Mustacchi **/ 4875eba5b6SRobert Mustacchi void e1000_init_mac_ops_generic(struct e1000_hw *hw) 4975eba5b6SRobert Mustacchi { 5075eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 5175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_init_mac_ops_generic"); 5275eba5b6SRobert Mustacchi 5375eba5b6SRobert Mustacchi /* General Setup */ 5475eba5b6SRobert Mustacchi mac->ops.init_params = e1000_null_ops_generic; 5575eba5b6SRobert Mustacchi mac->ops.init_hw = e1000_null_ops_generic; 5675eba5b6SRobert Mustacchi mac->ops.reset_hw = e1000_null_ops_generic; 5775eba5b6SRobert Mustacchi mac->ops.setup_physical_interface = e1000_null_ops_generic; 5875eba5b6SRobert Mustacchi mac->ops.get_bus_info = e1000_null_ops_generic; 5975eba5b6SRobert Mustacchi mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pcie; 6075eba5b6SRobert Mustacchi mac->ops.read_mac_addr = e1000_read_mac_addr_generic; 6175eba5b6SRobert Mustacchi mac->ops.config_collision_dist = e1000_config_collision_dist_generic; 6275eba5b6SRobert Mustacchi mac->ops.clear_hw_cntrs = e1000_null_mac_generic; 6375eba5b6SRobert Mustacchi /* LED */ 6475eba5b6SRobert Mustacchi mac->ops.cleanup_led = e1000_null_ops_generic; 6575eba5b6SRobert Mustacchi mac->ops.setup_led = e1000_null_ops_generic; 6675eba5b6SRobert Mustacchi mac->ops.blink_led = e1000_null_ops_generic; 6775eba5b6SRobert Mustacchi mac->ops.led_on = e1000_null_ops_generic; 6875eba5b6SRobert Mustacchi mac->ops.led_off = e1000_null_ops_generic; 6975eba5b6SRobert Mustacchi /* LINK */ 7075eba5b6SRobert Mustacchi mac->ops.setup_link = e1000_null_ops_generic; 7175eba5b6SRobert Mustacchi mac->ops.get_link_up_info = e1000_null_link_info; 7275eba5b6SRobert Mustacchi mac->ops.check_for_link = e1000_null_ops_generic; 7375eba5b6SRobert Mustacchi mac->ops.set_obff_timer = e1000_null_set_obff_timer; 7475eba5b6SRobert Mustacchi /* Management */ 7575eba5b6SRobert Mustacchi mac->ops.check_mng_mode = e1000_null_mng_mode; 7675eba5b6SRobert Mustacchi /* VLAN, MC, etc. */ 7775eba5b6SRobert Mustacchi mac->ops.update_mc_addr_list = e1000_null_update_mc; 7875eba5b6SRobert Mustacchi mac->ops.clear_vfta = e1000_null_mac_generic; 7975eba5b6SRobert Mustacchi mac->ops.write_vfta = e1000_null_write_vfta; 8075eba5b6SRobert Mustacchi mac->ops.rar_set = e1000_rar_set_generic; 8175eba5b6SRobert Mustacchi mac->ops.validate_mdi_setting = e1000_validate_mdi_setting_generic; 8275eba5b6SRobert Mustacchi } 8375eba5b6SRobert Mustacchi 8475eba5b6SRobert Mustacchi /** 8575eba5b6SRobert Mustacchi * e1000_null_ops_generic - No-op function, returns 0 8675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 8775eba5b6SRobert Mustacchi **/ 88c124a83eSRobert Mustacchi s32 e1000_null_ops_generic(struct e1000_hw E1000_UNUSEDARG *hw) 8975eba5b6SRobert Mustacchi { 9075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_ops_generic"); 9175eba5b6SRobert Mustacchi return E1000_SUCCESS; 9275eba5b6SRobert Mustacchi } 9375eba5b6SRobert Mustacchi 9475eba5b6SRobert Mustacchi /** 9575eba5b6SRobert Mustacchi * e1000_null_mac_generic - No-op function, return void 9675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 9775eba5b6SRobert Mustacchi **/ 98c124a83eSRobert Mustacchi void e1000_null_mac_generic(struct e1000_hw E1000_UNUSEDARG *hw) 9975eba5b6SRobert Mustacchi { 10075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_mac_generic"); 10175eba5b6SRobert Mustacchi return; 10275eba5b6SRobert Mustacchi } 10375eba5b6SRobert Mustacchi 10475eba5b6SRobert Mustacchi /** 10575eba5b6SRobert Mustacchi * e1000_null_link_info - No-op function, return 0 10675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 10775eba5b6SRobert Mustacchi **/ 108c124a83eSRobert Mustacchi s32 e1000_null_link_info(struct e1000_hw E1000_UNUSEDARG *hw, 109c124a83eSRobert Mustacchi u16 E1000_UNUSEDARG *s, u16 E1000_UNUSEDARG *d) 11075eba5b6SRobert Mustacchi { 11175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_link_info"); 11275eba5b6SRobert Mustacchi return E1000_SUCCESS; 11375eba5b6SRobert Mustacchi } 11475eba5b6SRobert Mustacchi 11575eba5b6SRobert Mustacchi /** 11675eba5b6SRobert Mustacchi * e1000_null_mng_mode - No-op function, return FALSE 11775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 11875eba5b6SRobert Mustacchi **/ 119c124a83eSRobert Mustacchi bool e1000_null_mng_mode(struct e1000_hw E1000_UNUSEDARG *hw) 120c124a83eSRobert Mustacchi { 12175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_mng_mode"); 12275eba5b6SRobert Mustacchi return FALSE; 12375eba5b6SRobert Mustacchi } 12475eba5b6SRobert Mustacchi 12575eba5b6SRobert Mustacchi /** 12675eba5b6SRobert Mustacchi * e1000_null_update_mc - No-op function, return void 12775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 12875eba5b6SRobert Mustacchi **/ 129c124a83eSRobert Mustacchi void e1000_null_update_mc(struct e1000_hw E1000_UNUSEDARG *hw, 130c124a83eSRobert Mustacchi u8 E1000_UNUSEDARG *h, u32 E1000_UNUSEDARG a) 13175eba5b6SRobert Mustacchi { 13275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_update_mc"); 13375eba5b6SRobert Mustacchi return; 13475eba5b6SRobert Mustacchi } 13575eba5b6SRobert Mustacchi 13675eba5b6SRobert Mustacchi /** 13775eba5b6SRobert Mustacchi * e1000_null_write_vfta - No-op function, return void 13875eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 13975eba5b6SRobert Mustacchi **/ 140c124a83eSRobert Mustacchi void e1000_null_write_vfta(struct e1000_hw E1000_UNUSEDARG *hw, 141c124a83eSRobert Mustacchi u32 E1000_UNUSEDARG a, u32 E1000_UNUSEDARG b) 14275eba5b6SRobert Mustacchi { 14375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_write_vfta"); 14475eba5b6SRobert Mustacchi return; 14575eba5b6SRobert Mustacchi } 14675eba5b6SRobert Mustacchi 14775eba5b6SRobert Mustacchi /** 148c124a83eSRobert Mustacchi * e1000_null_rar_set - No-op function, return 0 14975eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 15075eba5b6SRobert Mustacchi **/ 151c124a83eSRobert Mustacchi int e1000_null_rar_set(struct e1000_hw E1000_UNUSEDARG *hw, 152c124a83eSRobert Mustacchi u8 E1000_UNUSEDARG *h, u32 E1000_UNUSEDARG a) 15375eba5b6SRobert Mustacchi { 15475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_rar_set"); 155c124a83eSRobert Mustacchi return E1000_SUCCESS; 15675eba5b6SRobert Mustacchi } 15775eba5b6SRobert Mustacchi 15875eba5b6SRobert Mustacchi /** 15975eba5b6SRobert Mustacchi * e1000_null_set_obff_timer - No-op function, return 0 16075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 16175eba5b6SRobert Mustacchi **/ 162c124a83eSRobert Mustacchi s32 e1000_null_set_obff_timer(struct e1000_hw E1000_UNUSEDARG *hw, 163c124a83eSRobert Mustacchi u32 E1000_UNUSEDARG a) 16475eba5b6SRobert Mustacchi { 16575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_null_set_obff_timer"); 16675eba5b6SRobert Mustacchi return E1000_SUCCESS; 16775eba5b6SRobert Mustacchi } 16875eba5b6SRobert Mustacchi 16975eba5b6SRobert Mustacchi /** 17075eba5b6SRobert Mustacchi * e1000_get_bus_info_pci_generic - Get PCI(x) bus information 17175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 17275eba5b6SRobert Mustacchi * 17375eba5b6SRobert Mustacchi * Determines and stores the system bus information for a particular 17475eba5b6SRobert Mustacchi * network interface. The following bus information is determined and stored: 17575eba5b6SRobert Mustacchi * bus speed, bus width, type (PCI/PCIx), and PCI(-x) function. 17675eba5b6SRobert Mustacchi **/ 17775eba5b6SRobert Mustacchi s32 e1000_get_bus_info_pci_generic(struct e1000_hw *hw) 17875eba5b6SRobert Mustacchi { 17975eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 18075eba5b6SRobert Mustacchi struct e1000_bus_info *bus = &hw->bus; 18175eba5b6SRobert Mustacchi u32 status = E1000_READ_REG(hw, E1000_STATUS); 18275eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 18375eba5b6SRobert Mustacchi 18475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_bus_info_pci_generic"); 18575eba5b6SRobert Mustacchi 18675eba5b6SRobert Mustacchi /* PCI or PCI-X? */ 18775eba5b6SRobert Mustacchi bus->type = (status & E1000_STATUS_PCIX_MODE) 18875eba5b6SRobert Mustacchi ? e1000_bus_type_pcix 18975eba5b6SRobert Mustacchi : e1000_bus_type_pci; 19075eba5b6SRobert Mustacchi 19175eba5b6SRobert Mustacchi /* Bus speed */ 19275eba5b6SRobert Mustacchi if (bus->type == e1000_bus_type_pci) { 19375eba5b6SRobert Mustacchi bus->speed = (status & E1000_STATUS_PCI66) 19475eba5b6SRobert Mustacchi ? e1000_bus_speed_66 19575eba5b6SRobert Mustacchi : e1000_bus_speed_33; 19675eba5b6SRobert Mustacchi } else { 19775eba5b6SRobert Mustacchi switch (status & E1000_STATUS_PCIX_SPEED) { 19875eba5b6SRobert Mustacchi case E1000_STATUS_PCIX_SPEED_66: 19975eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_66; 20075eba5b6SRobert Mustacchi break; 20175eba5b6SRobert Mustacchi case E1000_STATUS_PCIX_SPEED_100: 20275eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_100; 20375eba5b6SRobert Mustacchi break; 20475eba5b6SRobert Mustacchi case E1000_STATUS_PCIX_SPEED_133: 20575eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_133; 20675eba5b6SRobert Mustacchi break; 20775eba5b6SRobert Mustacchi default: 20875eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_reserved; 20975eba5b6SRobert Mustacchi break; 21075eba5b6SRobert Mustacchi } 21175eba5b6SRobert Mustacchi } 21275eba5b6SRobert Mustacchi 21375eba5b6SRobert Mustacchi /* Bus width */ 21475eba5b6SRobert Mustacchi bus->width = (status & E1000_STATUS_BUS64) 21575eba5b6SRobert Mustacchi ? e1000_bus_width_64 21675eba5b6SRobert Mustacchi : e1000_bus_width_32; 21775eba5b6SRobert Mustacchi 21875eba5b6SRobert Mustacchi /* Which PCI(-X) function? */ 21975eba5b6SRobert Mustacchi mac->ops.set_lan_id(hw); 22075eba5b6SRobert Mustacchi 22175eba5b6SRobert Mustacchi return ret_val; 22275eba5b6SRobert Mustacchi } 22375eba5b6SRobert Mustacchi 22475eba5b6SRobert Mustacchi /** 22575eba5b6SRobert Mustacchi * e1000_get_bus_info_pcie_generic - Get PCIe bus information 22675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 22775eba5b6SRobert Mustacchi * 22875eba5b6SRobert Mustacchi * Determines and stores the system bus information for a particular 22975eba5b6SRobert Mustacchi * network interface. The following bus information is determined and stored: 23075eba5b6SRobert Mustacchi * bus speed, bus width, type (PCIe), and PCIe function. 23175eba5b6SRobert Mustacchi **/ 23275eba5b6SRobert Mustacchi s32 e1000_get_bus_info_pcie_generic(struct e1000_hw *hw) 23375eba5b6SRobert Mustacchi { 23475eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 23575eba5b6SRobert Mustacchi struct e1000_bus_info *bus = &hw->bus; 23675eba5b6SRobert Mustacchi s32 ret_val; 23775eba5b6SRobert Mustacchi u16 pcie_link_status; 23875eba5b6SRobert Mustacchi 23975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_bus_info_pcie_generic"); 24075eba5b6SRobert Mustacchi 24175eba5b6SRobert Mustacchi bus->type = e1000_bus_type_pci_express; 24275eba5b6SRobert Mustacchi 24375eba5b6SRobert Mustacchi ret_val = e1000_read_pcie_cap_reg(hw, PCIE_LINK_STATUS, 24475eba5b6SRobert Mustacchi &pcie_link_status); 24575eba5b6SRobert Mustacchi if (ret_val) { 24675eba5b6SRobert Mustacchi bus->width = e1000_bus_width_unknown; 24775eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_unknown; 24875eba5b6SRobert Mustacchi } else { 24975eba5b6SRobert Mustacchi switch (pcie_link_status & PCIE_LINK_SPEED_MASK) { 25075eba5b6SRobert Mustacchi case PCIE_LINK_SPEED_2500: 25175eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_2500; 25275eba5b6SRobert Mustacchi break; 25375eba5b6SRobert Mustacchi case PCIE_LINK_SPEED_5000: 25475eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_5000; 25575eba5b6SRobert Mustacchi break; 25675eba5b6SRobert Mustacchi default: 25775eba5b6SRobert Mustacchi bus->speed = e1000_bus_speed_unknown; 25875eba5b6SRobert Mustacchi break; 25975eba5b6SRobert Mustacchi } 26075eba5b6SRobert Mustacchi 26175eba5b6SRobert Mustacchi bus->width = (enum e1000_bus_width)((pcie_link_status & 26275eba5b6SRobert Mustacchi PCIE_LINK_WIDTH_MASK) >> PCIE_LINK_WIDTH_SHIFT); 26375eba5b6SRobert Mustacchi } 26475eba5b6SRobert Mustacchi 26575eba5b6SRobert Mustacchi mac->ops.set_lan_id(hw); 26675eba5b6SRobert Mustacchi 26775eba5b6SRobert Mustacchi return E1000_SUCCESS; 26875eba5b6SRobert Mustacchi } 26975eba5b6SRobert Mustacchi 27075eba5b6SRobert Mustacchi /** 27175eba5b6SRobert Mustacchi * e1000_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices 27275eba5b6SRobert Mustacchi * 27375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 27475eba5b6SRobert Mustacchi * 27575eba5b6SRobert Mustacchi * Determines the LAN function id by reading memory-mapped registers 27675eba5b6SRobert Mustacchi * and swaps the port value if requested. 27775eba5b6SRobert Mustacchi **/ 27875eba5b6SRobert Mustacchi static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw) 27975eba5b6SRobert Mustacchi { 28075eba5b6SRobert Mustacchi struct e1000_bus_info *bus = &hw->bus; 28175eba5b6SRobert Mustacchi u32 reg; 28275eba5b6SRobert Mustacchi 28375eba5b6SRobert Mustacchi /* The status register reports the correct function number 28475eba5b6SRobert Mustacchi * for the device regardless of function swap state. 28575eba5b6SRobert Mustacchi */ 28675eba5b6SRobert Mustacchi reg = E1000_READ_REG(hw, E1000_STATUS); 28775eba5b6SRobert Mustacchi bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT; 28875eba5b6SRobert Mustacchi } 28975eba5b6SRobert Mustacchi 29075eba5b6SRobert Mustacchi /** 29175eba5b6SRobert Mustacchi * e1000_set_lan_id_multi_port_pci - Set LAN id for PCI multiple port devices 29275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 29375eba5b6SRobert Mustacchi * 29475eba5b6SRobert Mustacchi * Determines the LAN function id by reading PCI config space. 29575eba5b6SRobert Mustacchi **/ 29675eba5b6SRobert Mustacchi void e1000_set_lan_id_multi_port_pci(struct e1000_hw *hw) 29775eba5b6SRobert Mustacchi { 29875eba5b6SRobert Mustacchi struct e1000_bus_info *bus = &hw->bus; 29975eba5b6SRobert Mustacchi u16 pci_header_type; 30075eba5b6SRobert Mustacchi u32 status; 30175eba5b6SRobert Mustacchi 30275eba5b6SRobert Mustacchi e1000_read_pci_cfg(hw, PCI_HEADER_TYPE_REGISTER, &pci_header_type); 30375eba5b6SRobert Mustacchi if (pci_header_type & PCI_HEADER_TYPE_MULTIFUNC) { 30475eba5b6SRobert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS); 30575eba5b6SRobert Mustacchi bus->func = (status & E1000_STATUS_FUNC_MASK) 30675eba5b6SRobert Mustacchi >> E1000_STATUS_FUNC_SHIFT; 30775eba5b6SRobert Mustacchi } else { 30875eba5b6SRobert Mustacchi bus->func = 0; 30975eba5b6SRobert Mustacchi } 31075eba5b6SRobert Mustacchi } 31175eba5b6SRobert Mustacchi 31275eba5b6SRobert Mustacchi /** 31375eba5b6SRobert Mustacchi * e1000_set_lan_id_single_port - Set LAN id for a single port device 31475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 31575eba5b6SRobert Mustacchi * 31675eba5b6SRobert Mustacchi * Sets the LAN function id to zero for a single port device. 31775eba5b6SRobert Mustacchi **/ 31875eba5b6SRobert Mustacchi void e1000_set_lan_id_single_port(struct e1000_hw *hw) 31975eba5b6SRobert Mustacchi { 32075eba5b6SRobert Mustacchi struct e1000_bus_info *bus = &hw->bus; 32175eba5b6SRobert Mustacchi 32275eba5b6SRobert Mustacchi bus->func = 0; 32375eba5b6SRobert Mustacchi } 32475eba5b6SRobert Mustacchi 32575eba5b6SRobert Mustacchi /** 32675eba5b6SRobert Mustacchi * e1000_clear_vfta_generic - Clear VLAN filter table 32775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 32875eba5b6SRobert Mustacchi * 32975eba5b6SRobert Mustacchi * Clears the register array which contains the VLAN filter table by 33075eba5b6SRobert Mustacchi * setting all the values to 0. 33175eba5b6SRobert Mustacchi **/ 33275eba5b6SRobert Mustacchi void e1000_clear_vfta_generic(struct e1000_hw *hw) 33375eba5b6SRobert Mustacchi { 33475eba5b6SRobert Mustacchi u32 offset; 33575eba5b6SRobert Mustacchi 33675eba5b6SRobert Mustacchi DEBUGFUNC("e1000_clear_vfta_generic"); 33775eba5b6SRobert Mustacchi 33875eba5b6SRobert Mustacchi for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { 33975eba5b6SRobert Mustacchi E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0); 34075eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 34175eba5b6SRobert Mustacchi } 34275eba5b6SRobert Mustacchi } 34375eba5b6SRobert Mustacchi 34475eba5b6SRobert Mustacchi /** 34575eba5b6SRobert Mustacchi * e1000_write_vfta_generic - Write value to VLAN filter table 34675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 34775eba5b6SRobert Mustacchi * @offset: register offset in VLAN filter table 34875eba5b6SRobert Mustacchi * @value: register value written to VLAN filter table 34975eba5b6SRobert Mustacchi * 35075eba5b6SRobert Mustacchi * Writes value at the given offset in the register array which stores 35175eba5b6SRobert Mustacchi * the VLAN filter table. 35275eba5b6SRobert Mustacchi **/ 35375eba5b6SRobert Mustacchi void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value) 35475eba5b6SRobert Mustacchi { 35575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_write_vfta_generic"); 35675eba5b6SRobert Mustacchi 35775eba5b6SRobert Mustacchi E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value); 35875eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 35975eba5b6SRobert Mustacchi } 36075eba5b6SRobert Mustacchi 36175eba5b6SRobert Mustacchi /** 36275eba5b6SRobert Mustacchi * e1000_init_rx_addrs_generic - Initialize receive address's 36375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 36475eba5b6SRobert Mustacchi * @rar_count: receive address registers 36575eba5b6SRobert Mustacchi * 36675eba5b6SRobert Mustacchi * Setup the receive address registers by setting the base receive address 36775eba5b6SRobert Mustacchi * register to the devices MAC address and clearing all the other receive 36875eba5b6SRobert Mustacchi * address registers to 0. 36975eba5b6SRobert Mustacchi **/ 37075eba5b6SRobert Mustacchi void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count) 37175eba5b6SRobert Mustacchi { 37275eba5b6SRobert Mustacchi u32 i; 37375eba5b6SRobert Mustacchi u8 mac_addr[ETH_ADDR_LEN] = {0}; 37475eba5b6SRobert Mustacchi 37575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_init_rx_addrs_generic"); 37675eba5b6SRobert Mustacchi 37775eba5b6SRobert Mustacchi /* Setup the receive address */ 37875eba5b6SRobert Mustacchi DEBUGOUT("Programming MAC Address into RAR[0]\n"); 37975eba5b6SRobert Mustacchi 38075eba5b6SRobert Mustacchi hw->mac.ops.rar_set(hw, hw->mac.addr, 0); 38175eba5b6SRobert Mustacchi 38275eba5b6SRobert Mustacchi /* Zero out the other (rar_entry_count - 1) receive addresses */ 38375eba5b6SRobert Mustacchi DEBUGOUT1("Clearing RAR[1-%u]\n", rar_count-1); 38475eba5b6SRobert Mustacchi for (i = 1; i < rar_count; i++) 38575eba5b6SRobert Mustacchi hw->mac.ops.rar_set(hw, mac_addr, i); 38675eba5b6SRobert Mustacchi } 38775eba5b6SRobert Mustacchi 38875eba5b6SRobert Mustacchi /** 38975eba5b6SRobert Mustacchi * e1000_check_alt_mac_addr_generic - Check for alternate MAC addr 39075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 39175eba5b6SRobert Mustacchi * 39275eba5b6SRobert Mustacchi * Checks the nvm for an alternate MAC address. An alternate MAC address 39375eba5b6SRobert Mustacchi * can be setup by pre-boot software and must be treated like a permanent 39475eba5b6SRobert Mustacchi * address and must override the actual permanent MAC address. If an 39575eba5b6SRobert Mustacchi * alternate MAC address is found it is programmed into RAR0, replacing 39675eba5b6SRobert Mustacchi * the permanent address that was installed into RAR0 by the Si on reset. 39775eba5b6SRobert Mustacchi * This function will return SUCCESS unless it encounters an error while 39875eba5b6SRobert Mustacchi * reading the EEPROM. 39975eba5b6SRobert Mustacchi **/ 40075eba5b6SRobert Mustacchi s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) 40175eba5b6SRobert Mustacchi { 40275eba5b6SRobert Mustacchi u32 i; 40375eba5b6SRobert Mustacchi s32 ret_val; 40475eba5b6SRobert Mustacchi u16 offset, nvm_alt_mac_addr_offset, nvm_data; 40575eba5b6SRobert Mustacchi u8 alt_mac_addr[ETH_ADDR_LEN]; 40675eba5b6SRobert Mustacchi 40775eba5b6SRobert Mustacchi DEBUGFUNC("e1000_check_alt_mac_addr_generic"); 40875eba5b6SRobert Mustacchi 40975eba5b6SRobert Mustacchi ret_val = hw->nvm.ops.read(hw, NVM_COMPAT, 1, &nvm_data); 41075eba5b6SRobert Mustacchi if (ret_val) 41175eba5b6SRobert Mustacchi return ret_val; 41275eba5b6SRobert Mustacchi 41375eba5b6SRobert Mustacchi /* not supported on older hardware or 82573 */ 41475eba5b6SRobert Mustacchi if ((hw->mac.type < e1000_82571) || (hw->mac.type == e1000_82573)) 41575eba5b6SRobert Mustacchi return E1000_SUCCESS; 41675eba5b6SRobert Mustacchi 41775eba5b6SRobert Mustacchi /* Alternate MAC address is handled by the option ROM for 82580 41875eba5b6SRobert Mustacchi * and newer. SW support not required. 41975eba5b6SRobert Mustacchi */ 42075eba5b6SRobert Mustacchi if (hw->mac.type >= e1000_82580) 42175eba5b6SRobert Mustacchi return E1000_SUCCESS; 42275eba5b6SRobert Mustacchi 42375eba5b6SRobert Mustacchi ret_val = hw->nvm.ops.read(hw, NVM_ALT_MAC_ADDR_PTR, 1, 42475eba5b6SRobert Mustacchi &nvm_alt_mac_addr_offset); 42575eba5b6SRobert Mustacchi if (ret_val) { 42675eba5b6SRobert Mustacchi DEBUGOUT("NVM Read Error\n"); 42775eba5b6SRobert Mustacchi return ret_val; 42875eba5b6SRobert Mustacchi } 42975eba5b6SRobert Mustacchi 43075eba5b6SRobert Mustacchi if ((nvm_alt_mac_addr_offset == 0xFFFF) || 43175eba5b6SRobert Mustacchi (nvm_alt_mac_addr_offset == 0x0000)) 43275eba5b6SRobert Mustacchi /* There is no Alternate MAC Address */ 43375eba5b6SRobert Mustacchi return E1000_SUCCESS; 43475eba5b6SRobert Mustacchi 43575eba5b6SRobert Mustacchi if (hw->bus.func == E1000_FUNC_1) 43675eba5b6SRobert Mustacchi nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1; 43775eba5b6SRobert Mustacchi if (hw->bus.func == E1000_FUNC_2) 43875eba5b6SRobert Mustacchi nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN2; 43975eba5b6SRobert Mustacchi 44075eba5b6SRobert Mustacchi if (hw->bus.func == E1000_FUNC_3) 44175eba5b6SRobert Mustacchi nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN3; 44275eba5b6SRobert Mustacchi for (i = 0; i < ETH_ADDR_LEN; i += 2) { 44375eba5b6SRobert Mustacchi offset = nvm_alt_mac_addr_offset + (i >> 1); 44475eba5b6SRobert Mustacchi ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data); 44575eba5b6SRobert Mustacchi if (ret_val) { 44675eba5b6SRobert Mustacchi DEBUGOUT("NVM Read Error\n"); 44775eba5b6SRobert Mustacchi return ret_val; 44875eba5b6SRobert Mustacchi } 44975eba5b6SRobert Mustacchi 45075eba5b6SRobert Mustacchi alt_mac_addr[i] = (u8)(nvm_data & 0xFF); 45175eba5b6SRobert Mustacchi alt_mac_addr[i + 1] = (u8)(nvm_data >> 8); 45275eba5b6SRobert Mustacchi } 45375eba5b6SRobert Mustacchi 45475eba5b6SRobert Mustacchi /* if multicast bit is set, the alternate address will not be used */ 45575eba5b6SRobert Mustacchi if (alt_mac_addr[0] & 0x01) { 45675eba5b6SRobert Mustacchi DEBUGOUT("Ignoring Alternate Mac Address with MC bit set\n"); 45775eba5b6SRobert Mustacchi return E1000_SUCCESS; 45875eba5b6SRobert Mustacchi } 45975eba5b6SRobert Mustacchi 46075eba5b6SRobert Mustacchi /* We have a valid alternate MAC address, and we want to treat it the 46175eba5b6SRobert Mustacchi * same as the normal permanent MAC address stored by the HW into the 46275eba5b6SRobert Mustacchi * RAR. Do this by mapping this address into RAR0. 46375eba5b6SRobert Mustacchi */ 46475eba5b6SRobert Mustacchi hw->mac.ops.rar_set(hw, alt_mac_addr, 0); 46575eba5b6SRobert Mustacchi 46675eba5b6SRobert Mustacchi return E1000_SUCCESS; 46775eba5b6SRobert Mustacchi } 46875eba5b6SRobert Mustacchi 46975eba5b6SRobert Mustacchi /** 47075eba5b6SRobert Mustacchi * e1000_rar_set_generic - Set receive address register 47175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 47275eba5b6SRobert Mustacchi * @addr: pointer to the receive address 47375eba5b6SRobert Mustacchi * @index: receive address array register 47475eba5b6SRobert Mustacchi * 47575eba5b6SRobert Mustacchi * Sets the receive address array register at index to the address passed 47675eba5b6SRobert Mustacchi * in by addr. 47775eba5b6SRobert Mustacchi **/ 478c124a83eSRobert Mustacchi static int e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) 47975eba5b6SRobert Mustacchi { 48075eba5b6SRobert Mustacchi u32 rar_low, rar_high; 48175eba5b6SRobert Mustacchi 48275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_rar_set_generic"); 48375eba5b6SRobert Mustacchi 48475eba5b6SRobert Mustacchi /* HW expects these in little endian so we reverse the byte order 48575eba5b6SRobert Mustacchi * from network order (big endian) to little endian 48675eba5b6SRobert Mustacchi */ 48775eba5b6SRobert Mustacchi rar_low = ((u32) addr[0] | ((u32) addr[1] << 8) | 48875eba5b6SRobert Mustacchi ((u32) addr[2] << 16) | ((u32) addr[3] << 24)); 48975eba5b6SRobert Mustacchi 49075eba5b6SRobert Mustacchi rar_high = ((u32) addr[4] | ((u32) addr[5] << 8)); 49175eba5b6SRobert Mustacchi 49275eba5b6SRobert Mustacchi /* If MAC address zero, no need to set the AV bit */ 49375eba5b6SRobert Mustacchi if (rar_low || rar_high) 49475eba5b6SRobert Mustacchi rar_high |= E1000_RAH_AV; 49575eba5b6SRobert Mustacchi 49675eba5b6SRobert Mustacchi /* Some bridges will combine consecutive 32-bit writes into 49775eba5b6SRobert Mustacchi * a single burst write, which will malfunction on some parts. 49875eba5b6SRobert Mustacchi * The flushes avoid this. 49975eba5b6SRobert Mustacchi */ 50075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_RAL(index), rar_low); 50175eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 50275eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_RAH(index), rar_high); 50375eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 504c124a83eSRobert Mustacchi 505c124a83eSRobert Mustacchi return E1000_SUCCESS; 50675eba5b6SRobert Mustacchi } 50775eba5b6SRobert Mustacchi 50875eba5b6SRobert Mustacchi /** 50975eba5b6SRobert Mustacchi * e1000_hash_mc_addr_generic - Generate a multicast hash value 51075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 51175eba5b6SRobert Mustacchi * @mc_addr: pointer to a multicast address 51275eba5b6SRobert Mustacchi * 51375eba5b6SRobert Mustacchi * Generates a multicast address hash value which is used to determine 51475eba5b6SRobert Mustacchi * the multicast filter table array address and new table value. 51575eba5b6SRobert Mustacchi **/ 51675eba5b6SRobert Mustacchi u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr) 51775eba5b6SRobert Mustacchi { 51875eba5b6SRobert Mustacchi u32 hash_value, hash_mask; 51975eba5b6SRobert Mustacchi u8 bit_shift = 0; 52075eba5b6SRobert Mustacchi 52175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_hash_mc_addr_generic"); 52275eba5b6SRobert Mustacchi 52375eba5b6SRobert Mustacchi /* Register count multiplied by bits per register */ 52475eba5b6SRobert Mustacchi hash_mask = (hw->mac.mta_reg_count * 32) - 1; 52575eba5b6SRobert Mustacchi 52675eba5b6SRobert Mustacchi /* For a mc_filter_type of 0, bit_shift is the number of left-shifts 52775eba5b6SRobert Mustacchi * where 0xFF would still fall within the hash mask. 52875eba5b6SRobert Mustacchi */ 52975eba5b6SRobert Mustacchi while (hash_mask >> bit_shift != 0xFF) 53075eba5b6SRobert Mustacchi bit_shift++; 53175eba5b6SRobert Mustacchi 53275eba5b6SRobert Mustacchi /* The portion of the address that is used for the hash table 53375eba5b6SRobert Mustacchi * is determined by the mc_filter_type setting. 53475eba5b6SRobert Mustacchi * The algorithm is such that there is a total of 8 bits of shifting. 53575eba5b6SRobert Mustacchi * The bit_shift for a mc_filter_type of 0 represents the number of 53675eba5b6SRobert Mustacchi * left-shifts where the MSB of mc_addr[5] would still fall within 53775eba5b6SRobert Mustacchi * the hash_mask. Case 0 does this exactly. Since there are a total 53875eba5b6SRobert Mustacchi * of 8 bits of shifting, then mc_addr[4] will shift right the 53975eba5b6SRobert Mustacchi * remaining number of bits. Thus 8 - bit_shift. The rest of the 54075eba5b6SRobert Mustacchi * cases are a variation of this algorithm...essentially raising the 54175eba5b6SRobert Mustacchi * number of bits to shift mc_addr[5] left, while still keeping the 54275eba5b6SRobert Mustacchi * 8-bit shifting total. 54375eba5b6SRobert Mustacchi * 54475eba5b6SRobert Mustacchi * For example, given the following Destination MAC Address and an 54575eba5b6SRobert Mustacchi * mta register count of 128 (thus a 4096-bit vector and 0xFFF mask), 54675eba5b6SRobert Mustacchi * we can see that the bit_shift for case 0 is 4. These are the hash 54775eba5b6SRobert Mustacchi * values resulting from each mc_filter_type... 54875eba5b6SRobert Mustacchi * [0] [1] [2] [3] [4] [5] 54975eba5b6SRobert Mustacchi * 01 AA 00 12 34 56 55075eba5b6SRobert Mustacchi * LSB MSB 55175eba5b6SRobert Mustacchi * 55275eba5b6SRobert Mustacchi * case 0: hash_value = ((0x34 >> 4) | (0x56 << 4)) & 0xFFF = 0x563 55375eba5b6SRobert Mustacchi * case 1: hash_value = ((0x34 >> 3) | (0x56 << 5)) & 0xFFF = 0xAC6 55475eba5b6SRobert Mustacchi * case 2: hash_value = ((0x34 >> 2) | (0x56 << 6)) & 0xFFF = 0x163 55575eba5b6SRobert Mustacchi * case 3: hash_value = ((0x34 >> 0) | (0x56 << 8)) & 0xFFF = 0x634 55675eba5b6SRobert Mustacchi */ 55775eba5b6SRobert Mustacchi switch (hw->mac.mc_filter_type) { 55875eba5b6SRobert Mustacchi default: 55975eba5b6SRobert Mustacchi case 0: 56075eba5b6SRobert Mustacchi break; 56175eba5b6SRobert Mustacchi case 1: 56275eba5b6SRobert Mustacchi bit_shift += 1; 56375eba5b6SRobert Mustacchi break; 56475eba5b6SRobert Mustacchi case 2: 56575eba5b6SRobert Mustacchi bit_shift += 2; 56675eba5b6SRobert Mustacchi break; 56775eba5b6SRobert Mustacchi case 3: 56875eba5b6SRobert Mustacchi bit_shift += 4; 56975eba5b6SRobert Mustacchi break; 57075eba5b6SRobert Mustacchi } 57175eba5b6SRobert Mustacchi 57275eba5b6SRobert Mustacchi hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) | 57375eba5b6SRobert Mustacchi (((u16) mc_addr[5]) << bit_shift))); 57475eba5b6SRobert Mustacchi 57575eba5b6SRobert Mustacchi return hash_value; 57675eba5b6SRobert Mustacchi } 57775eba5b6SRobert Mustacchi 57875eba5b6SRobert Mustacchi /** 57975eba5b6SRobert Mustacchi * e1000_update_mc_addr_list_generic - Update Multicast addresses 58075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 58175eba5b6SRobert Mustacchi * @mc_addr_list: array of multicast addresses to program 58275eba5b6SRobert Mustacchi * @mc_addr_count: number of multicast addresses to program 58375eba5b6SRobert Mustacchi * 58475eba5b6SRobert Mustacchi * Updates entire Multicast Table Array. 58575eba5b6SRobert Mustacchi * The caller must have a packed mc_addr_list of multicast addresses. 58675eba5b6SRobert Mustacchi **/ 58775eba5b6SRobert Mustacchi void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, 58875eba5b6SRobert Mustacchi u8 *mc_addr_list, u32 mc_addr_count) 58975eba5b6SRobert Mustacchi { 59075eba5b6SRobert Mustacchi u32 hash_value, hash_bit, hash_reg; 59175eba5b6SRobert Mustacchi int i; 59275eba5b6SRobert Mustacchi 59375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_update_mc_addr_list_generic"); 59475eba5b6SRobert Mustacchi 59575eba5b6SRobert Mustacchi /* clear mta_shadow */ 59675eba5b6SRobert Mustacchi memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow)); 59775eba5b6SRobert Mustacchi 59875eba5b6SRobert Mustacchi /* update mta_shadow from mc_addr_list */ 59975eba5b6SRobert Mustacchi for (i = 0; (u32) i < mc_addr_count; i++) { 60075eba5b6SRobert Mustacchi hash_value = e1000_hash_mc_addr_generic(hw, mc_addr_list); 60175eba5b6SRobert Mustacchi 60275eba5b6SRobert Mustacchi hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); 60375eba5b6SRobert Mustacchi hash_bit = hash_value & 0x1F; 60475eba5b6SRobert Mustacchi 60575eba5b6SRobert Mustacchi hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit); 60675eba5b6SRobert Mustacchi mc_addr_list += (ETH_ADDR_LEN); 60775eba5b6SRobert Mustacchi } 60875eba5b6SRobert Mustacchi 60975eba5b6SRobert Mustacchi /* replace the entire MTA table */ 61075eba5b6SRobert Mustacchi for (i = hw->mac.mta_reg_count - 1; i >= 0; i--) 61175eba5b6SRobert Mustacchi E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]); 61275eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 61375eba5b6SRobert Mustacchi } 61475eba5b6SRobert Mustacchi 61575eba5b6SRobert Mustacchi /** 61675eba5b6SRobert Mustacchi * e1000_pcix_mmrbc_workaround_generic - Fix incorrect MMRBC value 61775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 61875eba5b6SRobert Mustacchi * 61975eba5b6SRobert Mustacchi * In certain situations, a system BIOS may report that the PCIx maximum 62075eba5b6SRobert Mustacchi * memory read byte count (MMRBC) value is higher than than the actual 62175eba5b6SRobert Mustacchi * value. We check the PCIx command register with the current PCIx status 62275eba5b6SRobert Mustacchi * register. 62375eba5b6SRobert Mustacchi **/ 62475eba5b6SRobert Mustacchi void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw) 62575eba5b6SRobert Mustacchi { 62675eba5b6SRobert Mustacchi u16 cmd_mmrbc; 62775eba5b6SRobert Mustacchi u16 pcix_cmd; 62875eba5b6SRobert Mustacchi u16 pcix_stat_hi_word; 62975eba5b6SRobert Mustacchi u16 stat_mmrbc; 63075eba5b6SRobert Mustacchi 63175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_pcix_mmrbc_workaround_generic"); 63275eba5b6SRobert Mustacchi 63375eba5b6SRobert Mustacchi /* Workaround for PCI-X issue when BIOS sets MMRBC incorrectly */ 63475eba5b6SRobert Mustacchi if (hw->bus.type != e1000_bus_type_pcix) 63575eba5b6SRobert Mustacchi return; 63675eba5b6SRobert Mustacchi 63775eba5b6SRobert Mustacchi e1000_read_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd); 63875eba5b6SRobert Mustacchi e1000_read_pci_cfg(hw, PCIX_STATUS_REGISTER_HI, &pcix_stat_hi_word); 63975eba5b6SRobert Mustacchi cmd_mmrbc = (pcix_cmd & PCIX_COMMAND_MMRBC_MASK) >> 64075eba5b6SRobert Mustacchi PCIX_COMMAND_MMRBC_SHIFT; 64175eba5b6SRobert Mustacchi stat_mmrbc = (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >> 64275eba5b6SRobert Mustacchi PCIX_STATUS_HI_MMRBC_SHIFT; 64375eba5b6SRobert Mustacchi if (stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K) 64475eba5b6SRobert Mustacchi stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K; 64575eba5b6SRobert Mustacchi if (cmd_mmrbc > stat_mmrbc) { 64675eba5b6SRobert Mustacchi pcix_cmd &= ~PCIX_COMMAND_MMRBC_MASK; 64775eba5b6SRobert Mustacchi pcix_cmd |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT; 64875eba5b6SRobert Mustacchi e1000_write_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd); 64975eba5b6SRobert Mustacchi } 65075eba5b6SRobert Mustacchi } 65175eba5b6SRobert Mustacchi 65275eba5b6SRobert Mustacchi /** 65375eba5b6SRobert Mustacchi * e1000_clear_hw_cntrs_base_generic - Clear base hardware counters 65475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 65575eba5b6SRobert Mustacchi * 65675eba5b6SRobert Mustacchi * Clears the base hardware counters by reading the counter registers. 65775eba5b6SRobert Mustacchi **/ 65875eba5b6SRobert Mustacchi void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw) 65975eba5b6SRobert Mustacchi { 66075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_clear_hw_cntrs_base_generic"); 66175eba5b6SRobert Mustacchi 66275eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_CRCERRS); 66375eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_SYMERRS); 66475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_MPC); 66575eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_SCC); 66675eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ECOL); 66775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_MCC); 66875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_LATECOL); 66975eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_COLC); 67075eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_DC); 67175eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_SEC); 67275eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_RLEC); 67375eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_XONRXC); 67475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_XONTXC); 67575eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_XOFFRXC); 67675eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_XOFFTXC); 67775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_FCRUC); 67875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_GPRC); 67975eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_BPRC); 68075eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_MPRC); 68175eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_GPTC); 68275eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_GORCL); 68375eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_GORCH); 68475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_GOTCL); 68575eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_GOTCH); 68675eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_RNBC); 68775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_RUC); 68875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_RFC); 68975eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_ROC); 69075eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_RJC); 69175eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TORL); 69275eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TORH); 69375eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TOTL); 69475eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TOTH); 69575eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TPR); 69675eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_TPT); 69775eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_MPTC); 69875eba5b6SRobert Mustacchi E1000_READ_REG(hw, E1000_BPTC); 69975eba5b6SRobert Mustacchi } 70075eba5b6SRobert Mustacchi 70175eba5b6SRobert Mustacchi /** 70275eba5b6SRobert Mustacchi * e1000_check_for_copper_link_generic - Check for link (Copper) 70375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 70475eba5b6SRobert Mustacchi * 70575eba5b6SRobert Mustacchi * Checks to see of the link status of the hardware has changed. If a 70675eba5b6SRobert Mustacchi * change in link status has been detected, then we read the PHY registers 70775eba5b6SRobert Mustacchi * to get the current speed/duplex if link exists. 70875eba5b6SRobert Mustacchi **/ 70975eba5b6SRobert Mustacchi s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) 71075eba5b6SRobert Mustacchi { 71175eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 71275eba5b6SRobert Mustacchi s32 ret_val; 71375eba5b6SRobert Mustacchi bool link; 71475eba5b6SRobert Mustacchi 71575eba5b6SRobert Mustacchi DEBUGFUNC("e1000_check_for_copper_link"); 71675eba5b6SRobert Mustacchi 71775eba5b6SRobert Mustacchi /* We only want to go out to the PHY registers to see if Auto-Neg 71875eba5b6SRobert Mustacchi * has completed and/or if our link status has changed. The 71975eba5b6SRobert Mustacchi * get_link_status flag is set upon receiving a Link Status 72075eba5b6SRobert Mustacchi * Change or Rx Sequence Error interrupt. 72175eba5b6SRobert Mustacchi */ 72275eba5b6SRobert Mustacchi if (!mac->get_link_status) 72375eba5b6SRobert Mustacchi return E1000_SUCCESS; 72475eba5b6SRobert Mustacchi 72575eba5b6SRobert Mustacchi /* First we want to see if the MII Status Register reports 72675eba5b6SRobert Mustacchi * link. If so, then we want to get the current speed/duplex 72775eba5b6SRobert Mustacchi * of the PHY. 72875eba5b6SRobert Mustacchi */ 72975eba5b6SRobert Mustacchi ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); 73075eba5b6SRobert Mustacchi if (ret_val) 73175eba5b6SRobert Mustacchi return ret_val; 73275eba5b6SRobert Mustacchi 73375eba5b6SRobert Mustacchi if (!link) 73475eba5b6SRobert Mustacchi return E1000_SUCCESS; /* No link detected */ 73575eba5b6SRobert Mustacchi 73675eba5b6SRobert Mustacchi mac->get_link_status = FALSE; 73775eba5b6SRobert Mustacchi 73875eba5b6SRobert Mustacchi /* Check if there was DownShift, must be checked 73975eba5b6SRobert Mustacchi * immediately after link-up 74075eba5b6SRobert Mustacchi */ 74175eba5b6SRobert Mustacchi e1000_check_downshift_generic(hw); 74275eba5b6SRobert Mustacchi 74375eba5b6SRobert Mustacchi /* If we are forcing speed/duplex, then we simply return since 74475eba5b6SRobert Mustacchi * we have already determined whether we have link or not. 74575eba5b6SRobert Mustacchi */ 74675eba5b6SRobert Mustacchi if (!mac->autoneg) 74775eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 74875eba5b6SRobert Mustacchi 74975eba5b6SRobert Mustacchi /* Auto-Neg is enabled. Auto Speed Detection takes care 75075eba5b6SRobert Mustacchi * of MAC speed/duplex configuration. So we only need to 75175eba5b6SRobert Mustacchi * configure Collision Distance in the MAC. 75275eba5b6SRobert Mustacchi */ 75375eba5b6SRobert Mustacchi mac->ops.config_collision_dist(hw); 75475eba5b6SRobert Mustacchi 75575eba5b6SRobert Mustacchi /* Configure Flow Control now that Auto-Neg has completed. 75675eba5b6SRobert Mustacchi * First, we need to restore the desired flow control 75775eba5b6SRobert Mustacchi * settings because we may have had to re-autoneg with a 75875eba5b6SRobert Mustacchi * different link partner. 75975eba5b6SRobert Mustacchi */ 76075eba5b6SRobert Mustacchi ret_val = e1000_config_fc_after_link_up_generic(hw); 76175eba5b6SRobert Mustacchi if (ret_val) 76275eba5b6SRobert Mustacchi DEBUGOUT("Error configuring flow control\n"); 76375eba5b6SRobert Mustacchi 76475eba5b6SRobert Mustacchi return ret_val; 76575eba5b6SRobert Mustacchi } 76675eba5b6SRobert Mustacchi 76775eba5b6SRobert Mustacchi /** 76875eba5b6SRobert Mustacchi * e1000_check_for_fiber_link_generic - Check for link (Fiber) 76975eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 77075eba5b6SRobert Mustacchi * 77175eba5b6SRobert Mustacchi * Checks for link up on the hardware. If link is not up and we have 77275eba5b6SRobert Mustacchi * a signal, then we need to force link up. 77375eba5b6SRobert Mustacchi **/ 77475eba5b6SRobert Mustacchi s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw) 77575eba5b6SRobert Mustacchi { 77675eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 77775eba5b6SRobert Mustacchi u32 rxcw; 77875eba5b6SRobert Mustacchi u32 ctrl; 77975eba5b6SRobert Mustacchi u32 status; 78075eba5b6SRobert Mustacchi s32 ret_val; 78175eba5b6SRobert Mustacchi 78275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_check_for_fiber_link_generic"); 78375eba5b6SRobert Mustacchi 78475eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 78575eba5b6SRobert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS); 78675eba5b6SRobert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW); 78775eba5b6SRobert Mustacchi 78875eba5b6SRobert Mustacchi /* If we don't have link (auto-negotiation failed or link partner 78975eba5b6SRobert Mustacchi * cannot auto-negotiate), the cable is plugged in (we have signal), 79075eba5b6SRobert Mustacchi * and our link partner is not trying to auto-negotiate with us (we 79175eba5b6SRobert Mustacchi * are receiving idles or data), we need to force link up. We also 79275eba5b6SRobert Mustacchi * need to give auto-negotiation time to complete, in case the cable 79375eba5b6SRobert Mustacchi * was just plugged in. The autoneg_failed flag does this. 79475eba5b6SRobert Mustacchi */ 79575eba5b6SRobert Mustacchi /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ 79675eba5b6SRobert Mustacchi if ((ctrl & E1000_CTRL_SWDPIN1) && !(status & E1000_STATUS_LU) && 79775eba5b6SRobert Mustacchi !(rxcw & E1000_RXCW_C)) { 79875eba5b6SRobert Mustacchi if (!mac->autoneg_failed) { 79975eba5b6SRobert Mustacchi mac->autoneg_failed = TRUE; 80075eba5b6SRobert Mustacchi return E1000_SUCCESS; 80175eba5b6SRobert Mustacchi } 80275eba5b6SRobert Mustacchi DEBUGOUT("NOT Rx'ing /C/, disable AutoNeg and force link.\n"); 80375eba5b6SRobert Mustacchi 80475eba5b6SRobert Mustacchi /* Disable auto-negotiation in the TXCW register */ 80575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE)); 80675eba5b6SRobert Mustacchi 80775eba5b6SRobert Mustacchi /* Force link-up and also force full-duplex. */ 80875eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 80975eba5b6SRobert Mustacchi ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); 81075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 81175eba5b6SRobert Mustacchi 81275eba5b6SRobert Mustacchi /* Configure Flow Control after forcing link up. */ 81375eba5b6SRobert Mustacchi ret_val = e1000_config_fc_after_link_up_generic(hw); 81475eba5b6SRobert Mustacchi if (ret_val) { 81575eba5b6SRobert Mustacchi DEBUGOUT("Error configuring flow control\n"); 81675eba5b6SRobert Mustacchi return ret_val; 81775eba5b6SRobert Mustacchi } 81875eba5b6SRobert Mustacchi } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { 81975eba5b6SRobert Mustacchi /* If we are forcing link and we are receiving /C/ ordered 82075eba5b6SRobert Mustacchi * sets, re-enable auto-negotiation in the TXCW register 82175eba5b6SRobert Mustacchi * and disable forced link in the Device Control register 82275eba5b6SRobert Mustacchi * in an attempt to auto-negotiate with our link partner. 82375eba5b6SRobert Mustacchi */ 82475eba5b6SRobert Mustacchi DEBUGOUT("Rx'ing /C/, enable AutoNeg and stop forcing link.\n"); 82575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); 82675eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); 82775eba5b6SRobert Mustacchi 82875eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 82975eba5b6SRobert Mustacchi } 83075eba5b6SRobert Mustacchi 83175eba5b6SRobert Mustacchi return E1000_SUCCESS; 83275eba5b6SRobert Mustacchi } 83375eba5b6SRobert Mustacchi 83475eba5b6SRobert Mustacchi /** 83575eba5b6SRobert Mustacchi * e1000_check_for_serdes_link_generic - Check for link (Serdes) 83675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 83775eba5b6SRobert Mustacchi * 83875eba5b6SRobert Mustacchi * Checks for link up on the hardware. If link is not up and we have 83975eba5b6SRobert Mustacchi * a signal, then we need to force link up. 84075eba5b6SRobert Mustacchi **/ 84175eba5b6SRobert Mustacchi s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw) 84275eba5b6SRobert Mustacchi { 84375eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 84475eba5b6SRobert Mustacchi u32 rxcw; 84575eba5b6SRobert Mustacchi u32 ctrl; 84675eba5b6SRobert Mustacchi u32 status; 84775eba5b6SRobert Mustacchi s32 ret_val; 84875eba5b6SRobert Mustacchi 84975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_check_for_serdes_link_generic"); 85075eba5b6SRobert Mustacchi 85175eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 85275eba5b6SRobert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS); 85375eba5b6SRobert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW); 85475eba5b6SRobert Mustacchi 85575eba5b6SRobert Mustacchi /* If we don't have link (auto-negotiation failed or link partner 85675eba5b6SRobert Mustacchi * cannot auto-negotiate), and our link partner is not trying to 85775eba5b6SRobert Mustacchi * auto-negotiate with us (we are receiving idles or data), 85875eba5b6SRobert Mustacchi * we need to force link up. We also need to give auto-negotiation 85975eba5b6SRobert Mustacchi * time to complete. 86075eba5b6SRobert Mustacchi */ 86175eba5b6SRobert Mustacchi /* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */ 86275eba5b6SRobert Mustacchi if (!(status & E1000_STATUS_LU) && !(rxcw & E1000_RXCW_C)) { 86375eba5b6SRobert Mustacchi if (!mac->autoneg_failed) { 86475eba5b6SRobert Mustacchi mac->autoneg_failed = TRUE; 86575eba5b6SRobert Mustacchi return E1000_SUCCESS; 86675eba5b6SRobert Mustacchi } 86775eba5b6SRobert Mustacchi DEBUGOUT("NOT Rx'ing /C/, disable AutoNeg and force link.\n"); 86875eba5b6SRobert Mustacchi 86975eba5b6SRobert Mustacchi /* Disable auto-negotiation in the TXCW register */ 87075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE)); 87175eba5b6SRobert Mustacchi 87275eba5b6SRobert Mustacchi /* Force link-up and also force full-duplex. */ 87375eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 87475eba5b6SRobert Mustacchi ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); 87575eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 87675eba5b6SRobert Mustacchi 87775eba5b6SRobert Mustacchi /* Configure Flow Control after forcing link up. */ 87875eba5b6SRobert Mustacchi ret_val = e1000_config_fc_after_link_up_generic(hw); 87975eba5b6SRobert Mustacchi if (ret_val) { 88075eba5b6SRobert Mustacchi DEBUGOUT("Error configuring flow control\n"); 88175eba5b6SRobert Mustacchi return ret_val; 88275eba5b6SRobert Mustacchi } 88375eba5b6SRobert Mustacchi } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { 88475eba5b6SRobert Mustacchi /* If we are forcing link and we are receiving /C/ ordered 88575eba5b6SRobert Mustacchi * sets, re-enable auto-negotiation in the TXCW register 88675eba5b6SRobert Mustacchi * and disable forced link in the Device Control register 88775eba5b6SRobert Mustacchi * in an attempt to auto-negotiate with our link partner. 88875eba5b6SRobert Mustacchi */ 88975eba5b6SRobert Mustacchi DEBUGOUT("Rx'ing /C/, enable AutoNeg and stop forcing link.\n"); 89075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); 89175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); 89275eba5b6SRobert Mustacchi 89375eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 89475eba5b6SRobert Mustacchi } else if (!(E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW))) { 89575eba5b6SRobert Mustacchi /* If we force link for non-auto-negotiation switch, check 89675eba5b6SRobert Mustacchi * link status based on MAC synchronization for internal 89775eba5b6SRobert Mustacchi * serdes media type. 89875eba5b6SRobert Mustacchi */ 89975eba5b6SRobert Mustacchi /* SYNCH bit and IV bit are sticky. */ 90075eba5b6SRobert Mustacchi usec_delay(10); 90175eba5b6SRobert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW); 90275eba5b6SRobert Mustacchi if (rxcw & E1000_RXCW_SYNCH) { 90375eba5b6SRobert Mustacchi if (!(rxcw & E1000_RXCW_IV)) { 90475eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 90575eba5b6SRobert Mustacchi DEBUGOUT("SERDES: Link up - forced.\n"); 90675eba5b6SRobert Mustacchi } 90775eba5b6SRobert Mustacchi } else { 90875eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 90975eba5b6SRobert Mustacchi DEBUGOUT("SERDES: Link down - force failed.\n"); 91075eba5b6SRobert Mustacchi } 91175eba5b6SRobert Mustacchi } 91275eba5b6SRobert Mustacchi 91375eba5b6SRobert Mustacchi if (E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW)) { 91475eba5b6SRobert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS); 91575eba5b6SRobert Mustacchi if (status & E1000_STATUS_LU) { 91675eba5b6SRobert Mustacchi /* SYNCH bit and IV bit are sticky, so reread rxcw. */ 91775eba5b6SRobert Mustacchi usec_delay(10); 91875eba5b6SRobert Mustacchi rxcw = E1000_READ_REG(hw, E1000_RXCW); 91975eba5b6SRobert Mustacchi if (rxcw & E1000_RXCW_SYNCH) { 92075eba5b6SRobert Mustacchi if (!(rxcw & E1000_RXCW_IV)) { 92175eba5b6SRobert Mustacchi mac->serdes_has_link = TRUE; 92275eba5b6SRobert Mustacchi DEBUGOUT("SERDES: Link up - autoneg completed successfully.\n"); 92375eba5b6SRobert Mustacchi } else { 92475eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 92575eba5b6SRobert Mustacchi DEBUGOUT("SERDES: Link down - invalid codewords detected in autoneg.\n"); 92675eba5b6SRobert Mustacchi } 92775eba5b6SRobert Mustacchi } else { 92875eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 92975eba5b6SRobert Mustacchi DEBUGOUT("SERDES: Link down - no sync.\n"); 93075eba5b6SRobert Mustacchi } 93175eba5b6SRobert Mustacchi } else { 93275eba5b6SRobert Mustacchi mac->serdes_has_link = FALSE; 93375eba5b6SRobert Mustacchi DEBUGOUT("SERDES: Link down - autoneg failed\n"); 93475eba5b6SRobert Mustacchi } 93575eba5b6SRobert Mustacchi } 93675eba5b6SRobert Mustacchi 93775eba5b6SRobert Mustacchi return E1000_SUCCESS; 93875eba5b6SRobert Mustacchi } 93975eba5b6SRobert Mustacchi 94075eba5b6SRobert Mustacchi /** 94175eba5b6SRobert Mustacchi * e1000_set_default_fc_generic - Set flow control default values 94275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 94375eba5b6SRobert Mustacchi * 94475eba5b6SRobert Mustacchi * Read the EEPROM for the default values for flow control and store the 94575eba5b6SRobert Mustacchi * values. 94675eba5b6SRobert Mustacchi **/ 94775eba5b6SRobert Mustacchi s32 e1000_set_default_fc_generic(struct e1000_hw *hw) 94875eba5b6SRobert Mustacchi { 94975eba5b6SRobert Mustacchi s32 ret_val; 95075eba5b6SRobert Mustacchi u16 nvm_data; 951c124a83eSRobert Mustacchi u16 nvm_offset = 0; 95275eba5b6SRobert Mustacchi 95375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_default_fc_generic"); 95475eba5b6SRobert Mustacchi 95575eba5b6SRobert Mustacchi /* Read and store word 0x0F of the EEPROM. This word contains bits 95675eba5b6SRobert Mustacchi * that determine the hardware's default PAUSE (flow control) mode, 95775eba5b6SRobert Mustacchi * a bit that determines whether the HW defaults to enabling or 95875eba5b6SRobert Mustacchi * disabling auto-negotiation, and the direction of the 95975eba5b6SRobert Mustacchi * SW defined pins. If there is no SW over-ride of the flow 96075eba5b6SRobert Mustacchi * control setting, then the variable hw->fc will 96175eba5b6SRobert Mustacchi * be initialized based on a value in the EEPROM. 96275eba5b6SRobert Mustacchi */ 963c124a83eSRobert Mustacchi if (hw->mac.type == e1000_i350) { 964c124a83eSRobert Mustacchi nvm_offset = NVM_82580_LAN_FUNC_OFFSET(hw->bus.func); 965c124a83eSRobert Mustacchi ret_val = hw->nvm.ops.read(hw, 966c124a83eSRobert Mustacchi NVM_INIT_CONTROL2_REG + 967c124a83eSRobert Mustacchi nvm_offset, 968c124a83eSRobert Mustacchi 1, &nvm_data); 969c124a83eSRobert Mustacchi } else { 970c124a83eSRobert Mustacchi ret_val = hw->nvm.ops.read(hw, 971c124a83eSRobert Mustacchi NVM_INIT_CONTROL2_REG, 972c124a83eSRobert Mustacchi 1, &nvm_data); 973c124a83eSRobert Mustacchi } 974c124a83eSRobert Mustacchi 97575eba5b6SRobert Mustacchi 97675eba5b6SRobert Mustacchi if (ret_val) { 97775eba5b6SRobert Mustacchi DEBUGOUT("NVM Read Error\n"); 97875eba5b6SRobert Mustacchi return ret_val; 97975eba5b6SRobert Mustacchi } 98075eba5b6SRobert Mustacchi 98175eba5b6SRobert Mustacchi if (!(nvm_data & NVM_WORD0F_PAUSE_MASK)) 98275eba5b6SRobert Mustacchi hw->fc.requested_mode = e1000_fc_none; 98375eba5b6SRobert Mustacchi else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 98475eba5b6SRobert Mustacchi NVM_WORD0F_ASM_DIR) 98575eba5b6SRobert Mustacchi hw->fc.requested_mode = e1000_fc_tx_pause; 98675eba5b6SRobert Mustacchi else 98775eba5b6SRobert Mustacchi hw->fc.requested_mode = e1000_fc_full; 98875eba5b6SRobert Mustacchi 98975eba5b6SRobert Mustacchi return E1000_SUCCESS; 99075eba5b6SRobert Mustacchi } 99175eba5b6SRobert Mustacchi 99275eba5b6SRobert Mustacchi /** 99375eba5b6SRobert Mustacchi * e1000_setup_link_generic - Setup flow control and link settings 99475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 99575eba5b6SRobert Mustacchi * 99675eba5b6SRobert Mustacchi * Determines which flow control settings to use, then configures flow 99775eba5b6SRobert Mustacchi * control. Calls the appropriate media-specific link configuration 99875eba5b6SRobert Mustacchi * function. Assuming the adapter has a valid link partner, a valid link 99975eba5b6SRobert Mustacchi * should be established. Assumes the hardware has previously been reset 100075eba5b6SRobert Mustacchi * and the transmitter and receiver are not enabled. 100175eba5b6SRobert Mustacchi **/ 100275eba5b6SRobert Mustacchi s32 e1000_setup_link_generic(struct e1000_hw *hw) 100375eba5b6SRobert Mustacchi { 100475eba5b6SRobert Mustacchi s32 ret_val; 100575eba5b6SRobert Mustacchi 100675eba5b6SRobert Mustacchi DEBUGFUNC("e1000_setup_link_generic"); 100775eba5b6SRobert Mustacchi 100875eba5b6SRobert Mustacchi /* In the case of the phy reset being blocked, we already have a link. 100975eba5b6SRobert Mustacchi * We do not need to set it up again. 101075eba5b6SRobert Mustacchi */ 101175eba5b6SRobert Mustacchi if (hw->phy.ops.check_reset_block && hw->phy.ops.check_reset_block(hw)) 101275eba5b6SRobert Mustacchi return E1000_SUCCESS; 101375eba5b6SRobert Mustacchi 101475eba5b6SRobert Mustacchi /* If requested flow control is set to default, set flow control 101575eba5b6SRobert Mustacchi * based on the EEPROM flow control settings. 101675eba5b6SRobert Mustacchi */ 101775eba5b6SRobert Mustacchi if (hw->fc.requested_mode == e1000_fc_default) { 101875eba5b6SRobert Mustacchi ret_val = e1000_set_default_fc_generic(hw); 101975eba5b6SRobert Mustacchi if (ret_val) 102075eba5b6SRobert Mustacchi return ret_val; 102175eba5b6SRobert Mustacchi } 102275eba5b6SRobert Mustacchi 102375eba5b6SRobert Mustacchi /* Save off the requested flow control mode for use later. Depending 102475eba5b6SRobert Mustacchi * on the link partner's capabilities, we may or may not use this mode. 102575eba5b6SRobert Mustacchi */ 102675eba5b6SRobert Mustacchi hw->fc.current_mode = hw->fc.requested_mode; 102775eba5b6SRobert Mustacchi 102875eba5b6SRobert Mustacchi DEBUGOUT1("After fix-ups FlowControl is now = %x\n", 102975eba5b6SRobert Mustacchi hw->fc.current_mode); 103075eba5b6SRobert Mustacchi 103175eba5b6SRobert Mustacchi /* Call the necessary media_type subroutine to configure the link. */ 103275eba5b6SRobert Mustacchi ret_val = hw->mac.ops.setup_physical_interface(hw); 103375eba5b6SRobert Mustacchi if (ret_val) 103475eba5b6SRobert Mustacchi return ret_val; 103575eba5b6SRobert Mustacchi 103675eba5b6SRobert Mustacchi /* Initialize the flow control address, type, and PAUSE timer 103775eba5b6SRobert Mustacchi * registers to their default values. This is done even if flow 103875eba5b6SRobert Mustacchi * control is disabled, because it does not hurt anything to 103975eba5b6SRobert Mustacchi * initialize these registers. 104075eba5b6SRobert Mustacchi */ 104175eba5b6SRobert Mustacchi DEBUGOUT("Initializing the Flow Control address, type and timer regs\n"); 104275eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_FCT, FLOW_CONTROL_TYPE); 104375eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_FCAH, FLOW_CONTROL_ADDRESS_HIGH); 104475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_FCAL, FLOW_CONTROL_ADDRESS_LOW); 104575eba5b6SRobert Mustacchi 104675eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time); 104775eba5b6SRobert Mustacchi 104875eba5b6SRobert Mustacchi return e1000_set_fc_watermarks_generic(hw); 104975eba5b6SRobert Mustacchi } 105075eba5b6SRobert Mustacchi 105175eba5b6SRobert Mustacchi /** 105275eba5b6SRobert Mustacchi * e1000_commit_fc_settings_generic - Configure flow control 105375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 105475eba5b6SRobert Mustacchi * 105575eba5b6SRobert Mustacchi * Write the flow control settings to the Transmit Config Word Register (TXCW) 105675eba5b6SRobert Mustacchi * base on the flow control settings in e1000_mac_info. 105775eba5b6SRobert Mustacchi **/ 105875eba5b6SRobert Mustacchi s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw) 105975eba5b6SRobert Mustacchi { 106075eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 106175eba5b6SRobert Mustacchi u32 txcw; 106275eba5b6SRobert Mustacchi 106375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_commit_fc_settings_generic"); 106475eba5b6SRobert Mustacchi 106575eba5b6SRobert Mustacchi /* Check for a software override of the flow control settings, and 106675eba5b6SRobert Mustacchi * setup the device accordingly. If auto-negotiation is enabled, then 106775eba5b6SRobert Mustacchi * software will have to set the "PAUSE" bits to the correct value in 106875eba5b6SRobert Mustacchi * the Transmit Config Word Register (TXCW) and re-start auto- 106975eba5b6SRobert Mustacchi * negotiation. However, if auto-negotiation is disabled, then 107075eba5b6SRobert Mustacchi * software will have to manually configure the two flow control enable 107175eba5b6SRobert Mustacchi * bits in the CTRL register. 107275eba5b6SRobert Mustacchi * 107375eba5b6SRobert Mustacchi * The possible values of the "fc" parameter are: 107475eba5b6SRobert Mustacchi * 0: Flow control is completely disabled 107575eba5b6SRobert Mustacchi * 1: Rx flow control is enabled (we can receive pause frames, 107675eba5b6SRobert Mustacchi * but not send pause frames). 107775eba5b6SRobert Mustacchi * 2: Tx flow control is enabled (we can send pause frames but we 107875eba5b6SRobert Mustacchi * do not support receiving pause frames). 107975eba5b6SRobert Mustacchi * 3: Both Rx and Tx flow control (symmetric) are enabled. 108075eba5b6SRobert Mustacchi */ 108175eba5b6SRobert Mustacchi switch (hw->fc.current_mode) { 108275eba5b6SRobert Mustacchi case e1000_fc_none: 108375eba5b6SRobert Mustacchi /* Flow control completely disabled by a software over-ride. */ 108475eba5b6SRobert Mustacchi txcw = (E1000_TXCW_ANE | E1000_TXCW_FD); 108575eba5b6SRobert Mustacchi break; 108675eba5b6SRobert Mustacchi case e1000_fc_rx_pause: 108775eba5b6SRobert Mustacchi /* Rx Flow control is enabled and Tx Flow control is disabled 108875eba5b6SRobert Mustacchi * by a software over-ride. Since there really isn't a way to 108975eba5b6SRobert Mustacchi * advertise that we are capable of Rx Pause ONLY, we will 109075eba5b6SRobert Mustacchi * advertise that we support both symmetric and asymmetric Rx 109175eba5b6SRobert Mustacchi * PAUSE. Later, we will disable the adapter's ability to send 109275eba5b6SRobert Mustacchi * PAUSE frames. 109375eba5b6SRobert Mustacchi */ 109475eba5b6SRobert Mustacchi txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); 109575eba5b6SRobert Mustacchi break; 109675eba5b6SRobert Mustacchi case e1000_fc_tx_pause: 109775eba5b6SRobert Mustacchi /* Tx Flow control is enabled, and Rx Flow control is disabled, 109875eba5b6SRobert Mustacchi * by a software over-ride. 109975eba5b6SRobert Mustacchi */ 110075eba5b6SRobert Mustacchi txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR); 110175eba5b6SRobert Mustacchi break; 110275eba5b6SRobert Mustacchi case e1000_fc_full: 110375eba5b6SRobert Mustacchi /* Flow control (both Rx and Tx) is enabled by a software 110475eba5b6SRobert Mustacchi * over-ride. 110575eba5b6SRobert Mustacchi */ 110675eba5b6SRobert Mustacchi txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); 110775eba5b6SRobert Mustacchi break; 110875eba5b6SRobert Mustacchi default: 110975eba5b6SRobert Mustacchi DEBUGOUT("Flow control param set incorrectly\n"); 111075eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 111175eba5b6SRobert Mustacchi break; 111275eba5b6SRobert Mustacchi } 111375eba5b6SRobert Mustacchi 111475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TXCW, txcw); 111575eba5b6SRobert Mustacchi mac->txcw = txcw; 111675eba5b6SRobert Mustacchi 111775eba5b6SRobert Mustacchi return E1000_SUCCESS; 111875eba5b6SRobert Mustacchi } 111975eba5b6SRobert Mustacchi 112075eba5b6SRobert Mustacchi /** 112175eba5b6SRobert Mustacchi * e1000_poll_fiber_serdes_link_generic - Poll for link up 112275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 112375eba5b6SRobert Mustacchi * 112475eba5b6SRobert Mustacchi * Polls for link up by reading the status register, if link fails to come 112575eba5b6SRobert Mustacchi * up with auto-negotiation, then the link is forced if a signal is detected. 112675eba5b6SRobert Mustacchi **/ 112775eba5b6SRobert Mustacchi s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw) 112875eba5b6SRobert Mustacchi { 112975eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 113075eba5b6SRobert Mustacchi u32 i, status; 113175eba5b6SRobert Mustacchi s32 ret_val; 113275eba5b6SRobert Mustacchi 113375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_poll_fiber_serdes_link_generic"); 113475eba5b6SRobert Mustacchi 113575eba5b6SRobert Mustacchi /* If we have a signal (the cable is plugged in, or assumed TRUE for 113675eba5b6SRobert Mustacchi * serdes media) then poll for a "Link-Up" indication in the Device 113775eba5b6SRobert Mustacchi * Status Register. Time-out if a link isn't seen in 500 milliseconds 113875eba5b6SRobert Mustacchi * seconds (Auto-negotiation should complete in less than 500 113975eba5b6SRobert Mustacchi * milliseconds even if the other end is doing it in SW). 114075eba5b6SRobert Mustacchi */ 114175eba5b6SRobert Mustacchi for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) { 114275eba5b6SRobert Mustacchi msec_delay(10); 114375eba5b6SRobert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS); 114475eba5b6SRobert Mustacchi if (status & E1000_STATUS_LU) 114575eba5b6SRobert Mustacchi break; 114675eba5b6SRobert Mustacchi } 114775eba5b6SRobert Mustacchi if (i == FIBER_LINK_UP_LIMIT) { 114875eba5b6SRobert Mustacchi DEBUGOUT("Never got a valid link from auto-neg!!!\n"); 114975eba5b6SRobert Mustacchi mac->autoneg_failed = TRUE; 115075eba5b6SRobert Mustacchi /* AutoNeg failed to achieve a link, so we'll call 115175eba5b6SRobert Mustacchi * mac->check_for_link. This routine will force the 115275eba5b6SRobert Mustacchi * link up if we detect a signal. This will allow us to 115375eba5b6SRobert Mustacchi * communicate with non-autonegotiating link partners. 115475eba5b6SRobert Mustacchi */ 115575eba5b6SRobert Mustacchi ret_val = mac->ops.check_for_link(hw); 115675eba5b6SRobert Mustacchi if (ret_val) { 115775eba5b6SRobert Mustacchi DEBUGOUT("Error while checking for link\n"); 115875eba5b6SRobert Mustacchi return ret_val; 115975eba5b6SRobert Mustacchi } 116075eba5b6SRobert Mustacchi mac->autoneg_failed = FALSE; 116175eba5b6SRobert Mustacchi } else { 116275eba5b6SRobert Mustacchi mac->autoneg_failed = FALSE; 116375eba5b6SRobert Mustacchi DEBUGOUT("Valid Link Found\n"); 116475eba5b6SRobert Mustacchi } 116575eba5b6SRobert Mustacchi 116675eba5b6SRobert Mustacchi return E1000_SUCCESS; 116775eba5b6SRobert Mustacchi } 116875eba5b6SRobert Mustacchi 116975eba5b6SRobert Mustacchi /** 117075eba5b6SRobert Mustacchi * e1000_setup_fiber_serdes_link_generic - Setup link for fiber/serdes 117175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 117275eba5b6SRobert Mustacchi * 117375eba5b6SRobert Mustacchi * Configures collision distance and flow control for fiber and serdes 117475eba5b6SRobert Mustacchi * links. Upon successful setup, poll for link. 117575eba5b6SRobert Mustacchi **/ 117675eba5b6SRobert Mustacchi s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw) 117775eba5b6SRobert Mustacchi { 117875eba5b6SRobert Mustacchi u32 ctrl; 117975eba5b6SRobert Mustacchi s32 ret_val; 118075eba5b6SRobert Mustacchi 118175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_setup_fiber_serdes_link_generic"); 118275eba5b6SRobert Mustacchi 118375eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 118475eba5b6SRobert Mustacchi 118575eba5b6SRobert Mustacchi /* Take the link out of reset */ 118675eba5b6SRobert Mustacchi ctrl &= ~E1000_CTRL_LRST; 118775eba5b6SRobert Mustacchi 118875eba5b6SRobert Mustacchi hw->mac.ops.config_collision_dist(hw); 118975eba5b6SRobert Mustacchi 119075eba5b6SRobert Mustacchi ret_val = e1000_commit_fc_settings_generic(hw); 119175eba5b6SRobert Mustacchi if (ret_val) 119275eba5b6SRobert Mustacchi return ret_val; 119375eba5b6SRobert Mustacchi 119475eba5b6SRobert Mustacchi /* Since auto-negotiation is enabled, take the link out of reset (the 119575eba5b6SRobert Mustacchi * link will be in reset, because we previously reset the chip). This 119675eba5b6SRobert Mustacchi * will restart auto-negotiation. If auto-negotiation is successful 119775eba5b6SRobert Mustacchi * then the link-up status bit will be set and the flow control enable 119875eba5b6SRobert Mustacchi * bits (RFCE and TFCE) will be set according to their negotiated value. 119975eba5b6SRobert Mustacchi */ 120075eba5b6SRobert Mustacchi DEBUGOUT("Auto-negotiation enabled\n"); 120175eba5b6SRobert Mustacchi 120275eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 120375eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 120475eba5b6SRobert Mustacchi msec_delay(1); 120575eba5b6SRobert Mustacchi 120675eba5b6SRobert Mustacchi /* For these adapters, the SW definable pin 1 is set when the optics 120775eba5b6SRobert Mustacchi * detect a signal. If we have a signal, then poll for a "Link-Up" 120875eba5b6SRobert Mustacchi * indication. 120975eba5b6SRobert Mustacchi */ 121075eba5b6SRobert Mustacchi if (hw->phy.media_type == e1000_media_type_internal_serdes || 121175eba5b6SRobert Mustacchi (E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) { 121275eba5b6SRobert Mustacchi ret_val = e1000_poll_fiber_serdes_link_generic(hw); 121375eba5b6SRobert Mustacchi } else { 121475eba5b6SRobert Mustacchi DEBUGOUT("No signal detected\n"); 121575eba5b6SRobert Mustacchi } 121675eba5b6SRobert Mustacchi 121775eba5b6SRobert Mustacchi return ret_val; 121875eba5b6SRobert Mustacchi } 121975eba5b6SRobert Mustacchi 122075eba5b6SRobert Mustacchi /** 122175eba5b6SRobert Mustacchi * e1000_config_collision_dist_generic - Configure collision distance 122275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 122375eba5b6SRobert Mustacchi * 122475eba5b6SRobert Mustacchi * Configures the collision distance to the default value and is used 122575eba5b6SRobert Mustacchi * during link setup. 122675eba5b6SRobert Mustacchi **/ 122775eba5b6SRobert Mustacchi static void e1000_config_collision_dist_generic(struct e1000_hw *hw) 122875eba5b6SRobert Mustacchi { 122975eba5b6SRobert Mustacchi u32 tctl; 123075eba5b6SRobert Mustacchi 123175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_config_collision_dist_generic"); 123275eba5b6SRobert Mustacchi 123375eba5b6SRobert Mustacchi tctl = E1000_READ_REG(hw, E1000_TCTL); 123475eba5b6SRobert Mustacchi 123575eba5b6SRobert Mustacchi tctl &= ~E1000_TCTL_COLD; 123675eba5b6SRobert Mustacchi tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT; 123775eba5b6SRobert Mustacchi 123875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_TCTL, tctl); 123975eba5b6SRobert Mustacchi E1000_WRITE_FLUSH(hw); 124075eba5b6SRobert Mustacchi } 124175eba5b6SRobert Mustacchi 124275eba5b6SRobert Mustacchi /** 124375eba5b6SRobert Mustacchi * e1000_set_fc_watermarks_generic - Set flow control high/low watermarks 124475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 124575eba5b6SRobert Mustacchi * 124675eba5b6SRobert Mustacchi * Sets the flow control high/low threshold (watermark) registers. If 124775eba5b6SRobert Mustacchi * flow control XON frame transmission is enabled, then set XON frame 124875eba5b6SRobert Mustacchi * transmission as well. 124975eba5b6SRobert Mustacchi **/ 125075eba5b6SRobert Mustacchi s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw) 125175eba5b6SRobert Mustacchi { 125275eba5b6SRobert Mustacchi u32 fcrtl = 0, fcrth = 0; 125375eba5b6SRobert Mustacchi 125475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_fc_watermarks_generic"); 125575eba5b6SRobert Mustacchi 125675eba5b6SRobert Mustacchi /* Set the flow control receive threshold registers. Normally, 125775eba5b6SRobert Mustacchi * these registers will be set to a default threshold that may be 125875eba5b6SRobert Mustacchi * adjusted later by the driver's runtime code. However, if the 125975eba5b6SRobert Mustacchi * ability to transmit pause frames is not enabled, then these 126075eba5b6SRobert Mustacchi * registers will be set to 0. 126175eba5b6SRobert Mustacchi */ 126275eba5b6SRobert Mustacchi if (hw->fc.current_mode & e1000_fc_tx_pause) { 126375eba5b6SRobert Mustacchi /* We need to set up the Receive Threshold high and low water 126475eba5b6SRobert Mustacchi * marks as well as (optionally) enabling the transmission of 126575eba5b6SRobert Mustacchi * XON frames. 126675eba5b6SRobert Mustacchi */ 126775eba5b6SRobert Mustacchi fcrtl = hw->fc.low_water; 126875eba5b6SRobert Mustacchi if (hw->fc.send_xon) 126975eba5b6SRobert Mustacchi fcrtl |= E1000_FCRTL_XONE; 127075eba5b6SRobert Mustacchi 127175eba5b6SRobert Mustacchi fcrth = hw->fc.high_water; 127275eba5b6SRobert Mustacchi } 127375eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_FCRTL, fcrtl); 127475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_FCRTH, fcrth); 127575eba5b6SRobert Mustacchi 127675eba5b6SRobert Mustacchi return E1000_SUCCESS; 127775eba5b6SRobert Mustacchi } 127875eba5b6SRobert Mustacchi 127975eba5b6SRobert Mustacchi /** 128075eba5b6SRobert Mustacchi * e1000_force_mac_fc_generic - Force the MAC's flow control settings 128175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 128275eba5b6SRobert Mustacchi * 128375eba5b6SRobert Mustacchi * Force the MAC's flow control settings. Sets the TFCE and RFCE bits in the 128475eba5b6SRobert Mustacchi * device control register to reflect the adapter settings. TFCE and RFCE 128575eba5b6SRobert Mustacchi * need to be explicitly set by software when a copper PHY is used because 128675eba5b6SRobert Mustacchi * autonegotiation is managed by the PHY rather than the MAC. Software must 128775eba5b6SRobert Mustacchi * also configure these bits when link is forced on a fiber connection. 128875eba5b6SRobert Mustacchi **/ 128975eba5b6SRobert Mustacchi s32 e1000_force_mac_fc_generic(struct e1000_hw *hw) 129075eba5b6SRobert Mustacchi { 129175eba5b6SRobert Mustacchi u32 ctrl; 129275eba5b6SRobert Mustacchi 129375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_force_mac_fc_generic"); 129475eba5b6SRobert Mustacchi 129575eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 129675eba5b6SRobert Mustacchi 129775eba5b6SRobert Mustacchi /* Because we didn't get link via the internal auto-negotiation 129875eba5b6SRobert Mustacchi * mechanism (we either forced link or we got link via PHY 129975eba5b6SRobert Mustacchi * auto-neg), we have to manually enable/disable transmit an 130075eba5b6SRobert Mustacchi * receive flow control. 130175eba5b6SRobert Mustacchi * 130275eba5b6SRobert Mustacchi * The "Case" statement below enables/disable flow control 130375eba5b6SRobert Mustacchi * according to the "hw->fc.current_mode" parameter. 130475eba5b6SRobert Mustacchi * 130575eba5b6SRobert Mustacchi * The possible values of the "fc" parameter are: 130675eba5b6SRobert Mustacchi * 0: Flow control is completely disabled 130775eba5b6SRobert Mustacchi * 1: Rx flow control is enabled (we can receive pause 130875eba5b6SRobert Mustacchi * frames but not send pause frames). 130975eba5b6SRobert Mustacchi * 2: Tx flow control is enabled (we can send pause frames 131075eba5b6SRobert Mustacchi * frames but we do not receive pause frames). 131175eba5b6SRobert Mustacchi * 3: Both Rx and Tx flow control (symmetric) is enabled. 131275eba5b6SRobert Mustacchi * other: No other values should be possible at this point. 131375eba5b6SRobert Mustacchi */ 131475eba5b6SRobert Mustacchi DEBUGOUT1("hw->fc.current_mode = %u\n", hw->fc.current_mode); 131575eba5b6SRobert Mustacchi 131675eba5b6SRobert Mustacchi switch (hw->fc.current_mode) { 131775eba5b6SRobert Mustacchi case e1000_fc_none: 131875eba5b6SRobert Mustacchi ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE)); 131975eba5b6SRobert Mustacchi break; 132075eba5b6SRobert Mustacchi case e1000_fc_rx_pause: 132175eba5b6SRobert Mustacchi ctrl &= (~E1000_CTRL_TFCE); 132275eba5b6SRobert Mustacchi ctrl |= E1000_CTRL_RFCE; 132375eba5b6SRobert Mustacchi break; 132475eba5b6SRobert Mustacchi case e1000_fc_tx_pause: 132575eba5b6SRobert Mustacchi ctrl &= (~E1000_CTRL_RFCE); 132675eba5b6SRobert Mustacchi ctrl |= E1000_CTRL_TFCE; 132775eba5b6SRobert Mustacchi break; 132875eba5b6SRobert Mustacchi case e1000_fc_full: 132975eba5b6SRobert Mustacchi ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE); 133075eba5b6SRobert Mustacchi break; 133175eba5b6SRobert Mustacchi default: 133275eba5b6SRobert Mustacchi DEBUGOUT("Flow control param set incorrectly\n"); 133375eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 133475eba5b6SRobert Mustacchi } 133575eba5b6SRobert Mustacchi 133675eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 133775eba5b6SRobert Mustacchi 133875eba5b6SRobert Mustacchi return E1000_SUCCESS; 133975eba5b6SRobert Mustacchi } 134075eba5b6SRobert Mustacchi 134175eba5b6SRobert Mustacchi /** 134275eba5b6SRobert Mustacchi * e1000_config_fc_after_link_up_generic - Configures flow control after link 134375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 134475eba5b6SRobert Mustacchi * 134575eba5b6SRobert Mustacchi * Checks the status of auto-negotiation after link up to ensure that the 134675eba5b6SRobert Mustacchi * speed and duplex were not forced. If the link needed to be forced, then 134775eba5b6SRobert Mustacchi * flow control needs to be forced also. If auto-negotiation is enabled 134875eba5b6SRobert Mustacchi * and did not fail, then we configure flow control based on our link 134975eba5b6SRobert Mustacchi * partner. 135075eba5b6SRobert Mustacchi **/ 135175eba5b6SRobert Mustacchi s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) 135275eba5b6SRobert Mustacchi { 135375eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 135475eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 135575eba5b6SRobert Mustacchi u32 pcs_status_reg, pcs_adv_reg, pcs_lp_ability_reg, pcs_ctrl_reg; 135675eba5b6SRobert Mustacchi u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg; 135775eba5b6SRobert Mustacchi u16 speed, duplex; 135875eba5b6SRobert Mustacchi 135975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_config_fc_after_link_up_generic"); 136075eba5b6SRobert Mustacchi 136175eba5b6SRobert Mustacchi /* Check for the case where we have fiber media and auto-neg failed 136275eba5b6SRobert Mustacchi * so we had to force link. In this case, we need to force the 136375eba5b6SRobert Mustacchi * configuration of the MAC to match the "fc" parameter. 136475eba5b6SRobert Mustacchi */ 136575eba5b6SRobert Mustacchi if (mac->autoneg_failed) { 136675eba5b6SRobert Mustacchi if (hw->phy.media_type == e1000_media_type_fiber || 136775eba5b6SRobert Mustacchi hw->phy.media_type == e1000_media_type_internal_serdes) 136875eba5b6SRobert Mustacchi ret_val = e1000_force_mac_fc_generic(hw); 136975eba5b6SRobert Mustacchi } else { 137075eba5b6SRobert Mustacchi if (hw->phy.media_type == e1000_media_type_copper) 137175eba5b6SRobert Mustacchi ret_val = e1000_force_mac_fc_generic(hw); 137275eba5b6SRobert Mustacchi } 137375eba5b6SRobert Mustacchi 137475eba5b6SRobert Mustacchi if (ret_val) { 137575eba5b6SRobert Mustacchi DEBUGOUT("Error forcing flow control settings\n"); 137675eba5b6SRobert Mustacchi return ret_val; 137775eba5b6SRobert Mustacchi } 137875eba5b6SRobert Mustacchi 137975eba5b6SRobert Mustacchi /* Check for the case where we have copper media and auto-neg is 138075eba5b6SRobert Mustacchi * enabled. In this case, we need to check and see if Auto-Neg 138175eba5b6SRobert Mustacchi * has completed, and if so, how the PHY and link partner has 138275eba5b6SRobert Mustacchi * flow control configured. 138375eba5b6SRobert Mustacchi */ 138475eba5b6SRobert Mustacchi if ((hw->phy.media_type == e1000_media_type_copper) && mac->autoneg) { 138575eba5b6SRobert Mustacchi /* Read the MII Status Register and check to see if AutoNeg 138675eba5b6SRobert Mustacchi * has completed. We read this twice because this reg has 138775eba5b6SRobert Mustacchi * some "sticky" (latched) bits. 138875eba5b6SRobert Mustacchi */ 138975eba5b6SRobert Mustacchi ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); 139075eba5b6SRobert Mustacchi if (ret_val) 139175eba5b6SRobert Mustacchi return ret_val; 139275eba5b6SRobert Mustacchi ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); 139375eba5b6SRobert Mustacchi if (ret_val) 139475eba5b6SRobert Mustacchi return ret_val; 139575eba5b6SRobert Mustacchi 139675eba5b6SRobert Mustacchi if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) { 139775eba5b6SRobert Mustacchi DEBUGOUT("Copper PHY and Auto Neg has not completed.\n"); 139875eba5b6SRobert Mustacchi return ret_val; 139975eba5b6SRobert Mustacchi } 140075eba5b6SRobert Mustacchi 140175eba5b6SRobert Mustacchi /* The AutoNeg process has completed, so we now need to 140275eba5b6SRobert Mustacchi * read both the Auto Negotiation Advertisement 140375eba5b6SRobert Mustacchi * Register (Address 4) and the Auto_Negotiation Base 140475eba5b6SRobert Mustacchi * Page Ability Register (Address 5) to determine how 140575eba5b6SRobert Mustacchi * flow control was negotiated. 140675eba5b6SRobert Mustacchi */ 140775eba5b6SRobert Mustacchi ret_val = hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV, 140875eba5b6SRobert Mustacchi &mii_nway_adv_reg); 140975eba5b6SRobert Mustacchi if (ret_val) 141075eba5b6SRobert Mustacchi return ret_val; 141175eba5b6SRobert Mustacchi ret_val = hw->phy.ops.read_reg(hw, PHY_LP_ABILITY, 141275eba5b6SRobert Mustacchi &mii_nway_lp_ability_reg); 141375eba5b6SRobert Mustacchi if (ret_val) 141475eba5b6SRobert Mustacchi return ret_val; 141575eba5b6SRobert Mustacchi 141675eba5b6SRobert Mustacchi /* Two bits in the Auto Negotiation Advertisement Register 141775eba5b6SRobert Mustacchi * (Address 4) and two bits in the Auto Negotiation Base 141875eba5b6SRobert Mustacchi * Page Ability Register (Address 5) determine flow control 141975eba5b6SRobert Mustacchi * for both the PHY and the link partner. The following 142075eba5b6SRobert Mustacchi * table, taken out of the IEEE 802.3ab/D6.0 dated March 25, 142175eba5b6SRobert Mustacchi * 1999, describes these PAUSE resolution bits and how flow 142275eba5b6SRobert Mustacchi * control is determined based upon these settings. 142375eba5b6SRobert Mustacchi * NOTE: DC = Don't Care 142475eba5b6SRobert Mustacchi * 142575eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 142675eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution 142775eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 142875eba5b6SRobert Mustacchi * 0 | 0 | DC | DC | e1000_fc_none 142975eba5b6SRobert Mustacchi * 0 | 1 | 0 | DC | e1000_fc_none 143075eba5b6SRobert Mustacchi * 0 | 1 | 1 | 0 | e1000_fc_none 143175eba5b6SRobert Mustacchi * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 143275eba5b6SRobert Mustacchi * 1 | 0 | 0 | DC | e1000_fc_none 143375eba5b6SRobert Mustacchi * 1 | DC | 1 | DC | e1000_fc_full 143475eba5b6SRobert Mustacchi * 1 | 1 | 0 | 0 | e1000_fc_none 143575eba5b6SRobert Mustacchi * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 143675eba5b6SRobert Mustacchi * 143775eba5b6SRobert Mustacchi * Are both PAUSE bits set to 1? If so, this implies 143875eba5b6SRobert Mustacchi * Symmetric Flow Control is enabled at both ends. The 143975eba5b6SRobert Mustacchi * ASM_DIR bits are irrelevant per the spec. 144075eba5b6SRobert Mustacchi * 144175eba5b6SRobert Mustacchi * For Symmetric Flow Control: 144275eba5b6SRobert Mustacchi * 144375eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 144475eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 144575eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 144675eba5b6SRobert Mustacchi * 1 | DC | 1 | DC | E1000_fc_full 144775eba5b6SRobert Mustacchi * 144875eba5b6SRobert Mustacchi */ 144975eba5b6SRobert Mustacchi if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && 145075eba5b6SRobert Mustacchi (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) { 145175eba5b6SRobert Mustacchi /* Now we need to check if the user selected Rx ONLY 145275eba5b6SRobert Mustacchi * of pause frames. In this case, we had to advertise 145375eba5b6SRobert Mustacchi * FULL flow control because we could not advertise Rx 145475eba5b6SRobert Mustacchi * ONLY. Hence, we must now check to see if we need to 145575eba5b6SRobert Mustacchi * turn OFF the TRANSMISSION of PAUSE frames. 145675eba5b6SRobert Mustacchi */ 145775eba5b6SRobert Mustacchi if (hw->fc.requested_mode == e1000_fc_full) { 145875eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_full; 145975eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = FULL.\n"); 146075eba5b6SRobert Mustacchi } else { 146175eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_rx_pause; 146275eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = Rx PAUSE frames only.\n"); 146375eba5b6SRobert Mustacchi } 146475eba5b6SRobert Mustacchi } 146575eba5b6SRobert Mustacchi /* For receiving PAUSE frames ONLY. 146675eba5b6SRobert Mustacchi * 146775eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 146875eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 146975eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 147075eba5b6SRobert Mustacchi * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 147175eba5b6SRobert Mustacchi */ 147275eba5b6SRobert Mustacchi else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) && 147375eba5b6SRobert Mustacchi (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && 147475eba5b6SRobert Mustacchi (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && 147575eba5b6SRobert Mustacchi (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { 147675eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_tx_pause; 147775eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = Tx PAUSE frames only.\n"); 147875eba5b6SRobert Mustacchi } 147975eba5b6SRobert Mustacchi /* For transmitting PAUSE frames ONLY. 148075eba5b6SRobert Mustacchi * 148175eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 148275eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 148375eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 148475eba5b6SRobert Mustacchi * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 148575eba5b6SRobert Mustacchi */ 148675eba5b6SRobert Mustacchi else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && 148775eba5b6SRobert Mustacchi (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && 148875eba5b6SRobert Mustacchi !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && 148975eba5b6SRobert Mustacchi (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { 149075eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_rx_pause; 149175eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = Rx PAUSE frames only.\n"); 149275eba5b6SRobert Mustacchi } else { 149375eba5b6SRobert Mustacchi /* Per the IEEE spec, at this point flow control 149475eba5b6SRobert Mustacchi * should be disabled. 149575eba5b6SRobert Mustacchi */ 149675eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_none; 149775eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = NONE.\n"); 149875eba5b6SRobert Mustacchi } 149975eba5b6SRobert Mustacchi 150075eba5b6SRobert Mustacchi /* Now we need to do one last check... If we auto- 150175eba5b6SRobert Mustacchi * negotiated to HALF DUPLEX, flow control should not be 150275eba5b6SRobert Mustacchi * enabled per IEEE 802.3 spec. 150375eba5b6SRobert Mustacchi */ 150475eba5b6SRobert Mustacchi ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex); 150575eba5b6SRobert Mustacchi if (ret_val) { 150675eba5b6SRobert Mustacchi DEBUGOUT("Error getting link speed and duplex\n"); 150775eba5b6SRobert Mustacchi return ret_val; 150875eba5b6SRobert Mustacchi } 150975eba5b6SRobert Mustacchi 151075eba5b6SRobert Mustacchi if (duplex == HALF_DUPLEX) 151175eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_none; 151275eba5b6SRobert Mustacchi 151375eba5b6SRobert Mustacchi /* Now we call a subroutine to actually force the MAC 151475eba5b6SRobert Mustacchi * controller to use the correct flow control settings. 151575eba5b6SRobert Mustacchi */ 151675eba5b6SRobert Mustacchi ret_val = e1000_force_mac_fc_generic(hw); 151775eba5b6SRobert Mustacchi if (ret_val) { 151875eba5b6SRobert Mustacchi DEBUGOUT("Error forcing flow control settings\n"); 151975eba5b6SRobert Mustacchi return ret_val; 152075eba5b6SRobert Mustacchi } 152175eba5b6SRobert Mustacchi } 152275eba5b6SRobert Mustacchi 152375eba5b6SRobert Mustacchi /* Check for the case where we have SerDes media and auto-neg is 152475eba5b6SRobert Mustacchi * enabled. In this case, we need to check and see if Auto-Neg 152575eba5b6SRobert Mustacchi * has completed, and if so, how the PHY and link partner has 152675eba5b6SRobert Mustacchi * flow control configured. 152775eba5b6SRobert Mustacchi */ 152875eba5b6SRobert Mustacchi if ((hw->phy.media_type == e1000_media_type_internal_serdes) && 152975eba5b6SRobert Mustacchi mac->autoneg) { 153075eba5b6SRobert Mustacchi /* Read the PCS_LSTS and check to see if AutoNeg 153175eba5b6SRobert Mustacchi * has completed. 153275eba5b6SRobert Mustacchi */ 153375eba5b6SRobert Mustacchi pcs_status_reg = E1000_READ_REG(hw, E1000_PCS_LSTAT); 153475eba5b6SRobert Mustacchi 153575eba5b6SRobert Mustacchi if (!(pcs_status_reg & E1000_PCS_LSTS_AN_COMPLETE)) { 153675eba5b6SRobert Mustacchi DEBUGOUT("PCS Auto Neg has not completed.\n"); 153775eba5b6SRobert Mustacchi return ret_val; 153875eba5b6SRobert Mustacchi } 153975eba5b6SRobert Mustacchi 154075eba5b6SRobert Mustacchi /* The AutoNeg process has completed, so we now need to 154175eba5b6SRobert Mustacchi * read both the Auto Negotiation Advertisement 154275eba5b6SRobert Mustacchi * Register (PCS_ANADV) and the Auto_Negotiation Base 154375eba5b6SRobert Mustacchi * Page Ability Register (PCS_LPAB) to determine how 154475eba5b6SRobert Mustacchi * flow control was negotiated. 154575eba5b6SRobert Mustacchi */ 154675eba5b6SRobert Mustacchi pcs_adv_reg = E1000_READ_REG(hw, E1000_PCS_ANADV); 154775eba5b6SRobert Mustacchi pcs_lp_ability_reg = E1000_READ_REG(hw, E1000_PCS_LPAB); 154875eba5b6SRobert Mustacchi 154975eba5b6SRobert Mustacchi /* Two bits in the Auto Negotiation Advertisement Register 155075eba5b6SRobert Mustacchi * (PCS_ANADV) and two bits in the Auto Negotiation Base 155175eba5b6SRobert Mustacchi * Page Ability Register (PCS_LPAB) determine flow control 155275eba5b6SRobert Mustacchi * for both the PHY and the link partner. The following 155375eba5b6SRobert Mustacchi * table, taken out of the IEEE 802.3ab/D6.0 dated March 25, 155475eba5b6SRobert Mustacchi * 1999, describes these PAUSE resolution bits and how flow 155575eba5b6SRobert Mustacchi * control is determined based upon these settings. 155675eba5b6SRobert Mustacchi * NOTE: DC = Don't Care 155775eba5b6SRobert Mustacchi * 155875eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 155975eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution 156075eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 156175eba5b6SRobert Mustacchi * 0 | 0 | DC | DC | e1000_fc_none 156275eba5b6SRobert Mustacchi * 0 | 1 | 0 | DC | e1000_fc_none 156375eba5b6SRobert Mustacchi * 0 | 1 | 1 | 0 | e1000_fc_none 156475eba5b6SRobert Mustacchi * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 156575eba5b6SRobert Mustacchi * 1 | 0 | 0 | DC | e1000_fc_none 156675eba5b6SRobert Mustacchi * 1 | DC | 1 | DC | e1000_fc_full 156775eba5b6SRobert Mustacchi * 1 | 1 | 0 | 0 | e1000_fc_none 156875eba5b6SRobert Mustacchi * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 156975eba5b6SRobert Mustacchi * 157075eba5b6SRobert Mustacchi * Are both PAUSE bits set to 1? If so, this implies 157175eba5b6SRobert Mustacchi * Symmetric Flow Control is enabled at both ends. The 157275eba5b6SRobert Mustacchi * ASM_DIR bits are irrelevant per the spec. 157375eba5b6SRobert Mustacchi * 157475eba5b6SRobert Mustacchi * For Symmetric Flow Control: 157575eba5b6SRobert Mustacchi * 157675eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 157775eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 157875eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 157975eba5b6SRobert Mustacchi * 1 | DC | 1 | DC | e1000_fc_full 158075eba5b6SRobert Mustacchi * 158175eba5b6SRobert Mustacchi */ 158275eba5b6SRobert Mustacchi if ((pcs_adv_reg & E1000_TXCW_PAUSE) && 158375eba5b6SRobert Mustacchi (pcs_lp_ability_reg & E1000_TXCW_PAUSE)) { 158475eba5b6SRobert Mustacchi /* Now we need to check if the user selected Rx ONLY 158575eba5b6SRobert Mustacchi * of pause frames. In this case, we had to advertise 158675eba5b6SRobert Mustacchi * FULL flow control because we could not advertise Rx 158775eba5b6SRobert Mustacchi * ONLY. Hence, we must now check to see if we need to 158875eba5b6SRobert Mustacchi * turn OFF the TRANSMISSION of PAUSE frames. 158975eba5b6SRobert Mustacchi */ 159075eba5b6SRobert Mustacchi if (hw->fc.requested_mode == e1000_fc_full) { 159175eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_full; 159275eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = FULL.\n"); 159375eba5b6SRobert Mustacchi } else { 159475eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_rx_pause; 159575eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = Rx PAUSE frames only.\n"); 159675eba5b6SRobert Mustacchi } 159775eba5b6SRobert Mustacchi } 159875eba5b6SRobert Mustacchi /* For receiving PAUSE frames ONLY. 159975eba5b6SRobert Mustacchi * 160075eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 160175eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 160275eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 160375eba5b6SRobert Mustacchi * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 160475eba5b6SRobert Mustacchi */ 160575eba5b6SRobert Mustacchi else if (!(pcs_adv_reg & E1000_TXCW_PAUSE) && 160675eba5b6SRobert Mustacchi (pcs_adv_reg & E1000_TXCW_ASM_DIR) && 160775eba5b6SRobert Mustacchi (pcs_lp_ability_reg & E1000_TXCW_PAUSE) && 160875eba5b6SRobert Mustacchi (pcs_lp_ability_reg & E1000_TXCW_ASM_DIR)) { 160975eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_tx_pause; 161075eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = Tx PAUSE frames only.\n"); 161175eba5b6SRobert Mustacchi } 161275eba5b6SRobert Mustacchi /* For transmitting PAUSE frames ONLY. 161375eba5b6SRobert Mustacchi * 161475eba5b6SRobert Mustacchi * LOCAL DEVICE | LINK PARTNER 161575eba5b6SRobert Mustacchi * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 161675eba5b6SRobert Mustacchi *-------|---------|-------|---------|-------------------- 161775eba5b6SRobert Mustacchi * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 161875eba5b6SRobert Mustacchi */ 161975eba5b6SRobert Mustacchi else if ((pcs_adv_reg & E1000_TXCW_PAUSE) && 162075eba5b6SRobert Mustacchi (pcs_adv_reg & E1000_TXCW_ASM_DIR) && 162175eba5b6SRobert Mustacchi !(pcs_lp_ability_reg & E1000_TXCW_PAUSE) && 162275eba5b6SRobert Mustacchi (pcs_lp_ability_reg & E1000_TXCW_ASM_DIR)) { 162375eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_rx_pause; 162475eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = Rx PAUSE frames only.\n"); 162575eba5b6SRobert Mustacchi } else { 162675eba5b6SRobert Mustacchi /* Per the IEEE spec, at this point flow control 162775eba5b6SRobert Mustacchi * should be disabled. 162875eba5b6SRobert Mustacchi */ 162975eba5b6SRobert Mustacchi hw->fc.current_mode = e1000_fc_none; 163075eba5b6SRobert Mustacchi DEBUGOUT("Flow Control = NONE.\n"); 163175eba5b6SRobert Mustacchi } 163275eba5b6SRobert Mustacchi 163375eba5b6SRobert Mustacchi /* Now we call a subroutine to actually force the MAC 163475eba5b6SRobert Mustacchi * controller to use the correct flow control settings. 163575eba5b6SRobert Mustacchi */ 163675eba5b6SRobert Mustacchi pcs_ctrl_reg = E1000_READ_REG(hw, E1000_PCS_LCTL); 163775eba5b6SRobert Mustacchi pcs_ctrl_reg |= E1000_PCS_LCTL_FORCE_FCTRL; 163875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_PCS_LCTL, pcs_ctrl_reg); 163975eba5b6SRobert Mustacchi 164075eba5b6SRobert Mustacchi ret_val = e1000_force_mac_fc_generic(hw); 164175eba5b6SRobert Mustacchi if (ret_val) { 164275eba5b6SRobert Mustacchi DEBUGOUT("Error forcing flow control settings\n"); 164375eba5b6SRobert Mustacchi return ret_val; 164475eba5b6SRobert Mustacchi } 164575eba5b6SRobert Mustacchi } 164675eba5b6SRobert Mustacchi 164775eba5b6SRobert Mustacchi return E1000_SUCCESS; 164875eba5b6SRobert Mustacchi } 164975eba5b6SRobert Mustacchi 165075eba5b6SRobert Mustacchi /** 165175eba5b6SRobert Mustacchi * e1000_get_speed_and_duplex_copper_generic - Retrieve current speed/duplex 165275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 165375eba5b6SRobert Mustacchi * @speed: stores the current speed 165475eba5b6SRobert Mustacchi * @duplex: stores the current duplex 165575eba5b6SRobert Mustacchi * 165675eba5b6SRobert Mustacchi * Read the status register for the current speed/duplex and store the current 165775eba5b6SRobert Mustacchi * speed and duplex for copper connections. 165875eba5b6SRobert Mustacchi **/ 165975eba5b6SRobert Mustacchi s32 e1000_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed, 166075eba5b6SRobert Mustacchi u16 *duplex) 166175eba5b6SRobert Mustacchi { 166275eba5b6SRobert Mustacchi u32 status; 166375eba5b6SRobert Mustacchi 166475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_speed_and_duplex_copper_generic"); 166575eba5b6SRobert Mustacchi 166675eba5b6SRobert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS); 166775eba5b6SRobert Mustacchi if (status & E1000_STATUS_SPEED_1000) { 166875eba5b6SRobert Mustacchi *speed = SPEED_1000; 166975eba5b6SRobert Mustacchi DEBUGOUT("1000 Mbs, "); 167075eba5b6SRobert Mustacchi } else if (status & E1000_STATUS_SPEED_100) { 167175eba5b6SRobert Mustacchi *speed = SPEED_100; 167275eba5b6SRobert Mustacchi DEBUGOUT("100 Mbs, "); 167375eba5b6SRobert Mustacchi } else { 167475eba5b6SRobert Mustacchi *speed = SPEED_10; 167575eba5b6SRobert Mustacchi DEBUGOUT("10 Mbs, "); 167675eba5b6SRobert Mustacchi } 167775eba5b6SRobert Mustacchi 167875eba5b6SRobert Mustacchi if (status & E1000_STATUS_FD) { 167975eba5b6SRobert Mustacchi *duplex = FULL_DUPLEX; 168075eba5b6SRobert Mustacchi DEBUGOUT("Full Duplex\n"); 168175eba5b6SRobert Mustacchi } else { 168275eba5b6SRobert Mustacchi *duplex = HALF_DUPLEX; 168375eba5b6SRobert Mustacchi DEBUGOUT("Half Duplex\n"); 168475eba5b6SRobert Mustacchi } 168575eba5b6SRobert Mustacchi 168675eba5b6SRobert Mustacchi return E1000_SUCCESS; 168775eba5b6SRobert Mustacchi } 168875eba5b6SRobert Mustacchi 168975eba5b6SRobert Mustacchi /** 169075eba5b6SRobert Mustacchi * e1000_get_speed_and_duplex_fiber_generic - Retrieve current speed/duplex 169175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 169275eba5b6SRobert Mustacchi * @speed: stores the current speed 169375eba5b6SRobert Mustacchi * @duplex: stores the current duplex 169475eba5b6SRobert Mustacchi * 169575eba5b6SRobert Mustacchi * Sets the speed and duplex to gigabit full duplex (the only possible option) 169675eba5b6SRobert Mustacchi * for fiber/serdes links. 169775eba5b6SRobert Mustacchi **/ 1698c124a83eSRobert Mustacchi s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw E1000_UNUSEDARG *hw, 169975eba5b6SRobert Mustacchi u16 *speed, u16 *duplex) 170075eba5b6SRobert Mustacchi { 170175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_speed_and_duplex_fiber_serdes_generic"); 170275eba5b6SRobert Mustacchi 170375eba5b6SRobert Mustacchi *speed = SPEED_1000; 170475eba5b6SRobert Mustacchi *duplex = FULL_DUPLEX; 170575eba5b6SRobert Mustacchi 170675eba5b6SRobert Mustacchi return E1000_SUCCESS; 170775eba5b6SRobert Mustacchi } 170875eba5b6SRobert Mustacchi 170975eba5b6SRobert Mustacchi /** 171075eba5b6SRobert Mustacchi * e1000_get_hw_semaphore_generic - Acquire hardware semaphore 171175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 171275eba5b6SRobert Mustacchi * 171375eba5b6SRobert Mustacchi * Acquire the HW semaphore to access the PHY or NVM 171475eba5b6SRobert Mustacchi **/ 171575eba5b6SRobert Mustacchi s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw) 171675eba5b6SRobert Mustacchi { 171775eba5b6SRobert Mustacchi u32 swsm; 171875eba5b6SRobert Mustacchi s32 timeout = hw->nvm.word_size + 1; 171975eba5b6SRobert Mustacchi s32 i = 0; 172075eba5b6SRobert Mustacchi 172175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_hw_semaphore_generic"); 172275eba5b6SRobert Mustacchi 172375eba5b6SRobert Mustacchi /* Get the SW semaphore */ 172475eba5b6SRobert Mustacchi while (i < timeout) { 172575eba5b6SRobert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM); 172675eba5b6SRobert Mustacchi if (!(swsm & E1000_SWSM_SMBI)) 172775eba5b6SRobert Mustacchi break; 172875eba5b6SRobert Mustacchi 172975eba5b6SRobert Mustacchi usec_delay(50); 173075eba5b6SRobert Mustacchi i++; 173175eba5b6SRobert Mustacchi } 173275eba5b6SRobert Mustacchi 173375eba5b6SRobert Mustacchi if (i == timeout) { 173475eba5b6SRobert Mustacchi DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); 173575eba5b6SRobert Mustacchi return -E1000_ERR_NVM; 173675eba5b6SRobert Mustacchi } 173775eba5b6SRobert Mustacchi 173875eba5b6SRobert Mustacchi /* Get the FW semaphore. */ 173975eba5b6SRobert Mustacchi for (i = 0; i < timeout; i++) { 174075eba5b6SRobert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM); 174175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI); 174275eba5b6SRobert Mustacchi 174375eba5b6SRobert Mustacchi /* Semaphore acquired if bit latched */ 174475eba5b6SRobert Mustacchi if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI) 174575eba5b6SRobert Mustacchi break; 174675eba5b6SRobert Mustacchi 174775eba5b6SRobert Mustacchi usec_delay(50); 174875eba5b6SRobert Mustacchi } 174975eba5b6SRobert Mustacchi 175075eba5b6SRobert Mustacchi if (i == timeout) { 175175eba5b6SRobert Mustacchi /* Release semaphores */ 175275eba5b6SRobert Mustacchi e1000_put_hw_semaphore_generic(hw); 175375eba5b6SRobert Mustacchi DEBUGOUT("Driver can't access the NVM\n"); 175475eba5b6SRobert Mustacchi return -E1000_ERR_NVM; 175575eba5b6SRobert Mustacchi } 175675eba5b6SRobert Mustacchi 175775eba5b6SRobert Mustacchi return E1000_SUCCESS; 175875eba5b6SRobert Mustacchi } 175975eba5b6SRobert Mustacchi 176075eba5b6SRobert Mustacchi /** 176175eba5b6SRobert Mustacchi * e1000_put_hw_semaphore_generic - Release hardware semaphore 176275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 176375eba5b6SRobert Mustacchi * 176475eba5b6SRobert Mustacchi * Release hardware semaphore used to access the PHY or NVM 176575eba5b6SRobert Mustacchi **/ 176675eba5b6SRobert Mustacchi void e1000_put_hw_semaphore_generic(struct e1000_hw *hw) 176775eba5b6SRobert Mustacchi { 176875eba5b6SRobert Mustacchi u32 swsm; 176975eba5b6SRobert Mustacchi 177075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_put_hw_semaphore_generic"); 177175eba5b6SRobert Mustacchi 177275eba5b6SRobert Mustacchi swsm = E1000_READ_REG(hw, E1000_SWSM); 177375eba5b6SRobert Mustacchi 177475eba5b6SRobert Mustacchi swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); 177575eba5b6SRobert Mustacchi 177675eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_SWSM, swsm); 177775eba5b6SRobert Mustacchi } 177875eba5b6SRobert Mustacchi 177975eba5b6SRobert Mustacchi /** 178075eba5b6SRobert Mustacchi * e1000_get_auto_rd_done_generic - Check for auto read completion 178175eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 178275eba5b6SRobert Mustacchi * 178375eba5b6SRobert Mustacchi * Check EEPROM for Auto Read done bit. 178475eba5b6SRobert Mustacchi **/ 178575eba5b6SRobert Mustacchi s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw) 178675eba5b6SRobert Mustacchi { 178775eba5b6SRobert Mustacchi s32 i = 0; 178875eba5b6SRobert Mustacchi 178975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_get_auto_rd_done_generic"); 179075eba5b6SRobert Mustacchi 179175eba5b6SRobert Mustacchi while (i < AUTO_READ_DONE_TIMEOUT) { 179275eba5b6SRobert Mustacchi if (E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_AUTO_RD) 179375eba5b6SRobert Mustacchi break; 179475eba5b6SRobert Mustacchi msec_delay(1); 179575eba5b6SRobert Mustacchi i++; 179675eba5b6SRobert Mustacchi } 179775eba5b6SRobert Mustacchi 179875eba5b6SRobert Mustacchi if (i == AUTO_READ_DONE_TIMEOUT) { 179975eba5b6SRobert Mustacchi DEBUGOUT("Auto read by HW from NVM has not completed.\n"); 180075eba5b6SRobert Mustacchi return -E1000_ERR_RESET; 180175eba5b6SRobert Mustacchi } 180275eba5b6SRobert Mustacchi 180375eba5b6SRobert Mustacchi return E1000_SUCCESS; 180475eba5b6SRobert Mustacchi } 180575eba5b6SRobert Mustacchi 180675eba5b6SRobert Mustacchi /** 180775eba5b6SRobert Mustacchi * e1000_valid_led_default_generic - Verify a valid default LED config 180875eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 180975eba5b6SRobert Mustacchi * @data: pointer to the NVM (EEPROM) 181075eba5b6SRobert Mustacchi * 181175eba5b6SRobert Mustacchi * Read the EEPROM for the current default LED configuration. If the 181275eba5b6SRobert Mustacchi * LED configuration is not valid, set to a valid LED configuration. 181375eba5b6SRobert Mustacchi **/ 181475eba5b6SRobert Mustacchi s32 e1000_valid_led_default_generic(struct e1000_hw *hw, u16 *data) 181575eba5b6SRobert Mustacchi { 181675eba5b6SRobert Mustacchi s32 ret_val; 181775eba5b6SRobert Mustacchi 181875eba5b6SRobert Mustacchi DEBUGFUNC("e1000_valid_led_default_generic"); 181975eba5b6SRobert Mustacchi 182075eba5b6SRobert Mustacchi ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data); 182175eba5b6SRobert Mustacchi if (ret_val) { 182275eba5b6SRobert Mustacchi DEBUGOUT("NVM Read Error\n"); 182375eba5b6SRobert Mustacchi return ret_val; 182475eba5b6SRobert Mustacchi } 182575eba5b6SRobert Mustacchi 182675eba5b6SRobert Mustacchi if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) 182775eba5b6SRobert Mustacchi *data = ID_LED_DEFAULT; 182875eba5b6SRobert Mustacchi 182975eba5b6SRobert Mustacchi return E1000_SUCCESS; 183075eba5b6SRobert Mustacchi } 183175eba5b6SRobert Mustacchi 183275eba5b6SRobert Mustacchi /** 183375eba5b6SRobert Mustacchi * e1000_id_led_init_generic - 183475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 183575eba5b6SRobert Mustacchi * 183675eba5b6SRobert Mustacchi **/ 183775eba5b6SRobert Mustacchi s32 e1000_id_led_init_generic(struct e1000_hw *hw) 183875eba5b6SRobert Mustacchi { 183975eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 184075eba5b6SRobert Mustacchi s32 ret_val; 184175eba5b6SRobert Mustacchi const u32 ledctl_mask = 0x000000FF; 184275eba5b6SRobert Mustacchi const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON; 184375eba5b6SRobert Mustacchi const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF; 184475eba5b6SRobert Mustacchi u16 data, i, temp; 184575eba5b6SRobert Mustacchi const u16 led_mask = 0x0F; 184675eba5b6SRobert Mustacchi 184775eba5b6SRobert Mustacchi DEBUGFUNC("e1000_id_led_init_generic"); 184875eba5b6SRobert Mustacchi 184975eba5b6SRobert Mustacchi ret_val = hw->nvm.ops.valid_led_default(hw, &data); 185075eba5b6SRobert Mustacchi if (ret_val) 185175eba5b6SRobert Mustacchi return ret_val; 185275eba5b6SRobert Mustacchi 185375eba5b6SRobert Mustacchi mac->ledctl_default = E1000_READ_REG(hw, E1000_LEDCTL); 185475eba5b6SRobert Mustacchi mac->ledctl_mode1 = mac->ledctl_default; 185575eba5b6SRobert Mustacchi mac->ledctl_mode2 = mac->ledctl_default; 185675eba5b6SRobert Mustacchi 185775eba5b6SRobert Mustacchi for (i = 0; i < 4; i++) { 185875eba5b6SRobert Mustacchi temp = (data >> (i << 2)) & led_mask; 185975eba5b6SRobert Mustacchi switch (temp) { 186075eba5b6SRobert Mustacchi case ID_LED_ON1_DEF2: 186175eba5b6SRobert Mustacchi case ID_LED_ON1_ON2: 186275eba5b6SRobert Mustacchi case ID_LED_ON1_OFF2: 186375eba5b6SRobert Mustacchi mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3)); 186475eba5b6SRobert Mustacchi mac->ledctl_mode1 |= ledctl_on << (i << 3); 186575eba5b6SRobert Mustacchi break; 186675eba5b6SRobert Mustacchi case ID_LED_OFF1_DEF2: 186775eba5b6SRobert Mustacchi case ID_LED_OFF1_ON2: 186875eba5b6SRobert Mustacchi case ID_LED_OFF1_OFF2: 186975eba5b6SRobert Mustacchi mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3)); 187075eba5b6SRobert Mustacchi mac->ledctl_mode1 |= ledctl_off << (i << 3); 187175eba5b6SRobert Mustacchi break; 187275eba5b6SRobert Mustacchi default: 187375eba5b6SRobert Mustacchi /* Do nothing */ 187475eba5b6SRobert Mustacchi break; 187575eba5b6SRobert Mustacchi } 187675eba5b6SRobert Mustacchi switch (temp) { 187775eba5b6SRobert Mustacchi case ID_LED_DEF1_ON2: 187875eba5b6SRobert Mustacchi case ID_LED_ON1_ON2: 187975eba5b6SRobert Mustacchi case ID_LED_OFF1_ON2: 188075eba5b6SRobert Mustacchi mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3)); 188175eba5b6SRobert Mustacchi mac->ledctl_mode2 |= ledctl_on << (i << 3); 188275eba5b6SRobert Mustacchi break; 188375eba5b6SRobert Mustacchi case ID_LED_DEF1_OFF2: 188475eba5b6SRobert Mustacchi case ID_LED_ON1_OFF2: 188575eba5b6SRobert Mustacchi case ID_LED_OFF1_OFF2: 188675eba5b6SRobert Mustacchi mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3)); 188775eba5b6SRobert Mustacchi mac->ledctl_mode2 |= ledctl_off << (i << 3); 188875eba5b6SRobert Mustacchi break; 188975eba5b6SRobert Mustacchi default: 189075eba5b6SRobert Mustacchi /* Do nothing */ 189175eba5b6SRobert Mustacchi break; 189275eba5b6SRobert Mustacchi } 189375eba5b6SRobert Mustacchi } 189475eba5b6SRobert Mustacchi 189575eba5b6SRobert Mustacchi return E1000_SUCCESS; 189675eba5b6SRobert Mustacchi } 189775eba5b6SRobert Mustacchi 189875eba5b6SRobert Mustacchi /** 189975eba5b6SRobert Mustacchi * e1000_setup_led_generic - Configures SW controllable LED 190075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 190175eba5b6SRobert Mustacchi * 190275eba5b6SRobert Mustacchi * This prepares the SW controllable LED for use and saves the current state 190375eba5b6SRobert Mustacchi * of the LED so it can be later restored. 190475eba5b6SRobert Mustacchi **/ 190575eba5b6SRobert Mustacchi s32 e1000_setup_led_generic(struct e1000_hw *hw) 190675eba5b6SRobert Mustacchi { 190775eba5b6SRobert Mustacchi u32 ledctl; 190875eba5b6SRobert Mustacchi 190975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_setup_led_generic"); 191075eba5b6SRobert Mustacchi 191175eba5b6SRobert Mustacchi if (hw->mac.ops.setup_led != e1000_setup_led_generic) 191275eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 191375eba5b6SRobert Mustacchi 191475eba5b6SRobert Mustacchi if (hw->phy.media_type == e1000_media_type_fiber) { 191575eba5b6SRobert Mustacchi ledctl = E1000_READ_REG(hw, E1000_LEDCTL); 191675eba5b6SRobert Mustacchi hw->mac.ledctl_default = ledctl; 191775eba5b6SRobert Mustacchi /* Turn off LED0 */ 191875eba5b6SRobert Mustacchi ledctl &= ~(E1000_LEDCTL_LED0_IVRT | E1000_LEDCTL_LED0_BLINK | 191975eba5b6SRobert Mustacchi E1000_LEDCTL_LED0_MODE_MASK); 192075eba5b6SRobert Mustacchi ledctl |= (E1000_LEDCTL_MODE_LED_OFF << 192175eba5b6SRobert Mustacchi E1000_LEDCTL_LED0_MODE_SHIFT); 192275eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl); 192375eba5b6SRobert Mustacchi } else if (hw->phy.media_type == e1000_media_type_copper) { 192475eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); 192575eba5b6SRobert Mustacchi } 192675eba5b6SRobert Mustacchi 192775eba5b6SRobert Mustacchi return E1000_SUCCESS; 192875eba5b6SRobert Mustacchi } 192975eba5b6SRobert Mustacchi 193075eba5b6SRobert Mustacchi /** 193175eba5b6SRobert Mustacchi * e1000_cleanup_led_generic - Set LED config to default operation 193275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 193375eba5b6SRobert Mustacchi * 193475eba5b6SRobert Mustacchi * Remove the current LED configuration and set the LED configuration 193575eba5b6SRobert Mustacchi * to the default value, saved from the EEPROM. 193675eba5b6SRobert Mustacchi **/ 193775eba5b6SRobert Mustacchi s32 e1000_cleanup_led_generic(struct e1000_hw *hw) 193875eba5b6SRobert Mustacchi { 193975eba5b6SRobert Mustacchi DEBUGFUNC("e1000_cleanup_led_generic"); 194075eba5b6SRobert Mustacchi 194175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default); 194275eba5b6SRobert Mustacchi return E1000_SUCCESS; 194375eba5b6SRobert Mustacchi } 194475eba5b6SRobert Mustacchi 194575eba5b6SRobert Mustacchi /** 194675eba5b6SRobert Mustacchi * e1000_blink_led_generic - Blink LED 194775eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 194875eba5b6SRobert Mustacchi * 194975eba5b6SRobert Mustacchi * Blink the LEDs which are set to be on. 195075eba5b6SRobert Mustacchi **/ 195175eba5b6SRobert Mustacchi s32 e1000_blink_led_generic(struct e1000_hw *hw) 195275eba5b6SRobert Mustacchi { 195375eba5b6SRobert Mustacchi u32 ledctl_blink = 0; 195475eba5b6SRobert Mustacchi u32 i; 195575eba5b6SRobert Mustacchi 195675eba5b6SRobert Mustacchi DEBUGFUNC("e1000_blink_led_generic"); 195775eba5b6SRobert Mustacchi 195875eba5b6SRobert Mustacchi if (hw->phy.media_type == e1000_media_type_fiber) { 195975eba5b6SRobert Mustacchi /* always blink LED0 for PCI-E fiber */ 196075eba5b6SRobert Mustacchi ledctl_blink = E1000_LEDCTL_LED0_BLINK | 196175eba5b6SRobert Mustacchi (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT); 196275eba5b6SRobert Mustacchi } else { 196375eba5b6SRobert Mustacchi /* Set the blink bit for each LED that's "on" (0x0E) 196475eba5b6SRobert Mustacchi * (or "off" if inverted) in ledctl_mode2. The blink 196575eba5b6SRobert Mustacchi * logic in hardware only works when mode is set to "on" 196675eba5b6SRobert Mustacchi * so it must be changed accordingly when the mode is 196775eba5b6SRobert Mustacchi * "off" and inverted. 196875eba5b6SRobert Mustacchi */ 196975eba5b6SRobert Mustacchi ledctl_blink = hw->mac.ledctl_mode2; 197075eba5b6SRobert Mustacchi for (i = 0; i < 32; i += 8) { 197175eba5b6SRobert Mustacchi u32 mode = (hw->mac.ledctl_mode2 >> i) & 197275eba5b6SRobert Mustacchi E1000_LEDCTL_LED0_MODE_MASK; 197375eba5b6SRobert Mustacchi u32 led_default = hw->mac.ledctl_default >> i; 197475eba5b6SRobert Mustacchi 197575eba5b6SRobert Mustacchi if ((!(led_default & E1000_LEDCTL_LED0_IVRT) && 197675eba5b6SRobert Mustacchi (mode == E1000_LEDCTL_MODE_LED_ON)) || 197775eba5b6SRobert Mustacchi ((led_default & E1000_LEDCTL_LED0_IVRT) && 197875eba5b6SRobert Mustacchi (mode == E1000_LEDCTL_MODE_LED_OFF))) { 197975eba5b6SRobert Mustacchi ledctl_blink &= 198075eba5b6SRobert Mustacchi ~(E1000_LEDCTL_LED0_MODE_MASK << i); 198175eba5b6SRobert Mustacchi ledctl_blink |= (E1000_LEDCTL_LED0_BLINK | 198275eba5b6SRobert Mustacchi E1000_LEDCTL_MODE_LED_ON) << i; 198375eba5b6SRobert Mustacchi } 198475eba5b6SRobert Mustacchi } 198575eba5b6SRobert Mustacchi } 198675eba5b6SRobert Mustacchi 198775eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl_blink); 198875eba5b6SRobert Mustacchi 198975eba5b6SRobert Mustacchi return E1000_SUCCESS; 199075eba5b6SRobert Mustacchi } 199175eba5b6SRobert Mustacchi 199275eba5b6SRobert Mustacchi /** 199375eba5b6SRobert Mustacchi * e1000_led_on_generic - Turn LED on 199475eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 199575eba5b6SRobert Mustacchi * 199675eba5b6SRobert Mustacchi * Turn LED on. 199775eba5b6SRobert Mustacchi **/ 199875eba5b6SRobert Mustacchi s32 e1000_led_on_generic(struct e1000_hw *hw) 199975eba5b6SRobert Mustacchi { 200075eba5b6SRobert Mustacchi u32 ctrl; 200175eba5b6SRobert Mustacchi 200275eba5b6SRobert Mustacchi DEBUGFUNC("e1000_led_on_generic"); 200375eba5b6SRobert Mustacchi 200475eba5b6SRobert Mustacchi switch (hw->phy.media_type) { 200575eba5b6SRobert Mustacchi case e1000_media_type_fiber: 200675eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 200775eba5b6SRobert Mustacchi ctrl &= ~E1000_CTRL_SWDPIN0; 200875eba5b6SRobert Mustacchi ctrl |= E1000_CTRL_SWDPIO0; 200975eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 201075eba5b6SRobert Mustacchi break; 201175eba5b6SRobert Mustacchi case e1000_media_type_copper: 201275eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode2); 201375eba5b6SRobert Mustacchi break; 201475eba5b6SRobert Mustacchi default: 201575eba5b6SRobert Mustacchi break; 201675eba5b6SRobert Mustacchi } 201775eba5b6SRobert Mustacchi 201875eba5b6SRobert Mustacchi return E1000_SUCCESS; 201975eba5b6SRobert Mustacchi } 202075eba5b6SRobert Mustacchi 202175eba5b6SRobert Mustacchi /** 202275eba5b6SRobert Mustacchi * e1000_led_off_generic - Turn LED off 202375eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 202475eba5b6SRobert Mustacchi * 202575eba5b6SRobert Mustacchi * Turn LED off. 202675eba5b6SRobert Mustacchi **/ 202775eba5b6SRobert Mustacchi s32 e1000_led_off_generic(struct e1000_hw *hw) 202875eba5b6SRobert Mustacchi { 202975eba5b6SRobert Mustacchi u32 ctrl; 203075eba5b6SRobert Mustacchi 203175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_led_off_generic"); 203275eba5b6SRobert Mustacchi 203375eba5b6SRobert Mustacchi switch (hw->phy.media_type) { 203475eba5b6SRobert Mustacchi case e1000_media_type_fiber: 203575eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 203675eba5b6SRobert Mustacchi ctrl |= E1000_CTRL_SWDPIN0; 203775eba5b6SRobert Mustacchi ctrl |= E1000_CTRL_SWDPIO0; 203875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 203975eba5b6SRobert Mustacchi break; 204075eba5b6SRobert Mustacchi case e1000_media_type_copper: 204175eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); 204275eba5b6SRobert Mustacchi break; 204375eba5b6SRobert Mustacchi default: 204475eba5b6SRobert Mustacchi break; 204575eba5b6SRobert Mustacchi } 204675eba5b6SRobert Mustacchi 204775eba5b6SRobert Mustacchi return E1000_SUCCESS; 204875eba5b6SRobert Mustacchi } 204975eba5b6SRobert Mustacchi 205075eba5b6SRobert Mustacchi /** 205175eba5b6SRobert Mustacchi * e1000_set_pcie_no_snoop_generic - Set PCI-express capabilities 205275eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 205375eba5b6SRobert Mustacchi * @no_snoop: bitmap of snoop events 205475eba5b6SRobert Mustacchi * 205575eba5b6SRobert Mustacchi * Set the PCI-express register to snoop for events enabled in 'no_snoop'. 205675eba5b6SRobert Mustacchi **/ 205775eba5b6SRobert Mustacchi void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop) 205875eba5b6SRobert Mustacchi { 205975eba5b6SRobert Mustacchi u32 gcr; 206075eba5b6SRobert Mustacchi 206175eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_pcie_no_snoop_generic"); 206275eba5b6SRobert Mustacchi 206375eba5b6SRobert Mustacchi if (hw->bus.type != e1000_bus_type_pci_express) 206475eba5b6SRobert Mustacchi return; 206575eba5b6SRobert Mustacchi 206675eba5b6SRobert Mustacchi if (no_snoop) { 206775eba5b6SRobert Mustacchi gcr = E1000_READ_REG(hw, E1000_GCR); 206875eba5b6SRobert Mustacchi gcr &= ~(PCIE_NO_SNOOP_ALL); 206975eba5b6SRobert Mustacchi gcr |= no_snoop; 207075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_GCR, gcr); 207175eba5b6SRobert Mustacchi } 207275eba5b6SRobert Mustacchi } 207375eba5b6SRobert Mustacchi 207475eba5b6SRobert Mustacchi /** 207575eba5b6SRobert Mustacchi * e1000_disable_pcie_master_generic - Disables PCI-express master access 207675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 207775eba5b6SRobert Mustacchi * 207875eba5b6SRobert Mustacchi * Returns E1000_SUCCESS if successful, else returns -10 207975eba5b6SRobert Mustacchi * (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused 208075eba5b6SRobert Mustacchi * the master requests to be disabled. 208175eba5b6SRobert Mustacchi * 208275eba5b6SRobert Mustacchi * Disables PCI-Express master access and verifies there are no pending 208375eba5b6SRobert Mustacchi * requests. 208475eba5b6SRobert Mustacchi **/ 208575eba5b6SRobert Mustacchi s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw) 208675eba5b6SRobert Mustacchi { 208775eba5b6SRobert Mustacchi u32 ctrl; 208875eba5b6SRobert Mustacchi s32 timeout = MASTER_DISABLE_TIMEOUT; 208975eba5b6SRobert Mustacchi 209075eba5b6SRobert Mustacchi DEBUGFUNC("e1000_disable_pcie_master_generic"); 209175eba5b6SRobert Mustacchi 209275eba5b6SRobert Mustacchi if (hw->bus.type != e1000_bus_type_pci_express) 209375eba5b6SRobert Mustacchi return E1000_SUCCESS; 209475eba5b6SRobert Mustacchi 209575eba5b6SRobert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL); 209675eba5b6SRobert Mustacchi ctrl |= E1000_CTRL_GIO_MASTER_DISABLE; 209775eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl); 209875eba5b6SRobert Mustacchi 209975eba5b6SRobert Mustacchi while (timeout) { 210075eba5b6SRobert Mustacchi if (!(E1000_READ_REG(hw, E1000_STATUS) & 2101c124a83eSRobert Mustacchi E1000_STATUS_GIO_MASTER_ENABLE) || 2102c124a83eSRobert Mustacchi E1000_REMOVED(hw->hw_addr)) 210375eba5b6SRobert Mustacchi break; 210475eba5b6SRobert Mustacchi usec_delay(100); 210575eba5b6SRobert Mustacchi timeout--; 210675eba5b6SRobert Mustacchi } 210775eba5b6SRobert Mustacchi 210875eba5b6SRobert Mustacchi if (!timeout) { 210975eba5b6SRobert Mustacchi DEBUGOUT("Master requests are pending.\n"); 211075eba5b6SRobert Mustacchi return -E1000_ERR_MASTER_REQUESTS_PENDING; 211175eba5b6SRobert Mustacchi } 211275eba5b6SRobert Mustacchi 211375eba5b6SRobert Mustacchi return E1000_SUCCESS; 211475eba5b6SRobert Mustacchi } 211575eba5b6SRobert Mustacchi 211675eba5b6SRobert Mustacchi /** 211775eba5b6SRobert Mustacchi * e1000_reset_adaptive_generic - Reset Adaptive Interframe Spacing 211875eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 211975eba5b6SRobert Mustacchi * 212075eba5b6SRobert Mustacchi * Reset the Adaptive Interframe Spacing throttle to default values. 212175eba5b6SRobert Mustacchi **/ 212275eba5b6SRobert Mustacchi void e1000_reset_adaptive_generic(struct e1000_hw *hw) 212375eba5b6SRobert Mustacchi { 212475eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 212575eba5b6SRobert Mustacchi 212675eba5b6SRobert Mustacchi DEBUGFUNC("e1000_reset_adaptive_generic"); 212775eba5b6SRobert Mustacchi 212875eba5b6SRobert Mustacchi if (!mac->adaptive_ifs) { 212975eba5b6SRobert Mustacchi DEBUGOUT("Not in Adaptive IFS mode!\n"); 213075eba5b6SRobert Mustacchi return; 213175eba5b6SRobert Mustacchi } 213275eba5b6SRobert Mustacchi 213375eba5b6SRobert Mustacchi mac->current_ifs_val = 0; 213475eba5b6SRobert Mustacchi mac->ifs_min_val = IFS_MIN; 213575eba5b6SRobert Mustacchi mac->ifs_max_val = IFS_MAX; 213675eba5b6SRobert Mustacchi mac->ifs_step_size = IFS_STEP; 213775eba5b6SRobert Mustacchi mac->ifs_ratio = IFS_RATIO; 213875eba5b6SRobert Mustacchi 213975eba5b6SRobert Mustacchi mac->in_ifs_mode = FALSE; 214075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_AIT, 0); 214175eba5b6SRobert Mustacchi } 214275eba5b6SRobert Mustacchi 214375eba5b6SRobert Mustacchi /** 214475eba5b6SRobert Mustacchi * e1000_update_adaptive_generic - Update Adaptive Interframe Spacing 214575eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 214675eba5b6SRobert Mustacchi * 214775eba5b6SRobert Mustacchi * Update the Adaptive Interframe Spacing Throttle value based on the 214875eba5b6SRobert Mustacchi * time between transmitted packets and time between collisions. 214975eba5b6SRobert Mustacchi **/ 215075eba5b6SRobert Mustacchi void e1000_update_adaptive_generic(struct e1000_hw *hw) 215175eba5b6SRobert Mustacchi { 215275eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 215375eba5b6SRobert Mustacchi 215475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_update_adaptive_generic"); 215575eba5b6SRobert Mustacchi 215675eba5b6SRobert Mustacchi if (!mac->adaptive_ifs) { 215775eba5b6SRobert Mustacchi DEBUGOUT("Not in Adaptive IFS mode!\n"); 215875eba5b6SRobert Mustacchi return; 215975eba5b6SRobert Mustacchi } 216075eba5b6SRobert Mustacchi 216175eba5b6SRobert Mustacchi if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) { 216275eba5b6SRobert Mustacchi if (mac->tx_packet_delta > MIN_NUM_XMITS) { 216375eba5b6SRobert Mustacchi mac->in_ifs_mode = TRUE; 216475eba5b6SRobert Mustacchi if (mac->current_ifs_val < mac->ifs_max_val) { 216575eba5b6SRobert Mustacchi if (!mac->current_ifs_val) 216675eba5b6SRobert Mustacchi mac->current_ifs_val = mac->ifs_min_val; 216775eba5b6SRobert Mustacchi else 216875eba5b6SRobert Mustacchi mac->current_ifs_val += 216975eba5b6SRobert Mustacchi mac->ifs_step_size; 217075eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_AIT, 217175eba5b6SRobert Mustacchi mac->current_ifs_val); 217275eba5b6SRobert Mustacchi } 217375eba5b6SRobert Mustacchi } 217475eba5b6SRobert Mustacchi } else { 217575eba5b6SRobert Mustacchi if (mac->in_ifs_mode && 217675eba5b6SRobert Mustacchi (mac->tx_packet_delta <= MIN_NUM_XMITS)) { 217775eba5b6SRobert Mustacchi mac->current_ifs_val = 0; 217875eba5b6SRobert Mustacchi mac->in_ifs_mode = FALSE; 217975eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, E1000_AIT, 0); 218075eba5b6SRobert Mustacchi } 218175eba5b6SRobert Mustacchi } 218275eba5b6SRobert Mustacchi } 218375eba5b6SRobert Mustacchi 218475eba5b6SRobert Mustacchi /** 218575eba5b6SRobert Mustacchi * e1000_validate_mdi_setting_generic - Verify MDI/MDIx settings 218675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 218775eba5b6SRobert Mustacchi * 218875eba5b6SRobert Mustacchi * Verify that when not using auto-negotiation that MDI/MDIx is correctly 218975eba5b6SRobert Mustacchi * set, which is forced to MDI mode only. 219075eba5b6SRobert Mustacchi **/ 219175eba5b6SRobert Mustacchi static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw) 219275eba5b6SRobert Mustacchi { 219375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_validate_mdi_setting_generic"); 219475eba5b6SRobert Mustacchi 219575eba5b6SRobert Mustacchi if (!hw->mac.autoneg && (hw->phy.mdix == 0 || hw->phy.mdix == 3)) { 219675eba5b6SRobert Mustacchi DEBUGOUT("Invalid MDI setting detected\n"); 219775eba5b6SRobert Mustacchi hw->phy.mdix = 1; 219875eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 219975eba5b6SRobert Mustacchi } 220075eba5b6SRobert Mustacchi 220175eba5b6SRobert Mustacchi return E1000_SUCCESS; 220275eba5b6SRobert Mustacchi } 220375eba5b6SRobert Mustacchi 220475eba5b6SRobert Mustacchi /** 220575eba5b6SRobert Mustacchi * e1000_validate_mdi_setting_crossover_generic - Verify MDI/MDIx settings 220675eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 220775eba5b6SRobert Mustacchi * 220875eba5b6SRobert Mustacchi * Validate the MDI/MDIx setting, allowing for auto-crossover during forced 220975eba5b6SRobert Mustacchi * operation. 221075eba5b6SRobert Mustacchi **/ 2211c124a83eSRobert Mustacchi s32 e1000_validate_mdi_setting_crossover_generic(struct e1000_hw E1000_UNUSEDARG *hw) 221275eba5b6SRobert Mustacchi { 221375eba5b6SRobert Mustacchi DEBUGFUNC("e1000_validate_mdi_setting_crossover_generic"); 221475eba5b6SRobert Mustacchi 221575eba5b6SRobert Mustacchi return E1000_SUCCESS; 221675eba5b6SRobert Mustacchi } 221775eba5b6SRobert Mustacchi 221875eba5b6SRobert Mustacchi /** 221975eba5b6SRobert Mustacchi * e1000_write_8bit_ctrl_reg_generic - Write a 8bit CTRL register 222075eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 222175eba5b6SRobert Mustacchi * @reg: 32bit register offset such as E1000_SCTL 222275eba5b6SRobert Mustacchi * @offset: register offset to write to 222375eba5b6SRobert Mustacchi * @data: data to write at register offset 222475eba5b6SRobert Mustacchi * 222575eba5b6SRobert Mustacchi * Writes an address/data control type register. There are several of these 222675eba5b6SRobert Mustacchi * and they all have the format address << 8 | data and bit 31 is polled for 222775eba5b6SRobert Mustacchi * completion. 222875eba5b6SRobert Mustacchi **/ 222975eba5b6SRobert Mustacchi s32 e1000_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg, 223075eba5b6SRobert Mustacchi u32 offset, u8 data) 223175eba5b6SRobert Mustacchi { 223275eba5b6SRobert Mustacchi u32 i, regvalue = 0; 223375eba5b6SRobert Mustacchi 223475eba5b6SRobert Mustacchi DEBUGFUNC("e1000_write_8bit_ctrl_reg_generic"); 223575eba5b6SRobert Mustacchi 223675eba5b6SRobert Mustacchi /* Set up the address and data */ 223775eba5b6SRobert Mustacchi regvalue = ((u32)data) | (offset << E1000_GEN_CTL_ADDRESS_SHIFT); 223875eba5b6SRobert Mustacchi E1000_WRITE_REG(hw, reg, regvalue); 223975eba5b6SRobert Mustacchi 224075eba5b6SRobert Mustacchi /* Poll the ready bit to see if the MDI read completed */ 224175eba5b6SRobert Mustacchi for (i = 0; i < E1000_GEN_POLL_TIMEOUT; i++) { 224275eba5b6SRobert Mustacchi usec_delay(5); 224375eba5b6SRobert Mustacchi regvalue = E1000_READ_REG(hw, reg); 224475eba5b6SRobert Mustacchi if (regvalue & E1000_GEN_CTL_READY) 224575eba5b6SRobert Mustacchi break; 224675eba5b6SRobert Mustacchi } 224775eba5b6SRobert Mustacchi if (!(regvalue & E1000_GEN_CTL_READY)) { 224875eba5b6SRobert Mustacchi DEBUGOUT1("Reg %08x did not indicate ready\n", reg); 224975eba5b6SRobert Mustacchi return -E1000_ERR_PHY; 225075eba5b6SRobert Mustacchi } 225175eba5b6SRobert Mustacchi 225275eba5b6SRobert Mustacchi return E1000_SUCCESS; 225375eba5b6SRobert Mustacchi } 2254