12439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 2ac3315c2SAndre Schwarz Intel Pro 1000 for ppcboot/das-u-boot 32439e4bfSJean-Christophe PLAGNIOL-VILLARD Drivers are port from Intel's Linux driver e1000-4.3.15 42439e4bfSJean-Christophe PLAGNIOL-VILLARD and from Etherboot pro 1000 driver by mrakes at vivato dot net 52439e4bfSJean-Christophe PLAGNIOL-VILLARD tested on both gig copper and gig fiber boards 62439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 72439e4bfSJean-Christophe PLAGNIOL-VILLARD /******************************************************************************* 82439e4bfSJean-Christophe PLAGNIOL-VILLARD 92439e4bfSJean-Christophe PLAGNIOL-VILLARD 102439e4bfSJean-Christophe PLAGNIOL-VILLARD Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. 112439e4bfSJean-Christophe PLAGNIOL-VILLARD 122439e4bfSJean-Christophe PLAGNIOL-VILLARD This program is free software; you can redistribute it and/or modify it 132439e4bfSJean-Christophe PLAGNIOL-VILLARD under the terms of the GNU General Public License as published by the Free 142439e4bfSJean-Christophe PLAGNIOL-VILLARD Software Foundation; either version 2 of the License, or (at your option) 152439e4bfSJean-Christophe PLAGNIOL-VILLARD any later version. 162439e4bfSJean-Christophe PLAGNIOL-VILLARD 172439e4bfSJean-Christophe PLAGNIOL-VILLARD This program is distributed in the hope that it will be useful, but WITHOUT 182439e4bfSJean-Christophe PLAGNIOL-VILLARD ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 192439e4bfSJean-Christophe PLAGNIOL-VILLARD FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 202439e4bfSJean-Christophe PLAGNIOL-VILLARD more details. 212439e4bfSJean-Christophe PLAGNIOL-VILLARD 222439e4bfSJean-Christophe PLAGNIOL-VILLARD You should have received a copy of the GNU General Public License along with 232439e4bfSJean-Christophe PLAGNIOL-VILLARD this program; if not, write to the Free Software Foundation, Inc., 59 242439e4bfSJean-Christophe PLAGNIOL-VILLARD Temple Place - Suite 330, Boston, MA 02111-1307, USA. 252439e4bfSJean-Christophe PLAGNIOL-VILLARD 262439e4bfSJean-Christophe PLAGNIOL-VILLARD The full GNU General Public License is included in this distribution in the 272439e4bfSJean-Christophe PLAGNIOL-VILLARD file called LICENSE. 282439e4bfSJean-Christophe PLAGNIOL-VILLARD 292439e4bfSJean-Christophe PLAGNIOL-VILLARD Contact Information: 302439e4bfSJean-Christophe PLAGNIOL-VILLARD Linux NICS <linux.nics@intel.com> 312439e4bfSJean-Christophe PLAGNIOL-VILLARD Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 322439e4bfSJean-Christophe PLAGNIOL-VILLARD 332439e4bfSJean-Christophe PLAGNIOL-VILLARD *******************************************************************************/ 342439e4bfSJean-Christophe PLAGNIOL-VILLARD /* 352439e4bfSJean-Christophe PLAGNIOL-VILLARD * Copyright (C) Archway Digital Solutions. 362439e4bfSJean-Christophe PLAGNIOL-VILLARD * 372439e4bfSJean-Christophe PLAGNIOL-VILLARD * written by Chrsitopher Li <cli at arcyway dot com> or <chrisl at gnuchina dot org> 382439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2/9/2002 392439e4bfSJean-Christophe PLAGNIOL-VILLARD * 402439e4bfSJean-Christophe PLAGNIOL-VILLARD * Copyright (C) Linux Networx. 412439e4bfSJean-Christophe PLAGNIOL-VILLARD * Massive upgrade to work with the new intel gigabit NICs. 422439e4bfSJean-Christophe PLAGNIOL-VILLARD * <ebiederman at lnxi dot com> 432439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 442439e4bfSJean-Christophe PLAGNIOL-VILLARD 452439e4bfSJean-Christophe PLAGNIOL-VILLARD #include "e1000.h" 462439e4bfSJean-Christophe PLAGNIOL-VILLARD 472439e4bfSJean-Christophe PLAGNIOL-VILLARD #define TOUT_LOOP 100000 482439e4bfSJean-Christophe PLAGNIOL-VILLARD 492439e4bfSJean-Christophe PLAGNIOL-VILLARD #undef virt_to_bus 502439e4bfSJean-Christophe PLAGNIOL-VILLARD #define virt_to_bus(x) ((unsigned long)x) 512439e4bfSJean-Christophe PLAGNIOL-VILLARD #define bus_to_phys(devno, a) pci_mem_to_phys(devno, a) 522439e4bfSJean-Christophe PLAGNIOL-VILLARD #define mdelay(n) udelay((n)*1000) 532439e4bfSJean-Christophe PLAGNIOL-VILLARD 54*aa070789SRoy Zang #define E1000_DEFAULT_PBA 0x000a0026 552439e4bfSJean-Christophe PLAGNIOL-VILLARD 562439e4bfSJean-Christophe PLAGNIOL-VILLARD /* NIC specific static variables go here */ 572439e4bfSJean-Christophe PLAGNIOL-VILLARD 582439e4bfSJean-Christophe PLAGNIOL-VILLARD static char tx_pool[128 + 16]; 592439e4bfSJean-Christophe PLAGNIOL-VILLARD static char rx_pool[128 + 16]; 602439e4bfSJean-Christophe PLAGNIOL-VILLARD static char packet[2096]; 612439e4bfSJean-Christophe PLAGNIOL-VILLARD 622439e4bfSJean-Christophe PLAGNIOL-VILLARD static struct e1000_tx_desc *tx_base; 632439e4bfSJean-Christophe PLAGNIOL-VILLARD static struct e1000_rx_desc *rx_base; 642439e4bfSJean-Christophe PLAGNIOL-VILLARD 652439e4bfSJean-Christophe PLAGNIOL-VILLARD static int tx_tail; 662439e4bfSJean-Christophe PLAGNIOL-VILLARD static int rx_tail, rx_last; 672439e4bfSJean-Christophe PLAGNIOL-VILLARD 682439e4bfSJean-Christophe PLAGNIOL-VILLARD static struct pci_device_id supported[] = { 692439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82542}, 702439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82543GC_FIBER}, 712439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82543GC_COPPER}, 722439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544EI_COPPER}, 732439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544EI_FIBER}, 742439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544GC_COPPER}, 752439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544GC_LOM}, 762439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82540EM}, 772439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82545EM_COPPER}, 788915f118SPaul Gortmaker {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82545GM_COPPER}, 792439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546EB_COPPER}, 802439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82545EM_FIBER}, 812439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546EB_FIBER}, 822439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82540EM_LOM}, 83ac3315c2SAndre Schwarz {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82541ER}, 84aa3b8bf9SWolfgang Grandegger {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82541GI_LF}, 85*aa070789SRoy Zang /* E1000 PCIe card */ 86*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_COPPER}, 87*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_FIBER }, 88*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_SERDES }, 89*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_QUAD_COPPER}, 90*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571PT_QUAD_COPPER}, 91*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_QUAD_FIBER}, 92*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_QUAD_COPPER_LOWPROFILE}, 93*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_SERDES_DUAL}, 94*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_SERDES_QUAD}, 95*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI_COPPER}, 96*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI_FIBER}, 97*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI_SERDES}, 98*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI}, 99*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E}, 100*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E_IAMT}, 101*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573L}, 102*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546GB_QUAD_COPPER_KSP3}, 103*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_COPPER_DPT}, 104*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_SERDES_DPT}, 105*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_COPPER_SPT}, 106*aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_SERDES_SPT}, 1071bc43437SStefan Althoefer {} 1082439e4bfSJean-Christophe PLAGNIOL-VILLARD }; 1092439e4bfSJean-Christophe PLAGNIOL-VILLARD 1102439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Function forward declarations */ 1112439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_setup_link(struct eth_device *nic); 1122439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_setup_fiber_link(struct eth_device *nic); 1132439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_setup_copper_link(struct eth_device *nic); 1142439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_phy_setup_autoneg(struct e1000_hw *hw); 1152439e4bfSJean-Christophe PLAGNIOL-VILLARD static void e1000_config_collision_dist(struct e1000_hw *hw); 1162439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_config_mac_to_phy(struct e1000_hw *hw); 1172439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_config_fc_after_link_up(struct e1000_hw *hw); 1182439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_check_for_link(struct eth_device *nic); 1192439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_wait_autoneg(struct e1000_hw *hw); 120*aa070789SRoy Zang static int e1000_get_speed_and_duplex(struct e1000_hw *hw, uint16_t * speed, 1212439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t * duplex); 1222439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, 1232439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t * phy_data); 1242439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, 1252439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data); 126*aa070789SRoy Zang static int32_t e1000_phy_hw_reset(struct e1000_hw *hw); 1272439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_phy_reset(struct e1000_hw *hw); 1282439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_detect_gig_phy(struct e1000_hw *hw); 129*aa070789SRoy Zang static int32_t e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset, 130*aa070789SRoy Zang uint16_t words, 131*aa070789SRoy Zang uint16_t *data); 132*aa070789SRoy Zang static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw); 133*aa070789SRoy Zang static void e1000_set_media_type(struct e1000_hw *hw); 1342439e4bfSJean-Christophe PLAGNIOL-VILLARD 135*aa070789SRoy Zang static int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask); 136*aa070789SRoy Zang static int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); 1372439e4bfSJean-Christophe PLAGNIOL-VILLARD #define E1000_WRITE_REG(a, reg, value) (writel((value), ((a)->hw_addr + E1000_##reg))) 1382439e4bfSJean-Christophe PLAGNIOL-VILLARD #define E1000_READ_REG(a, reg) (readl((a)->hw_addr + E1000_##reg)) 1392439e4bfSJean-Christophe PLAGNIOL-VILLARD #define E1000_WRITE_REG_ARRAY(a, reg, offset, value) (\ 1402439e4bfSJean-Christophe PLAGNIOL-VILLARD writel((value), ((a)->hw_addr + E1000_##reg + ((offset) << 2)))) 1412439e4bfSJean-Christophe PLAGNIOL-VILLARD #define E1000_READ_REG_ARRAY(a, reg, offset) ( \ 1422439e4bfSJean-Christophe PLAGNIOL-VILLARD readl((a)->hw_addr + E1000_##reg + ((offset) << 2))) 1432439e4bfSJean-Christophe PLAGNIOL-VILLARD #define E1000_WRITE_FLUSH(a) {uint32_t x; x = E1000_READ_REG(a, STATUS);} 1442439e4bfSJean-Christophe PLAGNIOL-VILLARD 1452439e4bfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_AP1000 /* remove for warnings */ 1462439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 1472439e4bfSJean-Christophe PLAGNIOL-VILLARD * Raises the EEPROM's clock input. 1482439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1492439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 1502439e4bfSJean-Christophe PLAGNIOL-VILLARD * eecd - EECD's current value 1512439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1522439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 1532439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_ee_clk(struct e1000_hw *hw, uint32_t * eecd) 1542439e4bfSJean-Christophe PLAGNIOL-VILLARD { 1552439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Raise the clock input to the EEPROM (by setting the SK bit), and then 1562439e4bfSJean-Christophe PLAGNIOL-VILLARD * wait 50 microseconds. 1572439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1582439e4bfSJean-Christophe PLAGNIOL-VILLARD *eecd = *eecd | E1000_EECD_SK; 1592439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, *eecd); 1602439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 1612439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(50); 1622439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1632439e4bfSJean-Christophe PLAGNIOL-VILLARD 1642439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 1652439e4bfSJean-Christophe PLAGNIOL-VILLARD * Lowers the EEPROM's clock input. 1662439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1672439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 1682439e4bfSJean-Christophe PLAGNIOL-VILLARD * eecd - EECD's current value 1692439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1702439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 1712439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_ee_clk(struct e1000_hw *hw, uint32_t * eecd) 1722439e4bfSJean-Christophe PLAGNIOL-VILLARD { 1732439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Lower the clock input to the EEPROM (by clearing the SK bit), and then 1742439e4bfSJean-Christophe PLAGNIOL-VILLARD * wait 50 microseconds. 1752439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1762439e4bfSJean-Christophe PLAGNIOL-VILLARD *eecd = *eecd & ~E1000_EECD_SK; 1772439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, *eecd); 1782439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 1792439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(50); 1802439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1812439e4bfSJean-Christophe PLAGNIOL-VILLARD 1822439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 1832439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shift data bits out to the EEPROM. 1842439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1852439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 1862439e4bfSJean-Christophe PLAGNIOL-VILLARD * data - data to send to the EEPROM 1872439e4bfSJean-Christophe PLAGNIOL-VILLARD * count - number of bits to shift out 1882439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1892439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 1902439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_ee_bits(struct e1000_hw *hw, uint16_t data, uint16_t count) 1912439e4bfSJean-Christophe PLAGNIOL-VILLARD { 1922439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t eecd; 1932439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mask; 1942439e4bfSJean-Christophe PLAGNIOL-VILLARD 1952439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We need to shift "count" bits out to the EEPROM. So, value in the 1962439e4bfSJean-Christophe PLAGNIOL-VILLARD * "data" parameter will be shifted out to the EEPROM one bit at a time. 1972439e4bfSJean-Christophe PLAGNIOL-VILLARD * In order to do this, "data" must be broken down into bits. 1982439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1992439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = 0x01 << (count - 1); 2002439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 2012439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); 2022439e4bfSJean-Christophe PLAGNIOL-VILLARD do { 2032439e4bfSJean-Christophe PLAGNIOL-VILLARD /* A "1" is shifted out to the EEPROM by setting bit "DI" to a "1", 2042439e4bfSJean-Christophe PLAGNIOL-VILLARD * and then raising and then lowering the clock (the SK bit controls 2052439e4bfSJean-Christophe PLAGNIOL-VILLARD * the clock input to the EEPROM). A "0" is shifted out to the EEPROM 2062439e4bfSJean-Christophe PLAGNIOL-VILLARD * by setting "DI" to "0" and then raising and then lowering the clock. 2072439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2082439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_DI; 2092439e4bfSJean-Christophe PLAGNIOL-VILLARD 2102439e4bfSJean-Christophe PLAGNIOL-VILLARD if (data & mask) 2112439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_DI; 2122439e4bfSJean-Christophe PLAGNIOL-VILLARD 2132439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2142439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 2152439e4bfSJean-Christophe PLAGNIOL-VILLARD 2162439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(50); 2172439e4bfSJean-Christophe PLAGNIOL-VILLARD 2182439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_ee_clk(hw, &eecd); 2192439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_ee_clk(hw, &eecd); 2202439e4bfSJean-Christophe PLAGNIOL-VILLARD 2212439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = mask >> 1; 2222439e4bfSJean-Christophe PLAGNIOL-VILLARD 2232439e4bfSJean-Christophe PLAGNIOL-VILLARD } while (mask); 2242439e4bfSJean-Christophe PLAGNIOL-VILLARD 2252439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We leave the "DI" bit set to "0" when we leave this routine. */ 2262439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_DI; 2272439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2282439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2292439e4bfSJean-Christophe PLAGNIOL-VILLARD 2302439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 2312439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shift data bits in from the EEPROM 2322439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2332439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 2342439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 2352439e4bfSJean-Christophe PLAGNIOL-VILLARD static uint16_t 236*aa070789SRoy Zang e1000_shift_in_ee_bits(struct e1000_hw *hw, uint16_t count) 2372439e4bfSJean-Christophe PLAGNIOL-VILLARD { 2382439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t eecd; 2392439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 2402439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t data; 2412439e4bfSJean-Christophe PLAGNIOL-VILLARD 242*aa070789SRoy Zang /* In order to read a register from the EEPROM, we need to shift 'count' 243*aa070789SRoy Zang * bits in from the EEPROM. Bits are "shifted in" by raising the clock 244*aa070789SRoy Zang * input to the EEPROM (setting the SK bit), and then reading the 245*aa070789SRoy Zang * value of the "DO" bit. During this "shifting in" process the 246*aa070789SRoy Zang * "DI" bit should always be clear. 2472439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2482439e4bfSJean-Christophe PLAGNIOL-VILLARD 2492439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 2502439e4bfSJean-Christophe PLAGNIOL-VILLARD 2512439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); 2522439e4bfSJean-Christophe PLAGNIOL-VILLARD data = 0; 2532439e4bfSJean-Christophe PLAGNIOL-VILLARD 254*aa070789SRoy Zang for (i = 0; i < count; i++) { 2552439e4bfSJean-Christophe PLAGNIOL-VILLARD data = data << 1; 2562439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_ee_clk(hw, &eecd); 2572439e4bfSJean-Christophe PLAGNIOL-VILLARD 2582439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 2592439e4bfSJean-Christophe PLAGNIOL-VILLARD 2602439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_DI); 2612439e4bfSJean-Christophe PLAGNIOL-VILLARD if (eecd & E1000_EECD_DO) 2622439e4bfSJean-Christophe PLAGNIOL-VILLARD data |= 1; 2632439e4bfSJean-Christophe PLAGNIOL-VILLARD 2642439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_ee_clk(hw, &eecd); 2652439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2662439e4bfSJean-Christophe PLAGNIOL-VILLARD 2672439e4bfSJean-Christophe PLAGNIOL-VILLARD return data; 2682439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2692439e4bfSJean-Christophe PLAGNIOL-VILLARD 2702439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 2712439e4bfSJean-Christophe PLAGNIOL-VILLARD * Returns EEPROM to a "standby" state 2722439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2732439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 2742439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 2752439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 2762439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_standby_eeprom(struct e1000_hw *hw) 2772439e4bfSJean-Christophe PLAGNIOL-VILLARD { 278*aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 2792439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t eecd; 2802439e4bfSJean-Christophe PLAGNIOL-VILLARD 2812439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 2822439e4bfSJean-Christophe PLAGNIOL-VILLARD 283*aa070789SRoy Zang if (eeprom->type == e1000_eeprom_microwire) { 2842439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); 2852439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2862439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 287*aa070789SRoy Zang udelay(eeprom->delay_usec); 2882439e4bfSJean-Christophe PLAGNIOL-VILLARD 2892439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clock high */ 2902439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_SK; 2912439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2922439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 293*aa070789SRoy Zang udelay(eeprom->delay_usec); 2942439e4bfSJean-Christophe PLAGNIOL-VILLARD 2952439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Select EEPROM */ 2962439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_CS; 2972439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2982439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 299*aa070789SRoy Zang udelay(eeprom->delay_usec); 3002439e4bfSJean-Christophe PLAGNIOL-VILLARD 3012439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clock low */ 3022439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_SK; 3032439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 3042439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 305*aa070789SRoy Zang udelay(eeprom->delay_usec); 306*aa070789SRoy Zang } else if (eeprom->type == e1000_eeprom_spi) { 307*aa070789SRoy Zang /* Toggle CS to flush commands */ 308*aa070789SRoy Zang eecd |= E1000_EECD_CS; 309*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 310*aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 311*aa070789SRoy Zang udelay(eeprom->delay_usec); 312*aa070789SRoy Zang eecd &= ~E1000_EECD_CS; 313*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 314*aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 315*aa070789SRoy Zang udelay(eeprom->delay_usec); 316*aa070789SRoy Zang } 317*aa070789SRoy Zang } 318*aa070789SRoy Zang 319*aa070789SRoy Zang /*************************************************************************** 320*aa070789SRoy Zang * Description: Determines if the onboard NVM is FLASH or EEPROM. 321*aa070789SRoy Zang * 322*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 323*aa070789SRoy Zang ****************************************************************************/ 324*aa070789SRoy Zang static boolean_t e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw) 325*aa070789SRoy Zang { 326*aa070789SRoy Zang uint32_t eecd = 0; 327*aa070789SRoy Zang 328*aa070789SRoy Zang DEBUGFUNC(); 329*aa070789SRoy Zang 330*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 331*aa070789SRoy Zang return FALSE; 332*aa070789SRoy Zang 333*aa070789SRoy Zang if (hw->mac_type == e1000_82573) { 334*aa070789SRoy Zang eecd = E1000_READ_REG(hw, EECD); 335*aa070789SRoy Zang 336*aa070789SRoy Zang /* Isolate bits 15 & 16 */ 337*aa070789SRoy Zang eecd = ((eecd >> 15) & 0x03); 338*aa070789SRoy Zang 339*aa070789SRoy Zang /* If both bits are set, device is Flash type */ 340*aa070789SRoy Zang if (eecd == 0x03) 341*aa070789SRoy Zang return FALSE; 342*aa070789SRoy Zang } 343*aa070789SRoy Zang return TRUE; 3442439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3452439e4bfSJean-Christophe PLAGNIOL-VILLARD 3462439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 347*aa070789SRoy Zang * Prepares EEPROM for access 3482439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3492439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 350*aa070789SRoy Zang * 351*aa070789SRoy Zang * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This 352*aa070789SRoy Zang * function should be called before issuing a command to the EEPROM. 3532439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 354*aa070789SRoy Zang static int32_t 355*aa070789SRoy Zang e1000_acquire_eeprom(struct e1000_hw *hw) 3562439e4bfSJean-Christophe PLAGNIOL-VILLARD { 357*aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 358*aa070789SRoy Zang uint32_t eecd, i = 0; 3592439e4bfSJean-Christophe PLAGNIOL-VILLARD 360*aa070789SRoy Zang DEBUGOUT(); 361*aa070789SRoy Zang 362*aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM)) 363*aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 364*aa070789SRoy Zang eecd = E1000_READ_REG(hw, EECD); 365*aa070789SRoy Zang 366*aa070789SRoy Zang if (hw->mac_type != e1000_82573) { 3672439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Request EEPROM Access */ 3682439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82544) { 3692439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_REQ; 3702439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 3712439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 372*aa070789SRoy Zang while ((!(eecd & E1000_EECD_GNT)) && 373*aa070789SRoy Zang (i < E1000_EEPROM_GRANT_ATTEMPTS)) { 3742439e4bfSJean-Christophe PLAGNIOL-VILLARD i++; 375*aa070789SRoy Zang udelay(5); 3762439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 3772439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3782439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(eecd & E1000_EECD_GNT)) { 3792439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_REQ; 3802439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 3812439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Could not acquire EEPROM grant\n"); 3822439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 3832439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3842439e4bfSJean-Christophe PLAGNIOL-VILLARD } 385*aa070789SRoy Zang } 3862439e4bfSJean-Christophe PLAGNIOL-VILLARD 387*aa070789SRoy Zang /* Setup EEPROM for Read/Write */ 3882439e4bfSJean-Christophe PLAGNIOL-VILLARD 389*aa070789SRoy Zang if (eeprom->type == e1000_eeprom_microwire) { 390*aa070789SRoy Zang /* Clear SK and DI */ 391*aa070789SRoy Zang eecd &= ~(E1000_EECD_DI | E1000_EECD_SK); 392*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 3932439e4bfSJean-Christophe PLAGNIOL-VILLARD 394*aa070789SRoy Zang /* Set CS */ 395*aa070789SRoy Zang eecd |= E1000_EECD_CS; 396*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 397*aa070789SRoy Zang } else if (eeprom->type == e1000_eeprom_spi) { 398*aa070789SRoy Zang /* Clear SK and CS */ 399*aa070789SRoy Zang eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); 400*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 401*aa070789SRoy Zang udelay(1); 402*aa070789SRoy Zang } 4032439e4bfSJean-Christophe PLAGNIOL-VILLARD 404*aa070789SRoy Zang return E1000_SUCCESS; 405*aa070789SRoy Zang } 4062439e4bfSJean-Christophe PLAGNIOL-VILLARD 407*aa070789SRoy Zang /****************************************************************************** 408*aa070789SRoy Zang * Sets up eeprom variables in the hw struct. Must be called after mac_type 409*aa070789SRoy Zang * is configured. Additionally, if this is ICH8, the flash controller GbE 410*aa070789SRoy Zang * registers must be mapped, or this will crash. 411*aa070789SRoy Zang * 412*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 413*aa070789SRoy Zang *****************************************************************************/ 414*aa070789SRoy Zang static int32_t e1000_init_eeprom_params(struct e1000_hw *hw) 415*aa070789SRoy Zang { 416*aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 417*aa070789SRoy Zang uint32_t eecd = E1000_READ_REG(hw, EECD); 418*aa070789SRoy Zang int32_t ret_val = E1000_SUCCESS; 419*aa070789SRoy Zang uint16_t eeprom_size; 420*aa070789SRoy Zang 421*aa070789SRoy Zang DEBUGOUT(); 422*aa070789SRoy Zang 423*aa070789SRoy Zang switch (hw->mac_type) { 424*aa070789SRoy Zang case e1000_82542_rev2_0: 425*aa070789SRoy Zang case e1000_82542_rev2_1: 426*aa070789SRoy Zang case e1000_82543: 427*aa070789SRoy Zang case e1000_82544: 428*aa070789SRoy Zang eeprom->type = e1000_eeprom_microwire; 429*aa070789SRoy Zang eeprom->word_size = 64; 430*aa070789SRoy Zang eeprom->opcode_bits = 3; 431*aa070789SRoy Zang eeprom->address_bits = 6; 432*aa070789SRoy Zang eeprom->delay_usec = 50; 433*aa070789SRoy Zang eeprom->use_eerd = FALSE; 434*aa070789SRoy Zang eeprom->use_eewr = FALSE; 435*aa070789SRoy Zang break; 436*aa070789SRoy Zang case e1000_82540: 437*aa070789SRoy Zang case e1000_82545: 438*aa070789SRoy Zang case e1000_82545_rev_3: 439*aa070789SRoy Zang case e1000_82546: 440*aa070789SRoy Zang case e1000_82546_rev_3: 441*aa070789SRoy Zang eeprom->type = e1000_eeprom_microwire; 442*aa070789SRoy Zang eeprom->opcode_bits = 3; 443*aa070789SRoy Zang eeprom->delay_usec = 50; 444*aa070789SRoy Zang if (eecd & E1000_EECD_SIZE) { 445*aa070789SRoy Zang eeprom->word_size = 256; 446*aa070789SRoy Zang eeprom->address_bits = 8; 447*aa070789SRoy Zang } else { 448*aa070789SRoy Zang eeprom->word_size = 64; 449*aa070789SRoy Zang eeprom->address_bits = 6; 450*aa070789SRoy Zang } 451*aa070789SRoy Zang eeprom->use_eerd = FALSE; 452*aa070789SRoy Zang eeprom->use_eewr = FALSE; 453*aa070789SRoy Zang break; 454*aa070789SRoy Zang case e1000_82541: 455*aa070789SRoy Zang case e1000_82541_rev_2: 456*aa070789SRoy Zang case e1000_82547: 457*aa070789SRoy Zang case e1000_82547_rev_2: 458*aa070789SRoy Zang if (eecd & E1000_EECD_TYPE) { 459*aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 460*aa070789SRoy Zang eeprom->opcode_bits = 8; 461*aa070789SRoy Zang eeprom->delay_usec = 1; 462*aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 463*aa070789SRoy Zang eeprom->page_size = 32; 464*aa070789SRoy Zang eeprom->address_bits = 16; 465*aa070789SRoy Zang } else { 466*aa070789SRoy Zang eeprom->page_size = 8; 467*aa070789SRoy Zang eeprom->address_bits = 8; 468*aa070789SRoy Zang } 469*aa070789SRoy Zang } else { 470*aa070789SRoy Zang eeprom->type = e1000_eeprom_microwire; 471*aa070789SRoy Zang eeprom->opcode_bits = 3; 472*aa070789SRoy Zang eeprom->delay_usec = 50; 473*aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 474*aa070789SRoy Zang eeprom->word_size = 256; 475*aa070789SRoy Zang eeprom->address_bits = 8; 476*aa070789SRoy Zang } else { 477*aa070789SRoy Zang eeprom->word_size = 64; 478*aa070789SRoy Zang eeprom->address_bits = 6; 479*aa070789SRoy Zang } 480*aa070789SRoy Zang } 481*aa070789SRoy Zang eeprom->use_eerd = FALSE; 482*aa070789SRoy Zang eeprom->use_eewr = FALSE; 483*aa070789SRoy Zang break; 484*aa070789SRoy Zang case e1000_82571: 485*aa070789SRoy Zang case e1000_82572: 486*aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 487*aa070789SRoy Zang eeprom->opcode_bits = 8; 488*aa070789SRoy Zang eeprom->delay_usec = 1; 489*aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 490*aa070789SRoy Zang eeprom->page_size = 32; 491*aa070789SRoy Zang eeprom->address_bits = 16; 492*aa070789SRoy Zang } else { 493*aa070789SRoy Zang eeprom->page_size = 8; 494*aa070789SRoy Zang eeprom->address_bits = 8; 495*aa070789SRoy Zang } 496*aa070789SRoy Zang eeprom->use_eerd = FALSE; 497*aa070789SRoy Zang eeprom->use_eewr = FALSE; 498*aa070789SRoy Zang break; 499*aa070789SRoy Zang case e1000_82573: 500*aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 501*aa070789SRoy Zang eeprom->opcode_bits = 8; 502*aa070789SRoy Zang eeprom->delay_usec = 1; 503*aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 504*aa070789SRoy Zang eeprom->page_size = 32; 505*aa070789SRoy Zang eeprom->address_bits = 16; 506*aa070789SRoy Zang } else { 507*aa070789SRoy Zang eeprom->page_size = 8; 508*aa070789SRoy Zang eeprom->address_bits = 8; 509*aa070789SRoy Zang } 510*aa070789SRoy Zang eeprom->use_eerd = TRUE; 511*aa070789SRoy Zang eeprom->use_eewr = TRUE; 512*aa070789SRoy Zang if (e1000_is_onboard_nvm_eeprom(hw) == FALSE) { 513*aa070789SRoy Zang eeprom->type = e1000_eeprom_flash; 514*aa070789SRoy Zang eeprom->word_size = 2048; 515*aa070789SRoy Zang 516*aa070789SRoy Zang /* Ensure that the Autonomous FLASH update bit is cleared due to 517*aa070789SRoy Zang * Flash update issue on parts which use a FLASH for NVM. */ 518*aa070789SRoy Zang eecd &= ~E1000_EECD_AUPDEN; 5192439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 5202439e4bfSJean-Christophe PLAGNIOL-VILLARD } 521*aa070789SRoy Zang break; 522*aa070789SRoy Zang case e1000_80003es2lan: 523*aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 524*aa070789SRoy Zang eeprom->opcode_bits = 8; 525*aa070789SRoy Zang eeprom->delay_usec = 1; 526*aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 527*aa070789SRoy Zang eeprom->page_size = 32; 528*aa070789SRoy Zang eeprom->address_bits = 16; 529*aa070789SRoy Zang } else { 530*aa070789SRoy Zang eeprom->page_size = 8; 531*aa070789SRoy Zang eeprom->address_bits = 8; 5322439e4bfSJean-Christophe PLAGNIOL-VILLARD } 533*aa070789SRoy Zang eeprom->use_eerd = TRUE; 534*aa070789SRoy Zang eeprom->use_eewr = FALSE; 535*aa070789SRoy Zang break; 5362439e4bfSJean-Christophe PLAGNIOL-VILLARD 537*aa070789SRoy Zang /* ich8lan does not support currently. if needed, please 538*aa070789SRoy Zang * add corresponding code and functions. 539*aa070789SRoy Zang */ 5402439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 541*aa070789SRoy Zang case e1000_ich8lan: 5422439e4bfSJean-Christophe PLAGNIOL-VILLARD { 543*aa070789SRoy Zang int32_t i = 0; 5442439e4bfSJean-Christophe PLAGNIOL-VILLARD 545*aa070789SRoy Zang eeprom->type = e1000_eeprom_ich8; 546*aa070789SRoy Zang eeprom->use_eerd = FALSE; 547*aa070789SRoy Zang eeprom->use_eewr = FALSE; 548*aa070789SRoy Zang eeprom->word_size = E1000_SHADOW_RAM_WORDS; 549*aa070789SRoy Zang uint32_t flash_size = E1000_READ_ICH_FLASH_REG(hw, 550*aa070789SRoy Zang ICH_FLASH_GFPREG); 551*aa070789SRoy Zang /* Zero the shadow RAM structure. But don't load it from NVM 552*aa070789SRoy Zang * so as to save time for driver init */ 553*aa070789SRoy Zang if (hw->eeprom_shadow_ram != NULL) { 554*aa070789SRoy Zang for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) { 555*aa070789SRoy Zang hw->eeprom_shadow_ram[i].modified = FALSE; 556*aa070789SRoy Zang hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF; 557*aa070789SRoy Zang } 5582439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5592439e4bfSJean-Christophe PLAGNIOL-VILLARD 560*aa070789SRoy Zang hw->flash_base_addr = (flash_size & ICH_GFPREG_BASE_MASK) * 561*aa070789SRoy Zang ICH_FLASH_SECTOR_SIZE; 5622439e4bfSJean-Christophe PLAGNIOL-VILLARD 563*aa070789SRoy Zang hw->flash_bank_size = ((flash_size >> 16) 564*aa070789SRoy Zang & ICH_GFPREG_BASE_MASK) + 1; 565*aa070789SRoy Zang hw->flash_bank_size -= (flash_size & ICH_GFPREG_BASE_MASK); 5662439e4bfSJean-Christophe PLAGNIOL-VILLARD 567*aa070789SRoy Zang hw->flash_bank_size *= ICH_FLASH_SECTOR_SIZE; 5682439e4bfSJean-Christophe PLAGNIOL-VILLARD 569*aa070789SRoy Zang hw->flash_bank_size /= 2 * sizeof(uint16_t); 570*aa070789SRoy Zang break; 5712439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5722439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 573*aa070789SRoy Zang default: 574*aa070789SRoy Zang break; 575*aa070789SRoy Zang } 576*aa070789SRoy Zang 577*aa070789SRoy Zang if (eeprom->type == e1000_eeprom_spi) { 578*aa070789SRoy Zang /* eeprom_size will be an enum [0..8] that maps 579*aa070789SRoy Zang * to eeprom sizes 128B to 580*aa070789SRoy Zang * 32KB (incremented by powers of 2). 581*aa070789SRoy Zang */ 582*aa070789SRoy Zang if (hw->mac_type <= e1000_82547_rev_2) { 583*aa070789SRoy Zang /* Set to default value for initial eeprom read. */ 584*aa070789SRoy Zang eeprom->word_size = 64; 585*aa070789SRoy Zang ret_val = e1000_read_eeprom(hw, EEPROM_CFG, 1, 586*aa070789SRoy Zang &eeprom_size); 587*aa070789SRoy Zang if (ret_val) 588*aa070789SRoy Zang return ret_val; 589*aa070789SRoy Zang eeprom_size = (eeprom_size & EEPROM_SIZE_MASK) 590*aa070789SRoy Zang >> EEPROM_SIZE_SHIFT; 591*aa070789SRoy Zang /* 256B eeprom size was not supported in earlier 592*aa070789SRoy Zang * hardware, so we bump eeprom_size up one to 593*aa070789SRoy Zang * ensure that "1" (which maps to 256B) is never 594*aa070789SRoy Zang * the result used in the shifting logic below. */ 595*aa070789SRoy Zang if (eeprom_size) 596*aa070789SRoy Zang eeprom_size++; 597*aa070789SRoy Zang } else { 598*aa070789SRoy Zang eeprom_size = (uint16_t)((eecd & 599*aa070789SRoy Zang E1000_EECD_SIZE_EX_MASK) >> 600*aa070789SRoy Zang E1000_EECD_SIZE_EX_SHIFT); 601*aa070789SRoy Zang } 602*aa070789SRoy Zang 603*aa070789SRoy Zang eeprom->word_size = 1 << (eeprom_size + EEPROM_WORD_SIZE_SHIFT); 604*aa070789SRoy Zang } 605*aa070789SRoy Zang return ret_val; 606*aa070789SRoy Zang } 607*aa070789SRoy Zang 608*aa070789SRoy Zang /****************************************************************************** 609*aa070789SRoy Zang * Polls the status bit (bit 1) of the EERD to determine when the read is done. 610*aa070789SRoy Zang * 611*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 612*aa070789SRoy Zang *****************************************************************************/ 613*aa070789SRoy Zang static int32_t 614*aa070789SRoy Zang e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd) 615*aa070789SRoy Zang { 616*aa070789SRoy Zang uint32_t attempts = 100000; 617*aa070789SRoy Zang uint32_t i, reg = 0; 618*aa070789SRoy Zang int32_t done = E1000_ERR_EEPROM; 619*aa070789SRoy Zang 620*aa070789SRoy Zang for (i = 0; i < attempts; i++) { 621*aa070789SRoy Zang if (eerd == E1000_EEPROM_POLL_READ) 622*aa070789SRoy Zang reg = E1000_READ_REG(hw, EERD); 623*aa070789SRoy Zang else 624*aa070789SRoy Zang reg = E1000_READ_REG(hw, EEWR); 625*aa070789SRoy Zang 626*aa070789SRoy Zang if (reg & E1000_EEPROM_RW_REG_DONE) { 627*aa070789SRoy Zang done = E1000_SUCCESS; 628*aa070789SRoy Zang break; 629*aa070789SRoy Zang } 630*aa070789SRoy Zang udelay(5); 631*aa070789SRoy Zang } 632*aa070789SRoy Zang 633*aa070789SRoy Zang return done; 634*aa070789SRoy Zang } 635*aa070789SRoy Zang 636*aa070789SRoy Zang /****************************************************************************** 637*aa070789SRoy Zang * Reads a 16 bit word from the EEPROM using the EERD register. 638*aa070789SRoy Zang * 639*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 640*aa070789SRoy Zang * offset - offset of word in the EEPROM to read 641*aa070789SRoy Zang * data - word read from the EEPROM 642*aa070789SRoy Zang * words - number of words to read 643*aa070789SRoy Zang *****************************************************************************/ 644*aa070789SRoy Zang static int32_t 645*aa070789SRoy Zang e1000_read_eeprom_eerd(struct e1000_hw *hw, 646*aa070789SRoy Zang uint16_t offset, 647*aa070789SRoy Zang uint16_t words, 648*aa070789SRoy Zang uint16_t *data) 649*aa070789SRoy Zang { 650*aa070789SRoy Zang uint32_t i, eerd = 0; 651*aa070789SRoy Zang int32_t error = 0; 652*aa070789SRoy Zang 653*aa070789SRoy Zang for (i = 0; i < words; i++) { 654*aa070789SRoy Zang eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) + 655*aa070789SRoy Zang E1000_EEPROM_RW_REG_START; 656*aa070789SRoy Zang 657*aa070789SRoy Zang E1000_WRITE_REG(hw, EERD, eerd); 658*aa070789SRoy Zang error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ); 659*aa070789SRoy Zang 660*aa070789SRoy Zang if (error) 661*aa070789SRoy Zang break; 662*aa070789SRoy Zang data[i] = (E1000_READ_REG(hw, EERD) >> 663*aa070789SRoy Zang E1000_EEPROM_RW_REG_DATA); 664*aa070789SRoy Zang 665*aa070789SRoy Zang } 666*aa070789SRoy Zang 667*aa070789SRoy Zang return error; 668*aa070789SRoy Zang } 669*aa070789SRoy Zang 670*aa070789SRoy Zang static void 671*aa070789SRoy Zang e1000_release_eeprom(struct e1000_hw *hw) 672*aa070789SRoy Zang { 673*aa070789SRoy Zang uint32_t eecd; 674*aa070789SRoy Zang 675*aa070789SRoy Zang DEBUGFUNC(); 676*aa070789SRoy Zang 677*aa070789SRoy Zang eecd = E1000_READ_REG(hw, EECD); 678*aa070789SRoy Zang 679*aa070789SRoy Zang if (hw->eeprom.type == e1000_eeprom_spi) { 680*aa070789SRoy Zang eecd |= E1000_EECD_CS; /* Pull CS high */ 681*aa070789SRoy Zang eecd &= ~E1000_EECD_SK; /* Lower SCK */ 682*aa070789SRoy Zang 683*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 684*aa070789SRoy Zang 685*aa070789SRoy Zang udelay(hw->eeprom.delay_usec); 686*aa070789SRoy Zang } else if (hw->eeprom.type == e1000_eeprom_microwire) { 687*aa070789SRoy Zang /* cleanup eeprom */ 688*aa070789SRoy Zang 689*aa070789SRoy Zang /* CS on Microwire is active-high */ 690*aa070789SRoy Zang eecd &= ~(E1000_EECD_CS | E1000_EECD_DI); 691*aa070789SRoy Zang 692*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 693*aa070789SRoy Zang 694*aa070789SRoy Zang /* Rising edge of clock */ 695*aa070789SRoy Zang eecd |= E1000_EECD_SK; 696*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 697*aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 698*aa070789SRoy Zang udelay(hw->eeprom.delay_usec); 699*aa070789SRoy Zang 700*aa070789SRoy Zang /* Falling edge of clock */ 701*aa070789SRoy Zang eecd &= ~E1000_EECD_SK; 702*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 703*aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 704*aa070789SRoy Zang udelay(hw->eeprom.delay_usec); 705*aa070789SRoy Zang } 706*aa070789SRoy Zang 707*aa070789SRoy Zang /* Stop requesting EEPROM access */ 708*aa070789SRoy Zang if (hw->mac_type > e1000_82544) { 709*aa070789SRoy Zang eecd &= ~E1000_EECD_REQ; 710*aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 711*aa070789SRoy Zang } 712*aa070789SRoy Zang } 713*aa070789SRoy Zang /****************************************************************************** 714*aa070789SRoy Zang * Reads a 16 bit word from the EEPROM. 715*aa070789SRoy Zang * 716*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 717*aa070789SRoy Zang *****************************************************************************/ 718*aa070789SRoy Zang static int32_t 719*aa070789SRoy Zang e1000_spi_eeprom_ready(struct e1000_hw *hw) 720*aa070789SRoy Zang { 721*aa070789SRoy Zang uint16_t retry_count = 0; 722*aa070789SRoy Zang uint8_t spi_stat_reg; 723*aa070789SRoy Zang 724*aa070789SRoy Zang DEBUGFUNC(); 725*aa070789SRoy Zang 726*aa070789SRoy Zang /* Read "Status Register" repeatedly until the LSB is cleared. The 727*aa070789SRoy Zang * EEPROM will signal that the command has been completed by clearing 728*aa070789SRoy Zang * bit 0 of the internal status register. If it's not cleared within 729*aa070789SRoy Zang * 5 milliseconds, then error out. 730*aa070789SRoy Zang */ 731*aa070789SRoy Zang retry_count = 0; 732*aa070789SRoy Zang do { 733*aa070789SRoy Zang e1000_shift_out_ee_bits(hw, EEPROM_RDSR_OPCODE_SPI, 734*aa070789SRoy Zang hw->eeprom.opcode_bits); 735*aa070789SRoy Zang spi_stat_reg = (uint8_t)e1000_shift_in_ee_bits(hw, 8); 736*aa070789SRoy Zang if (!(spi_stat_reg & EEPROM_STATUS_RDY_SPI)) 737*aa070789SRoy Zang break; 738*aa070789SRoy Zang 739*aa070789SRoy Zang udelay(5); 740*aa070789SRoy Zang retry_count += 5; 741*aa070789SRoy Zang 742*aa070789SRoy Zang e1000_standby_eeprom(hw); 743*aa070789SRoy Zang } while (retry_count < EEPROM_MAX_RETRY_SPI); 744*aa070789SRoy Zang 745*aa070789SRoy Zang /* ATMEL SPI write time could vary from 0-20mSec on 3.3V devices (and 746*aa070789SRoy Zang * only 0-5mSec on 5V devices) 747*aa070789SRoy Zang */ 748*aa070789SRoy Zang if (retry_count >= EEPROM_MAX_RETRY_SPI) { 749*aa070789SRoy Zang DEBUGOUT("SPI EEPROM Status error\n"); 750*aa070789SRoy Zang return -E1000_ERR_EEPROM; 751*aa070789SRoy Zang } 752*aa070789SRoy Zang 753*aa070789SRoy Zang return E1000_SUCCESS; 754*aa070789SRoy Zang } 755*aa070789SRoy Zang 756*aa070789SRoy Zang /****************************************************************************** 757*aa070789SRoy Zang * Reads a 16 bit word from the EEPROM. 758*aa070789SRoy Zang * 759*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 760*aa070789SRoy Zang * offset - offset of word in the EEPROM to read 761*aa070789SRoy Zang * data - word read from the EEPROM 762*aa070789SRoy Zang *****************************************************************************/ 763*aa070789SRoy Zang static int32_t 764*aa070789SRoy Zang e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset, 765*aa070789SRoy Zang uint16_t words, uint16_t *data) 766*aa070789SRoy Zang { 767*aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 768*aa070789SRoy Zang uint32_t i = 0; 769*aa070789SRoy Zang 770*aa070789SRoy Zang DEBUGFUNC(); 771*aa070789SRoy Zang 772*aa070789SRoy Zang /* If eeprom is not yet detected, do so now */ 773*aa070789SRoy Zang if (eeprom->word_size == 0) 774*aa070789SRoy Zang e1000_init_eeprom_params(hw); 775*aa070789SRoy Zang 776*aa070789SRoy Zang /* A check for invalid values: offset too large, too many words, 777*aa070789SRoy Zang * and not enough words. 778*aa070789SRoy Zang */ 779*aa070789SRoy Zang if ((offset >= eeprom->word_size) || 780*aa070789SRoy Zang (words > eeprom->word_size - offset) || 781*aa070789SRoy Zang (words == 0)) { 782*aa070789SRoy Zang DEBUGOUT("\"words\" parameter out of bounds." 783*aa070789SRoy Zang "Words = %d, size = %d\n", offset, eeprom->word_size); 784*aa070789SRoy Zang return -E1000_ERR_EEPROM; 785*aa070789SRoy Zang } 786*aa070789SRoy Zang 787*aa070789SRoy Zang /* EEPROM's that don't use EERD to read require us to bit-bang the SPI 788*aa070789SRoy Zang * directly. In this case, we need to acquire the EEPROM so that 789*aa070789SRoy Zang * FW or other port software does not interrupt. 790*aa070789SRoy Zang */ 791*aa070789SRoy Zang if (e1000_is_onboard_nvm_eeprom(hw) == TRUE && 792*aa070789SRoy Zang hw->eeprom.use_eerd == FALSE) { 793*aa070789SRoy Zang 794*aa070789SRoy Zang /* Prepare the EEPROM for bit-bang reading */ 795*aa070789SRoy Zang if (e1000_acquire_eeprom(hw) != E1000_SUCCESS) 796*aa070789SRoy Zang return -E1000_ERR_EEPROM; 797*aa070789SRoy Zang } 798*aa070789SRoy Zang 799*aa070789SRoy Zang /* Eerd register EEPROM access requires no eeprom aquire/release */ 800*aa070789SRoy Zang if (eeprom->use_eerd == TRUE) 801*aa070789SRoy Zang return e1000_read_eeprom_eerd(hw, offset, words, data); 802*aa070789SRoy Zang 803*aa070789SRoy Zang /* ich8lan does not support currently. if needed, please 804*aa070789SRoy Zang * add corresponding code and functions. 805*aa070789SRoy Zang */ 806*aa070789SRoy Zang #if 0 807*aa070789SRoy Zang /* ICH EEPROM access is done via the ICH flash controller */ 808*aa070789SRoy Zang if (eeprom->type == e1000_eeprom_ich8) 809*aa070789SRoy Zang return e1000_read_eeprom_ich8(hw, offset, words, data); 810*aa070789SRoy Zang #endif 811*aa070789SRoy Zang /* Set up the SPI or Microwire EEPROM for bit-bang reading. We have 812*aa070789SRoy Zang * acquired the EEPROM at this point, so any returns should relase it */ 813*aa070789SRoy Zang if (eeprom->type == e1000_eeprom_spi) { 814*aa070789SRoy Zang uint16_t word_in; 815*aa070789SRoy Zang uint8_t read_opcode = EEPROM_READ_OPCODE_SPI; 816*aa070789SRoy Zang 817*aa070789SRoy Zang if (e1000_spi_eeprom_ready(hw)) { 818*aa070789SRoy Zang e1000_release_eeprom(hw); 819*aa070789SRoy Zang return -E1000_ERR_EEPROM; 820*aa070789SRoy Zang } 821*aa070789SRoy Zang 822*aa070789SRoy Zang e1000_standby_eeprom(hw); 823*aa070789SRoy Zang 824*aa070789SRoy Zang /* Some SPI eeproms use the 8th address bit embedded in 825*aa070789SRoy Zang * the opcode */ 826*aa070789SRoy Zang if ((eeprom->address_bits == 8) && (offset >= 128)) 827*aa070789SRoy Zang read_opcode |= EEPROM_A8_OPCODE_SPI; 828*aa070789SRoy Zang 829*aa070789SRoy Zang /* Send the READ command (opcode + addr) */ 830*aa070789SRoy Zang e1000_shift_out_ee_bits(hw, read_opcode, eeprom->opcode_bits); 831*aa070789SRoy Zang e1000_shift_out_ee_bits(hw, (uint16_t)(offset*2), 832*aa070789SRoy Zang eeprom->address_bits); 833*aa070789SRoy Zang 834*aa070789SRoy Zang /* Read the data. The address of the eeprom internally 835*aa070789SRoy Zang * increments with each byte (spi) being read, saving on the 836*aa070789SRoy Zang * overhead of eeprom setup and tear-down. The address 837*aa070789SRoy Zang * counter will roll over if reading beyond the size of 838*aa070789SRoy Zang * the eeprom, thus allowing the entire memory to be read 839*aa070789SRoy Zang * starting from any offset. */ 840*aa070789SRoy Zang for (i = 0; i < words; i++) { 841*aa070789SRoy Zang word_in = e1000_shift_in_ee_bits(hw, 16); 842*aa070789SRoy Zang data[i] = (word_in >> 8) | (word_in << 8); 843*aa070789SRoy Zang } 844*aa070789SRoy Zang } else if (eeprom->type == e1000_eeprom_microwire) { 845*aa070789SRoy Zang for (i = 0; i < words; i++) { 846*aa070789SRoy Zang /* Send the READ command (opcode + addr) */ 847*aa070789SRoy Zang e1000_shift_out_ee_bits(hw, 848*aa070789SRoy Zang EEPROM_READ_OPCODE_MICROWIRE, 849*aa070789SRoy Zang eeprom->opcode_bits); 850*aa070789SRoy Zang e1000_shift_out_ee_bits(hw, (uint16_t)(offset + i), 851*aa070789SRoy Zang eeprom->address_bits); 852*aa070789SRoy Zang 853*aa070789SRoy Zang /* Read the data. For microwire, each word requires 854*aa070789SRoy Zang * the overhead of eeprom setup and tear-down. */ 855*aa070789SRoy Zang data[i] = e1000_shift_in_ee_bits(hw, 16); 856*aa070789SRoy Zang e1000_standby_eeprom(hw); 857*aa070789SRoy Zang } 858*aa070789SRoy Zang } 859*aa070789SRoy Zang 860*aa070789SRoy Zang /* End this read operation */ 861*aa070789SRoy Zang e1000_release_eeprom(hw); 862*aa070789SRoy Zang 863*aa070789SRoy Zang return E1000_SUCCESS; 864*aa070789SRoy Zang } 8652439e4bfSJean-Christophe PLAGNIOL-VILLARD 8662439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 8672439e4bfSJean-Christophe PLAGNIOL-VILLARD * Verifies that the EEPROM has a valid checksum 8682439e4bfSJean-Christophe PLAGNIOL-VILLARD * 8692439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 8702439e4bfSJean-Christophe PLAGNIOL-VILLARD * 8712439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reads the first 64 16 bit words of the EEPROM and sums the values read. 8722439e4bfSJean-Christophe PLAGNIOL-VILLARD * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is 8732439e4bfSJean-Christophe PLAGNIOL-VILLARD * valid. 8742439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 8752439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 8762439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_validate_eeprom_checksum(struct eth_device *nic) 8772439e4bfSJean-Christophe PLAGNIOL-VILLARD { 8782439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 8792439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t checksum = 0; 8802439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t i, eeprom_data; 8812439e4bfSJean-Christophe PLAGNIOL-VILLARD 8822439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 8832439e4bfSJean-Christophe PLAGNIOL-VILLARD 8842439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) { 885*aa070789SRoy Zang if (e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) { 8862439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("EEPROM Read Error\n"); 8872439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 8882439e4bfSJean-Christophe PLAGNIOL-VILLARD } 8892439e4bfSJean-Christophe PLAGNIOL-VILLARD checksum += eeprom_data; 8902439e4bfSJean-Christophe PLAGNIOL-VILLARD } 8912439e4bfSJean-Christophe PLAGNIOL-VILLARD 8922439e4bfSJean-Christophe PLAGNIOL-VILLARD if (checksum == (uint16_t) EEPROM_SUM) { 8932439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 8942439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 8952439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("EEPROM Checksum Invalid\n"); 8962439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 8972439e4bfSJean-Christophe PLAGNIOL-VILLARD } 8982439e4bfSJean-Christophe PLAGNIOL-VILLARD } 8992439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif /* #ifndef CONFIG_AP1000 */ 9002439e4bfSJean-Christophe PLAGNIOL-VILLARD 901*aa070789SRoy Zang /*************************************************************************** 902*aa070789SRoy Zang * 903*aa070789SRoy Zang * Obtaining software semaphore bit (SMBI) before resetting PHY. 904*aa070789SRoy Zang * 905*aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 906*aa070789SRoy Zang * 907*aa070789SRoy Zang * returns: - E1000_ERR_RESET if fail to obtain semaphore. 908*aa070789SRoy Zang * E1000_SUCCESS at any other case. 909*aa070789SRoy Zang * 910*aa070789SRoy Zang ***************************************************************************/ 911*aa070789SRoy Zang static int32_t 912*aa070789SRoy Zang e1000_get_software_semaphore(struct e1000_hw *hw) 913*aa070789SRoy Zang { 914*aa070789SRoy Zang int32_t timeout = hw->eeprom.word_size + 1; 915*aa070789SRoy Zang uint32_t swsm; 916*aa070789SRoy Zang 917*aa070789SRoy Zang DEBUGFUNC(); 918*aa070789SRoy Zang 919*aa070789SRoy Zang if (hw->mac_type != e1000_80003es2lan) 920*aa070789SRoy Zang return E1000_SUCCESS; 921*aa070789SRoy Zang 922*aa070789SRoy Zang while (timeout) { 923*aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 924*aa070789SRoy Zang /* If SMBI bit cleared, it is now set and we hold 925*aa070789SRoy Zang * the semaphore */ 926*aa070789SRoy Zang if (!(swsm & E1000_SWSM_SMBI)) 927*aa070789SRoy Zang break; 928*aa070789SRoy Zang mdelay(1); 929*aa070789SRoy Zang timeout--; 930*aa070789SRoy Zang } 931*aa070789SRoy Zang 932*aa070789SRoy Zang if (!timeout) { 933*aa070789SRoy Zang DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); 934*aa070789SRoy Zang return -E1000_ERR_RESET; 935*aa070789SRoy Zang } 936*aa070789SRoy Zang 937*aa070789SRoy Zang return E1000_SUCCESS; 938*aa070789SRoy Zang } 939*aa070789SRoy Zang 940*aa070789SRoy Zang /*************************************************************************** 941*aa070789SRoy Zang * This function clears HW semaphore bits. 942*aa070789SRoy Zang * 943*aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 944*aa070789SRoy Zang * 945*aa070789SRoy Zang * returns: - None. 946*aa070789SRoy Zang * 947*aa070789SRoy Zang ***************************************************************************/ 948*aa070789SRoy Zang static void 949*aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw) 950*aa070789SRoy Zang { 951*aa070789SRoy Zang uint32_t swsm; 952*aa070789SRoy Zang 953*aa070789SRoy Zang DEBUGFUNC(); 954*aa070789SRoy Zang 955*aa070789SRoy Zang if (!hw->eeprom_semaphore_present) 956*aa070789SRoy Zang return; 957*aa070789SRoy Zang 958*aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 959*aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 960*aa070789SRoy Zang /* Release both semaphores. */ 961*aa070789SRoy Zang swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); 962*aa070789SRoy Zang } else 963*aa070789SRoy Zang swsm &= ~(E1000_SWSM_SWESMBI); 964*aa070789SRoy Zang E1000_WRITE_REG(hw, SWSM, swsm); 965*aa070789SRoy Zang } 966*aa070789SRoy Zang 967*aa070789SRoy Zang /*************************************************************************** 968*aa070789SRoy Zang * 969*aa070789SRoy Zang * Using the combination of SMBI and SWESMBI semaphore bits when resetting 970*aa070789SRoy Zang * adapter or Eeprom access. 971*aa070789SRoy Zang * 972*aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 973*aa070789SRoy Zang * 974*aa070789SRoy Zang * returns: - E1000_ERR_EEPROM if fail to access EEPROM. 975*aa070789SRoy Zang * E1000_SUCCESS at any other case. 976*aa070789SRoy Zang * 977*aa070789SRoy Zang ***************************************************************************/ 978*aa070789SRoy Zang static int32_t 979*aa070789SRoy Zang e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw) 980*aa070789SRoy Zang { 981*aa070789SRoy Zang int32_t timeout; 982*aa070789SRoy Zang uint32_t swsm; 983*aa070789SRoy Zang 984*aa070789SRoy Zang DEBUGFUNC(); 985*aa070789SRoy Zang 986*aa070789SRoy Zang if (!hw->eeprom_semaphore_present) 987*aa070789SRoy Zang return E1000_SUCCESS; 988*aa070789SRoy Zang 989*aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 990*aa070789SRoy Zang /* Get the SW semaphore. */ 991*aa070789SRoy Zang if (e1000_get_software_semaphore(hw) != E1000_SUCCESS) 992*aa070789SRoy Zang return -E1000_ERR_EEPROM; 993*aa070789SRoy Zang } 994*aa070789SRoy Zang 995*aa070789SRoy Zang /* Get the FW semaphore. */ 996*aa070789SRoy Zang timeout = hw->eeprom.word_size + 1; 997*aa070789SRoy Zang while (timeout) { 998*aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 999*aa070789SRoy Zang swsm |= E1000_SWSM_SWESMBI; 1000*aa070789SRoy Zang E1000_WRITE_REG(hw, SWSM, swsm); 1001*aa070789SRoy Zang /* if we managed to set the bit we got the semaphore. */ 1002*aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 1003*aa070789SRoy Zang if (swsm & E1000_SWSM_SWESMBI) 1004*aa070789SRoy Zang break; 1005*aa070789SRoy Zang 1006*aa070789SRoy Zang udelay(50); 1007*aa070789SRoy Zang timeout--; 1008*aa070789SRoy Zang } 1009*aa070789SRoy Zang 1010*aa070789SRoy Zang if (!timeout) { 1011*aa070789SRoy Zang /* Release semaphores */ 1012*aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(hw); 1013*aa070789SRoy Zang DEBUGOUT("Driver can't access the Eeprom - " 1014*aa070789SRoy Zang "SWESMBI bit is set.\n"); 1015*aa070789SRoy Zang return -E1000_ERR_EEPROM; 1016*aa070789SRoy Zang } 1017*aa070789SRoy Zang 1018*aa070789SRoy Zang return E1000_SUCCESS; 1019*aa070789SRoy Zang } 1020*aa070789SRoy Zang 1021*aa070789SRoy Zang static int32_t 1022*aa070789SRoy Zang e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask) 1023*aa070789SRoy Zang { 1024*aa070789SRoy Zang uint32_t swfw_sync = 0; 1025*aa070789SRoy Zang uint32_t swmask = mask; 1026*aa070789SRoy Zang uint32_t fwmask = mask << 16; 1027*aa070789SRoy Zang int32_t timeout = 200; 1028*aa070789SRoy Zang 1029*aa070789SRoy Zang DEBUGFUNC(); 1030*aa070789SRoy Zang while (timeout) { 1031*aa070789SRoy Zang if (e1000_get_hw_eeprom_semaphore(hw)) 1032*aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 1033*aa070789SRoy Zang 1034*aa070789SRoy Zang swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); 1035*aa070789SRoy Zang if (!(swfw_sync & (fwmask | swmask))) 1036*aa070789SRoy Zang break; 1037*aa070789SRoy Zang 1038*aa070789SRoy Zang /* firmware currently using resource (fwmask) */ 1039*aa070789SRoy Zang /* or other software thread currently using resource (swmask) */ 1040*aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(hw); 1041*aa070789SRoy Zang mdelay(5); 1042*aa070789SRoy Zang timeout--; 1043*aa070789SRoy Zang } 1044*aa070789SRoy Zang 1045*aa070789SRoy Zang if (!timeout) { 1046*aa070789SRoy Zang DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n"); 1047*aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 1048*aa070789SRoy Zang } 1049*aa070789SRoy Zang 1050*aa070789SRoy Zang swfw_sync |= swmask; 1051*aa070789SRoy Zang E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync); 1052*aa070789SRoy Zang 1053*aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(hw); 1054*aa070789SRoy Zang return E1000_SUCCESS; 1055*aa070789SRoy Zang } 1056*aa070789SRoy Zang 10572439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 10582439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reads the adapter's MAC address from the EEPROM and inverts the LSB for the 10592439e4bfSJean-Christophe PLAGNIOL-VILLARD * second function of dual function devices 10602439e4bfSJean-Christophe PLAGNIOL-VILLARD * 10612439e4bfSJean-Christophe PLAGNIOL-VILLARD * nic - Struct containing variables accessed by shared code 10622439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 10632439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 10642439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_read_mac_addr(struct eth_device *nic) 10652439e4bfSJean-Christophe PLAGNIOL-VILLARD { 10662439e4bfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_AP1000 10672439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 10682439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t offset; 10692439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t eeprom_data; 10702439e4bfSJean-Christophe PLAGNIOL-VILLARD int i; 10712439e4bfSJean-Christophe PLAGNIOL-VILLARD 10722439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 10732439e4bfSJean-Christophe PLAGNIOL-VILLARD 10742439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < NODE_ADDRESS_SIZE; i += 2) { 10752439e4bfSJean-Christophe PLAGNIOL-VILLARD offset = i >> 1; 1076*aa070789SRoy Zang if (e1000_read_eeprom(hw, offset, 1, &eeprom_data) < 0) { 10772439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("EEPROM Read Error\n"); 10782439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 10792439e4bfSJean-Christophe PLAGNIOL-VILLARD } 10802439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[i] = eeprom_data & 0xff; 10812439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[i + 1] = (eeprom_data >> 8) & 0xff; 10822439e4bfSJean-Christophe PLAGNIOL-VILLARD } 10832439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->mac_type == e1000_82546) && 10842439e4bfSJean-Christophe PLAGNIOL-VILLARD (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 10852439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Invert the last bit if this is the second device */ 10862439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[5] += 1; 10872439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1088ac3315c2SAndre Schwarz #ifdef CONFIG_E1000_FALLBACK_MAC 1089f2302d44SStefan Roese if ( *(u32*)(nic->enetaddr) == 0 || *(u32*)(nic->enetaddr) == ~0 ) { 1090f2302d44SStefan Roese unsigned char fb_mac[NODE_ADDRESS_SIZE] = CONFIG_E1000_FALLBACK_MAC; 1091f2302d44SStefan Roese 1092f2302d44SStefan Roese memcpy (nic->enetaddr, fb_mac, NODE_ADDRESS_SIZE); 1093f2302d44SStefan Roese } 1094ac3315c2SAndre Schwarz #endif 10952439e4bfSJean-Christophe PLAGNIOL-VILLARD #else 10962439e4bfSJean-Christophe PLAGNIOL-VILLARD /* 10972439e4bfSJean-Christophe PLAGNIOL-VILLARD * The AP1000's e1000 has no eeprom; the MAC address is stored in the 10982439e4bfSJean-Christophe PLAGNIOL-VILLARD * environment variables. Currently this does not support the addition 10992439e4bfSJean-Christophe PLAGNIOL-VILLARD * of a PMC e1000 card, which is certainly a possibility, so this should 11002439e4bfSJean-Christophe PLAGNIOL-VILLARD * be updated to properly use the env variable only for the onboard e1000 11012439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 11022439e4bfSJean-Christophe PLAGNIOL-VILLARD 11032439e4bfSJean-Christophe PLAGNIOL-VILLARD int ii; 11042439e4bfSJean-Christophe PLAGNIOL-VILLARD char *s, *e; 11052439e4bfSJean-Christophe PLAGNIOL-VILLARD 11062439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 11072439e4bfSJean-Christophe PLAGNIOL-VILLARD 11082439e4bfSJean-Christophe PLAGNIOL-VILLARD s = getenv ("ethaddr"); 11092439e4bfSJean-Christophe PLAGNIOL-VILLARD if (s == NULL) { 11102439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 1111f2302d44SStefan Roese } else { 11122439e4bfSJean-Christophe PLAGNIOL-VILLARD for(ii = 0; ii < 6; ii++) { 11132439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[ii] = s ? simple_strtoul (s, &e, 16) : 0; 11142439e4bfSJean-Christophe PLAGNIOL-VILLARD if (s){ 11152439e4bfSJean-Christophe PLAGNIOL-VILLARD s = (*e) ? e + 1 : e; 11162439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11172439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11182439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11192439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 11202439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 11212439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11222439e4bfSJean-Christophe PLAGNIOL-VILLARD 11232439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 11242439e4bfSJean-Christophe PLAGNIOL-VILLARD * Initializes receive address filters. 11252439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11262439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 11272439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11282439e4bfSJean-Christophe PLAGNIOL-VILLARD * Places the MAC address in receive address register 0 and clears the rest 11292439e4bfSJean-Christophe PLAGNIOL-VILLARD * of the receive addresss registers. Clears the multicast table. Assumes 11302439e4bfSJean-Christophe PLAGNIOL-VILLARD * the receiver is in reset when the routine is called. 11312439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 11322439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 11332439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init_rx_addrs(struct eth_device *nic) 11342439e4bfSJean-Christophe PLAGNIOL-VILLARD { 11352439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 11362439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 11372439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t addr_low; 11382439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t addr_high; 11392439e4bfSJean-Christophe PLAGNIOL-VILLARD 11402439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 11412439e4bfSJean-Christophe PLAGNIOL-VILLARD 11422439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the receive address. */ 11432439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Programming MAC Address into RAR[0]\n"); 11442439e4bfSJean-Christophe PLAGNIOL-VILLARD addr_low = (nic->enetaddr[0] | 11452439e4bfSJean-Christophe PLAGNIOL-VILLARD (nic->enetaddr[1] << 8) | 11462439e4bfSJean-Christophe PLAGNIOL-VILLARD (nic->enetaddr[2] << 16) | (nic->enetaddr[3] << 24)); 11472439e4bfSJean-Christophe PLAGNIOL-VILLARD 11482439e4bfSJean-Christophe PLAGNIOL-VILLARD addr_high = (nic->enetaddr[4] | (nic->enetaddr[5] << 8) | E1000_RAH_AV); 11492439e4bfSJean-Christophe PLAGNIOL-VILLARD 11502439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, 0, addr_low); 11512439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, 1, addr_high); 11522439e4bfSJean-Christophe PLAGNIOL-VILLARD 11532439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Zero out the other 15 receive addresses. */ 11542439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Clearing RAR[1-15]\n"); 11552439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 1; i < E1000_RAR_ENTRIES; i++) { 11562439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0); 11572439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0); 11582439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11592439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11602439e4bfSJean-Christophe PLAGNIOL-VILLARD 11612439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 11622439e4bfSJean-Christophe PLAGNIOL-VILLARD * Clears the VLAN filer table 11632439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11642439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 11652439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 11662439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 11672439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_clear_vfta(struct e1000_hw *hw) 11682439e4bfSJean-Christophe PLAGNIOL-VILLARD { 11692439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t offset; 11702439e4bfSJean-Christophe PLAGNIOL-VILLARD 11712439e4bfSJean-Christophe PLAGNIOL-VILLARD for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) 11722439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, VFTA, offset, 0); 11732439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11742439e4bfSJean-Christophe PLAGNIOL-VILLARD 11752439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 11762439e4bfSJean-Christophe PLAGNIOL-VILLARD * Set the mac type member in the hw struct. 11772439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11782439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 11792439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1180*aa070789SRoy Zang int32_t 11812439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_set_mac_type(struct e1000_hw *hw) 11822439e4bfSJean-Christophe PLAGNIOL-VILLARD { 11832439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 11842439e4bfSJean-Christophe PLAGNIOL-VILLARD 11852439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->device_id) { 11862439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82542: 11872439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->revision_id) { 11882439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_82542_2_0_REV_ID: 11892439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82542_rev2_0; 11902439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 11912439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_82542_2_1_REV_ID: 11922439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82542_rev2_1; 11932439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 11942439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 11952439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Invalid 82542 revision ID */ 11962439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_MAC_TYPE; 11972439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11982439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 11992439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82543GC_FIBER: 12002439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82543GC_COPPER: 12012439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82543; 12022439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12032439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544EI_COPPER: 12042439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544EI_FIBER: 12052439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544GC_COPPER: 12062439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544GC_LOM: 12072439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82544; 12082439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12092439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82540EM: 12102439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82540EM_LOM: 1211*aa070789SRoy Zang case E1000_DEV_ID_82540EP: 1212*aa070789SRoy Zang case E1000_DEV_ID_82540EP_LOM: 1213*aa070789SRoy Zang case E1000_DEV_ID_82540EP_LP: 12142439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82540; 12152439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12162439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82545EM_COPPER: 12172439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82545EM_FIBER: 12182439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82545; 12192439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 1220*aa070789SRoy Zang case E1000_DEV_ID_82545GM_COPPER: 1221*aa070789SRoy Zang case E1000_DEV_ID_82545GM_FIBER: 1222*aa070789SRoy Zang case E1000_DEV_ID_82545GM_SERDES: 1223*aa070789SRoy Zang hw->mac_type = e1000_82545_rev_3; 1224*aa070789SRoy Zang break; 12252439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82546EB_COPPER: 12262439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82546EB_FIBER: 1227*aa070789SRoy Zang case E1000_DEV_ID_82546EB_QUAD_COPPER: 12282439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82546; 12292439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 1230*aa070789SRoy Zang case E1000_DEV_ID_82546GB_COPPER: 1231*aa070789SRoy Zang case E1000_DEV_ID_82546GB_FIBER: 1232*aa070789SRoy Zang case E1000_DEV_ID_82546GB_SERDES: 1233*aa070789SRoy Zang case E1000_DEV_ID_82546GB_PCIE: 1234*aa070789SRoy Zang case E1000_DEV_ID_82546GB_QUAD_COPPER: 1235*aa070789SRoy Zang case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 1236*aa070789SRoy Zang hw->mac_type = e1000_82546_rev_3; 1237*aa070789SRoy Zang break; 1238*aa070789SRoy Zang case E1000_DEV_ID_82541EI: 1239*aa070789SRoy Zang case E1000_DEV_ID_82541EI_MOBILE: 1240*aa070789SRoy Zang case E1000_DEV_ID_82541ER_LOM: 1241*aa070789SRoy Zang hw->mac_type = e1000_82541; 1242*aa070789SRoy Zang break; 1243ac3315c2SAndre Schwarz case E1000_DEV_ID_82541ER: 1244*aa070789SRoy Zang case E1000_DEV_ID_82541GI: 1245aa3b8bf9SWolfgang Grandegger case E1000_DEV_ID_82541GI_LF: 1246*aa070789SRoy Zang case E1000_DEV_ID_82541GI_MOBILE: 1247ac3315c2SAndre Schwarz hw->mac_type = e1000_82541_rev_2; 1248ac3315c2SAndre Schwarz break; 1249*aa070789SRoy Zang case E1000_DEV_ID_82547EI: 1250*aa070789SRoy Zang case E1000_DEV_ID_82547EI_MOBILE: 1251*aa070789SRoy Zang hw->mac_type = e1000_82547; 1252*aa070789SRoy Zang break; 1253*aa070789SRoy Zang case E1000_DEV_ID_82547GI: 1254*aa070789SRoy Zang hw->mac_type = e1000_82547_rev_2; 1255*aa070789SRoy Zang break; 1256*aa070789SRoy Zang case E1000_DEV_ID_82571EB_COPPER: 1257*aa070789SRoy Zang case E1000_DEV_ID_82571EB_FIBER: 1258*aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES: 1259*aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_DUAL: 1260*aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_QUAD: 1261*aa070789SRoy Zang case E1000_DEV_ID_82571EB_QUAD_COPPER: 1262*aa070789SRoy Zang case E1000_DEV_ID_82571PT_QUAD_COPPER: 1263*aa070789SRoy Zang case E1000_DEV_ID_82571EB_QUAD_FIBER: 1264*aa070789SRoy Zang case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE: 1265*aa070789SRoy Zang hw->mac_type = e1000_82571; 1266*aa070789SRoy Zang break; 1267*aa070789SRoy Zang case E1000_DEV_ID_82572EI_COPPER: 1268*aa070789SRoy Zang case E1000_DEV_ID_82572EI_FIBER: 1269*aa070789SRoy Zang case E1000_DEV_ID_82572EI_SERDES: 1270*aa070789SRoy Zang case E1000_DEV_ID_82572EI: 1271*aa070789SRoy Zang hw->mac_type = e1000_82572; 1272*aa070789SRoy Zang break; 1273*aa070789SRoy Zang case E1000_DEV_ID_82573E: 1274*aa070789SRoy Zang case E1000_DEV_ID_82573E_IAMT: 1275*aa070789SRoy Zang case E1000_DEV_ID_82573L: 1276*aa070789SRoy Zang hw->mac_type = e1000_82573; 1277*aa070789SRoy Zang break; 1278*aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: 1279*aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: 1280*aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: 1281*aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: 1282*aa070789SRoy Zang hw->mac_type = e1000_80003es2lan; 1283*aa070789SRoy Zang break; 1284*aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_M_AMT: 1285*aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_AMT: 1286*aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_C: 1287*aa070789SRoy Zang case E1000_DEV_ID_ICH8_IFE: 1288*aa070789SRoy Zang case E1000_DEV_ID_ICH8_IFE_GT: 1289*aa070789SRoy Zang case E1000_DEV_ID_ICH8_IFE_G: 1290*aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_M: 1291*aa070789SRoy Zang hw->mac_type = e1000_ich8lan; 1292*aa070789SRoy Zang break; 12932439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 12942439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Should never have loaded on this device */ 12952439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_MAC_TYPE; 12962439e4bfSJean-Christophe PLAGNIOL-VILLARD } 12972439e4bfSJean-Christophe PLAGNIOL-VILLARD return E1000_SUCCESS; 12982439e4bfSJean-Christophe PLAGNIOL-VILLARD } 12992439e4bfSJean-Christophe PLAGNIOL-VILLARD 13002439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 13012439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reset the transmit and receive units; mask and clear all interrupts. 13022439e4bfSJean-Christophe PLAGNIOL-VILLARD * 13032439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 13042439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 13052439e4bfSJean-Christophe PLAGNIOL-VILLARD void 13062439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_reset_hw(struct e1000_hw *hw) 13072439e4bfSJean-Christophe PLAGNIOL-VILLARD { 13082439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 13092439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl_ext; 13102439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t icr; 13112439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t manc; 13122439e4bfSJean-Christophe PLAGNIOL-VILLARD 13132439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 13142439e4bfSJean-Christophe PLAGNIOL-VILLARD 13152439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For 82542 (rev 2.0), disable MWI before issuing a device reset */ 13162439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 13172439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Disabling MWI on 82542 rev 2.0\n"); 13182439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, 1319*aa070789SRoy Zang hw->pci_cmd_word & ~PCI_COMMAND_INVALIDATE); 13202439e4bfSJean-Christophe PLAGNIOL-VILLARD } 13212439e4bfSJean-Christophe PLAGNIOL-VILLARD 13222439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear interrupt mask to stop board from generating interrupts */ 13232439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Masking off all interrupts\n"); 13242439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, IMC, 0xffffffff); 13252439e4bfSJean-Christophe PLAGNIOL-VILLARD 13262439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disable the Transmit and Receive units. Then delay to allow 13272439e4bfSJean-Christophe PLAGNIOL-VILLARD * any pending transactions to complete before we hit the MAC with 13282439e4bfSJean-Christophe PLAGNIOL-VILLARD * the global reset. 13292439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 13302439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, 0); 13312439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TCTL, E1000_TCTL_PSP); 13322439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 13332439e4bfSJean-Christophe PLAGNIOL-VILLARD 13342439e4bfSJean-Christophe PLAGNIOL-VILLARD /* The tbi_compatibility_on Flag must be cleared when Rctl is cleared. */ 13352439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->tbi_compatibility_on = FALSE; 13362439e4bfSJean-Christophe PLAGNIOL-VILLARD 13372439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Delay to allow any outstanding PCI transactions to complete before 13382439e4bfSJean-Christophe PLAGNIOL-VILLARD * resetting the device 13392439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 13402439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 13412439e4bfSJean-Christophe PLAGNIOL-VILLARD 13422439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Issue a global reset to the MAC. This will reset the chip's 13432439e4bfSJean-Christophe PLAGNIOL-VILLARD * transmit, receive, DMA, and link units. It will not effect 13442439e4bfSJean-Christophe PLAGNIOL-VILLARD * the current PCI configuration. The global reset bit is self- 13452439e4bfSJean-Christophe PLAGNIOL-VILLARD * clearing, and should clear within a microsecond. 13462439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 13472439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Issuing a global reset to MAC\n"); 13482439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 13492439e4bfSJean-Christophe PLAGNIOL-VILLARD 13502439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST)); 13512439e4bfSJean-Christophe PLAGNIOL-VILLARD 13522439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Force a reload from the EEPROM if necessary */ 13532439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type < e1000_82540) { 13542439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Wait for reset to complete */ 13552439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 13562439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 13572439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext |= E1000_CTRL_EXT_EE_RST; 13582439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 13592439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 13602439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Wait for EEPROM reload */ 13612439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(2); 13622439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 13632439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Wait for EEPROM reload (it happens automatically) */ 13642439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(4); 13652439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Dissable HW ARPs on ASF enabled adapters */ 13662439e4bfSJean-Christophe PLAGNIOL-VILLARD manc = E1000_READ_REG(hw, MANC); 13672439e4bfSJean-Christophe PLAGNIOL-VILLARD manc &= ~(E1000_MANC_ARP_EN); 13682439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, MANC, manc); 13692439e4bfSJean-Christophe PLAGNIOL-VILLARD } 13702439e4bfSJean-Christophe PLAGNIOL-VILLARD 13712439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear interrupt mask to stop board from generating interrupts */ 13722439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Masking off all interrupts\n"); 13732439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, IMC, 0xffffffff); 13742439e4bfSJean-Christophe PLAGNIOL-VILLARD 13752439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear any pending interrupt events. */ 13762439e4bfSJean-Christophe PLAGNIOL-VILLARD icr = E1000_READ_REG(hw, ICR); 13772439e4bfSJean-Christophe PLAGNIOL-VILLARD 13782439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If MWI was previously enabled, reenable it. */ 13792439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 13802439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, hw->pci_cmd_word); 13812439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1382*aa070789SRoy Zang E1000_WRITE_REG(hw, PBA, E1000_DEFAULT_PBA); 1383*aa070789SRoy Zang } 1384*aa070789SRoy Zang 1385*aa070789SRoy Zang /****************************************************************************** 1386*aa070789SRoy Zang * 1387*aa070789SRoy Zang * Initialize a number of hardware-dependent bits 1388*aa070789SRoy Zang * 1389*aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 1390*aa070789SRoy Zang * 1391*aa070789SRoy Zang * This function contains hardware limitation workarounds for PCI-E adapters 1392*aa070789SRoy Zang * 1393*aa070789SRoy Zang *****************************************************************************/ 1394*aa070789SRoy Zang static void 1395*aa070789SRoy Zang e1000_initialize_hardware_bits(struct e1000_hw *hw) 1396*aa070789SRoy Zang { 1397*aa070789SRoy Zang if ((hw->mac_type >= e1000_82571) && 1398*aa070789SRoy Zang (!hw->initialize_hw_bits_disable)) { 1399*aa070789SRoy Zang /* Settings common to all PCI-express silicon */ 1400*aa070789SRoy Zang uint32_t reg_ctrl, reg_ctrl_ext; 1401*aa070789SRoy Zang uint32_t reg_tarc0, reg_tarc1; 1402*aa070789SRoy Zang uint32_t reg_tctl; 1403*aa070789SRoy Zang uint32_t reg_txdctl, reg_txdctl1; 1404*aa070789SRoy Zang 1405*aa070789SRoy Zang /* link autonegotiation/sync workarounds */ 1406*aa070789SRoy Zang reg_tarc0 = E1000_READ_REG(hw, TARC0); 1407*aa070789SRoy Zang reg_tarc0 &= ~((1 << 30)|(1 << 29)|(1 << 28)|(1 << 27)); 1408*aa070789SRoy Zang 1409*aa070789SRoy Zang /* Enable not-done TX descriptor counting */ 1410*aa070789SRoy Zang reg_txdctl = E1000_READ_REG(hw, TXDCTL); 1411*aa070789SRoy Zang reg_txdctl |= E1000_TXDCTL_COUNT_DESC; 1412*aa070789SRoy Zang E1000_WRITE_REG(hw, TXDCTL, reg_txdctl); 1413*aa070789SRoy Zang 1414*aa070789SRoy Zang reg_txdctl1 = E1000_READ_REG(hw, TXDCTL1); 1415*aa070789SRoy Zang reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC; 1416*aa070789SRoy Zang E1000_WRITE_REG(hw, TXDCTL1, reg_txdctl1); 1417*aa070789SRoy Zang 1418*aa070789SRoy Zang switch (hw->mac_type) { 1419*aa070789SRoy Zang case e1000_82571: 1420*aa070789SRoy Zang case e1000_82572: 1421*aa070789SRoy Zang /* Clear PHY TX compatible mode bits */ 1422*aa070789SRoy Zang reg_tarc1 = E1000_READ_REG(hw, TARC1); 1423*aa070789SRoy Zang reg_tarc1 &= ~((1 << 30)|(1 << 29)); 1424*aa070789SRoy Zang 1425*aa070789SRoy Zang /* link autonegotiation/sync workarounds */ 1426*aa070789SRoy Zang reg_tarc0 |= ((1 << 26)|(1 << 25)|(1 << 24)|(1 << 23)); 1427*aa070789SRoy Zang 1428*aa070789SRoy Zang /* TX ring control fixes */ 1429*aa070789SRoy Zang reg_tarc1 |= ((1 << 26)|(1 << 25)|(1 << 24)); 1430*aa070789SRoy Zang 1431*aa070789SRoy Zang /* Multiple read bit is reversed polarity */ 1432*aa070789SRoy Zang reg_tctl = E1000_READ_REG(hw, TCTL); 1433*aa070789SRoy Zang if (reg_tctl & E1000_TCTL_MULR) 1434*aa070789SRoy Zang reg_tarc1 &= ~(1 << 28); 1435*aa070789SRoy Zang else 1436*aa070789SRoy Zang reg_tarc1 |= (1 << 28); 1437*aa070789SRoy Zang 1438*aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, reg_tarc1); 1439*aa070789SRoy Zang break; 1440*aa070789SRoy Zang case e1000_82573: 1441*aa070789SRoy Zang reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 1442*aa070789SRoy Zang reg_ctrl_ext &= ~(1 << 23); 1443*aa070789SRoy Zang reg_ctrl_ext |= (1 << 22); 1444*aa070789SRoy Zang 1445*aa070789SRoy Zang /* TX byte count fix */ 1446*aa070789SRoy Zang reg_ctrl = E1000_READ_REG(hw, CTRL); 1447*aa070789SRoy Zang reg_ctrl &= ~(1 << 29); 1448*aa070789SRoy Zang 1449*aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext); 1450*aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL, reg_ctrl); 1451*aa070789SRoy Zang break; 1452*aa070789SRoy Zang case e1000_80003es2lan: 1453*aa070789SRoy Zang /* improve small packet performace for fiber/serdes */ 1454*aa070789SRoy Zang if ((hw->media_type == e1000_media_type_fiber) 1455*aa070789SRoy Zang || (hw->media_type == 1456*aa070789SRoy Zang e1000_media_type_internal_serdes)) { 1457*aa070789SRoy Zang reg_tarc0 &= ~(1 << 20); 1458*aa070789SRoy Zang } 1459*aa070789SRoy Zang 1460*aa070789SRoy Zang /* Multiple read bit is reversed polarity */ 1461*aa070789SRoy Zang reg_tctl = E1000_READ_REG(hw, TCTL); 1462*aa070789SRoy Zang reg_tarc1 = E1000_READ_REG(hw, TARC1); 1463*aa070789SRoy Zang if (reg_tctl & E1000_TCTL_MULR) 1464*aa070789SRoy Zang reg_tarc1 &= ~(1 << 28); 1465*aa070789SRoy Zang else 1466*aa070789SRoy Zang reg_tarc1 |= (1 << 28); 1467*aa070789SRoy Zang 1468*aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, reg_tarc1); 1469*aa070789SRoy Zang break; 1470*aa070789SRoy Zang case e1000_ich8lan: 1471*aa070789SRoy Zang /* Reduce concurrent DMA requests to 3 from 4 */ 1472*aa070789SRoy Zang if ((hw->revision_id < 3) || 1473*aa070789SRoy Zang ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) && 1474*aa070789SRoy Zang (hw->device_id != E1000_DEV_ID_ICH8_IGP_M))) 1475*aa070789SRoy Zang reg_tarc0 |= ((1 << 29)|(1 << 28)); 1476*aa070789SRoy Zang 1477*aa070789SRoy Zang reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 1478*aa070789SRoy Zang reg_ctrl_ext |= (1 << 22); 1479*aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext); 1480*aa070789SRoy Zang 1481*aa070789SRoy Zang /* workaround TX hang with TSO=on */ 1482*aa070789SRoy Zang reg_tarc0 |= ((1 << 27)|(1 << 26)|(1 << 24)|(1 << 23)); 1483*aa070789SRoy Zang 1484*aa070789SRoy Zang /* Multiple read bit is reversed polarity */ 1485*aa070789SRoy Zang reg_tctl = E1000_READ_REG(hw, TCTL); 1486*aa070789SRoy Zang reg_tarc1 = E1000_READ_REG(hw, TARC1); 1487*aa070789SRoy Zang if (reg_tctl & E1000_TCTL_MULR) 1488*aa070789SRoy Zang reg_tarc1 &= ~(1 << 28); 1489*aa070789SRoy Zang else 1490*aa070789SRoy Zang reg_tarc1 |= (1 << 28); 1491*aa070789SRoy Zang 1492*aa070789SRoy Zang /* workaround TX hang with TSO=on */ 1493*aa070789SRoy Zang reg_tarc1 |= ((1 << 30)|(1 << 26)|(1 << 24)); 1494*aa070789SRoy Zang 1495*aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, reg_tarc1); 1496*aa070789SRoy Zang break; 1497*aa070789SRoy Zang default: 1498*aa070789SRoy Zang break; 1499*aa070789SRoy Zang } 1500*aa070789SRoy Zang 1501*aa070789SRoy Zang E1000_WRITE_REG(hw, TARC0, reg_tarc0); 1502*aa070789SRoy Zang } 15032439e4bfSJean-Christophe PLAGNIOL-VILLARD } 15042439e4bfSJean-Christophe PLAGNIOL-VILLARD 15052439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 15062439e4bfSJean-Christophe PLAGNIOL-VILLARD * Performs basic configuration of the adapter. 15072439e4bfSJean-Christophe PLAGNIOL-VILLARD * 15082439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 15092439e4bfSJean-Christophe PLAGNIOL-VILLARD * 15102439e4bfSJean-Christophe PLAGNIOL-VILLARD * Assumes that the controller has previously been reset and is in a 15112439e4bfSJean-Christophe PLAGNIOL-VILLARD * post-reset uninitialized state. Initializes the receive address registers, 15122439e4bfSJean-Christophe PLAGNIOL-VILLARD * multicast table, and VLAN filter table. Calls routines to setup link 15132439e4bfSJean-Christophe PLAGNIOL-VILLARD * configuration and flow control settings. Clears all on-chip counters. Leaves 15142439e4bfSJean-Christophe PLAGNIOL-VILLARD * the transmit and receive units disabled and uninitialized. 15152439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 15162439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 15172439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init_hw(struct eth_device *nic) 15182439e4bfSJean-Christophe PLAGNIOL-VILLARD { 15192439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 1520*aa070789SRoy Zang uint32_t ctrl; 15212439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 15222439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 15232439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t pcix_cmd_word; 15242439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t pcix_stat_hi_word; 15252439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t cmd_mmrbc; 15262439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t stat_mmrbc; 1527*aa070789SRoy Zang uint32_t mta_size; 1528*aa070789SRoy Zang uint32_t reg_data; 1529*aa070789SRoy Zang uint32_t ctrl_ext; 15302439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 1531*aa070789SRoy Zang /* force full DMA clock frequency for 10/100 on ICH8 A0-B0 */ 1532*aa070789SRoy Zang if ((hw->mac_type == e1000_ich8lan) && 1533*aa070789SRoy Zang ((hw->revision_id < 3) || 1534*aa070789SRoy Zang ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) && 1535*aa070789SRoy Zang (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))) { 1536*aa070789SRoy Zang reg_data = E1000_READ_REG(hw, STATUS); 1537*aa070789SRoy Zang reg_data &= ~0x80000000; 1538*aa070789SRoy Zang E1000_WRITE_REG(hw, STATUS, reg_data); 15392439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1540*aa070789SRoy Zang /* Do not need initialize Identification LED */ 15412439e4bfSJean-Christophe PLAGNIOL-VILLARD 1542*aa070789SRoy Zang /* Set the media type and TBI compatibility */ 1543*aa070789SRoy Zang e1000_set_media_type(hw); 1544*aa070789SRoy Zang 1545*aa070789SRoy Zang /* Must be called after e1000_set_media_type 1546*aa070789SRoy Zang * because media_type is used */ 1547*aa070789SRoy Zang e1000_initialize_hardware_bits(hw); 15482439e4bfSJean-Christophe PLAGNIOL-VILLARD 15492439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disabling VLAN filtering. */ 15502439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Initializing the IEEE VLAN\n"); 1551*aa070789SRoy Zang /* VET hardcoded to standard value and VFTA removed in ICH8 LAN */ 1552*aa070789SRoy Zang if (hw->mac_type != e1000_ich8lan) { 1553*aa070789SRoy Zang if (hw->mac_type < e1000_82545_rev_3) 15542439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, VET, 0); 15552439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_clear_vfta(hw); 1556*aa070789SRoy Zang } 15572439e4bfSJean-Christophe PLAGNIOL-VILLARD 15582439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */ 15592439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 15602439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Disabling MWI on 82542 rev 2.0\n"); 15612439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, 15622439e4bfSJean-Christophe PLAGNIOL-VILLARD hw-> 15632439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_cmd_word & ~PCI_COMMAND_INVALIDATE); 15642439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, E1000_RCTL_RST); 15652439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 15662439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(5); 15672439e4bfSJean-Christophe PLAGNIOL-VILLARD } 15682439e4bfSJean-Christophe PLAGNIOL-VILLARD 15692439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the receive address. This involves initializing all of the Receive 15702439e4bfSJean-Christophe PLAGNIOL-VILLARD * Address Registers (RARs 0 - 15). 15712439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 15722439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init_rx_addrs(nic); 15732439e4bfSJean-Christophe PLAGNIOL-VILLARD 15742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For 82542 (rev 2.0), take the receiver out of reset and enable MWI */ 15752439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 15762439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, 0); 15772439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 15782439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(1); 15792439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, hw->pci_cmd_word); 15802439e4bfSJean-Christophe PLAGNIOL-VILLARD } 15812439e4bfSJean-Christophe PLAGNIOL-VILLARD 15822439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Zero out the Multicast HASH table */ 15832439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Zeroing the MTA\n"); 1584*aa070789SRoy Zang mta_size = E1000_MC_TBL_SIZE; 1585*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 1586*aa070789SRoy Zang mta_size = E1000_MC_TBL_SIZE_ICH8LAN; 1587*aa070789SRoy Zang for (i = 0; i < mta_size; i++) { 15882439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); 1589*aa070789SRoy Zang /* use write flush to prevent Memory Write Block (MWB) from 1590*aa070789SRoy Zang * occuring when accessing our register space */ 1591*aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 1592*aa070789SRoy Zang } 15932439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 15942439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the PCI priority bit correctly in the CTRL register. This 15952439e4bfSJean-Christophe PLAGNIOL-VILLARD * determines if the adapter gives priority to receives, or if it 1596*aa070789SRoy Zang * gives equal priority to transmits and receives. Valid only on 1597*aa070789SRoy Zang * 82542 and 82543 silicon. 15982439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1599*aa070789SRoy Zang if (hw->dma_fairness && hw->mac_type <= e1000_82543) { 16002439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 16012439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PRIOR); 16022439e4bfSJean-Christophe PLAGNIOL-VILLARD } 16032439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 1604*aa070789SRoy Zang switch (hw->mac_type) { 1605*aa070789SRoy Zang case e1000_82545_rev_3: 1606*aa070789SRoy Zang case e1000_82546_rev_3: 1607*aa070789SRoy Zang break; 1608*aa070789SRoy Zang default: 16092439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */ 1610*aa070789SRoy Zang if (hw->bus_type == e1000_bus_type_pcix) { 16112439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCIX_COMMAND_REGISTER, 16122439e4bfSJean-Christophe PLAGNIOL-VILLARD &pcix_cmd_word); 16132439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCIX_STATUS_REGISTER_HI, 16142439e4bfSJean-Christophe PLAGNIOL-VILLARD &pcix_stat_hi_word); 16152439e4bfSJean-Christophe PLAGNIOL-VILLARD cmd_mmrbc = 16162439e4bfSJean-Christophe PLAGNIOL-VILLARD (pcix_cmd_word & PCIX_COMMAND_MMRBC_MASK) >> 16172439e4bfSJean-Christophe PLAGNIOL-VILLARD PCIX_COMMAND_MMRBC_SHIFT; 16182439e4bfSJean-Christophe PLAGNIOL-VILLARD stat_mmrbc = 16192439e4bfSJean-Christophe PLAGNIOL-VILLARD (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >> 16202439e4bfSJean-Christophe PLAGNIOL-VILLARD PCIX_STATUS_HI_MMRBC_SHIFT; 16212439e4bfSJean-Christophe PLAGNIOL-VILLARD if (stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K) 16222439e4bfSJean-Christophe PLAGNIOL-VILLARD stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K; 16232439e4bfSJean-Christophe PLAGNIOL-VILLARD if (cmd_mmrbc > stat_mmrbc) { 16242439e4bfSJean-Christophe PLAGNIOL-VILLARD pcix_cmd_word &= ~PCIX_COMMAND_MMRBC_MASK; 16252439e4bfSJean-Christophe PLAGNIOL-VILLARD pcix_cmd_word |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT; 16262439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCIX_COMMAND_REGISTER, 16272439e4bfSJean-Christophe PLAGNIOL-VILLARD pcix_cmd_word); 16282439e4bfSJean-Christophe PLAGNIOL-VILLARD } 16292439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1630*aa070789SRoy Zang break; 1631*aa070789SRoy Zang } 1632*aa070789SRoy Zang 1633*aa070789SRoy Zang /* More time needed for PHY to initialize */ 1634*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 1635*aa070789SRoy Zang mdelay(15); 16362439e4bfSJean-Christophe PLAGNIOL-VILLARD 16372439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Call a subroutine to configure the link and setup flow control. */ 16382439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_setup_link(nic); 16392439e4bfSJean-Christophe PLAGNIOL-VILLARD 16402439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the transmit descriptor write-back policy */ 16412439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82544) { 16422439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, TXDCTL); 16432439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = 16442439e4bfSJean-Christophe PLAGNIOL-VILLARD (ctrl & ~E1000_TXDCTL_WTHRESH) | 16452439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_TXDCTL_FULL_TX_DESC_WB; 16462439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXDCTL, ctrl); 16472439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1648*aa070789SRoy Zang 1649*aa070789SRoy Zang switch (hw->mac_type) { 1650*aa070789SRoy Zang default: 1651*aa070789SRoy Zang break; 1652*aa070789SRoy Zang case e1000_80003es2lan: 1653*aa070789SRoy Zang /* Enable retransmit on late collisions */ 1654*aa070789SRoy Zang reg_data = E1000_READ_REG(hw, TCTL); 1655*aa070789SRoy Zang reg_data |= E1000_TCTL_RTLC; 1656*aa070789SRoy Zang E1000_WRITE_REG(hw, TCTL, reg_data); 1657*aa070789SRoy Zang 1658*aa070789SRoy Zang /* Configure Gigabit Carry Extend Padding */ 1659*aa070789SRoy Zang reg_data = E1000_READ_REG(hw, TCTL_EXT); 1660*aa070789SRoy Zang reg_data &= ~E1000_TCTL_EXT_GCEX_MASK; 1661*aa070789SRoy Zang reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX; 1662*aa070789SRoy Zang E1000_WRITE_REG(hw, TCTL_EXT, reg_data); 1663*aa070789SRoy Zang 1664*aa070789SRoy Zang /* Configure Transmit Inter-Packet Gap */ 1665*aa070789SRoy Zang reg_data = E1000_READ_REG(hw, TIPG); 1666*aa070789SRoy Zang reg_data &= ~E1000_TIPG_IPGT_MASK; 1667*aa070789SRoy Zang reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; 1668*aa070789SRoy Zang E1000_WRITE_REG(hw, TIPG, reg_data); 1669*aa070789SRoy Zang 1670*aa070789SRoy Zang reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001); 1671*aa070789SRoy Zang reg_data &= ~0x00100000; 1672*aa070789SRoy Zang E1000_WRITE_REG_ARRAY(hw, FFLT, 0x0001, reg_data); 1673*aa070789SRoy Zang /* Fall through */ 1674*aa070789SRoy Zang case e1000_82571: 1675*aa070789SRoy Zang case e1000_82572: 1676*aa070789SRoy Zang case e1000_ich8lan: 1677*aa070789SRoy Zang ctrl = E1000_READ_REG(hw, TXDCTL1); 1678*aa070789SRoy Zang ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) 1679*aa070789SRoy Zang | E1000_TXDCTL_FULL_TX_DESC_WB; 1680*aa070789SRoy Zang E1000_WRITE_REG(hw, TXDCTL1, ctrl); 1681*aa070789SRoy Zang break; 1682*aa070789SRoy Zang } 1683*aa070789SRoy Zang 1684*aa070789SRoy Zang if (hw->mac_type == e1000_82573) { 1685*aa070789SRoy Zang uint32_t gcr = E1000_READ_REG(hw, GCR); 1686*aa070789SRoy Zang gcr |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; 1687*aa070789SRoy Zang E1000_WRITE_REG(hw, GCR, gcr); 1688*aa070789SRoy Zang } 1689*aa070789SRoy Zang 16902439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 16912439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear all of the statistics registers (clear on read). It is 16922439e4bfSJean-Christophe PLAGNIOL-VILLARD * important that we do this after we have tried to establish link 16932439e4bfSJean-Christophe PLAGNIOL-VILLARD * because the symbol error count will increment wildly if there 16942439e4bfSJean-Christophe PLAGNIOL-VILLARD * is no link. 16952439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 16962439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_clear_hw_cntrs(hw); 1697*aa070789SRoy Zang 1698*aa070789SRoy Zang /* ICH8 No-snoop bits are opposite polarity. 1699*aa070789SRoy Zang * Set to snoop by default after reset. */ 1700*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 1701*aa070789SRoy Zang e1000_set_pci_ex_no_snoop(hw, PCI_EX_82566_SNOOP_ALL); 17022439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 17032439e4bfSJean-Christophe PLAGNIOL-VILLARD 1704*aa070789SRoy Zang if (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER || 1705*aa070789SRoy Zang hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3) { 1706*aa070789SRoy Zang ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 1707*aa070789SRoy Zang /* Relaxed ordering must be disabled to avoid a parity 1708*aa070789SRoy Zang * error crash in a PCI slot. */ 1709*aa070789SRoy Zang ctrl_ext |= E1000_CTRL_EXT_RO_DIS; 1710*aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 1711*aa070789SRoy Zang } 1712*aa070789SRoy Zang 17132439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 17142439e4bfSJean-Christophe PLAGNIOL-VILLARD } 17152439e4bfSJean-Christophe PLAGNIOL-VILLARD 17162439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 17172439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configures flow control and link settings. 17182439e4bfSJean-Christophe PLAGNIOL-VILLARD * 17192439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 17202439e4bfSJean-Christophe PLAGNIOL-VILLARD * 17212439e4bfSJean-Christophe PLAGNIOL-VILLARD * Determines which flow control settings to use. Calls the apropriate media- 17222439e4bfSJean-Christophe PLAGNIOL-VILLARD * specific link configuration function. Configures the flow control settings. 17232439e4bfSJean-Christophe PLAGNIOL-VILLARD * Assuming the adapter has a valid link partner, a valid link should be 17242439e4bfSJean-Christophe PLAGNIOL-VILLARD * established. Assumes the hardware has previously been reset and the 17252439e4bfSJean-Christophe PLAGNIOL-VILLARD * transmitter and receiver are not enabled. 17262439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 17272439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 17282439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_link(struct eth_device *nic) 17292439e4bfSJean-Christophe PLAGNIOL-VILLARD { 17302439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 17312439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl_ext; 17322439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 17332439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t eeprom_data; 17342439e4bfSJean-Christophe PLAGNIOL-VILLARD 17352439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 17362439e4bfSJean-Christophe PLAGNIOL-VILLARD 1737*aa070789SRoy Zang /* In the case of the phy reset being blocked, we already have a link. 1738*aa070789SRoy Zang * We do not have to set it up again. */ 1739*aa070789SRoy Zang if (e1000_check_phy_reset_block(hw)) 1740*aa070789SRoy Zang return E1000_SUCCESS; 1741*aa070789SRoy Zang 17422439e4bfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_AP1000 17432439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read and store word 0x0F of the EEPROM. This word contains bits 17442439e4bfSJean-Christophe PLAGNIOL-VILLARD * that determine the hardware's default PAUSE (flow control) mode, 17452439e4bfSJean-Christophe PLAGNIOL-VILLARD * a bit that determines whether the HW defaults to enabling or 17462439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabling auto-negotiation, and the direction of the 17472439e4bfSJean-Christophe PLAGNIOL-VILLARD * SW defined pins. If there is no SW over-ride of the flow 17482439e4bfSJean-Christophe PLAGNIOL-VILLARD * control setting, then the variable hw->fc will 17492439e4bfSJean-Christophe PLAGNIOL-VILLARD * be initialized based on a value in the EEPROM. 17502439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1751*aa070789SRoy Zang if (e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG, 1, 1752*aa070789SRoy Zang &eeprom_data) < 0) { 17532439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("EEPROM Read Error\n"); 17542439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 17552439e4bfSJean-Christophe PLAGNIOL-VILLARD } 17562439e4bfSJean-Christophe PLAGNIOL-VILLARD #else 17572439e4bfSJean-Christophe PLAGNIOL-VILLARD /* we have to hardcode the proper value for our hardware. */ 17582439e4bfSJean-Christophe PLAGNIOL-VILLARD /* this value is for the 82540EM pci card used for prototyping, and it works. */ 17592439e4bfSJean-Christophe PLAGNIOL-VILLARD eeprom_data = 0xb220; 17602439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 17612439e4bfSJean-Christophe PLAGNIOL-VILLARD 17622439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->fc == e1000_fc_default) { 1763*aa070789SRoy Zang switch (hw->mac_type) { 1764*aa070789SRoy Zang case e1000_ich8lan: 1765*aa070789SRoy Zang case e1000_82573: 1766*aa070789SRoy Zang hw->fc = e1000_fc_full; 1767*aa070789SRoy Zang break; 1768*aa070789SRoy Zang default: 1769*aa070789SRoy Zang #ifndef CONFIG_AP1000 1770*aa070789SRoy Zang ret_val = e1000_read_eeprom(hw, 1771*aa070789SRoy Zang EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data); 1772*aa070789SRoy Zang if (ret_val) { 1773*aa070789SRoy Zang DEBUGOUT("EEPROM Read Error\n"); 1774*aa070789SRoy Zang return -E1000_ERR_EEPROM; 1775*aa070789SRoy Zang } 1776*aa070789SRoy Zang #else 1777*aa070789SRoy Zang eeprom_data = 0xb220; 1778*aa070789SRoy Zang #endif 17792439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 0) 17802439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_none; 17812439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 17822439e4bfSJean-Christophe PLAGNIOL-VILLARD EEPROM_WORD0F_ASM_DIR) 17832439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_tx_pause; 17842439e4bfSJean-Christophe PLAGNIOL-VILLARD else 17852439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_full; 1786*aa070789SRoy Zang break; 1787*aa070789SRoy Zang } 17882439e4bfSJean-Christophe PLAGNIOL-VILLARD } 17892439e4bfSJean-Christophe PLAGNIOL-VILLARD 17902439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We want to save off the original Flow Control configuration just 17912439e4bfSJean-Christophe PLAGNIOL-VILLARD * in case we get disconnected and then reconnected into a different 17922439e4bfSJean-Christophe PLAGNIOL-VILLARD * hub or switch with different Flow Control capabilities. 17932439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 17942439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) 17952439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc &= (~e1000_fc_tx_pause); 17962439e4bfSJean-Christophe PLAGNIOL-VILLARD 17972439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->mac_type < e1000_82543) && (hw->report_tx_early == 1)) 17982439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc &= (~e1000_fc_rx_pause); 17992439e4bfSJean-Christophe PLAGNIOL-VILLARD 18002439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->original_fc = hw->fc; 18012439e4bfSJean-Christophe PLAGNIOL-VILLARD 18022439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("After fix-ups FlowControl is now = %x\n", hw->fc); 18032439e4bfSJean-Christophe PLAGNIOL-VILLARD 18042439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Take the 4 bits from EEPROM word 0x0F that determine the initial 18052439e4bfSJean-Christophe PLAGNIOL-VILLARD * polarity value for the SW controlled pins, and setup the 18062439e4bfSJean-Christophe PLAGNIOL-VILLARD * Extended Device Control reg with that info. 18072439e4bfSJean-Christophe PLAGNIOL-VILLARD * This is needed because one of the SW controlled pins is used for 18082439e4bfSJean-Christophe PLAGNIOL-VILLARD * signal detection. So this should be done before e1000_setup_pcs_link() 18092439e4bfSJean-Christophe PLAGNIOL-VILLARD * or e1000_phy_setup() is called. 18102439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18112439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82543) { 18122439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext = ((eeprom_data & EEPROM_WORD0F_SWPDIO_EXT) << 18132439e4bfSJean-Christophe PLAGNIOL-VILLARD SWDPIO__EXT_SHIFT); 18142439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 18152439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18162439e4bfSJean-Christophe PLAGNIOL-VILLARD 18172439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Call the necessary subroutine to configure the link. */ 18182439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = (hw->media_type == e1000_media_type_fiber) ? 18192439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_fiber_link(nic) : e1000_setup_copper_link(nic); 18202439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 18212439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 18222439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18232439e4bfSJean-Christophe PLAGNIOL-VILLARD 18242439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Initialize the flow control address, type, and PAUSE timer 18252439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers to their default values. This is done even if flow 18262439e4bfSJean-Christophe PLAGNIOL-VILLARD * control is disabled, because it does not hurt anything to 18272439e4bfSJean-Christophe PLAGNIOL-VILLARD * initialize these registers. 18282439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1829*aa070789SRoy Zang DEBUGOUT("Initializing the Flow Control address, type" 1830*aa070789SRoy Zang "and timer regs\n"); 18312439e4bfSJean-Christophe PLAGNIOL-VILLARD 1832*aa070789SRoy Zang /* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */ 1833*aa070789SRoy Zang if (hw->mac_type != e1000_ich8lan) { 18342439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE); 1835*aa070789SRoy Zang E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH); 1836*aa070789SRoy Zang E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW); 1837*aa070789SRoy Zang } 1838*aa070789SRoy Zang 18392439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time); 18402439e4bfSJean-Christophe PLAGNIOL-VILLARD 18412439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the flow control receive threshold registers. Normally, 18422439e4bfSJean-Christophe PLAGNIOL-VILLARD * these registers will be set to a default threshold that may be 18432439e4bfSJean-Christophe PLAGNIOL-VILLARD * adjusted later by the driver's runtime code. However, if the 18442439e4bfSJean-Christophe PLAGNIOL-VILLARD * ability to transmit pause frames in not enabled, then these 18452439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers will be set to 0. 18462439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18472439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(hw->fc & e1000_fc_tx_pause)) { 18482439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTL, 0); 18492439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTH, 0); 18502439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 18512439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We need to set up the Receive Threshold high and low water marks 18522439e4bfSJean-Christophe PLAGNIOL-VILLARD * as well as (optionally) enabling the transmission of XON frames. 18532439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18542439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->fc_send_xon) { 18552439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTL, 18562439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw->fc_low_water | E1000_FCRTL_XONE)); 18572439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water); 18582439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 18592439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTL, hw->fc_low_water); 18602439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water); 18612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18622439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18632439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 18642439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18652439e4bfSJean-Christophe PLAGNIOL-VILLARD 18662439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 18672439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets up link for a fiber based adapter 18682439e4bfSJean-Christophe PLAGNIOL-VILLARD * 18692439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 18702439e4bfSJean-Christophe PLAGNIOL-VILLARD * 18712439e4bfSJean-Christophe PLAGNIOL-VILLARD * Manipulates Physical Coding Sublayer functions in order to configure 18722439e4bfSJean-Christophe PLAGNIOL-VILLARD * link. Assumes the hardware has been previously reset and the transmitter 18732439e4bfSJean-Christophe PLAGNIOL-VILLARD * and receiver are not enabled. 18742439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 18752439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 18762439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_fiber_link(struct eth_device *nic) 18772439e4bfSJean-Christophe PLAGNIOL-VILLARD { 18782439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 18792439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 18802439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status; 18812439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t txcw = 0; 18822439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 18832439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t signal; 18842439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 18852439e4bfSJean-Christophe PLAGNIOL-VILLARD 18862439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 18872439e4bfSJean-Christophe PLAGNIOL-VILLARD /* On adapters with a MAC newer that 82544, SW Defineable pin 1 will be 18882439e4bfSJean-Christophe PLAGNIOL-VILLARD * set when the optics detect a signal. On older adapters, it will be 18892439e4bfSJean-Christophe PLAGNIOL-VILLARD * cleared when there is a signal 18902439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18912439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 18922439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->mac_type > e1000_82544) && !(ctrl & E1000_CTRL_ILOS)) 18932439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = E1000_CTRL_SWDPIN1; 18942439e4bfSJean-Christophe PLAGNIOL-VILLARD else 18952439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = 0; 18962439e4bfSJean-Christophe PLAGNIOL-VILLARD 18972439e4bfSJean-Christophe PLAGNIOL-VILLARD printf("signal for %s is %x (ctrl %08x)!!!!\n", nic->name, signal, 18982439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl); 18992439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Take the link out of reset */ 19002439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~(E1000_CTRL_LRST); 19012439e4bfSJean-Christophe PLAGNIOL-VILLARD 19022439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 19032439e4bfSJean-Christophe PLAGNIOL-VILLARD 19042439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for a software override of the flow control settings, and setup 19052439e4bfSJean-Christophe PLAGNIOL-VILLARD * the device accordingly. If auto-negotiation is enabled, then software 19062439e4bfSJean-Christophe PLAGNIOL-VILLARD * will have to set the "PAUSE" bits to the correct value in the Tranmsit 19072439e4bfSJean-Christophe PLAGNIOL-VILLARD * Config Word Register (TXCW) and re-start auto-negotiation. However, if 19082439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation is disabled, then software will have to manually 19092439e4bfSJean-Christophe PLAGNIOL-VILLARD * configure the two flow control enable bits in the CTRL register. 19102439e4bfSJean-Christophe PLAGNIOL-VILLARD * 19112439e4bfSJean-Christophe PLAGNIOL-VILLARD * The possible values of the "fc" parameter are: 19122439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0: Flow control is completely disabled 19132439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1: Rx flow control is enabled (we can receive pause frames, but 19142439e4bfSJean-Christophe PLAGNIOL-VILLARD * not send pause frames). 19152439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2: Tx flow control is enabled (we can send pause frames but we do 19162439e4bfSJean-Christophe PLAGNIOL-VILLARD * not support receiving pause frames). 19172439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3: Both Rx and TX flow control (symmetric) are enabled. 19182439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19192439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->fc) { 19202439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_none: 19212439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control is completely disabled by a software over-ride. */ 19222439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD); 19232439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19242439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_rx_pause: 19252439e4bfSJean-Christophe PLAGNIOL-VILLARD /* RX Flow control is enabled and TX Flow control is disabled by a 19262439e4bfSJean-Christophe PLAGNIOL-VILLARD * software over-ride. Since there really isn't a way to advertise 19272439e4bfSJean-Christophe PLAGNIOL-VILLARD * that we are capable of RX Pause ONLY, we will advertise that we 19282439e4bfSJean-Christophe PLAGNIOL-VILLARD * support both symmetric and asymmetric RX PAUSE. Later, we will 19292439e4bfSJean-Christophe PLAGNIOL-VILLARD * disable the adapter's ability to send PAUSE frames. 19302439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19312439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); 19322439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19332439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_tx_pause: 19342439e4bfSJean-Christophe PLAGNIOL-VILLARD /* TX Flow control is enabled, and RX Flow control is disabled, by a 19352439e4bfSJean-Christophe PLAGNIOL-VILLARD * software over-ride. 19362439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19372439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR); 19382439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19392439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_full: 19402439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control (both RX and TX) is enabled by a software over-ride. */ 19412439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); 19422439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19432439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 19442439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow control param set incorrectly\n"); 19452439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 19462439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19472439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19482439e4bfSJean-Christophe PLAGNIOL-VILLARD 19492439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Since auto-negotiation is enabled, take the link out of reset (the link 19502439e4bfSJean-Christophe PLAGNIOL-VILLARD * will be in reset, because we previously reset the chip). This will 19512439e4bfSJean-Christophe PLAGNIOL-VILLARD * restart auto-negotiation. If auto-neogtiation is successful then the 19522439e4bfSJean-Christophe PLAGNIOL-VILLARD * link-up status bit will be set and the flow control enable bits (RFCE 19532439e4bfSJean-Christophe PLAGNIOL-VILLARD * and TFCE) will be set according to their negotiated value. 19542439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19552439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-negotiation enabled (%#x)\n", txcw); 19562439e4bfSJean-Christophe PLAGNIOL-VILLARD 19572439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXCW, txcw); 19582439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 19592439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 19602439e4bfSJean-Christophe PLAGNIOL-VILLARD 19612439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->txcw = txcw; 19622439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(1); 19632439e4bfSJean-Christophe PLAGNIOL-VILLARD 19642439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we have a signal (the cable is plugged in) then poll for a "Link-Up" 19652439e4bfSJean-Christophe PLAGNIOL-VILLARD * indication in the Device Status Register. Time-out if a link isn't 19662439e4bfSJean-Christophe PLAGNIOL-VILLARD * seen in 500 milliseconds seconds (Auto-negotiation should complete in 19672439e4bfSJean-Christophe PLAGNIOL-VILLARD * less than 500 milliseconds even if the other end is doing it in SW). 19682439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19692439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((E1000_READ_REG(hw, CTRL) & E1000_CTRL_SWDPIN1) == signal) { 19702439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Looking for Link\n"); 19712439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < (LINK_UP_TIMEOUT / 10); i++) { 19722439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 19732439e4bfSJean-Christophe PLAGNIOL-VILLARD status = E1000_READ_REG(hw, STATUS); 19742439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_LU) 19752439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19762439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19772439e4bfSJean-Christophe PLAGNIOL-VILLARD if (i == (LINK_UP_TIMEOUT / 10)) { 19782439e4bfSJean-Christophe PLAGNIOL-VILLARD /* AutoNeg failed to achieve a link, so we'll call 19792439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_check_for_link. This routine will force the link up if we 19802439e4bfSJean-Christophe PLAGNIOL-VILLARD * detect a signal. This will allow us to communicate with 19812439e4bfSJean-Christophe PLAGNIOL-VILLARD * non-autonegotiating link partners. 19822439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19832439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Never got a valid link from auto-neg!!!\n"); 19842439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 1; 19852439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_check_for_link(nic); 19862439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 19872439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error while checking for link\n"); 19882439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 19892439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19902439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 0; 19912439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 19922439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 0; 19932439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Valid Link Found\n"); 19942439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19952439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 19962439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("No Signal Detected\n"); 19972439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_NOLINK; 19982439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19992439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 20002439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20012439e4bfSJean-Christophe PLAGNIOL-VILLARD 2002*aa070789SRoy Zang /***************************************************************************** 2003*aa070789SRoy Zang * Set PHY to class A mode 2004*aa070789SRoy Zang * Assumes the following operations will follow to enable the new class mode. 2005*aa070789SRoy Zang * 1. Do a PHY soft reset 2006*aa070789SRoy Zang * 2. Restart auto-negotiation or force link. 2007*aa070789SRoy Zang * 2008*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2009*aa070789SRoy Zang ****************************************************************************/ 2010*aa070789SRoy Zang static int32_t 2011*aa070789SRoy Zang e1000_set_phy_mode(struct e1000_hw *hw) 2012*aa070789SRoy Zang { 2013*aa070789SRoy Zang int32_t ret_val; 2014*aa070789SRoy Zang uint16_t eeprom_data; 2015*aa070789SRoy Zang 2016*aa070789SRoy Zang DEBUGFUNC(); 2017*aa070789SRoy Zang 2018*aa070789SRoy Zang if ((hw->mac_type == e1000_82545_rev_3) && 2019*aa070789SRoy Zang (hw->media_type == e1000_media_type_copper)) { 2020*aa070789SRoy Zang ret_val = e1000_read_eeprom(hw, EEPROM_PHY_CLASS_WORD, 2021*aa070789SRoy Zang 1, &eeprom_data); 2022*aa070789SRoy Zang if (ret_val) 2023*aa070789SRoy Zang return ret_val; 2024*aa070789SRoy Zang 2025*aa070789SRoy Zang if ((eeprom_data != EEPROM_RESERVED_WORD) && 2026*aa070789SRoy Zang (eeprom_data & EEPROM_PHY_CLASS_A)) { 2027*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2028*aa070789SRoy Zang M88E1000_PHY_PAGE_SELECT, 0x000B); 2029*aa070789SRoy Zang if (ret_val) 2030*aa070789SRoy Zang return ret_val; 2031*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2032*aa070789SRoy Zang M88E1000_PHY_GEN_CONTROL, 0x8104); 2033*aa070789SRoy Zang if (ret_val) 2034*aa070789SRoy Zang return ret_val; 2035*aa070789SRoy Zang 2036*aa070789SRoy Zang hw->phy_reset_disable = FALSE; 2037*aa070789SRoy Zang } 2038*aa070789SRoy Zang } 2039*aa070789SRoy Zang 2040*aa070789SRoy Zang return E1000_SUCCESS; 2041*aa070789SRoy Zang } 2042*aa070789SRoy Zang 20432439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 2044*aa070789SRoy Zang * Make sure we have a valid PHY and change PHY mode before link setup. 20452439e4bfSJean-Christophe PLAGNIOL-VILLARD * 20462439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 20472439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 2048*aa070789SRoy Zang static int32_t 2049*aa070789SRoy Zang e1000_copper_link_preconfig(struct e1000_hw *hw) 20502439e4bfSJean-Christophe PLAGNIOL-VILLARD { 20512439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 20522439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 20532439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 20542439e4bfSJean-Christophe PLAGNIOL-VILLARD 20552439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 20562439e4bfSJean-Christophe PLAGNIOL-VILLARD 20572439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 20582439e4bfSJean-Christophe PLAGNIOL-VILLARD /* With 82543, we need to force speed and duplex on the MAC equal to what 20592439e4bfSJean-Christophe PLAGNIOL-VILLARD * the PHY speed and duplex configuration is. In addition, we need to 20602439e4bfSJean-Christophe PLAGNIOL-VILLARD * perform a hardware reset on the PHY to take it out of reset. 20612439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 20622439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 20632439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_SLU; 20642439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 20652439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 20662439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 2067*aa070789SRoy Zang ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX 2068*aa070789SRoy Zang | E1000_CTRL_SLU); 20692439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 2070*aa070789SRoy Zang ret_val = e1000_phy_hw_reset(hw); 2071*aa070789SRoy Zang if (ret_val) 2072*aa070789SRoy Zang return ret_val; 20732439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20742439e4bfSJean-Christophe PLAGNIOL-VILLARD 20752439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Make sure we have a valid PHY */ 20762439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_detect_gig_phy(hw); 2077*aa070789SRoy Zang if (ret_val) { 20782439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error, did not detect valid phy.\n"); 20792439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 20802439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20812439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Phy ID = %x \n", hw->phy_id); 20822439e4bfSJean-Christophe PLAGNIOL-VILLARD 2083*aa070789SRoy Zang #ifndef CONFIG_AP1000 2084*aa070789SRoy Zang /* Set PHY to class A mode (if necessary) */ 2085*aa070789SRoy Zang ret_val = e1000_set_phy_mode(hw); 2086*aa070789SRoy Zang if (ret_val) 2087*aa070789SRoy Zang return ret_val; 2088*aa070789SRoy Zang #endif 2089*aa070789SRoy Zang if ((hw->mac_type == e1000_82545_rev_3) || 2090*aa070789SRoy Zang (hw->mac_type == e1000_82546_rev_3)) { 2091*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, 2092*aa070789SRoy Zang &phy_data); 2093*aa070789SRoy Zang phy_data |= 0x00000008; 2094*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, 2095*aa070789SRoy Zang phy_data); 20962439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2097*aa070789SRoy Zang 2098*aa070789SRoy Zang if (hw->mac_type <= e1000_82543 || 2099*aa070789SRoy Zang hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547 || 2100*aa070789SRoy Zang hw->mac_type == e1000_82541_rev_2 2101*aa070789SRoy Zang || hw->mac_type == e1000_82547_rev_2) 2102*aa070789SRoy Zang hw->phy_reset_disable = FALSE; 2103*aa070789SRoy Zang 2104*aa070789SRoy Zang return E1000_SUCCESS; 2105*aa070789SRoy Zang } 2106*aa070789SRoy Zang 2107*aa070789SRoy Zang /***************************************************************************** 2108*aa070789SRoy Zang * 2109*aa070789SRoy Zang * This function sets the lplu state according to the active flag. When 2110*aa070789SRoy Zang * activating lplu this function also disables smart speed and vise versa. 2111*aa070789SRoy Zang * lplu will not be activated unless the device autonegotiation advertisment 2112*aa070789SRoy Zang * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes. 2113*aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 2114*aa070789SRoy Zang * active - true to enable lplu false to disable lplu. 2115*aa070789SRoy Zang * 2116*aa070789SRoy Zang * returns: - E1000_ERR_PHY if fail to read/write the PHY 2117*aa070789SRoy Zang * E1000_SUCCESS at any other case. 2118*aa070789SRoy Zang * 2119*aa070789SRoy Zang ****************************************************************************/ 2120*aa070789SRoy Zang 2121*aa070789SRoy Zang static int32_t 2122*aa070789SRoy Zang e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active) 2123*aa070789SRoy Zang { 2124*aa070789SRoy Zang uint32_t phy_ctrl = 0; 2125*aa070789SRoy Zang int32_t ret_val; 2126*aa070789SRoy Zang uint16_t phy_data; 2127*aa070789SRoy Zang DEBUGFUNC(); 2128*aa070789SRoy Zang 2129*aa070789SRoy Zang if (hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2 2130*aa070789SRoy Zang && hw->phy_type != e1000_phy_igp_3) 2131*aa070789SRoy Zang return E1000_SUCCESS; 2132*aa070789SRoy Zang 2133*aa070789SRoy Zang /* During driver activity LPLU should not be used or it will attain link 2134*aa070789SRoy Zang * from the lowest speeds starting from 10Mbps. The capability is used 2135*aa070789SRoy Zang * for Dx transitions and states */ 2136*aa070789SRoy Zang if (hw->mac_type == e1000_82541_rev_2 2137*aa070789SRoy Zang || hw->mac_type == e1000_82547_rev_2) { 2138*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, 2139*aa070789SRoy Zang &phy_data); 2140*aa070789SRoy Zang if (ret_val) 2141*aa070789SRoy Zang return ret_val; 2142*aa070789SRoy Zang } else if (hw->mac_type == e1000_ich8lan) { 2143*aa070789SRoy Zang /* MAC writes into PHY register based on the state transition 2144*aa070789SRoy Zang * and start auto-negotiation. SW driver can overwrite the 2145*aa070789SRoy Zang * settings in CSR PHY power control E1000_PHY_CTRL register. */ 2146*aa070789SRoy Zang phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); 2147*aa070789SRoy Zang } else { 2148*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, 2149*aa070789SRoy Zang &phy_data); 2150*aa070789SRoy Zang if (ret_val) 2151*aa070789SRoy Zang return ret_val; 2152*aa070789SRoy Zang } 2153*aa070789SRoy Zang 2154*aa070789SRoy Zang if (!active) { 2155*aa070789SRoy Zang if (hw->mac_type == e1000_82541_rev_2 || 2156*aa070789SRoy Zang hw->mac_type == e1000_82547_rev_2) { 2157*aa070789SRoy Zang phy_data &= ~IGP01E1000_GMII_FLEX_SPD; 2158*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, 2159*aa070789SRoy Zang phy_data); 2160*aa070789SRoy Zang if (ret_val) 2161*aa070789SRoy Zang return ret_val; 2162*aa070789SRoy Zang } else { 2163*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2164*aa070789SRoy Zang phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU; 2165*aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2166*aa070789SRoy Zang } else { 2167*aa070789SRoy Zang phy_data &= ~IGP02E1000_PM_D3_LPLU; 2168*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2169*aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2170*aa070789SRoy Zang if (ret_val) 2171*aa070789SRoy Zang return ret_val; 2172*aa070789SRoy Zang } 2173*aa070789SRoy Zang } 2174*aa070789SRoy Zang 2175*aa070789SRoy Zang /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during 2176*aa070789SRoy Zang * Dx states where the power conservation is most important. During 2177*aa070789SRoy Zang * driver activity we should enable SmartSpeed, so performance is 2178*aa070789SRoy Zang * maintained. */ 2179*aa070789SRoy Zang if (hw->smart_speed == e1000_smart_speed_on) { 2180*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2181*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2182*aa070789SRoy Zang if (ret_val) 2183*aa070789SRoy Zang return ret_val; 2184*aa070789SRoy Zang 2185*aa070789SRoy Zang phy_data |= IGP01E1000_PSCFR_SMART_SPEED; 2186*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2187*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2188*aa070789SRoy Zang if (ret_val) 2189*aa070789SRoy Zang return ret_val; 2190*aa070789SRoy Zang } else if (hw->smart_speed == e1000_smart_speed_off) { 2191*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2192*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2193*aa070789SRoy Zang if (ret_val) 2194*aa070789SRoy Zang return ret_val; 2195*aa070789SRoy Zang 2196*aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2197*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2198*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2199*aa070789SRoy Zang if (ret_val) 2200*aa070789SRoy Zang return ret_val; 2201*aa070789SRoy Zang } 2202*aa070789SRoy Zang 2203*aa070789SRoy Zang } else if ((hw->autoneg_advertised == AUTONEG_ADVERTISE_SPEED_DEFAULT) 2204*aa070789SRoy Zang || (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL) || 2205*aa070789SRoy Zang (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) { 2206*aa070789SRoy Zang 2207*aa070789SRoy Zang if (hw->mac_type == e1000_82541_rev_2 || 2208*aa070789SRoy Zang hw->mac_type == e1000_82547_rev_2) { 2209*aa070789SRoy Zang phy_data |= IGP01E1000_GMII_FLEX_SPD; 2210*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2211*aa070789SRoy Zang IGP01E1000_GMII_FIFO, phy_data); 2212*aa070789SRoy Zang if (ret_val) 2213*aa070789SRoy Zang return ret_val; 2214*aa070789SRoy Zang } else { 2215*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2216*aa070789SRoy Zang phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU; 2217*aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2218*aa070789SRoy Zang } else { 2219*aa070789SRoy Zang phy_data |= IGP02E1000_PM_D3_LPLU; 2220*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2221*aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2222*aa070789SRoy Zang if (ret_val) 2223*aa070789SRoy Zang return ret_val; 2224*aa070789SRoy Zang } 2225*aa070789SRoy Zang } 2226*aa070789SRoy Zang 2227*aa070789SRoy Zang /* When LPLU is enabled we should disable SmartSpeed */ 2228*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 2229*aa070789SRoy Zang &phy_data); 2230*aa070789SRoy Zang if (ret_val) 2231*aa070789SRoy Zang return ret_val; 2232*aa070789SRoy Zang 2233*aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2234*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 2235*aa070789SRoy Zang phy_data); 2236*aa070789SRoy Zang if (ret_val) 2237*aa070789SRoy Zang return ret_val; 2238*aa070789SRoy Zang } 2239*aa070789SRoy Zang return E1000_SUCCESS; 2240*aa070789SRoy Zang } 2241*aa070789SRoy Zang 2242*aa070789SRoy Zang /***************************************************************************** 2243*aa070789SRoy Zang * 2244*aa070789SRoy Zang * This function sets the lplu d0 state according to the active flag. When 2245*aa070789SRoy Zang * activating lplu this function also disables smart speed and vise versa. 2246*aa070789SRoy Zang * lplu will not be activated unless the device autonegotiation advertisment 2247*aa070789SRoy Zang * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes. 2248*aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 2249*aa070789SRoy Zang * active - true to enable lplu false to disable lplu. 2250*aa070789SRoy Zang * 2251*aa070789SRoy Zang * returns: - E1000_ERR_PHY if fail to read/write the PHY 2252*aa070789SRoy Zang * E1000_SUCCESS at any other case. 2253*aa070789SRoy Zang * 2254*aa070789SRoy Zang ****************************************************************************/ 2255*aa070789SRoy Zang 2256*aa070789SRoy Zang static int32_t 2257*aa070789SRoy Zang e1000_set_d0_lplu_state(struct e1000_hw *hw, boolean_t active) 2258*aa070789SRoy Zang { 2259*aa070789SRoy Zang uint32_t phy_ctrl = 0; 2260*aa070789SRoy Zang int32_t ret_val; 2261*aa070789SRoy Zang uint16_t phy_data; 2262*aa070789SRoy Zang DEBUGFUNC(); 2263*aa070789SRoy Zang 2264*aa070789SRoy Zang if (hw->mac_type <= e1000_82547_rev_2) 2265*aa070789SRoy Zang return E1000_SUCCESS; 2266*aa070789SRoy Zang 2267*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2268*aa070789SRoy Zang phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); 2269*aa070789SRoy Zang } else { 2270*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, 2271*aa070789SRoy Zang &phy_data); 2272*aa070789SRoy Zang if (ret_val) 2273*aa070789SRoy Zang return ret_val; 2274*aa070789SRoy Zang } 2275*aa070789SRoy Zang 2276*aa070789SRoy Zang if (!active) { 2277*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2278*aa070789SRoy Zang phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU; 2279*aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2280*aa070789SRoy Zang } else { 2281*aa070789SRoy Zang phy_data &= ~IGP02E1000_PM_D0_LPLU; 2282*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2283*aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2284*aa070789SRoy Zang if (ret_val) 2285*aa070789SRoy Zang return ret_val; 2286*aa070789SRoy Zang } 2287*aa070789SRoy Zang 2288*aa070789SRoy Zang /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during 2289*aa070789SRoy Zang * Dx states where the power conservation is most important. During 2290*aa070789SRoy Zang * driver activity we should enable SmartSpeed, so performance is 2291*aa070789SRoy Zang * maintained. */ 2292*aa070789SRoy Zang if (hw->smart_speed == e1000_smart_speed_on) { 2293*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2294*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2295*aa070789SRoy Zang if (ret_val) 2296*aa070789SRoy Zang return ret_val; 2297*aa070789SRoy Zang 2298*aa070789SRoy Zang phy_data |= IGP01E1000_PSCFR_SMART_SPEED; 2299*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2300*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2301*aa070789SRoy Zang if (ret_val) 2302*aa070789SRoy Zang return ret_val; 2303*aa070789SRoy Zang } else if (hw->smart_speed == e1000_smart_speed_off) { 2304*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2305*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2306*aa070789SRoy Zang if (ret_val) 2307*aa070789SRoy Zang return ret_val; 2308*aa070789SRoy Zang 2309*aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2310*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2311*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2312*aa070789SRoy Zang if (ret_val) 2313*aa070789SRoy Zang return ret_val; 2314*aa070789SRoy Zang } 2315*aa070789SRoy Zang 2316*aa070789SRoy Zang 2317*aa070789SRoy Zang } else { 2318*aa070789SRoy Zang 2319*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2320*aa070789SRoy Zang phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU; 2321*aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2322*aa070789SRoy Zang } else { 2323*aa070789SRoy Zang phy_data |= IGP02E1000_PM_D0_LPLU; 2324*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2325*aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2326*aa070789SRoy Zang if (ret_val) 2327*aa070789SRoy Zang return ret_val; 2328*aa070789SRoy Zang } 2329*aa070789SRoy Zang 2330*aa070789SRoy Zang /* When LPLU is enabled we should disable SmartSpeed */ 2331*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2332*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2333*aa070789SRoy Zang if (ret_val) 2334*aa070789SRoy Zang return ret_val; 2335*aa070789SRoy Zang 2336*aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2337*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2338*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2339*aa070789SRoy Zang if (ret_val) 2340*aa070789SRoy Zang return ret_val; 2341*aa070789SRoy Zang 2342*aa070789SRoy Zang } 2343*aa070789SRoy Zang return E1000_SUCCESS; 2344*aa070789SRoy Zang } 2345*aa070789SRoy Zang 2346*aa070789SRoy Zang /******************************************************************** 2347*aa070789SRoy Zang * Copper link setup for e1000_phy_igp series. 2348*aa070789SRoy Zang * 2349*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2350*aa070789SRoy Zang *********************************************************************/ 2351*aa070789SRoy Zang static int32_t 2352*aa070789SRoy Zang e1000_copper_link_igp_setup(struct e1000_hw *hw) 2353*aa070789SRoy Zang { 2354*aa070789SRoy Zang uint32_t led_ctrl; 2355*aa070789SRoy Zang int32_t ret_val; 2356*aa070789SRoy Zang uint16_t phy_data; 2357*aa070789SRoy Zang 2358*aa070789SRoy Zang DEBUGOUT(); 2359*aa070789SRoy Zang 2360*aa070789SRoy Zang if (hw->phy_reset_disable) 2361*aa070789SRoy Zang return E1000_SUCCESS; 2362*aa070789SRoy Zang 2363*aa070789SRoy Zang ret_val = e1000_phy_reset(hw); 2364*aa070789SRoy Zang if (ret_val) { 2365*aa070789SRoy Zang DEBUGOUT("Error Resetting the PHY\n"); 2366*aa070789SRoy Zang return ret_val; 2367*aa070789SRoy Zang } 2368*aa070789SRoy Zang 2369*aa070789SRoy Zang /* Wait 15ms for MAC to configure PHY from eeprom settings */ 2370*aa070789SRoy Zang mdelay(15); 2371*aa070789SRoy Zang if (hw->mac_type != e1000_ich8lan) { 2372*aa070789SRoy Zang /* Configure activity LED after PHY reset */ 2373*aa070789SRoy Zang led_ctrl = E1000_READ_REG(hw, LEDCTL); 2374*aa070789SRoy Zang led_ctrl &= IGP_ACTIVITY_LED_MASK; 2375*aa070789SRoy Zang led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); 2376*aa070789SRoy Zang E1000_WRITE_REG(hw, LEDCTL, led_ctrl); 2377*aa070789SRoy Zang } 2378*aa070789SRoy Zang 2379*aa070789SRoy Zang /* The NVM settings will configure LPLU in D3 for IGP2 and IGP3 PHYs */ 2380*aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp) { 2381*aa070789SRoy Zang /* disable lplu d3 during driver init */ 2382*aa070789SRoy Zang ret_val = e1000_set_d3_lplu_state(hw, FALSE); 2383*aa070789SRoy Zang if (ret_val) { 2384*aa070789SRoy Zang DEBUGOUT("Error Disabling LPLU D3\n"); 2385*aa070789SRoy Zang return ret_val; 2386*aa070789SRoy Zang } 2387*aa070789SRoy Zang } 2388*aa070789SRoy Zang 2389*aa070789SRoy Zang /* disable lplu d0 during driver init */ 2390*aa070789SRoy Zang ret_val = e1000_set_d0_lplu_state(hw, FALSE); 2391*aa070789SRoy Zang if (ret_val) { 2392*aa070789SRoy Zang DEBUGOUT("Error Disabling LPLU D0\n"); 2393*aa070789SRoy Zang return ret_val; 2394*aa070789SRoy Zang } 2395*aa070789SRoy Zang /* Configure mdi-mdix settings */ 2396*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data); 2397*aa070789SRoy Zang if (ret_val) 2398*aa070789SRoy Zang return ret_val; 2399*aa070789SRoy Zang 2400*aa070789SRoy Zang if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { 2401*aa070789SRoy Zang hw->dsp_config_state = e1000_dsp_config_disabled; 2402*aa070789SRoy Zang /* Force MDI for earlier revs of the IGP PHY */ 2403*aa070789SRoy Zang phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX 2404*aa070789SRoy Zang | IGP01E1000_PSCR_FORCE_MDI_MDIX); 2405*aa070789SRoy Zang hw->mdix = 1; 2406*aa070789SRoy Zang 2407*aa070789SRoy Zang } else { 2408*aa070789SRoy Zang hw->dsp_config_state = e1000_dsp_config_enabled; 2409*aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; 2410*aa070789SRoy Zang 2411*aa070789SRoy Zang switch (hw->mdix) { 2412*aa070789SRoy Zang case 1: 2413*aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; 2414*aa070789SRoy Zang break; 2415*aa070789SRoy Zang case 2: 2416*aa070789SRoy Zang phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX; 2417*aa070789SRoy Zang break; 2418*aa070789SRoy Zang case 0: 2419*aa070789SRoy Zang default: 2420*aa070789SRoy Zang phy_data |= IGP01E1000_PSCR_AUTO_MDIX; 2421*aa070789SRoy Zang break; 2422*aa070789SRoy Zang } 2423*aa070789SRoy Zang } 2424*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data); 2425*aa070789SRoy Zang if (ret_val) 2426*aa070789SRoy Zang return ret_val; 2427*aa070789SRoy Zang 2428*aa070789SRoy Zang /* set auto-master slave resolution settings */ 2429*aa070789SRoy Zang if (hw->autoneg) { 2430*aa070789SRoy Zang e1000_ms_type phy_ms_setting = hw->master_slave; 2431*aa070789SRoy Zang 2432*aa070789SRoy Zang if (hw->ffe_config_state == e1000_ffe_config_active) 2433*aa070789SRoy Zang hw->ffe_config_state = e1000_ffe_config_enabled; 2434*aa070789SRoy Zang 2435*aa070789SRoy Zang if (hw->dsp_config_state == e1000_dsp_config_activated) 2436*aa070789SRoy Zang hw->dsp_config_state = e1000_dsp_config_enabled; 2437*aa070789SRoy Zang 2438*aa070789SRoy Zang /* when autonegotiation advertisment is only 1000Mbps then we 2439*aa070789SRoy Zang * should disable SmartSpeed and enable Auto MasterSlave 2440*aa070789SRoy Zang * resolution as hardware default. */ 2441*aa070789SRoy Zang if (hw->autoneg_advertised == ADVERTISE_1000_FULL) { 2442*aa070789SRoy Zang /* Disable SmartSpeed */ 2443*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2444*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2445*aa070789SRoy Zang if (ret_val) 2446*aa070789SRoy Zang return ret_val; 2447*aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2448*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2449*aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2450*aa070789SRoy Zang if (ret_val) 2451*aa070789SRoy Zang return ret_val; 2452*aa070789SRoy Zang /* Set auto Master/Slave resolution process */ 2453*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, 2454*aa070789SRoy Zang &phy_data); 2455*aa070789SRoy Zang if (ret_val) 2456*aa070789SRoy Zang return ret_val; 2457*aa070789SRoy Zang phy_data &= ~CR_1000T_MS_ENABLE; 2458*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, 2459*aa070789SRoy Zang phy_data); 2460*aa070789SRoy Zang if (ret_val) 2461*aa070789SRoy Zang return ret_val; 2462*aa070789SRoy Zang } 2463*aa070789SRoy Zang 2464*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data); 2465*aa070789SRoy Zang if (ret_val) 2466*aa070789SRoy Zang return ret_val; 2467*aa070789SRoy Zang 2468*aa070789SRoy Zang /* load defaults for future use */ 2469*aa070789SRoy Zang hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ? 2470*aa070789SRoy Zang ((phy_data & CR_1000T_MS_VALUE) ? 2471*aa070789SRoy Zang e1000_ms_force_master : 2472*aa070789SRoy Zang e1000_ms_force_slave) : 2473*aa070789SRoy Zang e1000_ms_auto; 2474*aa070789SRoy Zang 2475*aa070789SRoy Zang switch (phy_ms_setting) { 2476*aa070789SRoy Zang case e1000_ms_force_master: 2477*aa070789SRoy Zang phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); 2478*aa070789SRoy Zang break; 2479*aa070789SRoy Zang case e1000_ms_force_slave: 2480*aa070789SRoy Zang phy_data |= CR_1000T_MS_ENABLE; 2481*aa070789SRoy Zang phy_data &= ~(CR_1000T_MS_VALUE); 2482*aa070789SRoy Zang break; 2483*aa070789SRoy Zang case e1000_ms_auto: 2484*aa070789SRoy Zang phy_data &= ~CR_1000T_MS_ENABLE; 2485*aa070789SRoy Zang default: 2486*aa070789SRoy Zang break; 2487*aa070789SRoy Zang } 2488*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data); 2489*aa070789SRoy Zang if (ret_val) 2490*aa070789SRoy Zang return ret_val; 2491*aa070789SRoy Zang } 2492*aa070789SRoy Zang 2493*aa070789SRoy Zang return E1000_SUCCESS; 2494*aa070789SRoy Zang } 2495*aa070789SRoy Zang 2496*aa070789SRoy Zang /***************************************************************************** 2497*aa070789SRoy Zang * This function checks the mode of the firmware. 2498*aa070789SRoy Zang * 2499*aa070789SRoy Zang * returns - TRUE when the mode is IAMT or FALSE. 2500*aa070789SRoy Zang ****************************************************************************/ 2501*aa070789SRoy Zang boolean_t 2502*aa070789SRoy Zang e1000_check_mng_mode(struct e1000_hw *hw) 2503*aa070789SRoy Zang { 2504*aa070789SRoy Zang uint32_t fwsm; 2505*aa070789SRoy Zang DEBUGFUNC(); 2506*aa070789SRoy Zang 2507*aa070789SRoy Zang fwsm = E1000_READ_REG(hw, FWSM); 2508*aa070789SRoy Zang 2509*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2510*aa070789SRoy Zang if ((fwsm & E1000_FWSM_MODE_MASK) == 2511*aa070789SRoy Zang (E1000_MNG_ICH_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) 2512*aa070789SRoy Zang return TRUE; 2513*aa070789SRoy Zang } else if ((fwsm & E1000_FWSM_MODE_MASK) == 2514*aa070789SRoy Zang (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) 2515*aa070789SRoy Zang return TRUE; 2516*aa070789SRoy Zang 2517*aa070789SRoy Zang return FALSE; 2518*aa070789SRoy Zang } 2519*aa070789SRoy Zang 2520*aa070789SRoy Zang static int32_t 2521*aa070789SRoy Zang e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data) 2522*aa070789SRoy Zang { 2523*aa070789SRoy Zang uint32_t reg_val; 2524*aa070789SRoy Zang uint16_t swfw; 2525*aa070789SRoy Zang DEBUGFUNC(); 2526*aa070789SRoy Zang 2527*aa070789SRoy Zang if ((hw->mac_type == e1000_80003es2lan) && 2528*aa070789SRoy Zang (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 2529*aa070789SRoy Zang swfw = E1000_SWFW_PHY1_SM; 2530*aa070789SRoy Zang } else { 2531*aa070789SRoy Zang swfw = E1000_SWFW_PHY0_SM; 2532*aa070789SRoy Zang } 2533*aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, swfw)) 2534*aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 2535*aa070789SRoy Zang 2536*aa070789SRoy Zang reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) 2537*aa070789SRoy Zang & E1000_KUMCTRLSTA_OFFSET) | data; 2538*aa070789SRoy Zang E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); 2539*aa070789SRoy Zang udelay(2); 2540*aa070789SRoy Zang 2541*aa070789SRoy Zang return E1000_SUCCESS; 2542*aa070789SRoy Zang } 2543*aa070789SRoy Zang 2544*aa070789SRoy Zang static int32_t 2545*aa070789SRoy Zang e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data) 2546*aa070789SRoy Zang { 2547*aa070789SRoy Zang uint32_t reg_val; 2548*aa070789SRoy Zang uint16_t swfw; 2549*aa070789SRoy Zang DEBUGFUNC(); 2550*aa070789SRoy Zang 2551*aa070789SRoy Zang if ((hw->mac_type == e1000_80003es2lan) && 2552*aa070789SRoy Zang (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 2553*aa070789SRoy Zang swfw = E1000_SWFW_PHY1_SM; 2554*aa070789SRoy Zang } else { 2555*aa070789SRoy Zang swfw = E1000_SWFW_PHY0_SM; 2556*aa070789SRoy Zang } 2557*aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, swfw)) 2558*aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 2559*aa070789SRoy Zang 2560*aa070789SRoy Zang /* Write register address */ 2561*aa070789SRoy Zang reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) & 2562*aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET) | E1000_KUMCTRLSTA_REN; 2563*aa070789SRoy Zang E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); 2564*aa070789SRoy Zang udelay(2); 2565*aa070789SRoy Zang 2566*aa070789SRoy Zang /* Read the data returned */ 2567*aa070789SRoy Zang reg_val = E1000_READ_REG(hw, KUMCTRLSTA); 2568*aa070789SRoy Zang *data = (uint16_t)reg_val; 2569*aa070789SRoy Zang 2570*aa070789SRoy Zang return E1000_SUCCESS; 2571*aa070789SRoy Zang } 2572*aa070789SRoy Zang 2573*aa070789SRoy Zang /******************************************************************** 2574*aa070789SRoy Zang * Copper link setup for e1000_phy_gg82563 series. 2575*aa070789SRoy Zang * 2576*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2577*aa070789SRoy Zang *********************************************************************/ 2578*aa070789SRoy Zang static int32_t 2579*aa070789SRoy Zang e1000_copper_link_ggp_setup(struct e1000_hw *hw) 2580*aa070789SRoy Zang { 2581*aa070789SRoy Zang int32_t ret_val; 2582*aa070789SRoy Zang uint16_t phy_data; 2583*aa070789SRoy Zang uint32_t reg_data; 2584*aa070789SRoy Zang 2585*aa070789SRoy Zang DEBUGFUNC(); 2586*aa070789SRoy Zang 2587*aa070789SRoy Zang if (!hw->phy_reset_disable) { 2588*aa070789SRoy Zang /* Enable CRS on TX for half-duplex operation. */ 2589*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2590*aa070789SRoy Zang GG82563_PHY_MAC_SPEC_CTRL, &phy_data); 2591*aa070789SRoy Zang if (ret_val) 2592*aa070789SRoy Zang return ret_val; 2593*aa070789SRoy Zang 2594*aa070789SRoy Zang phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX; 2595*aa070789SRoy Zang /* Use 25MHz for both link down and 1000BASE-T for Tx clock */ 2596*aa070789SRoy Zang phy_data |= GG82563_MSCR_TX_CLK_1000MBPS_25MHZ; 2597*aa070789SRoy Zang 2598*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2599*aa070789SRoy Zang GG82563_PHY_MAC_SPEC_CTRL, phy_data); 2600*aa070789SRoy Zang if (ret_val) 2601*aa070789SRoy Zang return ret_val; 2602*aa070789SRoy Zang 2603*aa070789SRoy Zang /* Options: 2604*aa070789SRoy Zang * MDI/MDI-X = 0 (default) 2605*aa070789SRoy Zang * 0 - Auto for all speeds 2606*aa070789SRoy Zang * 1 - MDI mode 2607*aa070789SRoy Zang * 2 - MDI-X mode 2608*aa070789SRoy Zang * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) 2609*aa070789SRoy Zang */ 2610*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2611*aa070789SRoy Zang GG82563_PHY_SPEC_CTRL, &phy_data); 2612*aa070789SRoy Zang if (ret_val) 2613*aa070789SRoy Zang return ret_val; 2614*aa070789SRoy Zang 2615*aa070789SRoy Zang phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK; 2616*aa070789SRoy Zang 2617*aa070789SRoy Zang switch (hw->mdix) { 2618*aa070789SRoy Zang case 1: 2619*aa070789SRoy Zang phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDI; 2620*aa070789SRoy Zang break; 2621*aa070789SRoy Zang case 2: 2622*aa070789SRoy Zang phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDIX; 2623*aa070789SRoy Zang break; 2624*aa070789SRoy Zang case 0: 2625*aa070789SRoy Zang default: 2626*aa070789SRoy Zang phy_data |= GG82563_PSCR_CROSSOVER_MODE_AUTO; 2627*aa070789SRoy Zang break; 2628*aa070789SRoy Zang } 2629*aa070789SRoy Zang 2630*aa070789SRoy Zang /* Options: 2631*aa070789SRoy Zang * disable_polarity_correction = 0 (default) 2632*aa070789SRoy Zang * Automatic Correction for Reversed Cable Polarity 2633*aa070789SRoy Zang * 0 - Disabled 2634*aa070789SRoy Zang * 1 - Enabled 2635*aa070789SRoy Zang */ 2636*aa070789SRoy Zang phy_data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE; 2637*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2638*aa070789SRoy Zang GG82563_PHY_SPEC_CTRL, phy_data); 2639*aa070789SRoy Zang 2640*aa070789SRoy Zang if (ret_val) 2641*aa070789SRoy Zang return ret_val; 2642*aa070789SRoy Zang 2643*aa070789SRoy Zang /* SW Reset the PHY so all changes take effect */ 2644*aa070789SRoy Zang ret_val = e1000_phy_reset(hw); 2645*aa070789SRoy Zang if (ret_val) { 2646*aa070789SRoy Zang DEBUGOUT("Error Resetting the PHY\n"); 2647*aa070789SRoy Zang return ret_val; 2648*aa070789SRoy Zang } 2649*aa070789SRoy Zang } /* phy_reset_disable */ 2650*aa070789SRoy Zang 2651*aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 2652*aa070789SRoy Zang /* Bypass RX and TX FIFO's */ 2653*aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2654*aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL, 2655*aa070789SRoy Zang E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 2656*aa070789SRoy Zang | E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS); 2657*aa070789SRoy Zang if (ret_val) 2658*aa070789SRoy Zang return ret_val; 2659*aa070789SRoy Zang 2660*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2661*aa070789SRoy Zang GG82563_PHY_SPEC_CTRL_2, &phy_data); 2662*aa070789SRoy Zang if (ret_val) 2663*aa070789SRoy Zang return ret_val; 2664*aa070789SRoy Zang 2665*aa070789SRoy Zang phy_data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG; 2666*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2667*aa070789SRoy Zang GG82563_PHY_SPEC_CTRL_2, phy_data); 2668*aa070789SRoy Zang 2669*aa070789SRoy Zang if (ret_val) 2670*aa070789SRoy Zang return ret_val; 2671*aa070789SRoy Zang 2672*aa070789SRoy Zang reg_data = E1000_READ_REG(hw, CTRL_EXT); 2673*aa070789SRoy Zang reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK); 2674*aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, reg_data); 2675*aa070789SRoy Zang 2676*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2677*aa070789SRoy Zang GG82563_PHY_PWR_MGMT_CTRL, &phy_data); 2678*aa070789SRoy Zang if (ret_val) 2679*aa070789SRoy Zang return ret_val; 2680*aa070789SRoy Zang 2681*aa070789SRoy Zang /* Do not init these registers when the HW is in IAMT mode, since the 2682*aa070789SRoy Zang * firmware will have already initialized them. We only initialize 2683*aa070789SRoy Zang * them if the HW is not in IAMT mode. 2684*aa070789SRoy Zang */ 2685*aa070789SRoy Zang if (e1000_check_mng_mode(hw) == FALSE) { 2686*aa070789SRoy Zang /* Enable Electrical Idle on the PHY */ 2687*aa070789SRoy Zang phy_data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE; 2688*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2689*aa070789SRoy Zang GG82563_PHY_PWR_MGMT_CTRL, phy_data); 2690*aa070789SRoy Zang if (ret_val) 2691*aa070789SRoy Zang return ret_val; 2692*aa070789SRoy Zang 2693*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2694*aa070789SRoy Zang GG82563_PHY_KMRN_MODE_CTRL, &phy_data); 2695*aa070789SRoy Zang if (ret_val) 2696*aa070789SRoy Zang return ret_val; 2697*aa070789SRoy Zang 2698*aa070789SRoy Zang phy_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; 2699*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2700*aa070789SRoy Zang GG82563_PHY_KMRN_MODE_CTRL, phy_data); 2701*aa070789SRoy Zang 2702*aa070789SRoy Zang if (ret_val) 2703*aa070789SRoy Zang return ret_val; 2704*aa070789SRoy Zang } 2705*aa070789SRoy Zang 2706*aa070789SRoy Zang /* Workaround: Disable padding in Kumeran interface in the MAC 2707*aa070789SRoy Zang * and in the PHY to avoid CRC errors. 2708*aa070789SRoy Zang */ 2709*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2710*aa070789SRoy Zang GG82563_PHY_INBAND_CTRL, &phy_data); 2711*aa070789SRoy Zang if (ret_val) 2712*aa070789SRoy Zang return ret_val; 2713*aa070789SRoy Zang phy_data |= GG82563_ICR_DIS_PADDING; 2714*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2715*aa070789SRoy Zang GG82563_PHY_INBAND_CTRL, phy_data); 2716*aa070789SRoy Zang if (ret_val) 2717*aa070789SRoy Zang return ret_val; 2718*aa070789SRoy Zang } 2719*aa070789SRoy Zang return E1000_SUCCESS; 2720*aa070789SRoy Zang } 2721*aa070789SRoy Zang 2722*aa070789SRoy Zang /******************************************************************** 2723*aa070789SRoy Zang * Copper link setup for e1000_phy_m88 series. 2724*aa070789SRoy Zang * 2725*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2726*aa070789SRoy Zang *********************************************************************/ 2727*aa070789SRoy Zang static int32_t 2728*aa070789SRoy Zang e1000_copper_link_mgp_setup(struct e1000_hw *hw) 2729*aa070789SRoy Zang { 2730*aa070789SRoy Zang int32_t ret_val; 2731*aa070789SRoy Zang uint16_t phy_data; 2732*aa070789SRoy Zang 2733*aa070789SRoy Zang DEBUGFUNC(); 2734*aa070789SRoy Zang 2735*aa070789SRoy Zang if (hw->phy_reset_disable) 2736*aa070789SRoy Zang return E1000_SUCCESS; 2737*aa070789SRoy Zang 2738*aa070789SRoy Zang /* Enable CRS on TX. This must be set for half-duplex operation. */ 2739*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); 2740*aa070789SRoy Zang if (ret_val) 2741*aa070789SRoy Zang return ret_val; 2742*aa070789SRoy Zang 27432439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; 27442439e4bfSJean-Christophe PLAGNIOL-VILLARD 27452439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Options: 27462439e4bfSJean-Christophe PLAGNIOL-VILLARD * MDI/MDI-X = 0 (default) 27472439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 - Auto for all speeds 27482439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 - MDI mode 27492439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2 - MDI-X mode 27502439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) 27512439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 27522439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; 2753*aa070789SRoy Zang 27542439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->mdix) { 27552439e4bfSJean-Christophe PLAGNIOL-VILLARD case 1: 27562439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE; 27572439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27582439e4bfSJean-Christophe PLAGNIOL-VILLARD case 2: 27592439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE; 27602439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27612439e4bfSJean-Christophe PLAGNIOL-VILLARD case 3: 27622439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_AUTO_X_1000T; 27632439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27642439e4bfSJean-Christophe PLAGNIOL-VILLARD case 0: 27652439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 27662439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_AUTO_X_MODE; 27672439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27682439e4bfSJean-Christophe PLAGNIOL-VILLARD } 27692439e4bfSJean-Christophe PLAGNIOL-VILLARD 27702439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Options: 27712439e4bfSJean-Christophe PLAGNIOL-VILLARD * disable_polarity_correction = 0 (default) 27722439e4bfSJean-Christophe PLAGNIOL-VILLARD * Automatic Correction for Reversed Cable Polarity 27732439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 - Disabled 27742439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 - Enabled 27752439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 27762439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; 2777*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); 2778*aa070789SRoy Zang if (ret_val) 2779*aa070789SRoy Zang return ret_val; 27802439e4bfSJean-Christophe PLAGNIOL-VILLARD 2781*aa070789SRoy Zang if (hw->phy_revision < M88E1011_I_REV_4) { 27822439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Force TX_CLK in the Extended PHY Specific Control Register 27832439e4bfSJean-Christophe PLAGNIOL-VILLARD * to 25MHz clock. 27842439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2785*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2786*aa070789SRoy Zang M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); 2787*aa070789SRoy Zang if (ret_val) 2788*aa070789SRoy Zang return ret_val; 2789*aa070789SRoy Zang 27902439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_EPSCR_TX_CLK_25; 2791*aa070789SRoy Zang 2792*aa070789SRoy Zang if ((hw->phy_revision == E1000_REVISION_2) && 2793*aa070789SRoy Zang (hw->phy_id == M88E1111_I_PHY_ID)) { 2794*aa070789SRoy Zang /* Vidalia Phy, set the downshift counter to 5x */ 2795*aa070789SRoy Zang phy_data &= ~(M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK); 2796*aa070789SRoy Zang phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X; 2797*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2798*aa070789SRoy Zang M88E1000_EXT_PHY_SPEC_CTRL, phy_data); 2799*aa070789SRoy Zang if (ret_val) 2800*aa070789SRoy Zang return ret_val; 2801*aa070789SRoy Zang } else { 28022439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Configure Master and Slave downshift values */ 2803*aa070789SRoy Zang phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK 2804*aa070789SRoy Zang | M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); 2805*aa070789SRoy Zang phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X 2806*aa070789SRoy Zang | M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); 2807*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2808*aa070789SRoy Zang M88E1000_EXT_PHY_SPEC_CTRL, phy_data); 2809*aa070789SRoy Zang if (ret_val) 2810*aa070789SRoy Zang return ret_val; 2811*aa070789SRoy Zang } 28122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 28132439e4bfSJean-Christophe PLAGNIOL-VILLARD 28142439e4bfSJean-Christophe PLAGNIOL-VILLARD /* SW Reset the PHY so all changes take effect */ 28152439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_phy_reset(hw); 2816*aa070789SRoy Zang if (ret_val) { 28172439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error Resetting the PHY\n"); 28182439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 28192439e4bfSJean-Christophe PLAGNIOL-VILLARD } 28202439e4bfSJean-Christophe PLAGNIOL-VILLARD 2821*aa070789SRoy Zang return E1000_SUCCESS; 2822*aa070789SRoy Zang } 28232439e4bfSJean-Christophe PLAGNIOL-VILLARD 2824*aa070789SRoy Zang /******************************************************************** 2825*aa070789SRoy Zang * Setup auto-negotiation and flow control advertisements, 2826*aa070789SRoy Zang * and then perform auto-negotiation. 2827*aa070789SRoy Zang * 2828*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2829*aa070789SRoy Zang *********************************************************************/ 2830*aa070789SRoy Zang static int32_t 2831*aa070789SRoy Zang e1000_copper_link_autoneg(struct e1000_hw *hw) 2832*aa070789SRoy Zang { 2833*aa070789SRoy Zang int32_t ret_val; 2834*aa070789SRoy Zang uint16_t phy_data; 2835*aa070789SRoy Zang 2836*aa070789SRoy Zang DEBUGFUNC(); 2837*aa070789SRoy Zang 28382439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Perform some bounds checking on the hw->autoneg_advertised 28392439e4bfSJean-Christophe PLAGNIOL-VILLARD * parameter. If this variable is zero, then set it to the default. 28402439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 28412439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT; 28422439e4bfSJean-Christophe PLAGNIOL-VILLARD 28432439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If autoneg_advertised is zero, we assume it was not defaulted 28442439e4bfSJean-Christophe PLAGNIOL-VILLARD * by the calling code so we set to advertise full capability. 28452439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 28462439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised == 0) 28472439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; 28482439e4bfSJean-Christophe PLAGNIOL-VILLARD 2849*aa070789SRoy Zang /* IFE phy only supports 10/100 */ 2850*aa070789SRoy Zang if (hw->phy_type == e1000_phy_ife) 2851*aa070789SRoy Zang hw->autoneg_advertised &= AUTONEG_ADVERTISE_10_100_ALL; 2852*aa070789SRoy Zang 28532439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); 28542439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_phy_setup_autoneg(hw); 2855*aa070789SRoy Zang if (ret_val) { 28562439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error Setting up Auto-Negotiation\n"); 28572439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 28582439e4bfSJean-Christophe PLAGNIOL-VILLARD } 28592439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Restarting Auto-Neg\n"); 28602439e4bfSJean-Christophe PLAGNIOL-VILLARD 28612439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Restart auto-negotiation by setting the Auto Neg Enable bit and 28622439e4bfSJean-Christophe PLAGNIOL-VILLARD * the Auto Neg Restart bit in the PHY control register. 28632439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2864*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data); 2865*aa070789SRoy Zang if (ret_val) 2866*aa070789SRoy Zang return ret_val; 2867*aa070789SRoy Zang 28682439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); 2869*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data); 2870*aa070789SRoy Zang if (ret_val) 2871*aa070789SRoy Zang return ret_val; 2872*aa070789SRoy Zang 28732439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Does the user want to wait for Auto-Neg to complete here, or 28742439e4bfSJean-Christophe PLAGNIOL-VILLARD * check at a later time (for example, callback routine). 28752439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 28762439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we do not wait for autonegtation to complete I 28772439e4bfSJean-Christophe PLAGNIOL-VILLARD * do not see a valid link status. 2878*aa070789SRoy Zang * wait_autoneg_complete = 1 . 28792439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2880*aa070789SRoy Zang if (hw->wait_autoneg_complete) { 28812439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_wait_autoneg(hw); 2882*aa070789SRoy Zang if (ret_val) { 2883*aa070789SRoy Zang DEBUGOUT("Error while waiting for autoneg" 2884*aa070789SRoy Zang "to complete\n"); 28852439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 28862439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2887*aa070789SRoy Zang } 28882439e4bfSJean-Christophe PLAGNIOL-VILLARD 2889*aa070789SRoy Zang hw->get_link_status = TRUE; 2890*aa070789SRoy Zang 2891*aa070789SRoy Zang return E1000_SUCCESS; 28922439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2893*aa070789SRoy Zang 2894*aa070789SRoy Zang /****************************************************************************** 2895*aa070789SRoy Zang * Config the MAC and the PHY after link is up. 28962439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1) Set up the MAC to the current PHY speed/duplex 28972439e4bfSJean-Christophe PLAGNIOL-VILLARD * if we are on 82543. If we 28982439e4bfSJean-Christophe PLAGNIOL-VILLARD * are on newer silicon, we only need to configure 28992439e4bfSJean-Christophe PLAGNIOL-VILLARD * collision distance in the Transmit Control Register. 29002439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2) Set up flow control on the MAC to that established with 29012439e4bfSJean-Christophe PLAGNIOL-VILLARD * the link partner. 2902*aa070789SRoy Zang * 3) Config DSP to improve Gigabit link quality for some PHY revisions. 2903*aa070789SRoy Zang * 2904*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2905*aa070789SRoy Zang ******************************************************************************/ 2906*aa070789SRoy Zang static int32_t 2907*aa070789SRoy Zang e1000_copper_link_postconfig(struct e1000_hw *hw) 2908*aa070789SRoy Zang { 2909*aa070789SRoy Zang int32_t ret_val; 2910*aa070789SRoy Zang DEBUGFUNC(); 2911*aa070789SRoy Zang 29122439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82544) { 29132439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 29142439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 29152439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_mac_to_phy(hw); 2916*aa070789SRoy Zang if (ret_val) { 2917*aa070789SRoy Zang DEBUGOUT("Error configuring MAC to PHY settings\n"); 29182439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 29192439e4bfSJean-Christophe PLAGNIOL-VILLARD } 29202439e4bfSJean-Christophe PLAGNIOL-VILLARD } 29212439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_fc_after_link_up(hw); 2922*aa070789SRoy Zang if (ret_val) { 29232439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error Configuring Flow Control\n"); 29242439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 29252439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2926*aa070789SRoy Zang return E1000_SUCCESS; 2927*aa070789SRoy Zang } 2928*aa070789SRoy Zang 2929*aa070789SRoy Zang /****************************************************************************** 2930*aa070789SRoy Zang * Detects which PHY is present and setup the speed and duplex 2931*aa070789SRoy Zang * 2932*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2933*aa070789SRoy Zang ******************************************************************************/ 2934*aa070789SRoy Zang static int 2935*aa070789SRoy Zang e1000_setup_copper_link(struct eth_device *nic) 2936*aa070789SRoy Zang { 2937*aa070789SRoy Zang struct e1000_hw *hw = nic->priv; 2938*aa070789SRoy Zang int32_t ret_val; 2939*aa070789SRoy Zang uint16_t i; 2940*aa070789SRoy Zang uint16_t phy_data; 2941*aa070789SRoy Zang uint16_t reg_data; 2942*aa070789SRoy Zang 2943*aa070789SRoy Zang DEBUGFUNC(); 2944*aa070789SRoy Zang 2945*aa070789SRoy Zang switch (hw->mac_type) { 2946*aa070789SRoy Zang case e1000_80003es2lan: 2947*aa070789SRoy Zang case e1000_ich8lan: 2948*aa070789SRoy Zang /* Set the mac to wait the maximum time between each 2949*aa070789SRoy Zang * iteration and increase the max iterations when 2950*aa070789SRoy Zang * polling the phy; this fixes erroneous timeouts at 10Mbps. */ 2951*aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2952*aa070789SRoy Zang GG82563_REG(0x34, 4), 0xFFFF); 2953*aa070789SRoy Zang if (ret_val) 2954*aa070789SRoy Zang return ret_val; 2955*aa070789SRoy Zang ret_val = e1000_read_kmrn_reg(hw, 2956*aa070789SRoy Zang GG82563_REG(0x34, 9), ®_data); 2957*aa070789SRoy Zang if (ret_val) 2958*aa070789SRoy Zang return ret_val; 2959*aa070789SRoy Zang reg_data |= 0x3F; 2960*aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2961*aa070789SRoy Zang GG82563_REG(0x34, 9), reg_data); 2962*aa070789SRoy Zang if (ret_val) 2963*aa070789SRoy Zang return ret_val; 2964*aa070789SRoy Zang default: 2965*aa070789SRoy Zang break; 2966*aa070789SRoy Zang } 2967*aa070789SRoy Zang 2968*aa070789SRoy Zang /* Check if it is a valid PHY and set PHY mode if necessary. */ 2969*aa070789SRoy Zang ret_val = e1000_copper_link_preconfig(hw); 2970*aa070789SRoy Zang if (ret_val) 2971*aa070789SRoy Zang return ret_val; 2972*aa070789SRoy Zang switch (hw->mac_type) { 2973*aa070789SRoy Zang case e1000_80003es2lan: 2974*aa070789SRoy Zang /* Kumeran registers are written-only */ 2975*aa070789SRoy Zang reg_data = 2976*aa070789SRoy Zang E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT; 2977*aa070789SRoy Zang reg_data |= E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING; 2978*aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2979*aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_INB_CTRL, reg_data); 2980*aa070789SRoy Zang if (ret_val) 2981*aa070789SRoy Zang return ret_val; 2982*aa070789SRoy Zang break; 2983*aa070789SRoy Zang default: 2984*aa070789SRoy Zang break; 2985*aa070789SRoy Zang } 2986*aa070789SRoy Zang 2987*aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp || 2988*aa070789SRoy Zang hw->phy_type == e1000_phy_igp_3 || 2989*aa070789SRoy Zang hw->phy_type == e1000_phy_igp_2) { 2990*aa070789SRoy Zang ret_val = e1000_copper_link_igp_setup(hw); 2991*aa070789SRoy Zang if (ret_val) 2992*aa070789SRoy Zang return ret_val; 2993*aa070789SRoy Zang } else if (hw->phy_type == e1000_phy_m88) { 2994*aa070789SRoy Zang ret_val = e1000_copper_link_mgp_setup(hw); 2995*aa070789SRoy Zang if (ret_val) 2996*aa070789SRoy Zang return ret_val; 2997*aa070789SRoy Zang } else if (hw->phy_type == e1000_phy_gg82563) { 2998*aa070789SRoy Zang ret_val = e1000_copper_link_ggp_setup(hw); 2999*aa070789SRoy Zang if (ret_val) 3000*aa070789SRoy Zang return ret_val; 3001*aa070789SRoy Zang } 3002*aa070789SRoy Zang 3003*aa070789SRoy Zang /* always auto */ 3004*aa070789SRoy Zang /* Setup autoneg and flow control advertisement 3005*aa070789SRoy Zang * and perform autonegotiation */ 3006*aa070789SRoy Zang ret_val = e1000_copper_link_autoneg(hw); 3007*aa070789SRoy Zang if (ret_val) 3008*aa070789SRoy Zang return ret_val; 3009*aa070789SRoy Zang 3010*aa070789SRoy Zang /* Check link status. Wait up to 100 microseconds for link to become 3011*aa070789SRoy Zang * valid. 3012*aa070789SRoy Zang */ 3013*aa070789SRoy Zang for (i = 0; i < 10; i++) { 3014*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data); 3015*aa070789SRoy Zang if (ret_val) 3016*aa070789SRoy Zang return ret_val; 3017*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data); 3018*aa070789SRoy Zang if (ret_val) 3019*aa070789SRoy Zang return ret_val; 3020*aa070789SRoy Zang 3021*aa070789SRoy Zang if (phy_data & MII_SR_LINK_STATUS) { 3022*aa070789SRoy Zang /* Config the MAC and PHY after link is up */ 3023*aa070789SRoy Zang ret_val = e1000_copper_link_postconfig(hw); 3024*aa070789SRoy Zang if (ret_val) 3025*aa070789SRoy Zang return ret_val; 3026*aa070789SRoy Zang 30272439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Valid link established!!!\n"); 3028*aa070789SRoy Zang return E1000_SUCCESS; 30292439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30302439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 30312439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30322439e4bfSJean-Christophe PLAGNIOL-VILLARD 30332439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Unable to establish link!!!\n"); 3034*aa070789SRoy Zang return E1000_SUCCESS; 30352439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30362439e4bfSJean-Christophe PLAGNIOL-VILLARD 30372439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 30382439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configures PHY autoneg and flow control advertisement settings 30392439e4bfSJean-Christophe PLAGNIOL-VILLARD * 30402439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 30412439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 3042*aa070789SRoy Zang int32_t 30432439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_phy_setup_autoneg(struct e1000_hw *hw) 30442439e4bfSJean-Christophe PLAGNIOL-VILLARD { 3045*aa070789SRoy Zang int32_t ret_val; 30462439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_autoneg_adv_reg; 30472439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_1000t_ctrl_reg; 30482439e4bfSJean-Christophe PLAGNIOL-VILLARD 30492439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 30502439e4bfSJean-Christophe PLAGNIOL-VILLARD 30512439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII Auto-Neg Advertisement Register (Address 4). */ 3052*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg); 3053*aa070789SRoy Zang if (ret_val) 3054*aa070789SRoy Zang return ret_val; 30552439e4bfSJean-Christophe PLAGNIOL-VILLARD 3056*aa070789SRoy Zang if (hw->phy_type != e1000_phy_ife) { 30572439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII 1000Base-T Control Register (Address 9). */ 3058*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, 3059*aa070789SRoy Zang &mii_1000t_ctrl_reg); 3060*aa070789SRoy Zang if (ret_val) 3061*aa070789SRoy Zang return ret_val; 3062*aa070789SRoy Zang } else 3063*aa070789SRoy Zang mii_1000t_ctrl_reg = 0; 30642439e4bfSJean-Christophe PLAGNIOL-VILLARD 30652439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Need to parse both autoneg_advertised and fc and set up 30662439e4bfSJean-Christophe PLAGNIOL-VILLARD * the appropriate PHY registers. First we will parse for 30672439e4bfSJean-Christophe PLAGNIOL-VILLARD * autoneg_advertised software override. Since we can advertise 30682439e4bfSJean-Christophe PLAGNIOL-VILLARD * a plethora of combinations, we need to check each bit 30692439e4bfSJean-Christophe PLAGNIOL-VILLARD * individually. 30702439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 30712439e4bfSJean-Christophe PLAGNIOL-VILLARD 30722439e4bfSJean-Christophe PLAGNIOL-VILLARD /* First we clear all the 10/100 mb speed bits in the Auto-Neg 30732439e4bfSJean-Christophe PLAGNIOL-VILLARD * Advertisement Register (Address 4) and the 1000 mb speed bits in 30742439e4bfSJean-Christophe PLAGNIOL-VILLARD * the 1000Base-T Control Register (Address 9). 30752439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 30762439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg &= ~REG4_SPEED_MASK; 30772439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_1000t_ctrl_reg &= ~REG9_SPEED_MASK; 30782439e4bfSJean-Christophe PLAGNIOL-VILLARD 30792439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("autoneg_advertised %x\n", hw->autoneg_advertised); 30802439e4bfSJean-Christophe PLAGNIOL-VILLARD 30812439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 10 Mb Half Duplex? */ 30822439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_10_HALF) { 30832439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 10mb Half duplex\n"); 30842439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS; 30852439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30862439e4bfSJean-Christophe PLAGNIOL-VILLARD 30872439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 10 Mb Full Duplex? */ 30882439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_10_FULL) { 30892439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 10mb Full duplex\n"); 30902439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS; 30912439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30922439e4bfSJean-Christophe PLAGNIOL-VILLARD 30932439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 100 Mb Half Duplex? */ 30942439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_100_HALF) { 30952439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 100mb Half duplex\n"); 30962439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS; 30972439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30982439e4bfSJean-Christophe PLAGNIOL-VILLARD 30992439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 100 Mb Full Duplex? */ 31002439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_100_FULL) { 31012439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 100mb Full duplex\n"); 31022439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS; 31032439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31042439e4bfSJean-Christophe PLAGNIOL-VILLARD 31052439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We do not allow the Phy to advertise 1000 Mb Half Duplex */ 31062439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_1000_HALF) { 31072439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 31082439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Advertise 1000mb Half duplex requested, request denied!\n"); 31092439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31102439e4bfSJean-Christophe PLAGNIOL-VILLARD 31112439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 1000 Mb Full Duplex? */ 31122439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_1000_FULL) { 31132439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 1000mb Full duplex\n"); 31142439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS; 31152439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31162439e4bfSJean-Christophe PLAGNIOL-VILLARD 31172439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for a software override of the flow control settings, and 31182439e4bfSJean-Christophe PLAGNIOL-VILLARD * setup the PHY advertisement registers accordingly. If 31192439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation is enabled, then software will have to set the 31202439e4bfSJean-Christophe PLAGNIOL-VILLARD * "PAUSE" bits to the correct value in the Auto-Negotiation 31212439e4bfSJean-Christophe PLAGNIOL-VILLARD * Advertisement Register (PHY_AUTONEG_ADV) and re-start auto-negotiation. 31222439e4bfSJean-Christophe PLAGNIOL-VILLARD * 31232439e4bfSJean-Christophe PLAGNIOL-VILLARD * The possible values of the "fc" parameter are: 31242439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0: Flow control is completely disabled 31252439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1: Rx flow control is enabled (we can receive pause frames 31262439e4bfSJean-Christophe PLAGNIOL-VILLARD * but not send pause frames). 31272439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2: Tx flow control is enabled (we can send pause frames 31282439e4bfSJean-Christophe PLAGNIOL-VILLARD * but we do not support receiving pause frames). 31292439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3: Both Rx and TX flow control (symmetric) are enabled. 31302439e4bfSJean-Christophe PLAGNIOL-VILLARD * other: No software override. The flow control configuration 31312439e4bfSJean-Christophe PLAGNIOL-VILLARD * in the EEPROM is used. 31322439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31332439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->fc) { 31342439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_none: /* 0 */ 31352439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control (RX & TX) is completely disabled by a 31362439e4bfSJean-Christophe PLAGNIOL-VILLARD * software over-ride. 31372439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31382439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); 31392439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31402439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_rx_pause: /* 1 */ 31412439e4bfSJean-Christophe PLAGNIOL-VILLARD /* RX Flow control is enabled, and TX Flow control is 31422439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabled, by a software over-ride. 31432439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31442439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Since there really isn't a way to advertise that we are 31452439e4bfSJean-Christophe PLAGNIOL-VILLARD * capable of RX Pause ONLY, we will advertise that we 31462439e4bfSJean-Christophe PLAGNIOL-VILLARD * support both symmetric and asymmetric RX PAUSE. Later 31472439e4bfSJean-Christophe PLAGNIOL-VILLARD * (in e1000_config_fc_after_link_up) we will disable the 31482439e4bfSJean-Christophe PLAGNIOL-VILLARD *hw's ability to send PAUSE frames. 31492439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31502439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); 31512439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31522439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_tx_pause: /* 2 */ 31532439e4bfSJean-Christophe PLAGNIOL-VILLARD /* TX Flow control is enabled, and RX Flow control is 31542439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabled, by a software over-ride. 31552439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31562439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR; 31572439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg &= ~NWAY_AR_PAUSE; 31582439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31592439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_full: /* 3 */ 31602439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control (both RX and TX) is enabled by a software 31612439e4bfSJean-Christophe PLAGNIOL-VILLARD * over-ride. 31622439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31632439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); 31642439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31652439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 31662439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow control param set incorrectly\n"); 31672439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 31682439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31692439e4bfSJean-Christophe PLAGNIOL-VILLARD 3170*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg); 3171*aa070789SRoy Zang if (ret_val) 3172*aa070789SRoy Zang return ret_val; 31732439e4bfSJean-Christophe PLAGNIOL-VILLARD 31742439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); 31752439e4bfSJean-Christophe PLAGNIOL-VILLARD 3176*aa070789SRoy Zang if (hw->phy_type != e1000_phy_ife) { 3177*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, 3178*aa070789SRoy Zang mii_1000t_ctrl_reg); 3179*aa070789SRoy Zang if (ret_val) 3180*aa070789SRoy Zang return ret_val; 31812439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3182*aa070789SRoy Zang 3183*aa070789SRoy Zang return E1000_SUCCESS; 31842439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31852439e4bfSJean-Christophe PLAGNIOL-VILLARD 31862439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 31872439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets the collision distance in the Transmit Control register 31882439e4bfSJean-Christophe PLAGNIOL-VILLARD * 31892439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 31902439e4bfSJean-Christophe PLAGNIOL-VILLARD * 31912439e4bfSJean-Christophe PLAGNIOL-VILLARD * Link should have been established previously. Reads the speed and duplex 31922439e4bfSJean-Christophe PLAGNIOL-VILLARD * information from the Device Status register. 31932439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 31942439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 31952439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(struct e1000_hw *hw) 31962439e4bfSJean-Christophe PLAGNIOL-VILLARD { 3197*aa070789SRoy Zang uint32_t tctl, coll_dist; 3198*aa070789SRoy Zang 3199*aa070789SRoy Zang DEBUGFUNC(); 3200*aa070789SRoy Zang 3201*aa070789SRoy Zang if (hw->mac_type < e1000_82543) 3202*aa070789SRoy Zang coll_dist = E1000_COLLISION_DISTANCE_82542; 3203*aa070789SRoy Zang else 3204*aa070789SRoy Zang coll_dist = E1000_COLLISION_DISTANCE; 32052439e4bfSJean-Christophe PLAGNIOL-VILLARD 32062439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl = E1000_READ_REG(hw, TCTL); 32072439e4bfSJean-Christophe PLAGNIOL-VILLARD 32082439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl &= ~E1000_TCTL_COLD; 3209*aa070789SRoy Zang tctl |= coll_dist << E1000_COLD_SHIFT; 32102439e4bfSJean-Christophe PLAGNIOL-VILLARD 32112439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TCTL, tctl); 32122439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 32132439e4bfSJean-Christophe PLAGNIOL-VILLARD } 32142439e4bfSJean-Christophe PLAGNIOL-VILLARD 32152439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 32162439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets MAC speed and duplex settings to reflect the those in the PHY 32172439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32182439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 32192439e4bfSJean-Christophe PLAGNIOL-VILLARD * mii_reg - data to write to the MII control register 32202439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32212439e4bfSJean-Christophe PLAGNIOL-VILLARD * The contents of the PHY register containing the needed information need to 32222439e4bfSJean-Christophe PLAGNIOL-VILLARD * be passed in. 32232439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 32242439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 32252439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_mac_to_phy(struct e1000_hw *hw) 32262439e4bfSJean-Christophe PLAGNIOL-VILLARD { 32272439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 32282439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 32292439e4bfSJean-Christophe PLAGNIOL-VILLARD 32302439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 32312439e4bfSJean-Christophe PLAGNIOL-VILLARD 32322439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the Device Control Register and set the bits to Force Speed 32332439e4bfSJean-Christophe PLAGNIOL-VILLARD * and Duplex. 32342439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 32352439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 32362439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 32372439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS); 32382439e4bfSJean-Christophe PLAGNIOL-VILLARD 32392439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up duplex in the Device Control and Transmit Control 32402439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers depending on negotiated values. 32412439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 32422439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data) < 0) { 32432439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 32442439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 32452439e4bfSJean-Christophe PLAGNIOL-VILLARD } 32462439e4bfSJean-Christophe PLAGNIOL-VILLARD if (phy_data & M88E1000_PSSR_DPLX) 32472439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_FD; 32482439e4bfSJean-Christophe PLAGNIOL-VILLARD else 32492439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_FD; 32502439e4bfSJean-Christophe PLAGNIOL-VILLARD 32512439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 32522439e4bfSJean-Christophe PLAGNIOL-VILLARD 32532439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up speed in the Device Control register depending on 32542439e4bfSJean-Christophe PLAGNIOL-VILLARD * negotiated values. 32552439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 32562439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) 32572439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_SPD_1000; 32582439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS) 32592439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_SPD_100; 32602439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Write the configured values back to the Device Control Reg. */ 32612439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 32622439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 32632439e4bfSJean-Christophe PLAGNIOL-VILLARD } 32642439e4bfSJean-Christophe PLAGNIOL-VILLARD 32652439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 32662439e4bfSJean-Christophe PLAGNIOL-VILLARD * Forces the MAC's flow control settings. 32672439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32682439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 32692439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32702439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets the TFCE and RFCE bits in the device control register to reflect 32712439e4bfSJean-Christophe PLAGNIOL-VILLARD * the adapter settings. TFCE and RFCE need to be explicitly set by 32722439e4bfSJean-Christophe PLAGNIOL-VILLARD * software when a Copper PHY is used because autonegotiation is managed 32732439e4bfSJean-Christophe PLAGNIOL-VILLARD * by the PHY rather than the MAC. Software must also configure these 32742439e4bfSJean-Christophe PLAGNIOL-VILLARD * bits when link is forced on a fiber connection. 32752439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 32762439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 32772439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_force_mac_fc(struct e1000_hw *hw) 32782439e4bfSJean-Christophe PLAGNIOL-VILLARD { 32792439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 32802439e4bfSJean-Christophe PLAGNIOL-VILLARD 32812439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 32822439e4bfSJean-Christophe PLAGNIOL-VILLARD 32832439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Get the current configuration of the Device Control Register */ 32842439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 32852439e4bfSJean-Christophe PLAGNIOL-VILLARD 32862439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Because we didn't get link via the internal auto-negotiation 32872439e4bfSJean-Christophe PLAGNIOL-VILLARD * mechanism (we either forced link or we got link via PHY 32882439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-neg), we have to manually enable/disable transmit an 32892439e4bfSJean-Christophe PLAGNIOL-VILLARD * receive flow control. 32902439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32912439e4bfSJean-Christophe PLAGNIOL-VILLARD * The "Case" statement below enables/disable flow control 32922439e4bfSJean-Christophe PLAGNIOL-VILLARD * according to the "hw->fc" parameter. 32932439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32942439e4bfSJean-Christophe PLAGNIOL-VILLARD * The possible values of the "fc" parameter are: 32952439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0: Flow control is completely disabled 32962439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1: Rx flow control is enabled (we can receive pause 32972439e4bfSJean-Christophe PLAGNIOL-VILLARD * frames but not send pause frames). 32982439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2: Tx flow control is enabled (we can send pause frames 32992439e4bfSJean-Christophe PLAGNIOL-VILLARD * frames but we do not receive pause frames). 33002439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3: Both Rx and TX flow control (symmetric) is enabled. 33012439e4bfSJean-Christophe PLAGNIOL-VILLARD * other: No other values should be possible at this point. 33022439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 33032439e4bfSJean-Christophe PLAGNIOL-VILLARD 33042439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->fc) { 33052439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_none: 33062439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE)); 33072439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33082439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_rx_pause: 33092439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~E1000_CTRL_TFCE); 33102439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_RFCE; 33112439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33122439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_tx_pause: 33132439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~E1000_CTRL_RFCE); 33142439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_TFCE; 33152439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33162439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_full: 33172439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE); 33182439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33192439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 33202439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow control param set incorrectly\n"); 33212439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 33222439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33232439e4bfSJean-Christophe PLAGNIOL-VILLARD 33242439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disable TX Flow Control for 82542 (rev 2.0) */ 33252439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) 33262439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~E1000_CTRL_TFCE); 33272439e4bfSJean-Christophe PLAGNIOL-VILLARD 33282439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 33292439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 33302439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33312439e4bfSJean-Christophe PLAGNIOL-VILLARD 33322439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 33332439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configures flow control settings after link is established 33342439e4bfSJean-Christophe PLAGNIOL-VILLARD * 33352439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 33362439e4bfSJean-Christophe PLAGNIOL-VILLARD * 33372439e4bfSJean-Christophe PLAGNIOL-VILLARD * Should be called immediately after a valid link has been established. 33382439e4bfSJean-Christophe PLAGNIOL-VILLARD * Forces MAC flow control settings if link was forced. When in MII/GMII mode 33392439e4bfSJean-Christophe PLAGNIOL-VILLARD * and autonegotiation is enabled, the MAC flow control settings will be set 33402439e4bfSJean-Christophe PLAGNIOL-VILLARD * based on the flow control negotiated by the PHY. In TBI mode, the TFCE 33412439e4bfSJean-Christophe PLAGNIOL-VILLARD * and RFCE bits will be automaticaly set to the negotiated flow control mode. 33422439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 3343*aa070789SRoy Zang static int32_t 33442439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_fc_after_link_up(struct e1000_hw *hw) 33452439e4bfSJean-Christophe PLAGNIOL-VILLARD { 33462439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 33472439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_status_reg; 33482439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_nway_adv_reg; 33492439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_nway_lp_ability_reg; 33502439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t speed; 33512439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t duplex; 33522439e4bfSJean-Christophe PLAGNIOL-VILLARD 33532439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 33542439e4bfSJean-Christophe PLAGNIOL-VILLARD 33552439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for the case where we have fiber media and auto-neg failed 33562439e4bfSJean-Christophe PLAGNIOL-VILLARD * so we had to force link. In this case, we need to force the 33572439e4bfSJean-Christophe PLAGNIOL-VILLARD * configuration of the MAC to match the "fc" parameter. 33582439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 3359*aa070789SRoy Zang if (((hw->media_type == e1000_media_type_fiber) && (hw->autoneg_failed)) 3360*aa070789SRoy Zang || ((hw->media_type == e1000_media_type_internal_serdes) 3361*aa070789SRoy Zang && (hw->autoneg_failed)) 3362*aa070789SRoy Zang || ((hw->media_type == e1000_media_type_copper) 3363*aa070789SRoy Zang && (!hw->autoneg))) { 33642439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_force_mac_fc(hw); 33652439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 33662439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error forcing flow control settings\n"); 33672439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 33682439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33692439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33702439e4bfSJean-Christophe PLAGNIOL-VILLARD 33712439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for the case where we have copper media and auto-neg is 33722439e4bfSJean-Christophe PLAGNIOL-VILLARD * enabled. In this case, we need to check and see if Auto-Neg 33732439e4bfSJean-Christophe PLAGNIOL-VILLARD * has completed, and if so, how the PHY and link partner has 33742439e4bfSJean-Christophe PLAGNIOL-VILLARD * flow control configured. 33752439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 33762439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->media_type == e1000_media_type_copper) { 33772439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII Status Register and check to see if AutoNeg 33782439e4bfSJean-Christophe PLAGNIOL-VILLARD * has completed. We read this twice because this reg has 33792439e4bfSJean-Christophe PLAGNIOL-VILLARD * some "sticky" (latched) bits. 33802439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 33812439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { 33822439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error \n"); 33832439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 33842439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33852439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { 33862439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error \n"); 33872439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 33882439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33892439e4bfSJean-Christophe PLAGNIOL-VILLARD 33902439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mii_status_reg & MII_SR_AUTONEG_COMPLETE) { 33912439e4bfSJean-Christophe PLAGNIOL-VILLARD /* The AutoNeg process has completed, so we now need to 33922439e4bfSJean-Christophe PLAGNIOL-VILLARD * read both the Auto Negotiation Advertisement Register 33932439e4bfSJean-Christophe PLAGNIOL-VILLARD * (Address 4) and the Auto_Negotiation Base Page Ability 33942439e4bfSJean-Christophe PLAGNIOL-VILLARD * Register (Address 5) to determine how flow control was 33952439e4bfSJean-Christophe PLAGNIOL-VILLARD * negotiated. 33962439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 33972439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg 33982439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg) < 0) { 33992439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 34002439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 34012439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34022439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg 34032439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw, PHY_LP_ABILITY, 34042439e4bfSJean-Christophe PLAGNIOL-VILLARD &mii_nway_lp_ability_reg) < 0) { 34052439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 34062439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 34072439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34082439e4bfSJean-Christophe PLAGNIOL-VILLARD 34092439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Two bits in the Auto Negotiation Advertisement Register 34102439e4bfSJean-Christophe PLAGNIOL-VILLARD * (Address 4) and two bits in the Auto Negotiation Base 34112439e4bfSJean-Christophe PLAGNIOL-VILLARD * Page Ability Register (Address 5) determine flow control 34122439e4bfSJean-Christophe PLAGNIOL-VILLARD * for both the PHY and the link partner. The following 34132439e4bfSJean-Christophe PLAGNIOL-VILLARD * table, taken out of the IEEE 802.3ab/D6.0 dated March 25, 34142439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1999, describes these PAUSE resolution bits and how flow 34152439e4bfSJean-Christophe PLAGNIOL-VILLARD * control is determined based upon these settings. 34162439e4bfSJean-Christophe PLAGNIOL-VILLARD * NOTE: DC = Don't Care 34172439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34182439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34192439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution 34202439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34212439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 0 | DC | DC | e1000_fc_none 34222439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 0 | DC | e1000_fc_none 34232439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 1 | 0 | e1000_fc_none 34242439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 34252439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 0 | 0 | DC | e1000_fc_none 34262439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | DC | 1 | DC | e1000_fc_full 34272439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 1 | 0 | 0 | e1000_fc_none 34282439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 34292439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34302439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34312439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Are both PAUSE bits set to 1? If so, this implies 34322439e4bfSJean-Christophe PLAGNIOL-VILLARD * Symmetric Flow Control is enabled at both ends. The 34332439e4bfSJean-Christophe PLAGNIOL-VILLARD * ASM_DIR bits are irrelevant per the spec. 34342439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34352439e4bfSJean-Christophe PLAGNIOL-VILLARD * For Symmetric Flow Control: 34362439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34372439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34382439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 34392439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34402439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | DC | 1 | DC | e1000_fc_full 34412439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34422439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34432439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && 34442439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) { 34452439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now we need to check if the user selected RX ONLY 34462439e4bfSJean-Christophe PLAGNIOL-VILLARD * of pause frames. In this case, we had to advertise 34472439e4bfSJean-Christophe PLAGNIOL-VILLARD * FULL flow control because we could not advertise RX 34482439e4bfSJean-Christophe PLAGNIOL-VILLARD * ONLY. Hence, we must now check to see if we need to 34492439e4bfSJean-Christophe PLAGNIOL-VILLARD * turn OFF the TRANSMISSION of PAUSE frames. 34502439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34512439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->original_fc == e1000_fc_full) { 34522439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_full; 34532439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow Control = FULL.\r\n"); 34542439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 34552439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_rx_pause; 34562439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 34572439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = RX PAUSE frames only.\r\n"); 34582439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34592439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34602439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For receiving PAUSE frames ONLY. 34612439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34622439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34632439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 34642439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34652439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 34662439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34672439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34682439e4bfSJean-Christophe PLAGNIOL-VILLARD else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) && 34692439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && 34702439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && 34712439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) 34722439e4bfSJean-Christophe PLAGNIOL-VILLARD { 34732439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_tx_pause; 34742439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 34752439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = TX PAUSE frames only.\r\n"); 34762439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34772439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For transmitting PAUSE frames ONLY. 34782439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34792439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34802439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 34812439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34822439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 34832439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34842439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34852439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && 34862439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && 34872439e4bfSJean-Christophe PLAGNIOL-VILLARD !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && 34882439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) 34892439e4bfSJean-Christophe PLAGNIOL-VILLARD { 34902439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_rx_pause; 34912439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 34922439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = RX PAUSE frames only.\r\n"); 34932439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34942439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Per the IEEE spec, at this point flow control should be 34952439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabled. However, we want to consider that we could 34962439e4bfSJean-Christophe PLAGNIOL-VILLARD * be connected to a legacy switch that doesn't advertise 34972439e4bfSJean-Christophe PLAGNIOL-VILLARD * desired flow control, but can be forced on the link 34982439e4bfSJean-Christophe PLAGNIOL-VILLARD * partner. So if we advertised no flow control, that is 34992439e4bfSJean-Christophe PLAGNIOL-VILLARD * what we will resolve to. If we advertised some kind of 35002439e4bfSJean-Christophe PLAGNIOL-VILLARD * receive capability (Rx Pause Only or Full Flow Control) 35012439e4bfSJean-Christophe PLAGNIOL-VILLARD * and the link partner advertised none, we will configure 35022439e4bfSJean-Christophe PLAGNIOL-VILLARD * ourselves to enable Rx Flow Control only. We can do 35032439e4bfSJean-Christophe PLAGNIOL-VILLARD * this safely for two reasons: If the link partner really 35042439e4bfSJean-Christophe PLAGNIOL-VILLARD * didn't want flow control enabled, and we enable Rx, no 35052439e4bfSJean-Christophe PLAGNIOL-VILLARD * harm done since we won't be receiving any PAUSE frames 35062439e4bfSJean-Christophe PLAGNIOL-VILLARD * anyway. If the intent on the link partner was to have 35072439e4bfSJean-Christophe PLAGNIOL-VILLARD * flow control enabled, then by us enabling RX only, we 35082439e4bfSJean-Christophe PLAGNIOL-VILLARD * can at least receive pause frames and process them. 35092439e4bfSJean-Christophe PLAGNIOL-VILLARD * This is a good idea because in most cases, since we are 35102439e4bfSJean-Christophe PLAGNIOL-VILLARD * predominantly a server NIC, more times than not we will 35112439e4bfSJean-Christophe PLAGNIOL-VILLARD * be asked to delay transmission of packets than asking 35122439e4bfSJean-Christophe PLAGNIOL-VILLARD * our link partner to pause transmission of frames. 35132439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35142439e4bfSJean-Christophe PLAGNIOL-VILLARD else if (hw->original_fc == e1000_fc_none || 35152439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->original_fc == e1000_fc_tx_pause) { 35162439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_none; 35172439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow Control = NONE.\r\n"); 35182439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 35192439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_rx_pause; 35202439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 35212439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = RX PAUSE frames only.\r\n"); 35222439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35232439e4bfSJean-Christophe PLAGNIOL-VILLARD 35242439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now we need to do one last check... If we auto- 35252439e4bfSJean-Christophe PLAGNIOL-VILLARD * negotiated to HALF DUPLEX, flow control should not be 35262439e4bfSJean-Christophe PLAGNIOL-VILLARD * enabled per IEEE 802.3 spec. 35272439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35282439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_get_speed_and_duplex(hw, &speed, &duplex); 35292439e4bfSJean-Christophe PLAGNIOL-VILLARD 35302439e4bfSJean-Christophe PLAGNIOL-VILLARD if (duplex == HALF_DUPLEX) 35312439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_none; 35322439e4bfSJean-Christophe PLAGNIOL-VILLARD 35332439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now we call a subroutine to actually force the MAC 35342439e4bfSJean-Christophe PLAGNIOL-VILLARD * controller to use the correct flow control settings. 35352439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35362439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_force_mac_fc(hw); 35372439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 35382439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 35392439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Error forcing flow control settings\n"); 35402439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 35412439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35422439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 35432439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 35442439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Copper PHY and Auto Neg has not completed.\r\n"); 35452439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35462439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3547*aa070789SRoy Zang return E1000_SUCCESS; 35482439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35492439e4bfSJean-Christophe PLAGNIOL-VILLARD 35502439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 35512439e4bfSJean-Christophe PLAGNIOL-VILLARD * Checks to see if the link status of the hardware has changed. 35522439e4bfSJean-Christophe PLAGNIOL-VILLARD * 35532439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 35542439e4bfSJean-Christophe PLAGNIOL-VILLARD * 35552439e4bfSJean-Christophe PLAGNIOL-VILLARD * Called by any function that needs to check the link status of the adapter. 35562439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 35572439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 35582439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_check_for_link(struct eth_device *nic) 35592439e4bfSJean-Christophe PLAGNIOL-VILLARD { 35602439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 35612439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t rxcw; 35622439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 35632439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status; 35642439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t rctl; 35652439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t signal; 35662439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 35672439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 35682439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t lp_capability; 35692439e4bfSJean-Christophe PLAGNIOL-VILLARD 35702439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 35712439e4bfSJean-Christophe PLAGNIOL-VILLARD 35722439e4bfSJean-Christophe PLAGNIOL-VILLARD /* On adapters with a MAC newer that 82544, SW Defineable pin 1 will be 35732439e4bfSJean-Christophe PLAGNIOL-VILLARD * set when the optics detect a signal. On older adapters, it will be 35742439e4bfSJean-Christophe PLAGNIOL-VILLARD * cleared when there is a signal 35752439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35762439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 35772439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->mac_type > e1000_82544) && !(ctrl & E1000_CTRL_ILOS)) 35782439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = E1000_CTRL_SWDPIN1; 35792439e4bfSJean-Christophe PLAGNIOL-VILLARD else 35802439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = 0; 35812439e4bfSJean-Christophe PLAGNIOL-VILLARD 35822439e4bfSJean-Christophe PLAGNIOL-VILLARD status = E1000_READ_REG(hw, STATUS); 35832439e4bfSJean-Christophe PLAGNIOL-VILLARD rxcw = E1000_READ_REG(hw, RXCW); 35842439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("ctrl: %#08x status %#08x rxcw %#08x\n", ctrl, status, rxcw); 35852439e4bfSJean-Christophe PLAGNIOL-VILLARD 35862439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we have a copper PHY then we only want to go out to the PHY 35872439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers to see if Auto-Neg has completed and/or if our link 35882439e4bfSJean-Christophe PLAGNIOL-VILLARD * status has changed. The get_link_status flag will be set if we 35892439e4bfSJean-Christophe PLAGNIOL-VILLARD * receive a Link Status Change interrupt or we have Rx Sequence 35902439e4bfSJean-Christophe PLAGNIOL-VILLARD * Errors. 35912439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35922439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->media_type == e1000_media_type_copper) && hw->get_link_status) { 35932439e4bfSJean-Christophe PLAGNIOL-VILLARD /* First we want to see if the MII Status Register reports 35942439e4bfSJean-Christophe PLAGNIOL-VILLARD * link. If so, then we want to get the current speed/duplex 35952439e4bfSJean-Christophe PLAGNIOL-VILLARD * of the PHY. 35962439e4bfSJean-Christophe PLAGNIOL-VILLARD * Read the register twice since the link bit is sticky. 35972439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35982439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 35992439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 36002439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 36012439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36022439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 36032439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 36042439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 36052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36062439e4bfSJean-Christophe PLAGNIOL-VILLARD 36072439e4bfSJean-Christophe PLAGNIOL-VILLARD if (phy_data & MII_SR_LINK_STATUS) { 36082439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->get_link_status = FALSE; 36092439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 36102439e4bfSJean-Christophe PLAGNIOL-VILLARD /* No link detected */ 36112439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_NOLINK; 36122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36132439e4bfSJean-Christophe PLAGNIOL-VILLARD 36142439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We have a M88E1000 PHY and Auto-Neg is enabled. If we 36152439e4bfSJean-Christophe PLAGNIOL-VILLARD * have Si on board that is 82544 or newer, Auto 36162439e4bfSJean-Christophe PLAGNIOL-VILLARD * Speed Detection takes care of MAC speed/duplex 36172439e4bfSJean-Christophe PLAGNIOL-VILLARD * configuration. So we only need to configure Collision 36182439e4bfSJean-Christophe PLAGNIOL-VILLARD * Distance in the MAC. Otherwise, we need to force 36192439e4bfSJean-Christophe PLAGNIOL-VILLARD * speed/duplex on the MAC to the current PHY speed/duplex 36202439e4bfSJean-Christophe PLAGNIOL-VILLARD * settings. 36212439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36222439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82544) 36232439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 36242439e4bfSJean-Christophe PLAGNIOL-VILLARD else { 36252439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_mac_to_phy(hw); 36262439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 36272439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 36282439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Error configuring MAC to PHY settings\n"); 36292439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 36302439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36312439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36322439e4bfSJean-Christophe PLAGNIOL-VILLARD 36332439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Configure Flow Control now that Auto-Neg has completed. First, we 36342439e4bfSJean-Christophe PLAGNIOL-VILLARD * need to restore the desired flow control settings because we may 36352439e4bfSJean-Christophe PLAGNIOL-VILLARD * have had to re-autoneg with a different link partner. 36362439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36372439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_fc_after_link_up(hw); 36382439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 36392439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error configuring flow control\n"); 36402439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 36412439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36422439e4bfSJean-Christophe PLAGNIOL-VILLARD 36432439e4bfSJean-Christophe PLAGNIOL-VILLARD /* At this point we know that we are on copper and we have 36442439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiated link. These are conditions for checking the link 36452439e4bfSJean-Christophe PLAGNIOL-VILLARD * parter capability register. We use the link partner capability to 36462439e4bfSJean-Christophe PLAGNIOL-VILLARD * determine if TBI Compatibility needs to be turned on or off. If 36472439e4bfSJean-Christophe PLAGNIOL-VILLARD * the link partner advertises any speed in addition to Gigabit, then 36482439e4bfSJean-Christophe PLAGNIOL-VILLARD * we assume that they are GMII-based, and TBI compatibility is not 36492439e4bfSJean-Christophe PLAGNIOL-VILLARD * needed. If no other speeds are advertised, we assume the link 36502439e4bfSJean-Christophe PLAGNIOL-VILLARD * partner is TBI-based, and we turn on TBI Compatibility. 36512439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36522439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->tbi_compatibility_en) { 36532439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg 36542439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw, PHY_LP_ABILITY, &lp_capability) < 0) { 36552439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 36562439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 36572439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36582439e4bfSJean-Christophe PLAGNIOL-VILLARD if (lp_capability & (NWAY_LPAR_10T_HD_CAPS | 36592439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_10T_FD_CAPS | 36602439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_100TX_HD_CAPS | 36612439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_100TX_FD_CAPS | 36622439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_100T4_CAPS)) { 36632439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If our link partner advertises anything in addition to 36642439e4bfSJean-Christophe PLAGNIOL-VILLARD * gigabit, we do not need to enable TBI compatibility. 36652439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36662439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->tbi_compatibility_on) { 36672439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we previously were in the mode, turn it off. */ 36682439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 36692439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~E1000_RCTL_SBP; 36702439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 36712439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->tbi_compatibility_on = FALSE; 36722439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36732439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 36742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If TBI compatibility is was previously off, turn it on. For 36752439e4bfSJean-Christophe PLAGNIOL-VILLARD * compatibility with a TBI link partner, we will store bad 36762439e4bfSJean-Christophe PLAGNIOL-VILLARD * packets. Some frames have an additional byte on the end and 36772439e4bfSJean-Christophe PLAGNIOL-VILLARD * will look like CRC errors to to the hardware. 36782439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36792439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!hw->tbi_compatibility_on) { 36802439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->tbi_compatibility_on = TRUE; 36812439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 36822439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl |= E1000_RCTL_SBP; 36832439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 36842439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36852439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36862439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36872439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36882439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we don't have link (auto-negotiation failed or link partner cannot 36892439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiate), the cable is plugged in (we have signal), and our 36902439e4bfSJean-Christophe PLAGNIOL-VILLARD * link partner is not trying to auto-negotiate with us (we are receiving 36912439e4bfSJean-Christophe PLAGNIOL-VILLARD * idles or data), we need to force link up. We also need to give 36922439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation time to complete, in case the cable was just plugged 36932439e4bfSJean-Christophe PLAGNIOL-VILLARD * in. The autoneg_failed flag does this. 36942439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36952439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((hw->media_type == e1000_media_type_fiber) && 36962439e4bfSJean-Christophe PLAGNIOL-VILLARD (!(status & E1000_STATUS_LU)) && 36972439e4bfSJean-Christophe PLAGNIOL-VILLARD ((ctrl & E1000_CTRL_SWDPIN1) == signal) && 36982439e4bfSJean-Christophe PLAGNIOL-VILLARD (!(rxcw & E1000_RXCW_C))) { 36992439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_failed == 0) { 37002439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 1; 37012439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 37022439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37032439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\r\n"); 37042439e4bfSJean-Christophe PLAGNIOL-VILLARD 37052439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disable auto-negotiation in the TXCW register */ 37062439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE)); 37072439e4bfSJean-Christophe PLAGNIOL-VILLARD 37082439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Force link-up and also force full-duplex. */ 37092439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 37102439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); 37112439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 37122439e4bfSJean-Christophe PLAGNIOL-VILLARD 37132439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Configure Flow Control after forcing link up. */ 37142439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_fc_after_link_up(hw); 37152439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 37162439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error configuring flow control\n"); 37172439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 37182439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37192439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37202439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we are forcing link and we are receiving /C/ ordered sets, re-enable 37212439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation in the TXCW register and disable forced link in the 37222439e4bfSJean-Christophe PLAGNIOL-VILLARD * Device Control register in an attempt to auto-negotiate with our link 37232439e4bfSJean-Christophe PLAGNIOL-VILLARD * partner. 37242439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 37252439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((hw->media_type == e1000_media_type_fiber) && 37262439e4bfSJean-Christophe PLAGNIOL-VILLARD (ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { 37272439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 37282439e4bfSJean-Christophe PLAGNIOL-VILLARD ("RXing /C/, enable AutoNeg and stop forcing link.\r\n"); 37292439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXCW, hw->txcw); 37302439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU)); 37312439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37322439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 37332439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37342439e4bfSJean-Christophe PLAGNIOL-VILLARD 37352439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 3736*aa070789SRoy Zang * Configure the MAC-to-PHY interface for 10/100Mbps 3737*aa070789SRoy Zang * 3738*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 3739*aa070789SRoy Zang ******************************************************************************/ 3740*aa070789SRoy Zang static int32_t 3741*aa070789SRoy Zang e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, uint16_t duplex) 3742*aa070789SRoy Zang { 3743*aa070789SRoy Zang int32_t ret_val = E1000_SUCCESS; 3744*aa070789SRoy Zang uint32_t tipg; 3745*aa070789SRoy Zang uint16_t reg_data; 3746*aa070789SRoy Zang 3747*aa070789SRoy Zang DEBUGFUNC(); 3748*aa070789SRoy Zang 3749*aa070789SRoy Zang reg_data = E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT; 3750*aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 3751*aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_HD_CTRL, reg_data); 3752*aa070789SRoy Zang if (ret_val) 3753*aa070789SRoy Zang return ret_val; 3754*aa070789SRoy Zang 3755*aa070789SRoy Zang /* Configure Transmit Inter-Packet Gap */ 3756*aa070789SRoy Zang tipg = E1000_READ_REG(hw, TIPG); 3757*aa070789SRoy Zang tipg &= ~E1000_TIPG_IPGT_MASK; 3758*aa070789SRoy Zang tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100; 3759*aa070789SRoy Zang E1000_WRITE_REG(hw, TIPG, tipg); 3760*aa070789SRoy Zang 3761*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); 3762*aa070789SRoy Zang 3763*aa070789SRoy Zang if (ret_val) 3764*aa070789SRoy Zang return ret_val; 3765*aa070789SRoy Zang 3766*aa070789SRoy Zang if (duplex == HALF_DUPLEX) 3767*aa070789SRoy Zang reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER; 3768*aa070789SRoy Zang else 3769*aa070789SRoy Zang reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; 3770*aa070789SRoy Zang 3771*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); 3772*aa070789SRoy Zang 3773*aa070789SRoy Zang return ret_val; 3774*aa070789SRoy Zang } 3775*aa070789SRoy Zang 3776*aa070789SRoy Zang static int32_t 3777*aa070789SRoy Zang e1000_configure_kmrn_for_1000(struct e1000_hw *hw) 3778*aa070789SRoy Zang { 3779*aa070789SRoy Zang int32_t ret_val = E1000_SUCCESS; 3780*aa070789SRoy Zang uint16_t reg_data; 3781*aa070789SRoy Zang uint32_t tipg; 3782*aa070789SRoy Zang 3783*aa070789SRoy Zang DEBUGFUNC(); 3784*aa070789SRoy Zang 3785*aa070789SRoy Zang reg_data = E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT; 3786*aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 3787*aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_HD_CTRL, reg_data); 3788*aa070789SRoy Zang if (ret_val) 3789*aa070789SRoy Zang return ret_val; 3790*aa070789SRoy Zang 3791*aa070789SRoy Zang /* Configure Transmit Inter-Packet Gap */ 3792*aa070789SRoy Zang tipg = E1000_READ_REG(hw, TIPG); 3793*aa070789SRoy Zang tipg &= ~E1000_TIPG_IPGT_MASK; 3794*aa070789SRoy Zang tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; 3795*aa070789SRoy Zang E1000_WRITE_REG(hw, TIPG, tipg); 3796*aa070789SRoy Zang 3797*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); 3798*aa070789SRoy Zang 3799*aa070789SRoy Zang if (ret_val) 3800*aa070789SRoy Zang return ret_val; 3801*aa070789SRoy Zang 3802*aa070789SRoy Zang reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; 3803*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); 3804*aa070789SRoy Zang 3805*aa070789SRoy Zang return ret_val; 3806*aa070789SRoy Zang } 3807*aa070789SRoy Zang 3808*aa070789SRoy Zang /****************************************************************************** 38092439e4bfSJean-Christophe PLAGNIOL-VILLARD * Detects the current speed and duplex settings of the hardware. 38102439e4bfSJean-Christophe PLAGNIOL-VILLARD * 38112439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 38122439e4bfSJean-Christophe PLAGNIOL-VILLARD * speed - Speed of the connection 38132439e4bfSJean-Christophe PLAGNIOL-VILLARD * duplex - Duplex setting of the connection 38142439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 3815*aa070789SRoy Zang static int 3816*aa070789SRoy Zang e1000_get_speed_and_duplex(struct e1000_hw *hw, uint16_t *speed, 3817*aa070789SRoy Zang uint16_t *duplex) 38182439e4bfSJean-Christophe PLAGNIOL-VILLARD { 38192439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status; 3820*aa070789SRoy Zang int32_t ret_val; 3821*aa070789SRoy Zang uint16_t phy_data; 38222439e4bfSJean-Christophe PLAGNIOL-VILLARD 38232439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 38242439e4bfSJean-Christophe PLAGNIOL-VILLARD 38252439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82543) { 38262439e4bfSJean-Christophe PLAGNIOL-VILLARD status = E1000_READ_REG(hw, STATUS); 38272439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_SPEED_1000) { 38282439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_1000; 38292439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("1000 Mbs, "); 38302439e4bfSJean-Christophe PLAGNIOL-VILLARD } else if (status & E1000_STATUS_SPEED_100) { 38312439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_100; 38322439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("100 Mbs, "); 38332439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 38342439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_10; 38352439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("10 Mbs, "); 38362439e4bfSJean-Christophe PLAGNIOL-VILLARD } 38372439e4bfSJean-Christophe PLAGNIOL-VILLARD 38382439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_FD) { 38392439e4bfSJean-Christophe PLAGNIOL-VILLARD *duplex = FULL_DUPLEX; 38402439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Full Duplex\r\n"); 38412439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 38422439e4bfSJean-Christophe PLAGNIOL-VILLARD *duplex = HALF_DUPLEX; 38432439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT(" Half Duplex\r\n"); 38442439e4bfSJean-Christophe PLAGNIOL-VILLARD } 38452439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 38462439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("1000 Mbs, Full Duplex\r\n"); 38472439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_1000; 38482439e4bfSJean-Christophe PLAGNIOL-VILLARD *duplex = FULL_DUPLEX; 38492439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3850*aa070789SRoy Zang 3851*aa070789SRoy Zang /* IGP01 PHY may advertise full duplex operation after speed downgrade 3852*aa070789SRoy Zang * even if it is operating at half duplex. Here we set the duplex 3853*aa070789SRoy Zang * settings to match the duplex in the link partner's capabilities. 3854*aa070789SRoy Zang */ 3855*aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp && hw->speed_downgraded) { 3856*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, &phy_data); 3857*aa070789SRoy Zang if (ret_val) 3858*aa070789SRoy Zang return ret_val; 3859*aa070789SRoy Zang 3860*aa070789SRoy Zang if (!(phy_data & NWAY_ER_LP_NWAY_CAPS)) 3861*aa070789SRoy Zang *duplex = HALF_DUPLEX; 3862*aa070789SRoy Zang else { 3863*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 3864*aa070789SRoy Zang PHY_LP_ABILITY, &phy_data); 3865*aa070789SRoy Zang if (ret_val) 3866*aa070789SRoy Zang return ret_val; 3867*aa070789SRoy Zang if ((*speed == SPEED_100 && 3868*aa070789SRoy Zang !(phy_data & NWAY_LPAR_100TX_FD_CAPS)) 3869*aa070789SRoy Zang || (*speed == SPEED_10 3870*aa070789SRoy Zang && !(phy_data & NWAY_LPAR_10T_FD_CAPS))) 3871*aa070789SRoy Zang *duplex = HALF_DUPLEX; 3872*aa070789SRoy Zang } 3873*aa070789SRoy Zang } 3874*aa070789SRoy Zang 3875*aa070789SRoy Zang if ((hw->mac_type == e1000_80003es2lan) && 3876*aa070789SRoy Zang (hw->media_type == e1000_media_type_copper)) { 3877*aa070789SRoy Zang if (*speed == SPEED_1000) 3878*aa070789SRoy Zang ret_val = e1000_configure_kmrn_for_1000(hw); 3879*aa070789SRoy Zang else 3880*aa070789SRoy Zang ret_val = e1000_configure_kmrn_for_10_100(hw, *duplex); 3881*aa070789SRoy Zang if (ret_val) 3882*aa070789SRoy Zang return ret_val; 3883*aa070789SRoy Zang } 3884*aa070789SRoy Zang return E1000_SUCCESS; 38852439e4bfSJean-Christophe PLAGNIOL-VILLARD } 38862439e4bfSJean-Christophe PLAGNIOL-VILLARD 38872439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 38882439e4bfSJean-Christophe PLAGNIOL-VILLARD * Blocks until autoneg completes or times out (~4.5 seconds) 38892439e4bfSJean-Christophe PLAGNIOL-VILLARD * 38902439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 38912439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 38922439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 38932439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_wait_autoneg(struct e1000_hw *hw) 38942439e4bfSJean-Christophe PLAGNIOL-VILLARD { 38952439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t i; 38962439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 38972439e4bfSJean-Christophe PLAGNIOL-VILLARD 38982439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 38992439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Waiting for Auto-Neg to complete.\n"); 39002439e4bfSJean-Christophe PLAGNIOL-VILLARD 39012439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We will wait for autoneg to complete or 4.5 seconds to expire. */ 39022439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = PHY_AUTO_NEG_TIME; i > 0; i--) { 39032439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII Status Register and wait for Auto-Neg 39042439e4bfSJean-Christophe PLAGNIOL-VILLARD * Complete bit to be set. 39052439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39062439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 39072439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 39082439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 39092439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39102439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 39112439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 39122439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 39132439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39142439e4bfSJean-Christophe PLAGNIOL-VILLARD if (phy_data & MII_SR_AUTONEG_COMPLETE) { 39152439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-Neg complete.\n"); 39162439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 39172439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39182439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(100); 39192439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39202439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-Neg timedout.\n"); 39212439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_TIMEOUT; 39222439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39232439e4bfSJean-Christophe PLAGNIOL-VILLARD 39242439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 39252439e4bfSJean-Christophe PLAGNIOL-VILLARD * Raises the Management Data Clock 39262439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39272439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 39282439e4bfSJean-Christophe PLAGNIOL-VILLARD * ctrl - Device control register's current value 39292439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 39302439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 39312439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(struct e1000_hw *hw, uint32_t * ctrl) 39322439e4bfSJean-Christophe PLAGNIOL-VILLARD { 39332439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Raise the clock input to the Management Data Clock (by setting the MDC 39342439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit), and then delay 2 microseconds. 39352439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39362439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (*ctrl | E1000_CTRL_MDC)); 39372439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 39382439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(2); 39392439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39402439e4bfSJean-Christophe PLAGNIOL-VILLARD 39412439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 39422439e4bfSJean-Christophe PLAGNIOL-VILLARD * Lowers the Management Data Clock 39432439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39442439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 39452439e4bfSJean-Christophe PLAGNIOL-VILLARD * ctrl - Device control register's current value 39462439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 39472439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 39482439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(struct e1000_hw *hw, uint32_t * ctrl) 39492439e4bfSJean-Christophe PLAGNIOL-VILLARD { 39502439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Lower the clock input to the Management Data Clock (by clearing the MDC 39512439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit), and then delay 2 microseconds. 39522439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39532439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (*ctrl & ~E1000_CTRL_MDC)); 39542439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 39552439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(2); 39562439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39572439e4bfSJean-Christophe PLAGNIOL-VILLARD 39582439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 39592439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shifts data bits out to the PHY 39602439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39612439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 39622439e4bfSJean-Christophe PLAGNIOL-VILLARD * data - Data to send out to the PHY 39632439e4bfSJean-Christophe PLAGNIOL-VILLARD * count - Number of bits to shift out 39642439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39652439e4bfSJean-Christophe PLAGNIOL-VILLARD * Bits are shifted out in MSB to LSB order. 39662439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 39672439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 39682439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(struct e1000_hw *hw, uint32_t data, uint16_t count) 39692439e4bfSJean-Christophe PLAGNIOL-VILLARD { 39702439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 39712439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mask; 39722439e4bfSJean-Christophe PLAGNIOL-VILLARD 39732439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We need to shift "count" number of bits out to the PHY. So, the value 39742439e4bfSJean-Christophe PLAGNIOL-VILLARD * in the "data" parameter will be shifted out to the PHY one bit at a 39752439e4bfSJean-Christophe PLAGNIOL-VILLARD * time. In order to do this, "data" must be broken down into bits. 39762439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39772439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = 0x01; 39782439e4bfSJean-Christophe PLAGNIOL-VILLARD mask <<= (count - 1); 39792439e4bfSJean-Christophe PLAGNIOL-VILLARD 39802439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 39812439e4bfSJean-Christophe PLAGNIOL-VILLARD 39822439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */ 39832439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR); 39842439e4bfSJean-Christophe PLAGNIOL-VILLARD 39852439e4bfSJean-Christophe PLAGNIOL-VILLARD while (mask) { 39862439e4bfSJean-Christophe PLAGNIOL-VILLARD /* A "1" is shifted out to the PHY by setting the MDIO bit to "1" and 39872439e4bfSJean-Christophe PLAGNIOL-VILLARD * then raising and lowering the Management Data Clock. A "0" is 39882439e4bfSJean-Christophe PLAGNIOL-VILLARD * shifted out to the PHY by setting the MDIO bit to "0" and then 39892439e4bfSJean-Christophe PLAGNIOL-VILLARD * raising and lowering the clock. 39902439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39912439e4bfSJean-Christophe PLAGNIOL-VILLARD if (data & mask) 39922439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_MDIO; 39932439e4bfSJean-Christophe PLAGNIOL-VILLARD else 39942439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_MDIO; 39952439e4bfSJean-Christophe PLAGNIOL-VILLARD 39962439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 39972439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 39982439e4bfSJean-Christophe PLAGNIOL-VILLARD 39992439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(2); 40002439e4bfSJean-Christophe PLAGNIOL-VILLARD 40012439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 40022439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 40032439e4bfSJean-Christophe PLAGNIOL-VILLARD 40042439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = mask >> 1; 40052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40062439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40072439e4bfSJean-Christophe PLAGNIOL-VILLARD 40082439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 40092439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shifts data bits in from the PHY 40102439e4bfSJean-Christophe PLAGNIOL-VILLARD * 40112439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 40122439e4bfSJean-Christophe PLAGNIOL-VILLARD * 40132439e4bfSJean-Christophe PLAGNIOL-VILLARD * Bits are shifted in in MSB to LSB order. 40142439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 40152439e4bfSJean-Christophe PLAGNIOL-VILLARD static uint16_t 40162439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_in_mdi_bits(struct e1000_hw *hw) 40172439e4bfSJean-Christophe PLAGNIOL-VILLARD { 40182439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 40192439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t data = 0; 40202439e4bfSJean-Christophe PLAGNIOL-VILLARD uint8_t i; 40212439e4bfSJean-Christophe PLAGNIOL-VILLARD 40222439e4bfSJean-Christophe PLAGNIOL-VILLARD /* In order to read a register from the PHY, we need to shift in a total 40232439e4bfSJean-Christophe PLAGNIOL-VILLARD * of 18 bits from the PHY. The first two bit (turnaround) times are used 40242439e4bfSJean-Christophe PLAGNIOL-VILLARD * to avoid contention on the MDIO pin when a read operation is performed. 40252439e4bfSJean-Christophe PLAGNIOL-VILLARD * These two bits are ignored by us and thrown away. Bits are "shifted in" 40262439e4bfSJean-Christophe PLAGNIOL-VILLARD * by raising the input to the Management Data Clock (setting the MDC bit), 40272439e4bfSJean-Christophe PLAGNIOL-VILLARD * and then reading the value of the MDIO bit. 40282439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 40292439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 40302439e4bfSJean-Christophe PLAGNIOL-VILLARD 40312439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as input. */ 40322439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_MDIO_DIR; 40332439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_MDIO; 40342439e4bfSJean-Christophe PLAGNIOL-VILLARD 40352439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 40362439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 40372439e4bfSJean-Christophe PLAGNIOL-VILLARD 40382439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Raise and Lower the clock before reading in the data. This accounts for 40392439e4bfSJean-Christophe PLAGNIOL-VILLARD * the turnaround bits. The first clock occurred when we clocked out the 40402439e4bfSJean-Christophe PLAGNIOL-VILLARD * last bit of the Register Address. 40412439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 40422439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 40432439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 40442439e4bfSJean-Christophe PLAGNIOL-VILLARD 40452439e4bfSJean-Christophe PLAGNIOL-VILLARD for (data = 0, i = 0; i < 16; i++) { 40462439e4bfSJean-Christophe PLAGNIOL-VILLARD data = data << 1; 40472439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 40482439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 40492439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check to see if we shifted in a "1". */ 40502439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ctrl & E1000_CTRL_MDIO) 40512439e4bfSJean-Christophe PLAGNIOL-VILLARD data |= 1; 40522439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 40532439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40542439e4bfSJean-Christophe PLAGNIOL-VILLARD 40552439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 40562439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 40572439e4bfSJean-Christophe PLAGNIOL-VILLARD 40582439e4bfSJean-Christophe PLAGNIOL-VILLARD return data; 40592439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40602439e4bfSJean-Christophe PLAGNIOL-VILLARD 40612439e4bfSJean-Christophe PLAGNIOL-VILLARD /***************************************************************************** 40622439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reads the value from a PHY register 40632439e4bfSJean-Christophe PLAGNIOL-VILLARD * 40642439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 40652439e4bfSJean-Christophe PLAGNIOL-VILLARD * reg_addr - address of the PHY register to read 40662439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 40672439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 40682439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t * phy_data) 40692439e4bfSJean-Christophe PLAGNIOL-VILLARD { 40702439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 40712439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mdic = 0; 40722439e4bfSJean-Christophe PLAGNIOL-VILLARD const uint32_t phy_addr = 1; 40732439e4bfSJean-Christophe PLAGNIOL-VILLARD 40742439e4bfSJean-Christophe PLAGNIOL-VILLARD if (reg_addr > MAX_PHY_REG_ADDRESS) { 40752439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Address %d is out of range\n", reg_addr); 40762439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PARAM; 40772439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40782439e4bfSJean-Christophe PLAGNIOL-VILLARD 40792439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 40802439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up Op-code, Phy Address, and register address in the MDI 40812439e4bfSJean-Christophe PLAGNIOL-VILLARD * Control register. The MAC will take care of interfacing with the 40822439e4bfSJean-Christophe PLAGNIOL-VILLARD * PHY to retrieve the desired data. 40832439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 40842439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) | 40852439e4bfSJean-Christophe PLAGNIOL-VILLARD (phy_addr << E1000_MDIC_PHY_SHIFT) | 40862439e4bfSJean-Christophe PLAGNIOL-VILLARD (E1000_MDIC_OP_READ)); 40872439e4bfSJean-Christophe PLAGNIOL-VILLARD 40882439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, MDIC, mdic); 40892439e4bfSJean-Christophe PLAGNIOL-VILLARD 40902439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Poll the ready bit to see if the MDI read completed */ 40912439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < 64; i++) { 40922439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 40932439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = E1000_READ_REG(hw, MDIC); 40942439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mdic & E1000_MDIC_READY) 40952439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 40962439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40972439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(mdic & E1000_MDIC_READY)) { 40982439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("MDI Read did not complete\n"); 40992439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 41002439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41012439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mdic & E1000_MDIC_ERROR) { 41022439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("MDI Error\n"); 41032439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 41042439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41052439e4bfSJean-Christophe PLAGNIOL-VILLARD *phy_data = (uint16_t) mdic; 41062439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 41072439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We must first send a preamble through the MDIO pin to signal the 41082439e4bfSJean-Christophe PLAGNIOL-VILLARD * beginning of an MII instruction. This is done by sending 32 41092439e4bfSJean-Christophe PLAGNIOL-VILLARD * consecutive "1" bits. 41102439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41112439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE); 41122439e4bfSJean-Christophe PLAGNIOL-VILLARD 41132439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now combine the next few fields that are required for a read 41142439e4bfSJean-Christophe PLAGNIOL-VILLARD * operation. We use this method instead of calling the 41152439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_shift_out_mdi_bits routine five different times. The format of 41162439e4bfSJean-Christophe PLAGNIOL-VILLARD * a MII read instruction consists of a shift out of 14 bits and is 41172439e4bfSJean-Christophe PLAGNIOL-VILLARD * defined as follows: 41182439e4bfSJean-Christophe PLAGNIOL-VILLARD * <Preamble><SOF><Op Code><Phy Addr><Reg Addr> 41192439e4bfSJean-Christophe PLAGNIOL-VILLARD * followed by a shift in of 18 bits. This first two bits shifted in 41202439e4bfSJean-Christophe PLAGNIOL-VILLARD * are TurnAround bits used to avoid contention on the MDIO pin when a 41212439e4bfSJean-Christophe PLAGNIOL-VILLARD * READ operation is performed. These two bits are thrown away 41222439e4bfSJean-Christophe PLAGNIOL-VILLARD * followed by a shift in of 16 bits which contains the desired data. 41232439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41242439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = ((reg_addr) | (phy_addr << 5) | 41252439e4bfSJean-Christophe PLAGNIOL-VILLARD (PHY_OP_READ << 10) | (PHY_SOF << 12)); 41262439e4bfSJean-Christophe PLAGNIOL-VILLARD 41272439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, mdic, 14); 41282439e4bfSJean-Christophe PLAGNIOL-VILLARD 41292439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now that we've shifted out the read command to the MII, we need to 41302439e4bfSJean-Christophe PLAGNIOL-VILLARD * "shift in" the 16-bit value (18 total bits) of the requested PHY 41312439e4bfSJean-Christophe PLAGNIOL-VILLARD * register address. 41322439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41332439e4bfSJean-Christophe PLAGNIOL-VILLARD *phy_data = e1000_shift_in_mdi_bits(hw); 41342439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41352439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 41362439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41372439e4bfSJean-Christophe PLAGNIOL-VILLARD 41382439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 41392439e4bfSJean-Christophe PLAGNIOL-VILLARD * Writes a value to a PHY register 41402439e4bfSJean-Christophe PLAGNIOL-VILLARD * 41412439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 41422439e4bfSJean-Christophe PLAGNIOL-VILLARD * reg_addr - address of the PHY register to write 41432439e4bfSJean-Christophe PLAGNIOL-VILLARD * data - data to write to the PHY 41442439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 41452439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 41462439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t phy_data) 41472439e4bfSJean-Christophe PLAGNIOL-VILLARD { 41482439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 41492439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mdic = 0; 41502439e4bfSJean-Christophe PLAGNIOL-VILLARD const uint32_t phy_addr = 1; 41512439e4bfSJean-Christophe PLAGNIOL-VILLARD 41522439e4bfSJean-Christophe PLAGNIOL-VILLARD if (reg_addr > MAX_PHY_REG_ADDRESS) { 41532439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Address %d is out of range\n", reg_addr); 41542439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PARAM; 41552439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41562439e4bfSJean-Christophe PLAGNIOL-VILLARD 41572439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 41582439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up Op-code, Phy Address, register address, and data intended 41592439e4bfSJean-Christophe PLAGNIOL-VILLARD * for the PHY register in the MDI Control register. The MAC will take 41602439e4bfSJean-Christophe PLAGNIOL-VILLARD * care of interfacing with the PHY to send the desired data. 41612439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41622439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = (((uint32_t) phy_data) | 41632439e4bfSJean-Christophe PLAGNIOL-VILLARD (reg_addr << E1000_MDIC_REG_SHIFT) | 41642439e4bfSJean-Christophe PLAGNIOL-VILLARD (phy_addr << E1000_MDIC_PHY_SHIFT) | 41652439e4bfSJean-Christophe PLAGNIOL-VILLARD (E1000_MDIC_OP_WRITE)); 41662439e4bfSJean-Christophe PLAGNIOL-VILLARD 41672439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, MDIC, mdic); 41682439e4bfSJean-Christophe PLAGNIOL-VILLARD 41692439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Poll the ready bit to see if the MDI read completed */ 41702439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < 64; i++) { 41712439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 41722439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = E1000_READ_REG(hw, MDIC); 41732439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mdic & E1000_MDIC_READY) 41742439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 41752439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41762439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(mdic & E1000_MDIC_READY)) { 41772439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("MDI Write did not complete\n"); 41782439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 41792439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41802439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 41812439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We'll need to use the SW defined pins to shift the write command 41822439e4bfSJean-Christophe PLAGNIOL-VILLARD * out to the PHY. We first send a preamble to the PHY to signal the 41832439e4bfSJean-Christophe PLAGNIOL-VILLARD * beginning of the MII instruction. This is done by sending 32 41842439e4bfSJean-Christophe PLAGNIOL-VILLARD * consecutive "1" bits. 41852439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41862439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE); 41872439e4bfSJean-Christophe PLAGNIOL-VILLARD 41882439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now combine the remaining required fields that will indicate a 41892439e4bfSJean-Christophe PLAGNIOL-VILLARD * write operation. We use this method instead of calling the 41902439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_shift_out_mdi_bits routine for each field in the command. The 41912439e4bfSJean-Christophe PLAGNIOL-VILLARD * format of a MII write instruction is as follows: 41922439e4bfSJean-Christophe PLAGNIOL-VILLARD * <Preamble><SOF><Op Code><Phy Addr><Reg Addr><Turnaround><Data>. 41932439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41942439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = ((PHY_TURNAROUND) | (reg_addr << 2) | (phy_addr << 7) | 41952439e4bfSJean-Christophe PLAGNIOL-VILLARD (PHY_OP_WRITE << 12) | (PHY_SOF << 14)); 41962439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic <<= 16; 41972439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic |= (uint32_t) phy_data; 41982439e4bfSJean-Christophe PLAGNIOL-VILLARD 41992439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, mdic, 32); 42002439e4bfSJean-Christophe PLAGNIOL-VILLARD } 42012439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 42022439e4bfSJean-Christophe PLAGNIOL-VILLARD } 42032439e4bfSJean-Christophe PLAGNIOL-VILLARD 42042439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 4205*aa070789SRoy Zang * Checks if PHY reset is blocked due to SOL/IDER session, for example. 4206*aa070789SRoy Zang * Returning E1000_BLK_PHY_RESET isn't necessarily an error. But it's up to 4207*aa070789SRoy Zang * the caller to figure out how to deal with it. 4208*aa070789SRoy Zang * 4209*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 4210*aa070789SRoy Zang * 4211*aa070789SRoy Zang * returns: - E1000_BLK_PHY_RESET 4212*aa070789SRoy Zang * E1000_SUCCESS 4213*aa070789SRoy Zang * 4214*aa070789SRoy Zang *****************************************************************************/ 4215*aa070789SRoy Zang int32_t 4216*aa070789SRoy Zang e1000_check_phy_reset_block(struct e1000_hw *hw) 4217*aa070789SRoy Zang { 4218*aa070789SRoy Zang uint32_t manc = 0; 4219*aa070789SRoy Zang uint32_t fwsm = 0; 4220*aa070789SRoy Zang 4221*aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 4222*aa070789SRoy Zang fwsm = E1000_READ_REG(hw, FWSM); 4223*aa070789SRoy Zang return (fwsm & E1000_FWSM_RSPCIPHY) ? E1000_SUCCESS 4224*aa070789SRoy Zang : E1000_BLK_PHY_RESET; 4225*aa070789SRoy Zang } 4226*aa070789SRoy Zang 4227*aa070789SRoy Zang if (hw->mac_type > e1000_82547_rev_2) 4228*aa070789SRoy Zang manc = E1000_READ_REG(hw, MANC); 4229*aa070789SRoy Zang return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ? 4230*aa070789SRoy Zang E1000_BLK_PHY_RESET : E1000_SUCCESS; 4231*aa070789SRoy Zang } 4232*aa070789SRoy Zang 4233*aa070789SRoy Zang /*************************************************************************** 4234*aa070789SRoy Zang * Checks if the PHY configuration is done 4235*aa070789SRoy Zang * 4236*aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 4237*aa070789SRoy Zang * 4238*aa070789SRoy Zang * returns: - E1000_ERR_RESET if fail to reset MAC 4239*aa070789SRoy Zang * E1000_SUCCESS at any other case. 4240*aa070789SRoy Zang * 4241*aa070789SRoy Zang ***************************************************************************/ 4242*aa070789SRoy Zang static int32_t 4243*aa070789SRoy Zang e1000_get_phy_cfg_done(struct e1000_hw *hw) 4244*aa070789SRoy Zang { 4245*aa070789SRoy Zang int32_t timeout = PHY_CFG_TIMEOUT; 4246*aa070789SRoy Zang uint32_t cfg_mask = E1000_EEPROM_CFG_DONE; 4247*aa070789SRoy Zang 4248*aa070789SRoy Zang DEBUGFUNC(); 4249*aa070789SRoy Zang 4250*aa070789SRoy Zang switch (hw->mac_type) { 4251*aa070789SRoy Zang default: 4252*aa070789SRoy Zang mdelay(10); 4253*aa070789SRoy Zang break; 4254*aa070789SRoy Zang case e1000_80003es2lan: 4255*aa070789SRoy Zang /* Separate *_CFG_DONE_* bit for each port */ 4256*aa070789SRoy Zang if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) 4257*aa070789SRoy Zang cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1; 4258*aa070789SRoy Zang /* Fall Through */ 4259*aa070789SRoy Zang case e1000_82571: 4260*aa070789SRoy Zang case e1000_82572: 4261*aa070789SRoy Zang while (timeout) { 4262*aa070789SRoy Zang if (E1000_READ_REG(hw, EEMNGCTL) & cfg_mask) 4263*aa070789SRoy Zang break; 4264*aa070789SRoy Zang else 4265*aa070789SRoy Zang mdelay(1); 4266*aa070789SRoy Zang timeout--; 4267*aa070789SRoy Zang } 4268*aa070789SRoy Zang if (!timeout) { 4269*aa070789SRoy Zang DEBUGOUT("MNG configuration cycle has not " 4270*aa070789SRoy Zang "completed.\n"); 4271*aa070789SRoy Zang return -E1000_ERR_RESET; 4272*aa070789SRoy Zang } 4273*aa070789SRoy Zang break; 4274*aa070789SRoy Zang } 4275*aa070789SRoy Zang 4276*aa070789SRoy Zang return E1000_SUCCESS; 4277*aa070789SRoy Zang } 4278*aa070789SRoy Zang 4279*aa070789SRoy Zang /****************************************************************************** 42802439e4bfSJean-Christophe PLAGNIOL-VILLARD * Returns the PHY to the power-on reset state 42812439e4bfSJean-Christophe PLAGNIOL-VILLARD * 42822439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 42832439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 4284*aa070789SRoy Zang int32_t 42852439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_phy_hw_reset(struct e1000_hw *hw) 42862439e4bfSJean-Christophe PLAGNIOL-VILLARD { 4287*aa070789SRoy Zang uint32_t ctrl, ctrl_ext; 4288*aa070789SRoy Zang uint32_t led_ctrl; 4289*aa070789SRoy Zang int32_t ret_val; 4290*aa070789SRoy Zang uint16_t swfw; 42912439e4bfSJean-Christophe PLAGNIOL-VILLARD 42922439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 42932439e4bfSJean-Christophe PLAGNIOL-VILLARD 4294*aa070789SRoy Zang /* In the case of the phy reset being blocked, it's not an error, we 4295*aa070789SRoy Zang * simply return success without performing the reset. */ 4296*aa070789SRoy Zang ret_val = e1000_check_phy_reset_block(hw); 4297*aa070789SRoy Zang if (ret_val) 4298*aa070789SRoy Zang return E1000_SUCCESS; 4299*aa070789SRoy Zang 43002439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Resetting Phy...\n"); 43012439e4bfSJean-Christophe PLAGNIOL-VILLARD 43022439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 4303*aa070789SRoy Zang if ((hw->mac_type == e1000_80003es2lan) && 4304*aa070789SRoy Zang (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { 4305*aa070789SRoy Zang swfw = E1000_SWFW_PHY1_SM; 4306*aa070789SRoy Zang } else { 4307*aa070789SRoy Zang swfw = E1000_SWFW_PHY0_SM; 4308*aa070789SRoy Zang } 4309*aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, swfw)) { 4310*aa070789SRoy Zang DEBUGOUT("Unable to acquire swfw sync\n"); 4311*aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 4312*aa070789SRoy Zang } 43132439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the device control register and assert the E1000_CTRL_PHY_RST 43142439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit. Then, take it out of reset. 43152439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 43162439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 43172439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST); 43182439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 4319*aa070789SRoy Zang 4320*aa070789SRoy Zang if (hw->mac_type < e1000_82571) 4321*aa070789SRoy Zang udelay(10); 4322*aa070789SRoy Zang else 4323*aa070789SRoy Zang udelay(100); 4324*aa070789SRoy Zang 43252439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 43262439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 4327*aa070789SRoy Zang 4328*aa070789SRoy Zang if (hw->mac_type >= e1000_82571) 4329*aa070789SRoy Zang mdelay(10); 4330*aa070789SRoy Zang 43312439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 43322439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the Extended Device Control Register, assert the PHY_RESET_DIR 43332439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit to put the PHY into reset. Then, take it out of reset. 43342439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 43352439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 43362439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR; 43372439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA; 43382439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 43392439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 43402439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 43412439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA; 43422439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 43432439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 43442439e4bfSJean-Christophe PLAGNIOL-VILLARD } 43452439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(150); 4346*aa070789SRoy Zang 4347*aa070789SRoy Zang if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { 4348*aa070789SRoy Zang /* Configure activity LED after PHY reset */ 4349*aa070789SRoy Zang led_ctrl = E1000_READ_REG(hw, LEDCTL); 4350*aa070789SRoy Zang led_ctrl &= IGP_ACTIVITY_LED_MASK; 4351*aa070789SRoy Zang led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); 4352*aa070789SRoy Zang E1000_WRITE_REG(hw, LEDCTL, led_ctrl); 4353*aa070789SRoy Zang } 4354*aa070789SRoy Zang 4355*aa070789SRoy Zang /* Wait for FW to finish PHY configuration. */ 4356*aa070789SRoy Zang ret_val = e1000_get_phy_cfg_done(hw); 4357*aa070789SRoy Zang if (ret_val != E1000_SUCCESS) 4358*aa070789SRoy Zang return ret_val; 4359*aa070789SRoy Zang 4360*aa070789SRoy Zang return ret_val; 4361*aa070789SRoy Zang } 4362*aa070789SRoy Zang 4363*aa070789SRoy Zang /****************************************************************************** 4364*aa070789SRoy Zang * IGP phy init script - initializes the GbE PHY 4365*aa070789SRoy Zang * 4366*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 4367*aa070789SRoy Zang *****************************************************************************/ 4368*aa070789SRoy Zang static void 4369*aa070789SRoy Zang e1000_phy_init_script(struct e1000_hw *hw) 4370*aa070789SRoy Zang { 4371*aa070789SRoy Zang uint32_t ret_val; 4372*aa070789SRoy Zang uint16_t phy_saved_data; 4373*aa070789SRoy Zang DEBUGFUNC(); 4374*aa070789SRoy Zang 4375*aa070789SRoy Zang if (hw->phy_init_script) { 4376*aa070789SRoy Zang mdelay(20); 4377*aa070789SRoy Zang 4378*aa070789SRoy Zang /* Save off the current value of register 0x2F5B to be 4379*aa070789SRoy Zang * restored at the end of this routine. */ 4380*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data); 4381*aa070789SRoy Zang 4382*aa070789SRoy Zang /* Disabled the PHY transmitter */ 4383*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x2F5B, 0x0003); 4384*aa070789SRoy Zang 4385*aa070789SRoy Zang mdelay(20); 4386*aa070789SRoy Zang 4387*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x0000, 0x0140); 4388*aa070789SRoy Zang 4389*aa070789SRoy Zang mdelay(5); 4390*aa070789SRoy Zang 4391*aa070789SRoy Zang switch (hw->mac_type) { 4392*aa070789SRoy Zang case e1000_82541: 4393*aa070789SRoy Zang case e1000_82547: 4394*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F95, 0x0001); 4395*aa070789SRoy Zang 4396*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F71, 0xBD21); 4397*aa070789SRoy Zang 4398*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F79, 0x0018); 4399*aa070789SRoy Zang 4400*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F30, 0x1600); 4401*aa070789SRoy Zang 4402*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F31, 0x0014); 4403*aa070789SRoy Zang 4404*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F32, 0x161C); 4405*aa070789SRoy Zang 4406*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F94, 0x0003); 4407*aa070789SRoy Zang 4408*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F96, 0x003F); 4409*aa070789SRoy Zang 4410*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x2010, 0x0008); 4411*aa070789SRoy Zang break; 4412*aa070789SRoy Zang 4413*aa070789SRoy Zang case e1000_82541_rev_2: 4414*aa070789SRoy Zang case e1000_82547_rev_2: 4415*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F73, 0x0099); 4416*aa070789SRoy Zang break; 4417*aa070789SRoy Zang default: 4418*aa070789SRoy Zang break; 4419*aa070789SRoy Zang } 4420*aa070789SRoy Zang 4421*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x0000, 0x3300); 4422*aa070789SRoy Zang 4423*aa070789SRoy Zang mdelay(20); 4424*aa070789SRoy Zang 4425*aa070789SRoy Zang /* Now enable the transmitter */ 4426*aa070789SRoy Zang e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data); 4427*aa070789SRoy Zang 4428*aa070789SRoy Zang if (hw->mac_type == e1000_82547) { 4429*aa070789SRoy Zang uint16_t fused, fine, coarse; 4430*aa070789SRoy Zang 4431*aa070789SRoy Zang /* Move to analog registers page */ 4432*aa070789SRoy Zang e1000_read_phy_reg(hw, 4433*aa070789SRoy Zang IGP01E1000_ANALOG_SPARE_FUSE_STATUS, &fused); 4434*aa070789SRoy Zang 4435*aa070789SRoy Zang if (!(fused & IGP01E1000_ANALOG_SPARE_FUSE_ENABLED)) { 4436*aa070789SRoy Zang e1000_read_phy_reg(hw, 4437*aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_STATUS, &fused); 4438*aa070789SRoy Zang 4439*aa070789SRoy Zang fine = fused & IGP01E1000_ANALOG_FUSE_FINE_MASK; 4440*aa070789SRoy Zang coarse = fused 4441*aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_COARSE_MASK; 4442*aa070789SRoy Zang 4443*aa070789SRoy Zang if (coarse > 4444*aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_COARSE_THRESH) { 4445*aa070789SRoy Zang coarse -= 4446*aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_COARSE_10; 4447*aa070789SRoy Zang fine -= IGP01E1000_ANALOG_FUSE_FINE_1; 4448*aa070789SRoy Zang } else if (coarse 4449*aa070789SRoy Zang == IGP01E1000_ANALOG_FUSE_COARSE_THRESH) 4450*aa070789SRoy Zang fine -= IGP01E1000_ANALOG_FUSE_FINE_10; 4451*aa070789SRoy Zang 4452*aa070789SRoy Zang fused = (fused 4453*aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_POLY_MASK) | 4454*aa070789SRoy Zang (fine 4455*aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_FINE_MASK) | 4456*aa070789SRoy Zang (coarse 4457*aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_COARSE_MASK); 4458*aa070789SRoy Zang 4459*aa070789SRoy Zang e1000_write_phy_reg(hw, 4460*aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_CONTROL, fused); 4461*aa070789SRoy Zang e1000_write_phy_reg(hw, 4462*aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_BYPASS, 4463*aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL); 4464*aa070789SRoy Zang } 4465*aa070789SRoy Zang } 4466*aa070789SRoy Zang } 44672439e4bfSJean-Christophe PLAGNIOL-VILLARD } 44682439e4bfSJean-Christophe PLAGNIOL-VILLARD 44692439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 44702439e4bfSJean-Christophe PLAGNIOL-VILLARD * Resets the PHY 44712439e4bfSJean-Christophe PLAGNIOL-VILLARD * 44722439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 44732439e4bfSJean-Christophe PLAGNIOL-VILLARD * 4474*aa070789SRoy Zang * Sets bit 15 of the MII Control register 44752439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 4476*aa070789SRoy Zang int32_t 44772439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_phy_reset(struct e1000_hw *hw) 44782439e4bfSJean-Christophe PLAGNIOL-VILLARD { 4479*aa070789SRoy Zang int32_t ret_val; 44802439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 44812439e4bfSJean-Christophe PLAGNIOL-VILLARD 44822439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 44832439e4bfSJean-Christophe PLAGNIOL-VILLARD 4484*aa070789SRoy Zang /* In the case of the phy reset being blocked, it's not an error, we 4485*aa070789SRoy Zang * simply return success without performing the reset. */ 4486*aa070789SRoy Zang ret_val = e1000_check_phy_reset_block(hw); 4487*aa070789SRoy Zang if (ret_val) 4488*aa070789SRoy Zang return E1000_SUCCESS; 4489*aa070789SRoy Zang 4490*aa070789SRoy Zang switch (hw->phy_type) { 4491*aa070789SRoy Zang case e1000_phy_igp: 4492*aa070789SRoy Zang case e1000_phy_igp_2: 4493*aa070789SRoy Zang case e1000_phy_igp_3: 4494*aa070789SRoy Zang case e1000_phy_ife: 4495*aa070789SRoy Zang ret_val = e1000_phy_hw_reset(hw); 4496*aa070789SRoy Zang if (ret_val) 4497*aa070789SRoy Zang return ret_val; 4498*aa070789SRoy Zang break; 4499*aa070789SRoy Zang default: 4500*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data); 4501*aa070789SRoy Zang if (ret_val) 4502*aa070789SRoy Zang return ret_val; 4503*aa070789SRoy Zang 45042439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= MII_CR_RESET; 4505*aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data); 4506*aa070789SRoy Zang if (ret_val) 4507*aa070789SRoy Zang return ret_val; 4508*aa070789SRoy Zang 45092439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(1); 4510*aa070789SRoy Zang break; 4511*aa070789SRoy Zang } 4512*aa070789SRoy Zang 4513*aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2) 4514*aa070789SRoy Zang e1000_phy_init_script(hw); 4515*aa070789SRoy Zang 4516*aa070789SRoy Zang return E1000_SUCCESS; 45172439e4bfSJean-Christophe PLAGNIOL-VILLARD } 45182439e4bfSJean-Christophe PLAGNIOL-VILLARD 45191aeed8d7SWolfgang Denk static int e1000_set_phy_type (struct e1000_hw *hw) 4520ac3315c2SAndre Schwarz { 4521ac3315c2SAndre Schwarz DEBUGFUNC (); 4522ac3315c2SAndre Schwarz 4523ac3315c2SAndre Schwarz if (hw->mac_type == e1000_undefined) 4524ac3315c2SAndre Schwarz return -E1000_ERR_PHY_TYPE; 4525ac3315c2SAndre Schwarz 4526ac3315c2SAndre Schwarz switch (hw->phy_id) { 4527ac3315c2SAndre Schwarz case M88E1000_E_PHY_ID: 4528ac3315c2SAndre Schwarz case M88E1000_I_PHY_ID: 4529ac3315c2SAndre Schwarz case M88E1011_I_PHY_ID: 4530*aa070789SRoy Zang case M88E1111_I_PHY_ID: 4531ac3315c2SAndre Schwarz hw->phy_type = e1000_phy_m88; 4532ac3315c2SAndre Schwarz break; 4533ac3315c2SAndre Schwarz case IGP01E1000_I_PHY_ID: 4534ac3315c2SAndre Schwarz if (hw->mac_type == e1000_82541 || 4535*aa070789SRoy Zang hw->mac_type == e1000_82541_rev_2 || 4536*aa070789SRoy Zang hw->mac_type == e1000_82547 || 4537*aa070789SRoy Zang hw->mac_type == e1000_82547_rev_2) { 4538ac3315c2SAndre Schwarz hw->phy_type = e1000_phy_igp; 4539*aa070789SRoy Zang hw->phy_type = e1000_phy_igp; 4540*aa070789SRoy Zang break; 4541*aa070789SRoy Zang } 4542*aa070789SRoy Zang case IGP03E1000_E_PHY_ID: 4543*aa070789SRoy Zang hw->phy_type = e1000_phy_igp_3; 4544*aa070789SRoy Zang break; 4545*aa070789SRoy Zang case IFE_E_PHY_ID: 4546*aa070789SRoy Zang case IFE_PLUS_E_PHY_ID: 4547*aa070789SRoy Zang case IFE_C_E_PHY_ID: 4548*aa070789SRoy Zang hw->phy_type = e1000_phy_ife; 4549*aa070789SRoy Zang break; 4550*aa070789SRoy Zang case GG82563_E_PHY_ID: 4551*aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 4552*aa070789SRoy Zang hw->phy_type = e1000_phy_gg82563; 4553ac3315c2SAndre Schwarz break; 4554ac3315c2SAndre Schwarz } 4555ac3315c2SAndre Schwarz /* Fall Through */ 4556ac3315c2SAndre Schwarz default: 4557ac3315c2SAndre Schwarz /* Should never have loaded on this device */ 4558ac3315c2SAndre Schwarz hw->phy_type = e1000_phy_undefined; 4559ac3315c2SAndre Schwarz return -E1000_ERR_PHY_TYPE; 4560ac3315c2SAndre Schwarz } 4561ac3315c2SAndre Schwarz 4562ac3315c2SAndre Schwarz return E1000_SUCCESS; 4563ac3315c2SAndre Schwarz } 4564ac3315c2SAndre Schwarz 45652439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 45662439e4bfSJean-Christophe PLAGNIOL-VILLARD * Probes the expected PHY address for known PHY IDs 45672439e4bfSJean-Christophe PLAGNIOL-VILLARD * 45682439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 45692439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 4570*aa070789SRoy Zang static int32_t 45712439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_detect_gig_phy(struct e1000_hw *hw) 45722439e4bfSJean-Christophe PLAGNIOL-VILLARD { 4573*aa070789SRoy Zang int32_t phy_init_status, ret_val; 45742439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_id_high, phy_id_low; 4575*aa070789SRoy Zang boolean_t match = FALSE; 45762439e4bfSJean-Christophe PLAGNIOL-VILLARD 45772439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 45782439e4bfSJean-Christophe PLAGNIOL-VILLARD 4579*aa070789SRoy Zang /* The 82571 firmware may still be configuring the PHY. In this 4580*aa070789SRoy Zang * case, we cannot access the PHY until the configuration is done. So 4581*aa070789SRoy Zang * we explicitly set the PHY values. */ 4582*aa070789SRoy Zang if (hw->mac_type == e1000_82571 || 4583*aa070789SRoy Zang hw->mac_type == e1000_82572) { 4584*aa070789SRoy Zang hw->phy_id = IGP01E1000_I_PHY_ID; 4585*aa070789SRoy Zang hw->phy_type = e1000_phy_igp_2; 4586*aa070789SRoy Zang return E1000_SUCCESS; 4587*aa070789SRoy Zang } 4588*aa070789SRoy Zang 4589*aa070789SRoy Zang /* ESB-2 PHY reads require e1000_phy_gg82563 to be set because of a 4590*aa070789SRoy Zang * work- around that forces PHY page 0 to be set or the reads fail. 4591*aa070789SRoy Zang * The rest of the code in this routine uses e1000_read_phy_reg to 4592*aa070789SRoy Zang * read the PHY ID. So for ESB-2 we need to have this set so our 4593*aa070789SRoy Zang * reads won't fail. If the attached PHY is not a e1000_phy_gg82563, 4594*aa070789SRoy Zang * the routines below will figure this out as well. */ 4595*aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) 4596*aa070789SRoy Zang hw->phy_type = e1000_phy_gg82563; 4597*aa070789SRoy Zang 45982439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the PHY ID Registers to identify which PHY is onboard. */ 4599*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high); 4600*aa070789SRoy Zang if (ret_val) 4601*aa070789SRoy Zang return ret_val; 4602*aa070789SRoy Zang 46032439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->phy_id = (uint32_t) (phy_id_high << 16); 4604*aa070789SRoy Zang udelay(20); 4605*aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low); 4606*aa070789SRoy Zang if (ret_val) 4607*aa070789SRoy Zang return ret_val; 4608*aa070789SRoy Zang 46092439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->phy_id |= (uint32_t) (phy_id_low & PHY_REVISION_MASK); 4610*aa070789SRoy Zang hw->phy_revision = (uint32_t) phy_id_low & ~PHY_REVISION_MASK; 46112439e4bfSJean-Christophe PLAGNIOL-VILLARD 46122439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->mac_type) { 46132439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82543: 46142439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->phy_id == M88E1000_E_PHY_ID) 46152439e4bfSJean-Christophe PLAGNIOL-VILLARD match = TRUE; 46162439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 46172439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82544: 46182439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->phy_id == M88E1000_I_PHY_ID) 46192439e4bfSJean-Christophe PLAGNIOL-VILLARD match = TRUE; 46202439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 46212439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82540: 46222439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82545: 4623*aa070789SRoy Zang case e1000_82545_rev_3: 46242439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82546: 4625*aa070789SRoy Zang case e1000_82546_rev_3: 46262439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->phy_id == M88E1011_I_PHY_ID) 46272439e4bfSJean-Christophe PLAGNIOL-VILLARD match = TRUE; 46282439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 4629*aa070789SRoy Zang case e1000_82541: 4630ac3315c2SAndre Schwarz case e1000_82541_rev_2: 4631*aa070789SRoy Zang case e1000_82547: 4632*aa070789SRoy Zang case e1000_82547_rev_2: 4633ac3315c2SAndre Schwarz if(hw->phy_id == IGP01E1000_I_PHY_ID) 4634ac3315c2SAndre Schwarz match = TRUE; 4635ac3315c2SAndre Schwarz 4636ac3315c2SAndre Schwarz break; 4637*aa070789SRoy Zang case e1000_82573: 4638*aa070789SRoy Zang if (hw->phy_id == M88E1111_I_PHY_ID) 4639*aa070789SRoy Zang match = TRUE; 4640*aa070789SRoy Zang break; 4641*aa070789SRoy Zang case e1000_80003es2lan: 4642*aa070789SRoy Zang if (hw->phy_id == GG82563_E_PHY_ID) 4643*aa070789SRoy Zang match = TRUE; 4644*aa070789SRoy Zang break; 4645*aa070789SRoy Zang case e1000_ich8lan: 4646*aa070789SRoy Zang if (hw->phy_id == IGP03E1000_E_PHY_ID) 4647*aa070789SRoy Zang match = TRUE; 4648*aa070789SRoy Zang if (hw->phy_id == IFE_E_PHY_ID) 4649*aa070789SRoy Zang match = TRUE; 4650*aa070789SRoy Zang if (hw->phy_id == IFE_PLUS_E_PHY_ID) 4651*aa070789SRoy Zang match = TRUE; 4652*aa070789SRoy Zang if (hw->phy_id == IFE_C_E_PHY_ID) 4653*aa070789SRoy Zang match = TRUE; 4654*aa070789SRoy Zang break; 46552439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 46562439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Invalid MAC type %d\n", hw->mac_type); 46572439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 46582439e4bfSJean-Christophe PLAGNIOL-VILLARD } 4659ac3315c2SAndre Schwarz 4660ac3315c2SAndre Schwarz phy_init_status = e1000_set_phy_type(hw); 4661ac3315c2SAndre Schwarz 4662ac3315c2SAndre Schwarz if ((match) && (phy_init_status == E1000_SUCCESS)) { 46632439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY ID 0x%X detected\n", hw->phy_id); 46642439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 46652439e4bfSJean-Christophe PLAGNIOL-VILLARD } 46662439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Invalid PHY ID 0x%X\n", hw->phy_id); 46672439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 46682439e4bfSJean-Christophe PLAGNIOL-VILLARD } 46692439e4bfSJean-Christophe PLAGNIOL-VILLARD 4670*aa070789SRoy Zang /***************************************************************************** 4671*aa070789SRoy Zang * Set media type and TBI compatibility. 4672*aa070789SRoy Zang * 4673*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 4674*aa070789SRoy Zang * **************************************************************************/ 4675*aa070789SRoy Zang void 4676*aa070789SRoy Zang e1000_set_media_type(struct e1000_hw *hw) 4677*aa070789SRoy Zang { 4678*aa070789SRoy Zang uint32_t status; 4679*aa070789SRoy Zang 4680*aa070789SRoy Zang DEBUGFUNC(); 4681*aa070789SRoy Zang 4682*aa070789SRoy Zang if (hw->mac_type != e1000_82543) { 4683*aa070789SRoy Zang /* tbi_compatibility is only valid on 82543 */ 4684*aa070789SRoy Zang hw->tbi_compatibility_en = FALSE; 4685*aa070789SRoy Zang } 4686*aa070789SRoy Zang 4687*aa070789SRoy Zang switch (hw->device_id) { 4688*aa070789SRoy Zang case E1000_DEV_ID_82545GM_SERDES: 4689*aa070789SRoy Zang case E1000_DEV_ID_82546GB_SERDES: 4690*aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES: 4691*aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_DUAL: 4692*aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_QUAD: 4693*aa070789SRoy Zang case E1000_DEV_ID_82572EI_SERDES: 4694*aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: 4695*aa070789SRoy Zang hw->media_type = e1000_media_type_internal_serdes; 4696*aa070789SRoy Zang break; 4697*aa070789SRoy Zang default: 4698*aa070789SRoy Zang switch (hw->mac_type) { 4699*aa070789SRoy Zang case e1000_82542_rev2_0: 4700*aa070789SRoy Zang case e1000_82542_rev2_1: 4701*aa070789SRoy Zang hw->media_type = e1000_media_type_fiber; 4702*aa070789SRoy Zang break; 4703*aa070789SRoy Zang case e1000_ich8lan: 4704*aa070789SRoy Zang case e1000_82573: 4705*aa070789SRoy Zang /* The STATUS_TBIMODE bit is reserved or reused 4706*aa070789SRoy Zang * for the this device. 4707*aa070789SRoy Zang */ 4708*aa070789SRoy Zang hw->media_type = e1000_media_type_copper; 4709*aa070789SRoy Zang break; 4710*aa070789SRoy Zang default: 4711*aa070789SRoy Zang status = E1000_READ_REG(hw, STATUS); 4712*aa070789SRoy Zang if (status & E1000_STATUS_TBIMODE) { 4713*aa070789SRoy Zang hw->media_type = e1000_media_type_fiber; 4714*aa070789SRoy Zang /* tbi_compatibility not valid on fiber */ 4715*aa070789SRoy Zang hw->tbi_compatibility_en = FALSE; 4716*aa070789SRoy Zang } else { 4717*aa070789SRoy Zang hw->media_type = e1000_media_type_copper; 4718*aa070789SRoy Zang } 4719*aa070789SRoy Zang break; 4720*aa070789SRoy Zang } 4721*aa070789SRoy Zang } 4722*aa070789SRoy Zang } 4723*aa070789SRoy Zang 47242439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 47252439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_sw_init - Initialize general software structures (struct e1000_adapter) 47262439e4bfSJean-Christophe PLAGNIOL-VILLARD * 47272439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_sw_init initializes the Adapter private data structure. 47282439e4bfSJean-Christophe PLAGNIOL-VILLARD * Fields are initialized based on PCI device information and 47292439e4bfSJean-Christophe PLAGNIOL-VILLARD * OS network device settings (MTU size). 47302439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 47312439e4bfSJean-Christophe PLAGNIOL-VILLARD 47322439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 47332439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_sw_init(struct eth_device *nic, int cardnum) 47342439e4bfSJean-Christophe PLAGNIOL-VILLARD { 47352439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = (typeof(hw)) nic->priv; 47362439e4bfSJean-Christophe PLAGNIOL-VILLARD int result; 47372439e4bfSJean-Christophe PLAGNIOL-VILLARD 47382439e4bfSJean-Christophe PLAGNIOL-VILLARD /* PCI config space info */ 47392439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_VENDOR_ID, &hw->vendor_id); 47402439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_DEVICE_ID, &hw->device_id); 47412439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_SUBSYSTEM_VENDOR_ID, 47422439e4bfSJean-Christophe PLAGNIOL-VILLARD &hw->subsystem_vendor_id); 47432439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_SUBSYSTEM_ID, &hw->subsystem_id); 47442439e4bfSJean-Christophe PLAGNIOL-VILLARD 47452439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_byte(hw->pdev, PCI_REVISION_ID, &hw->revision_id); 47462439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_COMMAND, &hw->pci_cmd_word); 47472439e4bfSJean-Christophe PLAGNIOL-VILLARD 47482439e4bfSJean-Christophe PLAGNIOL-VILLARD /* identify the MAC */ 47492439e4bfSJean-Christophe PLAGNIOL-VILLARD result = e1000_set_mac_type(hw); 47502439e4bfSJean-Christophe PLAGNIOL-VILLARD if (result) { 47512439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_ERR("Unknown MAC Type\n"); 47522439e4bfSJean-Christophe PLAGNIOL-VILLARD return result; 47532439e4bfSJean-Christophe PLAGNIOL-VILLARD } 47542439e4bfSJean-Christophe PLAGNIOL-VILLARD 4755*aa070789SRoy Zang switch (hw->mac_type) { 4756*aa070789SRoy Zang default: 4757*aa070789SRoy Zang break; 4758*aa070789SRoy Zang case e1000_82541: 4759*aa070789SRoy Zang case e1000_82547: 4760*aa070789SRoy Zang case e1000_82541_rev_2: 4761*aa070789SRoy Zang case e1000_82547_rev_2: 4762*aa070789SRoy Zang hw->phy_init_script = 1; 4763*aa070789SRoy Zang break; 4764*aa070789SRoy Zang } 4765*aa070789SRoy Zang 47662439e4bfSJean-Christophe PLAGNIOL-VILLARD /* lan a vs. lan b settings */ 47672439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82546) 47682439e4bfSJean-Christophe PLAGNIOL-VILLARD /*this also works w/ multiple 82546 cards */ 47692439e4bfSJean-Christophe PLAGNIOL-VILLARD /*but not if they're intermingled /w other e1000s */ 47702439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->lan_loc = (cardnum % 2) ? e1000_lan_b : e1000_lan_a; 47712439e4bfSJean-Christophe PLAGNIOL-VILLARD else 47722439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->lan_loc = e1000_lan_a; 47732439e4bfSJean-Christophe PLAGNIOL-VILLARD 47742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* flow control settings */ 47752439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_high_water = E1000_FC_HIGH_THRESH; 47762439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_low_water = E1000_FC_LOW_THRESH; 47772439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_pause_time = E1000_FC_PAUSE_TIME; 47782439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_send_xon = 1; 47792439e4bfSJean-Christophe PLAGNIOL-VILLARD 47802439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Media type - copper or fiber */ 4781*aa070789SRoy Zang e1000_set_media_type(hw); 47822439e4bfSJean-Christophe PLAGNIOL-VILLARD 47832439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82543) { 47842439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status = E1000_READ_REG(hw, STATUS); 47852439e4bfSJean-Christophe PLAGNIOL-VILLARD 47862439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_TBIMODE) { 47872439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("fiber interface\n"); 47882439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->media_type = e1000_media_type_fiber; 47892439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 47902439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("copper interface\n"); 47912439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->media_type = e1000_media_type_copper; 47922439e4bfSJean-Christophe PLAGNIOL-VILLARD } 47932439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 47942439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->media_type = e1000_media_type_fiber; 47952439e4bfSJean-Christophe PLAGNIOL-VILLARD } 47962439e4bfSJean-Christophe PLAGNIOL-VILLARD 4797*aa070789SRoy Zang hw->tbi_compatibility_en = TRUE; 4798*aa070789SRoy Zang hw->wait_autoneg_complete = TRUE; 47992439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type < e1000_82543) 48002439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->report_tx_early = 0; 48012439e4bfSJean-Christophe PLAGNIOL-VILLARD else 48022439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->report_tx_early = 1; 48032439e4bfSJean-Christophe PLAGNIOL-VILLARD 48042439e4bfSJean-Christophe PLAGNIOL-VILLARD return E1000_SUCCESS; 48052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 48062439e4bfSJean-Christophe PLAGNIOL-VILLARD 48072439e4bfSJean-Christophe PLAGNIOL-VILLARD void 48082439e4bfSJean-Christophe PLAGNIOL-VILLARD fill_rx(struct e1000_hw *hw) 48092439e4bfSJean-Christophe PLAGNIOL-VILLARD { 48102439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_rx_desc *rd; 48112439e4bfSJean-Christophe PLAGNIOL-VILLARD 48122439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_last = rx_tail; 48132439e4bfSJean-Christophe PLAGNIOL-VILLARD rd = rx_base + rx_tail; 48142439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_tail = (rx_tail + 1) % 8; 48152439e4bfSJean-Christophe PLAGNIOL-VILLARD memset(rd, 0, 16); 48162439e4bfSJean-Christophe PLAGNIOL-VILLARD rd->buffer_addr = cpu_to_le64((u32) & packet); 48172439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDT, rx_tail); 48182439e4bfSJean-Christophe PLAGNIOL-VILLARD } 48192439e4bfSJean-Christophe PLAGNIOL-VILLARD 48202439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 48212439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_configure_tx - Configure 8254x Transmit Unit after Reset 48222439e4bfSJean-Christophe PLAGNIOL-VILLARD * @adapter: board private structure 48232439e4bfSJean-Christophe PLAGNIOL-VILLARD * 48242439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configure the Tx unit of the MAC after a reset. 48252439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 48262439e4bfSJean-Christophe PLAGNIOL-VILLARD 48272439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 48282439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_tx(struct e1000_hw *hw) 48292439e4bfSJean-Christophe PLAGNIOL-VILLARD { 48302439e4bfSJean-Christophe PLAGNIOL-VILLARD unsigned long ptr; 48312439e4bfSJean-Christophe PLAGNIOL-VILLARD unsigned long tctl; 4832*aa070789SRoy Zang unsigned long tipg, tarc; 4833*aa070789SRoy Zang uint32_t ipgr1, ipgr2; 48342439e4bfSJean-Christophe PLAGNIOL-VILLARD 48352439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (u32) tx_pool; 48362439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ptr & 0xf) 48372439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (ptr + 0x10) & (~0xf); 48382439e4bfSJean-Christophe PLAGNIOL-VILLARD 48392439e4bfSJean-Christophe PLAGNIOL-VILLARD tx_base = (typeof(tx_base)) ptr; 48402439e4bfSJean-Christophe PLAGNIOL-VILLARD 48412439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDBAL, (u32) tx_base); 48422439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDBAH, 0); 48432439e4bfSJean-Christophe PLAGNIOL-VILLARD 48442439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDLEN, 128); 48452439e4bfSJean-Christophe PLAGNIOL-VILLARD 48462439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the HW Tx Head and Tail descriptor pointers */ 48472439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDH, 0); 48482439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDT, 0); 48492439e4bfSJean-Christophe PLAGNIOL-VILLARD tx_tail = 0; 48502439e4bfSJean-Christophe PLAGNIOL-VILLARD 48512439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the default values for the Tx Inter Packet Gap timer */ 4852*aa070789SRoy Zang if (hw->mac_type <= e1000_82547_rev_2 && 4853*aa070789SRoy Zang (hw->media_type == e1000_media_type_fiber || 4854*aa070789SRoy Zang hw->media_type == e1000_media_type_internal_serdes)) 4855*aa070789SRoy Zang tipg = DEFAULT_82543_TIPG_IPGT_FIBER; 4856*aa070789SRoy Zang else 4857*aa070789SRoy Zang tipg = DEFAULT_82543_TIPG_IPGT_COPPER; 4858*aa070789SRoy Zang 4859*aa070789SRoy Zang /* Set the default values for the Tx Inter Packet Gap timer */ 48602439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->mac_type) { 48612439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82542_rev2_0: 48622439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82542_rev2_1: 48632439e4bfSJean-Christophe PLAGNIOL-VILLARD tipg = DEFAULT_82542_TIPG_IPGT; 4864*aa070789SRoy Zang ipgr1 = DEFAULT_82542_TIPG_IPGR1; 4865*aa070789SRoy Zang ipgr2 = DEFAULT_82542_TIPG_IPGR2; 4866*aa070789SRoy Zang break; 4867*aa070789SRoy Zang case e1000_80003es2lan: 4868*aa070789SRoy Zang ipgr1 = DEFAULT_82543_TIPG_IPGR1; 4869*aa070789SRoy Zang ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; 48702439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 48712439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 4872*aa070789SRoy Zang ipgr1 = DEFAULT_82543_TIPG_IPGR1; 4873*aa070789SRoy Zang ipgr2 = DEFAULT_82543_TIPG_IPGR2; 4874*aa070789SRoy Zang break; 48752439e4bfSJean-Christophe PLAGNIOL-VILLARD } 4876*aa070789SRoy Zang tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT; 4877*aa070789SRoy Zang tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT; 48782439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TIPG, tipg); 48792439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Program the Transmit Control Register */ 48802439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl = E1000_READ_REG(hw, TCTL); 48812439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl &= ~E1000_TCTL_CT; 48822439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl |= E1000_TCTL_EN | E1000_TCTL_PSP | 48832439e4bfSJean-Christophe PLAGNIOL-VILLARD (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT); 4884*aa070789SRoy Zang 4885*aa070789SRoy Zang if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) { 4886*aa070789SRoy Zang tarc = E1000_READ_REG(hw, TARC0); 4887*aa070789SRoy Zang /* set the speed mode bit, we'll clear it if we're not at 4888*aa070789SRoy Zang * gigabit link later */ 4889*aa070789SRoy Zang /* git bit can be set to 1*/ 4890*aa070789SRoy Zang } else if (hw->mac_type == e1000_80003es2lan) { 4891*aa070789SRoy Zang tarc = E1000_READ_REG(hw, TARC0); 4892*aa070789SRoy Zang tarc |= 1; 4893*aa070789SRoy Zang E1000_WRITE_REG(hw, TARC0, tarc); 4894*aa070789SRoy Zang tarc = E1000_READ_REG(hw, TARC1); 4895*aa070789SRoy Zang tarc |= 1; 4896*aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, tarc); 4897*aa070789SRoy Zang } 4898*aa070789SRoy Zang 48992439e4bfSJean-Christophe PLAGNIOL-VILLARD 49002439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 4901*aa070789SRoy Zang /* Setup Transmit Descriptor Settings for eop descriptor */ 4902*aa070789SRoy Zang hw->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS; 49032439e4bfSJean-Christophe PLAGNIOL-VILLARD 4904*aa070789SRoy Zang /* Need to set up RS bit */ 4905*aa070789SRoy Zang if (hw->mac_type < e1000_82543) 4906*aa070789SRoy Zang hw->txd_cmd |= E1000_TXD_CMD_RPS; 49072439e4bfSJean-Christophe PLAGNIOL-VILLARD else 4908*aa070789SRoy Zang hw->txd_cmd |= E1000_TXD_CMD_RS; 4909*aa070789SRoy Zang E1000_WRITE_REG(hw, TCTL, tctl); 49102439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49112439e4bfSJean-Christophe PLAGNIOL-VILLARD 49122439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 49132439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_setup_rctl - configure the receive control register 49142439e4bfSJean-Christophe PLAGNIOL-VILLARD * @adapter: Board private structure 49152439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 49162439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 49172439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_rctl(struct e1000_hw *hw) 49182439e4bfSJean-Christophe PLAGNIOL-VILLARD { 49192439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t rctl; 49202439e4bfSJean-Christophe PLAGNIOL-VILLARD 49212439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 49222439e4bfSJean-Christophe PLAGNIOL-VILLARD 49232439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~(3 << E1000_RCTL_MO_SHIFT); 49242439e4bfSJean-Christophe PLAGNIOL-VILLARD 4925*aa070789SRoy Zang rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO 4926*aa070789SRoy Zang | E1000_RCTL_RDMTS_HALF; /* | 49272439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw.mc_filter_type << E1000_RCTL_MO_SHIFT); */ 49282439e4bfSJean-Christophe PLAGNIOL-VILLARD 49292439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->tbi_compatibility_on == 1) 49302439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl |= E1000_RCTL_SBP; 49312439e4bfSJean-Christophe PLAGNIOL-VILLARD else 49322439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~E1000_RCTL_SBP; 49332439e4bfSJean-Christophe PLAGNIOL-VILLARD 49342439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~(E1000_RCTL_SZ_4096); 49352439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl |= E1000_RCTL_SZ_2048; 49362439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~(E1000_RCTL_BSEX | E1000_RCTL_LPE); 49372439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 49382439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49392439e4bfSJean-Christophe PLAGNIOL-VILLARD 49402439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 49412439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_configure_rx - Configure 8254x Receive Unit after Reset 49422439e4bfSJean-Christophe PLAGNIOL-VILLARD * @adapter: board private structure 49432439e4bfSJean-Christophe PLAGNIOL-VILLARD * 49442439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configure the Rx unit of the MAC after a reset. 49452439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 49462439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 49472439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_rx(struct e1000_hw *hw) 49482439e4bfSJean-Christophe PLAGNIOL-VILLARD { 49492439e4bfSJean-Christophe PLAGNIOL-VILLARD unsigned long ptr; 4950*aa070789SRoy Zang unsigned long rctl, ctrl_ext; 49512439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_tail = 0; 49522439e4bfSJean-Christophe PLAGNIOL-VILLARD /* make sure receives are disabled while setting up the descriptors */ 49532439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 49542439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN); 49552439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82540) { 49562439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the interrupt throttling rate. Value is calculated 49572439e4bfSJean-Christophe PLAGNIOL-VILLARD * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */ 49582439e4bfSJean-Christophe PLAGNIOL-VILLARD #define MAX_INTS_PER_SEC 8000 49592439e4bfSJean-Christophe PLAGNIOL-VILLARD #define DEFAULT_ITR 1000000000/(MAX_INTS_PER_SEC * 256) 49602439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, ITR, DEFAULT_ITR); 49612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49622439e4bfSJean-Christophe PLAGNIOL-VILLARD 4963*aa070789SRoy Zang if (hw->mac_type >= e1000_82571) { 4964*aa070789SRoy Zang ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 4965*aa070789SRoy Zang /* Reset delay timers after every interrupt */ 4966*aa070789SRoy Zang ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; 4967*aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 4968*aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 4969*aa070789SRoy Zang } 49702439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the Base and Length of the Rx Descriptor Ring */ 49712439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (u32) rx_pool; 49722439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ptr & 0xf) 49732439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (ptr + 0x10) & (~0xf); 49742439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_base = (typeof(rx_base)) ptr; 49752439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDBAL, (u32) rx_base); 49762439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDBAH, 0); 49772439e4bfSJean-Christophe PLAGNIOL-VILLARD 49782439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDLEN, 128); 49792439e4bfSJean-Christophe PLAGNIOL-VILLARD 49802439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the HW Rx Head and Tail Descriptor Pointers */ 49812439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDH, 0); 49822439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDT, 0); 49832439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Enable Receives */ 49842439e4bfSJean-Christophe PLAGNIOL-VILLARD 49852439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 49862439e4bfSJean-Christophe PLAGNIOL-VILLARD fill_rx(hw); 49872439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49882439e4bfSJean-Christophe PLAGNIOL-VILLARD 49892439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 49902439e4bfSJean-Christophe PLAGNIOL-VILLARD POLL - Wait for a frame 49912439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 49922439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 49932439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_poll(struct eth_device *nic) 49942439e4bfSJean-Christophe PLAGNIOL-VILLARD { 49952439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 49962439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_rx_desc *rd; 49972439e4bfSJean-Christophe PLAGNIOL-VILLARD /* return true if there's an ethernet packet ready to read */ 49982439e4bfSJean-Christophe PLAGNIOL-VILLARD rd = rx_base + rx_last; 49992439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(le32_to_cpu(rd->status)) & E1000_RXD_STAT_DD) 50002439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 50012439e4bfSJean-Christophe PLAGNIOL-VILLARD /*DEBUGOUT("recv: packet len=%d \n", rd->length); */ 50022439e4bfSJean-Christophe PLAGNIOL-VILLARD NetReceive((uchar *)packet, le32_to_cpu(rd->length)); 50032439e4bfSJean-Christophe PLAGNIOL-VILLARD fill_rx(hw); 50042439e4bfSJean-Christophe PLAGNIOL-VILLARD return 1; 50052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50062439e4bfSJean-Christophe PLAGNIOL-VILLARD 50072439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 50082439e4bfSJean-Christophe PLAGNIOL-VILLARD TRANSMIT - Transmit a frame 50092439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 50102439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 50112439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_transmit(struct eth_device *nic, volatile void *packet, int length) 50122439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50132439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50142439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_tx_desc *txp; 50152439e4bfSJean-Christophe PLAGNIOL-VILLARD int i = 0; 50162439e4bfSJean-Christophe PLAGNIOL-VILLARD 50172439e4bfSJean-Christophe PLAGNIOL-VILLARD txp = tx_base + tx_tail; 50182439e4bfSJean-Christophe PLAGNIOL-VILLARD tx_tail = (tx_tail + 1) % 8; 50192439e4bfSJean-Christophe PLAGNIOL-VILLARD 50202439e4bfSJean-Christophe PLAGNIOL-VILLARD txp->buffer_addr = cpu_to_le64(virt_to_bus(packet)); 5021*aa070789SRoy Zang txp->lower.data = cpu_to_le32(hw->txd_cmd | length); 50222439e4bfSJean-Christophe PLAGNIOL-VILLARD txp->upper.data = 0; 50232439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDT, tx_tail); 50242439e4bfSJean-Christophe PLAGNIOL-VILLARD 5025*aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 50262439e4bfSJean-Christophe PLAGNIOL-VILLARD while (!(le32_to_cpu(txp->upper.data) & E1000_TXD_STAT_DD)) { 50272439e4bfSJean-Christophe PLAGNIOL-VILLARD if (i++ > TOUT_LOOP) { 50282439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("e1000: tx timeout\n"); 50292439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 50302439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50312439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); /* give the nic a chance to write to the register */ 50322439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50332439e4bfSJean-Christophe PLAGNIOL-VILLARD return 1; 50342439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50352439e4bfSJean-Christophe PLAGNIOL-VILLARD 50362439e4bfSJean-Christophe PLAGNIOL-VILLARD /*reset function*/ 50372439e4bfSJean-Christophe PLAGNIOL-VILLARD static inline int 50382439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_reset(struct eth_device *nic) 50392439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50402439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50412439e4bfSJean-Christophe PLAGNIOL-VILLARD 50422439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_reset_hw(hw); 50432439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82544) { 50442439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, WUC, 0); 50452439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50462439e4bfSJean-Christophe PLAGNIOL-VILLARD return e1000_init_hw(nic); 50472439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50482439e4bfSJean-Christophe PLAGNIOL-VILLARD 50492439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 50502439e4bfSJean-Christophe PLAGNIOL-VILLARD DISABLE - Turn off ethernet interface 50512439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 50522439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 50532439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_disable(struct eth_device *nic) 50542439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50552439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50562439e4bfSJean-Christophe PLAGNIOL-VILLARD 50572439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Turn off the ethernet interface */ 50582439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, 0); 50592439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TCTL, 0); 50602439e4bfSJean-Christophe PLAGNIOL-VILLARD 50612439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear the transmit ring */ 50622439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDH, 0); 50632439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDT, 0); 50642439e4bfSJean-Christophe PLAGNIOL-VILLARD 50652439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear the receive ring */ 50662439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDH, 0); 50672439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDT, 0); 50682439e4bfSJean-Christophe PLAGNIOL-VILLARD 50692439e4bfSJean-Christophe PLAGNIOL-VILLARD /* put the card in its initial state */ 50702439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 50712439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, E1000_CTRL_RST); 50722439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 50732439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 50742439e4bfSJean-Christophe PLAGNIOL-VILLARD 50752439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50762439e4bfSJean-Christophe PLAGNIOL-VILLARD 50772439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 50782439e4bfSJean-Christophe PLAGNIOL-VILLARD INIT - set up ethernet interface(s) 50792439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 50802439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 50812439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init(struct eth_device *nic, bd_t * bis) 50822439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50832439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50842439e4bfSJean-Christophe PLAGNIOL-VILLARD int ret_val = 0; 50852439e4bfSJean-Christophe PLAGNIOL-VILLARD 50862439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_reset(nic); 50872439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 50882439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((ret_val == -E1000_ERR_NOLINK) || 50892439e4bfSJean-Christophe PLAGNIOL-VILLARD (ret_val == -E1000_ERR_TIMEOUT)) { 50902439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_ERR("Valid Link not detected\n"); 50912439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 50922439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_ERR("Hardware Initialization Failed\n"); 50932439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50942439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 50952439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50962439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_tx(hw); 50972439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_rctl(hw); 50982439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_rx(hw); 50992439e4bfSJean-Christophe PLAGNIOL-VILLARD return 1; 51002439e4bfSJean-Christophe PLAGNIOL-VILLARD } 51012439e4bfSJean-Christophe PLAGNIOL-VILLARD 5102*aa070789SRoy Zang /****************************************************************************** 5103*aa070789SRoy Zang * Gets the current PCI bus type of hardware 5104*aa070789SRoy Zang * 5105*aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 5106*aa070789SRoy Zang *****************************************************************************/ 5107*aa070789SRoy Zang void e1000_get_bus_type(struct e1000_hw *hw) 5108*aa070789SRoy Zang { 5109*aa070789SRoy Zang uint32_t status; 5110*aa070789SRoy Zang 5111*aa070789SRoy Zang switch (hw->mac_type) { 5112*aa070789SRoy Zang case e1000_82542_rev2_0: 5113*aa070789SRoy Zang case e1000_82542_rev2_1: 5114*aa070789SRoy Zang hw->bus_type = e1000_bus_type_pci; 5115*aa070789SRoy Zang break; 5116*aa070789SRoy Zang case e1000_82571: 5117*aa070789SRoy Zang case e1000_82572: 5118*aa070789SRoy Zang case e1000_82573: 5119*aa070789SRoy Zang case e1000_80003es2lan: 5120*aa070789SRoy Zang hw->bus_type = e1000_bus_type_pci_express; 5121*aa070789SRoy Zang break; 5122*aa070789SRoy Zang case e1000_ich8lan: 5123*aa070789SRoy Zang hw->bus_type = e1000_bus_type_pci_express; 5124*aa070789SRoy Zang break; 5125*aa070789SRoy Zang default: 5126*aa070789SRoy Zang status = E1000_READ_REG(hw, STATUS); 5127*aa070789SRoy Zang hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ? 5128*aa070789SRoy Zang e1000_bus_type_pcix : e1000_bus_type_pci; 5129*aa070789SRoy Zang break; 5130*aa070789SRoy Zang } 5131*aa070789SRoy Zang } 5132*aa070789SRoy Zang 51332439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 51342439e4bfSJean-Christophe PLAGNIOL-VILLARD PROBE - Look for an adapter, this routine's visible to the outside 51352439e4bfSJean-Christophe PLAGNIOL-VILLARD You should omit the last argument struct pci_device * for a non-PCI NIC 51362439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 51372439e4bfSJean-Christophe PLAGNIOL-VILLARD int 51382439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_initialize(bd_t * bis) 51392439e4bfSJean-Christophe PLAGNIOL-VILLARD { 51402439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_dev_t devno; 51412439e4bfSJean-Christophe PLAGNIOL-VILLARD int card_number = 0; 51422439e4bfSJean-Christophe PLAGNIOL-VILLARD struct eth_device *nic = NULL; 51432439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = NULL; 51442439e4bfSJean-Christophe PLAGNIOL-VILLARD u32 iobase; 51452439e4bfSJean-Christophe PLAGNIOL-VILLARD int idx = 0; 51462439e4bfSJean-Christophe PLAGNIOL-VILLARD u32 PciCommandWord; 51472439e4bfSJean-Christophe PLAGNIOL-VILLARD 51482439e4bfSJean-Christophe PLAGNIOL-VILLARD while (1) { /* Find PCI device(s) */ 51492439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((devno = pci_find_devices(supported, idx++)) < 0) { 51502439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 51512439e4bfSJean-Christophe PLAGNIOL-VILLARD } 51522439e4bfSJean-Christophe PLAGNIOL-VILLARD 51532439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_dword(devno, PCI_BASE_ADDRESS_0, &iobase); 51542439e4bfSJean-Christophe PLAGNIOL-VILLARD iobase &= ~0xf; /* Mask the bits that say "this is an io addr" */ 51552439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("e1000#%d: iobase 0x%08x\n", card_number, iobase); 51562439e4bfSJean-Christophe PLAGNIOL-VILLARD 51572439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_dword(devno, PCI_COMMAND, 51582439e4bfSJean-Christophe PLAGNIOL-VILLARD PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); 51592439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check if I/O accesses and Bus Mastering are enabled. */ 51602439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_dword(devno, PCI_COMMAND, &PciCommandWord); 51612439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(PciCommandWord & PCI_COMMAND_MEMORY)) { 51622439e4bfSJean-Christophe PLAGNIOL-VILLARD printf("Error: Can not enable MEM access.\n"); 51632439e4bfSJean-Christophe PLAGNIOL-VILLARD continue; 51642439e4bfSJean-Christophe PLAGNIOL-VILLARD } else if (!(PciCommandWord & PCI_COMMAND_MASTER)) { 51652439e4bfSJean-Christophe PLAGNIOL-VILLARD printf("Error: Can not enable Bus Mastering.\n"); 51662439e4bfSJean-Christophe PLAGNIOL-VILLARD continue; 51672439e4bfSJean-Christophe PLAGNIOL-VILLARD } 51682439e4bfSJean-Christophe PLAGNIOL-VILLARD 51692439e4bfSJean-Christophe PLAGNIOL-VILLARD nic = (struct eth_device *) malloc(sizeof (*nic)); 51702439e4bfSJean-Christophe PLAGNIOL-VILLARD hw = (struct e1000_hw *) malloc(sizeof (*hw)); 51712439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->pdev = devno; 51722439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->priv = hw; 51732439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->iobase = bus_to_phys(devno, iobase); 51742439e4bfSJean-Christophe PLAGNIOL-VILLARD 51752439e4bfSJean-Christophe PLAGNIOL-VILLARD sprintf(nic->name, "e1000#%d", card_number); 51762439e4bfSJean-Christophe PLAGNIOL-VILLARD 51772439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Are these variables needed? */ 51782439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_default; 51792439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->original_fc = e1000_fc_default; 51802439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 0; 5181*aa070789SRoy Zang hw->autoneg = 1; 51822439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->get_link_status = TRUE; 51832439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->hw_addr = (typeof(hw->hw_addr)) iobase; 51842439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_undefined; 51852439e4bfSJean-Christophe PLAGNIOL-VILLARD 51862439e4bfSJean-Christophe PLAGNIOL-VILLARD /* MAC and Phy settings */ 51872439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_sw_init(nic, card_number) < 0) { 51882439e4bfSJean-Christophe PLAGNIOL-VILLARD free(hw); 51892439e4bfSJean-Christophe PLAGNIOL-VILLARD free(nic); 51902439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 51912439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5192*aa070789SRoy Zang if (e1000_check_phy_reset_block(hw)) 5193*aa070789SRoy Zang printf("phy reset block error \n"); 5194*aa070789SRoy Zang e1000_reset_hw(hw); 5195ac3315c2SAndre Schwarz #if !(defined(CONFIG_AP1000) || defined(CONFIG_MVBC_1G)) 5196*aa070789SRoy Zang if (e1000_init_eeprom_params(hw)) { 5197*aa070789SRoy Zang printf("The EEPROM Checksum Is Not Valid\n"); 5198*aa070789SRoy Zang free(hw); 5199*aa070789SRoy Zang free(nic); 5200*aa070789SRoy Zang return 0; 5201*aa070789SRoy Zang } 52022439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_validate_eeprom_checksum(nic) < 0) { 52032439e4bfSJean-Christophe PLAGNIOL-VILLARD printf("The EEPROM Checksum Is Not Valid\n"); 52042439e4bfSJean-Christophe PLAGNIOL-VILLARD free(hw); 52052439e4bfSJean-Christophe PLAGNIOL-VILLARD free(nic); 52062439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 52072439e4bfSJean-Christophe PLAGNIOL-VILLARD } 52082439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 52092439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_read_mac_addr(nic); 52102439e4bfSJean-Christophe PLAGNIOL-VILLARD 5211*aa070789SRoy Zang /* get the bus type information */ 5212*aa070789SRoy Zang e1000_get_bus_type(hw); 52132439e4bfSJean-Christophe PLAGNIOL-VILLARD 52142439e4bfSJean-Christophe PLAGNIOL-VILLARD printf("e1000: %02x:%02x:%02x:%02x:%02x:%02x\n", 52152439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[0], nic->enetaddr[1], nic->enetaddr[2], 52162439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[3], nic->enetaddr[4], nic->enetaddr[5]); 52172439e4bfSJean-Christophe PLAGNIOL-VILLARD 52182439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->init = e1000_init; 52192439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->recv = e1000_poll; 52202439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->send = e1000_transmit; 52212439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->halt = e1000_disable; 52222439e4bfSJean-Christophe PLAGNIOL-VILLARD 52232439e4bfSJean-Christophe PLAGNIOL-VILLARD eth_register(nic); 52242439e4bfSJean-Christophe PLAGNIOL-VILLARD 52252439e4bfSJean-Christophe PLAGNIOL-VILLARD card_number++; 52262439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5227ad3381cfSBen Warren return card_number; 52282439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5229