1dee1ad47SJeff Kirsher /******************************************************************************* 2dee1ad47SJeff Kirsher 3dee1ad47SJeff Kirsher Intel PRO/1000 Linux driver 4f5e261e6SBruce Allan Copyright(c) 1999 - 2012 Intel Corporation. 5dee1ad47SJeff Kirsher 6dee1ad47SJeff Kirsher This program is free software; you can redistribute it and/or modify it 7dee1ad47SJeff Kirsher under the terms and conditions of the GNU General Public License, 8dee1ad47SJeff Kirsher version 2, as published by the Free Software Foundation. 9dee1ad47SJeff Kirsher 10dee1ad47SJeff Kirsher This program is distributed in the hope it will be useful, but WITHOUT 11dee1ad47SJeff Kirsher ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12dee1ad47SJeff Kirsher FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13dee1ad47SJeff Kirsher more details. 14dee1ad47SJeff Kirsher 15dee1ad47SJeff Kirsher You should have received a copy of the GNU General Public License along with 16dee1ad47SJeff Kirsher this program; if not, write to the Free Software Foundation, Inc., 17dee1ad47SJeff Kirsher 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 18dee1ad47SJeff Kirsher 19dee1ad47SJeff Kirsher The full GNU General Public License is included in this distribution in 20dee1ad47SJeff Kirsher the file called "COPYING". 21dee1ad47SJeff Kirsher 22dee1ad47SJeff Kirsher Contact Information: 23dee1ad47SJeff Kirsher Linux NICS <linux.nics@intel.com> 24dee1ad47SJeff Kirsher e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 25dee1ad47SJeff Kirsher Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 26dee1ad47SJeff Kirsher 27dee1ad47SJeff Kirsher *******************************************************************************/ 28dee1ad47SJeff Kirsher 29dee1ad47SJeff Kirsher /* Linux PRO/1000 Ethernet Driver main header file */ 30dee1ad47SJeff Kirsher 31dee1ad47SJeff Kirsher #ifndef _E1000_H_ 32dee1ad47SJeff Kirsher #define _E1000_H_ 33dee1ad47SJeff Kirsher 34dee1ad47SJeff Kirsher #include <linux/bitops.h> 35dee1ad47SJeff Kirsher #include <linux/types.h> 36dee1ad47SJeff Kirsher #include <linux/timer.h> 37dee1ad47SJeff Kirsher #include <linux/workqueue.h> 38dee1ad47SJeff Kirsher #include <linux/io.h> 39dee1ad47SJeff Kirsher #include <linux/netdevice.h> 40dee1ad47SJeff Kirsher #include <linux/pci.h> 41dee1ad47SJeff Kirsher #include <linux/pci-aspm.h> 42dee1ad47SJeff Kirsher #include <linux/crc32.h> 43dee1ad47SJeff Kirsher #include <linux/if_vlan.h> 44*b67e1913SBruce Allan #include <linux/clocksource.h> 45*b67e1913SBruce Allan #include <linux/net_tstamp.h> 46dee1ad47SJeff Kirsher 47dee1ad47SJeff Kirsher #include "hw.h" 48dee1ad47SJeff Kirsher 49dee1ad47SJeff Kirsher struct e1000_info; 50dee1ad47SJeff Kirsher 51dee1ad47SJeff Kirsher #define e_dbg(format, arg...) \ 52dee1ad47SJeff Kirsher netdev_dbg(hw->adapter->netdev, format, ## arg) 53dee1ad47SJeff Kirsher #define e_err(format, arg...) \ 54dee1ad47SJeff Kirsher netdev_err(adapter->netdev, format, ## arg) 55dee1ad47SJeff Kirsher #define e_info(format, arg...) \ 56dee1ad47SJeff Kirsher netdev_info(adapter->netdev, format, ## arg) 57dee1ad47SJeff Kirsher #define e_warn(format, arg...) \ 58dee1ad47SJeff Kirsher netdev_warn(adapter->netdev, format, ## arg) 59dee1ad47SJeff Kirsher #define e_notice(format, arg...) \ 60dee1ad47SJeff Kirsher netdev_notice(adapter->netdev, format, ## arg) 61dee1ad47SJeff Kirsher 62dee1ad47SJeff Kirsher 63dee1ad47SJeff Kirsher /* Interrupt modes, as used by the IntMode parameter */ 64dee1ad47SJeff Kirsher #define E1000E_INT_MODE_LEGACY 0 65dee1ad47SJeff Kirsher #define E1000E_INT_MODE_MSI 1 66dee1ad47SJeff Kirsher #define E1000E_INT_MODE_MSIX 2 67dee1ad47SJeff Kirsher 68dee1ad47SJeff Kirsher /* Tx/Rx descriptor defines */ 69dee1ad47SJeff Kirsher #define E1000_DEFAULT_TXD 256 70dee1ad47SJeff Kirsher #define E1000_MAX_TXD 4096 71dee1ad47SJeff Kirsher #define E1000_MIN_TXD 64 72dee1ad47SJeff Kirsher 73dee1ad47SJeff Kirsher #define E1000_DEFAULT_RXD 256 74dee1ad47SJeff Kirsher #define E1000_MAX_RXD 4096 75dee1ad47SJeff Kirsher #define E1000_MIN_RXD 64 76dee1ad47SJeff Kirsher 77dee1ad47SJeff Kirsher #define E1000_MIN_ITR_USECS 10 /* 100000 irq/sec */ 78dee1ad47SJeff Kirsher #define E1000_MAX_ITR_USECS 10000 /* 100 irq/sec */ 79dee1ad47SJeff Kirsher 80dee1ad47SJeff Kirsher /* Early Receive defines */ 81dee1ad47SJeff Kirsher #define E1000_ERT_2048 0x100 82dee1ad47SJeff Kirsher 83dee1ad47SJeff Kirsher #define E1000_FC_PAUSE_TIME 0x0680 /* 858 usec */ 84dee1ad47SJeff Kirsher 85dee1ad47SJeff Kirsher /* How many Tx Descriptors do we need to call netif_wake_queue ? */ 86dee1ad47SJeff Kirsher /* How many Rx Buffers do we bundle into one write to the hardware ? */ 87dee1ad47SJeff Kirsher #define E1000_RX_BUFFER_WRITE 16 /* Must be power of 2 */ 88dee1ad47SJeff Kirsher 89dee1ad47SJeff Kirsher #define AUTO_ALL_MODES 0 90dee1ad47SJeff Kirsher #define E1000_EEPROM_APME 0x0400 91dee1ad47SJeff Kirsher 92dee1ad47SJeff Kirsher #define E1000_MNG_VLAN_NONE (-1) 93dee1ad47SJeff Kirsher 94dee1ad47SJeff Kirsher /* Number of packet split data buffers (not including the header buffer) */ 95dee1ad47SJeff Kirsher #define PS_PAGE_BUFFERS (MAX_PS_BUFFERS - 1) 96dee1ad47SJeff Kirsher 97dee1ad47SJeff Kirsher #define DEFAULT_JUMBO 9234 98dee1ad47SJeff Kirsher 99dee1ad47SJeff Kirsher /* BM/HV Specific Registers */ 100dee1ad47SJeff Kirsher #define BM_PORT_CTRL_PAGE 769 101dee1ad47SJeff Kirsher 102dee1ad47SJeff Kirsher #define PHY_UPPER_SHIFT 21 103dee1ad47SJeff Kirsher #define BM_PHY_REG(page, reg) \ 104dee1ad47SJeff Kirsher (((reg) & MAX_PHY_REG_ADDRESS) |\ 105dee1ad47SJeff Kirsher (((page) & 0xFFFF) << PHY_PAGE_SHIFT) |\ 106dee1ad47SJeff Kirsher (((reg) & ~MAX_PHY_REG_ADDRESS) << (PHY_UPPER_SHIFT - PHY_PAGE_SHIFT))) 107dee1ad47SJeff Kirsher 108dee1ad47SJeff Kirsher /* PHY Wakeup Registers and defines */ 109dee1ad47SJeff Kirsher #define BM_PORT_GEN_CFG PHY_REG(BM_PORT_CTRL_PAGE, 17) 110dee1ad47SJeff Kirsher #define BM_RCTL PHY_REG(BM_WUC_PAGE, 0) 111dee1ad47SJeff Kirsher #define BM_WUC PHY_REG(BM_WUC_PAGE, 1) 112dee1ad47SJeff Kirsher #define BM_WUFC PHY_REG(BM_WUC_PAGE, 2) 113dee1ad47SJeff Kirsher #define BM_WUS PHY_REG(BM_WUC_PAGE, 3) 114dee1ad47SJeff Kirsher #define BM_RAR_L(_i) (BM_PHY_REG(BM_WUC_PAGE, 16 + ((_i) << 2))) 115dee1ad47SJeff Kirsher #define BM_RAR_M(_i) (BM_PHY_REG(BM_WUC_PAGE, 17 + ((_i) << 2))) 116dee1ad47SJeff Kirsher #define BM_RAR_H(_i) (BM_PHY_REG(BM_WUC_PAGE, 18 + ((_i) << 2))) 117dee1ad47SJeff Kirsher #define BM_RAR_CTRL(_i) (BM_PHY_REG(BM_WUC_PAGE, 19 + ((_i) << 2))) 118dee1ad47SJeff Kirsher #define BM_MTA(_i) (BM_PHY_REG(BM_WUC_PAGE, 128 + ((_i) << 1))) 119dee1ad47SJeff Kirsher 120dee1ad47SJeff Kirsher #define BM_RCTL_UPE 0x0001 /* Unicast Promiscuous Mode */ 121dee1ad47SJeff Kirsher #define BM_RCTL_MPE 0x0002 /* Multicast Promiscuous Mode */ 122dee1ad47SJeff Kirsher #define BM_RCTL_MO_SHIFT 3 /* Multicast Offset Shift */ 123dee1ad47SJeff Kirsher #define BM_RCTL_MO_MASK (3 << 3) /* Multicast Offset Mask */ 124dee1ad47SJeff Kirsher #define BM_RCTL_BAM 0x0020 /* Broadcast Accept Mode */ 125dee1ad47SJeff Kirsher #define BM_RCTL_PMCF 0x0040 /* Pass MAC Control Frames */ 126dee1ad47SJeff Kirsher #define BM_RCTL_RFCE 0x0080 /* Rx Flow Control Enable */ 127dee1ad47SJeff Kirsher 128dee1ad47SJeff Kirsher #define HV_STATS_PAGE 778 129dee1ad47SJeff Kirsher #define HV_SCC_UPPER PHY_REG(HV_STATS_PAGE, 16) /* Single Collision Count */ 130dee1ad47SJeff Kirsher #define HV_SCC_LOWER PHY_REG(HV_STATS_PAGE, 17) 131dee1ad47SJeff Kirsher #define HV_ECOL_UPPER PHY_REG(HV_STATS_PAGE, 18) /* Excessive Coll. Count */ 132dee1ad47SJeff Kirsher #define HV_ECOL_LOWER PHY_REG(HV_STATS_PAGE, 19) 133dee1ad47SJeff Kirsher #define HV_MCC_UPPER PHY_REG(HV_STATS_PAGE, 20) /* Multiple Coll. Count */ 134dee1ad47SJeff Kirsher #define HV_MCC_LOWER PHY_REG(HV_STATS_PAGE, 21) 135dee1ad47SJeff Kirsher #define HV_LATECOL_UPPER PHY_REG(HV_STATS_PAGE, 23) /* Late Collision Count */ 136dee1ad47SJeff Kirsher #define HV_LATECOL_LOWER PHY_REG(HV_STATS_PAGE, 24) 137dee1ad47SJeff Kirsher #define HV_COLC_UPPER PHY_REG(HV_STATS_PAGE, 25) /* Collision Count */ 138dee1ad47SJeff Kirsher #define HV_COLC_LOWER PHY_REG(HV_STATS_PAGE, 26) 139dee1ad47SJeff Kirsher #define HV_DC_UPPER PHY_REG(HV_STATS_PAGE, 27) /* Defer Count */ 140dee1ad47SJeff Kirsher #define HV_DC_LOWER PHY_REG(HV_STATS_PAGE, 28) 141dee1ad47SJeff Kirsher #define HV_TNCRS_UPPER PHY_REG(HV_STATS_PAGE, 29) /* Transmit with no CRS */ 142dee1ad47SJeff Kirsher #define HV_TNCRS_LOWER PHY_REG(HV_STATS_PAGE, 30) 143dee1ad47SJeff Kirsher 144dee1ad47SJeff Kirsher #define E1000_FCRTV_PCH 0x05F40 /* PCH Flow Control Refresh Timer Value */ 145dee1ad47SJeff Kirsher 146dee1ad47SJeff Kirsher /* BM PHY Copper Specific Status */ 147dee1ad47SJeff Kirsher #define BM_CS_STATUS 17 148dee1ad47SJeff Kirsher #define BM_CS_STATUS_LINK_UP 0x0400 149dee1ad47SJeff Kirsher #define BM_CS_STATUS_RESOLVED 0x0800 150dee1ad47SJeff Kirsher #define BM_CS_STATUS_SPEED_MASK 0xC000 151dee1ad47SJeff Kirsher #define BM_CS_STATUS_SPEED_1000 0x8000 152dee1ad47SJeff Kirsher 153dee1ad47SJeff Kirsher /* 82577 Mobile Phy Status Register */ 154dee1ad47SJeff Kirsher #define HV_M_STATUS 26 155dee1ad47SJeff Kirsher #define HV_M_STATUS_AUTONEG_COMPLETE 0x1000 156dee1ad47SJeff Kirsher #define HV_M_STATUS_SPEED_MASK 0x0300 157dee1ad47SJeff Kirsher #define HV_M_STATUS_SPEED_1000 0x0200 158dee1ad47SJeff Kirsher #define HV_M_STATUS_LINK_UP 0x0040 159dee1ad47SJeff Kirsher 160823dcd25SDavid S. Miller #define E1000_ICH_FWSM_PCIM2PCI 0x01000000 /* ME PCIm-to-PCI active */ 161823dcd25SDavid S. Miller #define E1000_ICH_FWSM_PCIM2PCI_COUNT 2000 162823dcd25SDavid S. Miller 163dee1ad47SJeff Kirsher /* Time to wait before putting the device into D3 if there's no link (in ms). */ 164dee1ad47SJeff Kirsher #define LINK_TIMEOUT 100 165dee1ad47SJeff Kirsher 166e921eb1aSBruce Allan /* Count for polling __E1000_RESET condition every 10-20msec. 167bb9e44d0SBruce Allan * Experimentation has shown the reset can take approximately 210msec. 168bb9e44d0SBruce Allan */ 169bb9e44d0SBruce Allan #define E1000_CHECK_RESET_COUNT 25 170bb9e44d0SBruce Allan 171dee1ad47SJeff Kirsher #define DEFAULT_RDTR 0 172dee1ad47SJeff Kirsher #define DEFAULT_RADV 8 173dee1ad47SJeff Kirsher #define BURST_RDTR 0x20 174dee1ad47SJeff Kirsher #define BURST_RADV 0x20 175dee1ad47SJeff Kirsher 176e921eb1aSBruce Allan /* in the case of WTHRESH, it appears at least the 82571/2 hardware 177dee1ad47SJeff Kirsher * writes back 4 descriptors when WTHRESH=5, and 3 descriptors when 1788edc0e62SHiroaki SHIMODA * WTHRESH=4, so a setting of 5 gives the most efficient bus 1798edc0e62SHiroaki SHIMODA * utilization but to avoid possible Tx stalls, set it to 1 180dee1ad47SJeff Kirsher */ 181dee1ad47SJeff Kirsher #define E1000_TXDCTL_DMA_BURST_ENABLE \ 182dee1ad47SJeff Kirsher (E1000_TXDCTL_GRAN | /* set descriptor granularity */ \ 183dee1ad47SJeff Kirsher E1000_TXDCTL_COUNT_DESC | \ 1848edc0e62SHiroaki SHIMODA (1 << 16) | /* wthresh must be +1 more than desired */\ 185dee1ad47SJeff Kirsher (1 << 8) | /* hthresh */ \ 186dee1ad47SJeff Kirsher 0x1f) /* pthresh */ 187dee1ad47SJeff Kirsher 188dee1ad47SJeff Kirsher #define E1000_RXDCTL_DMA_BURST_ENABLE \ 189dee1ad47SJeff Kirsher (0x01000000 | /* set descriptor granularity */ \ 190dee1ad47SJeff Kirsher (4 << 16) | /* set writeback threshold */ \ 191dee1ad47SJeff Kirsher (4 << 8) | /* set prefetch threshold */ \ 192dee1ad47SJeff Kirsher 0x20) /* set hthresh */ 193dee1ad47SJeff Kirsher 194dee1ad47SJeff Kirsher #define E1000_TIDV_FPD (1 << 31) 195dee1ad47SJeff Kirsher #define E1000_RDTR_FPD (1 << 31) 196dee1ad47SJeff Kirsher 197dee1ad47SJeff Kirsher enum e1000_boards { 198dee1ad47SJeff Kirsher board_82571, 199dee1ad47SJeff Kirsher board_82572, 200dee1ad47SJeff Kirsher board_82573, 201dee1ad47SJeff Kirsher board_82574, 202dee1ad47SJeff Kirsher board_82583, 203dee1ad47SJeff Kirsher board_80003es2lan, 204dee1ad47SJeff Kirsher board_ich8lan, 205dee1ad47SJeff Kirsher board_ich9lan, 206dee1ad47SJeff Kirsher board_ich10lan, 207dee1ad47SJeff Kirsher board_pchlan, 208dee1ad47SJeff Kirsher board_pch2lan, 2092fbe4526SBruce Allan board_pch_lpt, 210dee1ad47SJeff Kirsher }; 211dee1ad47SJeff Kirsher 212dee1ad47SJeff Kirsher struct e1000_ps_page { 213dee1ad47SJeff Kirsher struct page *page; 214dee1ad47SJeff Kirsher u64 dma; /* must be u64 - written to hw */ 215dee1ad47SJeff Kirsher }; 216dee1ad47SJeff Kirsher 217e921eb1aSBruce Allan /* wrappers around a pointer to a socket buffer, 218dee1ad47SJeff Kirsher * so a DMA handle can be stored along with the buffer 219dee1ad47SJeff Kirsher */ 220dee1ad47SJeff Kirsher struct e1000_buffer { 221dee1ad47SJeff Kirsher dma_addr_t dma; 222dee1ad47SJeff Kirsher struct sk_buff *skb; 223dee1ad47SJeff Kirsher union { 224dee1ad47SJeff Kirsher /* Tx */ 225dee1ad47SJeff Kirsher struct { 226dee1ad47SJeff Kirsher unsigned long time_stamp; 227dee1ad47SJeff Kirsher u16 length; 228dee1ad47SJeff Kirsher u16 next_to_watch; 229dee1ad47SJeff Kirsher unsigned int segs; 230dee1ad47SJeff Kirsher unsigned int bytecount; 231dee1ad47SJeff Kirsher u16 mapped_as_page; 232dee1ad47SJeff Kirsher }; 233dee1ad47SJeff Kirsher /* Rx */ 234dee1ad47SJeff Kirsher struct { 235dee1ad47SJeff Kirsher /* arrays of page information for packet split */ 236dee1ad47SJeff Kirsher struct e1000_ps_page *ps_pages; 237dee1ad47SJeff Kirsher struct page *page; 238dee1ad47SJeff Kirsher }; 239dee1ad47SJeff Kirsher }; 240dee1ad47SJeff Kirsher }; 241dee1ad47SJeff Kirsher 242dee1ad47SJeff Kirsher struct e1000_ring { 24355aa6985SBruce Allan struct e1000_adapter *adapter; /* back pointer to adapter */ 244dee1ad47SJeff Kirsher void *desc; /* pointer to ring memory */ 245dee1ad47SJeff Kirsher dma_addr_t dma; /* phys address of ring */ 246dee1ad47SJeff Kirsher unsigned int size; /* length of ring in bytes */ 247dee1ad47SJeff Kirsher unsigned int count; /* number of desc. in ring */ 248dee1ad47SJeff Kirsher 249dee1ad47SJeff Kirsher u16 next_to_use; 250dee1ad47SJeff Kirsher u16 next_to_clean; 251dee1ad47SJeff Kirsher 252c5083cf6SBruce Allan void __iomem *head; 253c5083cf6SBruce Allan void __iomem *tail; 254dee1ad47SJeff Kirsher 255dee1ad47SJeff Kirsher /* array of buffer information structs */ 256dee1ad47SJeff Kirsher struct e1000_buffer *buffer_info; 257dee1ad47SJeff Kirsher 258dee1ad47SJeff Kirsher char name[IFNAMSIZ + 5]; 259dee1ad47SJeff Kirsher u32 ims_val; 260dee1ad47SJeff Kirsher u32 itr_val; 261c5083cf6SBruce Allan void __iomem *itr_register; 262dee1ad47SJeff Kirsher int set_itr; 263dee1ad47SJeff Kirsher 264dee1ad47SJeff Kirsher struct sk_buff *rx_skb_top; 265dee1ad47SJeff Kirsher }; 266dee1ad47SJeff Kirsher 267dee1ad47SJeff Kirsher /* PHY register snapshot values */ 268dee1ad47SJeff Kirsher struct e1000_phy_regs { 269dee1ad47SJeff Kirsher u16 bmcr; /* basic mode control register */ 270dee1ad47SJeff Kirsher u16 bmsr; /* basic mode status register */ 271dee1ad47SJeff Kirsher u16 advertise; /* auto-negotiation advertisement */ 272dee1ad47SJeff Kirsher u16 lpa; /* link partner ability register */ 273dee1ad47SJeff Kirsher u16 expansion; /* auto-negotiation expansion reg */ 274dee1ad47SJeff Kirsher u16 ctrl1000; /* 1000BASE-T control register */ 275dee1ad47SJeff Kirsher u16 stat1000; /* 1000BASE-T status register */ 276dee1ad47SJeff Kirsher u16 estatus; /* extended status register */ 277dee1ad47SJeff Kirsher }; 278dee1ad47SJeff Kirsher 279dee1ad47SJeff Kirsher /* board specific private data structure */ 280dee1ad47SJeff Kirsher struct e1000_adapter { 281dee1ad47SJeff Kirsher struct timer_list watchdog_timer; 282dee1ad47SJeff Kirsher struct timer_list phy_info_timer; 283dee1ad47SJeff Kirsher struct timer_list blink_timer; 284dee1ad47SJeff Kirsher 285dee1ad47SJeff Kirsher struct work_struct reset_task; 286dee1ad47SJeff Kirsher struct work_struct watchdog_task; 287dee1ad47SJeff Kirsher 288dee1ad47SJeff Kirsher const struct e1000_info *ei; 289dee1ad47SJeff Kirsher 290dee1ad47SJeff Kirsher unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 291dee1ad47SJeff Kirsher u32 bd_number; 292dee1ad47SJeff Kirsher u32 rx_buffer_len; 293dee1ad47SJeff Kirsher u16 mng_vlan_id; 294dee1ad47SJeff Kirsher u16 link_speed; 295dee1ad47SJeff Kirsher u16 link_duplex; 296dee1ad47SJeff Kirsher u16 eeprom_vers; 297dee1ad47SJeff Kirsher 298dee1ad47SJeff Kirsher /* track device up/down/testing state */ 299dee1ad47SJeff Kirsher unsigned long state; 300dee1ad47SJeff Kirsher 301dee1ad47SJeff Kirsher /* Interrupt Throttle Rate */ 302dee1ad47SJeff Kirsher u32 itr; 303dee1ad47SJeff Kirsher u32 itr_setting; 304dee1ad47SJeff Kirsher u16 tx_itr; 305dee1ad47SJeff Kirsher u16 rx_itr; 306dee1ad47SJeff Kirsher 307e921eb1aSBruce Allan /* Tx */ 308dee1ad47SJeff Kirsher struct e1000_ring *tx_ring /* One per active queue */ 309dee1ad47SJeff Kirsher ____cacheline_aligned_in_smp; 310d821a4c4SBruce Allan u32 tx_fifo_limit; 311dee1ad47SJeff Kirsher 312dee1ad47SJeff Kirsher struct napi_struct napi; 313dee1ad47SJeff Kirsher 314dee1ad47SJeff Kirsher unsigned int restart_queue; 315dee1ad47SJeff Kirsher u32 txd_cmd; 316dee1ad47SJeff Kirsher 317dee1ad47SJeff Kirsher bool detect_tx_hung; 31809357b00SJeff Kirsher bool tx_hang_recheck; 319dee1ad47SJeff Kirsher u8 tx_timeout_factor; 320dee1ad47SJeff Kirsher 321dee1ad47SJeff Kirsher u32 tx_int_delay; 322dee1ad47SJeff Kirsher u32 tx_abs_int_delay; 323dee1ad47SJeff Kirsher 324dee1ad47SJeff Kirsher unsigned int total_tx_bytes; 325dee1ad47SJeff Kirsher unsigned int total_tx_packets; 326dee1ad47SJeff Kirsher unsigned int total_rx_bytes; 327dee1ad47SJeff Kirsher unsigned int total_rx_packets; 328dee1ad47SJeff Kirsher 329dee1ad47SJeff Kirsher /* Tx stats */ 330dee1ad47SJeff Kirsher u64 tpt_old; 331dee1ad47SJeff Kirsher u64 colc_old; 332dee1ad47SJeff Kirsher u32 gotc; 333dee1ad47SJeff Kirsher u64 gotc_old; 334dee1ad47SJeff Kirsher u32 tx_timeout_count; 335dee1ad47SJeff Kirsher u32 tx_fifo_head; 336dee1ad47SJeff Kirsher u32 tx_head_addr; 337dee1ad47SJeff Kirsher u32 tx_fifo_size; 338dee1ad47SJeff Kirsher u32 tx_dma_failed; 339dee1ad47SJeff Kirsher 340e921eb1aSBruce Allan /* Rx */ 34155aa6985SBruce Allan bool (*clean_rx) (struct e1000_ring *ring, int *work_done, 34255aa6985SBruce Allan int work_to_do) ____cacheline_aligned_in_smp; 34355aa6985SBruce Allan void (*alloc_rx_buf) (struct e1000_ring *ring, int cleaned_count, 34455aa6985SBruce Allan gfp_t gfp); 345dee1ad47SJeff Kirsher struct e1000_ring *rx_ring; 346dee1ad47SJeff Kirsher 347dee1ad47SJeff Kirsher u32 rx_int_delay; 348dee1ad47SJeff Kirsher u32 rx_abs_int_delay; 349dee1ad47SJeff Kirsher 350dee1ad47SJeff Kirsher /* Rx stats */ 351dee1ad47SJeff Kirsher u64 hw_csum_err; 352dee1ad47SJeff Kirsher u64 hw_csum_good; 353dee1ad47SJeff Kirsher u64 rx_hdr_split; 354dee1ad47SJeff Kirsher u32 gorc; 355dee1ad47SJeff Kirsher u64 gorc_old; 356dee1ad47SJeff Kirsher u32 alloc_rx_buff_failed; 357dee1ad47SJeff Kirsher u32 rx_dma_failed; 358*b67e1913SBruce Allan u32 rx_hwtstamp_cleared; 359dee1ad47SJeff Kirsher 360dee1ad47SJeff Kirsher unsigned int rx_ps_pages; 361dee1ad47SJeff Kirsher u16 rx_ps_bsize0; 362dee1ad47SJeff Kirsher u32 max_frame_size; 363dee1ad47SJeff Kirsher u32 min_frame_size; 364dee1ad47SJeff Kirsher 365dee1ad47SJeff Kirsher /* OS defined structs */ 366dee1ad47SJeff Kirsher struct net_device *netdev; 367dee1ad47SJeff Kirsher struct pci_dev *pdev; 368dee1ad47SJeff Kirsher 369dee1ad47SJeff Kirsher /* structs defined in e1000_hw.h */ 370dee1ad47SJeff Kirsher struct e1000_hw hw; 371dee1ad47SJeff Kirsher 372dee1ad47SJeff Kirsher spinlock_t stats64_lock; 373dee1ad47SJeff Kirsher struct e1000_hw_stats stats; 374dee1ad47SJeff Kirsher struct e1000_phy_info phy_info; 375dee1ad47SJeff Kirsher struct e1000_phy_stats phy_stats; 376dee1ad47SJeff Kirsher 377dee1ad47SJeff Kirsher /* Snapshot of PHY registers */ 378dee1ad47SJeff Kirsher struct e1000_phy_regs phy_regs; 379dee1ad47SJeff Kirsher 380dee1ad47SJeff Kirsher struct e1000_ring test_tx_ring; 381dee1ad47SJeff Kirsher struct e1000_ring test_rx_ring; 382dee1ad47SJeff Kirsher u32 test_icr; 383dee1ad47SJeff Kirsher 384dee1ad47SJeff Kirsher u32 msg_enable; 385dee1ad47SJeff Kirsher unsigned int num_vectors; 386dee1ad47SJeff Kirsher struct msix_entry *msix_entries; 387dee1ad47SJeff Kirsher int int_mode; 388dee1ad47SJeff Kirsher u32 eiac_mask; 389dee1ad47SJeff Kirsher 390dee1ad47SJeff Kirsher u32 eeprom_wol; 391dee1ad47SJeff Kirsher u32 wol; 392dee1ad47SJeff Kirsher u32 pba; 393dee1ad47SJeff Kirsher u32 max_hw_frame_size; 394dee1ad47SJeff Kirsher 395dee1ad47SJeff Kirsher bool fc_autoneg; 396dee1ad47SJeff Kirsher 397dee1ad47SJeff Kirsher unsigned int flags; 398dee1ad47SJeff Kirsher unsigned int flags2; 399dee1ad47SJeff Kirsher struct work_struct downshift_task; 400dee1ad47SJeff Kirsher struct work_struct update_phy_task; 401dee1ad47SJeff Kirsher struct work_struct print_hang_task; 402dee1ad47SJeff Kirsher 403dee1ad47SJeff Kirsher bool idle_check; 404dee1ad47SJeff Kirsher int phy_hang_count; 40555aa6985SBruce Allan 40655aa6985SBruce Allan u16 tx_ring_count; 40755aa6985SBruce Allan u16 rx_ring_count; 408*b67e1913SBruce Allan 409*b67e1913SBruce Allan struct hwtstamp_config hwtstamp_config; 410*b67e1913SBruce Allan struct delayed_work systim_overflow_work; 411*b67e1913SBruce Allan struct sk_buff *tx_hwtstamp_skb; 412*b67e1913SBruce Allan struct work_struct tx_hwtstamp_work; 413*b67e1913SBruce Allan spinlock_t systim_lock; /* protects SYSTIML/H regsters */ 414*b67e1913SBruce Allan struct cyclecounter cc; 415*b67e1913SBruce Allan struct timecounter tc; 416dee1ad47SJeff Kirsher }; 417dee1ad47SJeff Kirsher 418dee1ad47SJeff Kirsher struct e1000_info { 419dee1ad47SJeff Kirsher enum e1000_mac_type mac; 420dee1ad47SJeff Kirsher unsigned int flags; 421dee1ad47SJeff Kirsher unsigned int flags2; 422dee1ad47SJeff Kirsher u32 pba; 423dee1ad47SJeff Kirsher u32 max_hw_frame_size; 424dee1ad47SJeff Kirsher s32 (*get_variants)(struct e1000_adapter *); 4258ce9d6c7SJeff Kirsher const struct e1000_mac_operations *mac_ops; 4268ce9d6c7SJeff Kirsher const struct e1000_phy_operations *phy_ops; 4278ce9d6c7SJeff Kirsher const struct e1000_nvm_operations *nvm_ops; 428dee1ad47SJeff Kirsher }; 429dee1ad47SJeff Kirsher 430*b67e1913SBruce Allan /* The system time is maintained by a 64-bit counter comprised of the 32-bit 431*b67e1913SBruce Allan * SYSTIMH and SYSTIML registers. How the counter increments (and therefore 432*b67e1913SBruce Allan * its resolution) is based on the contents of the TIMINCA register - it 433*b67e1913SBruce Allan * increments every incperiod (bits 31:24) clock ticks by incvalue (bits 23:0). 434*b67e1913SBruce Allan * For the best accuracy, the incperiod should be as small as possible. The 435*b67e1913SBruce Allan * incvalue is scaled by a factor as large as possible (while still fitting 436*b67e1913SBruce Allan * in bits 23:0) so that relatively small clock corrections can be made. 437*b67e1913SBruce Allan * 438*b67e1913SBruce Allan * As a result, a shift of INCVALUE_SHIFT_n is used to fit a value of 439*b67e1913SBruce Allan * INCVALUE_n into the TIMINCA register allowing 32+8+(24-INCVALUE_SHIFT_n) 440*b67e1913SBruce Allan * bits to count nanoseconds leaving the rest for fractional nonseconds. 441*b67e1913SBruce Allan */ 442*b67e1913SBruce Allan #define INCVALUE_96MHz 125 443*b67e1913SBruce Allan #define INCVALUE_SHIFT_96MHz 17 444*b67e1913SBruce Allan #define INCPERIOD_SHIFT_96MHz 2 445*b67e1913SBruce Allan #define INCPERIOD_96MHz (12 >> INCPERIOD_SHIFT_96MHz) 446*b67e1913SBruce Allan 447*b67e1913SBruce Allan #define INCVALUE_25MHz 40 448*b67e1913SBruce Allan #define INCVALUE_SHIFT_25MHz 18 449*b67e1913SBruce Allan #define INCPERIOD_25MHz 1 450*b67e1913SBruce Allan 451*b67e1913SBruce Allan /* Another drawback of scaling the incvalue by a large factor is the 452*b67e1913SBruce Allan * 64-bit SYSTIM register overflows more quickly. This is dealt with 453*b67e1913SBruce Allan * by simply reading the clock before it overflows. 454*b67e1913SBruce Allan * 455*b67e1913SBruce Allan * Clock ns bits Overflows after 456*b67e1913SBruce Allan * ~~~~~~ ~~~~~~~ ~~~~~~~~~~~~~~~ 457*b67e1913SBruce Allan * 96MHz 47-bit 2^(47-INCPERIOD_SHIFT_96MHz) / 10^9 / 3600 = 9.77 hrs 458*b67e1913SBruce Allan * 25MHz 46-bit 2^46 / 10^9 / 3600 = 19.55 hours 459*b67e1913SBruce Allan */ 460*b67e1913SBruce Allan #define E1000_SYSTIM_OVERFLOW_PERIOD (HZ * 60 * 60 * 4) 461*b67e1913SBruce Allan 462dee1ad47SJeff Kirsher /* hardware capability, feature, and workaround flags */ 463dee1ad47SJeff Kirsher #define FLAG_HAS_AMT (1 << 0) 464dee1ad47SJeff Kirsher #define FLAG_HAS_FLASH (1 << 1) 465dee1ad47SJeff Kirsher #define FLAG_HAS_HW_VLAN_FILTER (1 << 2) 466dee1ad47SJeff Kirsher #define FLAG_HAS_WOL (1 << 3) 46779d4e908SBruce Allan /* reserved bit4 */ 468dee1ad47SJeff Kirsher #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) 469dee1ad47SJeff Kirsher #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) 470dee1ad47SJeff Kirsher #define FLAG_HAS_JUMBO_FRAMES (1 << 7) 471dee1ad47SJeff Kirsher #define FLAG_READ_ONLY_NVM (1 << 8) 472dee1ad47SJeff Kirsher #define FLAG_IS_ICH (1 << 9) 473dee1ad47SJeff Kirsher #define FLAG_HAS_MSIX (1 << 10) 474dee1ad47SJeff Kirsher #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) 475dee1ad47SJeff Kirsher #define FLAG_IS_QUAD_PORT_A (1 << 12) 476dee1ad47SJeff Kirsher #define FLAG_IS_QUAD_PORT (1 << 13) 477*b67e1913SBruce Allan #define FLAG_HAS_HW_TIMESTAMP (1 << 14) 478dee1ad47SJeff Kirsher #define FLAG_APME_IN_WUC (1 << 15) 479dee1ad47SJeff Kirsher #define FLAG_APME_IN_CTRL3 (1 << 16) 480dee1ad47SJeff Kirsher #define FLAG_APME_CHECK_PORT_B (1 << 17) 481dee1ad47SJeff Kirsher #define FLAG_DISABLE_FC_PAUSE_TIME (1 << 18) 482dee1ad47SJeff Kirsher #define FLAG_NO_WAKE_UCAST (1 << 19) 483dee1ad47SJeff Kirsher #define FLAG_MNG_PT_ENABLED (1 << 20) 484dee1ad47SJeff Kirsher #define FLAG_RESET_OVERWRITES_LAA (1 << 21) 485dee1ad47SJeff Kirsher #define FLAG_TARC_SPEED_MODE_BIT (1 << 22) 486dee1ad47SJeff Kirsher #define FLAG_TARC_SET_BIT_ZERO (1 << 23) 487dee1ad47SJeff Kirsher #define FLAG_RX_NEEDS_RESTART (1 << 24) 488dee1ad47SJeff Kirsher #define FLAG_LSC_GIG_SPEED_DROP (1 << 25) 489dee1ad47SJeff Kirsher #define FLAG_SMART_POWER_DOWN (1 << 26) 490dee1ad47SJeff Kirsher #define FLAG_MSI_ENABLED (1 << 27) 491dc221294SBruce Allan /* reserved (1 << 28) */ 492dee1ad47SJeff Kirsher #define FLAG_TSO_FORCE (1 << 29) 49312d43f7dSBruce Allan #define FLAG_RESTART_NOW (1 << 30) 494dee1ad47SJeff Kirsher #define FLAG_MSI_TEST_FAILED (1 << 31) 495dee1ad47SJeff Kirsher 496dee1ad47SJeff Kirsher #define FLAG2_CRC_STRIPPING (1 << 0) 497dee1ad47SJeff Kirsher #define FLAG2_HAS_PHY_WAKEUP (1 << 1) 498dee1ad47SJeff Kirsher #define FLAG2_IS_DISCARDING (1 << 2) 499dee1ad47SJeff Kirsher #define FLAG2_DISABLE_ASPM_L1 (1 << 3) 500dee1ad47SJeff Kirsher #define FLAG2_HAS_PHY_STATS (1 << 4) 501dee1ad47SJeff Kirsher #define FLAG2_HAS_EEE (1 << 5) 502dee1ad47SJeff Kirsher #define FLAG2_DMA_BURST (1 << 6) 503dee1ad47SJeff Kirsher #define FLAG2_DISABLE_ASPM_L0S (1 << 7) 504dee1ad47SJeff Kirsher #define FLAG2_DISABLE_AIM (1 << 8) 505dee1ad47SJeff Kirsher #define FLAG2_CHECK_PHY_HANG (1 << 9) 506823dcd25SDavid S. Miller #define FLAG2_NO_DISABLE_RX (1 << 10) 507823dcd25SDavid S. Miller #define FLAG2_PCIM2PCI_ARBITER_WA (1 << 11) 5080184039aSBen Greear #define FLAG2_DFLT_CRC_STRIPPING (1 << 12) 509*b67e1913SBruce Allan #define FLAG2_CHECK_RX_HWTSTAMP (1 << 13) 510dee1ad47SJeff Kirsher 511dee1ad47SJeff Kirsher #define E1000_RX_DESC_PS(R, i) \ 512dee1ad47SJeff Kirsher (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) 5135f450212SBruce Allan #define E1000_RX_DESC_EXT(R, i) \ 5145f450212SBruce Allan (&(((union e1000_rx_desc_extended *)((R).desc))[i])) 515dee1ad47SJeff Kirsher #define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) 516dee1ad47SJeff Kirsher #define E1000_TX_DESC(R, i) E1000_GET_DESC(R, i, e1000_tx_desc) 517dee1ad47SJeff Kirsher #define E1000_CONTEXT_DESC(R, i) E1000_GET_DESC(R, i, e1000_context_desc) 518dee1ad47SJeff Kirsher 519dee1ad47SJeff Kirsher enum e1000_state_t { 520dee1ad47SJeff Kirsher __E1000_TESTING, 521dee1ad47SJeff Kirsher __E1000_RESETTING, 522a90b412cSBruce Allan __E1000_ACCESS_SHARED_RESOURCE, 523dee1ad47SJeff Kirsher __E1000_DOWN 524dee1ad47SJeff Kirsher }; 525dee1ad47SJeff Kirsher 526dee1ad47SJeff Kirsher enum latency_range { 527dee1ad47SJeff Kirsher lowest_latency = 0, 528dee1ad47SJeff Kirsher low_latency = 1, 529dee1ad47SJeff Kirsher bulk_latency = 2, 530dee1ad47SJeff Kirsher latency_invalid = 255 531dee1ad47SJeff Kirsher }; 532dee1ad47SJeff Kirsher 533dee1ad47SJeff Kirsher extern char e1000e_driver_name[]; 534dee1ad47SJeff Kirsher extern const char e1000e_driver_version[]; 535dee1ad47SJeff Kirsher 536dee1ad47SJeff Kirsher extern void e1000e_check_options(struct e1000_adapter *adapter); 537dee1ad47SJeff Kirsher extern void e1000e_set_ethtool_ops(struct net_device *netdev); 538dee1ad47SJeff Kirsher 539dee1ad47SJeff Kirsher extern int e1000e_up(struct e1000_adapter *adapter); 540dee1ad47SJeff Kirsher extern void e1000e_down(struct e1000_adapter *adapter); 541dee1ad47SJeff Kirsher extern void e1000e_reinit_locked(struct e1000_adapter *adapter); 542dee1ad47SJeff Kirsher extern void e1000e_reset(struct e1000_adapter *adapter); 543dee1ad47SJeff Kirsher extern void e1000e_power_up_phy(struct e1000_adapter *adapter); 54455aa6985SBruce Allan extern int e1000e_setup_rx_resources(struct e1000_ring *ring); 54555aa6985SBruce Allan extern int e1000e_setup_tx_resources(struct e1000_ring *ring); 54655aa6985SBruce Allan extern void e1000e_free_rx_resources(struct e1000_ring *ring); 54755aa6985SBruce Allan extern void e1000e_free_tx_resources(struct e1000_ring *ring); 548dee1ad47SJeff Kirsher extern struct rtnl_link_stats64 *e1000e_get_stats64(struct net_device *netdev, 549dee1ad47SJeff Kirsher struct rtnl_link_stats64 550dee1ad47SJeff Kirsher *stats); 551dee1ad47SJeff Kirsher extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter); 552dee1ad47SJeff Kirsher extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); 553dee1ad47SJeff Kirsher extern void e1000e_get_hw_control(struct e1000_adapter *adapter); 554dee1ad47SJeff Kirsher extern void e1000e_release_hw_control(struct e1000_adapter *adapter); 55522a4cca2SMatthew Vick extern void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr); 556dee1ad47SJeff Kirsher 557dee1ad47SJeff Kirsher extern unsigned int copybreak; 558dee1ad47SJeff Kirsher 559dee1ad47SJeff Kirsher extern char *e1000e_get_hw_dev_name(struct e1000_hw *hw); 560dee1ad47SJeff Kirsher 5618ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_82571_info; 5628ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_82572_info; 5638ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_82573_info; 5648ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_82574_info; 5658ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_82583_info; 5668ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_ich8_info; 5678ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_ich9_info; 5688ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_ich10_info; 5698ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_pch_info; 5708ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_pch2_info; 5712fbe4526SBruce Allan extern const struct e1000_info e1000_pch_lpt_info; 5728ce9d6c7SJeff Kirsher extern const struct e1000_info e1000_es2_info; 573dee1ad47SJeff Kirsher 574dee1ad47SJeff Kirsher extern s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num, 575dee1ad47SJeff Kirsher u32 pba_num_size); 576dee1ad47SJeff Kirsher 577dee1ad47SJeff Kirsher extern s32 e1000e_commit_phy(struct e1000_hw *hw); 578dee1ad47SJeff Kirsher 579dee1ad47SJeff Kirsher extern bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw); 580dee1ad47SJeff Kirsher 581dee1ad47SJeff Kirsher extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); 582dee1ad47SJeff Kirsher extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); 583dee1ad47SJeff Kirsher 584dee1ad47SJeff Kirsher extern void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw); 585dee1ad47SJeff Kirsher extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, 586dee1ad47SJeff Kirsher bool state); 587dee1ad47SJeff Kirsher extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); 588dee1ad47SJeff Kirsher extern void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw); 589dee1ad47SJeff Kirsher extern void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw); 590dee1ad47SJeff Kirsher extern void e1000_resume_workarounds_pchlan(struct e1000_hw *hw); 591dee1ad47SJeff Kirsher extern s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable); 592dee1ad47SJeff Kirsher extern s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable); 593dee1ad47SJeff Kirsher extern void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw); 594dee1ad47SJeff Kirsher 595dee1ad47SJeff Kirsher extern s32 e1000e_check_for_copper_link(struct e1000_hw *hw); 596dee1ad47SJeff Kirsher extern s32 e1000e_check_for_fiber_link(struct e1000_hw *hw); 597dee1ad47SJeff Kirsher extern s32 e1000e_check_for_serdes_link(struct e1000_hw *hw); 598dee1ad47SJeff Kirsher extern s32 e1000e_setup_led_generic(struct e1000_hw *hw); 599dee1ad47SJeff Kirsher extern s32 e1000e_cleanup_led_generic(struct e1000_hw *hw); 600dee1ad47SJeff Kirsher extern s32 e1000e_led_on_generic(struct e1000_hw *hw); 601dee1ad47SJeff Kirsher extern s32 e1000e_led_off_generic(struct e1000_hw *hw); 602dee1ad47SJeff Kirsher extern s32 e1000e_get_bus_info_pcie(struct e1000_hw *hw); 603dee1ad47SJeff Kirsher extern void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw); 604dee1ad47SJeff Kirsher extern void e1000_set_lan_id_single_port(struct e1000_hw *hw); 605dee1ad47SJeff Kirsher extern s32 e1000e_get_speed_and_duplex_copper(struct e1000_hw *hw, u16 *speed, u16 *duplex); 606dee1ad47SJeff Kirsher extern s32 e1000e_get_speed_and_duplex_fiber_serdes(struct e1000_hw *hw, u16 *speed, u16 *duplex); 607dee1ad47SJeff Kirsher extern s32 e1000e_disable_pcie_master(struct e1000_hw *hw); 608dee1ad47SJeff Kirsher extern s32 e1000e_get_auto_rd_done(struct e1000_hw *hw); 609d1964eb1SBruce Allan extern s32 e1000e_id_led_init_generic(struct e1000_hw *hw); 610dee1ad47SJeff Kirsher extern void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw); 611dee1ad47SJeff Kirsher extern s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw); 612dee1ad47SJeff Kirsher extern s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw); 613dee1ad47SJeff Kirsher extern s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw); 6141a46b40fSBruce Allan extern s32 e1000e_setup_link_generic(struct e1000_hw *hw); 615dee1ad47SJeff Kirsher extern void e1000_clear_vfta_generic(struct e1000_hw *hw); 616dee1ad47SJeff Kirsher extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count); 617dee1ad47SJeff Kirsher extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, 618dee1ad47SJeff Kirsher u8 *mc_addr_list, 619dee1ad47SJeff Kirsher u32 mc_addr_count); 62069e1e019SBruce Allan extern void e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); 621dee1ad47SJeff Kirsher extern s32 e1000e_set_fc_watermarks(struct e1000_hw *hw); 622dee1ad47SJeff Kirsher extern void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop); 623dee1ad47SJeff Kirsher extern s32 e1000e_get_hw_semaphore(struct e1000_hw *hw); 624dee1ad47SJeff Kirsher extern s32 e1000e_valid_led_default(struct e1000_hw *hw, u16 *data); 62557cde763SBruce Allan extern void e1000e_config_collision_dist_generic(struct e1000_hw *hw); 626dee1ad47SJeff Kirsher extern s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw); 627dee1ad47SJeff Kirsher extern s32 e1000e_force_mac_fc(struct e1000_hw *hw); 628dee1ad47SJeff Kirsher extern s32 e1000e_blink_led_generic(struct e1000_hw *hw); 629dee1ad47SJeff Kirsher extern void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value); 630dee1ad47SJeff Kirsher extern s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw); 631dee1ad47SJeff Kirsher extern void e1000e_reset_adaptive(struct e1000_hw *hw); 632dee1ad47SJeff Kirsher extern void e1000e_update_adaptive(struct e1000_hw *hw); 633dee1ad47SJeff Kirsher 634dee1ad47SJeff Kirsher extern s32 e1000e_setup_copper_link(struct e1000_hw *hw); 635dee1ad47SJeff Kirsher extern s32 e1000e_get_phy_id(struct e1000_hw *hw); 636dee1ad47SJeff Kirsher extern void e1000e_put_hw_semaphore(struct e1000_hw *hw); 637dee1ad47SJeff Kirsher extern s32 e1000e_check_reset_block_generic(struct e1000_hw *hw); 638dee1ad47SJeff Kirsher extern s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw); 639dee1ad47SJeff Kirsher extern s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw); 640dee1ad47SJeff Kirsher extern s32 e1000e_get_phy_info_igp(struct e1000_hw *hw); 641dee1ad47SJeff Kirsher extern s32 e1000_set_page_igp(struct e1000_hw *hw, u16 page); 642dee1ad47SJeff Kirsher extern s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); 643dee1ad47SJeff Kirsher extern s32 e1000e_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, 644dee1ad47SJeff Kirsher u16 *data); 645dee1ad47SJeff Kirsher extern s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw); 646dee1ad47SJeff Kirsher extern s32 e1000e_set_d3_lplu_state(struct e1000_hw *hw, bool active); 647dee1ad47SJeff Kirsher extern s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); 648dee1ad47SJeff Kirsher extern s32 e1000e_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, 649dee1ad47SJeff Kirsher u16 data); 650dee1ad47SJeff Kirsher extern s32 e1000e_phy_sw_reset(struct e1000_hw *hw); 651dee1ad47SJeff Kirsher extern s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw); 652dee1ad47SJeff Kirsher extern s32 e1000e_get_cfg_done(struct e1000_hw *hw); 653dee1ad47SJeff Kirsher extern s32 e1000e_get_cable_length_m88(struct e1000_hw *hw); 654dee1ad47SJeff Kirsher extern s32 e1000e_get_phy_info_m88(struct e1000_hw *hw); 655dee1ad47SJeff Kirsher extern s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); 656dee1ad47SJeff Kirsher extern s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); 657dee1ad47SJeff Kirsher extern s32 e1000e_phy_init_script_igp3(struct e1000_hw *hw); 658dee1ad47SJeff Kirsher extern enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id); 659dee1ad47SJeff Kirsher extern s32 e1000e_determine_phy_address(struct e1000_hw *hw); 660dee1ad47SJeff Kirsher extern s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data); 661dee1ad47SJeff Kirsher extern s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data); 662dee1ad47SJeff Kirsher extern s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, 663dee1ad47SJeff Kirsher u16 *phy_reg); 664dee1ad47SJeff Kirsher extern s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, 665dee1ad47SJeff Kirsher u16 *phy_reg); 666dee1ad47SJeff Kirsher extern s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data); 667dee1ad47SJeff Kirsher extern s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data); 668dee1ad47SJeff Kirsher extern void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); 669dee1ad47SJeff Kirsher extern s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); 670dee1ad47SJeff Kirsher extern s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, 671dee1ad47SJeff Kirsher u16 data); 672dee1ad47SJeff Kirsher extern s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); 673dee1ad47SJeff Kirsher extern s32 e1000e_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, 674dee1ad47SJeff Kirsher u16 *data); 675dee1ad47SJeff Kirsher extern s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, 676dee1ad47SJeff Kirsher u32 usec_interval, bool *success); 677dee1ad47SJeff Kirsher extern s32 e1000e_phy_reset_dsp(struct e1000_hw *hw); 678dee1ad47SJeff Kirsher extern void e1000_power_up_phy_copper(struct e1000_hw *hw); 679dee1ad47SJeff Kirsher extern void e1000_power_down_phy_copper(struct e1000_hw *hw); 680dee1ad47SJeff Kirsher extern s32 e1000e_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data); 681dee1ad47SJeff Kirsher extern s32 e1000e_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data); 682dee1ad47SJeff Kirsher extern s32 e1000e_check_downshift(struct e1000_hw *hw); 683dee1ad47SJeff Kirsher extern s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data); 684dee1ad47SJeff Kirsher extern s32 e1000_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, 685dee1ad47SJeff Kirsher u16 *data); 686dee1ad47SJeff Kirsher extern s32 e1000_read_phy_reg_page_hv(struct e1000_hw *hw, u32 offset, 687dee1ad47SJeff Kirsher u16 *data); 688dee1ad47SJeff Kirsher extern s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data); 689dee1ad47SJeff Kirsher extern s32 e1000_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, 690dee1ad47SJeff Kirsher u16 data); 691dee1ad47SJeff Kirsher extern s32 e1000_write_phy_reg_page_hv(struct e1000_hw *hw, u32 offset, 692dee1ad47SJeff Kirsher u16 data); 693dee1ad47SJeff Kirsher extern s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw); 694dee1ad47SJeff Kirsher extern s32 e1000_copper_link_setup_82577(struct e1000_hw *hw); 695dee1ad47SJeff Kirsher extern s32 e1000_check_polarity_82577(struct e1000_hw *hw); 696dee1ad47SJeff Kirsher extern s32 e1000_get_phy_info_82577(struct e1000_hw *hw); 697dee1ad47SJeff Kirsher extern s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw); 698dee1ad47SJeff Kirsher extern s32 e1000_get_cable_length_82577(struct e1000_hw *hw); 699dee1ad47SJeff Kirsher 700dee1ad47SJeff Kirsher extern s32 e1000_check_polarity_m88(struct e1000_hw *hw); 701dee1ad47SJeff Kirsher extern s32 e1000_get_phy_info_ife(struct e1000_hw *hw); 702dee1ad47SJeff Kirsher extern s32 e1000_check_polarity_ife(struct e1000_hw *hw); 703dee1ad47SJeff Kirsher extern s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw); 704dee1ad47SJeff Kirsher extern s32 e1000_check_polarity_igp(struct e1000_hw *hw); 705dee1ad47SJeff Kirsher extern bool e1000_check_phy_82574(struct e1000_hw *hw); 706203e4151SBruce Allan extern s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data); 707dee1ad47SJeff Kirsher 708dee1ad47SJeff Kirsher static inline s32 e1000_phy_hw_reset(struct e1000_hw *hw) 709dee1ad47SJeff Kirsher { 710dee1ad47SJeff Kirsher return hw->phy.ops.reset(hw); 711dee1ad47SJeff Kirsher } 712dee1ad47SJeff Kirsher 713dee1ad47SJeff Kirsher static inline s32 e1e_rphy(struct e1000_hw *hw, u32 offset, u16 *data) 714dee1ad47SJeff Kirsher { 715dee1ad47SJeff Kirsher return hw->phy.ops.read_reg(hw, offset, data); 716dee1ad47SJeff Kirsher } 717dee1ad47SJeff Kirsher 718f1430d69SBruce Allan static inline s32 e1e_rphy_locked(struct e1000_hw *hw, u32 offset, u16 *data) 719f1430d69SBruce Allan { 720f1430d69SBruce Allan return hw->phy.ops.read_reg_locked(hw, offset, data); 721f1430d69SBruce Allan } 722f1430d69SBruce Allan 723dee1ad47SJeff Kirsher static inline s32 e1e_wphy(struct e1000_hw *hw, u32 offset, u16 data) 724dee1ad47SJeff Kirsher { 725dee1ad47SJeff Kirsher return hw->phy.ops.write_reg(hw, offset, data); 726dee1ad47SJeff Kirsher } 727dee1ad47SJeff Kirsher 728f1430d69SBruce Allan static inline s32 e1e_wphy_locked(struct e1000_hw *hw, u32 offset, u16 data) 729f1430d69SBruce Allan { 730f1430d69SBruce Allan return hw->phy.ops.write_reg_locked(hw, offset, data); 731f1430d69SBruce Allan } 732f1430d69SBruce Allan 733dee1ad47SJeff Kirsher static inline s32 e1000_get_cable_length(struct e1000_hw *hw) 734dee1ad47SJeff Kirsher { 735dee1ad47SJeff Kirsher return hw->phy.ops.get_cable_length(hw); 736dee1ad47SJeff Kirsher } 737dee1ad47SJeff Kirsher 738dee1ad47SJeff Kirsher extern s32 e1000e_acquire_nvm(struct e1000_hw *hw); 739dee1ad47SJeff Kirsher extern s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); 740dee1ad47SJeff Kirsher extern s32 e1000e_update_nvm_checksum_generic(struct e1000_hw *hw); 741dee1ad47SJeff Kirsher extern s32 e1000e_poll_eerd_eewr_done(struct e1000_hw *hw, int ee_reg); 742dee1ad47SJeff Kirsher extern s32 e1000e_read_nvm_eerd(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); 743dee1ad47SJeff Kirsher extern s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw); 744dee1ad47SJeff Kirsher extern void e1000e_release_nvm(struct e1000_hw *hw); 745e85e3639SBruce Allan extern void e1000e_reload_nvm_generic(struct e1000_hw *hw); 746dee1ad47SJeff Kirsher extern s32 e1000_read_mac_addr_generic(struct e1000_hw *hw); 747dee1ad47SJeff Kirsher 748dee1ad47SJeff Kirsher static inline s32 e1000e_read_mac_addr(struct e1000_hw *hw) 749dee1ad47SJeff Kirsher { 750dee1ad47SJeff Kirsher if (hw->mac.ops.read_mac_addr) 751dee1ad47SJeff Kirsher return hw->mac.ops.read_mac_addr(hw); 752dee1ad47SJeff Kirsher 753dee1ad47SJeff Kirsher return e1000_read_mac_addr_generic(hw); 754dee1ad47SJeff Kirsher } 755dee1ad47SJeff Kirsher 756dee1ad47SJeff Kirsher static inline s32 e1000_validate_nvm_checksum(struct e1000_hw *hw) 757dee1ad47SJeff Kirsher { 758dee1ad47SJeff Kirsher return hw->nvm.ops.validate(hw); 759dee1ad47SJeff Kirsher } 760dee1ad47SJeff Kirsher 761dee1ad47SJeff Kirsher static inline s32 e1000e_update_nvm_checksum(struct e1000_hw *hw) 762dee1ad47SJeff Kirsher { 763dee1ad47SJeff Kirsher return hw->nvm.ops.update(hw); 764dee1ad47SJeff Kirsher } 765dee1ad47SJeff Kirsher 766dee1ad47SJeff Kirsher static inline s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 767dee1ad47SJeff Kirsher { 768dee1ad47SJeff Kirsher return hw->nvm.ops.read(hw, offset, words, data); 769dee1ad47SJeff Kirsher } 770dee1ad47SJeff Kirsher 771dee1ad47SJeff Kirsher static inline s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 772dee1ad47SJeff Kirsher { 773dee1ad47SJeff Kirsher return hw->nvm.ops.write(hw, offset, words, data); 774dee1ad47SJeff Kirsher } 775dee1ad47SJeff Kirsher 776dee1ad47SJeff Kirsher static inline s32 e1000_get_phy_info(struct e1000_hw *hw) 777dee1ad47SJeff Kirsher { 778dee1ad47SJeff Kirsher return hw->phy.ops.get_info(hw); 779dee1ad47SJeff Kirsher } 780dee1ad47SJeff Kirsher 781dee1ad47SJeff Kirsher extern bool e1000e_check_mng_mode_generic(struct e1000_hw *hw); 782dee1ad47SJeff Kirsher extern bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw); 783dee1ad47SJeff Kirsher extern s32 e1000e_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length); 784dee1ad47SJeff Kirsher 785dee1ad47SJeff Kirsher static inline u32 __er32(struct e1000_hw *hw, unsigned long reg) 786dee1ad47SJeff Kirsher { 787dee1ad47SJeff Kirsher return readl(hw->hw_addr + reg); 788dee1ad47SJeff Kirsher } 789dee1ad47SJeff Kirsher 790bdc125f7SBruce Allan #define er32(reg) __er32(hw, E1000_##reg) 791bdc125f7SBruce Allan 792bdc125f7SBruce Allan /** 793bdc125f7SBruce Allan * __ew32_prepare - prepare to write to MAC CSR register on certain parts 794bdc125f7SBruce Allan * @hw: pointer to the HW structure 795bdc125f7SBruce Allan * 796bdc125f7SBruce Allan * When updating the MAC CSR registers, the Manageability Engine (ME) could 797bdc125f7SBruce Allan * be accessing the registers at the same time. Normally, this is handled in 798bdc125f7SBruce Allan * h/w by an arbiter but on some parts there is a bug that acknowledges Host 799bdc125f7SBruce Allan * accesses later than it should which could result in the register to have 800bdc125f7SBruce Allan * an incorrect value. Workaround this by checking the FWSM register which 801bdc125f7SBruce Allan * has bit 24 set while ME is accessing MAC CSR registers, wait if it is set 802bdc125f7SBruce Allan * and try again a number of times. 803bdc125f7SBruce Allan **/ 804bdc125f7SBruce Allan static inline s32 __ew32_prepare(struct e1000_hw *hw) 805bdc125f7SBruce Allan { 806bdc125f7SBruce Allan s32 i = E1000_ICH_FWSM_PCIM2PCI_COUNT; 807bdc125f7SBruce Allan 808bdc125f7SBruce Allan while ((er32(FWSM) & E1000_ICH_FWSM_PCIM2PCI) && --i) 809bdc125f7SBruce Allan udelay(50); 810bdc125f7SBruce Allan 811bdc125f7SBruce Allan return i; 812bdc125f7SBruce Allan } 813bdc125f7SBruce Allan 814dee1ad47SJeff Kirsher static inline void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val) 815dee1ad47SJeff Kirsher { 816bdc125f7SBruce Allan if (hw->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA) 817bdc125f7SBruce Allan __ew32_prepare(hw); 818bdc125f7SBruce Allan 819dee1ad47SJeff Kirsher writel(val, hw->hw_addr + reg); 820dee1ad47SJeff Kirsher } 821dee1ad47SJeff Kirsher 822bdc125f7SBruce Allan #define ew32(reg, val) __ew32(hw, E1000_##reg, (val)) 823bdc125f7SBruce Allan 824bdc125f7SBruce Allan #define e1e_flush() er32(STATUS) 825bdc125f7SBruce Allan 826bdc125f7SBruce Allan #define E1000_WRITE_REG_ARRAY(a, reg, offset, value) \ 827bdc125f7SBruce Allan (__ew32((a), (reg + ((offset) << 2)), (value))) 828bdc125f7SBruce Allan 829bdc125f7SBruce Allan #define E1000_READ_REG_ARRAY(a, reg, offset) \ 830bdc125f7SBruce Allan (readl((a)->hw_addr + reg + ((offset) << 2))) 831bdc125f7SBruce Allan 832dee1ad47SJeff Kirsher #endif /* _E1000_H_ */ 833