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> 432c2668f9SRoy Zang * 442c2668f9SRoy Zang * Copyright 2011 Freescale Semiconductor, Inc. 452439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 462439e4bfSJean-Christophe PLAGNIOL-VILLARD 472439e4bfSJean-Christophe PLAGNIOL-VILLARD #include "e1000.h" 482439e4bfSJean-Christophe PLAGNIOL-VILLARD 492439e4bfSJean-Christophe PLAGNIOL-VILLARD #define TOUT_LOOP 100000 502439e4bfSJean-Christophe PLAGNIOL-VILLARD 51f81ecb5dSTimur Tabi #define virt_to_bus(devno, v) pci_virt_to_mem(devno, (void *) (v)) 522439e4bfSJean-Christophe PLAGNIOL-VILLARD #define bus_to_phys(devno, a) pci_mem_to_phys(devno, a) 532439e4bfSJean-Christophe PLAGNIOL-VILLARD 549ea005fbSRoy Zang #define E1000_DEFAULT_PCI_PBA 0x00000030 559ea005fbSRoy Zang #define E1000_DEFAULT_PCIE_PBA 0x000a0026 562439e4bfSJean-Christophe PLAGNIOL-VILLARD 572439e4bfSJean-Christophe PLAGNIOL-VILLARD /* NIC specific static variables go here */ 582439e4bfSJean-Christophe PLAGNIOL-VILLARD 592439e4bfSJean-Christophe PLAGNIOL-VILLARD static char tx_pool[128 + 16]; 602439e4bfSJean-Christophe PLAGNIOL-VILLARD static char rx_pool[128 + 16]; 612439e4bfSJean-Christophe PLAGNIOL-VILLARD static char packet[2096]; 622439e4bfSJean-Christophe PLAGNIOL-VILLARD 632439e4bfSJean-Christophe PLAGNIOL-VILLARD static struct e1000_tx_desc *tx_base; 642439e4bfSJean-Christophe PLAGNIOL-VILLARD static struct e1000_rx_desc *rx_base; 652439e4bfSJean-Christophe PLAGNIOL-VILLARD 662439e4bfSJean-Christophe PLAGNIOL-VILLARD static int tx_tail; 672439e4bfSJean-Christophe PLAGNIOL-VILLARD static int rx_tail, rx_last; 682439e4bfSJean-Christophe PLAGNIOL-VILLARD 69d60626f8SKyle Moffett static struct pci_device_id e1000_supported[] = { 702439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82542}, 712439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82543GC_FIBER}, 722439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82543GC_COPPER}, 732439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544EI_COPPER}, 742439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544EI_FIBER}, 752439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544GC_COPPER}, 762439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82544GC_LOM}, 772439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82540EM}, 782439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82545EM_COPPER}, 798915f118SPaul Gortmaker {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82545GM_COPPER}, 802439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546EB_COPPER}, 812439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82545EM_FIBER}, 822439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546EB_FIBER}, 832ab4a4d0SReinhard Arlt {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546GB_COPPER}, 842439e4bfSJean-Christophe PLAGNIOL-VILLARD {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82540EM_LOM}, 85ac3315c2SAndre Schwarz {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82541ER}, 86aa3b8bf9SWolfgang Grandegger {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82541GI_LF}, 87aa070789SRoy Zang /* E1000 PCIe card */ 88aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_COPPER}, 89aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_FIBER }, 90aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_SERDES }, 91aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_QUAD_COPPER}, 92aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571PT_QUAD_COPPER}, 93aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_QUAD_FIBER}, 94aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_QUAD_COPPER_LOWPROFILE}, 95aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_SERDES_DUAL}, 96aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82571EB_SERDES_QUAD}, 97aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI_COPPER}, 98aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI_FIBER}, 99aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI_SERDES}, 100aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82572EI}, 101aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E}, 102aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E_IAMT}, 103aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573L}, 1042c2668f9SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82574L}, 105aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546GB_QUAD_COPPER_KSP3}, 106aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_COPPER_DPT}, 107aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_SERDES_DPT}, 108aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_COPPER_SPT}, 109aa070789SRoy Zang {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_SERDES_SPT}, 1101bc43437SStefan Althoefer {} 1112439e4bfSJean-Christophe PLAGNIOL-VILLARD }; 1122439e4bfSJean-Christophe PLAGNIOL-VILLARD 1132439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Function forward declarations */ 1142439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_setup_link(struct eth_device *nic); 1152439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_setup_fiber_link(struct eth_device *nic); 1162439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_setup_copper_link(struct eth_device *nic); 1172439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_phy_setup_autoneg(struct e1000_hw *hw); 1182439e4bfSJean-Christophe PLAGNIOL-VILLARD static void e1000_config_collision_dist(struct e1000_hw *hw); 1192439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_config_mac_to_phy(struct e1000_hw *hw); 1202439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_config_fc_after_link_up(struct e1000_hw *hw); 1212439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_check_for_link(struct eth_device *nic); 1222439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_wait_autoneg(struct e1000_hw *hw); 123aa070789SRoy Zang static int e1000_get_speed_and_duplex(struct e1000_hw *hw, uint16_t * speed, 1242439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t * duplex); 1252439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, 1262439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t * phy_data); 1272439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, 1282439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data); 129aa070789SRoy Zang static int32_t e1000_phy_hw_reset(struct e1000_hw *hw); 1302439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_phy_reset(struct e1000_hw *hw); 1312439e4bfSJean-Christophe PLAGNIOL-VILLARD static int e1000_detect_gig_phy(struct e1000_hw *hw); 132aa070789SRoy Zang static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw); 133aa070789SRoy Zang static void e1000_set_media_type(struct e1000_hw *hw); 1342439e4bfSJean-Christophe PLAGNIOL-VILLARD 135aa070789SRoy Zang static int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask); 136aa070789SRoy Zang static int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); 1372439e4bfSJean-Christophe PLAGNIOL-VILLARD 138ecbd2078SRoy Zang static int32_t e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset, 139ecbd2078SRoy Zang uint16_t words, 140ecbd2078SRoy Zang uint16_t *data); 1412439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 1422439e4bfSJean-Christophe PLAGNIOL-VILLARD * Raises the EEPROM's clock input. 1432439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1442439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 1452439e4bfSJean-Christophe PLAGNIOL-VILLARD * eecd - EECD's current value 1462439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1472326a94dSKyle Moffett void e1000_raise_ee_clk(struct e1000_hw *hw, uint32_t * eecd) 1482439e4bfSJean-Christophe PLAGNIOL-VILLARD { 1492439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Raise the clock input to the EEPROM (by setting the SK bit), and then 1502439e4bfSJean-Christophe PLAGNIOL-VILLARD * wait 50 microseconds. 1512439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1522439e4bfSJean-Christophe PLAGNIOL-VILLARD *eecd = *eecd | E1000_EECD_SK; 1532439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, *eecd); 1542439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 1552439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(50); 1562439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1572439e4bfSJean-Christophe PLAGNIOL-VILLARD 1582439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 1592439e4bfSJean-Christophe PLAGNIOL-VILLARD * Lowers the EEPROM's clock input. 1602439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1612439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 1622439e4bfSJean-Christophe PLAGNIOL-VILLARD * eecd - EECD's current value 1632439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1642326a94dSKyle Moffett void e1000_lower_ee_clk(struct e1000_hw *hw, uint32_t * eecd) 1652439e4bfSJean-Christophe PLAGNIOL-VILLARD { 1662439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Lower the clock input to the EEPROM (by clearing the SK bit), and then 1672439e4bfSJean-Christophe PLAGNIOL-VILLARD * wait 50 microseconds. 1682439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1692439e4bfSJean-Christophe PLAGNIOL-VILLARD *eecd = *eecd & ~E1000_EECD_SK; 1702439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, *eecd); 1712439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 1722439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(50); 1732439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1742439e4bfSJean-Christophe PLAGNIOL-VILLARD 1752439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 1762439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shift data bits out to the EEPROM. 1772439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1782439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 1792439e4bfSJean-Christophe PLAGNIOL-VILLARD * data - data to send to the EEPROM 1802439e4bfSJean-Christophe PLAGNIOL-VILLARD * count - number of bits to shift out 1812439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1822439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 1832439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_ee_bits(struct e1000_hw *hw, uint16_t data, uint16_t count) 1842439e4bfSJean-Christophe PLAGNIOL-VILLARD { 1852439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t eecd; 1862439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mask; 1872439e4bfSJean-Christophe PLAGNIOL-VILLARD 1882439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We need to shift "count" bits out to the EEPROM. So, value in the 1892439e4bfSJean-Christophe PLAGNIOL-VILLARD * "data" parameter will be shifted out to the EEPROM one bit at a time. 1902439e4bfSJean-Christophe PLAGNIOL-VILLARD * In order to do this, "data" must be broken down into bits. 1912439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1922439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = 0x01 << (count - 1); 1932439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 1942439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); 1952439e4bfSJean-Christophe PLAGNIOL-VILLARD do { 1962439e4bfSJean-Christophe PLAGNIOL-VILLARD /* A "1" is shifted out to the EEPROM by setting bit "DI" to a "1", 1972439e4bfSJean-Christophe PLAGNIOL-VILLARD * and then raising and then lowering the clock (the SK bit controls 1982439e4bfSJean-Christophe PLAGNIOL-VILLARD * the clock input to the EEPROM). A "0" is shifted out to the EEPROM 1992439e4bfSJean-Christophe PLAGNIOL-VILLARD * by setting "DI" to "0" and then raising and then lowering the clock. 2002439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2012439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_DI; 2022439e4bfSJean-Christophe PLAGNIOL-VILLARD 2032439e4bfSJean-Christophe PLAGNIOL-VILLARD if (data & mask) 2042439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_DI; 2052439e4bfSJean-Christophe PLAGNIOL-VILLARD 2062439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2072439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 2082439e4bfSJean-Christophe PLAGNIOL-VILLARD 2092439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(50); 2102439e4bfSJean-Christophe PLAGNIOL-VILLARD 2112439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_ee_clk(hw, &eecd); 2122439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_ee_clk(hw, &eecd); 2132439e4bfSJean-Christophe PLAGNIOL-VILLARD 2142439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = mask >> 1; 2152439e4bfSJean-Christophe PLAGNIOL-VILLARD 2162439e4bfSJean-Christophe PLAGNIOL-VILLARD } while (mask); 2172439e4bfSJean-Christophe PLAGNIOL-VILLARD 2182439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We leave the "DI" bit set to "0" when we leave this routine. */ 2192439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_DI; 2202439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2212439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2222439e4bfSJean-Christophe PLAGNIOL-VILLARD 2232439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 2242439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shift data bits in from the EEPROM 2252439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2262439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 2272439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 2282439e4bfSJean-Christophe PLAGNIOL-VILLARD static uint16_t 229aa070789SRoy Zang e1000_shift_in_ee_bits(struct e1000_hw *hw, uint16_t count) 2302439e4bfSJean-Christophe PLAGNIOL-VILLARD { 2312439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t eecd; 2322439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 2332439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t data; 2342439e4bfSJean-Christophe PLAGNIOL-VILLARD 235aa070789SRoy Zang /* In order to read a register from the EEPROM, we need to shift 'count' 236aa070789SRoy Zang * bits in from the EEPROM. Bits are "shifted in" by raising the clock 237aa070789SRoy Zang * input to the EEPROM (setting the SK bit), and then reading the 238aa070789SRoy Zang * value of the "DO" bit. During this "shifting in" process the 239aa070789SRoy Zang * "DI" bit should always be clear. 2402439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2412439e4bfSJean-Christophe PLAGNIOL-VILLARD 2422439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 2432439e4bfSJean-Christophe PLAGNIOL-VILLARD 2442439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_DO | E1000_EECD_DI); 2452439e4bfSJean-Christophe PLAGNIOL-VILLARD data = 0; 2462439e4bfSJean-Christophe PLAGNIOL-VILLARD 247aa070789SRoy Zang for (i = 0; i < count; i++) { 2482439e4bfSJean-Christophe PLAGNIOL-VILLARD data = data << 1; 2492439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_ee_clk(hw, &eecd); 2502439e4bfSJean-Christophe PLAGNIOL-VILLARD 2512439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 2522439e4bfSJean-Christophe PLAGNIOL-VILLARD 2532439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_DI); 2542439e4bfSJean-Christophe PLAGNIOL-VILLARD if (eecd & E1000_EECD_DO) 2552439e4bfSJean-Christophe PLAGNIOL-VILLARD data |= 1; 2562439e4bfSJean-Christophe PLAGNIOL-VILLARD 2572439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_ee_clk(hw, &eecd); 2582439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2592439e4bfSJean-Christophe PLAGNIOL-VILLARD 2602439e4bfSJean-Christophe PLAGNIOL-VILLARD return data; 2612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2622439e4bfSJean-Christophe PLAGNIOL-VILLARD 2632439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 2642439e4bfSJean-Christophe PLAGNIOL-VILLARD * Returns EEPROM to a "standby" state 2652439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2662439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 2672439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 2682326a94dSKyle Moffett void e1000_standby_eeprom(struct e1000_hw *hw) 2692439e4bfSJean-Christophe PLAGNIOL-VILLARD { 270aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 2712439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t eecd; 2722439e4bfSJean-Christophe PLAGNIOL-VILLARD 2732439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 2742439e4bfSJean-Christophe PLAGNIOL-VILLARD 275aa070789SRoy Zang if (eeprom->type == e1000_eeprom_microwire) { 2762439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); 2772439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2782439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 279aa070789SRoy Zang udelay(eeprom->delay_usec); 2802439e4bfSJean-Christophe PLAGNIOL-VILLARD 2812439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clock high */ 2822439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_SK; 2832439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2842439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 285aa070789SRoy Zang udelay(eeprom->delay_usec); 2862439e4bfSJean-Christophe PLAGNIOL-VILLARD 2872439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Select EEPROM */ 2882439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_CS; 2892439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2902439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 291aa070789SRoy Zang udelay(eeprom->delay_usec); 2922439e4bfSJean-Christophe PLAGNIOL-VILLARD 2932439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clock low */ 2942439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_SK; 2952439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 2962439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 297aa070789SRoy Zang udelay(eeprom->delay_usec); 298aa070789SRoy Zang } else if (eeprom->type == e1000_eeprom_spi) { 299aa070789SRoy Zang /* Toggle CS to flush commands */ 300aa070789SRoy Zang eecd |= E1000_EECD_CS; 301aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 302aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 303aa070789SRoy Zang udelay(eeprom->delay_usec); 304aa070789SRoy Zang eecd &= ~E1000_EECD_CS; 305aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 306aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 307aa070789SRoy Zang udelay(eeprom->delay_usec); 308aa070789SRoy Zang } 309aa070789SRoy Zang } 310aa070789SRoy Zang 311aa070789SRoy Zang /*************************************************************************** 312aa070789SRoy Zang * Description: Determines if the onboard NVM is FLASH or EEPROM. 313aa070789SRoy Zang * 314aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 315aa070789SRoy Zang ****************************************************************************/ 316aa070789SRoy Zang static boolean_t e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw) 317aa070789SRoy Zang { 318aa070789SRoy Zang uint32_t eecd = 0; 319aa070789SRoy Zang 320aa070789SRoy Zang DEBUGFUNC(); 321aa070789SRoy Zang 322aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 323aa070789SRoy Zang return FALSE; 324aa070789SRoy Zang 3252c2668f9SRoy Zang if (hw->mac_type == e1000_82573 || hw->mac_type == e1000_82574) { 326aa070789SRoy Zang eecd = E1000_READ_REG(hw, EECD); 327aa070789SRoy Zang 328aa070789SRoy Zang /* Isolate bits 15 & 16 */ 329aa070789SRoy Zang eecd = ((eecd >> 15) & 0x03); 330aa070789SRoy Zang 331aa070789SRoy Zang /* If both bits are set, device is Flash type */ 332aa070789SRoy Zang if (eecd == 0x03) 333aa070789SRoy Zang return FALSE; 334aa070789SRoy Zang } 335aa070789SRoy Zang return TRUE; 3362439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3372439e4bfSJean-Christophe PLAGNIOL-VILLARD 3382439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 339aa070789SRoy Zang * Prepares EEPROM for access 3402439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3412439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 342aa070789SRoy Zang * 343aa070789SRoy Zang * Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This 344aa070789SRoy Zang * function should be called before issuing a command to the EEPROM. 3452439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 3462326a94dSKyle Moffett int32_t e1000_acquire_eeprom(struct e1000_hw *hw) 3472439e4bfSJean-Christophe PLAGNIOL-VILLARD { 348aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 349aa070789SRoy Zang uint32_t eecd, i = 0; 3502439e4bfSJean-Christophe PLAGNIOL-VILLARD 351f81ecb5dSTimur Tabi DEBUGFUNC(); 352aa070789SRoy Zang 353aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM)) 354aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 355aa070789SRoy Zang eecd = E1000_READ_REG(hw, EECD); 356aa070789SRoy Zang 3572c2668f9SRoy Zang if (hw->mac_type != e1000_82573 || hw->mac_type != e1000_82574) { 3582439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Request EEPROM Access */ 3592439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82544) { 3602439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd |= E1000_EECD_REQ; 3612439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 3622439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 363aa070789SRoy Zang while ((!(eecd & E1000_EECD_GNT)) && 364aa070789SRoy Zang (i < E1000_EEPROM_GRANT_ATTEMPTS)) { 3652439e4bfSJean-Christophe PLAGNIOL-VILLARD i++; 366aa070789SRoy Zang udelay(5); 3672439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd = E1000_READ_REG(hw, EECD); 3682439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3692439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(eecd & E1000_EECD_GNT)) { 3702439e4bfSJean-Christophe PLAGNIOL-VILLARD eecd &= ~E1000_EECD_REQ; 3712439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 3722439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Could not acquire EEPROM grant\n"); 3732439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 3742439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3752439e4bfSJean-Christophe PLAGNIOL-VILLARD } 376aa070789SRoy Zang } 3772439e4bfSJean-Christophe PLAGNIOL-VILLARD 378aa070789SRoy Zang /* Setup EEPROM for Read/Write */ 3792439e4bfSJean-Christophe PLAGNIOL-VILLARD 380aa070789SRoy Zang if (eeprom->type == e1000_eeprom_microwire) { 381aa070789SRoy Zang /* Clear SK and DI */ 382aa070789SRoy Zang eecd &= ~(E1000_EECD_DI | E1000_EECD_SK); 383aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 3842439e4bfSJean-Christophe PLAGNIOL-VILLARD 385aa070789SRoy Zang /* Set CS */ 386aa070789SRoy Zang eecd |= E1000_EECD_CS; 387aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 388aa070789SRoy Zang } else if (eeprom->type == e1000_eeprom_spi) { 389aa070789SRoy Zang /* Clear SK and CS */ 390aa070789SRoy Zang eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); 391aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 392aa070789SRoy Zang udelay(1); 393aa070789SRoy Zang } 3942439e4bfSJean-Christophe PLAGNIOL-VILLARD 395aa070789SRoy Zang return E1000_SUCCESS; 396aa070789SRoy Zang } 3972439e4bfSJean-Christophe PLAGNIOL-VILLARD 398aa070789SRoy Zang /****************************************************************************** 399aa070789SRoy Zang * Sets up eeprom variables in the hw struct. Must be called after mac_type 400aa070789SRoy Zang * is configured. Additionally, if this is ICH8, the flash controller GbE 401aa070789SRoy Zang * registers must be mapped, or this will crash. 402aa070789SRoy Zang * 403aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 404aa070789SRoy Zang *****************************************************************************/ 405aa070789SRoy Zang static int32_t e1000_init_eeprom_params(struct e1000_hw *hw) 406aa070789SRoy Zang { 407aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 408aa070789SRoy Zang uint32_t eecd = E1000_READ_REG(hw, EECD); 409aa070789SRoy Zang int32_t ret_val = E1000_SUCCESS; 410aa070789SRoy Zang uint16_t eeprom_size; 411aa070789SRoy Zang 412f81ecb5dSTimur Tabi DEBUGFUNC(); 413aa070789SRoy Zang 414aa070789SRoy Zang switch (hw->mac_type) { 415aa070789SRoy Zang case e1000_82542_rev2_0: 416aa070789SRoy Zang case e1000_82542_rev2_1: 417aa070789SRoy Zang case e1000_82543: 418aa070789SRoy Zang case e1000_82544: 419aa070789SRoy Zang eeprom->type = e1000_eeprom_microwire; 420aa070789SRoy Zang eeprom->word_size = 64; 421aa070789SRoy Zang eeprom->opcode_bits = 3; 422aa070789SRoy Zang eeprom->address_bits = 6; 423aa070789SRoy Zang eeprom->delay_usec = 50; 424aa070789SRoy Zang eeprom->use_eerd = FALSE; 425aa070789SRoy Zang eeprom->use_eewr = FALSE; 426aa070789SRoy Zang break; 427aa070789SRoy Zang case e1000_82540: 428aa070789SRoy Zang case e1000_82545: 429aa070789SRoy Zang case e1000_82545_rev_3: 430aa070789SRoy Zang case e1000_82546: 431aa070789SRoy Zang case e1000_82546_rev_3: 432aa070789SRoy Zang eeprom->type = e1000_eeprom_microwire; 433aa070789SRoy Zang eeprom->opcode_bits = 3; 434aa070789SRoy Zang eeprom->delay_usec = 50; 435aa070789SRoy Zang if (eecd & E1000_EECD_SIZE) { 436aa070789SRoy Zang eeprom->word_size = 256; 437aa070789SRoy Zang eeprom->address_bits = 8; 438aa070789SRoy Zang } else { 439aa070789SRoy Zang eeprom->word_size = 64; 440aa070789SRoy Zang eeprom->address_bits = 6; 441aa070789SRoy Zang } 442aa070789SRoy Zang eeprom->use_eerd = FALSE; 443aa070789SRoy Zang eeprom->use_eewr = FALSE; 444aa070789SRoy Zang break; 445aa070789SRoy Zang case e1000_82541: 446aa070789SRoy Zang case e1000_82541_rev_2: 447aa070789SRoy Zang case e1000_82547: 448aa070789SRoy Zang case e1000_82547_rev_2: 449aa070789SRoy Zang if (eecd & E1000_EECD_TYPE) { 450aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 451aa070789SRoy Zang eeprom->opcode_bits = 8; 452aa070789SRoy Zang eeprom->delay_usec = 1; 453aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 454aa070789SRoy Zang eeprom->page_size = 32; 455aa070789SRoy Zang eeprom->address_bits = 16; 456aa070789SRoy Zang } else { 457aa070789SRoy Zang eeprom->page_size = 8; 458aa070789SRoy Zang eeprom->address_bits = 8; 459aa070789SRoy Zang } 460aa070789SRoy Zang } else { 461aa070789SRoy Zang eeprom->type = e1000_eeprom_microwire; 462aa070789SRoy Zang eeprom->opcode_bits = 3; 463aa070789SRoy Zang eeprom->delay_usec = 50; 464aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 465aa070789SRoy Zang eeprom->word_size = 256; 466aa070789SRoy Zang eeprom->address_bits = 8; 467aa070789SRoy Zang } else { 468aa070789SRoy Zang eeprom->word_size = 64; 469aa070789SRoy Zang eeprom->address_bits = 6; 470aa070789SRoy Zang } 471aa070789SRoy Zang } 472aa070789SRoy Zang eeprom->use_eerd = FALSE; 473aa070789SRoy Zang eeprom->use_eewr = FALSE; 474aa070789SRoy Zang break; 475aa070789SRoy Zang case e1000_82571: 476aa070789SRoy Zang case e1000_82572: 477aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 478aa070789SRoy Zang eeprom->opcode_bits = 8; 479aa070789SRoy Zang eeprom->delay_usec = 1; 480aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 481aa070789SRoy Zang eeprom->page_size = 32; 482aa070789SRoy Zang eeprom->address_bits = 16; 483aa070789SRoy Zang } else { 484aa070789SRoy Zang eeprom->page_size = 8; 485aa070789SRoy Zang eeprom->address_bits = 8; 486aa070789SRoy Zang } 487aa070789SRoy Zang eeprom->use_eerd = FALSE; 488aa070789SRoy Zang eeprom->use_eewr = FALSE; 489aa070789SRoy Zang break; 490aa070789SRoy Zang case e1000_82573: 4912c2668f9SRoy Zang case e1000_82574: 492aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 493aa070789SRoy Zang eeprom->opcode_bits = 8; 494aa070789SRoy Zang eeprom->delay_usec = 1; 495aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 496aa070789SRoy Zang eeprom->page_size = 32; 497aa070789SRoy Zang eeprom->address_bits = 16; 498aa070789SRoy Zang } else { 499aa070789SRoy Zang eeprom->page_size = 8; 500aa070789SRoy Zang eeprom->address_bits = 8; 501aa070789SRoy Zang } 502aa070789SRoy Zang eeprom->use_eerd = TRUE; 503aa070789SRoy Zang eeprom->use_eewr = TRUE; 504aa070789SRoy Zang if (e1000_is_onboard_nvm_eeprom(hw) == FALSE) { 505aa070789SRoy Zang eeprom->type = e1000_eeprom_flash; 506aa070789SRoy Zang eeprom->word_size = 2048; 507aa070789SRoy Zang 508aa070789SRoy Zang /* Ensure that the Autonomous FLASH update bit is cleared due to 509aa070789SRoy Zang * Flash update issue on parts which use a FLASH for NVM. */ 510aa070789SRoy Zang eecd &= ~E1000_EECD_AUPDEN; 5112439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, EECD, eecd); 5122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 513aa070789SRoy Zang break; 514aa070789SRoy Zang case e1000_80003es2lan: 515aa070789SRoy Zang eeprom->type = e1000_eeprom_spi; 516aa070789SRoy Zang eeprom->opcode_bits = 8; 517aa070789SRoy Zang eeprom->delay_usec = 1; 518aa070789SRoy Zang if (eecd & E1000_EECD_ADDR_BITS) { 519aa070789SRoy Zang eeprom->page_size = 32; 520aa070789SRoy Zang eeprom->address_bits = 16; 521aa070789SRoy Zang } else { 522aa070789SRoy Zang eeprom->page_size = 8; 523aa070789SRoy Zang eeprom->address_bits = 8; 5242439e4bfSJean-Christophe PLAGNIOL-VILLARD } 525aa070789SRoy Zang eeprom->use_eerd = TRUE; 526aa070789SRoy Zang eeprom->use_eewr = FALSE; 527aa070789SRoy Zang break; 5282439e4bfSJean-Christophe PLAGNIOL-VILLARD 529aa070789SRoy Zang /* ich8lan does not support currently. if needed, please 530aa070789SRoy Zang * add corresponding code and functions. 531aa070789SRoy Zang */ 5322439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 533aa070789SRoy Zang case e1000_ich8lan: 5342439e4bfSJean-Christophe PLAGNIOL-VILLARD { 535aa070789SRoy Zang int32_t i = 0; 5362439e4bfSJean-Christophe PLAGNIOL-VILLARD 537aa070789SRoy Zang eeprom->type = e1000_eeprom_ich8; 538aa070789SRoy Zang eeprom->use_eerd = FALSE; 539aa070789SRoy Zang eeprom->use_eewr = FALSE; 540aa070789SRoy Zang eeprom->word_size = E1000_SHADOW_RAM_WORDS; 541aa070789SRoy Zang uint32_t flash_size = E1000_READ_ICH_FLASH_REG(hw, 542aa070789SRoy Zang ICH_FLASH_GFPREG); 543aa070789SRoy Zang /* Zero the shadow RAM structure. But don't load it from NVM 544aa070789SRoy Zang * so as to save time for driver init */ 545aa070789SRoy Zang if (hw->eeprom_shadow_ram != NULL) { 546aa070789SRoy Zang for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) { 547aa070789SRoy Zang hw->eeprom_shadow_ram[i].modified = FALSE; 548aa070789SRoy Zang hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF; 549aa070789SRoy Zang } 5502439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5512439e4bfSJean-Christophe PLAGNIOL-VILLARD 552aa070789SRoy Zang hw->flash_base_addr = (flash_size & ICH_GFPREG_BASE_MASK) * 553aa070789SRoy Zang ICH_FLASH_SECTOR_SIZE; 5542439e4bfSJean-Christophe PLAGNIOL-VILLARD 555aa070789SRoy Zang hw->flash_bank_size = ((flash_size >> 16) 556aa070789SRoy Zang & ICH_GFPREG_BASE_MASK) + 1; 557aa070789SRoy Zang hw->flash_bank_size -= (flash_size & ICH_GFPREG_BASE_MASK); 5582439e4bfSJean-Christophe PLAGNIOL-VILLARD 559aa070789SRoy Zang hw->flash_bank_size *= ICH_FLASH_SECTOR_SIZE; 5602439e4bfSJean-Christophe PLAGNIOL-VILLARD 561aa070789SRoy Zang hw->flash_bank_size /= 2 * sizeof(uint16_t); 562aa070789SRoy Zang break; 5632439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5642439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 565aa070789SRoy Zang default: 566aa070789SRoy Zang break; 567aa070789SRoy Zang } 568aa070789SRoy Zang 569aa070789SRoy Zang if (eeprom->type == e1000_eeprom_spi) { 570aa070789SRoy Zang /* eeprom_size will be an enum [0..8] that maps 571aa070789SRoy Zang * to eeprom sizes 128B to 572aa070789SRoy Zang * 32KB (incremented by powers of 2). 573aa070789SRoy Zang */ 574aa070789SRoy Zang if (hw->mac_type <= e1000_82547_rev_2) { 575aa070789SRoy Zang /* Set to default value for initial eeprom read. */ 576aa070789SRoy Zang eeprom->word_size = 64; 577aa070789SRoy Zang ret_val = e1000_read_eeprom(hw, EEPROM_CFG, 1, 578aa070789SRoy Zang &eeprom_size); 579aa070789SRoy Zang if (ret_val) 580aa070789SRoy Zang return ret_val; 581aa070789SRoy Zang eeprom_size = (eeprom_size & EEPROM_SIZE_MASK) 582aa070789SRoy Zang >> EEPROM_SIZE_SHIFT; 583aa070789SRoy Zang /* 256B eeprom size was not supported in earlier 584aa070789SRoy Zang * hardware, so we bump eeprom_size up one to 585aa070789SRoy Zang * ensure that "1" (which maps to 256B) is never 586aa070789SRoy Zang * the result used in the shifting logic below. */ 587aa070789SRoy Zang if (eeprom_size) 588aa070789SRoy Zang eeprom_size++; 589aa070789SRoy Zang } else { 590aa070789SRoy Zang eeprom_size = (uint16_t)((eecd & 591aa070789SRoy Zang E1000_EECD_SIZE_EX_MASK) >> 592aa070789SRoy Zang E1000_EECD_SIZE_EX_SHIFT); 593aa070789SRoy Zang } 594aa070789SRoy Zang 595aa070789SRoy Zang eeprom->word_size = 1 << (eeprom_size + EEPROM_WORD_SIZE_SHIFT); 596aa070789SRoy Zang } 597aa070789SRoy Zang return ret_val; 598aa070789SRoy Zang } 599aa070789SRoy Zang 600aa070789SRoy Zang /****************************************************************************** 601aa070789SRoy Zang * Polls the status bit (bit 1) of the EERD to determine when the read is done. 602aa070789SRoy Zang * 603aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 604aa070789SRoy Zang *****************************************************************************/ 605aa070789SRoy Zang static int32_t 606aa070789SRoy Zang e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd) 607aa070789SRoy Zang { 608aa070789SRoy Zang uint32_t attempts = 100000; 609aa070789SRoy Zang uint32_t i, reg = 0; 610aa070789SRoy Zang int32_t done = E1000_ERR_EEPROM; 611aa070789SRoy Zang 612aa070789SRoy Zang for (i = 0; i < attempts; i++) { 613aa070789SRoy Zang if (eerd == E1000_EEPROM_POLL_READ) 614aa070789SRoy Zang reg = E1000_READ_REG(hw, EERD); 615aa070789SRoy Zang else 616aa070789SRoy Zang reg = E1000_READ_REG(hw, EEWR); 617aa070789SRoy Zang 618aa070789SRoy Zang if (reg & E1000_EEPROM_RW_REG_DONE) { 619aa070789SRoy Zang done = E1000_SUCCESS; 620aa070789SRoy Zang break; 621aa070789SRoy Zang } 622aa070789SRoy Zang udelay(5); 623aa070789SRoy Zang } 624aa070789SRoy Zang 625aa070789SRoy Zang return done; 626aa070789SRoy Zang } 627aa070789SRoy Zang 628aa070789SRoy Zang /****************************************************************************** 629aa070789SRoy Zang * Reads a 16 bit word from the EEPROM using the EERD register. 630aa070789SRoy Zang * 631aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 632aa070789SRoy Zang * offset - offset of word in the EEPROM to read 633aa070789SRoy Zang * data - word read from the EEPROM 634aa070789SRoy Zang * words - number of words to read 635aa070789SRoy Zang *****************************************************************************/ 636aa070789SRoy Zang static int32_t 637aa070789SRoy Zang e1000_read_eeprom_eerd(struct e1000_hw *hw, 638aa070789SRoy Zang uint16_t offset, 639aa070789SRoy Zang uint16_t words, 640aa070789SRoy Zang uint16_t *data) 641aa070789SRoy Zang { 642aa070789SRoy Zang uint32_t i, eerd = 0; 643aa070789SRoy Zang int32_t error = 0; 644aa070789SRoy Zang 645aa070789SRoy Zang for (i = 0; i < words; i++) { 646aa070789SRoy Zang eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) + 647aa070789SRoy Zang E1000_EEPROM_RW_REG_START; 648aa070789SRoy Zang 649aa070789SRoy Zang E1000_WRITE_REG(hw, EERD, eerd); 650aa070789SRoy Zang error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ); 651aa070789SRoy Zang 652aa070789SRoy Zang if (error) 653aa070789SRoy Zang break; 654aa070789SRoy Zang data[i] = (E1000_READ_REG(hw, EERD) >> 655aa070789SRoy Zang E1000_EEPROM_RW_REG_DATA); 656aa070789SRoy Zang 657aa070789SRoy Zang } 658aa070789SRoy Zang 659aa070789SRoy Zang return error; 660aa070789SRoy Zang } 661aa070789SRoy Zang 6622326a94dSKyle Moffett void e1000_release_eeprom(struct e1000_hw *hw) 663aa070789SRoy Zang { 664aa070789SRoy Zang uint32_t eecd; 665aa070789SRoy Zang 666aa070789SRoy Zang DEBUGFUNC(); 667aa070789SRoy Zang 668aa070789SRoy Zang eecd = E1000_READ_REG(hw, EECD); 669aa070789SRoy Zang 670aa070789SRoy Zang if (hw->eeprom.type == e1000_eeprom_spi) { 671aa070789SRoy Zang eecd |= E1000_EECD_CS; /* Pull CS high */ 672aa070789SRoy Zang eecd &= ~E1000_EECD_SK; /* Lower SCK */ 673aa070789SRoy Zang 674aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 675aa070789SRoy Zang 676aa070789SRoy Zang udelay(hw->eeprom.delay_usec); 677aa070789SRoy Zang } else if (hw->eeprom.type == e1000_eeprom_microwire) { 678aa070789SRoy Zang /* cleanup eeprom */ 679aa070789SRoy Zang 680aa070789SRoy Zang /* CS on Microwire is active-high */ 681aa070789SRoy Zang eecd &= ~(E1000_EECD_CS | E1000_EECD_DI); 682aa070789SRoy Zang 683aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 684aa070789SRoy Zang 685aa070789SRoy Zang /* Rising edge of clock */ 686aa070789SRoy Zang eecd |= E1000_EECD_SK; 687aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 688aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 689aa070789SRoy Zang udelay(hw->eeprom.delay_usec); 690aa070789SRoy Zang 691aa070789SRoy Zang /* Falling edge of clock */ 692aa070789SRoy Zang eecd &= ~E1000_EECD_SK; 693aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 694aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 695aa070789SRoy Zang udelay(hw->eeprom.delay_usec); 696aa070789SRoy Zang } 697aa070789SRoy Zang 698aa070789SRoy Zang /* Stop requesting EEPROM access */ 699aa070789SRoy Zang if (hw->mac_type > e1000_82544) { 700aa070789SRoy Zang eecd &= ~E1000_EECD_REQ; 701aa070789SRoy Zang E1000_WRITE_REG(hw, EECD, eecd); 702aa070789SRoy Zang } 703aa070789SRoy Zang } 704aa070789SRoy Zang /****************************************************************************** 705aa070789SRoy Zang * Reads a 16 bit word from the EEPROM. 706aa070789SRoy Zang * 707aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 708aa070789SRoy Zang *****************************************************************************/ 709aa070789SRoy Zang static int32_t 710aa070789SRoy Zang e1000_spi_eeprom_ready(struct e1000_hw *hw) 711aa070789SRoy Zang { 712aa070789SRoy Zang uint16_t retry_count = 0; 713aa070789SRoy Zang uint8_t spi_stat_reg; 714aa070789SRoy Zang 715aa070789SRoy Zang DEBUGFUNC(); 716aa070789SRoy Zang 717aa070789SRoy Zang /* Read "Status Register" repeatedly until the LSB is cleared. The 718aa070789SRoy Zang * EEPROM will signal that the command has been completed by clearing 719aa070789SRoy Zang * bit 0 of the internal status register. If it's not cleared within 720aa070789SRoy Zang * 5 milliseconds, then error out. 721aa070789SRoy Zang */ 722aa070789SRoy Zang retry_count = 0; 723aa070789SRoy Zang do { 724aa070789SRoy Zang e1000_shift_out_ee_bits(hw, EEPROM_RDSR_OPCODE_SPI, 725aa070789SRoy Zang hw->eeprom.opcode_bits); 726aa070789SRoy Zang spi_stat_reg = (uint8_t)e1000_shift_in_ee_bits(hw, 8); 727aa070789SRoy Zang if (!(spi_stat_reg & EEPROM_STATUS_RDY_SPI)) 728aa070789SRoy Zang break; 729aa070789SRoy Zang 730aa070789SRoy Zang udelay(5); 731aa070789SRoy Zang retry_count += 5; 732aa070789SRoy Zang 733aa070789SRoy Zang e1000_standby_eeprom(hw); 734aa070789SRoy Zang } while (retry_count < EEPROM_MAX_RETRY_SPI); 735aa070789SRoy Zang 736aa070789SRoy Zang /* ATMEL SPI write time could vary from 0-20mSec on 3.3V devices (and 737aa070789SRoy Zang * only 0-5mSec on 5V devices) 738aa070789SRoy Zang */ 739aa070789SRoy Zang if (retry_count >= EEPROM_MAX_RETRY_SPI) { 740aa070789SRoy Zang DEBUGOUT("SPI EEPROM Status error\n"); 741aa070789SRoy Zang return -E1000_ERR_EEPROM; 742aa070789SRoy Zang } 743aa070789SRoy Zang 744aa070789SRoy Zang return E1000_SUCCESS; 745aa070789SRoy Zang } 746aa070789SRoy Zang 747aa070789SRoy Zang /****************************************************************************** 748aa070789SRoy Zang * Reads a 16 bit word from the EEPROM. 749aa070789SRoy Zang * 750aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 751aa070789SRoy Zang * offset - offset of word in the EEPROM to read 752aa070789SRoy Zang * data - word read from the EEPROM 753aa070789SRoy Zang *****************************************************************************/ 754aa070789SRoy Zang static int32_t 755aa070789SRoy Zang e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset, 756aa070789SRoy Zang uint16_t words, uint16_t *data) 757aa070789SRoy Zang { 758aa070789SRoy Zang struct e1000_eeprom_info *eeprom = &hw->eeprom; 759aa070789SRoy Zang uint32_t i = 0; 760aa070789SRoy Zang 761aa070789SRoy Zang DEBUGFUNC(); 762aa070789SRoy Zang 763aa070789SRoy Zang /* If eeprom is not yet detected, do so now */ 764aa070789SRoy Zang if (eeprom->word_size == 0) 765aa070789SRoy Zang e1000_init_eeprom_params(hw); 766aa070789SRoy Zang 767aa070789SRoy Zang /* A check for invalid values: offset too large, too many words, 768aa070789SRoy Zang * and not enough words. 769aa070789SRoy Zang */ 770aa070789SRoy Zang if ((offset >= eeprom->word_size) || 771aa070789SRoy Zang (words > eeprom->word_size - offset) || 772aa070789SRoy Zang (words == 0)) { 773aa070789SRoy Zang DEBUGOUT("\"words\" parameter out of bounds." 774aa070789SRoy Zang "Words = %d, size = %d\n", offset, eeprom->word_size); 775aa070789SRoy Zang return -E1000_ERR_EEPROM; 776aa070789SRoy Zang } 777aa070789SRoy Zang 778aa070789SRoy Zang /* EEPROM's that don't use EERD to read require us to bit-bang the SPI 779aa070789SRoy Zang * directly. In this case, we need to acquire the EEPROM so that 780aa070789SRoy Zang * FW or other port software does not interrupt. 781aa070789SRoy Zang */ 782aa070789SRoy Zang if (e1000_is_onboard_nvm_eeprom(hw) == TRUE && 783aa070789SRoy Zang hw->eeprom.use_eerd == FALSE) { 784aa070789SRoy Zang 785aa070789SRoy Zang /* Prepare the EEPROM for bit-bang reading */ 786aa070789SRoy Zang if (e1000_acquire_eeprom(hw) != E1000_SUCCESS) 787aa070789SRoy Zang return -E1000_ERR_EEPROM; 788aa070789SRoy Zang } 789aa070789SRoy Zang 790aa070789SRoy Zang /* Eerd register EEPROM access requires no eeprom aquire/release */ 791aa070789SRoy Zang if (eeprom->use_eerd == TRUE) 792aa070789SRoy Zang return e1000_read_eeprom_eerd(hw, offset, words, data); 793aa070789SRoy Zang 794aa070789SRoy Zang /* ich8lan does not support currently. if needed, please 795aa070789SRoy Zang * add corresponding code and functions. 796aa070789SRoy Zang */ 797aa070789SRoy Zang #if 0 798aa070789SRoy Zang /* ICH EEPROM access is done via the ICH flash controller */ 799aa070789SRoy Zang if (eeprom->type == e1000_eeprom_ich8) 800aa070789SRoy Zang return e1000_read_eeprom_ich8(hw, offset, words, data); 801aa070789SRoy Zang #endif 802aa070789SRoy Zang /* Set up the SPI or Microwire EEPROM for bit-bang reading. We have 803aa070789SRoy Zang * acquired the EEPROM at this point, so any returns should relase it */ 804aa070789SRoy Zang if (eeprom->type == e1000_eeprom_spi) { 805aa070789SRoy Zang uint16_t word_in; 806aa070789SRoy Zang uint8_t read_opcode = EEPROM_READ_OPCODE_SPI; 807aa070789SRoy Zang 808aa070789SRoy Zang if (e1000_spi_eeprom_ready(hw)) { 809aa070789SRoy Zang e1000_release_eeprom(hw); 810aa070789SRoy Zang return -E1000_ERR_EEPROM; 811aa070789SRoy Zang } 812aa070789SRoy Zang 813aa070789SRoy Zang e1000_standby_eeprom(hw); 814aa070789SRoy Zang 815aa070789SRoy Zang /* Some SPI eeproms use the 8th address bit embedded in 816aa070789SRoy Zang * the opcode */ 817aa070789SRoy Zang if ((eeprom->address_bits == 8) && (offset >= 128)) 818aa070789SRoy Zang read_opcode |= EEPROM_A8_OPCODE_SPI; 819aa070789SRoy Zang 820aa070789SRoy Zang /* Send the READ command (opcode + addr) */ 821aa070789SRoy Zang e1000_shift_out_ee_bits(hw, read_opcode, eeprom->opcode_bits); 822aa070789SRoy Zang e1000_shift_out_ee_bits(hw, (uint16_t)(offset*2), 823aa070789SRoy Zang eeprom->address_bits); 824aa070789SRoy Zang 825aa070789SRoy Zang /* Read the data. The address of the eeprom internally 826aa070789SRoy Zang * increments with each byte (spi) being read, saving on the 827aa070789SRoy Zang * overhead of eeprom setup and tear-down. The address 828aa070789SRoy Zang * counter will roll over if reading beyond the size of 829aa070789SRoy Zang * the eeprom, thus allowing the entire memory to be read 830aa070789SRoy Zang * starting from any offset. */ 831aa070789SRoy Zang for (i = 0; i < words; i++) { 832aa070789SRoy Zang word_in = e1000_shift_in_ee_bits(hw, 16); 833aa070789SRoy Zang data[i] = (word_in >> 8) | (word_in << 8); 834aa070789SRoy Zang } 835aa070789SRoy Zang } else if (eeprom->type == e1000_eeprom_microwire) { 836aa070789SRoy Zang for (i = 0; i < words; i++) { 837aa070789SRoy Zang /* Send the READ command (opcode + addr) */ 838aa070789SRoy Zang e1000_shift_out_ee_bits(hw, 839aa070789SRoy Zang EEPROM_READ_OPCODE_MICROWIRE, 840aa070789SRoy Zang eeprom->opcode_bits); 841aa070789SRoy Zang e1000_shift_out_ee_bits(hw, (uint16_t)(offset + i), 842aa070789SRoy Zang eeprom->address_bits); 843aa070789SRoy Zang 844aa070789SRoy Zang /* Read the data. For microwire, each word requires 845aa070789SRoy Zang * the overhead of eeprom setup and tear-down. */ 846aa070789SRoy Zang data[i] = e1000_shift_in_ee_bits(hw, 16); 847aa070789SRoy Zang e1000_standby_eeprom(hw); 848aa070789SRoy Zang } 849aa070789SRoy Zang } 850aa070789SRoy Zang 851aa070789SRoy Zang /* End this read operation */ 852aa070789SRoy Zang e1000_release_eeprom(hw); 853aa070789SRoy Zang 854aa070789SRoy Zang return E1000_SUCCESS; 855aa070789SRoy Zang } 8562439e4bfSJean-Christophe PLAGNIOL-VILLARD 8572439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 8582439e4bfSJean-Christophe PLAGNIOL-VILLARD * Verifies that the EEPROM has a valid checksum 8592439e4bfSJean-Christophe PLAGNIOL-VILLARD * 8602439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 8612439e4bfSJean-Christophe PLAGNIOL-VILLARD * 8622439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reads the first 64 16 bit words of the EEPROM and sums the values read. 8632439e4bfSJean-Christophe PLAGNIOL-VILLARD * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is 8642439e4bfSJean-Christophe PLAGNIOL-VILLARD * valid. 8652439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 866114d7fc0SKyle Moffett static int e1000_validate_eeprom_checksum(struct e1000_hw *hw) 8672439e4bfSJean-Christophe PLAGNIOL-VILLARD { 868114d7fc0SKyle Moffett uint16_t i, checksum, checksum_reg, *buf; 8692439e4bfSJean-Christophe PLAGNIOL-VILLARD 8702439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 8712439e4bfSJean-Christophe PLAGNIOL-VILLARD 872114d7fc0SKyle Moffett /* Allocate a temporary buffer */ 873114d7fc0SKyle Moffett buf = malloc(sizeof(buf[0]) * (EEPROM_CHECKSUM_REG + 1)); 874114d7fc0SKyle Moffett if (!buf) { 875114d7fc0SKyle Moffett E1000_ERR(hw->nic, "Unable to allocate EEPROM buffer!\n"); 8762439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 8772439e4bfSJean-Christophe PLAGNIOL-VILLARD } 8782439e4bfSJean-Christophe PLAGNIOL-VILLARD 879114d7fc0SKyle Moffett /* Read the EEPROM */ 880114d7fc0SKyle Moffett if (e1000_read_eeprom(hw, 0, EEPROM_CHECKSUM_REG + 1, buf) < 0) { 881114d7fc0SKyle Moffett E1000_ERR(hw->nic, "Unable to read EEPROM!\n"); 8822439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 8832439e4bfSJean-Christophe PLAGNIOL-VILLARD } 884114d7fc0SKyle Moffett 885114d7fc0SKyle Moffett /* Compute the checksum */ 8867a341066SWolfgang Denk checksum = 0; 887114d7fc0SKyle Moffett for (i = 0; i < EEPROM_CHECKSUM_REG; i++) 888114d7fc0SKyle Moffett checksum += buf[i]; 889114d7fc0SKyle Moffett checksum = ((uint16_t)EEPROM_SUM) - checksum; 890114d7fc0SKyle Moffett checksum_reg = buf[i]; 891114d7fc0SKyle Moffett 892114d7fc0SKyle Moffett /* Verify it! */ 893114d7fc0SKyle Moffett if (checksum == checksum_reg) 894114d7fc0SKyle Moffett return 0; 895114d7fc0SKyle Moffett 896114d7fc0SKyle Moffett /* Hrm, verification failed, print an error */ 897114d7fc0SKyle Moffett E1000_ERR(hw->nic, "EEPROM checksum is incorrect!\n"); 898114d7fc0SKyle Moffett E1000_ERR(hw->nic, " ...register was 0x%04hx, calculated 0x%04hx\n", 899114d7fc0SKyle Moffett checksum_reg, checksum); 900114d7fc0SKyle Moffett 901114d7fc0SKyle Moffett return -E1000_ERR_EEPROM; 9022439e4bfSJean-Christophe PLAGNIOL-VILLARD } 903ecbd2078SRoy Zang 904ecbd2078SRoy Zang /***************************************************************************** 905ecbd2078SRoy Zang * Set PHY to class A mode 906ecbd2078SRoy Zang * Assumes the following operations will follow to enable the new class mode. 907ecbd2078SRoy Zang * 1. Do a PHY soft reset 908ecbd2078SRoy Zang * 2. Restart auto-negotiation or force link. 909ecbd2078SRoy Zang * 910ecbd2078SRoy Zang * hw - Struct containing variables accessed by shared code 911ecbd2078SRoy Zang ****************************************************************************/ 912ecbd2078SRoy Zang static int32_t 913ecbd2078SRoy Zang e1000_set_phy_mode(struct e1000_hw *hw) 914ecbd2078SRoy Zang { 915ecbd2078SRoy Zang int32_t ret_val; 916ecbd2078SRoy Zang uint16_t eeprom_data; 917ecbd2078SRoy Zang 918ecbd2078SRoy Zang DEBUGFUNC(); 919ecbd2078SRoy Zang 920ecbd2078SRoy Zang if ((hw->mac_type == e1000_82545_rev_3) && 921ecbd2078SRoy Zang (hw->media_type == e1000_media_type_copper)) { 922ecbd2078SRoy Zang ret_val = e1000_read_eeprom(hw, EEPROM_PHY_CLASS_WORD, 923ecbd2078SRoy Zang 1, &eeprom_data); 924ecbd2078SRoy Zang if (ret_val) 925ecbd2078SRoy Zang return ret_val; 926ecbd2078SRoy Zang 927ecbd2078SRoy Zang if ((eeprom_data != EEPROM_RESERVED_WORD) && 928ecbd2078SRoy Zang (eeprom_data & EEPROM_PHY_CLASS_A)) { 929ecbd2078SRoy Zang ret_val = e1000_write_phy_reg(hw, 930ecbd2078SRoy Zang M88E1000_PHY_PAGE_SELECT, 0x000B); 931ecbd2078SRoy Zang if (ret_val) 932ecbd2078SRoy Zang return ret_val; 933ecbd2078SRoy Zang ret_val = e1000_write_phy_reg(hw, 934ecbd2078SRoy Zang M88E1000_PHY_GEN_CONTROL, 0x8104); 935ecbd2078SRoy Zang if (ret_val) 936ecbd2078SRoy Zang return ret_val; 937ecbd2078SRoy Zang 938ecbd2078SRoy Zang hw->phy_reset_disable = FALSE; 939ecbd2078SRoy Zang } 940ecbd2078SRoy Zang } 941ecbd2078SRoy Zang 942ecbd2078SRoy Zang return E1000_SUCCESS; 943ecbd2078SRoy Zang } 9442439e4bfSJean-Christophe PLAGNIOL-VILLARD 945aa070789SRoy Zang /*************************************************************************** 946aa070789SRoy Zang * 947aa070789SRoy Zang * Obtaining software semaphore bit (SMBI) before resetting PHY. 948aa070789SRoy Zang * 949aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 950aa070789SRoy Zang * 951aa070789SRoy Zang * returns: - E1000_ERR_RESET if fail to obtain semaphore. 952aa070789SRoy Zang * E1000_SUCCESS at any other case. 953aa070789SRoy Zang * 954aa070789SRoy Zang ***************************************************************************/ 955aa070789SRoy Zang static int32_t 956aa070789SRoy Zang e1000_get_software_semaphore(struct e1000_hw *hw) 957aa070789SRoy Zang { 958aa070789SRoy Zang int32_t timeout = hw->eeprom.word_size + 1; 959aa070789SRoy Zang uint32_t swsm; 960aa070789SRoy Zang 961aa070789SRoy Zang DEBUGFUNC(); 962aa070789SRoy Zang 963aa070789SRoy Zang if (hw->mac_type != e1000_80003es2lan) 964aa070789SRoy Zang return E1000_SUCCESS; 965aa070789SRoy Zang 966aa070789SRoy Zang while (timeout) { 967aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 968aa070789SRoy Zang /* If SMBI bit cleared, it is now set and we hold 969aa070789SRoy Zang * the semaphore */ 970aa070789SRoy Zang if (!(swsm & E1000_SWSM_SMBI)) 971aa070789SRoy Zang break; 972aa070789SRoy Zang mdelay(1); 973aa070789SRoy Zang timeout--; 974aa070789SRoy Zang } 975aa070789SRoy Zang 976aa070789SRoy Zang if (!timeout) { 977aa070789SRoy Zang DEBUGOUT("Driver can't access device - SMBI bit is set.\n"); 978aa070789SRoy Zang return -E1000_ERR_RESET; 979aa070789SRoy Zang } 980aa070789SRoy Zang 981aa070789SRoy Zang return E1000_SUCCESS; 982aa070789SRoy Zang } 983aa070789SRoy Zang 984aa070789SRoy Zang /*************************************************************************** 985aa070789SRoy Zang * This function clears HW semaphore bits. 986aa070789SRoy Zang * 987aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 988aa070789SRoy Zang * 989aa070789SRoy Zang * returns: - None. 990aa070789SRoy Zang * 991aa070789SRoy Zang ***************************************************************************/ 992aa070789SRoy Zang static void 993aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw) 994aa070789SRoy Zang { 995aa070789SRoy Zang uint32_t swsm; 996aa070789SRoy Zang 997aa070789SRoy Zang DEBUGFUNC(); 998aa070789SRoy Zang 999aa070789SRoy Zang if (!hw->eeprom_semaphore_present) 1000aa070789SRoy Zang return; 1001aa070789SRoy Zang 1002aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 1003aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 1004aa070789SRoy Zang /* Release both semaphores. */ 1005aa070789SRoy Zang swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI); 1006aa070789SRoy Zang } else 1007aa070789SRoy Zang swsm &= ~(E1000_SWSM_SWESMBI); 1008aa070789SRoy Zang E1000_WRITE_REG(hw, SWSM, swsm); 1009aa070789SRoy Zang } 1010aa070789SRoy Zang 1011aa070789SRoy Zang /*************************************************************************** 1012aa070789SRoy Zang * 1013aa070789SRoy Zang * Using the combination of SMBI and SWESMBI semaphore bits when resetting 1014aa070789SRoy Zang * adapter or Eeprom access. 1015aa070789SRoy Zang * 1016aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 1017aa070789SRoy Zang * 1018aa070789SRoy Zang * returns: - E1000_ERR_EEPROM if fail to access EEPROM. 1019aa070789SRoy Zang * E1000_SUCCESS at any other case. 1020aa070789SRoy Zang * 1021aa070789SRoy Zang ***************************************************************************/ 1022aa070789SRoy Zang static int32_t 1023aa070789SRoy Zang e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw) 1024aa070789SRoy Zang { 1025aa070789SRoy Zang int32_t timeout; 1026aa070789SRoy Zang uint32_t swsm; 1027aa070789SRoy Zang 1028aa070789SRoy Zang DEBUGFUNC(); 1029aa070789SRoy Zang 1030aa070789SRoy Zang if (!hw->eeprom_semaphore_present) 1031aa070789SRoy Zang return E1000_SUCCESS; 1032aa070789SRoy Zang 1033aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 1034aa070789SRoy Zang /* Get the SW semaphore. */ 1035aa070789SRoy Zang if (e1000_get_software_semaphore(hw) != E1000_SUCCESS) 1036aa070789SRoy Zang return -E1000_ERR_EEPROM; 1037aa070789SRoy Zang } 1038aa070789SRoy Zang 1039aa070789SRoy Zang /* Get the FW semaphore. */ 1040aa070789SRoy Zang timeout = hw->eeprom.word_size + 1; 1041aa070789SRoy Zang while (timeout) { 1042aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 1043aa070789SRoy Zang swsm |= E1000_SWSM_SWESMBI; 1044aa070789SRoy Zang E1000_WRITE_REG(hw, SWSM, swsm); 1045aa070789SRoy Zang /* if we managed to set the bit we got the semaphore. */ 1046aa070789SRoy Zang swsm = E1000_READ_REG(hw, SWSM); 1047aa070789SRoy Zang if (swsm & E1000_SWSM_SWESMBI) 1048aa070789SRoy Zang break; 1049aa070789SRoy Zang 1050aa070789SRoy Zang udelay(50); 1051aa070789SRoy Zang timeout--; 1052aa070789SRoy Zang } 1053aa070789SRoy Zang 1054aa070789SRoy Zang if (!timeout) { 1055aa070789SRoy Zang /* Release semaphores */ 1056aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(hw); 1057aa070789SRoy Zang DEBUGOUT("Driver can't access the Eeprom - " 1058aa070789SRoy Zang "SWESMBI bit is set.\n"); 1059aa070789SRoy Zang return -E1000_ERR_EEPROM; 1060aa070789SRoy Zang } 1061aa070789SRoy Zang 1062aa070789SRoy Zang return E1000_SUCCESS; 1063aa070789SRoy Zang } 1064aa070789SRoy Zang 1065aa070789SRoy Zang static int32_t 1066aa070789SRoy Zang e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask) 1067aa070789SRoy Zang { 1068aa070789SRoy Zang uint32_t swfw_sync = 0; 1069aa070789SRoy Zang uint32_t swmask = mask; 1070aa070789SRoy Zang uint32_t fwmask = mask << 16; 1071aa070789SRoy Zang int32_t timeout = 200; 1072aa070789SRoy Zang 1073aa070789SRoy Zang DEBUGFUNC(); 1074aa070789SRoy Zang while (timeout) { 1075aa070789SRoy Zang if (e1000_get_hw_eeprom_semaphore(hw)) 1076aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 1077aa070789SRoy Zang 1078aa070789SRoy Zang swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); 1079aa070789SRoy Zang if (!(swfw_sync & (fwmask | swmask))) 1080aa070789SRoy Zang break; 1081aa070789SRoy Zang 1082aa070789SRoy Zang /* firmware currently using resource (fwmask) */ 1083aa070789SRoy Zang /* or other software thread currently using resource (swmask) */ 1084aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(hw); 1085aa070789SRoy Zang mdelay(5); 1086aa070789SRoy Zang timeout--; 1087aa070789SRoy Zang } 1088aa070789SRoy Zang 1089aa070789SRoy Zang if (!timeout) { 1090aa070789SRoy Zang DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n"); 1091aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 1092aa070789SRoy Zang } 1093aa070789SRoy Zang 1094aa070789SRoy Zang swfw_sync |= swmask; 1095aa070789SRoy Zang E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync); 1096aa070789SRoy Zang 1097aa070789SRoy Zang e1000_put_hw_eeprom_semaphore(hw); 1098aa070789SRoy Zang return E1000_SUCCESS; 1099aa070789SRoy Zang } 1100aa070789SRoy Zang 1101987b43a1SKyle Moffett static boolean_t e1000_is_second_port(struct e1000_hw *hw) 1102987b43a1SKyle Moffett { 1103987b43a1SKyle Moffett switch (hw->mac_type) { 1104987b43a1SKyle Moffett case e1000_80003es2lan: 1105987b43a1SKyle Moffett case e1000_82546: 1106987b43a1SKyle Moffett case e1000_82571: 1107987b43a1SKyle Moffett if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) 1108987b43a1SKyle Moffett return TRUE; 1109987b43a1SKyle Moffett /* Fallthrough */ 1110987b43a1SKyle Moffett default: 1111987b43a1SKyle Moffett return FALSE; 1112987b43a1SKyle Moffett } 1113987b43a1SKyle Moffett } 1114987b43a1SKyle Moffett 11152439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 11162439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reads the adapter's MAC address from the EEPROM and inverts the LSB for the 11172439e4bfSJean-Christophe PLAGNIOL-VILLARD * second function of dual function devices 11182439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11192439e4bfSJean-Christophe PLAGNIOL-VILLARD * nic - Struct containing variables accessed by shared code 11202439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 11212439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 11222439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_read_mac_addr(struct eth_device *nic) 11232439e4bfSJean-Christophe PLAGNIOL-VILLARD { 11242439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 11252439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t offset; 11262439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t eeprom_data; 11272439e4bfSJean-Christophe PLAGNIOL-VILLARD int i; 11282439e4bfSJean-Christophe PLAGNIOL-VILLARD 11292439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 11302439e4bfSJean-Christophe PLAGNIOL-VILLARD 11312439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < NODE_ADDRESS_SIZE; i += 2) { 11322439e4bfSJean-Christophe PLAGNIOL-VILLARD offset = i >> 1; 1133aa070789SRoy Zang if (e1000_read_eeprom(hw, offset, 1, &eeprom_data) < 0) { 11342439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("EEPROM Read Error\n"); 11352439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 11362439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11372439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[i] = eeprom_data & 0xff; 11382439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[i + 1] = (eeprom_data >> 8) & 0xff; 11392439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1140987b43a1SKyle Moffett 11412439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Invert the last bit if this is the second device */ 1142987b43a1SKyle Moffett if (e1000_is_second_port(hw)) 1143987b43a1SKyle Moffett nic->enetaddr[5] ^= 1; 1144987b43a1SKyle Moffett 1145ac3315c2SAndre Schwarz #ifdef CONFIG_E1000_FALLBACK_MAC 114640867a2fSAnatolij Gustschin if (!is_valid_ether_addr(nic->enetaddr)) { 1147f2302d44SStefan Roese unsigned char fb_mac[NODE_ADDRESS_SIZE] = CONFIG_E1000_FALLBACK_MAC; 1148f2302d44SStefan Roese 1149f2302d44SStefan Roese memcpy (nic->enetaddr, fb_mac, NODE_ADDRESS_SIZE); 1150f2302d44SStefan Roese } 1151ac3315c2SAndre Schwarz #endif 11522439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 11532439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11542439e4bfSJean-Christophe PLAGNIOL-VILLARD 11552439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 11562439e4bfSJean-Christophe PLAGNIOL-VILLARD * Initializes receive address filters. 11572439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11582439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 11592439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11602439e4bfSJean-Christophe PLAGNIOL-VILLARD * Places the MAC address in receive address register 0 and clears the rest 11612439e4bfSJean-Christophe PLAGNIOL-VILLARD * of the receive addresss registers. Clears the multicast table. Assumes 11622439e4bfSJean-Christophe PLAGNIOL-VILLARD * the receiver is in reset when the routine is called. 11632439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 11642439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 11652439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init_rx_addrs(struct eth_device *nic) 11662439e4bfSJean-Christophe PLAGNIOL-VILLARD { 11672439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 11682439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 11692439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t addr_low; 11702439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t addr_high; 11712439e4bfSJean-Christophe PLAGNIOL-VILLARD 11722439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 11732439e4bfSJean-Christophe PLAGNIOL-VILLARD 11742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the receive address. */ 11752439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Programming MAC Address into RAR[0]\n"); 11762439e4bfSJean-Christophe PLAGNIOL-VILLARD addr_low = (nic->enetaddr[0] | 11772439e4bfSJean-Christophe PLAGNIOL-VILLARD (nic->enetaddr[1] << 8) | 11782439e4bfSJean-Christophe PLAGNIOL-VILLARD (nic->enetaddr[2] << 16) | (nic->enetaddr[3] << 24)); 11792439e4bfSJean-Christophe PLAGNIOL-VILLARD 11802439e4bfSJean-Christophe PLAGNIOL-VILLARD addr_high = (nic->enetaddr[4] | (nic->enetaddr[5] << 8) | E1000_RAH_AV); 11812439e4bfSJean-Christophe PLAGNIOL-VILLARD 11822439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, 0, addr_low); 11832439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, 1, addr_high); 11842439e4bfSJean-Christophe PLAGNIOL-VILLARD 11852439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Zero out the other 15 receive addresses. */ 11862439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Clearing RAR[1-15]\n"); 11872439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 1; i < E1000_RAR_ENTRIES; i++) { 11882439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0); 11892439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0); 11902439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11912439e4bfSJean-Christophe PLAGNIOL-VILLARD } 11922439e4bfSJean-Christophe PLAGNIOL-VILLARD 11932439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 11942439e4bfSJean-Christophe PLAGNIOL-VILLARD * Clears the VLAN filer table 11952439e4bfSJean-Christophe PLAGNIOL-VILLARD * 11962439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 11972439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 11982439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 11992439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_clear_vfta(struct e1000_hw *hw) 12002439e4bfSJean-Christophe PLAGNIOL-VILLARD { 12012439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t offset; 12022439e4bfSJean-Christophe PLAGNIOL-VILLARD 12032439e4bfSJean-Christophe PLAGNIOL-VILLARD for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) 12042439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, VFTA, offset, 0); 12052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 12062439e4bfSJean-Christophe PLAGNIOL-VILLARD 12072439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 12082439e4bfSJean-Christophe PLAGNIOL-VILLARD * Set the mac type member in the hw struct. 12092439e4bfSJean-Christophe PLAGNIOL-VILLARD * 12102439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 12112439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 1212aa070789SRoy Zang int32_t 12132439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_set_mac_type(struct e1000_hw *hw) 12142439e4bfSJean-Christophe PLAGNIOL-VILLARD { 12152439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 12162439e4bfSJean-Christophe PLAGNIOL-VILLARD 12172439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->device_id) { 12182439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82542: 12192439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->revision_id) { 12202439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_82542_2_0_REV_ID: 12212439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82542_rev2_0; 12222439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12232439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_82542_2_1_REV_ID: 12242439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82542_rev2_1; 12252439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12262439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 12272439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Invalid 82542 revision ID */ 12282439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_MAC_TYPE; 12292439e4bfSJean-Christophe PLAGNIOL-VILLARD } 12302439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12312439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82543GC_FIBER: 12322439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82543GC_COPPER: 12332439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82543; 12342439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12352439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544EI_COPPER: 12362439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544EI_FIBER: 12372439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544GC_COPPER: 12382439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82544GC_LOM: 12392439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82544; 12402439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12412439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82540EM: 12422439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82540EM_LOM: 1243aa070789SRoy Zang case E1000_DEV_ID_82540EP: 1244aa070789SRoy Zang case E1000_DEV_ID_82540EP_LOM: 1245aa070789SRoy Zang case E1000_DEV_ID_82540EP_LP: 12462439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82540; 12472439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 12482439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82545EM_COPPER: 12492439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82545EM_FIBER: 12502439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82545; 12512439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 1252aa070789SRoy Zang case E1000_DEV_ID_82545GM_COPPER: 1253aa070789SRoy Zang case E1000_DEV_ID_82545GM_FIBER: 1254aa070789SRoy Zang case E1000_DEV_ID_82545GM_SERDES: 1255aa070789SRoy Zang hw->mac_type = e1000_82545_rev_3; 1256aa070789SRoy Zang break; 12572439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82546EB_COPPER: 12582439e4bfSJean-Christophe PLAGNIOL-VILLARD case E1000_DEV_ID_82546EB_FIBER: 1259aa070789SRoy Zang case E1000_DEV_ID_82546EB_QUAD_COPPER: 12602439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_82546; 12612439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 1262aa070789SRoy Zang case E1000_DEV_ID_82546GB_COPPER: 1263aa070789SRoy Zang case E1000_DEV_ID_82546GB_FIBER: 1264aa070789SRoy Zang case E1000_DEV_ID_82546GB_SERDES: 1265aa070789SRoy Zang case E1000_DEV_ID_82546GB_PCIE: 1266aa070789SRoy Zang case E1000_DEV_ID_82546GB_QUAD_COPPER: 1267aa070789SRoy Zang case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 1268aa070789SRoy Zang hw->mac_type = e1000_82546_rev_3; 1269aa070789SRoy Zang break; 1270aa070789SRoy Zang case E1000_DEV_ID_82541EI: 1271aa070789SRoy Zang case E1000_DEV_ID_82541EI_MOBILE: 1272aa070789SRoy Zang case E1000_DEV_ID_82541ER_LOM: 1273aa070789SRoy Zang hw->mac_type = e1000_82541; 1274aa070789SRoy Zang break; 1275ac3315c2SAndre Schwarz case E1000_DEV_ID_82541ER: 1276aa070789SRoy Zang case E1000_DEV_ID_82541GI: 1277aa3b8bf9SWolfgang Grandegger case E1000_DEV_ID_82541GI_LF: 1278aa070789SRoy Zang case E1000_DEV_ID_82541GI_MOBILE: 1279ac3315c2SAndre Schwarz hw->mac_type = e1000_82541_rev_2; 1280ac3315c2SAndre Schwarz break; 1281aa070789SRoy Zang case E1000_DEV_ID_82547EI: 1282aa070789SRoy Zang case E1000_DEV_ID_82547EI_MOBILE: 1283aa070789SRoy Zang hw->mac_type = e1000_82547; 1284aa070789SRoy Zang break; 1285aa070789SRoy Zang case E1000_DEV_ID_82547GI: 1286aa070789SRoy Zang hw->mac_type = e1000_82547_rev_2; 1287aa070789SRoy Zang break; 1288aa070789SRoy Zang case E1000_DEV_ID_82571EB_COPPER: 1289aa070789SRoy Zang case E1000_DEV_ID_82571EB_FIBER: 1290aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES: 1291aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_DUAL: 1292aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_QUAD: 1293aa070789SRoy Zang case E1000_DEV_ID_82571EB_QUAD_COPPER: 1294aa070789SRoy Zang case E1000_DEV_ID_82571PT_QUAD_COPPER: 1295aa070789SRoy Zang case E1000_DEV_ID_82571EB_QUAD_FIBER: 1296aa070789SRoy Zang case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE: 1297aa070789SRoy Zang hw->mac_type = e1000_82571; 1298aa070789SRoy Zang break; 1299aa070789SRoy Zang case E1000_DEV_ID_82572EI_COPPER: 1300aa070789SRoy Zang case E1000_DEV_ID_82572EI_FIBER: 1301aa070789SRoy Zang case E1000_DEV_ID_82572EI_SERDES: 1302aa070789SRoy Zang case E1000_DEV_ID_82572EI: 1303aa070789SRoy Zang hw->mac_type = e1000_82572; 1304aa070789SRoy Zang break; 1305aa070789SRoy Zang case E1000_DEV_ID_82573E: 1306aa070789SRoy Zang case E1000_DEV_ID_82573E_IAMT: 1307aa070789SRoy Zang case E1000_DEV_ID_82573L: 1308aa070789SRoy Zang hw->mac_type = e1000_82573; 1309aa070789SRoy Zang break; 13102c2668f9SRoy Zang case E1000_DEV_ID_82574L: 13112c2668f9SRoy Zang hw->mac_type = e1000_82574; 13122c2668f9SRoy Zang break; 1313aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: 1314aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: 1315aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: 1316aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: 1317aa070789SRoy Zang hw->mac_type = e1000_80003es2lan; 1318aa070789SRoy Zang break; 1319aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_M_AMT: 1320aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_AMT: 1321aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_C: 1322aa070789SRoy Zang case E1000_DEV_ID_ICH8_IFE: 1323aa070789SRoy Zang case E1000_DEV_ID_ICH8_IFE_GT: 1324aa070789SRoy Zang case E1000_DEV_ID_ICH8_IFE_G: 1325aa070789SRoy Zang case E1000_DEV_ID_ICH8_IGP_M: 1326aa070789SRoy Zang hw->mac_type = e1000_ich8lan; 1327aa070789SRoy Zang break; 13282439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 13292439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Should never have loaded on this device */ 13302439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_MAC_TYPE; 13312439e4bfSJean-Christophe PLAGNIOL-VILLARD } 13322439e4bfSJean-Christophe PLAGNIOL-VILLARD return E1000_SUCCESS; 13332439e4bfSJean-Christophe PLAGNIOL-VILLARD } 13342439e4bfSJean-Christophe PLAGNIOL-VILLARD 13352439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 13362439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reset the transmit and receive units; mask and clear all interrupts. 13372439e4bfSJean-Christophe PLAGNIOL-VILLARD * 13382439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 13392439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 13402439e4bfSJean-Christophe PLAGNIOL-VILLARD void 13412439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_reset_hw(struct e1000_hw *hw) 13422439e4bfSJean-Christophe PLAGNIOL-VILLARD { 13432439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 13442439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl_ext; 13452439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t manc; 13469ea005fbSRoy Zang uint32_t pba = 0; 13472439e4bfSJean-Christophe PLAGNIOL-VILLARD 13482439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 13492439e4bfSJean-Christophe PLAGNIOL-VILLARD 13509ea005fbSRoy Zang /* get the correct pba value for both PCI and PCIe*/ 13519ea005fbSRoy Zang if (hw->mac_type < e1000_82571) 13529ea005fbSRoy Zang pba = E1000_DEFAULT_PCI_PBA; 13539ea005fbSRoy Zang else 13549ea005fbSRoy Zang pba = E1000_DEFAULT_PCIE_PBA; 13559ea005fbSRoy Zang 13562439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For 82542 (rev 2.0), disable MWI before issuing a device reset */ 13572439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 13582439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Disabling MWI on 82542 rev 2.0\n"); 13592439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, 1360aa070789SRoy Zang hw->pci_cmd_word & ~PCI_COMMAND_INVALIDATE); 13612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 13622439e4bfSJean-Christophe PLAGNIOL-VILLARD 13632439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear interrupt mask to stop board from generating interrupts */ 13642439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Masking off all interrupts\n"); 13652439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, IMC, 0xffffffff); 13662439e4bfSJean-Christophe PLAGNIOL-VILLARD 13672439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disable the Transmit and Receive units. Then delay to allow 13682439e4bfSJean-Christophe PLAGNIOL-VILLARD * any pending transactions to complete before we hit the MAC with 13692439e4bfSJean-Christophe PLAGNIOL-VILLARD * the global reset. 13702439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 13712439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, 0); 13722439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TCTL, E1000_TCTL_PSP); 13732439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 13742439e4bfSJean-Christophe PLAGNIOL-VILLARD 13752439e4bfSJean-Christophe PLAGNIOL-VILLARD /* The tbi_compatibility_on Flag must be cleared when Rctl is cleared. */ 13762439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->tbi_compatibility_on = FALSE; 13772439e4bfSJean-Christophe PLAGNIOL-VILLARD 13782439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Delay to allow any outstanding PCI transactions to complete before 13792439e4bfSJean-Christophe PLAGNIOL-VILLARD * resetting the device 13802439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 13812439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 13822439e4bfSJean-Christophe PLAGNIOL-VILLARD 13832439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Issue a global reset to the MAC. This will reset the chip's 13842439e4bfSJean-Christophe PLAGNIOL-VILLARD * transmit, receive, DMA, and link units. It will not effect 13852439e4bfSJean-Christophe PLAGNIOL-VILLARD * the current PCI configuration. The global reset bit is self- 13862439e4bfSJean-Christophe PLAGNIOL-VILLARD * clearing, and should clear within a microsecond. 13872439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 13882439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Issuing a global reset to MAC\n"); 13892439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 13902439e4bfSJean-Christophe PLAGNIOL-VILLARD 13912439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST)); 13922439e4bfSJean-Christophe PLAGNIOL-VILLARD 13932439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Force a reload from the EEPROM if necessary */ 13942439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type < e1000_82540) { 13952439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Wait for reset to complete */ 13962439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 13972439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 13982439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext |= E1000_CTRL_EXT_EE_RST; 13992439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 14002439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 14012439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Wait for EEPROM reload */ 14022439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(2); 14032439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 14042439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Wait for EEPROM reload (it happens automatically) */ 14052439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(4); 14062439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Dissable HW ARPs on ASF enabled adapters */ 14072439e4bfSJean-Christophe PLAGNIOL-VILLARD manc = E1000_READ_REG(hw, MANC); 14082439e4bfSJean-Christophe PLAGNIOL-VILLARD manc &= ~(E1000_MANC_ARP_EN); 14092439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, MANC, manc); 14102439e4bfSJean-Christophe PLAGNIOL-VILLARD } 14112439e4bfSJean-Christophe PLAGNIOL-VILLARD 14122439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear interrupt mask to stop board from generating interrupts */ 14132439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Masking off all interrupts\n"); 14142439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, IMC, 0xffffffff); 14152439e4bfSJean-Christophe PLAGNIOL-VILLARD 14162439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear any pending interrupt events. */ 141756b13b1eSZang Roy-R61911 E1000_READ_REG(hw, ICR); 14182439e4bfSJean-Christophe PLAGNIOL-VILLARD 14192439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If MWI was previously enabled, reenable it. */ 14202439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 14212439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, hw->pci_cmd_word); 14222439e4bfSJean-Christophe PLAGNIOL-VILLARD } 14239ea005fbSRoy Zang E1000_WRITE_REG(hw, PBA, pba); 1424aa070789SRoy Zang } 1425aa070789SRoy Zang 1426aa070789SRoy Zang /****************************************************************************** 1427aa070789SRoy Zang * 1428aa070789SRoy Zang * Initialize a number of hardware-dependent bits 1429aa070789SRoy Zang * 1430aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 1431aa070789SRoy Zang * 1432aa070789SRoy Zang * This function contains hardware limitation workarounds for PCI-E adapters 1433aa070789SRoy Zang * 1434aa070789SRoy Zang *****************************************************************************/ 1435aa070789SRoy Zang static void 1436aa070789SRoy Zang e1000_initialize_hardware_bits(struct e1000_hw *hw) 1437aa070789SRoy Zang { 1438aa070789SRoy Zang if ((hw->mac_type >= e1000_82571) && 1439aa070789SRoy Zang (!hw->initialize_hw_bits_disable)) { 1440aa070789SRoy Zang /* Settings common to all PCI-express silicon */ 1441aa070789SRoy Zang uint32_t reg_ctrl, reg_ctrl_ext; 1442aa070789SRoy Zang uint32_t reg_tarc0, reg_tarc1; 1443aa070789SRoy Zang uint32_t reg_tctl; 1444aa070789SRoy Zang uint32_t reg_txdctl, reg_txdctl1; 1445aa070789SRoy Zang 1446aa070789SRoy Zang /* link autonegotiation/sync workarounds */ 1447aa070789SRoy Zang reg_tarc0 = E1000_READ_REG(hw, TARC0); 1448aa070789SRoy Zang reg_tarc0 &= ~((1 << 30)|(1 << 29)|(1 << 28)|(1 << 27)); 1449aa070789SRoy Zang 1450aa070789SRoy Zang /* Enable not-done TX descriptor counting */ 1451aa070789SRoy Zang reg_txdctl = E1000_READ_REG(hw, TXDCTL); 1452aa070789SRoy Zang reg_txdctl |= E1000_TXDCTL_COUNT_DESC; 1453aa070789SRoy Zang E1000_WRITE_REG(hw, TXDCTL, reg_txdctl); 1454aa070789SRoy Zang 1455aa070789SRoy Zang reg_txdctl1 = E1000_READ_REG(hw, TXDCTL1); 1456aa070789SRoy Zang reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC; 1457aa070789SRoy Zang E1000_WRITE_REG(hw, TXDCTL1, reg_txdctl1); 1458aa070789SRoy Zang 1459aa070789SRoy Zang switch (hw->mac_type) { 1460aa070789SRoy Zang case e1000_82571: 1461aa070789SRoy Zang case e1000_82572: 1462aa070789SRoy Zang /* Clear PHY TX compatible mode bits */ 1463aa070789SRoy Zang reg_tarc1 = E1000_READ_REG(hw, TARC1); 1464aa070789SRoy Zang reg_tarc1 &= ~((1 << 30)|(1 << 29)); 1465aa070789SRoy Zang 1466aa070789SRoy Zang /* link autonegotiation/sync workarounds */ 1467aa070789SRoy Zang reg_tarc0 |= ((1 << 26)|(1 << 25)|(1 << 24)|(1 << 23)); 1468aa070789SRoy Zang 1469aa070789SRoy Zang /* TX ring control fixes */ 1470aa070789SRoy Zang reg_tarc1 |= ((1 << 26)|(1 << 25)|(1 << 24)); 1471aa070789SRoy Zang 1472aa070789SRoy Zang /* Multiple read bit is reversed polarity */ 1473aa070789SRoy Zang reg_tctl = E1000_READ_REG(hw, TCTL); 1474aa070789SRoy Zang if (reg_tctl & E1000_TCTL_MULR) 1475aa070789SRoy Zang reg_tarc1 &= ~(1 << 28); 1476aa070789SRoy Zang else 1477aa070789SRoy Zang reg_tarc1 |= (1 << 28); 1478aa070789SRoy Zang 1479aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, reg_tarc1); 1480aa070789SRoy Zang break; 1481aa070789SRoy Zang case e1000_82573: 14822c2668f9SRoy Zang case e1000_82574: 1483aa070789SRoy Zang reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 1484aa070789SRoy Zang reg_ctrl_ext &= ~(1 << 23); 1485aa070789SRoy Zang reg_ctrl_ext |= (1 << 22); 1486aa070789SRoy Zang 1487aa070789SRoy Zang /* TX byte count fix */ 1488aa070789SRoy Zang reg_ctrl = E1000_READ_REG(hw, CTRL); 1489aa070789SRoy Zang reg_ctrl &= ~(1 << 29); 1490aa070789SRoy Zang 1491aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext); 1492aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL, reg_ctrl); 1493aa070789SRoy Zang break; 1494aa070789SRoy Zang case e1000_80003es2lan: 1495aa070789SRoy Zang /* improve small packet performace for fiber/serdes */ 1496aa070789SRoy Zang if ((hw->media_type == e1000_media_type_fiber) 1497aa070789SRoy Zang || (hw->media_type == 1498aa070789SRoy Zang e1000_media_type_internal_serdes)) { 1499aa070789SRoy Zang reg_tarc0 &= ~(1 << 20); 1500aa070789SRoy Zang } 1501aa070789SRoy Zang 1502aa070789SRoy Zang /* Multiple read bit is reversed polarity */ 1503aa070789SRoy Zang reg_tctl = E1000_READ_REG(hw, TCTL); 1504aa070789SRoy Zang reg_tarc1 = E1000_READ_REG(hw, TARC1); 1505aa070789SRoy Zang if (reg_tctl & E1000_TCTL_MULR) 1506aa070789SRoy Zang reg_tarc1 &= ~(1 << 28); 1507aa070789SRoy Zang else 1508aa070789SRoy Zang reg_tarc1 |= (1 << 28); 1509aa070789SRoy Zang 1510aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, reg_tarc1); 1511aa070789SRoy Zang break; 1512aa070789SRoy Zang case e1000_ich8lan: 1513aa070789SRoy Zang /* Reduce concurrent DMA requests to 3 from 4 */ 1514aa070789SRoy Zang if ((hw->revision_id < 3) || 1515aa070789SRoy Zang ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) && 1516aa070789SRoy Zang (hw->device_id != E1000_DEV_ID_ICH8_IGP_M))) 1517aa070789SRoy Zang reg_tarc0 |= ((1 << 29)|(1 << 28)); 1518aa070789SRoy Zang 1519aa070789SRoy Zang reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 1520aa070789SRoy Zang reg_ctrl_ext |= (1 << 22); 1521aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext); 1522aa070789SRoy Zang 1523aa070789SRoy Zang /* workaround TX hang with TSO=on */ 1524aa070789SRoy Zang reg_tarc0 |= ((1 << 27)|(1 << 26)|(1 << 24)|(1 << 23)); 1525aa070789SRoy Zang 1526aa070789SRoy Zang /* Multiple read bit is reversed polarity */ 1527aa070789SRoy Zang reg_tctl = E1000_READ_REG(hw, TCTL); 1528aa070789SRoy Zang reg_tarc1 = E1000_READ_REG(hw, TARC1); 1529aa070789SRoy Zang if (reg_tctl & E1000_TCTL_MULR) 1530aa070789SRoy Zang reg_tarc1 &= ~(1 << 28); 1531aa070789SRoy Zang else 1532aa070789SRoy Zang reg_tarc1 |= (1 << 28); 1533aa070789SRoy Zang 1534aa070789SRoy Zang /* workaround TX hang with TSO=on */ 1535aa070789SRoy Zang reg_tarc1 |= ((1 << 30)|(1 << 26)|(1 << 24)); 1536aa070789SRoy Zang 1537aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, reg_tarc1); 1538aa070789SRoy Zang break; 1539aa070789SRoy Zang default: 1540aa070789SRoy Zang break; 1541aa070789SRoy Zang } 1542aa070789SRoy Zang 1543aa070789SRoy Zang E1000_WRITE_REG(hw, TARC0, reg_tarc0); 1544aa070789SRoy Zang } 15452439e4bfSJean-Christophe PLAGNIOL-VILLARD } 15462439e4bfSJean-Christophe PLAGNIOL-VILLARD 15472439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 15482439e4bfSJean-Christophe PLAGNIOL-VILLARD * Performs basic configuration of the adapter. 15492439e4bfSJean-Christophe PLAGNIOL-VILLARD * 15502439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 15512439e4bfSJean-Christophe PLAGNIOL-VILLARD * 15522439e4bfSJean-Christophe PLAGNIOL-VILLARD * Assumes that the controller has previously been reset and is in a 15532439e4bfSJean-Christophe PLAGNIOL-VILLARD * post-reset uninitialized state. Initializes the receive address registers, 15542439e4bfSJean-Christophe PLAGNIOL-VILLARD * multicast table, and VLAN filter table. Calls routines to setup link 15552439e4bfSJean-Christophe PLAGNIOL-VILLARD * configuration and flow control settings. Clears all on-chip counters. Leaves 15562439e4bfSJean-Christophe PLAGNIOL-VILLARD * the transmit and receive units disabled and uninitialized. 15572439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 15582439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 15592439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init_hw(struct eth_device *nic) 15602439e4bfSJean-Christophe PLAGNIOL-VILLARD { 15612439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 1562aa070789SRoy Zang uint32_t ctrl; 15632439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 15642439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 15652439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t pcix_cmd_word; 15662439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t pcix_stat_hi_word; 15672439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t cmd_mmrbc; 15682439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t stat_mmrbc; 1569aa070789SRoy Zang uint32_t mta_size; 1570aa070789SRoy Zang uint32_t reg_data; 1571aa070789SRoy Zang uint32_t ctrl_ext; 15722439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 1573aa070789SRoy Zang /* force full DMA clock frequency for 10/100 on ICH8 A0-B0 */ 1574aa070789SRoy Zang if ((hw->mac_type == e1000_ich8lan) && 1575aa070789SRoy Zang ((hw->revision_id < 3) || 1576aa070789SRoy Zang ((hw->device_id != E1000_DEV_ID_ICH8_IGP_M_AMT) && 1577aa070789SRoy Zang (hw->device_id != E1000_DEV_ID_ICH8_IGP_M)))) { 1578aa070789SRoy Zang reg_data = E1000_READ_REG(hw, STATUS); 1579aa070789SRoy Zang reg_data &= ~0x80000000; 1580aa070789SRoy Zang E1000_WRITE_REG(hw, STATUS, reg_data); 15812439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1582aa070789SRoy Zang /* Do not need initialize Identification LED */ 15832439e4bfSJean-Christophe PLAGNIOL-VILLARD 1584aa070789SRoy Zang /* Set the media type and TBI compatibility */ 1585aa070789SRoy Zang e1000_set_media_type(hw); 1586aa070789SRoy Zang 1587aa070789SRoy Zang /* Must be called after e1000_set_media_type 1588aa070789SRoy Zang * because media_type is used */ 1589aa070789SRoy Zang e1000_initialize_hardware_bits(hw); 15902439e4bfSJean-Christophe PLAGNIOL-VILLARD 15912439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disabling VLAN filtering. */ 15922439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Initializing the IEEE VLAN\n"); 1593aa070789SRoy Zang /* VET hardcoded to standard value and VFTA removed in ICH8 LAN */ 1594aa070789SRoy Zang if (hw->mac_type != e1000_ich8lan) { 1595aa070789SRoy Zang if (hw->mac_type < e1000_82545_rev_3) 15962439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, VET, 0); 15972439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_clear_vfta(hw); 1598aa070789SRoy Zang } 15992439e4bfSJean-Christophe PLAGNIOL-VILLARD 16002439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */ 16012439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 16022439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Disabling MWI on 82542 rev 2.0\n"); 16032439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, 16042439e4bfSJean-Christophe PLAGNIOL-VILLARD hw-> 16052439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_cmd_word & ~PCI_COMMAND_INVALIDATE); 16062439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, E1000_RCTL_RST); 16072439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 16082439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(5); 16092439e4bfSJean-Christophe PLAGNIOL-VILLARD } 16102439e4bfSJean-Christophe PLAGNIOL-VILLARD 16112439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the receive address. This involves initializing all of the Receive 16122439e4bfSJean-Christophe PLAGNIOL-VILLARD * Address Registers (RARs 0 - 15). 16132439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 16142439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init_rx_addrs(nic); 16152439e4bfSJean-Christophe PLAGNIOL-VILLARD 16162439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For 82542 (rev 2.0), take the receiver out of reset and enable MWI */ 16172439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) { 16182439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, 0); 16192439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 16202439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(1); 16212439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCI_COMMAND, hw->pci_cmd_word); 16222439e4bfSJean-Christophe PLAGNIOL-VILLARD } 16232439e4bfSJean-Christophe PLAGNIOL-VILLARD 16242439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Zero out the Multicast HASH table */ 16252439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Zeroing the MTA\n"); 1626aa070789SRoy Zang mta_size = E1000_MC_TBL_SIZE; 1627aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 1628aa070789SRoy Zang mta_size = E1000_MC_TBL_SIZE_ICH8LAN; 1629aa070789SRoy Zang for (i = 0; i < mta_size; i++) { 16302439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); 1631aa070789SRoy Zang /* use write flush to prevent Memory Write Block (MWB) from 1632aa070789SRoy Zang * occuring when accessing our register space */ 1633aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 1634aa070789SRoy Zang } 16352439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 16362439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the PCI priority bit correctly in the CTRL register. This 16372439e4bfSJean-Christophe PLAGNIOL-VILLARD * determines if the adapter gives priority to receives, or if it 1638aa070789SRoy Zang * gives equal priority to transmits and receives. Valid only on 1639aa070789SRoy Zang * 82542 and 82543 silicon. 16402439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1641aa070789SRoy Zang if (hw->dma_fairness && hw->mac_type <= e1000_82543) { 16422439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 16432439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PRIOR); 16442439e4bfSJean-Christophe PLAGNIOL-VILLARD } 16452439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 1646aa070789SRoy Zang switch (hw->mac_type) { 1647aa070789SRoy Zang case e1000_82545_rev_3: 1648aa070789SRoy Zang case e1000_82546_rev_3: 1649aa070789SRoy Zang break; 1650aa070789SRoy Zang default: 16512439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */ 1652aa070789SRoy Zang if (hw->bus_type == e1000_bus_type_pcix) { 16532439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCIX_COMMAND_REGISTER, 16542439e4bfSJean-Christophe PLAGNIOL-VILLARD &pcix_cmd_word); 16552439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCIX_STATUS_REGISTER_HI, 16562439e4bfSJean-Christophe PLAGNIOL-VILLARD &pcix_stat_hi_word); 16572439e4bfSJean-Christophe PLAGNIOL-VILLARD cmd_mmrbc = 16582439e4bfSJean-Christophe PLAGNIOL-VILLARD (pcix_cmd_word & PCIX_COMMAND_MMRBC_MASK) >> 16592439e4bfSJean-Christophe PLAGNIOL-VILLARD PCIX_COMMAND_MMRBC_SHIFT; 16602439e4bfSJean-Christophe PLAGNIOL-VILLARD stat_mmrbc = 16612439e4bfSJean-Christophe PLAGNIOL-VILLARD (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >> 16622439e4bfSJean-Christophe PLAGNIOL-VILLARD PCIX_STATUS_HI_MMRBC_SHIFT; 16632439e4bfSJean-Christophe PLAGNIOL-VILLARD if (stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K) 16642439e4bfSJean-Christophe PLAGNIOL-VILLARD stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K; 16652439e4bfSJean-Christophe PLAGNIOL-VILLARD if (cmd_mmrbc > stat_mmrbc) { 16662439e4bfSJean-Christophe PLAGNIOL-VILLARD pcix_cmd_word &= ~PCIX_COMMAND_MMRBC_MASK; 16672439e4bfSJean-Christophe PLAGNIOL-VILLARD pcix_cmd_word |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT; 16682439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_write_config_word(hw->pdev, PCIX_COMMAND_REGISTER, 16692439e4bfSJean-Christophe PLAGNIOL-VILLARD pcix_cmd_word); 16702439e4bfSJean-Christophe PLAGNIOL-VILLARD } 16712439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1672aa070789SRoy Zang break; 1673aa070789SRoy Zang } 1674aa070789SRoy Zang 1675aa070789SRoy Zang /* More time needed for PHY to initialize */ 1676aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 1677aa070789SRoy Zang mdelay(15); 16782439e4bfSJean-Christophe PLAGNIOL-VILLARD 16792439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Call a subroutine to configure the link and setup flow control. */ 16802439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_setup_link(nic); 16812439e4bfSJean-Christophe PLAGNIOL-VILLARD 16822439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the transmit descriptor write-back policy */ 16832439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82544) { 16842439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, TXDCTL); 16852439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = 16862439e4bfSJean-Christophe PLAGNIOL-VILLARD (ctrl & ~E1000_TXDCTL_WTHRESH) | 16872439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_TXDCTL_FULL_TX_DESC_WB; 16882439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXDCTL, ctrl); 16892439e4bfSJean-Christophe PLAGNIOL-VILLARD } 1690aa070789SRoy Zang 1691*776e66e8SRuchika Gupta /* Set the receive descriptor write back policy */ 1692*776e66e8SRuchika Gupta 1693*776e66e8SRuchika Gupta if (hw->mac_type >= e1000_82571) { 1694*776e66e8SRuchika Gupta ctrl = E1000_READ_REG(hw, RXDCTL); 1695*776e66e8SRuchika Gupta ctrl = 1696*776e66e8SRuchika Gupta (ctrl & ~E1000_RXDCTL_WTHRESH) | 1697*776e66e8SRuchika Gupta E1000_RXDCTL_FULL_RX_DESC_WB; 1698*776e66e8SRuchika Gupta E1000_WRITE_REG(hw, RXDCTL, ctrl); 1699*776e66e8SRuchika Gupta } 1700*776e66e8SRuchika Gupta 1701aa070789SRoy Zang switch (hw->mac_type) { 1702aa070789SRoy Zang default: 1703aa070789SRoy Zang break; 1704aa070789SRoy Zang case e1000_80003es2lan: 1705aa070789SRoy Zang /* Enable retransmit on late collisions */ 1706aa070789SRoy Zang reg_data = E1000_READ_REG(hw, TCTL); 1707aa070789SRoy Zang reg_data |= E1000_TCTL_RTLC; 1708aa070789SRoy Zang E1000_WRITE_REG(hw, TCTL, reg_data); 1709aa070789SRoy Zang 1710aa070789SRoy Zang /* Configure Gigabit Carry Extend Padding */ 1711aa070789SRoy Zang reg_data = E1000_READ_REG(hw, TCTL_EXT); 1712aa070789SRoy Zang reg_data &= ~E1000_TCTL_EXT_GCEX_MASK; 1713aa070789SRoy Zang reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX; 1714aa070789SRoy Zang E1000_WRITE_REG(hw, TCTL_EXT, reg_data); 1715aa070789SRoy Zang 1716aa070789SRoy Zang /* Configure Transmit Inter-Packet Gap */ 1717aa070789SRoy Zang reg_data = E1000_READ_REG(hw, TIPG); 1718aa070789SRoy Zang reg_data &= ~E1000_TIPG_IPGT_MASK; 1719aa070789SRoy Zang reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; 1720aa070789SRoy Zang E1000_WRITE_REG(hw, TIPG, reg_data); 1721aa070789SRoy Zang 1722aa070789SRoy Zang reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001); 1723aa070789SRoy Zang reg_data &= ~0x00100000; 1724aa070789SRoy Zang E1000_WRITE_REG_ARRAY(hw, FFLT, 0x0001, reg_data); 1725aa070789SRoy Zang /* Fall through */ 1726aa070789SRoy Zang case e1000_82571: 1727aa070789SRoy Zang case e1000_82572: 1728aa070789SRoy Zang case e1000_ich8lan: 1729aa070789SRoy Zang ctrl = E1000_READ_REG(hw, TXDCTL1); 1730aa070789SRoy Zang ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) 1731aa070789SRoy Zang | E1000_TXDCTL_FULL_TX_DESC_WB; 1732aa070789SRoy Zang E1000_WRITE_REG(hw, TXDCTL1, ctrl); 1733aa070789SRoy Zang break; 17342c2668f9SRoy Zang case e1000_82573: 17352c2668f9SRoy Zang case e1000_82574: 17362c2668f9SRoy Zang reg_data = E1000_READ_REG(hw, GCR); 17372c2668f9SRoy Zang reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; 17382c2668f9SRoy Zang E1000_WRITE_REG(hw, GCR, reg_data); 1739aa070789SRoy Zang } 1740aa070789SRoy Zang 17412439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 17422439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear all of the statistics registers (clear on read). It is 17432439e4bfSJean-Christophe PLAGNIOL-VILLARD * important that we do this after we have tried to establish link 17442439e4bfSJean-Christophe PLAGNIOL-VILLARD * because the symbol error count will increment wildly if there 17452439e4bfSJean-Christophe PLAGNIOL-VILLARD * is no link. 17462439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 17472439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_clear_hw_cntrs(hw); 1748aa070789SRoy Zang 1749aa070789SRoy Zang /* ICH8 No-snoop bits are opposite polarity. 1750aa070789SRoy Zang * Set to snoop by default after reset. */ 1751aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) 1752aa070789SRoy Zang e1000_set_pci_ex_no_snoop(hw, PCI_EX_82566_SNOOP_ALL); 17532439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 17542439e4bfSJean-Christophe PLAGNIOL-VILLARD 1755aa070789SRoy Zang if (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER || 1756aa070789SRoy Zang hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3) { 1757aa070789SRoy Zang ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 1758aa070789SRoy Zang /* Relaxed ordering must be disabled to avoid a parity 1759aa070789SRoy Zang * error crash in a PCI slot. */ 1760aa070789SRoy Zang ctrl_ext |= E1000_CTRL_EXT_RO_DIS; 1761aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 1762aa070789SRoy Zang } 1763aa070789SRoy Zang 17642439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 17652439e4bfSJean-Christophe PLAGNIOL-VILLARD } 17662439e4bfSJean-Christophe PLAGNIOL-VILLARD 17672439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 17682439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configures flow control and link settings. 17692439e4bfSJean-Christophe PLAGNIOL-VILLARD * 17702439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 17712439e4bfSJean-Christophe PLAGNIOL-VILLARD * 17722439e4bfSJean-Christophe PLAGNIOL-VILLARD * Determines which flow control settings to use. Calls the apropriate media- 17732439e4bfSJean-Christophe PLAGNIOL-VILLARD * specific link configuration function. Configures the flow control settings. 17742439e4bfSJean-Christophe PLAGNIOL-VILLARD * Assuming the adapter has a valid link partner, a valid link should be 17752439e4bfSJean-Christophe PLAGNIOL-VILLARD * established. Assumes the hardware has previously been reset and the 17762439e4bfSJean-Christophe PLAGNIOL-VILLARD * transmitter and receiver are not enabled. 17772439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 17782439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 17792439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_link(struct eth_device *nic) 17802439e4bfSJean-Christophe PLAGNIOL-VILLARD { 17812439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 17822439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl_ext; 17832439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 17842439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t eeprom_data; 17852439e4bfSJean-Christophe PLAGNIOL-VILLARD 17862439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 17872439e4bfSJean-Christophe PLAGNIOL-VILLARD 1788aa070789SRoy Zang /* In the case of the phy reset being blocked, we already have a link. 1789aa070789SRoy Zang * We do not have to set it up again. */ 1790aa070789SRoy Zang if (e1000_check_phy_reset_block(hw)) 1791aa070789SRoy Zang return E1000_SUCCESS; 1792aa070789SRoy Zang 17932439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read and store word 0x0F of the EEPROM. This word contains bits 17942439e4bfSJean-Christophe PLAGNIOL-VILLARD * that determine the hardware's default PAUSE (flow control) mode, 17952439e4bfSJean-Christophe PLAGNIOL-VILLARD * a bit that determines whether the HW defaults to enabling or 17962439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabling auto-negotiation, and the direction of the 17972439e4bfSJean-Christophe PLAGNIOL-VILLARD * SW defined pins. If there is no SW over-ride of the flow 17982439e4bfSJean-Christophe PLAGNIOL-VILLARD * control setting, then the variable hw->fc will 17992439e4bfSJean-Christophe PLAGNIOL-VILLARD * be initialized based on a value in the EEPROM. 18002439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1801aa070789SRoy Zang if (e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG, 1, 1802aa070789SRoy Zang &eeprom_data) < 0) { 18032439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("EEPROM Read Error\n"); 18042439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_EEPROM; 18052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18062439e4bfSJean-Christophe PLAGNIOL-VILLARD 18072439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->fc == e1000_fc_default) { 1808aa070789SRoy Zang switch (hw->mac_type) { 1809aa070789SRoy Zang case e1000_ich8lan: 1810aa070789SRoy Zang case e1000_82573: 18112c2668f9SRoy Zang case e1000_82574: 1812aa070789SRoy Zang hw->fc = e1000_fc_full; 1813aa070789SRoy Zang break; 1814aa070789SRoy Zang default: 1815aa070789SRoy Zang ret_val = e1000_read_eeprom(hw, 1816aa070789SRoy Zang EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data); 1817aa070789SRoy Zang if (ret_val) { 1818aa070789SRoy Zang DEBUGOUT("EEPROM Read Error\n"); 1819aa070789SRoy Zang return -E1000_ERR_EEPROM; 1820aa070789SRoy Zang } 18212439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 0) 18222439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_none; 18232439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((eeprom_data & EEPROM_WORD0F_PAUSE_MASK) == 18242439e4bfSJean-Christophe PLAGNIOL-VILLARD EEPROM_WORD0F_ASM_DIR) 18252439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_tx_pause; 18262439e4bfSJean-Christophe PLAGNIOL-VILLARD else 18272439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_full; 1828aa070789SRoy Zang break; 1829aa070789SRoy Zang } 18302439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18312439e4bfSJean-Christophe PLAGNIOL-VILLARD 18322439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We want to save off the original Flow Control configuration just 18332439e4bfSJean-Christophe PLAGNIOL-VILLARD * in case we get disconnected and then reconnected into a different 18342439e4bfSJean-Christophe PLAGNIOL-VILLARD * hub or switch with different Flow Control capabilities. 18352439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18362439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) 18372439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc &= (~e1000_fc_tx_pause); 18382439e4bfSJean-Christophe PLAGNIOL-VILLARD 18392439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->mac_type < e1000_82543) && (hw->report_tx_early == 1)) 18402439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc &= (~e1000_fc_rx_pause); 18412439e4bfSJean-Christophe PLAGNIOL-VILLARD 18422439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->original_fc = hw->fc; 18432439e4bfSJean-Christophe PLAGNIOL-VILLARD 18442439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("After fix-ups FlowControl is now = %x\n", hw->fc); 18452439e4bfSJean-Christophe PLAGNIOL-VILLARD 18462439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Take the 4 bits from EEPROM word 0x0F that determine the initial 18472439e4bfSJean-Christophe PLAGNIOL-VILLARD * polarity value for the SW controlled pins, and setup the 18482439e4bfSJean-Christophe PLAGNIOL-VILLARD * Extended Device Control reg with that info. 18492439e4bfSJean-Christophe PLAGNIOL-VILLARD * This is needed because one of the SW controlled pins is used for 18502439e4bfSJean-Christophe PLAGNIOL-VILLARD * signal detection. So this should be done before e1000_setup_pcs_link() 18512439e4bfSJean-Christophe PLAGNIOL-VILLARD * or e1000_phy_setup() is called. 18522439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18532439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82543) { 18542439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext = ((eeprom_data & EEPROM_WORD0F_SWPDIO_EXT) << 18552439e4bfSJean-Christophe PLAGNIOL-VILLARD SWDPIO__EXT_SHIFT); 18562439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 18572439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18582439e4bfSJean-Christophe PLAGNIOL-VILLARD 18592439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Call the necessary subroutine to configure the link. */ 18602439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = (hw->media_type == e1000_media_type_fiber) ? 18612439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_fiber_link(nic) : e1000_setup_copper_link(nic); 18622439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 18632439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 18642439e4bfSJean-Christophe PLAGNIOL-VILLARD } 18652439e4bfSJean-Christophe PLAGNIOL-VILLARD 18662439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Initialize the flow control address, type, and PAUSE timer 18672439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers to their default values. This is done even if flow 18682439e4bfSJean-Christophe PLAGNIOL-VILLARD * control is disabled, because it does not hurt anything to 18692439e4bfSJean-Christophe PLAGNIOL-VILLARD * initialize these registers. 18702439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 1871aa070789SRoy Zang DEBUGOUT("Initializing the Flow Control address, type" 1872aa070789SRoy Zang "and timer regs\n"); 18732439e4bfSJean-Christophe PLAGNIOL-VILLARD 1874aa070789SRoy Zang /* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */ 1875aa070789SRoy Zang if (hw->mac_type != e1000_ich8lan) { 18762439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE); 1877aa070789SRoy Zang E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH); 1878aa070789SRoy Zang E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW); 1879aa070789SRoy Zang } 1880aa070789SRoy Zang 18812439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time); 18822439e4bfSJean-Christophe PLAGNIOL-VILLARD 18832439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the flow control receive threshold registers. Normally, 18842439e4bfSJean-Christophe PLAGNIOL-VILLARD * these registers will be set to a default threshold that may be 18852439e4bfSJean-Christophe PLAGNIOL-VILLARD * adjusted later by the driver's runtime code. However, if the 18862439e4bfSJean-Christophe PLAGNIOL-VILLARD * ability to transmit pause frames in not enabled, then these 18872439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers will be set to 0. 18882439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18892439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(hw->fc & e1000_fc_tx_pause)) { 18902439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTL, 0); 18912439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTH, 0); 18922439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 18932439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We need to set up the Receive Threshold high and low water marks 18942439e4bfSJean-Christophe PLAGNIOL-VILLARD * as well as (optionally) enabling the transmission of XON frames. 18952439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 18962439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->fc_send_xon) { 18972439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTL, 18982439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw->fc_low_water | E1000_FCRTL_XONE)); 18992439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water); 19002439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 19012439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTL, hw->fc_low_water); 19022439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, FCRTH, hw->fc_high_water); 19032439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19042439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19052439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 19062439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19072439e4bfSJean-Christophe PLAGNIOL-VILLARD 19082439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 19092439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets up link for a fiber based adapter 19102439e4bfSJean-Christophe PLAGNIOL-VILLARD * 19112439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 19122439e4bfSJean-Christophe PLAGNIOL-VILLARD * 19132439e4bfSJean-Christophe PLAGNIOL-VILLARD * Manipulates Physical Coding Sublayer functions in order to configure 19142439e4bfSJean-Christophe PLAGNIOL-VILLARD * link. Assumes the hardware has been previously reset and the transmitter 19152439e4bfSJean-Christophe PLAGNIOL-VILLARD * and receiver are not enabled. 19162439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 19172439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 19182439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_fiber_link(struct eth_device *nic) 19192439e4bfSJean-Christophe PLAGNIOL-VILLARD { 19202439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 19212439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 19222439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status; 19232439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t txcw = 0; 19242439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 19252439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t signal; 19262439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 19272439e4bfSJean-Christophe PLAGNIOL-VILLARD 19282439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 19292439e4bfSJean-Christophe PLAGNIOL-VILLARD /* On adapters with a MAC newer that 82544, SW Defineable pin 1 will be 19302439e4bfSJean-Christophe PLAGNIOL-VILLARD * set when the optics detect a signal. On older adapters, it will be 19312439e4bfSJean-Christophe PLAGNIOL-VILLARD * cleared when there is a signal 19322439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19332439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 19342439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->mac_type > e1000_82544) && !(ctrl & E1000_CTRL_ILOS)) 19352439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = E1000_CTRL_SWDPIN1; 19362439e4bfSJean-Christophe PLAGNIOL-VILLARD else 19372439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = 0; 19382439e4bfSJean-Christophe PLAGNIOL-VILLARD 19392439e4bfSJean-Christophe PLAGNIOL-VILLARD printf("signal for %s is %x (ctrl %08x)!!!!\n", nic->name, signal, 19402439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl); 19412439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Take the link out of reset */ 19422439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~(E1000_CTRL_LRST); 19432439e4bfSJean-Christophe PLAGNIOL-VILLARD 19442439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 19452439e4bfSJean-Christophe PLAGNIOL-VILLARD 19462439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for a software override of the flow control settings, and setup 19472439e4bfSJean-Christophe PLAGNIOL-VILLARD * the device accordingly. If auto-negotiation is enabled, then software 19482439e4bfSJean-Christophe PLAGNIOL-VILLARD * will have to set the "PAUSE" bits to the correct value in the Tranmsit 19492439e4bfSJean-Christophe PLAGNIOL-VILLARD * Config Word Register (TXCW) and re-start auto-negotiation. However, if 19502439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation is disabled, then software will have to manually 19512439e4bfSJean-Christophe PLAGNIOL-VILLARD * configure the two flow control enable bits in the CTRL register. 19522439e4bfSJean-Christophe PLAGNIOL-VILLARD * 19532439e4bfSJean-Christophe PLAGNIOL-VILLARD * The possible values of the "fc" parameter are: 19542439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0: Flow control is completely disabled 19552439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1: Rx flow control is enabled (we can receive pause frames, but 19562439e4bfSJean-Christophe PLAGNIOL-VILLARD * not send pause frames). 19572439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2: Tx flow control is enabled (we can send pause frames but we do 19582439e4bfSJean-Christophe PLAGNIOL-VILLARD * not support receiving pause frames). 19592439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3: Both Rx and TX flow control (symmetric) are enabled. 19602439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19612439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->fc) { 19622439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_none: 19632439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control is completely disabled by a software over-ride. */ 19642439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD); 19652439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19662439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_rx_pause: 19672439e4bfSJean-Christophe PLAGNIOL-VILLARD /* RX Flow control is enabled and TX Flow control is disabled by a 19682439e4bfSJean-Christophe PLAGNIOL-VILLARD * software over-ride. Since there really isn't a way to advertise 19692439e4bfSJean-Christophe PLAGNIOL-VILLARD * that we are capable of RX Pause ONLY, we will advertise that we 19702439e4bfSJean-Christophe PLAGNIOL-VILLARD * support both symmetric and asymmetric RX PAUSE. Later, we will 19712439e4bfSJean-Christophe PLAGNIOL-VILLARD * disable the adapter's ability to send PAUSE frames. 19722439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19732439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); 19742439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19752439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_tx_pause: 19762439e4bfSJean-Christophe PLAGNIOL-VILLARD /* TX Flow control is enabled, and RX Flow control is disabled, by a 19772439e4bfSJean-Christophe PLAGNIOL-VILLARD * software over-ride. 19782439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19792439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR); 19802439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19812439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_full: 19822439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control (both RX and TX) is enabled by a software over-ride. */ 19832439e4bfSJean-Christophe PLAGNIOL-VILLARD txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK); 19842439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19852439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 19862439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow control param set incorrectly\n"); 19872439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 19882439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 19892439e4bfSJean-Christophe PLAGNIOL-VILLARD } 19902439e4bfSJean-Christophe PLAGNIOL-VILLARD 19912439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Since auto-negotiation is enabled, take the link out of reset (the link 19922439e4bfSJean-Christophe PLAGNIOL-VILLARD * will be in reset, because we previously reset the chip). This will 19932439e4bfSJean-Christophe PLAGNIOL-VILLARD * restart auto-negotiation. If auto-neogtiation is successful then the 19942439e4bfSJean-Christophe PLAGNIOL-VILLARD * link-up status bit will be set and the flow control enable bits (RFCE 19952439e4bfSJean-Christophe PLAGNIOL-VILLARD * and TFCE) will be set according to their negotiated value. 19962439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 19972439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-negotiation enabled (%#x)\n", txcw); 19982439e4bfSJean-Christophe PLAGNIOL-VILLARD 19992439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXCW, txcw); 20002439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 20012439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 20022439e4bfSJean-Christophe PLAGNIOL-VILLARD 20032439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->txcw = txcw; 20042439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(1); 20052439e4bfSJean-Christophe PLAGNIOL-VILLARD 20062439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we have a signal (the cable is plugged in) then poll for a "Link-Up" 20072439e4bfSJean-Christophe PLAGNIOL-VILLARD * indication in the Device Status Register. Time-out if a link isn't 20082439e4bfSJean-Christophe PLAGNIOL-VILLARD * seen in 500 milliseconds seconds (Auto-negotiation should complete in 20092439e4bfSJean-Christophe PLAGNIOL-VILLARD * less than 500 milliseconds even if the other end is doing it in SW). 20102439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 20112439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((E1000_READ_REG(hw, CTRL) & E1000_CTRL_SWDPIN1) == signal) { 20122439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Looking for Link\n"); 20132439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < (LINK_UP_TIMEOUT / 10); i++) { 20142439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 20152439e4bfSJean-Christophe PLAGNIOL-VILLARD status = E1000_READ_REG(hw, STATUS); 20162439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_LU) 20172439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 20182439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20192439e4bfSJean-Christophe PLAGNIOL-VILLARD if (i == (LINK_UP_TIMEOUT / 10)) { 20202439e4bfSJean-Christophe PLAGNIOL-VILLARD /* AutoNeg failed to achieve a link, so we'll call 20212439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_check_for_link. This routine will force the link up if we 20222439e4bfSJean-Christophe PLAGNIOL-VILLARD * detect a signal. This will allow us to communicate with 20232439e4bfSJean-Christophe PLAGNIOL-VILLARD * non-autonegotiating link partners. 20242439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 20252439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Never got a valid link from auto-neg!!!\n"); 20262439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 1; 20272439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_check_for_link(nic); 20282439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 20292439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error while checking for link\n"); 20302439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 20312439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20322439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 0; 20332439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 20342439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 0; 20352439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Valid Link Found\n"); 20362439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20372439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 20382439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("No Signal Detected\n"); 20392439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_NOLINK; 20402439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20412439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 20422439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20432439e4bfSJean-Christophe PLAGNIOL-VILLARD 20442439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 2045aa070789SRoy Zang * Make sure we have a valid PHY and change PHY mode before link setup. 20462439e4bfSJean-Christophe PLAGNIOL-VILLARD * 20472439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 20482439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 2049aa070789SRoy Zang static int32_t 2050aa070789SRoy Zang e1000_copper_link_preconfig(struct e1000_hw *hw) 20512439e4bfSJean-Christophe PLAGNIOL-VILLARD { 20522439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 20532439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 20542439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 20552439e4bfSJean-Christophe PLAGNIOL-VILLARD 20562439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 20572439e4bfSJean-Christophe PLAGNIOL-VILLARD 20582439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 20592439e4bfSJean-Christophe PLAGNIOL-VILLARD /* With 82543, we need to force speed and duplex on the MAC equal to what 20602439e4bfSJean-Christophe PLAGNIOL-VILLARD * the PHY speed and duplex configuration is. In addition, we need to 20612439e4bfSJean-Christophe PLAGNIOL-VILLARD * perform a hardware reset on the PHY to take it out of reset. 20622439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 20632439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 20642439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_SLU; 20652439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 20662439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 20672439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 2068aa070789SRoy Zang ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX 2069aa070789SRoy Zang | E1000_CTRL_SLU); 20702439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 2071aa070789SRoy Zang ret_val = e1000_phy_hw_reset(hw); 2072aa070789SRoy Zang if (ret_val) 2073aa070789SRoy Zang return ret_val; 20742439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20752439e4bfSJean-Christophe PLAGNIOL-VILLARD 20762439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Make sure we have a valid PHY */ 20772439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_detect_gig_phy(hw); 2078aa070789SRoy Zang if (ret_val) { 20792439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error, did not detect valid phy.\n"); 20802439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 20812439e4bfSJean-Christophe PLAGNIOL-VILLARD } 20822439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Phy ID = %x \n", hw->phy_id); 20832439e4bfSJean-Christophe PLAGNIOL-VILLARD 2084aa070789SRoy Zang /* Set PHY to class A mode (if necessary) */ 2085aa070789SRoy Zang ret_val = e1000_set_phy_mode(hw); 2086aa070789SRoy Zang if (ret_val) 2087aa070789SRoy Zang return ret_val; 2088aa070789SRoy Zang if ((hw->mac_type == e1000_82545_rev_3) || 2089aa070789SRoy Zang (hw->mac_type == e1000_82546_rev_3)) { 2090aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, 2091aa070789SRoy Zang &phy_data); 2092aa070789SRoy Zang phy_data |= 0x00000008; 2093aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, 2094aa070789SRoy Zang phy_data); 20952439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2096aa070789SRoy Zang 2097aa070789SRoy Zang if (hw->mac_type <= e1000_82543 || 2098aa070789SRoy Zang hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547 || 2099aa070789SRoy Zang hw->mac_type == e1000_82541_rev_2 2100aa070789SRoy Zang || hw->mac_type == e1000_82547_rev_2) 2101aa070789SRoy Zang hw->phy_reset_disable = FALSE; 2102aa070789SRoy Zang 2103aa070789SRoy Zang return E1000_SUCCESS; 2104aa070789SRoy Zang } 2105aa070789SRoy Zang 2106aa070789SRoy Zang /***************************************************************************** 2107aa070789SRoy Zang * 2108aa070789SRoy Zang * This function sets the lplu state according to the active flag. When 2109aa070789SRoy Zang * activating lplu this function also disables smart speed and vise versa. 2110aa070789SRoy Zang * lplu will not be activated unless the device autonegotiation advertisment 2111aa070789SRoy Zang * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes. 2112aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 2113aa070789SRoy Zang * active - true to enable lplu false to disable lplu. 2114aa070789SRoy Zang * 2115aa070789SRoy Zang * returns: - E1000_ERR_PHY if fail to read/write the PHY 2116aa070789SRoy Zang * E1000_SUCCESS at any other case. 2117aa070789SRoy Zang * 2118aa070789SRoy Zang ****************************************************************************/ 2119aa070789SRoy Zang 2120aa070789SRoy Zang static int32_t 2121aa070789SRoy Zang e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active) 2122aa070789SRoy Zang { 2123aa070789SRoy Zang uint32_t phy_ctrl = 0; 2124aa070789SRoy Zang int32_t ret_val; 2125aa070789SRoy Zang uint16_t phy_data; 2126aa070789SRoy Zang DEBUGFUNC(); 2127aa070789SRoy Zang 2128aa070789SRoy Zang if (hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2 2129aa070789SRoy Zang && hw->phy_type != e1000_phy_igp_3) 2130aa070789SRoy Zang return E1000_SUCCESS; 2131aa070789SRoy Zang 2132aa070789SRoy Zang /* During driver activity LPLU should not be used or it will attain link 2133aa070789SRoy Zang * from the lowest speeds starting from 10Mbps. The capability is used 2134aa070789SRoy Zang * for Dx transitions and states */ 2135aa070789SRoy Zang if (hw->mac_type == e1000_82541_rev_2 2136aa070789SRoy Zang || hw->mac_type == e1000_82547_rev_2) { 2137aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, 2138aa070789SRoy Zang &phy_data); 2139aa070789SRoy Zang if (ret_val) 2140aa070789SRoy Zang return ret_val; 2141aa070789SRoy Zang } else if (hw->mac_type == e1000_ich8lan) { 2142aa070789SRoy Zang /* MAC writes into PHY register based on the state transition 2143aa070789SRoy Zang * and start auto-negotiation. SW driver can overwrite the 2144aa070789SRoy Zang * settings in CSR PHY power control E1000_PHY_CTRL register. */ 2145aa070789SRoy Zang phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); 2146aa070789SRoy Zang } else { 2147aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, 2148aa070789SRoy Zang &phy_data); 2149aa070789SRoy Zang if (ret_val) 2150aa070789SRoy Zang return ret_val; 2151aa070789SRoy Zang } 2152aa070789SRoy Zang 2153aa070789SRoy Zang if (!active) { 2154aa070789SRoy Zang if (hw->mac_type == e1000_82541_rev_2 || 2155aa070789SRoy Zang hw->mac_type == e1000_82547_rev_2) { 2156aa070789SRoy Zang phy_data &= ~IGP01E1000_GMII_FLEX_SPD; 2157aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, 2158aa070789SRoy Zang phy_data); 2159aa070789SRoy Zang if (ret_val) 2160aa070789SRoy Zang return ret_val; 2161aa070789SRoy Zang } else { 2162aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2163aa070789SRoy Zang phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU; 2164aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2165aa070789SRoy Zang } else { 2166aa070789SRoy Zang phy_data &= ~IGP02E1000_PM_D3_LPLU; 2167aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2168aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2169aa070789SRoy Zang if (ret_val) 2170aa070789SRoy Zang return ret_val; 2171aa070789SRoy Zang } 2172aa070789SRoy Zang } 2173aa070789SRoy Zang 2174aa070789SRoy Zang /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during 2175aa070789SRoy Zang * Dx states where the power conservation is most important. During 2176aa070789SRoy Zang * driver activity we should enable SmartSpeed, so performance is 2177aa070789SRoy Zang * maintained. */ 2178aa070789SRoy Zang if (hw->smart_speed == e1000_smart_speed_on) { 2179aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2180aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2181aa070789SRoy Zang if (ret_val) 2182aa070789SRoy Zang return ret_val; 2183aa070789SRoy Zang 2184aa070789SRoy Zang phy_data |= IGP01E1000_PSCFR_SMART_SPEED; 2185aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2186aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2187aa070789SRoy Zang if (ret_val) 2188aa070789SRoy Zang return ret_val; 2189aa070789SRoy Zang } else if (hw->smart_speed == e1000_smart_speed_off) { 2190aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2191aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2192aa070789SRoy Zang if (ret_val) 2193aa070789SRoy Zang return ret_val; 2194aa070789SRoy Zang 2195aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2196aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2197aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2198aa070789SRoy Zang if (ret_val) 2199aa070789SRoy Zang return ret_val; 2200aa070789SRoy Zang } 2201aa070789SRoy Zang 2202aa070789SRoy Zang } else if ((hw->autoneg_advertised == AUTONEG_ADVERTISE_SPEED_DEFAULT) 2203aa070789SRoy Zang || (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL) || 2204aa070789SRoy Zang (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) { 2205aa070789SRoy Zang 2206aa070789SRoy Zang if (hw->mac_type == e1000_82541_rev_2 || 2207aa070789SRoy Zang hw->mac_type == e1000_82547_rev_2) { 2208aa070789SRoy Zang phy_data |= IGP01E1000_GMII_FLEX_SPD; 2209aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2210aa070789SRoy Zang IGP01E1000_GMII_FIFO, phy_data); 2211aa070789SRoy Zang if (ret_val) 2212aa070789SRoy Zang return ret_val; 2213aa070789SRoy Zang } else { 2214aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2215aa070789SRoy Zang phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU; 2216aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2217aa070789SRoy Zang } else { 2218aa070789SRoy Zang phy_data |= IGP02E1000_PM_D3_LPLU; 2219aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2220aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2221aa070789SRoy Zang if (ret_val) 2222aa070789SRoy Zang return ret_val; 2223aa070789SRoy Zang } 2224aa070789SRoy Zang } 2225aa070789SRoy Zang 2226aa070789SRoy Zang /* When LPLU is enabled we should disable SmartSpeed */ 2227aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 2228aa070789SRoy Zang &phy_data); 2229aa070789SRoy Zang if (ret_val) 2230aa070789SRoy Zang return ret_val; 2231aa070789SRoy Zang 2232aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2233aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 2234aa070789SRoy Zang phy_data); 2235aa070789SRoy Zang if (ret_val) 2236aa070789SRoy Zang return ret_val; 2237aa070789SRoy Zang } 2238aa070789SRoy Zang return E1000_SUCCESS; 2239aa070789SRoy Zang } 2240aa070789SRoy Zang 2241aa070789SRoy Zang /***************************************************************************** 2242aa070789SRoy Zang * 2243aa070789SRoy Zang * This function sets the lplu d0 state according to the active flag. When 2244aa070789SRoy Zang * activating lplu this function also disables smart speed and vise versa. 2245aa070789SRoy Zang * lplu will not be activated unless the device autonegotiation advertisment 2246aa070789SRoy Zang * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes. 2247aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 2248aa070789SRoy Zang * active - true to enable lplu false to disable lplu. 2249aa070789SRoy Zang * 2250aa070789SRoy Zang * returns: - E1000_ERR_PHY if fail to read/write the PHY 2251aa070789SRoy Zang * E1000_SUCCESS at any other case. 2252aa070789SRoy Zang * 2253aa070789SRoy Zang ****************************************************************************/ 2254aa070789SRoy Zang 2255aa070789SRoy Zang static int32_t 2256aa070789SRoy Zang e1000_set_d0_lplu_state(struct e1000_hw *hw, boolean_t active) 2257aa070789SRoy Zang { 2258aa070789SRoy Zang uint32_t phy_ctrl = 0; 2259aa070789SRoy Zang int32_t ret_val; 2260aa070789SRoy Zang uint16_t phy_data; 2261aa070789SRoy Zang DEBUGFUNC(); 2262aa070789SRoy Zang 2263aa070789SRoy Zang if (hw->mac_type <= e1000_82547_rev_2) 2264aa070789SRoy Zang return E1000_SUCCESS; 2265aa070789SRoy Zang 2266aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2267aa070789SRoy Zang phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); 2268aa070789SRoy Zang } else { 2269aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, 2270aa070789SRoy Zang &phy_data); 2271aa070789SRoy Zang if (ret_val) 2272aa070789SRoy Zang return ret_val; 2273aa070789SRoy Zang } 2274aa070789SRoy Zang 2275aa070789SRoy Zang if (!active) { 2276aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2277aa070789SRoy Zang phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU; 2278aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2279aa070789SRoy Zang } else { 2280aa070789SRoy Zang phy_data &= ~IGP02E1000_PM_D0_LPLU; 2281aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2282aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2283aa070789SRoy Zang if (ret_val) 2284aa070789SRoy Zang return ret_val; 2285aa070789SRoy Zang } 2286aa070789SRoy Zang 2287aa070789SRoy Zang /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during 2288aa070789SRoy Zang * Dx states where the power conservation is most important. During 2289aa070789SRoy Zang * driver activity we should enable SmartSpeed, so performance is 2290aa070789SRoy Zang * maintained. */ 2291aa070789SRoy Zang if (hw->smart_speed == e1000_smart_speed_on) { 2292aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2293aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2294aa070789SRoy Zang if (ret_val) 2295aa070789SRoy Zang return ret_val; 2296aa070789SRoy Zang 2297aa070789SRoy Zang phy_data |= IGP01E1000_PSCFR_SMART_SPEED; 2298aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2299aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2300aa070789SRoy Zang if (ret_val) 2301aa070789SRoy Zang return ret_val; 2302aa070789SRoy Zang } else if (hw->smart_speed == e1000_smart_speed_off) { 2303aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2304aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2305aa070789SRoy Zang if (ret_val) 2306aa070789SRoy Zang return ret_val; 2307aa070789SRoy Zang 2308aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2309aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2310aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2311aa070789SRoy Zang if (ret_val) 2312aa070789SRoy Zang return ret_val; 2313aa070789SRoy Zang } 2314aa070789SRoy Zang 2315aa070789SRoy Zang 2316aa070789SRoy Zang } else { 2317aa070789SRoy Zang 2318aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2319aa070789SRoy Zang phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU; 2320aa070789SRoy Zang E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); 2321aa070789SRoy Zang } else { 2322aa070789SRoy Zang phy_data |= IGP02E1000_PM_D0_LPLU; 2323aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2324aa070789SRoy Zang IGP02E1000_PHY_POWER_MGMT, phy_data); 2325aa070789SRoy Zang if (ret_val) 2326aa070789SRoy Zang return ret_val; 2327aa070789SRoy Zang } 2328aa070789SRoy Zang 2329aa070789SRoy Zang /* When LPLU is enabled we should disable SmartSpeed */ 2330aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2331aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2332aa070789SRoy Zang if (ret_val) 2333aa070789SRoy Zang return ret_val; 2334aa070789SRoy Zang 2335aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2336aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2337aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2338aa070789SRoy Zang if (ret_val) 2339aa070789SRoy Zang return ret_val; 2340aa070789SRoy Zang 2341aa070789SRoy Zang } 2342aa070789SRoy Zang return E1000_SUCCESS; 2343aa070789SRoy Zang } 2344aa070789SRoy Zang 2345aa070789SRoy Zang /******************************************************************** 2346aa070789SRoy Zang * Copper link setup for e1000_phy_igp series. 2347aa070789SRoy Zang * 2348aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2349aa070789SRoy Zang *********************************************************************/ 2350aa070789SRoy Zang static int32_t 2351aa070789SRoy Zang e1000_copper_link_igp_setup(struct e1000_hw *hw) 2352aa070789SRoy Zang { 2353aa070789SRoy Zang uint32_t led_ctrl; 2354aa070789SRoy Zang int32_t ret_val; 2355aa070789SRoy Zang uint16_t phy_data; 2356aa070789SRoy Zang 2357f81ecb5dSTimur Tabi DEBUGFUNC(); 2358aa070789SRoy Zang 2359aa070789SRoy Zang if (hw->phy_reset_disable) 2360aa070789SRoy Zang return E1000_SUCCESS; 2361aa070789SRoy Zang 2362aa070789SRoy Zang ret_val = e1000_phy_reset(hw); 2363aa070789SRoy Zang if (ret_val) { 2364aa070789SRoy Zang DEBUGOUT("Error Resetting the PHY\n"); 2365aa070789SRoy Zang return ret_val; 2366aa070789SRoy Zang } 2367aa070789SRoy Zang 2368aa070789SRoy Zang /* Wait 15ms for MAC to configure PHY from eeprom settings */ 2369aa070789SRoy Zang mdelay(15); 2370aa070789SRoy Zang if (hw->mac_type != e1000_ich8lan) { 2371aa070789SRoy Zang /* Configure activity LED after PHY reset */ 2372aa070789SRoy Zang led_ctrl = E1000_READ_REG(hw, LEDCTL); 2373aa070789SRoy Zang led_ctrl &= IGP_ACTIVITY_LED_MASK; 2374aa070789SRoy Zang led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); 2375aa070789SRoy Zang E1000_WRITE_REG(hw, LEDCTL, led_ctrl); 2376aa070789SRoy Zang } 2377aa070789SRoy Zang 2378aa070789SRoy Zang /* The NVM settings will configure LPLU in D3 for IGP2 and IGP3 PHYs */ 2379aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp) { 2380aa070789SRoy Zang /* disable lplu d3 during driver init */ 2381aa070789SRoy Zang ret_val = e1000_set_d3_lplu_state(hw, FALSE); 2382aa070789SRoy Zang if (ret_val) { 2383aa070789SRoy Zang DEBUGOUT("Error Disabling LPLU D3\n"); 2384aa070789SRoy Zang return ret_val; 2385aa070789SRoy Zang } 2386aa070789SRoy Zang } 2387aa070789SRoy Zang 2388aa070789SRoy Zang /* disable lplu d0 during driver init */ 2389aa070789SRoy Zang ret_val = e1000_set_d0_lplu_state(hw, FALSE); 2390aa070789SRoy Zang if (ret_val) { 2391aa070789SRoy Zang DEBUGOUT("Error Disabling LPLU D0\n"); 2392aa070789SRoy Zang return ret_val; 2393aa070789SRoy Zang } 2394aa070789SRoy Zang /* Configure mdi-mdix settings */ 2395aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data); 2396aa070789SRoy Zang if (ret_val) 2397aa070789SRoy Zang return ret_val; 2398aa070789SRoy Zang 2399aa070789SRoy Zang if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { 2400aa070789SRoy Zang hw->dsp_config_state = e1000_dsp_config_disabled; 2401aa070789SRoy Zang /* Force MDI for earlier revs of the IGP PHY */ 2402aa070789SRoy Zang phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX 2403aa070789SRoy Zang | IGP01E1000_PSCR_FORCE_MDI_MDIX); 2404aa070789SRoy Zang hw->mdix = 1; 2405aa070789SRoy Zang 2406aa070789SRoy Zang } else { 2407aa070789SRoy Zang hw->dsp_config_state = e1000_dsp_config_enabled; 2408aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; 2409aa070789SRoy Zang 2410aa070789SRoy Zang switch (hw->mdix) { 2411aa070789SRoy Zang case 1: 2412aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; 2413aa070789SRoy Zang break; 2414aa070789SRoy Zang case 2: 2415aa070789SRoy Zang phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX; 2416aa070789SRoy Zang break; 2417aa070789SRoy Zang case 0: 2418aa070789SRoy Zang default: 2419aa070789SRoy Zang phy_data |= IGP01E1000_PSCR_AUTO_MDIX; 2420aa070789SRoy Zang break; 2421aa070789SRoy Zang } 2422aa070789SRoy Zang } 2423aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data); 2424aa070789SRoy Zang if (ret_val) 2425aa070789SRoy Zang return ret_val; 2426aa070789SRoy Zang 2427aa070789SRoy Zang /* set auto-master slave resolution settings */ 2428aa070789SRoy Zang if (hw->autoneg) { 2429aa070789SRoy Zang e1000_ms_type phy_ms_setting = hw->master_slave; 2430aa070789SRoy Zang 2431aa070789SRoy Zang if (hw->ffe_config_state == e1000_ffe_config_active) 2432aa070789SRoy Zang hw->ffe_config_state = e1000_ffe_config_enabled; 2433aa070789SRoy Zang 2434aa070789SRoy Zang if (hw->dsp_config_state == e1000_dsp_config_activated) 2435aa070789SRoy Zang hw->dsp_config_state = e1000_dsp_config_enabled; 2436aa070789SRoy Zang 2437aa070789SRoy Zang /* when autonegotiation advertisment is only 1000Mbps then we 2438aa070789SRoy Zang * should disable SmartSpeed and enable Auto MasterSlave 2439aa070789SRoy Zang * resolution as hardware default. */ 2440aa070789SRoy Zang if (hw->autoneg_advertised == ADVERTISE_1000_FULL) { 2441aa070789SRoy Zang /* Disable SmartSpeed */ 2442aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2443aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, &phy_data); 2444aa070789SRoy Zang if (ret_val) 2445aa070789SRoy Zang return ret_val; 2446aa070789SRoy Zang phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; 2447aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2448aa070789SRoy Zang IGP01E1000_PHY_PORT_CONFIG, phy_data); 2449aa070789SRoy Zang if (ret_val) 2450aa070789SRoy Zang return ret_val; 2451aa070789SRoy Zang /* Set auto Master/Slave resolution process */ 2452aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, 2453aa070789SRoy Zang &phy_data); 2454aa070789SRoy Zang if (ret_val) 2455aa070789SRoy Zang return ret_val; 2456aa070789SRoy Zang phy_data &= ~CR_1000T_MS_ENABLE; 2457aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, 2458aa070789SRoy Zang phy_data); 2459aa070789SRoy Zang if (ret_val) 2460aa070789SRoy Zang return ret_val; 2461aa070789SRoy Zang } 2462aa070789SRoy Zang 2463aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data); 2464aa070789SRoy Zang if (ret_val) 2465aa070789SRoy Zang return ret_val; 2466aa070789SRoy Zang 2467aa070789SRoy Zang /* load defaults for future use */ 2468aa070789SRoy Zang hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ? 2469aa070789SRoy Zang ((phy_data & CR_1000T_MS_VALUE) ? 2470aa070789SRoy Zang e1000_ms_force_master : 2471aa070789SRoy Zang e1000_ms_force_slave) : 2472aa070789SRoy Zang e1000_ms_auto; 2473aa070789SRoy Zang 2474aa070789SRoy Zang switch (phy_ms_setting) { 2475aa070789SRoy Zang case e1000_ms_force_master: 2476aa070789SRoy Zang phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); 2477aa070789SRoy Zang break; 2478aa070789SRoy Zang case e1000_ms_force_slave: 2479aa070789SRoy Zang phy_data |= CR_1000T_MS_ENABLE; 2480aa070789SRoy Zang phy_data &= ~(CR_1000T_MS_VALUE); 2481aa070789SRoy Zang break; 2482aa070789SRoy Zang case e1000_ms_auto: 2483aa070789SRoy Zang phy_data &= ~CR_1000T_MS_ENABLE; 2484aa070789SRoy Zang default: 2485aa070789SRoy Zang break; 2486aa070789SRoy Zang } 2487aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data); 2488aa070789SRoy Zang if (ret_val) 2489aa070789SRoy Zang return ret_val; 2490aa070789SRoy Zang } 2491aa070789SRoy Zang 2492aa070789SRoy Zang return E1000_SUCCESS; 2493aa070789SRoy Zang } 2494aa070789SRoy Zang 2495aa070789SRoy Zang /***************************************************************************** 2496aa070789SRoy Zang * This function checks the mode of the firmware. 2497aa070789SRoy Zang * 2498aa070789SRoy Zang * returns - TRUE when the mode is IAMT or FALSE. 2499aa070789SRoy Zang ****************************************************************************/ 2500aa070789SRoy Zang boolean_t 2501aa070789SRoy Zang e1000_check_mng_mode(struct e1000_hw *hw) 2502aa070789SRoy Zang { 2503aa070789SRoy Zang uint32_t fwsm; 2504aa070789SRoy Zang DEBUGFUNC(); 2505aa070789SRoy Zang 2506aa070789SRoy Zang fwsm = E1000_READ_REG(hw, FWSM); 2507aa070789SRoy Zang 2508aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 2509aa070789SRoy Zang if ((fwsm & E1000_FWSM_MODE_MASK) == 2510aa070789SRoy Zang (E1000_MNG_ICH_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) 2511aa070789SRoy Zang return TRUE; 2512aa070789SRoy Zang } else if ((fwsm & E1000_FWSM_MODE_MASK) == 2513aa070789SRoy Zang (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) 2514aa070789SRoy Zang return TRUE; 2515aa070789SRoy Zang 2516aa070789SRoy Zang return FALSE; 2517aa070789SRoy Zang } 2518aa070789SRoy Zang 2519aa070789SRoy Zang static int32_t 2520aa070789SRoy Zang e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data) 2521aa070789SRoy Zang { 2522987b43a1SKyle Moffett uint16_t swfw = E1000_SWFW_PHY0_SM; 2523aa070789SRoy Zang uint32_t reg_val; 2524aa070789SRoy Zang DEBUGFUNC(); 2525aa070789SRoy Zang 2526987b43a1SKyle Moffett if (e1000_is_second_port(hw)) 2527aa070789SRoy Zang swfw = E1000_SWFW_PHY1_SM; 2528987b43a1SKyle Moffett 2529aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, swfw)) 2530aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 2531aa070789SRoy Zang 2532aa070789SRoy Zang reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) 2533aa070789SRoy Zang & E1000_KUMCTRLSTA_OFFSET) | data; 2534aa070789SRoy Zang E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); 2535aa070789SRoy Zang udelay(2); 2536aa070789SRoy Zang 2537aa070789SRoy Zang return E1000_SUCCESS; 2538aa070789SRoy Zang } 2539aa070789SRoy Zang 2540aa070789SRoy Zang static int32_t 2541aa070789SRoy Zang e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data) 2542aa070789SRoy Zang { 2543987b43a1SKyle Moffett uint16_t swfw = E1000_SWFW_PHY0_SM; 2544aa070789SRoy Zang uint32_t reg_val; 2545aa070789SRoy Zang DEBUGFUNC(); 2546aa070789SRoy Zang 2547987b43a1SKyle Moffett if (e1000_is_second_port(hw)) 2548aa070789SRoy Zang swfw = E1000_SWFW_PHY1_SM; 2549987b43a1SKyle Moffett 2550aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, swfw)) 2551aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 2552aa070789SRoy Zang 2553aa070789SRoy Zang /* Write register address */ 2554aa070789SRoy Zang reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) & 2555aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET) | E1000_KUMCTRLSTA_REN; 2556aa070789SRoy Zang E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val); 2557aa070789SRoy Zang udelay(2); 2558aa070789SRoy Zang 2559aa070789SRoy Zang /* Read the data returned */ 2560aa070789SRoy Zang reg_val = E1000_READ_REG(hw, KUMCTRLSTA); 2561aa070789SRoy Zang *data = (uint16_t)reg_val; 2562aa070789SRoy Zang 2563aa070789SRoy Zang return E1000_SUCCESS; 2564aa070789SRoy Zang } 2565aa070789SRoy Zang 2566aa070789SRoy Zang /******************************************************************** 2567aa070789SRoy Zang * Copper link setup for e1000_phy_gg82563 series. 2568aa070789SRoy Zang * 2569aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2570aa070789SRoy Zang *********************************************************************/ 2571aa070789SRoy Zang static int32_t 2572aa070789SRoy Zang e1000_copper_link_ggp_setup(struct e1000_hw *hw) 2573aa070789SRoy Zang { 2574aa070789SRoy Zang int32_t ret_val; 2575aa070789SRoy Zang uint16_t phy_data; 2576aa070789SRoy Zang uint32_t reg_data; 2577aa070789SRoy Zang 2578aa070789SRoy Zang DEBUGFUNC(); 2579aa070789SRoy Zang 2580aa070789SRoy Zang if (!hw->phy_reset_disable) { 2581aa070789SRoy Zang /* Enable CRS on TX for half-duplex operation. */ 2582aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2583aa070789SRoy Zang GG82563_PHY_MAC_SPEC_CTRL, &phy_data); 2584aa070789SRoy Zang if (ret_val) 2585aa070789SRoy Zang return ret_val; 2586aa070789SRoy Zang 2587aa070789SRoy Zang phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX; 2588aa070789SRoy Zang /* Use 25MHz for both link down and 1000BASE-T for Tx clock */ 2589aa070789SRoy Zang phy_data |= GG82563_MSCR_TX_CLK_1000MBPS_25MHZ; 2590aa070789SRoy Zang 2591aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2592aa070789SRoy Zang GG82563_PHY_MAC_SPEC_CTRL, phy_data); 2593aa070789SRoy Zang if (ret_val) 2594aa070789SRoy Zang return ret_val; 2595aa070789SRoy Zang 2596aa070789SRoy Zang /* Options: 2597aa070789SRoy Zang * MDI/MDI-X = 0 (default) 2598aa070789SRoy Zang * 0 - Auto for all speeds 2599aa070789SRoy Zang * 1 - MDI mode 2600aa070789SRoy Zang * 2 - MDI-X mode 2601aa070789SRoy Zang * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) 2602aa070789SRoy Zang */ 2603aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2604aa070789SRoy Zang GG82563_PHY_SPEC_CTRL, &phy_data); 2605aa070789SRoy Zang if (ret_val) 2606aa070789SRoy Zang return ret_val; 2607aa070789SRoy Zang 2608aa070789SRoy Zang phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK; 2609aa070789SRoy Zang 2610aa070789SRoy Zang switch (hw->mdix) { 2611aa070789SRoy Zang case 1: 2612aa070789SRoy Zang phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDI; 2613aa070789SRoy Zang break; 2614aa070789SRoy Zang case 2: 2615aa070789SRoy Zang phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDIX; 2616aa070789SRoy Zang break; 2617aa070789SRoy Zang case 0: 2618aa070789SRoy Zang default: 2619aa070789SRoy Zang phy_data |= GG82563_PSCR_CROSSOVER_MODE_AUTO; 2620aa070789SRoy Zang break; 2621aa070789SRoy Zang } 2622aa070789SRoy Zang 2623aa070789SRoy Zang /* Options: 2624aa070789SRoy Zang * disable_polarity_correction = 0 (default) 2625aa070789SRoy Zang * Automatic Correction for Reversed Cable Polarity 2626aa070789SRoy Zang * 0 - Disabled 2627aa070789SRoy Zang * 1 - Enabled 2628aa070789SRoy Zang */ 2629aa070789SRoy Zang phy_data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE; 2630aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2631aa070789SRoy Zang GG82563_PHY_SPEC_CTRL, phy_data); 2632aa070789SRoy Zang 2633aa070789SRoy Zang if (ret_val) 2634aa070789SRoy Zang return ret_val; 2635aa070789SRoy Zang 2636aa070789SRoy Zang /* SW Reset the PHY so all changes take effect */ 2637aa070789SRoy Zang ret_val = e1000_phy_reset(hw); 2638aa070789SRoy Zang if (ret_val) { 2639aa070789SRoy Zang DEBUGOUT("Error Resetting the PHY\n"); 2640aa070789SRoy Zang return ret_val; 2641aa070789SRoy Zang } 2642aa070789SRoy Zang } /* phy_reset_disable */ 2643aa070789SRoy Zang 2644aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 2645aa070789SRoy Zang /* Bypass RX and TX FIFO's */ 2646aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2647aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL, 2648aa070789SRoy Zang E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 2649aa070789SRoy Zang | E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS); 2650aa070789SRoy Zang if (ret_val) 2651aa070789SRoy Zang return ret_val; 2652aa070789SRoy Zang 2653aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2654aa070789SRoy Zang GG82563_PHY_SPEC_CTRL_2, &phy_data); 2655aa070789SRoy Zang if (ret_val) 2656aa070789SRoy Zang return ret_val; 2657aa070789SRoy Zang 2658aa070789SRoy Zang phy_data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG; 2659aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2660aa070789SRoy Zang GG82563_PHY_SPEC_CTRL_2, phy_data); 2661aa070789SRoy Zang 2662aa070789SRoy Zang if (ret_val) 2663aa070789SRoy Zang return ret_val; 2664aa070789SRoy Zang 2665aa070789SRoy Zang reg_data = E1000_READ_REG(hw, CTRL_EXT); 2666aa070789SRoy Zang reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK); 2667aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, reg_data); 2668aa070789SRoy Zang 2669aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2670aa070789SRoy Zang GG82563_PHY_PWR_MGMT_CTRL, &phy_data); 2671aa070789SRoy Zang if (ret_val) 2672aa070789SRoy Zang return ret_val; 2673aa070789SRoy Zang 2674aa070789SRoy Zang /* Do not init these registers when the HW is in IAMT mode, since the 2675aa070789SRoy Zang * firmware will have already initialized them. We only initialize 2676aa070789SRoy Zang * them if the HW is not in IAMT mode. 2677aa070789SRoy Zang */ 2678aa070789SRoy Zang if (e1000_check_mng_mode(hw) == FALSE) { 2679aa070789SRoy Zang /* Enable Electrical Idle on the PHY */ 2680aa070789SRoy Zang phy_data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE; 2681aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2682aa070789SRoy Zang GG82563_PHY_PWR_MGMT_CTRL, phy_data); 2683aa070789SRoy Zang if (ret_val) 2684aa070789SRoy Zang return ret_val; 2685aa070789SRoy Zang 2686aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2687aa070789SRoy Zang GG82563_PHY_KMRN_MODE_CTRL, &phy_data); 2688aa070789SRoy Zang if (ret_val) 2689aa070789SRoy Zang return ret_val; 2690aa070789SRoy Zang 2691aa070789SRoy Zang phy_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; 2692aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2693aa070789SRoy Zang GG82563_PHY_KMRN_MODE_CTRL, phy_data); 2694aa070789SRoy Zang 2695aa070789SRoy Zang if (ret_val) 2696aa070789SRoy Zang return ret_val; 2697aa070789SRoy Zang } 2698aa070789SRoy Zang 2699aa070789SRoy Zang /* Workaround: Disable padding in Kumeran interface in the MAC 2700aa070789SRoy Zang * and in the PHY to avoid CRC errors. 2701aa070789SRoy Zang */ 2702aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2703aa070789SRoy Zang GG82563_PHY_INBAND_CTRL, &phy_data); 2704aa070789SRoy Zang if (ret_val) 2705aa070789SRoy Zang return ret_val; 2706aa070789SRoy Zang phy_data |= GG82563_ICR_DIS_PADDING; 2707aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2708aa070789SRoy Zang GG82563_PHY_INBAND_CTRL, phy_data); 2709aa070789SRoy Zang if (ret_val) 2710aa070789SRoy Zang return ret_val; 2711aa070789SRoy Zang } 2712aa070789SRoy Zang return E1000_SUCCESS; 2713aa070789SRoy Zang } 2714aa070789SRoy Zang 2715aa070789SRoy Zang /******************************************************************** 2716aa070789SRoy Zang * Copper link setup for e1000_phy_m88 series. 2717aa070789SRoy Zang * 2718aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2719aa070789SRoy Zang *********************************************************************/ 2720aa070789SRoy Zang static int32_t 2721aa070789SRoy Zang e1000_copper_link_mgp_setup(struct e1000_hw *hw) 2722aa070789SRoy Zang { 2723aa070789SRoy Zang int32_t ret_val; 2724aa070789SRoy Zang uint16_t phy_data; 2725aa070789SRoy Zang 2726aa070789SRoy Zang DEBUGFUNC(); 2727aa070789SRoy Zang 2728aa070789SRoy Zang if (hw->phy_reset_disable) 2729aa070789SRoy Zang return E1000_SUCCESS; 2730aa070789SRoy Zang 2731aa070789SRoy Zang /* Enable CRS on TX. This must be set for half-duplex operation. */ 2732aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); 2733aa070789SRoy Zang if (ret_val) 2734aa070789SRoy Zang return ret_val; 2735aa070789SRoy Zang 27362439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; 27372439e4bfSJean-Christophe PLAGNIOL-VILLARD 27382439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Options: 27392439e4bfSJean-Christophe PLAGNIOL-VILLARD * MDI/MDI-X = 0 (default) 27402439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 - Auto for all speeds 27412439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 - MDI mode 27422439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2 - MDI-X mode 27432439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) 27442439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 27452439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; 2746aa070789SRoy Zang 27472439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->mdix) { 27482439e4bfSJean-Christophe PLAGNIOL-VILLARD case 1: 27492439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE; 27502439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27512439e4bfSJean-Christophe PLAGNIOL-VILLARD case 2: 27522439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE; 27532439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27542439e4bfSJean-Christophe PLAGNIOL-VILLARD case 3: 27552439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_AUTO_X_1000T; 27562439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27572439e4bfSJean-Christophe PLAGNIOL-VILLARD case 0: 27582439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 27592439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_PSCR_AUTO_X_MODE; 27602439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 27612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 27622439e4bfSJean-Christophe PLAGNIOL-VILLARD 27632439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Options: 27642439e4bfSJean-Christophe PLAGNIOL-VILLARD * disable_polarity_correction = 0 (default) 27652439e4bfSJean-Christophe PLAGNIOL-VILLARD * Automatic Correction for Reversed Cable Polarity 27662439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 - Disabled 27672439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 - Enabled 27682439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 27692439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; 2770aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); 2771aa070789SRoy Zang if (ret_val) 2772aa070789SRoy Zang return ret_val; 27732439e4bfSJean-Christophe PLAGNIOL-VILLARD 2774aa070789SRoy Zang if (hw->phy_revision < M88E1011_I_REV_4) { 27752439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Force TX_CLK in the Extended PHY Specific Control Register 27762439e4bfSJean-Christophe PLAGNIOL-VILLARD * to 25MHz clock. 27772439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2778aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 2779aa070789SRoy Zang M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); 2780aa070789SRoy Zang if (ret_val) 2781aa070789SRoy Zang return ret_val; 2782aa070789SRoy Zang 27832439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= M88E1000_EPSCR_TX_CLK_25; 2784aa070789SRoy Zang 2785aa070789SRoy Zang if ((hw->phy_revision == E1000_REVISION_2) && 2786aa070789SRoy Zang (hw->phy_id == M88E1111_I_PHY_ID)) { 2787aa070789SRoy Zang /* Vidalia Phy, set the downshift counter to 5x */ 2788aa070789SRoy Zang phy_data &= ~(M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK); 2789aa070789SRoy Zang phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X; 2790aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2791aa070789SRoy Zang M88E1000_EXT_PHY_SPEC_CTRL, phy_data); 2792aa070789SRoy Zang if (ret_val) 2793aa070789SRoy Zang return ret_val; 2794aa070789SRoy Zang } else { 27952439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Configure Master and Slave downshift values */ 2796aa070789SRoy Zang phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK 2797aa070789SRoy Zang | M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); 2798aa070789SRoy Zang phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X 2799aa070789SRoy Zang | M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); 2800aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, 2801aa070789SRoy Zang M88E1000_EXT_PHY_SPEC_CTRL, phy_data); 2802aa070789SRoy Zang if (ret_val) 2803aa070789SRoy Zang return ret_val; 2804aa070789SRoy Zang } 28052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 28062439e4bfSJean-Christophe PLAGNIOL-VILLARD 28072439e4bfSJean-Christophe PLAGNIOL-VILLARD /* SW Reset the PHY so all changes take effect */ 28082439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_phy_reset(hw); 2809aa070789SRoy Zang if (ret_val) { 28102439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error Resetting the PHY\n"); 28112439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 28122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 28132439e4bfSJean-Christophe PLAGNIOL-VILLARD 2814aa070789SRoy Zang return E1000_SUCCESS; 2815aa070789SRoy Zang } 28162439e4bfSJean-Christophe PLAGNIOL-VILLARD 2817aa070789SRoy Zang /******************************************************************** 2818aa070789SRoy Zang * Setup auto-negotiation and flow control advertisements, 2819aa070789SRoy Zang * and then perform auto-negotiation. 2820aa070789SRoy Zang * 2821aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2822aa070789SRoy Zang *********************************************************************/ 2823aa070789SRoy Zang static int32_t 2824aa070789SRoy Zang e1000_copper_link_autoneg(struct e1000_hw *hw) 2825aa070789SRoy Zang { 2826aa070789SRoy Zang int32_t ret_val; 2827aa070789SRoy Zang uint16_t phy_data; 2828aa070789SRoy Zang 2829aa070789SRoy Zang DEBUGFUNC(); 2830aa070789SRoy Zang 28312439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Perform some bounds checking on the hw->autoneg_advertised 28322439e4bfSJean-Christophe PLAGNIOL-VILLARD * parameter. If this variable is zero, then set it to the default. 28332439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 28342439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT; 28352439e4bfSJean-Christophe PLAGNIOL-VILLARD 28362439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If autoneg_advertised is zero, we assume it was not defaulted 28372439e4bfSJean-Christophe PLAGNIOL-VILLARD * by the calling code so we set to advertise full capability. 28382439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 28392439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised == 0) 28402439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; 28412439e4bfSJean-Christophe PLAGNIOL-VILLARD 2842aa070789SRoy Zang /* IFE phy only supports 10/100 */ 2843aa070789SRoy Zang if (hw->phy_type == e1000_phy_ife) 2844aa070789SRoy Zang hw->autoneg_advertised &= AUTONEG_ADVERTISE_10_100_ALL; 2845aa070789SRoy Zang 28462439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); 28472439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_phy_setup_autoneg(hw); 2848aa070789SRoy Zang if (ret_val) { 28492439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error Setting up Auto-Negotiation\n"); 28502439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 28512439e4bfSJean-Christophe PLAGNIOL-VILLARD } 28522439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Restarting Auto-Neg\n"); 28532439e4bfSJean-Christophe PLAGNIOL-VILLARD 28542439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Restart auto-negotiation by setting the Auto Neg Enable bit and 28552439e4bfSJean-Christophe PLAGNIOL-VILLARD * the Auto Neg Restart bit in the PHY control register. 28562439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2857aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data); 2858aa070789SRoy Zang if (ret_val) 2859aa070789SRoy Zang return ret_val; 2860aa070789SRoy Zang 28612439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); 2862aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data); 2863aa070789SRoy Zang if (ret_val) 2864aa070789SRoy Zang return ret_val; 2865aa070789SRoy Zang 28662439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Does the user want to wait for Auto-Neg to complete here, or 28672439e4bfSJean-Christophe PLAGNIOL-VILLARD * check at a later time (for example, callback routine). 28682439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 28692439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we do not wait for autonegtation to complete I 28702439e4bfSJean-Christophe PLAGNIOL-VILLARD * do not see a valid link status. 2871aa070789SRoy Zang * wait_autoneg_complete = 1 . 28722439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 2873aa070789SRoy Zang if (hw->wait_autoneg_complete) { 28742439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_wait_autoneg(hw); 2875aa070789SRoy Zang if (ret_val) { 2876aa070789SRoy Zang DEBUGOUT("Error while waiting for autoneg" 2877aa070789SRoy Zang "to complete\n"); 28782439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 28792439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2880aa070789SRoy Zang } 28812439e4bfSJean-Christophe PLAGNIOL-VILLARD 2882aa070789SRoy Zang hw->get_link_status = TRUE; 2883aa070789SRoy Zang 2884aa070789SRoy Zang return E1000_SUCCESS; 28852439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2886aa070789SRoy Zang 2887aa070789SRoy Zang /****************************************************************************** 2888aa070789SRoy Zang * Config the MAC and the PHY after link is up. 28892439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1) Set up the MAC to the current PHY speed/duplex 28902439e4bfSJean-Christophe PLAGNIOL-VILLARD * if we are on 82543. If we 28912439e4bfSJean-Christophe PLAGNIOL-VILLARD * are on newer silicon, we only need to configure 28922439e4bfSJean-Christophe PLAGNIOL-VILLARD * collision distance in the Transmit Control Register. 28932439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2) Set up flow control on the MAC to that established with 28942439e4bfSJean-Christophe PLAGNIOL-VILLARD * the link partner. 2895aa070789SRoy Zang * 3) Config DSP to improve Gigabit link quality for some PHY revisions. 2896aa070789SRoy Zang * 2897aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2898aa070789SRoy Zang ******************************************************************************/ 2899aa070789SRoy Zang static int32_t 2900aa070789SRoy Zang e1000_copper_link_postconfig(struct e1000_hw *hw) 2901aa070789SRoy Zang { 2902aa070789SRoy Zang int32_t ret_val; 2903aa070789SRoy Zang DEBUGFUNC(); 2904aa070789SRoy Zang 29052439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82544) { 29062439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 29072439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 29082439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_mac_to_phy(hw); 2909aa070789SRoy Zang if (ret_val) { 2910aa070789SRoy Zang DEBUGOUT("Error configuring MAC to PHY settings\n"); 29112439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 29122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 29132439e4bfSJean-Christophe PLAGNIOL-VILLARD } 29142439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_fc_after_link_up(hw); 2915aa070789SRoy Zang if (ret_val) { 29162439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error Configuring Flow Control\n"); 29172439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 29182439e4bfSJean-Christophe PLAGNIOL-VILLARD } 2919aa070789SRoy Zang return E1000_SUCCESS; 2920aa070789SRoy Zang } 2921aa070789SRoy Zang 2922aa070789SRoy Zang /****************************************************************************** 2923aa070789SRoy Zang * Detects which PHY is present and setup the speed and duplex 2924aa070789SRoy Zang * 2925aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 2926aa070789SRoy Zang ******************************************************************************/ 2927aa070789SRoy Zang static int 2928aa070789SRoy Zang e1000_setup_copper_link(struct eth_device *nic) 2929aa070789SRoy Zang { 2930aa070789SRoy Zang struct e1000_hw *hw = nic->priv; 2931aa070789SRoy Zang int32_t ret_val; 2932aa070789SRoy Zang uint16_t i; 2933aa070789SRoy Zang uint16_t phy_data; 2934aa070789SRoy Zang uint16_t reg_data; 2935aa070789SRoy Zang 2936aa070789SRoy Zang DEBUGFUNC(); 2937aa070789SRoy Zang 2938aa070789SRoy Zang switch (hw->mac_type) { 2939aa070789SRoy Zang case e1000_80003es2lan: 2940aa070789SRoy Zang case e1000_ich8lan: 2941aa070789SRoy Zang /* Set the mac to wait the maximum time between each 2942aa070789SRoy Zang * iteration and increase the max iterations when 2943aa070789SRoy Zang * polling the phy; this fixes erroneous timeouts at 10Mbps. */ 2944aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2945aa070789SRoy Zang GG82563_REG(0x34, 4), 0xFFFF); 2946aa070789SRoy Zang if (ret_val) 2947aa070789SRoy Zang return ret_val; 2948aa070789SRoy Zang ret_val = e1000_read_kmrn_reg(hw, 2949aa070789SRoy Zang GG82563_REG(0x34, 9), ®_data); 2950aa070789SRoy Zang if (ret_val) 2951aa070789SRoy Zang return ret_val; 2952aa070789SRoy Zang reg_data |= 0x3F; 2953aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2954aa070789SRoy Zang GG82563_REG(0x34, 9), reg_data); 2955aa070789SRoy Zang if (ret_val) 2956aa070789SRoy Zang return ret_val; 2957aa070789SRoy Zang default: 2958aa070789SRoy Zang break; 2959aa070789SRoy Zang } 2960aa070789SRoy Zang 2961aa070789SRoy Zang /* Check if it is a valid PHY and set PHY mode if necessary. */ 2962aa070789SRoy Zang ret_val = e1000_copper_link_preconfig(hw); 2963aa070789SRoy Zang if (ret_val) 2964aa070789SRoy Zang return ret_val; 2965aa070789SRoy Zang switch (hw->mac_type) { 2966aa070789SRoy Zang case e1000_80003es2lan: 2967aa070789SRoy Zang /* Kumeran registers are written-only */ 2968aa070789SRoy Zang reg_data = 2969aa070789SRoy Zang E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT; 2970aa070789SRoy Zang reg_data |= E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING; 2971aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 2972aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_INB_CTRL, reg_data); 2973aa070789SRoy Zang if (ret_val) 2974aa070789SRoy Zang return ret_val; 2975aa070789SRoy Zang break; 2976aa070789SRoy Zang default: 2977aa070789SRoy Zang break; 2978aa070789SRoy Zang } 2979aa070789SRoy Zang 2980aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp || 2981aa070789SRoy Zang hw->phy_type == e1000_phy_igp_3 || 2982aa070789SRoy Zang hw->phy_type == e1000_phy_igp_2) { 2983aa070789SRoy Zang ret_val = e1000_copper_link_igp_setup(hw); 2984aa070789SRoy Zang if (ret_val) 2985aa070789SRoy Zang return ret_val; 2986aa070789SRoy Zang } else if (hw->phy_type == e1000_phy_m88) { 2987aa070789SRoy Zang ret_val = e1000_copper_link_mgp_setup(hw); 2988aa070789SRoy Zang if (ret_val) 2989aa070789SRoy Zang return ret_val; 2990aa070789SRoy Zang } else if (hw->phy_type == e1000_phy_gg82563) { 2991aa070789SRoy Zang ret_val = e1000_copper_link_ggp_setup(hw); 2992aa070789SRoy Zang if (ret_val) 2993aa070789SRoy Zang return ret_val; 2994aa070789SRoy Zang } 2995aa070789SRoy Zang 2996aa070789SRoy Zang /* always auto */ 2997aa070789SRoy Zang /* Setup autoneg and flow control advertisement 2998aa070789SRoy Zang * and perform autonegotiation */ 2999aa070789SRoy Zang ret_val = e1000_copper_link_autoneg(hw); 3000aa070789SRoy Zang if (ret_val) 3001aa070789SRoy Zang return ret_val; 3002aa070789SRoy Zang 3003aa070789SRoy Zang /* Check link status. Wait up to 100 microseconds for link to become 3004aa070789SRoy Zang * valid. 3005aa070789SRoy Zang */ 3006aa070789SRoy Zang for (i = 0; i < 10; i++) { 3007aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data); 3008aa070789SRoy Zang if (ret_val) 3009aa070789SRoy Zang return ret_val; 3010aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data); 3011aa070789SRoy Zang if (ret_val) 3012aa070789SRoy Zang return ret_val; 3013aa070789SRoy Zang 3014aa070789SRoy Zang if (phy_data & MII_SR_LINK_STATUS) { 3015aa070789SRoy Zang /* Config the MAC and PHY after link is up */ 3016aa070789SRoy Zang ret_val = e1000_copper_link_postconfig(hw); 3017aa070789SRoy Zang if (ret_val) 3018aa070789SRoy Zang return ret_val; 3019aa070789SRoy Zang 30202439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Valid link established!!!\n"); 3021aa070789SRoy Zang return E1000_SUCCESS; 30222439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30232439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 30242439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30252439e4bfSJean-Christophe PLAGNIOL-VILLARD 30262439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Unable to establish link!!!\n"); 3027aa070789SRoy Zang return E1000_SUCCESS; 30282439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30292439e4bfSJean-Christophe PLAGNIOL-VILLARD 30302439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 30312439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configures PHY autoneg and flow control advertisement settings 30322439e4bfSJean-Christophe PLAGNIOL-VILLARD * 30332439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 30342439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 3035aa070789SRoy Zang int32_t 30362439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_phy_setup_autoneg(struct e1000_hw *hw) 30372439e4bfSJean-Christophe PLAGNIOL-VILLARD { 3038aa070789SRoy Zang int32_t ret_val; 30392439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_autoneg_adv_reg; 30402439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_1000t_ctrl_reg; 30412439e4bfSJean-Christophe PLAGNIOL-VILLARD 30422439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 30432439e4bfSJean-Christophe PLAGNIOL-VILLARD 30442439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII Auto-Neg Advertisement Register (Address 4). */ 3045aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg); 3046aa070789SRoy Zang if (ret_val) 3047aa070789SRoy Zang return ret_val; 30482439e4bfSJean-Christophe PLAGNIOL-VILLARD 3049aa070789SRoy Zang if (hw->phy_type != e1000_phy_ife) { 30502439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII 1000Base-T Control Register (Address 9). */ 3051aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, 3052aa070789SRoy Zang &mii_1000t_ctrl_reg); 3053aa070789SRoy Zang if (ret_val) 3054aa070789SRoy Zang return ret_val; 3055aa070789SRoy Zang } else 3056aa070789SRoy Zang mii_1000t_ctrl_reg = 0; 30572439e4bfSJean-Christophe PLAGNIOL-VILLARD 30582439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Need to parse both autoneg_advertised and fc and set up 30592439e4bfSJean-Christophe PLAGNIOL-VILLARD * the appropriate PHY registers. First we will parse for 30602439e4bfSJean-Christophe PLAGNIOL-VILLARD * autoneg_advertised software override. Since we can advertise 30612439e4bfSJean-Christophe PLAGNIOL-VILLARD * a plethora of combinations, we need to check each bit 30622439e4bfSJean-Christophe PLAGNIOL-VILLARD * individually. 30632439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 30642439e4bfSJean-Christophe PLAGNIOL-VILLARD 30652439e4bfSJean-Christophe PLAGNIOL-VILLARD /* First we clear all the 10/100 mb speed bits in the Auto-Neg 30662439e4bfSJean-Christophe PLAGNIOL-VILLARD * Advertisement Register (Address 4) and the 1000 mb speed bits in 30672439e4bfSJean-Christophe PLAGNIOL-VILLARD * the 1000Base-T Control Register (Address 9). 30682439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 30692439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg &= ~REG4_SPEED_MASK; 30702439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_1000t_ctrl_reg &= ~REG9_SPEED_MASK; 30712439e4bfSJean-Christophe PLAGNIOL-VILLARD 30722439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("autoneg_advertised %x\n", hw->autoneg_advertised); 30732439e4bfSJean-Christophe PLAGNIOL-VILLARD 30742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 10 Mb Half Duplex? */ 30752439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_10_HALF) { 30762439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 10mb Half duplex\n"); 30772439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS; 30782439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30792439e4bfSJean-Christophe PLAGNIOL-VILLARD 30802439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 10 Mb Full Duplex? */ 30812439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_10_FULL) { 30822439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 10mb Full duplex\n"); 30832439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS; 30842439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30852439e4bfSJean-Christophe PLAGNIOL-VILLARD 30862439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 100 Mb Half Duplex? */ 30872439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_100_HALF) { 30882439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 100mb Half duplex\n"); 30892439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS; 30902439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30912439e4bfSJean-Christophe PLAGNIOL-VILLARD 30922439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 100 Mb Full Duplex? */ 30932439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_100_FULL) { 30942439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 100mb Full duplex\n"); 30952439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS; 30962439e4bfSJean-Christophe PLAGNIOL-VILLARD } 30972439e4bfSJean-Christophe PLAGNIOL-VILLARD 30982439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We do not allow the Phy to advertise 1000 Mb Half Duplex */ 30992439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_1000_HALF) { 31002439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 31012439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Advertise 1000mb Half duplex requested, request denied!\n"); 31022439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31032439e4bfSJean-Christophe PLAGNIOL-VILLARD 31042439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Do we want to advertise 1000 Mb Full Duplex? */ 31052439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_advertised & ADVERTISE_1000_FULL) { 31062439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Advertise 1000mb Full duplex\n"); 31072439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS; 31082439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31092439e4bfSJean-Christophe PLAGNIOL-VILLARD 31102439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for a software override of the flow control settings, and 31112439e4bfSJean-Christophe PLAGNIOL-VILLARD * setup the PHY advertisement registers accordingly. If 31122439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation is enabled, then software will have to set the 31132439e4bfSJean-Christophe PLAGNIOL-VILLARD * "PAUSE" bits to the correct value in the Auto-Negotiation 31142439e4bfSJean-Christophe PLAGNIOL-VILLARD * Advertisement Register (PHY_AUTONEG_ADV) and re-start auto-negotiation. 31152439e4bfSJean-Christophe PLAGNIOL-VILLARD * 31162439e4bfSJean-Christophe PLAGNIOL-VILLARD * The possible values of the "fc" parameter are: 31172439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0: Flow control is completely disabled 31182439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1: Rx flow control is enabled (we can receive pause frames 31192439e4bfSJean-Christophe PLAGNIOL-VILLARD * but not send pause frames). 31202439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2: Tx flow control is enabled (we can send pause frames 31212439e4bfSJean-Christophe PLAGNIOL-VILLARD * but we do not support receiving pause frames). 31222439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3: Both Rx and TX flow control (symmetric) are enabled. 31232439e4bfSJean-Christophe PLAGNIOL-VILLARD * other: No software override. The flow control configuration 31242439e4bfSJean-Christophe PLAGNIOL-VILLARD * in the EEPROM is used. 31252439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31262439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->fc) { 31272439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_none: /* 0 */ 31282439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control (RX & TX) is completely disabled by a 31292439e4bfSJean-Christophe PLAGNIOL-VILLARD * software over-ride. 31302439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31312439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); 31322439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31332439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_rx_pause: /* 1 */ 31342439e4bfSJean-Christophe PLAGNIOL-VILLARD /* RX Flow control is enabled, and TX Flow control is 31352439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabled, by a software over-ride. 31362439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31372439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Since there really isn't a way to advertise that we are 31382439e4bfSJean-Christophe PLAGNIOL-VILLARD * capable of RX Pause ONLY, we will advertise that we 31392439e4bfSJean-Christophe PLAGNIOL-VILLARD * support both symmetric and asymmetric RX PAUSE. Later 31402439e4bfSJean-Christophe PLAGNIOL-VILLARD * (in e1000_config_fc_after_link_up) we will disable the 31412439e4bfSJean-Christophe PLAGNIOL-VILLARD *hw's ability to send PAUSE frames. 31422439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31432439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); 31442439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31452439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_tx_pause: /* 2 */ 31462439e4bfSJean-Christophe PLAGNIOL-VILLARD /* TX Flow control is enabled, and RX Flow control is 31472439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabled, by a software over-ride. 31482439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31492439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR; 31502439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg &= ~NWAY_AR_PAUSE; 31512439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31522439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_full: /* 3 */ 31532439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Flow control (both RX and TX) is enabled by a software 31542439e4bfSJean-Christophe PLAGNIOL-VILLARD * over-ride. 31552439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 31562439e4bfSJean-Christophe PLAGNIOL-VILLARD mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE); 31572439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 31582439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 31592439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow control param set incorrectly\n"); 31602439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 31612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31622439e4bfSJean-Christophe PLAGNIOL-VILLARD 3163aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg); 3164aa070789SRoy Zang if (ret_val) 3165aa070789SRoy Zang return ret_val; 31662439e4bfSJean-Christophe PLAGNIOL-VILLARD 31672439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); 31682439e4bfSJean-Christophe PLAGNIOL-VILLARD 3169aa070789SRoy Zang if (hw->phy_type != e1000_phy_ife) { 3170aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, 3171aa070789SRoy Zang mii_1000t_ctrl_reg); 3172aa070789SRoy Zang if (ret_val) 3173aa070789SRoy Zang return ret_val; 31742439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3175aa070789SRoy Zang 3176aa070789SRoy Zang return E1000_SUCCESS; 31772439e4bfSJean-Christophe PLAGNIOL-VILLARD } 31782439e4bfSJean-Christophe PLAGNIOL-VILLARD 31792439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 31802439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets the collision distance in the Transmit Control register 31812439e4bfSJean-Christophe PLAGNIOL-VILLARD * 31822439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 31832439e4bfSJean-Christophe PLAGNIOL-VILLARD * 31842439e4bfSJean-Christophe PLAGNIOL-VILLARD * Link should have been established previously. Reads the speed and duplex 31852439e4bfSJean-Christophe PLAGNIOL-VILLARD * information from the Device Status register. 31862439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 31872439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 31882439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(struct e1000_hw *hw) 31892439e4bfSJean-Christophe PLAGNIOL-VILLARD { 3190aa070789SRoy Zang uint32_t tctl, coll_dist; 3191aa070789SRoy Zang 3192aa070789SRoy Zang DEBUGFUNC(); 3193aa070789SRoy Zang 3194aa070789SRoy Zang if (hw->mac_type < e1000_82543) 3195aa070789SRoy Zang coll_dist = E1000_COLLISION_DISTANCE_82542; 3196aa070789SRoy Zang else 3197aa070789SRoy Zang coll_dist = E1000_COLLISION_DISTANCE; 31982439e4bfSJean-Christophe PLAGNIOL-VILLARD 31992439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl = E1000_READ_REG(hw, TCTL); 32002439e4bfSJean-Christophe PLAGNIOL-VILLARD 32012439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl &= ~E1000_TCTL_COLD; 3202aa070789SRoy Zang tctl |= coll_dist << E1000_COLD_SHIFT; 32032439e4bfSJean-Christophe PLAGNIOL-VILLARD 32042439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TCTL, tctl); 32052439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 32062439e4bfSJean-Christophe PLAGNIOL-VILLARD } 32072439e4bfSJean-Christophe PLAGNIOL-VILLARD 32082439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 32092439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets MAC speed and duplex settings to reflect the those in the PHY 32102439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32112439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 32122439e4bfSJean-Christophe PLAGNIOL-VILLARD * mii_reg - data to write to the MII control register 32132439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32142439e4bfSJean-Christophe PLAGNIOL-VILLARD * The contents of the PHY register containing the needed information need to 32152439e4bfSJean-Christophe PLAGNIOL-VILLARD * be passed in. 32162439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 32172439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 32182439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_mac_to_phy(struct e1000_hw *hw) 32192439e4bfSJean-Christophe PLAGNIOL-VILLARD { 32202439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 32212439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 32222439e4bfSJean-Christophe PLAGNIOL-VILLARD 32232439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 32242439e4bfSJean-Christophe PLAGNIOL-VILLARD 32252439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the Device Control Register and set the bits to Force Speed 32262439e4bfSJean-Christophe PLAGNIOL-VILLARD * and Duplex. 32272439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 32282439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 32292439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); 32302439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS); 32312439e4bfSJean-Christophe PLAGNIOL-VILLARD 32322439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up duplex in the Device Control and Transmit Control 32332439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers depending on negotiated values. 32342439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 32352439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data) < 0) { 32362439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 32372439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 32382439e4bfSJean-Christophe PLAGNIOL-VILLARD } 32392439e4bfSJean-Christophe PLAGNIOL-VILLARD if (phy_data & M88E1000_PSSR_DPLX) 32402439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_FD; 32412439e4bfSJean-Christophe PLAGNIOL-VILLARD else 32422439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_FD; 32432439e4bfSJean-Christophe PLAGNIOL-VILLARD 32442439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 32452439e4bfSJean-Christophe PLAGNIOL-VILLARD 32462439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up speed in the Device Control register depending on 32472439e4bfSJean-Christophe PLAGNIOL-VILLARD * negotiated values. 32482439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 32492439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) 32502439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_SPD_1000; 32512439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS) 32522439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_SPD_100; 32532439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Write the configured values back to the Device Control Reg. */ 32542439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 32552439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 32562439e4bfSJean-Christophe PLAGNIOL-VILLARD } 32572439e4bfSJean-Christophe PLAGNIOL-VILLARD 32582439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 32592439e4bfSJean-Christophe PLAGNIOL-VILLARD * Forces the MAC's flow control settings. 32602439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32612439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 32622439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32632439e4bfSJean-Christophe PLAGNIOL-VILLARD * Sets the TFCE and RFCE bits in the device control register to reflect 32642439e4bfSJean-Christophe PLAGNIOL-VILLARD * the adapter settings. TFCE and RFCE need to be explicitly set by 32652439e4bfSJean-Christophe PLAGNIOL-VILLARD * software when a Copper PHY is used because autonegotiation is managed 32662439e4bfSJean-Christophe PLAGNIOL-VILLARD * by the PHY rather than the MAC. Software must also configure these 32672439e4bfSJean-Christophe PLAGNIOL-VILLARD * bits when link is forced on a fiber connection. 32682439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 32692439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 32702439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_force_mac_fc(struct e1000_hw *hw) 32712439e4bfSJean-Christophe PLAGNIOL-VILLARD { 32722439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 32732439e4bfSJean-Christophe PLAGNIOL-VILLARD 32742439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 32752439e4bfSJean-Christophe PLAGNIOL-VILLARD 32762439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Get the current configuration of the Device Control Register */ 32772439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 32782439e4bfSJean-Christophe PLAGNIOL-VILLARD 32792439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Because we didn't get link via the internal auto-negotiation 32802439e4bfSJean-Christophe PLAGNIOL-VILLARD * mechanism (we either forced link or we got link via PHY 32812439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-neg), we have to manually enable/disable transmit an 32822439e4bfSJean-Christophe PLAGNIOL-VILLARD * receive flow control. 32832439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32842439e4bfSJean-Christophe PLAGNIOL-VILLARD * The "Case" statement below enables/disable flow control 32852439e4bfSJean-Christophe PLAGNIOL-VILLARD * according to the "hw->fc" parameter. 32862439e4bfSJean-Christophe PLAGNIOL-VILLARD * 32872439e4bfSJean-Christophe PLAGNIOL-VILLARD * The possible values of the "fc" parameter are: 32882439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0: Flow control is completely disabled 32892439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1: Rx flow control is enabled (we can receive pause 32902439e4bfSJean-Christophe PLAGNIOL-VILLARD * frames but not send pause frames). 32912439e4bfSJean-Christophe PLAGNIOL-VILLARD * 2: Tx flow control is enabled (we can send pause frames 32922439e4bfSJean-Christophe PLAGNIOL-VILLARD * frames but we do not receive pause frames). 32932439e4bfSJean-Christophe PLAGNIOL-VILLARD * 3: Both Rx and TX flow control (symmetric) is enabled. 32942439e4bfSJean-Christophe PLAGNIOL-VILLARD * other: No other values should be possible at this point. 32952439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 32962439e4bfSJean-Christophe PLAGNIOL-VILLARD 32972439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->fc) { 32982439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_none: 32992439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE)); 33002439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33012439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_rx_pause: 33022439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~E1000_CTRL_TFCE); 33032439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_RFCE; 33042439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33052439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_tx_pause: 33062439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~E1000_CTRL_RFCE); 33072439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_TFCE; 33082439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33092439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_fc_full: 33102439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE); 33112439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 33122439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 33132439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow control param set incorrectly\n"); 33142439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 33152439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33162439e4bfSJean-Christophe PLAGNIOL-VILLARD 33172439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disable TX Flow Control for 82542 (rev 2.0) */ 33182439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type == e1000_82542_rev2_0) 33192439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= (~E1000_CTRL_TFCE); 33202439e4bfSJean-Christophe PLAGNIOL-VILLARD 33212439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 33222439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 33232439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33242439e4bfSJean-Christophe PLAGNIOL-VILLARD 33252439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 33262439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configures flow control settings after link is established 33272439e4bfSJean-Christophe PLAGNIOL-VILLARD * 33282439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 33292439e4bfSJean-Christophe PLAGNIOL-VILLARD * 33302439e4bfSJean-Christophe PLAGNIOL-VILLARD * Should be called immediately after a valid link has been established. 33312439e4bfSJean-Christophe PLAGNIOL-VILLARD * Forces MAC flow control settings if link was forced. When in MII/GMII mode 33322439e4bfSJean-Christophe PLAGNIOL-VILLARD * and autonegotiation is enabled, the MAC flow control settings will be set 33332439e4bfSJean-Christophe PLAGNIOL-VILLARD * based on the flow control negotiated by the PHY. In TBI mode, the TFCE 33342439e4bfSJean-Christophe PLAGNIOL-VILLARD * and RFCE bits will be automaticaly set to the negotiated flow control mode. 33352439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 3336aa070789SRoy Zang static int32_t 33372439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_fc_after_link_up(struct e1000_hw *hw) 33382439e4bfSJean-Christophe PLAGNIOL-VILLARD { 33392439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 33402439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_status_reg; 33412439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_nway_adv_reg; 33422439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t mii_nway_lp_ability_reg; 33432439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t speed; 33442439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t duplex; 33452439e4bfSJean-Christophe PLAGNIOL-VILLARD 33462439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 33472439e4bfSJean-Christophe PLAGNIOL-VILLARD 33482439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for the case where we have fiber media and auto-neg failed 33492439e4bfSJean-Christophe PLAGNIOL-VILLARD * so we had to force link. In this case, we need to force the 33502439e4bfSJean-Christophe PLAGNIOL-VILLARD * configuration of the MAC to match the "fc" parameter. 33512439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 3352aa070789SRoy Zang if (((hw->media_type == e1000_media_type_fiber) && (hw->autoneg_failed)) 3353aa070789SRoy Zang || ((hw->media_type == e1000_media_type_internal_serdes) 3354aa070789SRoy Zang && (hw->autoneg_failed)) 3355aa070789SRoy Zang || ((hw->media_type == e1000_media_type_copper) 3356aa070789SRoy Zang && (!hw->autoneg))) { 33572439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_force_mac_fc(hw); 33582439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 33592439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error forcing flow control settings\n"); 33602439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 33612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33622439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33632439e4bfSJean-Christophe PLAGNIOL-VILLARD 33642439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check for the case where we have copper media and auto-neg is 33652439e4bfSJean-Christophe PLAGNIOL-VILLARD * enabled. In this case, we need to check and see if Auto-Neg 33662439e4bfSJean-Christophe PLAGNIOL-VILLARD * has completed, and if so, how the PHY and link partner has 33672439e4bfSJean-Christophe PLAGNIOL-VILLARD * flow control configured. 33682439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 33692439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->media_type == e1000_media_type_copper) { 33702439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII Status Register and check to see if AutoNeg 33712439e4bfSJean-Christophe PLAGNIOL-VILLARD * has completed. We read this twice because this reg has 33722439e4bfSJean-Christophe PLAGNIOL-VILLARD * some "sticky" (latched) bits. 33732439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 33742439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { 33752439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error \n"); 33762439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 33772439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33782439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { 33792439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error \n"); 33802439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 33812439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33822439e4bfSJean-Christophe PLAGNIOL-VILLARD 33832439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mii_status_reg & MII_SR_AUTONEG_COMPLETE) { 33842439e4bfSJean-Christophe PLAGNIOL-VILLARD /* The AutoNeg process has completed, so we now need to 33852439e4bfSJean-Christophe PLAGNIOL-VILLARD * read both the Auto Negotiation Advertisement Register 33862439e4bfSJean-Christophe PLAGNIOL-VILLARD * (Address 4) and the Auto_Negotiation Base Page Ability 33872439e4bfSJean-Christophe PLAGNIOL-VILLARD * Register (Address 5) to determine how flow control was 33882439e4bfSJean-Christophe PLAGNIOL-VILLARD * negotiated. 33892439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 33902439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg 33912439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg) < 0) { 33922439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 33932439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 33942439e4bfSJean-Christophe PLAGNIOL-VILLARD } 33952439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg 33962439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw, PHY_LP_ABILITY, 33972439e4bfSJean-Christophe PLAGNIOL-VILLARD &mii_nway_lp_ability_reg) < 0) { 33982439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 33992439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 34002439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34012439e4bfSJean-Christophe PLAGNIOL-VILLARD 34022439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Two bits in the Auto Negotiation Advertisement Register 34032439e4bfSJean-Christophe PLAGNIOL-VILLARD * (Address 4) and two bits in the Auto Negotiation Base 34042439e4bfSJean-Christophe PLAGNIOL-VILLARD * Page Ability Register (Address 5) determine flow control 34052439e4bfSJean-Christophe PLAGNIOL-VILLARD * for both the PHY and the link partner. The following 34062439e4bfSJean-Christophe PLAGNIOL-VILLARD * table, taken out of the IEEE 802.3ab/D6.0 dated March 25, 34072439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1999, describes these PAUSE resolution bits and how flow 34082439e4bfSJean-Christophe PLAGNIOL-VILLARD * control is determined based upon these settings. 34092439e4bfSJean-Christophe PLAGNIOL-VILLARD * NOTE: DC = Don't Care 34102439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34112439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34122439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution 34132439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34142439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 0 | DC | DC | e1000_fc_none 34152439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 0 | DC | e1000_fc_none 34162439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 1 | 0 | e1000_fc_none 34172439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 34182439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 0 | 0 | DC | e1000_fc_none 34192439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | DC | 1 | DC | e1000_fc_full 34202439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 1 | 0 | 0 | e1000_fc_none 34212439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 34222439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34232439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34242439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Are both PAUSE bits set to 1? If so, this implies 34252439e4bfSJean-Christophe PLAGNIOL-VILLARD * Symmetric Flow Control is enabled at both ends. The 34262439e4bfSJean-Christophe PLAGNIOL-VILLARD * ASM_DIR bits are irrelevant per the spec. 34272439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34282439e4bfSJean-Christophe PLAGNIOL-VILLARD * For Symmetric Flow Control: 34292439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34302439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34312439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 34322439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34332439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | DC | 1 | DC | e1000_fc_full 34342439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34352439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34362439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && 34372439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) { 34382439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now we need to check if the user selected RX ONLY 34392439e4bfSJean-Christophe PLAGNIOL-VILLARD * of pause frames. In this case, we had to advertise 34402439e4bfSJean-Christophe PLAGNIOL-VILLARD * FULL flow control because we could not advertise RX 34412439e4bfSJean-Christophe PLAGNIOL-VILLARD * ONLY. Hence, we must now check to see if we need to 34422439e4bfSJean-Christophe PLAGNIOL-VILLARD * turn OFF the TRANSMISSION of PAUSE frames. 34432439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34442439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->original_fc == e1000_fc_full) { 34452439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_full; 34462439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow Control = FULL.\r\n"); 34472439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 34482439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_rx_pause; 34492439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 34502439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = RX PAUSE frames only.\r\n"); 34512439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34522439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34532439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For receiving PAUSE frames ONLY. 34542439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34552439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34562439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 34572439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34582439e4bfSJean-Christophe PLAGNIOL-VILLARD * 0 | 1 | 1 | 1 | e1000_fc_tx_pause 34592439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34602439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34612439e4bfSJean-Christophe PLAGNIOL-VILLARD else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) && 34622439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && 34632439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && 34642439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) 34652439e4bfSJean-Christophe PLAGNIOL-VILLARD { 34662439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_tx_pause; 34672439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 34682439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = TX PAUSE frames only.\r\n"); 34692439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34702439e4bfSJean-Christophe PLAGNIOL-VILLARD /* For transmitting PAUSE frames ONLY. 34712439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34722439e4bfSJean-Christophe PLAGNIOL-VILLARD * LOCAL DEVICE | LINK PARTNER 34732439e4bfSJean-Christophe PLAGNIOL-VILLARD * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result 34742439e4bfSJean-Christophe PLAGNIOL-VILLARD *-------|---------|-------|---------|-------------------- 34752439e4bfSJean-Christophe PLAGNIOL-VILLARD * 1 | 1 | 0 | 1 | e1000_fc_rx_pause 34762439e4bfSJean-Christophe PLAGNIOL-VILLARD * 34772439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 34782439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) && 34792439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_adv_reg & NWAY_AR_ASM_DIR) && 34802439e4bfSJean-Christophe PLAGNIOL-VILLARD !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && 34812439e4bfSJean-Christophe PLAGNIOL-VILLARD (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) 34822439e4bfSJean-Christophe PLAGNIOL-VILLARD { 34832439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_rx_pause; 34842439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 34852439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = RX PAUSE frames only.\r\n"); 34862439e4bfSJean-Christophe PLAGNIOL-VILLARD } 34872439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Per the IEEE spec, at this point flow control should be 34882439e4bfSJean-Christophe PLAGNIOL-VILLARD * disabled. However, we want to consider that we could 34892439e4bfSJean-Christophe PLAGNIOL-VILLARD * be connected to a legacy switch that doesn't advertise 34902439e4bfSJean-Christophe PLAGNIOL-VILLARD * desired flow control, but can be forced on the link 34912439e4bfSJean-Christophe PLAGNIOL-VILLARD * partner. So if we advertised no flow control, that is 34922439e4bfSJean-Christophe PLAGNIOL-VILLARD * what we will resolve to. If we advertised some kind of 34932439e4bfSJean-Christophe PLAGNIOL-VILLARD * receive capability (Rx Pause Only or Full Flow Control) 34942439e4bfSJean-Christophe PLAGNIOL-VILLARD * and the link partner advertised none, we will configure 34952439e4bfSJean-Christophe PLAGNIOL-VILLARD * ourselves to enable Rx Flow Control only. We can do 34962439e4bfSJean-Christophe PLAGNIOL-VILLARD * this safely for two reasons: If the link partner really 34972439e4bfSJean-Christophe PLAGNIOL-VILLARD * didn't want flow control enabled, and we enable Rx, no 34982439e4bfSJean-Christophe PLAGNIOL-VILLARD * harm done since we won't be receiving any PAUSE frames 34992439e4bfSJean-Christophe PLAGNIOL-VILLARD * anyway. If the intent on the link partner was to have 35002439e4bfSJean-Christophe PLAGNIOL-VILLARD * flow control enabled, then by us enabling RX only, we 35012439e4bfSJean-Christophe PLAGNIOL-VILLARD * can at least receive pause frames and process them. 35022439e4bfSJean-Christophe PLAGNIOL-VILLARD * This is a good idea because in most cases, since we are 35032439e4bfSJean-Christophe PLAGNIOL-VILLARD * predominantly a server NIC, more times than not we will 35042439e4bfSJean-Christophe PLAGNIOL-VILLARD * be asked to delay transmission of packets than asking 35052439e4bfSJean-Christophe PLAGNIOL-VILLARD * our link partner to pause transmission of frames. 35062439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35072439e4bfSJean-Christophe PLAGNIOL-VILLARD else if (hw->original_fc == e1000_fc_none || 35082439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->original_fc == e1000_fc_tx_pause) { 35092439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_none; 35102439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Flow Control = NONE.\r\n"); 35112439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 35122439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_rx_pause; 35132439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 35142439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Flow Control = RX PAUSE frames only.\r\n"); 35152439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35162439e4bfSJean-Christophe PLAGNIOL-VILLARD 35172439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now we need to do one last check... If we auto- 35182439e4bfSJean-Christophe PLAGNIOL-VILLARD * negotiated to HALF DUPLEX, flow control should not be 35192439e4bfSJean-Christophe PLAGNIOL-VILLARD * enabled per IEEE 802.3 spec. 35202439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35212439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_get_speed_and_duplex(hw, &speed, &duplex); 35222439e4bfSJean-Christophe PLAGNIOL-VILLARD 35232439e4bfSJean-Christophe PLAGNIOL-VILLARD if (duplex == HALF_DUPLEX) 35242439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_none; 35252439e4bfSJean-Christophe PLAGNIOL-VILLARD 35262439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now we call a subroutine to actually force the MAC 35272439e4bfSJean-Christophe PLAGNIOL-VILLARD * controller to use the correct flow control settings. 35282439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35292439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_force_mac_fc(hw); 35302439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 35312439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 35322439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Error forcing flow control settings\n"); 35332439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 35342439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35352439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 35362439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 35372439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Copper PHY and Auto Neg has not completed.\r\n"); 35382439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35392439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3540aa070789SRoy Zang return E1000_SUCCESS; 35412439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35422439e4bfSJean-Christophe PLAGNIOL-VILLARD 35432439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 35442439e4bfSJean-Christophe PLAGNIOL-VILLARD * Checks to see if the link status of the hardware has changed. 35452439e4bfSJean-Christophe PLAGNIOL-VILLARD * 35462439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 35472439e4bfSJean-Christophe PLAGNIOL-VILLARD * 35482439e4bfSJean-Christophe PLAGNIOL-VILLARD * Called by any function that needs to check the link status of the adapter. 35492439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 35502439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 35512439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_check_for_link(struct eth_device *nic) 35522439e4bfSJean-Christophe PLAGNIOL-VILLARD { 35532439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 35542439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t rxcw; 35552439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 35562439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status; 35572439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t rctl; 35582439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t signal; 35592439e4bfSJean-Christophe PLAGNIOL-VILLARD int32_t ret_val; 35602439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 35612439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t lp_capability; 35622439e4bfSJean-Christophe PLAGNIOL-VILLARD 35632439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 35642439e4bfSJean-Christophe PLAGNIOL-VILLARD 35652439e4bfSJean-Christophe PLAGNIOL-VILLARD /* On adapters with a MAC newer that 82544, SW Defineable pin 1 will be 35662439e4bfSJean-Christophe PLAGNIOL-VILLARD * set when the optics detect a signal. On older adapters, it will be 35672439e4bfSJean-Christophe PLAGNIOL-VILLARD * cleared when there is a signal 35682439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35692439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 35702439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->mac_type > e1000_82544) && !(ctrl & E1000_CTRL_ILOS)) 35712439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = E1000_CTRL_SWDPIN1; 35722439e4bfSJean-Christophe PLAGNIOL-VILLARD else 35732439e4bfSJean-Christophe PLAGNIOL-VILLARD signal = 0; 35742439e4bfSJean-Christophe PLAGNIOL-VILLARD 35752439e4bfSJean-Christophe PLAGNIOL-VILLARD status = E1000_READ_REG(hw, STATUS); 35762439e4bfSJean-Christophe PLAGNIOL-VILLARD rxcw = E1000_READ_REG(hw, RXCW); 35772439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("ctrl: %#08x status %#08x rxcw %#08x\n", ctrl, status, rxcw); 35782439e4bfSJean-Christophe PLAGNIOL-VILLARD 35792439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we have a copper PHY then we only want to go out to the PHY 35802439e4bfSJean-Christophe PLAGNIOL-VILLARD * registers to see if Auto-Neg has completed and/or if our link 35812439e4bfSJean-Christophe PLAGNIOL-VILLARD * status has changed. The get_link_status flag will be set if we 35822439e4bfSJean-Christophe PLAGNIOL-VILLARD * receive a Link Status Change interrupt or we have Rx Sequence 35832439e4bfSJean-Christophe PLAGNIOL-VILLARD * Errors. 35842439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35852439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((hw->media_type == e1000_media_type_copper) && hw->get_link_status) { 35862439e4bfSJean-Christophe PLAGNIOL-VILLARD /* First we want to see if the MII Status Register reports 35872439e4bfSJean-Christophe PLAGNIOL-VILLARD * link. If so, then we want to get the current speed/duplex 35882439e4bfSJean-Christophe PLAGNIOL-VILLARD * of the PHY. 35892439e4bfSJean-Christophe PLAGNIOL-VILLARD * Read the register twice since the link bit is sticky. 35902439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 35912439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 35922439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 35932439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 35942439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35952439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 35962439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 35972439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 35982439e4bfSJean-Christophe PLAGNIOL-VILLARD } 35992439e4bfSJean-Christophe PLAGNIOL-VILLARD 36002439e4bfSJean-Christophe PLAGNIOL-VILLARD if (phy_data & MII_SR_LINK_STATUS) { 36012439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->get_link_status = FALSE; 36022439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 36032439e4bfSJean-Christophe PLAGNIOL-VILLARD /* No link detected */ 36042439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_NOLINK; 36052439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36062439e4bfSJean-Christophe PLAGNIOL-VILLARD 36072439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We have a M88E1000 PHY and Auto-Neg is enabled. If we 36082439e4bfSJean-Christophe PLAGNIOL-VILLARD * have Si on board that is 82544 or newer, Auto 36092439e4bfSJean-Christophe PLAGNIOL-VILLARD * Speed Detection takes care of MAC speed/duplex 36102439e4bfSJean-Christophe PLAGNIOL-VILLARD * configuration. So we only need to configure Collision 36112439e4bfSJean-Christophe PLAGNIOL-VILLARD * Distance in the MAC. Otherwise, we need to force 36122439e4bfSJean-Christophe PLAGNIOL-VILLARD * speed/duplex on the MAC to the current PHY speed/duplex 36132439e4bfSJean-Christophe PLAGNIOL-VILLARD * settings. 36142439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36152439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82544) 36162439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 36172439e4bfSJean-Christophe PLAGNIOL-VILLARD else { 36182439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_mac_to_phy(hw); 36192439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 36202439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 36212439e4bfSJean-Christophe PLAGNIOL-VILLARD ("Error configuring MAC to PHY settings\n"); 36222439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 36232439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36242439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36252439e4bfSJean-Christophe PLAGNIOL-VILLARD 36262439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Configure Flow Control now that Auto-Neg has completed. First, we 36272439e4bfSJean-Christophe PLAGNIOL-VILLARD * need to restore the desired flow control settings because we may 36282439e4bfSJean-Christophe PLAGNIOL-VILLARD * have had to re-autoneg with a different link partner. 36292439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36302439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_fc_after_link_up(hw); 36312439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 36322439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error configuring flow control\n"); 36332439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 36342439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36352439e4bfSJean-Christophe PLAGNIOL-VILLARD 36362439e4bfSJean-Christophe PLAGNIOL-VILLARD /* At this point we know that we are on copper and we have 36372439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiated link. These are conditions for checking the link 36382439e4bfSJean-Christophe PLAGNIOL-VILLARD * parter capability register. We use the link partner capability to 36392439e4bfSJean-Christophe PLAGNIOL-VILLARD * determine if TBI Compatibility needs to be turned on or off. If 36402439e4bfSJean-Christophe PLAGNIOL-VILLARD * the link partner advertises any speed in addition to Gigabit, then 36412439e4bfSJean-Christophe PLAGNIOL-VILLARD * we assume that they are GMII-based, and TBI compatibility is not 36422439e4bfSJean-Christophe PLAGNIOL-VILLARD * needed. If no other speeds are advertised, we assume the link 36432439e4bfSJean-Christophe PLAGNIOL-VILLARD * partner is TBI-based, and we turn on TBI Compatibility. 36442439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36452439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->tbi_compatibility_en) { 36462439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg 36472439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw, PHY_LP_ABILITY, &lp_capability) < 0) { 36482439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 36492439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 36502439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36512439e4bfSJean-Christophe PLAGNIOL-VILLARD if (lp_capability & (NWAY_LPAR_10T_HD_CAPS | 36522439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_10T_FD_CAPS | 36532439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_100TX_HD_CAPS | 36542439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_100TX_FD_CAPS | 36552439e4bfSJean-Christophe PLAGNIOL-VILLARD NWAY_LPAR_100T4_CAPS)) { 36562439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If our link partner advertises anything in addition to 36572439e4bfSJean-Christophe PLAGNIOL-VILLARD * gigabit, we do not need to enable TBI compatibility. 36582439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36592439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->tbi_compatibility_on) { 36602439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we previously were in the mode, turn it off. */ 36612439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 36622439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~E1000_RCTL_SBP; 36632439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 36642439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->tbi_compatibility_on = FALSE; 36652439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36662439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 36672439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If TBI compatibility is was previously off, turn it on. For 36682439e4bfSJean-Christophe PLAGNIOL-VILLARD * compatibility with a TBI link partner, we will store bad 36692439e4bfSJean-Christophe PLAGNIOL-VILLARD * packets. Some frames have an additional byte on the end and 36702439e4bfSJean-Christophe PLAGNIOL-VILLARD * will look like CRC errors to to the hardware. 36712439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36722439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!hw->tbi_compatibility_on) { 36732439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->tbi_compatibility_on = TRUE; 36742439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 36752439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl |= E1000_RCTL_SBP; 36762439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 36772439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36782439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36792439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36802439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36812439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we don't have link (auto-negotiation failed or link partner cannot 36822439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiate), the cable is plugged in (we have signal), and our 36832439e4bfSJean-Christophe PLAGNIOL-VILLARD * link partner is not trying to auto-negotiate with us (we are receiving 36842439e4bfSJean-Christophe PLAGNIOL-VILLARD * idles or data), we need to force link up. We also need to give 36852439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation time to complete, in case the cable was just plugged 36862439e4bfSJean-Christophe PLAGNIOL-VILLARD * in. The autoneg_failed flag does this. 36872439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 36882439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((hw->media_type == e1000_media_type_fiber) && 36892439e4bfSJean-Christophe PLAGNIOL-VILLARD (!(status & E1000_STATUS_LU)) && 36902439e4bfSJean-Christophe PLAGNIOL-VILLARD ((ctrl & E1000_CTRL_SWDPIN1) == signal) && 36912439e4bfSJean-Christophe PLAGNIOL-VILLARD (!(rxcw & E1000_RXCW_C))) { 36922439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->autoneg_failed == 0) { 36932439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 1; 36942439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 36952439e4bfSJean-Christophe PLAGNIOL-VILLARD } 36962439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\r\n"); 36972439e4bfSJean-Christophe PLAGNIOL-VILLARD 36982439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Disable auto-negotiation in the TXCW register */ 36992439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE)); 37002439e4bfSJean-Christophe PLAGNIOL-VILLARD 37012439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Force link-up and also force full-duplex. */ 37022439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 37032439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); 37042439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 37052439e4bfSJean-Christophe PLAGNIOL-VILLARD 37062439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Configure Flow Control after forcing link up. */ 37072439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_config_fc_after_link_up(hw); 37082439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 37092439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Error configuring flow control\n"); 37102439e4bfSJean-Christophe PLAGNIOL-VILLARD return ret_val; 37112439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37132439e4bfSJean-Christophe PLAGNIOL-VILLARD /* If we are forcing link and we are receiving /C/ ordered sets, re-enable 37142439e4bfSJean-Christophe PLAGNIOL-VILLARD * auto-negotiation in the TXCW register and disable forced link in the 37152439e4bfSJean-Christophe PLAGNIOL-VILLARD * Device Control register in an attempt to auto-negotiate with our link 37162439e4bfSJean-Christophe PLAGNIOL-VILLARD * partner. 37172439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 37182439e4bfSJean-Christophe PLAGNIOL-VILLARD else if ((hw->media_type == e1000_media_type_fiber) && 37192439e4bfSJean-Christophe PLAGNIOL-VILLARD (ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { 37202439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT 37212439e4bfSJean-Christophe PLAGNIOL-VILLARD ("RXing /C/, enable AutoNeg and stop forcing link.\r\n"); 37222439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TXCW, hw->txcw); 37232439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU)); 37242439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37252439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 37262439e4bfSJean-Christophe PLAGNIOL-VILLARD } 37272439e4bfSJean-Christophe PLAGNIOL-VILLARD 37282439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 3729aa070789SRoy Zang * Configure the MAC-to-PHY interface for 10/100Mbps 3730aa070789SRoy Zang * 3731aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 3732aa070789SRoy Zang ******************************************************************************/ 3733aa070789SRoy Zang static int32_t 3734aa070789SRoy Zang e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, uint16_t duplex) 3735aa070789SRoy Zang { 3736aa070789SRoy Zang int32_t ret_val = E1000_SUCCESS; 3737aa070789SRoy Zang uint32_t tipg; 3738aa070789SRoy Zang uint16_t reg_data; 3739aa070789SRoy Zang 3740aa070789SRoy Zang DEBUGFUNC(); 3741aa070789SRoy Zang 3742aa070789SRoy Zang reg_data = E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT; 3743aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 3744aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_HD_CTRL, reg_data); 3745aa070789SRoy Zang if (ret_val) 3746aa070789SRoy Zang return ret_val; 3747aa070789SRoy Zang 3748aa070789SRoy Zang /* Configure Transmit Inter-Packet Gap */ 3749aa070789SRoy Zang tipg = E1000_READ_REG(hw, TIPG); 3750aa070789SRoy Zang tipg &= ~E1000_TIPG_IPGT_MASK; 3751aa070789SRoy Zang tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100; 3752aa070789SRoy Zang E1000_WRITE_REG(hw, TIPG, tipg); 3753aa070789SRoy Zang 3754aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); 3755aa070789SRoy Zang 3756aa070789SRoy Zang if (ret_val) 3757aa070789SRoy Zang return ret_val; 3758aa070789SRoy Zang 3759aa070789SRoy Zang if (duplex == HALF_DUPLEX) 3760aa070789SRoy Zang reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER; 3761aa070789SRoy Zang else 3762aa070789SRoy Zang reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; 3763aa070789SRoy Zang 3764aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); 3765aa070789SRoy Zang 3766aa070789SRoy Zang return ret_val; 3767aa070789SRoy Zang } 3768aa070789SRoy Zang 3769aa070789SRoy Zang static int32_t 3770aa070789SRoy Zang e1000_configure_kmrn_for_1000(struct e1000_hw *hw) 3771aa070789SRoy Zang { 3772aa070789SRoy Zang int32_t ret_val = E1000_SUCCESS; 3773aa070789SRoy Zang uint16_t reg_data; 3774aa070789SRoy Zang uint32_t tipg; 3775aa070789SRoy Zang 3776aa070789SRoy Zang DEBUGFUNC(); 3777aa070789SRoy Zang 3778aa070789SRoy Zang reg_data = E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT; 3779aa070789SRoy Zang ret_val = e1000_write_kmrn_reg(hw, 3780aa070789SRoy Zang E1000_KUMCTRLSTA_OFFSET_HD_CTRL, reg_data); 3781aa070789SRoy Zang if (ret_val) 3782aa070789SRoy Zang return ret_val; 3783aa070789SRoy Zang 3784aa070789SRoy Zang /* Configure Transmit Inter-Packet Gap */ 3785aa070789SRoy Zang tipg = E1000_READ_REG(hw, TIPG); 3786aa070789SRoy Zang tipg &= ~E1000_TIPG_IPGT_MASK; 3787aa070789SRoy Zang tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; 3788aa070789SRoy Zang E1000_WRITE_REG(hw, TIPG, tipg); 3789aa070789SRoy Zang 3790aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); 3791aa070789SRoy Zang 3792aa070789SRoy Zang if (ret_val) 3793aa070789SRoy Zang return ret_val; 3794aa070789SRoy Zang 3795aa070789SRoy Zang reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; 3796aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); 3797aa070789SRoy Zang 3798aa070789SRoy Zang return ret_val; 3799aa070789SRoy Zang } 3800aa070789SRoy Zang 3801aa070789SRoy Zang /****************************************************************************** 38022439e4bfSJean-Christophe PLAGNIOL-VILLARD * Detects the current speed and duplex settings of the hardware. 38032439e4bfSJean-Christophe PLAGNIOL-VILLARD * 38042439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 38052439e4bfSJean-Christophe PLAGNIOL-VILLARD * speed - Speed of the connection 38062439e4bfSJean-Christophe PLAGNIOL-VILLARD * duplex - Duplex setting of the connection 38072439e4bfSJean-Christophe PLAGNIOL-VILLARD *****************************************************************************/ 3808aa070789SRoy Zang static int 3809aa070789SRoy Zang e1000_get_speed_and_duplex(struct e1000_hw *hw, uint16_t *speed, 3810aa070789SRoy Zang uint16_t *duplex) 38112439e4bfSJean-Christophe PLAGNIOL-VILLARD { 38122439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status; 3813aa070789SRoy Zang int32_t ret_val; 3814aa070789SRoy Zang uint16_t phy_data; 38152439e4bfSJean-Christophe PLAGNIOL-VILLARD 38162439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 38172439e4bfSJean-Christophe PLAGNIOL-VILLARD 38182439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82543) { 38192439e4bfSJean-Christophe PLAGNIOL-VILLARD status = E1000_READ_REG(hw, STATUS); 38202439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_SPEED_1000) { 38212439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_1000; 38222439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("1000 Mbs, "); 38232439e4bfSJean-Christophe PLAGNIOL-VILLARD } else if (status & E1000_STATUS_SPEED_100) { 38242439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_100; 38252439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("100 Mbs, "); 38262439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 38272439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_10; 38282439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("10 Mbs, "); 38292439e4bfSJean-Christophe PLAGNIOL-VILLARD } 38302439e4bfSJean-Christophe PLAGNIOL-VILLARD 38312439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_FD) { 38322439e4bfSJean-Christophe PLAGNIOL-VILLARD *duplex = FULL_DUPLEX; 38332439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Full Duplex\r\n"); 38342439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 38352439e4bfSJean-Christophe PLAGNIOL-VILLARD *duplex = HALF_DUPLEX; 38362439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT(" Half Duplex\r\n"); 38372439e4bfSJean-Christophe PLAGNIOL-VILLARD } 38382439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 38392439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("1000 Mbs, Full Duplex\r\n"); 38402439e4bfSJean-Christophe PLAGNIOL-VILLARD *speed = SPEED_1000; 38412439e4bfSJean-Christophe PLAGNIOL-VILLARD *duplex = FULL_DUPLEX; 38422439e4bfSJean-Christophe PLAGNIOL-VILLARD } 3843aa070789SRoy Zang 3844aa070789SRoy Zang /* IGP01 PHY may advertise full duplex operation after speed downgrade 3845aa070789SRoy Zang * even if it is operating at half duplex. Here we set the duplex 3846aa070789SRoy Zang * settings to match the duplex in the link partner's capabilities. 3847aa070789SRoy Zang */ 3848aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp && hw->speed_downgraded) { 3849aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, &phy_data); 3850aa070789SRoy Zang if (ret_val) 3851aa070789SRoy Zang return ret_val; 3852aa070789SRoy Zang 3853aa070789SRoy Zang if (!(phy_data & NWAY_ER_LP_NWAY_CAPS)) 3854aa070789SRoy Zang *duplex = HALF_DUPLEX; 3855aa070789SRoy Zang else { 3856aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 3857aa070789SRoy Zang PHY_LP_ABILITY, &phy_data); 3858aa070789SRoy Zang if (ret_val) 3859aa070789SRoy Zang return ret_val; 3860aa070789SRoy Zang if ((*speed == SPEED_100 && 3861aa070789SRoy Zang !(phy_data & NWAY_LPAR_100TX_FD_CAPS)) 3862aa070789SRoy Zang || (*speed == SPEED_10 3863aa070789SRoy Zang && !(phy_data & NWAY_LPAR_10T_FD_CAPS))) 3864aa070789SRoy Zang *duplex = HALF_DUPLEX; 3865aa070789SRoy Zang } 3866aa070789SRoy Zang } 3867aa070789SRoy Zang 3868aa070789SRoy Zang if ((hw->mac_type == e1000_80003es2lan) && 3869aa070789SRoy Zang (hw->media_type == e1000_media_type_copper)) { 3870aa070789SRoy Zang if (*speed == SPEED_1000) 3871aa070789SRoy Zang ret_val = e1000_configure_kmrn_for_1000(hw); 3872aa070789SRoy Zang else 3873aa070789SRoy Zang ret_val = e1000_configure_kmrn_for_10_100(hw, *duplex); 3874aa070789SRoy Zang if (ret_val) 3875aa070789SRoy Zang return ret_val; 3876aa070789SRoy Zang } 3877aa070789SRoy Zang return E1000_SUCCESS; 38782439e4bfSJean-Christophe PLAGNIOL-VILLARD } 38792439e4bfSJean-Christophe PLAGNIOL-VILLARD 38802439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 38812439e4bfSJean-Christophe PLAGNIOL-VILLARD * Blocks until autoneg completes or times out (~4.5 seconds) 38822439e4bfSJean-Christophe PLAGNIOL-VILLARD * 38832439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 38842439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 38852439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 38862439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_wait_autoneg(struct e1000_hw *hw) 38872439e4bfSJean-Christophe PLAGNIOL-VILLARD { 38882439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t i; 38892439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 38902439e4bfSJean-Christophe PLAGNIOL-VILLARD 38912439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 38922439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Waiting for Auto-Neg to complete.\n"); 38932439e4bfSJean-Christophe PLAGNIOL-VILLARD 38942439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We will wait for autoneg to complete or 4.5 seconds to expire. */ 38952439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = PHY_AUTO_NEG_TIME; i > 0; i--) { 38962439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the MII Status Register and wait for Auto-Neg 38972439e4bfSJean-Christophe PLAGNIOL-VILLARD * Complete bit to be set. 38982439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 38992439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 39002439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 39012439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 39022439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39032439e4bfSJean-Christophe PLAGNIOL-VILLARD if (e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { 39042439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Read Error\n"); 39052439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 39062439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39072439e4bfSJean-Christophe PLAGNIOL-VILLARD if (phy_data & MII_SR_AUTONEG_COMPLETE) { 39082439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-Neg complete.\n"); 39092439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 39102439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39112439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(100); 39122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39132439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Auto-Neg timedout.\n"); 39142439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_TIMEOUT; 39152439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39162439e4bfSJean-Christophe PLAGNIOL-VILLARD 39172439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 39182439e4bfSJean-Christophe PLAGNIOL-VILLARD * Raises the Management Data Clock 39192439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39202439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 39212439e4bfSJean-Christophe PLAGNIOL-VILLARD * ctrl - Device control register's current value 39222439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 39232439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 39242439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(struct e1000_hw *hw, uint32_t * ctrl) 39252439e4bfSJean-Christophe PLAGNIOL-VILLARD { 39262439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Raise the clock input to the Management Data Clock (by setting the MDC 39272439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit), and then delay 2 microseconds. 39282439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39292439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (*ctrl | E1000_CTRL_MDC)); 39302439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 39312439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(2); 39322439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39332439e4bfSJean-Christophe PLAGNIOL-VILLARD 39342439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 39352439e4bfSJean-Christophe PLAGNIOL-VILLARD * Lowers the Management Data Clock 39362439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39372439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 39382439e4bfSJean-Christophe PLAGNIOL-VILLARD * ctrl - Device control register's current value 39392439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 39402439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 39412439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(struct e1000_hw *hw, uint32_t * ctrl) 39422439e4bfSJean-Christophe PLAGNIOL-VILLARD { 39432439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Lower the clock input to the Management Data Clock (by clearing the MDC 39442439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit), and then delay 2 microseconds. 39452439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39462439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, (*ctrl & ~E1000_CTRL_MDC)); 39472439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 39482439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(2); 39492439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39502439e4bfSJean-Christophe PLAGNIOL-VILLARD 39512439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 39522439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shifts data bits out to the PHY 39532439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39542439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 39552439e4bfSJean-Christophe PLAGNIOL-VILLARD * data - Data to send out to the PHY 39562439e4bfSJean-Christophe PLAGNIOL-VILLARD * count - Number of bits to shift out 39572439e4bfSJean-Christophe PLAGNIOL-VILLARD * 39582439e4bfSJean-Christophe PLAGNIOL-VILLARD * Bits are shifted out in MSB to LSB order. 39592439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 39602439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 39612439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(struct e1000_hw *hw, uint32_t data, uint16_t count) 39622439e4bfSJean-Christophe PLAGNIOL-VILLARD { 39632439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 39642439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mask; 39652439e4bfSJean-Christophe PLAGNIOL-VILLARD 39662439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We need to shift "count" number of bits out to the PHY. So, the value 39672439e4bfSJean-Christophe PLAGNIOL-VILLARD * in the "data" parameter will be shifted out to the PHY one bit at a 39682439e4bfSJean-Christophe PLAGNIOL-VILLARD * time. In order to do this, "data" must be broken down into bits. 39692439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39702439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = 0x01; 39712439e4bfSJean-Christophe PLAGNIOL-VILLARD mask <<= (count - 1); 39722439e4bfSJean-Christophe PLAGNIOL-VILLARD 39732439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 39742439e4bfSJean-Christophe PLAGNIOL-VILLARD 39752439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set MDIO_DIR and MDC_DIR direction bits to be used as output pins. */ 39762439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= (E1000_CTRL_MDIO_DIR | E1000_CTRL_MDC_DIR); 39772439e4bfSJean-Christophe PLAGNIOL-VILLARD 39782439e4bfSJean-Christophe PLAGNIOL-VILLARD while (mask) { 39792439e4bfSJean-Christophe PLAGNIOL-VILLARD /* A "1" is shifted out to the PHY by setting the MDIO bit to "1" and 39802439e4bfSJean-Christophe PLAGNIOL-VILLARD * then raising and lowering the Management Data Clock. A "0" is 39812439e4bfSJean-Christophe PLAGNIOL-VILLARD * shifted out to the PHY by setting the MDIO bit to "0" and then 39822439e4bfSJean-Christophe PLAGNIOL-VILLARD * raising and lowering the clock. 39832439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 39842439e4bfSJean-Christophe PLAGNIOL-VILLARD if (data & mask) 39852439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl |= E1000_CTRL_MDIO; 39862439e4bfSJean-Christophe PLAGNIOL-VILLARD else 39872439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_MDIO; 39882439e4bfSJean-Christophe PLAGNIOL-VILLARD 39892439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 39902439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 39912439e4bfSJean-Christophe PLAGNIOL-VILLARD 39922439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(2); 39932439e4bfSJean-Christophe PLAGNIOL-VILLARD 39942439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 39952439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 39962439e4bfSJean-Christophe PLAGNIOL-VILLARD 39972439e4bfSJean-Christophe PLAGNIOL-VILLARD mask = mask >> 1; 39982439e4bfSJean-Christophe PLAGNIOL-VILLARD } 39992439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40002439e4bfSJean-Christophe PLAGNIOL-VILLARD 40012439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 40022439e4bfSJean-Christophe PLAGNIOL-VILLARD * Shifts data bits in from the PHY 40032439e4bfSJean-Christophe PLAGNIOL-VILLARD * 40042439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 40052439e4bfSJean-Christophe PLAGNIOL-VILLARD * 40062439e4bfSJean-Christophe PLAGNIOL-VILLARD * Bits are shifted in in MSB to LSB order. 40072439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 40082439e4bfSJean-Christophe PLAGNIOL-VILLARD static uint16_t 40092439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_in_mdi_bits(struct e1000_hw *hw) 40102439e4bfSJean-Christophe PLAGNIOL-VILLARD { 40112439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t ctrl; 40122439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t data = 0; 40132439e4bfSJean-Christophe PLAGNIOL-VILLARD uint8_t i; 40142439e4bfSJean-Christophe PLAGNIOL-VILLARD 40152439e4bfSJean-Christophe PLAGNIOL-VILLARD /* In order to read a register from the PHY, we need to shift in a total 40162439e4bfSJean-Christophe PLAGNIOL-VILLARD * of 18 bits from the PHY. The first two bit (turnaround) times are used 40172439e4bfSJean-Christophe PLAGNIOL-VILLARD * to avoid contention on the MDIO pin when a read operation is performed. 40182439e4bfSJean-Christophe PLAGNIOL-VILLARD * These two bits are ignored by us and thrown away. Bits are "shifted in" 40192439e4bfSJean-Christophe PLAGNIOL-VILLARD * by raising the input to the Management Data Clock (setting the MDC bit), 40202439e4bfSJean-Christophe PLAGNIOL-VILLARD * and then reading the value of the MDIO bit. 40212439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 40222439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 40232439e4bfSJean-Christophe PLAGNIOL-VILLARD 40242439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear MDIO_DIR (SWDPIO1) to indicate this bit is to be used as input. */ 40252439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_MDIO_DIR; 40262439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl &= ~E1000_CTRL_MDIO; 40272439e4bfSJean-Christophe PLAGNIOL-VILLARD 40282439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 40292439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 40302439e4bfSJean-Christophe PLAGNIOL-VILLARD 40312439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Raise and Lower the clock before reading in the data. This accounts for 40322439e4bfSJean-Christophe PLAGNIOL-VILLARD * the turnaround bits. The first clock occurred when we clocked out the 40332439e4bfSJean-Christophe PLAGNIOL-VILLARD * last bit of the Register Address. 40342439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 40352439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 40362439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 40372439e4bfSJean-Christophe PLAGNIOL-VILLARD 40382439e4bfSJean-Christophe PLAGNIOL-VILLARD for (data = 0, i = 0; i < 16; i++) { 40392439e4bfSJean-Christophe PLAGNIOL-VILLARD data = data << 1; 40402439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 40412439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 40422439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Check to see if we shifted in a "1". */ 40432439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ctrl & E1000_CTRL_MDIO) 40442439e4bfSJean-Christophe PLAGNIOL-VILLARD data |= 1; 40452439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 40462439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40472439e4bfSJean-Christophe PLAGNIOL-VILLARD 40482439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_raise_mdi_clk(hw, &ctrl); 40492439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_lower_mdi_clk(hw, &ctrl); 40502439e4bfSJean-Christophe PLAGNIOL-VILLARD 40512439e4bfSJean-Christophe PLAGNIOL-VILLARD return data; 40522439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40532439e4bfSJean-Christophe PLAGNIOL-VILLARD 40542439e4bfSJean-Christophe PLAGNIOL-VILLARD /***************************************************************************** 40552439e4bfSJean-Christophe PLAGNIOL-VILLARD * Reads the value from a PHY register 40562439e4bfSJean-Christophe PLAGNIOL-VILLARD * 40572439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 40582439e4bfSJean-Christophe PLAGNIOL-VILLARD * reg_addr - address of the PHY register to read 40592439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 40602439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 40612439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t * phy_data) 40622439e4bfSJean-Christophe PLAGNIOL-VILLARD { 40632439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 40642439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mdic = 0; 40652439e4bfSJean-Christophe PLAGNIOL-VILLARD const uint32_t phy_addr = 1; 40662439e4bfSJean-Christophe PLAGNIOL-VILLARD 40672439e4bfSJean-Christophe PLAGNIOL-VILLARD if (reg_addr > MAX_PHY_REG_ADDRESS) { 40682439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Address %d is out of range\n", reg_addr); 40692439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PARAM; 40702439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40712439e4bfSJean-Christophe PLAGNIOL-VILLARD 40722439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 40732439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up Op-code, Phy Address, and register address in the MDI 40742439e4bfSJean-Christophe PLAGNIOL-VILLARD * Control register. The MAC will take care of interfacing with the 40752439e4bfSJean-Christophe PLAGNIOL-VILLARD * PHY to retrieve the desired data. 40762439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 40772439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) | 40782439e4bfSJean-Christophe PLAGNIOL-VILLARD (phy_addr << E1000_MDIC_PHY_SHIFT) | 40792439e4bfSJean-Christophe PLAGNIOL-VILLARD (E1000_MDIC_OP_READ)); 40802439e4bfSJean-Christophe PLAGNIOL-VILLARD 40812439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, MDIC, mdic); 40822439e4bfSJean-Christophe PLAGNIOL-VILLARD 40832439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Poll the ready bit to see if the MDI read completed */ 40842439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < 64; i++) { 40852439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 40862439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = E1000_READ_REG(hw, MDIC); 40872439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mdic & E1000_MDIC_READY) 40882439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 40892439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40902439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(mdic & E1000_MDIC_READY)) { 40912439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("MDI Read did not complete\n"); 40922439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 40932439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40942439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mdic & E1000_MDIC_ERROR) { 40952439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("MDI Error\n"); 40962439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 40972439e4bfSJean-Christophe PLAGNIOL-VILLARD } 40982439e4bfSJean-Christophe PLAGNIOL-VILLARD *phy_data = (uint16_t) mdic; 40992439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 41002439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We must first send a preamble through the MDIO pin to signal the 41012439e4bfSJean-Christophe PLAGNIOL-VILLARD * beginning of an MII instruction. This is done by sending 32 41022439e4bfSJean-Christophe PLAGNIOL-VILLARD * consecutive "1" bits. 41032439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41042439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE); 41052439e4bfSJean-Christophe PLAGNIOL-VILLARD 41062439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now combine the next few fields that are required for a read 41072439e4bfSJean-Christophe PLAGNIOL-VILLARD * operation. We use this method instead of calling the 41082439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_shift_out_mdi_bits routine five different times. The format of 41092439e4bfSJean-Christophe PLAGNIOL-VILLARD * a MII read instruction consists of a shift out of 14 bits and is 41102439e4bfSJean-Christophe PLAGNIOL-VILLARD * defined as follows: 41112439e4bfSJean-Christophe PLAGNIOL-VILLARD * <Preamble><SOF><Op Code><Phy Addr><Reg Addr> 41122439e4bfSJean-Christophe PLAGNIOL-VILLARD * followed by a shift in of 18 bits. This first two bits shifted in 41132439e4bfSJean-Christophe PLAGNIOL-VILLARD * are TurnAround bits used to avoid contention on the MDIO pin when a 41142439e4bfSJean-Christophe PLAGNIOL-VILLARD * READ operation is performed. These two bits are thrown away 41152439e4bfSJean-Christophe PLAGNIOL-VILLARD * followed by a shift in of 16 bits which contains the desired data. 41162439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41172439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = ((reg_addr) | (phy_addr << 5) | 41182439e4bfSJean-Christophe PLAGNIOL-VILLARD (PHY_OP_READ << 10) | (PHY_SOF << 12)); 41192439e4bfSJean-Christophe PLAGNIOL-VILLARD 41202439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, mdic, 14); 41212439e4bfSJean-Christophe PLAGNIOL-VILLARD 41222439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now that we've shifted out the read command to the MII, we need to 41232439e4bfSJean-Christophe PLAGNIOL-VILLARD * "shift in" the 16-bit value (18 total bits) of the requested PHY 41242439e4bfSJean-Christophe PLAGNIOL-VILLARD * register address. 41252439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41262439e4bfSJean-Christophe PLAGNIOL-VILLARD *phy_data = e1000_shift_in_mdi_bits(hw); 41272439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41282439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 41292439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41302439e4bfSJean-Christophe PLAGNIOL-VILLARD 41312439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 41322439e4bfSJean-Christophe PLAGNIOL-VILLARD * Writes a value to a PHY register 41332439e4bfSJean-Christophe PLAGNIOL-VILLARD * 41342439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 41352439e4bfSJean-Christophe PLAGNIOL-VILLARD * reg_addr - address of the PHY register to write 41362439e4bfSJean-Christophe PLAGNIOL-VILLARD * data - data to write to the PHY 41372439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 41382439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 41392439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t phy_data) 41402439e4bfSJean-Christophe PLAGNIOL-VILLARD { 41412439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t i; 41422439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t mdic = 0; 41432439e4bfSJean-Christophe PLAGNIOL-VILLARD const uint32_t phy_addr = 1; 41442439e4bfSJean-Christophe PLAGNIOL-VILLARD 41452439e4bfSJean-Christophe PLAGNIOL-VILLARD if (reg_addr > MAX_PHY_REG_ADDRESS) { 41462439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY Address %d is out of range\n", reg_addr); 41472439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PARAM; 41482439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41492439e4bfSJean-Christophe PLAGNIOL-VILLARD 41502439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 41512439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set up Op-code, Phy Address, register address, and data intended 41522439e4bfSJean-Christophe PLAGNIOL-VILLARD * for the PHY register in the MDI Control register. The MAC will take 41532439e4bfSJean-Christophe PLAGNIOL-VILLARD * care of interfacing with the PHY to send the desired data. 41542439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41552439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = (((uint32_t) phy_data) | 41562439e4bfSJean-Christophe PLAGNIOL-VILLARD (reg_addr << E1000_MDIC_REG_SHIFT) | 41572439e4bfSJean-Christophe PLAGNIOL-VILLARD (phy_addr << E1000_MDIC_PHY_SHIFT) | 41582439e4bfSJean-Christophe PLAGNIOL-VILLARD (E1000_MDIC_OP_WRITE)); 41592439e4bfSJean-Christophe PLAGNIOL-VILLARD 41602439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, MDIC, mdic); 41612439e4bfSJean-Christophe PLAGNIOL-VILLARD 41622439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Poll the ready bit to see if the MDI read completed */ 41632439e4bfSJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < 64; i++) { 41642439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); 41652439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = E1000_READ_REG(hw, MDIC); 41662439e4bfSJean-Christophe PLAGNIOL-VILLARD if (mdic & E1000_MDIC_READY) 41672439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 41682439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41692439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(mdic & E1000_MDIC_READY)) { 41702439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("MDI Write did not complete\n"); 41712439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 41722439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41732439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 41742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* We'll need to use the SW defined pins to shift the write command 41752439e4bfSJean-Christophe PLAGNIOL-VILLARD * out to the PHY. We first send a preamble to the PHY to signal the 41762439e4bfSJean-Christophe PLAGNIOL-VILLARD * beginning of the MII instruction. This is done by sending 32 41772439e4bfSJean-Christophe PLAGNIOL-VILLARD * consecutive "1" bits. 41782439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41792439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, PHY_PREAMBLE, PHY_PREAMBLE_SIZE); 41802439e4bfSJean-Christophe PLAGNIOL-VILLARD 41812439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Now combine the remaining required fields that will indicate a 41822439e4bfSJean-Christophe PLAGNIOL-VILLARD * write operation. We use this method instead of calling the 41832439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_shift_out_mdi_bits routine for each field in the command. The 41842439e4bfSJean-Christophe PLAGNIOL-VILLARD * format of a MII write instruction is as follows: 41852439e4bfSJean-Christophe PLAGNIOL-VILLARD * <Preamble><SOF><Op Code><Phy Addr><Reg Addr><Turnaround><Data>. 41862439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 41872439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic = ((PHY_TURNAROUND) | (reg_addr << 2) | (phy_addr << 7) | 41882439e4bfSJean-Christophe PLAGNIOL-VILLARD (PHY_OP_WRITE << 12) | (PHY_SOF << 14)); 41892439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic <<= 16; 41902439e4bfSJean-Christophe PLAGNIOL-VILLARD mdic |= (uint32_t) phy_data; 41912439e4bfSJean-Christophe PLAGNIOL-VILLARD 41922439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_shift_out_mdi_bits(hw, mdic, 32); 41932439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41942439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 41952439e4bfSJean-Christophe PLAGNIOL-VILLARD } 41962439e4bfSJean-Christophe PLAGNIOL-VILLARD 41972439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 4198aa070789SRoy Zang * Checks if PHY reset is blocked due to SOL/IDER session, for example. 4199aa070789SRoy Zang * Returning E1000_BLK_PHY_RESET isn't necessarily an error. But it's up to 4200aa070789SRoy Zang * the caller to figure out how to deal with it. 4201aa070789SRoy Zang * 4202aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 4203aa070789SRoy Zang * 4204aa070789SRoy Zang * returns: - E1000_BLK_PHY_RESET 4205aa070789SRoy Zang * E1000_SUCCESS 4206aa070789SRoy Zang * 4207aa070789SRoy Zang *****************************************************************************/ 4208aa070789SRoy Zang int32_t 4209aa070789SRoy Zang e1000_check_phy_reset_block(struct e1000_hw *hw) 4210aa070789SRoy Zang { 4211aa070789SRoy Zang uint32_t manc = 0; 4212aa070789SRoy Zang uint32_t fwsm = 0; 4213aa070789SRoy Zang 4214aa070789SRoy Zang if (hw->mac_type == e1000_ich8lan) { 4215aa070789SRoy Zang fwsm = E1000_READ_REG(hw, FWSM); 4216aa070789SRoy Zang return (fwsm & E1000_FWSM_RSPCIPHY) ? E1000_SUCCESS 4217aa070789SRoy Zang : E1000_BLK_PHY_RESET; 4218aa070789SRoy Zang } 4219aa070789SRoy Zang 4220aa070789SRoy Zang if (hw->mac_type > e1000_82547_rev_2) 4221aa070789SRoy Zang manc = E1000_READ_REG(hw, MANC); 4222aa070789SRoy Zang return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ? 4223aa070789SRoy Zang E1000_BLK_PHY_RESET : E1000_SUCCESS; 4224aa070789SRoy Zang } 4225aa070789SRoy Zang 4226aa070789SRoy Zang /*************************************************************************** 4227aa070789SRoy Zang * Checks if the PHY configuration is done 4228aa070789SRoy Zang * 4229aa070789SRoy Zang * hw: Struct containing variables accessed by shared code 4230aa070789SRoy Zang * 4231aa070789SRoy Zang * returns: - E1000_ERR_RESET if fail to reset MAC 4232aa070789SRoy Zang * E1000_SUCCESS at any other case. 4233aa070789SRoy Zang * 4234aa070789SRoy Zang ***************************************************************************/ 4235aa070789SRoy Zang static int32_t 4236aa070789SRoy Zang e1000_get_phy_cfg_done(struct e1000_hw *hw) 4237aa070789SRoy Zang { 4238aa070789SRoy Zang int32_t timeout = PHY_CFG_TIMEOUT; 4239aa070789SRoy Zang uint32_t cfg_mask = E1000_EEPROM_CFG_DONE; 4240aa070789SRoy Zang 4241aa070789SRoy Zang DEBUGFUNC(); 4242aa070789SRoy Zang 4243aa070789SRoy Zang switch (hw->mac_type) { 4244aa070789SRoy Zang default: 4245aa070789SRoy Zang mdelay(10); 4246aa070789SRoy Zang break; 4247987b43a1SKyle Moffett 4248aa070789SRoy Zang case e1000_80003es2lan: 4249aa070789SRoy Zang /* Separate *_CFG_DONE_* bit for each port */ 4250987b43a1SKyle Moffett if (e1000_is_second_port(hw)) 4251aa070789SRoy Zang cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1; 4252aa070789SRoy Zang /* Fall Through */ 4253987b43a1SKyle Moffett 4254aa070789SRoy Zang case e1000_82571: 4255aa070789SRoy Zang case e1000_82572: 4256aa070789SRoy Zang while (timeout) { 4257aa070789SRoy Zang if (E1000_READ_REG(hw, EEMNGCTL) & cfg_mask) 4258aa070789SRoy Zang break; 4259aa070789SRoy Zang else 4260aa070789SRoy Zang mdelay(1); 4261aa070789SRoy Zang timeout--; 4262aa070789SRoy Zang } 4263aa070789SRoy Zang if (!timeout) { 4264aa070789SRoy Zang DEBUGOUT("MNG configuration cycle has not " 4265aa070789SRoy Zang "completed.\n"); 4266aa070789SRoy Zang return -E1000_ERR_RESET; 4267aa070789SRoy Zang } 4268aa070789SRoy Zang break; 4269aa070789SRoy Zang } 4270aa070789SRoy Zang 4271aa070789SRoy Zang return E1000_SUCCESS; 4272aa070789SRoy Zang } 4273aa070789SRoy Zang 4274aa070789SRoy Zang /****************************************************************************** 42752439e4bfSJean-Christophe PLAGNIOL-VILLARD * Returns the PHY to the power-on reset state 42762439e4bfSJean-Christophe PLAGNIOL-VILLARD * 42772439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 42782439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 4279aa070789SRoy Zang int32_t 42802439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_phy_hw_reset(struct e1000_hw *hw) 42812439e4bfSJean-Christophe PLAGNIOL-VILLARD { 4282987b43a1SKyle Moffett uint16_t swfw = E1000_SWFW_PHY0_SM; 4283aa070789SRoy Zang uint32_t ctrl, ctrl_ext; 4284aa070789SRoy Zang uint32_t led_ctrl; 4285aa070789SRoy Zang int32_t ret_val; 42862439e4bfSJean-Christophe PLAGNIOL-VILLARD 42872439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 42882439e4bfSJean-Christophe PLAGNIOL-VILLARD 4289aa070789SRoy Zang /* In the case of the phy reset being blocked, it's not an error, we 4290aa070789SRoy Zang * simply return success without performing the reset. */ 4291aa070789SRoy Zang ret_val = e1000_check_phy_reset_block(hw); 4292aa070789SRoy Zang if (ret_val) 4293aa070789SRoy Zang return E1000_SUCCESS; 4294aa070789SRoy Zang 42952439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Resetting Phy...\n"); 42962439e4bfSJean-Christophe PLAGNIOL-VILLARD 42972439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type > e1000_82543) { 4298987b43a1SKyle Moffett if (e1000_is_second_port(hw)) 4299aa070789SRoy Zang swfw = E1000_SWFW_PHY1_SM; 4300987b43a1SKyle Moffett 4301aa070789SRoy Zang if (e1000_swfw_sync_acquire(hw, swfw)) { 4302aa070789SRoy Zang DEBUGOUT("Unable to acquire swfw sync\n"); 4303aa070789SRoy Zang return -E1000_ERR_SWFW_SYNC; 4304aa070789SRoy Zang } 4305987b43a1SKyle Moffett 43062439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the device control register and assert the E1000_CTRL_PHY_RST 43072439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit. Then, take it out of reset. 43082439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 43092439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl = E1000_READ_REG(hw, CTRL); 43102439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST); 43112439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 4312aa070789SRoy Zang 4313aa070789SRoy Zang if (hw->mac_type < e1000_82571) 4314aa070789SRoy Zang udelay(10); 4315aa070789SRoy Zang else 4316aa070789SRoy Zang udelay(100); 4317aa070789SRoy Zang 43182439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, ctrl); 43192439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 4320aa070789SRoy Zang 4321aa070789SRoy Zang if (hw->mac_type >= e1000_82571) 4322aa070789SRoy Zang mdelay(10); 4323aa070789SRoy Zang 43242439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 43252439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the Extended Device Control Register, assert the PHY_RESET_DIR 43262439e4bfSJean-Christophe PLAGNIOL-VILLARD * bit to put the PHY into reset. Then, take it out of reset. 43272439e4bfSJean-Christophe PLAGNIOL-VILLARD */ 43282439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 43292439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext |= E1000_CTRL_EXT_SDP4_DIR; 43302439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext &= ~E1000_CTRL_EXT_SDP4_DATA; 43312439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 43322439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 43332439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 43342439e4bfSJean-Christophe PLAGNIOL-VILLARD ctrl_ext |= E1000_CTRL_EXT_SDP4_DATA; 43352439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 43362439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_FLUSH(hw); 43372439e4bfSJean-Christophe PLAGNIOL-VILLARD } 43382439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(150); 4339aa070789SRoy Zang 4340aa070789SRoy Zang if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { 4341aa070789SRoy Zang /* Configure activity LED after PHY reset */ 4342aa070789SRoy Zang led_ctrl = E1000_READ_REG(hw, LEDCTL); 4343aa070789SRoy Zang led_ctrl &= IGP_ACTIVITY_LED_MASK; 4344aa070789SRoy Zang led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); 4345aa070789SRoy Zang E1000_WRITE_REG(hw, LEDCTL, led_ctrl); 4346aa070789SRoy Zang } 4347aa070789SRoy Zang 4348aa070789SRoy Zang /* Wait for FW to finish PHY configuration. */ 4349aa070789SRoy Zang ret_val = e1000_get_phy_cfg_done(hw); 4350aa070789SRoy Zang if (ret_val != E1000_SUCCESS) 4351aa070789SRoy Zang return ret_val; 4352aa070789SRoy Zang 4353aa070789SRoy Zang return ret_val; 4354aa070789SRoy Zang } 4355aa070789SRoy Zang 4356aa070789SRoy Zang /****************************************************************************** 4357aa070789SRoy Zang * IGP phy init script - initializes the GbE PHY 4358aa070789SRoy Zang * 4359aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 4360aa070789SRoy Zang *****************************************************************************/ 4361aa070789SRoy Zang static void 4362aa070789SRoy Zang e1000_phy_init_script(struct e1000_hw *hw) 4363aa070789SRoy Zang { 4364aa070789SRoy Zang uint32_t ret_val; 4365aa070789SRoy Zang uint16_t phy_saved_data; 4366aa070789SRoy Zang DEBUGFUNC(); 4367aa070789SRoy Zang 4368aa070789SRoy Zang if (hw->phy_init_script) { 4369aa070789SRoy Zang mdelay(20); 4370aa070789SRoy Zang 4371aa070789SRoy Zang /* Save off the current value of register 0x2F5B to be 4372aa070789SRoy Zang * restored at the end of this routine. */ 4373aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data); 4374aa070789SRoy Zang 4375aa070789SRoy Zang /* Disabled the PHY transmitter */ 4376aa070789SRoy Zang e1000_write_phy_reg(hw, 0x2F5B, 0x0003); 4377aa070789SRoy Zang 4378aa070789SRoy Zang mdelay(20); 4379aa070789SRoy Zang 4380aa070789SRoy Zang e1000_write_phy_reg(hw, 0x0000, 0x0140); 4381aa070789SRoy Zang 4382aa070789SRoy Zang mdelay(5); 4383aa070789SRoy Zang 4384aa070789SRoy Zang switch (hw->mac_type) { 4385aa070789SRoy Zang case e1000_82541: 4386aa070789SRoy Zang case e1000_82547: 4387aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F95, 0x0001); 4388aa070789SRoy Zang 4389aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F71, 0xBD21); 4390aa070789SRoy Zang 4391aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F79, 0x0018); 4392aa070789SRoy Zang 4393aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F30, 0x1600); 4394aa070789SRoy Zang 4395aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F31, 0x0014); 4396aa070789SRoy Zang 4397aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F32, 0x161C); 4398aa070789SRoy Zang 4399aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F94, 0x0003); 4400aa070789SRoy Zang 4401aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F96, 0x003F); 4402aa070789SRoy Zang 4403aa070789SRoy Zang e1000_write_phy_reg(hw, 0x2010, 0x0008); 4404aa070789SRoy Zang break; 4405aa070789SRoy Zang 4406aa070789SRoy Zang case e1000_82541_rev_2: 4407aa070789SRoy Zang case e1000_82547_rev_2: 4408aa070789SRoy Zang e1000_write_phy_reg(hw, 0x1F73, 0x0099); 4409aa070789SRoy Zang break; 4410aa070789SRoy Zang default: 4411aa070789SRoy Zang break; 4412aa070789SRoy Zang } 4413aa070789SRoy Zang 4414aa070789SRoy Zang e1000_write_phy_reg(hw, 0x0000, 0x3300); 4415aa070789SRoy Zang 4416aa070789SRoy Zang mdelay(20); 4417aa070789SRoy Zang 4418aa070789SRoy Zang /* Now enable the transmitter */ 441956b13b1eSZang Roy-R61911 if (!ret_val) 4420aa070789SRoy Zang e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data); 4421aa070789SRoy Zang 4422aa070789SRoy Zang if (hw->mac_type == e1000_82547) { 4423aa070789SRoy Zang uint16_t fused, fine, coarse; 4424aa070789SRoy Zang 4425aa070789SRoy Zang /* Move to analog registers page */ 4426aa070789SRoy Zang e1000_read_phy_reg(hw, 4427aa070789SRoy Zang IGP01E1000_ANALOG_SPARE_FUSE_STATUS, &fused); 4428aa070789SRoy Zang 4429aa070789SRoy Zang if (!(fused & IGP01E1000_ANALOG_SPARE_FUSE_ENABLED)) { 4430aa070789SRoy Zang e1000_read_phy_reg(hw, 4431aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_STATUS, &fused); 4432aa070789SRoy Zang 4433aa070789SRoy Zang fine = fused & IGP01E1000_ANALOG_FUSE_FINE_MASK; 4434aa070789SRoy Zang coarse = fused 4435aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_COARSE_MASK; 4436aa070789SRoy Zang 4437aa070789SRoy Zang if (coarse > 4438aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_COARSE_THRESH) { 4439aa070789SRoy Zang coarse -= 4440aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_COARSE_10; 4441aa070789SRoy Zang fine -= IGP01E1000_ANALOG_FUSE_FINE_1; 4442aa070789SRoy Zang } else if (coarse 4443aa070789SRoy Zang == IGP01E1000_ANALOG_FUSE_COARSE_THRESH) 4444aa070789SRoy Zang fine -= IGP01E1000_ANALOG_FUSE_FINE_10; 4445aa070789SRoy Zang 4446aa070789SRoy Zang fused = (fused 4447aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_POLY_MASK) | 4448aa070789SRoy Zang (fine 4449aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_FINE_MASK) | 4450aa070789SRoy Zang (coarse 4451aa070789SRoy Zang & IGP01E1000_ANALOG_FUSE_COARSE_MASK); 4452aa070789SRoy Zang 4453aa070789SRoy Zang e1000_write_phy_reg(hw, 4454aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_CONTROL, fused); 4455aa070789SRoy Zang e1000_write_phy_reg(hw, 4456aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_BYPASS, 4457aa070789SRoy Zang IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL); 4458aa070789SRoy Zang } 4459aa070789SRoy Zang } 4460aa070789SRoy Zang } 44612439e4bfSJean-Christophe PLAGNIOL-VILLARD } 44622439e4bfSJean-Christophe PLAGNIOL-VILLARD 44632439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 44642439e4bfSJean-Christophe PLAGNIOL-VILLARD * Resets the PHY 44652439e4bfSJean-Christophe PLAGNIOL-VILLARD * 44662439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 44672439e4bfSJean-Christophe PLAGNIOL-VILLARD * 4468aa070789SRoy Zang * Sets bit 15 of the MII Control register 44692439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 4470aa070789SRoy Zang int32_t 44712439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_phy_reset(struct e1000_hw *hw) 44722439e4bfSJean-Christophe PLAGNIOL-VILLARD { 4473aa070789SRoy Zang int32_t ret_val; 44742439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_data; 44752439e4bfSJean-Christophe PLAGNIOL-VILLARD 44762439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 44772439e4bfSJean-Christophe PLAGNIOL-VILLARD 4478aa070789SRoy Zang /* In the case of the phy reset being blocked, it's not an error, we 4479aa070789SRoy Zang * simply return success without performing the reset. */ 4480aa070789SRoy Zang ret_val = e1000_check_phy_reset_block(hw); 4481aa070789SRoy Zang if (ret_val) 4482aa070789SRoy Zang return E1000_SUCCESS; 4483aa070789SRoy Zang 4484aa070789SRoy Zang switch (hw->phy_type) { 4485aa070789SRoy Zang case e1000_phy_igp: 4486aa070789SRoy Zang case e1000_phy_igp_2: 4487aa070789SRoy Zang case e1000_phy_igp_3: 4488aa070789SRoy Zang case e1000_phy_ife: 4489aa070789SRoy Zang ret_val = e1000_phy_hw_reset(hw); 4490aa070789SRoy Zang if (ret_val) 4491aa070789SRoy Zang return ret_val; 4492aa070789SRoy Zang break; 4493aa070789SRoy Zang default: 4494aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data); 4495aa070789SRoy Zang if (ret_val) 4496aa070789SRoy Zang return ret_val; 4497aa070789SRoy Zang 44982439e4bfSJean-Christophe PLAGNIOL-VILLARD phy_data |= MII_CR_RESET; 4499aa070789SRoy Zang ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data); 4500aa070789SRoy Zang if (ret_val) 4501aa070789SRoy Zang return ret_val; 4502aa070789SRoy Zang 45032439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(1); 4504aa070789SRoy Zang break; 4505aa070789SRoy Zang } 4506aa070789SRoy Zang 4507aa070789SRoy Zang if (hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2) 4508aa070789SRoy Zang e1000_phy_init_script(hw); 4509aa070789SRoy Zang 4510aa070789SRoy Zang return E1000_SUCCESS; 45112439e4bfSJean-Christophe PLAGNIOL-VILLARD } 45122439e4bfSJean-Christophe PLAGNIOL-VILLARD 45131aeed8d7SWolfgang Denk static int e1000_set_phy_type (struct e1000_hw *hw) 4514ac3315c2SAndre Schwarz { 4515ac3315c2SAndre Schwarz DEBUGFUNC (); 4516ac3315c2SAndre Schwarz 4517ac3315c2SAndre Schwarz if (hw->mac_type == e1000_undefined) 4518ac3315c2SAndre Schwarz return -E1000_ERR_PHY_TYPE; 4519ac3315c2SAndre Schwarz 4520ac3315c2SAndre Schwarz switch (hw->phy_id) { 4521ac3315c2SAndre Schwarz case M88E1000_E_PHY_ID: 4522ac3315c2SAndre Schwarz case M88E1000_I_PHY_ID: 4523ac3315c2SAndre Schwarz case M88E1011_I_PHY_ID: 4524aa070789SRoy Zang case M88E1111_I_PHY_ID: 4525ac3315c2SAndre Schwarz hw->phy_type = e1000_phy_m88; 4526ac3315c2SAndre Schwarz break; 4527ac3315c2SAndre Schwarz case IGP01E1000_I_PHY_ID: 4528ac3315c2SAndre Schwarz if (hw->mac_type == e1000_82541 || 4529aa070789SRoy Zang hw->mac_type == e1000_82541_rev_2 || 4530aa070789SRoy Zang hw->mac_type == e1000_82547 || 4531aa070789SRoy Zang hw->mac_type == e1000_82547_rev_2) { 4532ac3315c2SAndre Schwarz hw->phy_type = e1000_phy_igp; 4533aa070789SRoy Zang hw->phy_type = e1000_phy_igp; 4534aa070789SRoy Zang break; 4535aa070789SRoy Zang } 4536aa070789SRoy Zang case IGP03E1000_E_PHY_ID: 4537aa070789SRoy Zang hw->phy_type = e1000_phy_igp_3; 4538aa070789SRoy Zang break; 4539aa070789SRoy Zang case IFE_E_PHY_ID: 4540aa070789SRoy Zang case IFE_PLUS_E_PHY_ID: 4541aa070789SRoy Zang case IFE_C_E_PHY_ID: 4542aa070789SRoy Zang hw->phy_type = e1000_phy_ife; 4543aa070789SRoy Zang break; 4544aa070789SRoy Zang case GG82563_E_PHY_ID: 4545aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) { 4546aa070789SRoy Zang hw->phy_type = e1000_phy_gg82563; 4547ac3315c2SAndre Schwarz break; 4548ac3315c2SAndre Schwarz } 45492c2668f9SRoy Zang case BME1000_E_PHY_ID: 45502c2668f9SRoy Zang hw->phy_type = e1000_phy_bm; 45512c2668f9SRoy Zang break; 4552ac3315c2SAndre Schwarz /* Fall Through */ 4553ac3315c2SAndre Schwarz default: 4554ac3315c2SAndre Schwarz /* Should never have loaded on this device */ 4555ac3315c2SAndre Schwarz hw->phy_type = e1000_phy_undefined; 4556ac3315c2SAndre Schwarz return -E1000_ERR_PHY_TYPE; 4557ac3315c2SAndre Schwarz } 4558ac3315c2SAndre Schwarz 4559ac3315c2SAndre Schwarz return E1000_SUCCESS; 4560ac3315c2SAndre Schwarz } 4561ac3315c2SAndre Schwarz 45622439e4bfSJean-Christophe PLAGNIOL-VILLARD /****************************************************************************** 45632439e4bfSJean-Christophe PLAGNIOL-VILLARD * Probes the expected PHY address for known PHY IDs 45642439e4bfSJean-Christophe PLAGNIOL-VILLARD * 45652439e4bfSJean-Christophe PLAGNIOL-VILLARD * hw - Struct containing variables accessed by shared code 45662439e4bfSJean-Christophe PLAGNIOL-VILLARD ******************************************************************************/ 4567aa070789SRoy Zang static int32_t 45682439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_detect_gig_phy(struct e1000_hw *hw) 45692439e4bfSJean-Christophe PLAGNIOL-VILLARD { 4570aa070789SRoy Zang int32_t phy_init_status, ret_val; 45712439e4bfSJean-Christophe PLAGNIOL-VILLARD uint16_t phy_id_high, phy_id_low; 4572aa070789SRoy Zang boolean_t match = FALSE; 45732439e4bfSJean-Christophe PLAGNIOL-VILLARD 45742439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGFUNC(); 45752439e4bfSJean-Christophe PLAGNIOL-VILLARD 4576aa070789SRoy Zang /* The 82571 firmware may still be configuring the PHY. In this 4577aa070789SRoy Zang * case, we cannot access the PHY until the configuration is done. So 4578aa070789SRoy Zang * we explicitly set the PHY values. */ 4579aa070789SRoy Zang if (hw->mac_type == e1000_82571 || 4580aa070789SRoy Zang hw->mac_type == e1000_82572) { 4581aa070789SRoy Zang hw->phy_id = IGP01E1000_I_PHY_ID; 4582aa070789SRoy Zang hw->phy_type = e1000_phy_igp_2; 4583aa070789SRoy Zang return E1000_SUCCESS; 4584aa070789SRoy Zang } 4585aa070789SRoy Zang 4586aa070789SRoy Zang /* ESB-2 PHY reads require e1000_phy_gg82563 to be set because of a 4587aa070789SRoy Zang * work- around that forces PHY page 0 to be set or the reads fail. 4588aa070789SRoy Zang * The rest of the code in this routine uses e1000_read_phy_reg to 4589aa070789SRoy Zang * read the PHY ID. So for ESB-2 we need to have this set so our 4590aa070789SRoy Zang * reads won't fail. If the attached PHY is not a e1000_phy_gg82563, 4591aa070789SRoy Zang * the routines below will figure this out as well. */ 4592aa070789SRoy Zang if (hw->mac_type == e1000_80003es2lan) 4593aa070789SRoy Zang hw->phy_type = e1000_phy_gg82563; 4594aa070789SRoy Zang 45952439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Read the PHY ID Registers to identify which PHY is onboard. */ 4596aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high); 4597aa070789SRoy Zang if (ret_val) 4598aa070789SRoy Zang return ret_val; 4599aa070789SRoy Zang 46002439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->phy_id = (uint32_t) (phy_id_high << 16); 4601aa070789SRoy Zang udelay(20); 4602aa070789SRoy Zang ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low); 4603aa070789SRoy Zang if (ret_val) 4604aa070789SRoy Zang return ret_val; 4605aa070789SRoy Zang 46062439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->phy_id |= (uint32_t) (phy_id_low & PHY_REVISION_MASK); 4607aa070789SRoy Zang hw->phy_revision = (uint32_t) phy_id_low & ~PHY_REVISION_MASK; 46082439e4bfSJean-Christophe PLAGNIOL-VILLARD 46092439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->mac_type) { 46102439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82543: 46112439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->phy_id == M88E1000_E_PHY_ID) 46122439e4bfSJean-Christophe PLAGNIOL-VILLARD match = TRUE; 46132439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 46142439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82544: 46152439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->phy_id == M88E1000_I_PHY_ID) 46162439e4bfSJean-Christophe PLAGNIOL-VILLARD match = TRUE; 46172439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 46182439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82540: 46192439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82545: 4620aa070789SRoy Zang case e1000_82545_rev_3: 46212439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82546: 4622aa070789SRoy Zang case e1000_82546_rev_3: 46232439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->phy_id == M88E1011_I_PHY_ID) 46242439e4bfSJean-Christophe PLAGNIOL-VILLARD match = TRUE; 46252439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 4626aa070789SRoy Zang case e1000_82541: 4627ac3315c2SAndre Schwarz case e1000_82541_rev_2: 4628aa070789SRoy Zang case e1000_82547: 4629aa070789SRoy Zang case e1000_82547_rev_2: 4630ac3315c2SAndre Schwarz if(hw->phy_id == IGP01E1000_I_PHY_ID) 4631ac3315c2SAndre Schwarz match = TRUE; 4632ac3315c2SAndre Schwarz 4633ac3315c2SAndre Schwarz break; 4634aa070789SRoy Zang case e1000_82573: 4635aa070789SRoy Zang if (hw->phy_id == M88E1111_I_PHY_ID) 4636aa070789SRoy Zang match = TRUE; 4637aa070789SRoy Zang break; 46382c2668f9SRoy Zang case e1000_82574: 46392c2668f9SRoy Zang if (hw->phy_id == BME1000_E_PHY_ID) 46402c2668f9SRoy Zang match = TRUE; 46412c2668f9SRoy Zang break; 4642aa070789SRoy Zang case e1000_80003es2lan: 4643aa070789SRoy Zang if (hw->phy_id == GG82563_E_PHY_ID) 4644aa070789SRoy Zang match = TRUE; 4645aa070789SRoy Zang break; 4646aa070789SRoy Zang case e1000_ich8lan: 4647aa070789SRoy Zang if (hw->phy_id == IGP03E1000_E_PHY_ID) 4648aa070789SRoy Zang match = TRUE; 4649aa070789SRoy Zang if (hw->phy_id == IFE_E_PHY_ID) 4650aa070789SRoy Zang match = TRUE; 4651aa070789SRoy Zang if (hw->phy_id == IFE_PLUS_E_PHY_ID) 4652aa070789SRoy Zang match = TRUE; 4653aa070789SRoy Zang if (hw->phy_id == IFE_C_E_PHY_ID) 4654aa070789SRoy Zang match = TRUE; 4655aa070789SRoy Zang break; 46562439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 46572439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Invalid MAC type %d\n", hw->mac_type); 46582439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_CONFIG; 46592439e4bfSJean-Christophe PLAGNIOL-VILLARD } 4660ac3315c2SAndre Schwarz 4661ac3315c2SAndre Schwarz phy_init_status = e1000_set_phy_type(hw); 4662ac3315c2SAndre Schwarz 4663ac3315c2SAndre Schwarz if ((match) && (phy_init_status == E1000_SUCCESS)) { 46642439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("PHY ID 0x%X detected\n", hw->phy_id); 46652439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 46662439e4bfSJean-Christophe PLAGNIOL-VILLARD } 46672439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("Invalid PHY ID 0x%X\n", hw->phy_id); 46682439e4bfSJean-Christophe PLAGNIOL-VILLARD return -E1000_ERR_PHY; 46692439e4bfSJean-Christophe PLAGNIOL-VILLARD } 46702439e4bfSJean-Christophe PLAGNIOL-VILLARD 4671aa070789SRoy Zang /***************************************************************************** 4672aa070789SRoy Zang * Set media type and TBI compatibility. 4673aa070789SRoy Zang * 4674aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 4675aa070789SRoy Zang * **************************************************************************/ 4676aa070789SRoy Zang void 4677aa070789SRoy Zang e1000_set_media_type(struct e1000_hw *hw) 4678aa070789SRoy Zang { 4679aa070789SRoy Zang uint32_t status; 4680aa070789SRoy Zang 4681aa070789SRoy Zang DEBUGFUNC(); 4682aa070789SRoy Zang 4683aa070789SRoy Zang if (hw->mac_type != e1000_82543) { 4684aa070789SRoy Zang /* tbi_compatibility is only valid on 82543 */ 4685aa070789SRoy Zang hw->tbi_compatibility_en = FALSE; 4686aa070789SRoy Zang } 4687aa070789SRoy Zang 4688aa070789SRoy Zang switch (hw->device_id) { 4689aa070789SRoy Zang case E1000_DEV_ID_82545GM_SERDES: 4690aa070789SRoy Zang case E1000_DEV_ID_82546GB_SERDES: 4691aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES: 4692aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_DUAL: 4693aa070789SRoy Zang case E1000_DEV_ID_82571EB_SERDES_QUAD: 4694aa070789SRoy Zang case E1000_DEV_ID_82572EI_SERDES: 4695aa070789SRoy Zang case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: 4696aa070789SRoy Zang hw->media_type = e1000_media_type_internal_serdes; 4697aa070789SRoy Zang break; 4698aa070789SRoy Zang default: 4699aa070789SRoy Zang switch (hw->mac_type) { 4700aa070789SRoy Zang case e1000_82542_rev2_0: 4701aa070789SRoy Zang case e1000_82542_rev2_1: 4702aa070789SRoy Zang hw->media_type = e1000_media_type_fiber; 4703aa070789SRoy Zang break; 4704aa070789SRoy Zang case e1000_ich8lan: 4705aa070789SRoy Zang case e1000_82573: 47062c2668f9SRoy Zang case e1000_82574: 4707aa070789SRoy Zang /* The STATUS_TBIMODE bit is reserved or reused 4708aa070789SRoy Zang * for the this device. 4709aa070789SRoy Zang */ 4710aa070789SRoy Zang hw->media_type = e1000_media_type_copper; 4711aa070789SRoy Zang break; 4712aa070789SRoy Zang default: 4713aa070789SRoy Zang status = E1000_READ_REG(hw, STATUS); 4714aa070789SRoy Zang if (status & E1000_STATUS_TBIMODE) { 4715aa070789SRoy Zang hw->media_type = e1000_media_type_fiber; 4716aa070789SRoy Zang /* tbi_compatibility not valid on fiber */ 4717aa070789SRoy Zang hw->tbi_compatibility_en = FALSE; 4718aa070789SRoy Zang } else { 4719aa070789SRoy Zang hw->media_type = e1000_media_type_copper; 4720aa070789SRoy Zang } 4721aa070789SRoy Zang break; 4722aa070789SRoy Zang } 4723aa070789SRoy Zang } 4724aa070789SRoy Zang } 4725aa070789SRoy Zang 47262439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 47272439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_sw_init - Initialize general software structures (struct e1000_adapter) 47282439e4bfSJean-Christophe PLAGNIOL-VILLARD * 47292439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_sw_init initializes the Adapter private data structure. 47302439e4bfSJean-Christophe PLAGNIOL-VILLARD * Fields are initialized based on PCI device information and 47312439e4bfSJean-Christophe PLAGNIOL-VILLARD * OS network device settings (MTU size). 47322439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 47332439e4bfSJean-Christophe PLAGNIOL-VILLARD 47342439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 4735d60626f8SKyle Moffett e1000_sw_init(struct eth_device *nic) 47362439e4bfSJean-Christophe PLAGNIOL-VILLARD { 47372439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = (typeof(hw)) nic->priv; 47382439e4bfSJean-Christophe PLAGNIOL-VILLARD int result; 47392439e4bfSJean-Christophe PLAGNIOL-VILLARD 47402439e4bfSJean-Christophe PLAGNIOL-VILLARD /* PCI config space info */ 47412439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_VENDOR_ID, &hw->vendor_id); 47422439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_DEVICE_ID, &hw->device_id); 47432439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_SUBSYSTEM_VENDOR_ID, 47442439e4bfSJean-Christophe PLAGNIOL-VILLARD &hw->subsystem_vendor_id); 47452439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_SUBSYSTEM_ID, &hw->subsystem_id); 47462439e4bfSJean-Christophe PLAGNIOL-VILLARD 47472439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_byte(hw->pdev, PCI_REVISION_ID, &hw->revision_id); 47482439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_read_config_word(hw->pdev, PCI_COMMAND, &hw->pci_cmd_word); 47492439e4bfSJean-Christophe PLAGNIOL-VILLARD 47502439e4bfSJean-Christophe PLAGNIOL-VILLARD /* identify the MAC */ 47512439e4bfSJean-Christophe PLAGNIOL-VILLARD result = e1000_set_mac_type(hw); 47522439e4bfSJean-Christophe PLAGNIOL-VILLARD if (result) { 4753d60626f8SKyle Moffett E1000_ERR(hw->nic, "Unknown MAC Type\n"); 47542439e4bfSJean-Christophe PLAGNIOL-VILLARD return result; 47552439e4bfSJean-Christophe PLAGNIOL-VILLARD } 47562439e4bfSJean-Christophe PLAGNIOL-VILLARD 4757aa070789SRoy Zang switch (hw->mac_type) { 4758aa070789SRoy Zang default: 4759aa070789SRoy Zang break; 4760aa070789SRoy Zang case e1000_82541: 4761aa070789SRoy Zang case e1000_82547: 4762aa070789SRoy Zang case e1000_82541_rev_2: 4763aa070789SRoy Zang case e1000_82547_rev_2: 4764aa070789SRoy Zang hw->phy_init_script = 1; 4765aa070789SRoy Zang break; 4766aa070789SRoy Zang } 4767aa070789SRoy Zang 47682439e4bfSJean-Christophe PLAGNIOL-VILLARD /* flow control settings */ 47692439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_high_water = E1000_FC_HIGH_THRESH; 47702439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_low_water = E1000_FC_LOW_THRESH; 47712439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_pause_time = E1000_FC_PAUSE_TIME; 47722439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc_send_xon = 1; 47732439e4bfSJean-Christophe PLAGNIOL-VILLARD 47742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Media type - copper or fiber */ 4775aa070789SRoy Zang e1000_set_media_type(hw); 47762439e4bfSJean-Christophe PLAGNIOL-VILLARD 47772439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82543) { 47782439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t status = E1000_READ_REG(hw, STATUS); 47792439e4bfSJean-Christophe PLAGNIOL-VILLARD 47802439e4bfSJean-Christophe PLAGNIOL-VILLARD if (status & E1000_STATUS_TBIMODE) { 47812439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("fiber interface\n"); 47822439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->media_type = e1000_media_type_fiber; 47832439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 47842439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("copper interface\n"); 47852439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->media_type = e1000_media_type_copper; 47862439e4bfSJean-Christophe PLAGNIOL-VILLARD } 47872439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 47882439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->media_type = e1000_media_type_fiber; 47892439e4bfSJean-Christophe PLAGNIOL-VILLARD } 47902439e4bfSJean-Christophe PLAGNIOL-VILLARD 4791aa070789SRoy Zang hw->tbi_compatibility_en = TRUE; 4792aa070789SRoy Zang hw->wait_autoneg_complete = TRUE; 47932439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type < e1000_82543) 47942439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->report_tx_early = 0; 47952439e4bfSJean-Christophe PLAGNIOL-VILLARD else 47962439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->report_tx_early = 1; 47972439e4bfSJean-Christophe PLAGNIOL-VILLARD 47982439e4bfSJean-Christophe PLAGNIOL-VILLARD return E1000_SUCCESS; 47992439e4bfSJean-Christophe PLAGNIOL-VILLARD } 48002439e4bfSJean-Christophe PLAGNIOL-VILLARD 48012439e4bfSJean-Christophe PLAGNIOL-VILLARD void 48022439e4bfSJean-Christophe PLAGNIOL-VILLARD fill_rx(struct e1000_hw *hw) 48032439e4bfSJean-Christophe PLAGNIOL-VILLARD { 48042439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_rx_desc *rd; 48052439e4bfSJean-Christophe PLAGNIOL-VILLARD 48062439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_last = rx_tail; 48072439e4bfSJean-Christophe PLAGNIOL-VILLARD rd = rx_base + rx_tail; 48082439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_tail = (rx_tail + 1) % 8; 48092439e4bfSJean-Christophe PLAGNIOL-VILLARD memset(rd, 0, 16); 48102439e4bfSJean-Christophe PLAGNIOL-VILLARD rd->buffer_addr = cpu_to_le64((u32) & packet); 48112439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDT, rx_tail); 48122439e4bfSJean-Christophe PLAGNIOL-VILLARD } 48132439e4bfSJean-Christophe PLAGNIOL-VILLARD 48142439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 48152439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_configure_tx - Configure 8254x Transmit Unit after Reset 48162439e4bfSJean-Christophe PLAGNIOL-VILLARD * @adapter: board private structure 48172439e4bfSJean-Christophe PLAGNIOL-VILLARD * 48182439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configure the Tx unit of the MAC after a reset. 48192439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 48202439e4bfSJean-Christophe PLAGNIOL-VILLARD 48212439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 48222439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_tx(struct e1000_hw *hw) 48232439e4bfSJean-Christophe PLAGNIOL-VILLARD { 48242439e4bfSJean-Christophe PLAGNIOL-VILLARD unsigned long ptr; 48252439e4bfSJean-Christophe PLAGNIOL-VILLARD unsigned long tctl; 4826aa070789SRoy Zang unsigned long tipg, tarc; 4827aa070789SRoy Zang uint32_t ipgr1, ipgr2; 48282439e4bfSJean-Christophe PLAGNIOL-VILLARD 48292439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (u32) tx_pool; 48302439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ptr & 0xf) 48312439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (ptr + 0x10) & (~0xf); 48322439e4bfSJean-Christophe PLAGNIOL-VILLARD 48332439e4bfSJean-Christophe PLAGNIOL-VILLARD tx_base = (typeof(tx_base)) ptr; 48342439e4bfSJean-Christophe PLAGNIOL-VILLARD 48352439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDBAL, (u32) tx_base); 48362439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDBAH, 0); 48372439e4bfSJean-Christophe PLAGNIOL-VILLARD 48382439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDLEN, 128); 48392439e4bfSJean-Christophe PLAGNIOL-VILLARD 48402439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the HW Tx Head and Tail descriptor pointers */ 48412439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDH, 0); 48422439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDT, 0); 48432439e4bfSJean-Christophe PLAGNIOL-VILLARD tx_tail = 0; 48442439e4bfSJean-Christophe PLAGNIOL-VILLARD 48452439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the default values for the Tx Inter Packet Gap timer */ 4846aa070789SRoy Zang if (hw->mac_type <= e1000_82547_rev_2 && 4847aa070789SRoy Zang (hw->media_type == e1000_media_type_fiber || 4848aa070789SRoy Zang hw->media_type == e1000_media_type_internal_serdes)) 4849aa070789SRoy Zang tipg = DEFAULT_82543_TIPG_IPGT_FIBER; 4850aa070789SRoy Zang else 4851aa070789SRoy Zang tipg = DEFAULT_82543_TIPG_IPGT_COPPER; 4852aa070789SRoy Zang 4853aa070789SRoy Zang /* Set the default values for the Tx Inter Packet Gap timer */ 48542439e4bfSJean-Christophe PLAGNIOL-VILLARD switch (hw->mac_type) { 48552439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82542_rev2_0: 48562439e4bfSJean-Christophe PLAGNIOL-VILLARD case e1000_82542_rev2_1: 48572439e4bfSJean-Christophe PLAGNIOL-VILLARD tipg = DEFAULT_82542_TIPG_IPGT; 4858aa070789SRoy Zang ipgr1 = DEFAULT_82542_TIPG_IPGR1; 4859aa070789SRoy Zang ipgr2 = DEFAULT_82542_TIPG_IPGR2; 4860aa070789SRoy Zang break; 4861aa070789SRoy Zang case e1000_80003es2lan: 4862aa070789SRoy Zang ipgr1 = DEFAULT_82543_TIPG_IPGR1; 4863aa070789SRoy Zang ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; 48642439e4bfSJean-Christophe PLAGNIOL-VILLARD break; 48652439e4bfSJean-Christophe PLAGNIOL-VILLARD default: 4866aa070789SRoy Zang ipgr1 = DEFAULT_82543_TIPG_IPGR1; 4867aa070789SRoy Zang ipgr2 = DEFAULT_82543_TIPG_IPGR2; 4868aa070789SRoy Zang break; 48692439e4bfSJean-Christophe PLAGNIOL-VILLARD } 4870aa070789SRoy Zang tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT; 4871aa070789SRoy Zang tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT; 48722439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TIPG, tipg); 48732439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Program the Transmit Control Register */ 48742439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl = E1000_READ_REG(hw, TCTL); 48752439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl &= ~E1000_TCTL_CT; 48762439e4bfSJean-Christophe PLAGNIOL-VILLARD tctl |= E1000_TCTL_EN | E1000_TCTL_PSP | 48772439e4bfSJean-Christophe PLAGNIOL-VILLARD (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT); 4878aa070789SRoy Zang 4879aa070789SRoy Zang if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) { 4880aa070789SRoy Zang tarc = E1000_READ_REG(hw, TARC0); 4881aa070789SRoy Zang /* set the speed mode bit, we'll clear it if we're not at 4882aa070789SRoy Zang * gigabit link later */ 4883aa070789SRoy Zang /* git bit can be set to 1*/ 4884aa070789SRoy Zang } else if (hw->mac_type == e1000_80003es2lan) { 4885aa070789SRoy Zang tarc = E1000_READ_REG(hw, TARC0); 4886aa070789SRoy Zang tarc |= 1; 4887aa070789SRoy Zang E1000_WRITE_REG(hw, TARC0, tarc); 4888aa070789SRoy Zang tarc = E1000_READ_REG(hw, TARC1); 4889aa070789SRoy Zang tarc |= 1; 4890aa070789SRoy Zang E1000_WRITE_REG(hw, TARC1, tarc); 4891aa070789SRoy Zang } 4892aa070789SRoy Zang 48932439e4bfSJean-Christophe PLAGNIOL-VILLARD 48942439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_config_collision_dist(hw); 4895aa070789SRoy Zang /* Setup Transmit Descriptor Settings for eop descriptor */ 4896aa070789SRoy Zang hw->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS; 48972439e4bfSJean-Christophe PLAGNIOL-VILLARD 4898aa070789SRoy Zang /* Need to set up RS bit */ 4899aa070789SRoy Zang if (hw->mac_type < e1000_82543) 4900aa070789SRoy Zang hw->txd_cmd |= E1000_TXD_CMD_RPS; 49012439e4bfSJean-Christophe PLAGNIOL-VILLARD else 4902aa070789SRoy Zang hw->txd_cmd |= E1000_TXD_CMD_RS; 4903aa070789SRoy Zang E1000_WRITE_REG(hw, TCTL, tctl); 49042439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49052439e4bfSJean-Christophe PLAGNIOL-VILLARD 49062439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 49072439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_setup_rctl - configure the receive control register 49082439e4bfSJean-Christophe PLAGNIOL-VILLARD * @adapter: Board private structure 49092439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 49102439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 49112439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_rctl(struct e1000_hw *hw) 49122439e4bfSJean-Christophe PLAGNIOL-VILLARD { 49132439e4bfSJean-Christophe PLAGNIOL-VILLARD uint32_t rctl; 49142439e4bfSJean-Christophe PLAGNIOL-VILLARD 49152439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 49162439e4bfSJean-Christophe PLAGNIOL-VILLARD 49172439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~(3 << E1000_RCTL_MO_SHIFT); 49182439e4bfSJean-Christophe PLAGNIOL-VILLARD 4919aa070789SRoy Zang rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO 4920aa070789SRoy Zang | E1000_RCTL_RDMTS_HALF; /* | 49212439e4bfSJean-Christophe PLAGNIOL-VILLARD (hw.mc_filter_type << E1000_RCTL_MO_SHIFT); */ 49222439e4bfSJean-Christophe PLAGNIOL-VILLARD 49232439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->tbi_compatibility_on == 1) 49242439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl |= E1000_RCTL_SBP; 49252439e4bfSJean-Christophe PLAGNIOL-VILLARD else 49262439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~E1000_RCTL_SBP; 49272439e4bfSJean-Christophe PLAGNIOL-VILLARD 49282439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~(E1000_RCTL_SZ_4096); 49292439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl |= E1000_RCTL_SZ_2048; 49302439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl &= ~(E1000_RCTL_BSEX | E1000_RCTL_LPE); 49312439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 49322439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49332439e4bfSJean-Christophe PLAGNIOL-VILLARD 49342439e4bfSJean-Christophe PLAGNIOL-VILLARD /** 49352439e4bfSJean-Christophe PLAGNIOL-VILLARD * e1000_configure_rx - Configure 8254x Receive Unit after Reset 49362439e4bfSJean-Christophe PLAGNIOL-VILLARD * @adapter: board private structure 49372439e4bfSJean-Christophe PLAGNIOL-VILLARD * 49382439e4bfSJean-Christophe PLAGNIOL-VILLARD * Configure the Rx unit of the MAC after a reset. 49392439e4bfSJean-Christophe PLAGNIOL-VILLARD **/ 49402439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 49412439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_rx(struct e1000_hw *hw) 49422439e4bfSJean-Christophe PLAGNIOL-VILLARD { 49432439e4bfSJean-Christophe PLAGNIOL-VILLARD unsigned long ptr; 4944aa070789SRoy Zang unsigned long rctl, ctrl_ext; 49452439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_tail = 0; 49462439e4bfSJean-Christophe PLAGNIOL-VILLARD /* make sure receives are disabled while setting up the descriptors */ 49472439e4bfSJean-Christophe PLAGNIOL-VILLARD rctl = E1000_READ_REG(hw, RCTL); 49482439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN); 49492439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82540) { 49502439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Set the interrupt throttling rate. Value is calculated 49512439e4bfSJean-Christophe PLAGNIOL-VILLARD * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */ 49522439e4bfSJean-Christophe PLAGNIOL-VILLARD #define MAX_INTS_PER_SEC 8000 49532439e4bfSJean-Christophe PLAGNIOL-VILLARD #define DEFAULT_ITR 1000000000/(MAX_INTS_PER_SEC * 256) 49542439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, ITR, DEFAULT_ITR); 49552439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49562439e4bfSJean-Christophe PLAGNIOL-VILLARD 4957aa070789SRoy Zang if (hw->mac_type >= e1000_82571) { 4958aa070789SRoy Zang ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); 4959aa070789SRoy Zang /* Reset delay timers after every interrupt */ 4960aa070789SRoy Zang ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; 4961aa070789SRoy Zang E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); 4962aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 4963aa070789SRoy Zang } 49642439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the Base and Length of the Rx Descriptor Ring */ 49652439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (u32) rx_pool; 49662439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ptr & 0xf) 49672439e4bfSJean-Christophe PLAGNIOL-VILLARD ptr = (ptr + 0x10) & (~0xf); 49682439e4bfSJean-Christophe PLAGNIOL-VILLARD rx_base = (typeof(rx_base)) ptr; 49692439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDBAL, (u32) rx_base); 49702439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDBAH, 0); 49712439e4bfSJean-Christophe PLAGNIOL-VILLARD 49722439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDLEN, 128); 49732439e4bfSJean-Christophe PLAGNIOL-VILLARD 49742439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Setup the HW Rx Head and Tail Descriptor Pointers */ 49752439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDH, 0); 49762439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDT, 0); 49772439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Enable Receives */ 49782439e4bfSJean-Christophe PLAGNIOL-VILLARD 49792439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, rctl); 49802439e4bfSJean-Christophe PLAGNIOL-VILLARD fill_rx(hw); 49812439e4bfSJean-Christophe PLAGNIOL-VILLARD } 49822439e4bfSJean-Christophe PLAGNIOL-VILLARD 49832439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 49842439e4bfSJean-Christophe PLAGNIOL-VILLARD POLL - Wait for a frame 49852439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 49862439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 49872439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_poll(struct eth_device *nic) 49882439e4bfSJean-Christophe PLAGNIOL-VILLARD { 49892439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 49902439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_rx_desc *rd; 49912439e4bfSJean-Christophe PLAGNIOL-VILLARD /* return true if there's an ethernet packet ready to read */ 49922439e4bfSJean-Christophe PLAGNIOL-VILLARD rd = rx_base + rx_last; 49932439e4bfSJean-Christophe PLAGNIOL-VILLARD if (!(le32_to_cpu(rd->status)) & E1000_RXD_STAT_DD) 49942439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 49952439e4bfSJean-Christophe PLAGNIOL-VILLARD /*DEBUGOUT("recv: packet len=%d \n", rd->length); */ 49962439e4bfSJean-Christophe PLAGNIOL-VILLARD NetReceive((uchar *)packet, le32_to_cpu(rd->length)); 49972439e4bfSJean-Christophe PLAGNIOL-VILLARD fill_rx(hw); 49982439e4bfSJean-Christophe PLAGNIOL-VILLARD return 1; 49992439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50002439e4bfSJean-Christophe PLAGNIOL-VILLARD 50012439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 50022439e4bfSJean-Christophe PLAGNIOL-VILLARD TRANSMIT - Transmit a frame 50032439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 500497796f71SJoe Hershberger static int e1000_transmit(struct eth_device *nic, void *packet, int length) 50052439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50068aa858cbSWolfgang Denk void *nv_packet = (void *)packet; 50072439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50082439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_tx_desc *txp; 50092439e4bfSJean-Christophe PLAGNIOL-VILLARD int i = 0; 50102439e4bfSJean-Christophe PLAGNIOL-VILLARD 50112439e4bfSJean-Christophe PLAGNIOL-VILLARD txp = tx_base + tx_tail; 50122439e4bfSJean-Christophe PLAGNIOL-VILLARD tx_tail = (tx_tail + 1) % 8; 50132439e4bfSJean-Christophe PLAGNIOL-VILLARD 50148aa858cbSWolfgang Denk txp->buffer_addr = cpu_to_le64(virt_to_bus(hw->pdev, nv_packet)); 5015aa070789SRoy Zang txp->lower.data = cpu_to_le32(hw->txd_cmd | length); 50162439e4bfSJean-Christophe PLAGNIOL-VILLARD txp->upper.data = 0; 50172439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDT, tx_tail); 50182439e4bfSJean-Christophe PLAGNIOL-VILLARD 5019aa070789SRoy Zang E1000_WRITE_FLUSH(hw); 50202439e4bfSJean-Christophe PLAGNIOL-VILLARD while (!(le32_to_cpu(txp->upper.data) & E1000_TXD_STAT_DD)) { 50212439e4bfSJean-Christophe PLAGNIOL-VILLARD if (i++ > TOUT_LOOP) { 50222439e4bfSJean-Christophe PLAGNIOL-VILLARD DEBUGOUT("e1000: tx timeout\n"); 50232439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 50242439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50252439e4bfSJean-Christophe PLAGNIOL-VILLARD udelay(10); /* give the nic a chance to write to the register */ 50262439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50272439e4bfSJean-Christophe PLAGNIOL-VILLARD return 1; 50282439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50292439e4bfSJean-Christophe PLAGNIOL-VILLARD 50302439e4bfSJean-Christophe PLAGNIOL-VILLARD /*reset function*/ 50312439e4bfSJean-Christophe PLAGNIOL-VILLARD static inline int 50322439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_reset(struct eth_device *nic) 50332439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50342439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50352439e4bfSJean-Christophe PLAGNIOL-VILLARD 50362439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_reset_hw(hw); 50372439e4bfSJean-Christophe PLAGNIOL-VILLARD if (hw->mac_type >= e1000_82544) { 50382439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, WUC, 0); 50392439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50402439e4bfSJean-Christophe PLAGNIOL-VILLARD return e1000_init_hw(nic); 50412439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50422439e4bfSJean-Christophe PLAGNIOL-VILLARD 50432439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 50442439e4bfSJean-Christophe PLAGNIOL-VILLARD DISABLE - Turn off ethernet interface 50452439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 50462439e4bfSJean-Christophe PLAGNIOL-VILLARD static void 50472439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_disable(struct eth_device *nic) 50482439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50492439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50502439e4bfSJean-Christophe PLAGNIOL-VILLARD 50512439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Turn off the ethernet interface */ 50522439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RCTL, 0); 50532439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TCTL, 0); 50542439e4bfSJean-Christophe PLAGNIOL-VILLARD 50552439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear the transmit ring */ 50562439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDH, 0); 50572439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, TDT, 0); 50582439e4bfSJean-Christophe PLAGNIOL-VILLARD 50592439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Clear the receive ring */ 50602439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDH, 0); 50612439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, RDT, 0); 50622439e4bfSJean-Christophe PLAGNIOL-VILLARD 50632439e4bfSJean-Christophe PLAGNIOL-VILLARD /* put the card in its initial state */ 50642439e4bfSJean-Christophe PLAGNIOL-VILLARD #if 0 50652439e4bfSJean-Christophe PLAGNIOL-VILLARD E1000_WRITE_REG(hw, CTRL, E1000_CTRL_RST); 50662439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 50672439e4bfSJean-Christophe PLAGNIOL-VILLARD mdelay(10); 50682439e4bfSJean-Christophe PLAGNIOL-VILLARD 50692439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50702439e4bfSJean-Christophe PLAGNIOL-VILLARD 50712439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 50722439e4bfSJean-Christophe PLAGNIOL-VILLARD INIT - set up ethernet interface(s) 50732439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 50742439e4bfSJean-Christophe PLAGNIOL-VILLARD static int 50752439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_init(struct eth_device *nic, bd_t * bis) 50762439e4bfSJean-Christophe PLAGNIOL-VILLARD { 50772439e4bfSJean-Christophe PLAGNIOL-VILLARD struct e1000_hw *hw = nic->priv; 50782439e4bfSJean-Christophe PLAGNIOL-VILLARD int ret_val = 0; 50792439e4bfSJean-Christophe PLAGNIOL-VILLARD 50802439e4bfSJean-Christophe PLAGNIOL-VILLARD ret_val = e1000_reset(nic); 50812439e4bfSJean-Christophe PLAGNIOL-VILLARD if (ret_val < 0) { 50822439e4bfSJean-Christophe PLAGNIOL-VILLARD if ((ret_val == -E1000_ERR_NOLINK) || 50832439e4bfSJean-Christophe PLAGNIOL-VILLARD (ret_val == -E1000_ERR_TIMEOUT)) { 5084d60626f8SKyle Moffett E1000_ERR(hw->nic, "Valid Link not detected\n"); 50852439e4bfSJean-Christophe PLAGNIOL-VILLARD } else { 5086d60626f8SKyle Moffett E1000_ERR(hw->nic, "Hardware Initialization Failed\n"); 50872439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50882439e4bfSJean-Christophe PLAGNIOL-VILLARD return 0; 50892439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50902439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_tx(hw); 50912439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_setup_rctl(hw); 50922439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_configure_rx(hw); 50932439e4bfSJean-Christophe PLAGNIOL-VILLARD return 1; 50942439e4bfSJean-Christophe PLAGNIOL-VILLARD } 50952439e4bfSJean-Christophe PLAGNIOL-VILLARD 5096aa070789SRoy Zang /****************************************************************************** 5097aa070789SRoy Zang * Gets the current PCI bus type of hardware 5098aa070789SRoy Zang * 5099aa070789SRoy Zang * hw - Struct containing variables accessed by shared code 5100aa070789SRoy Zang *****************************************************************************/ 5101aa070789SRoy Zang void e1000_get_bus_type(struct e1000_hw *hw) 5102aa070789SRoy Zang { 5103aa070789SRoy Zang uint32_t status; 5104aa070789SRoy Zang 5105aa070789SRoy Zang switch (hw->mac_type) { 5106aa070789SRoy Zang case e1000_82542_rev2_0: 5107aa070789SRoy Zang case e1000_82542_rev2_1: 5108aa070789SRoy Zang hw->bus_type = e1000_bus_type_pci; 5109aa070789SRoy Zang break; 5110aa070789SRoy Zang case e1000_82571: 5111aa070789SRoy Zang case e1000_82572: 5112aa070789SRoy Zang case e1000_82573: 51132c2668f9SRoy Zang case e1000_82574: 5114aa070789SRoy Zang case e1000_80003es2lan: 5115aa070789SRoy Zang hw->bus_type = e1000_bus_type_pci_express; 5116aa070789SRoy Zang break; 5117aa070789SRoy Zang case e1000_ich8lan: 5118aa070789SRoy Zang hw->bus_type = e1000_bus_type_pci_express; 5119aa070789SRoy Zang break; 5120aa070789SRoy Zang default: 5121aa070789SRoy Zang status = E1000_READ_REG(hw, STATUS); 5122aa070789SRoy Zang hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ? 5123aa070789SRoy Zang e1000_bus_type_pcix : e1000_bus_type_pci; 5124aa070789SRoy Zang break; 5125aa070789SRoy Zang } 5126aa070789SRoy Zang } 5127aa070789SRoy Zang 5128ce5207e1SKyle Moffett /* A list of all registered e1000 devices */ 5129ce5207e1SKyle Moffett static LIST_HEAD(e1000_hw_list); 5130ce5207e1SKyle Moffett 51312439e4bfSJean-Christophe PLAGNIOL-VILLARD /************************************************************************** 51322439e4bfSJean-Christophe PLAGNIOL-VILLARD PROBE - Look for an adapter, this routine's visible to the outside 51332439e4bfSJean-Christophe PLAGNIOL-VILLARD You should omit the last argument struct pci_device * for a non-PCI NIC 51342439e4bfSJean-Christophe PLAGNIOL-VILLARD ***************************************************************************/ 51352439e4bfSJean-Christophe PLAGNIOL-VILLARD int 51362439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_initialize(bd_t * bis) 51372439e4bfSJean-Christophe PLAGNIOL-VILLARD { 5138d60626f8SKyle Moffett unsigned int i; 51392439e4bfSJean-Christophe PLAGNIOL-VILLARD pci_dev_t devno; 51402439e4bfSJean-Christophe PLAGNIOL-VILLARD 5141f81ecb5dSTimur Tabi DEBUGFUNC(); 5142f81ecb5dSTimur Tabi 5143d60626f8SKyle Moffett /* Find and probe all the matching PCI devices */ 5144d60626f8SKyle Moffett for (i = 0; (devno = pci_find_devices(e1000_supported, i)) >= 0; i++) { 5145d60626f8SKyle Moffett u32 val; 51462439e4bfSJean-Christophe PLAGNIOL-VILLARD 5147d60626f8SKyle Moffett /* 5148d60626f8SKyle Moffett * These will never get freed due to errors, this allows us to 5149d60626f8SKyle Moffett * perform SPI EEPROM programming from U-boot, for example. 5150d60626f8SKyle Moffett */ 5151d60626f8SKyle Moffett struct eth_device *nic = malloc(sizeof(*nic)); 5152d60626f8SKyle Moffett struct e1000_hw *hw = malloc(sizeof(*hw)); 5153d60626f8SKyle Moffett if (!nic || !hw) { 5154d60626f8SKyle Moffett printf("e1000#%u: Out of Memory!\n", i); 51554b29bdb0SKumar Gala free(nic); 5156d60626f8SKyle Moffett free(hw); 5157d60626f8SKyle Moffett continue; 51584b29bdb0SKumar Gala } 51594b29bdb0SKumar Gala 5160d60626f8SKyle Moffett /* Make sure all of the fields are initially zeroed */ 5161f7ac99fdSMatthew McClintock memset(nic, 0, sizeof(*nic)); 51624b29bdb0SKumar Gala memset(hw, 0, sizeof(*hw)); 51634b29bdb0SKumar Gala 5164d60626f8SKyle Moffett /* Assign the passed-in values */ 5165d60626f8SKyle Moffett hw->cardnum = i; 51662439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->pdev = devno; 5167d60626f8SKyle Moffett hw->nic = nic; 51682439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->priv = hw; 51692439e4bfSJean-Christophe PLAGNIOL-VILLARD 5170d60626f8SKyle Moffett /* Generate a card name */ 5171d60626f8SKyle Moffett sprintf(nic->name, "e1000#%u", hw->cardnum); 5172d60626f8SKyle Moffett 5173d60626f8SKyle Moffett /* Print a debug message with the IO base address */ 5174d60626f8SKyle Moffett pci_read_config_dword(devno, PCI_BASE_ADDRESS_0, &val); 5175d60626f8SKyle Moffett E1000_DBG(nic, "iobase 0x%08x\n", val & 0xfffffff0); 5176d60626f8SKyle Moffett 5177d60626f8SKyle Moffett /* Try to enable I/O accesses and bus-mastering */ 5178d60626f8SKyle Moffett val = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER; 5179d60626f8SKyle Moffett pci_write_config_dword(devno, PCI_COMMAND, val); 5180d60626f8SKyle Moffett 5181d60626f8SKyle Moffett /* Make sure it worked */ 5182d60626f8SKyle Moffett pci_read_config_dword(devno, PCI_COMMAND, &val); 5183d60626f8SKyle Moffett if (!(val & PCI_COMMAND_MEMORY)) { 5184d60626f8SKyle Moffett E1000_ERR(nic, "Can't enable I/O memory\n"); 5185d60626f8SKyle Moffett continue; 5186d60626f8SKyle Moffett } 5187d60626f8SKyle Moffett if (!(val & PCI_COMMAND_MASTER)) { 5188d60626f8SKyle Moffett E1000_ERR(nic, "Can't enable bus-mastering\n"); 5189d60626f8SKyle Moffett continue; 5190d60626f8SKyle Moffett } 51912439e4bfSJean-Christophe PLAGNIOL-VILLARD 51922439e4bfSJean-Christophe PLAGNIOL-VILLARD /* Are these variables needed? */ 51932439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->fc = e1000_fc_default; 51942439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->original_fc = e1000_fc_default; 51952439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->autoneg_failed = 0; 5196aa070789SRoy Zang hw->autoneg = 1; 51972439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->get_link_status = TRUE; 5198d60626f8SKyle Moffett hw->hw_addr = pci_map_bar(devno, PCI_BASE_ADDRESS_0, 5199d60626f8SKyle Moffett PCI_REGION_MEM); 52002439e4bfSJean-Christophe PLAGNIOL-VILLARD hw->mac_type = e1000_undefined; 52012439e4bfSJean-Christophe PLAGNIOL-VILLARD 52022439e4bfSJean-Christophe PLAGNIOL-VILLARD /* MAC and Phy settings */ 5203d60626f8SKyle Moffett if (e1000_sw_init(nic) < 0) { 5204d60626f8SKyle Moffett E1000_ERR(nic, "Software init failed\n"); 5205d60626f8SKyle Moffett continue; 52062439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5207aa070789SRoy Zang if (e1000_check_phy_reset_block(hw)) 5208d60626f8SKyle Moffett E1000_ERR(nic, "PHY Reset is blocked!\n"); 5209d60626f8SKyle Moffett 5210ce5207e1SKyle Moffett /* Basic init was OK, reset the hardware and allow SPI access */ 5211aa070789SRoy Zang e1000_reset_hw(hw); 5212ce5207e1SKyle Moffett list_add_tail(&hw->list_node, &e1000_hw_list); 5213d60626f8SKyle Moffett 5214d60626f8SKyle Moffett /* Validate the EEPROM and get chipset information */ 5215a821d08dSStefan Roese #if !defined(CONFIG_MVBC_1G) 5216aa070789SRoy Zang if (e1000_init_eeprom_params(hw)) { 5217d60626f8SKyle Moffett E1000_ERR(nic, "EEPROM is invalid!\n"); 5218d60626f8SKyle Moffett continue; 5219aa070789SRoy Zang } 5220114d7fc0SKyle Moffett if (e1000_validate_eeprom_checksum(hw)) 5221d60626f8SKyle Moffett continue; 52222439e4bfSJean-Christophe PLAGNIOL-VILLARD #endif 52232439e4bfSJean-Christophe PLAGNIOL-VILLARD e1000_read_mac_addr(nic); 5224aa070789SRoy Zang e1000_get_bus_type(hw); 52252439e4bfSJean-Christophe PLAGNIOL-VILLARD 52262439e4bfSJean-Christophe PLAGNIOL-VILLARD printf("e1000: %02x:%02x:%02x:%02x:%02x:%02x\n ", 52272439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[0], nic->enetaddr[1], nic->enetaddr[2], 52282439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->enetaddr[3], nic->enetaddr[4], nic->enetaddr[5]); 52292439e4bfSJean-Christophe PLAGNIOL-VILLARD 5230d60626f8SKyle Moffett /* Set up the function pointers and register the device */ 52312439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->init = e1000_init; 52322439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->recv = e1000_poll; 52332439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->send = e1000_transmit; 52342439e4bfSJean-Christophe PLAGNIOL-VILLARD nic->halt = e1000_disable; 52352439e4bfSJean-Christophe PLAGNIOL-VILLARD eth_register(nic); 52362439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5237d60626f8SKyle Moffett 5238d60626f8SKyle Moffett return i; 52392439e4bfSJean-Christophe PLAGNIOL-VILLARD } 5240ce5207e1SKyle Moffett 5241ce5207e1SKyle Moffett struct e1000_hw *e1000_find_card(unsigned int cardnum) 5242ce5207e1SKyle Moffett { 5243ce5207e1SKyle Moffett struct e1000_hw *hw; 5244ce5207e1SKyle Moffett 5245ce5207e1SKyle Moffett list_for_each_entry(hw, &e1000_hw_list, list_node) 5246ce5207e1SKyle Moffett if (hw->cardnum == cardnum) 5247ce5207e1SKyle Moffett return hw; 5248ce5207e1SKyle Moffett 5249ce5207e1SKyle Moffett return NULL; 5250ce5207e1SKyle Moffett } 5251ce5207e1SKyle Moffett 5252ce5207e1SKyle Moffett #ifdef CONFIG_CMD_E1000 5253ce5207e1SKyle Moffett static int do_e1000(cmd_tbl_t *cmdtp, int flag, 5254ce5207e1SKyle Moffett int argc, char * const argv[]) 5255ce5207e1SKyle Moffett { 5256ce5207e1SKyle Moffett struct e1000_hw *hw; 5257ce5207e1SKyle Moffett 5258ce5207e1SKyle Moffett if (argc < 3) { 5259ce5207e1SKyle Moffett cmd_usage(cmdtp); 5260ce5207e1SKyle Moffett return 1; 5261ce5207e1SKyle Moffett } 5262ce5207e1SKyle Moffett 5263ce5207e1SKyle Moffett /* Make sure we can find the requested e1000 card */ 5264ce5207e1SKyle Moffett hw = e1000_find_card(simple_strtoul(argv[1], NULL, 10)); 5265ce5207e1SKyle Moffett if (!hw) { 5266ce5207e1SKyle Moffett printf("e1000: ERROR: No such device: e1000#%s\n", argv[1]); 5267ce5207e1SKyle Moffett return 1; 5268ce5207e1SKyle Moffett } 5269ce5207e1SKyle Moffett 5270ce5207e1SKyle Moffett if (!strcmp(argv[2], "print-mac-address")) { 5271ce5207e1SKyle Moffett unsigned char *mac = hw->nic->enetaddr; 5272ce5207e1SKyle Moffett printf("%02x:%02x:%02x:%02x:%02x:%02x\n", 5273ce5207e1SKyle Moffett mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 5274ce5207e1SKyle Moffett return 0; 5275ce5207e1SKyle Moffett } 5276ce5207e1SKyle Moffett 5277ce5207e1SKyle Moffett #ifdef CONFIG_E1000_SPI 5278ce5207e1SKyle Moffett /* Handle the "SPI" subcommand */ 5279ce5207e1SKyle Moffett if (!strcmp(argv[2], "spi")) 5280ce5207e1SKyle Moffett return do_e1000_spi(cmdtp, hw, argc - 3, argv + 3); 5281ce5207e1SKyle Moffett #endif 5282ce5207e1SKyle Moffett 5283ce5207e1SKyle Moffett cmd_usage(cmdtp); 5284ce5207e1SKyle Moffett return 1; 5285ce5207e1SKyle Moffett } 5286ce5207e1SKyle Moffett 5287ce5207e1SKyle Moffett U_BOOT_CMD( 5288ce5207e1SKyle Moffett e1000, 7, 0, do_e1000, 5289ce5207e1SKyle Moffett "Intel e1000 controller management", 5290ce5207e1SKyle Moffett /* */"<card#> print-mac-address\n" 5291ce5207e1SKyle Moffett #ifdef CONFIG_E1000_SPI 5292ce5207e1SKyle Moffett "e1000 <card#> spi show [<offset> [<length>]]\n" 5293ce5207e1SKyle Moffett "e1000 <card#> spi dump <addr> <offset> <length>\n" 5294ce5207e1SKyle Moffett "e1000 <card#> spi program <addr> <offset> <length>\n" 5295ce5207e1SKyle Moffett "e1000 <card#> spi checksum [update]\n" 5296ce5207e1SKyle Moffett #endif 5297ce5207e1SKyle Moffett " - Manage the Intel E1000 PCI device" 5298ce5207e1SKyle Moffett ); 5299ce5207e1SKyle Moffett #endif /* not CONFIG_CMD_E1000 */ 5300