xref: /freebsd/sys/dev/e1000/e1000_hw.h (revision d035aa2db2f9b7ff561faf83704590a531a6d767)
18cfa0ad2SJack F Vogel /******************************************************************************
28cfa0ad2SJack F Vogel 
3d035aa2dSJack F Vogel   Copyright (c) 2001-2009, Intel Corporation
48cfa0ad2SJack F Vogel   All rights reserved.
58cfa0ad2SJack F Vogel 
68cfa0ad2SJack F Vogel   Redistribution and use in source and binary forms, with or without
78cfa0ad2SJack F Vogel   modification, are permitted provided that the following conditions are met:
88cfa0ad2SJack F Vogel 
98cfa0ad2SJack F Vogel    1. Redistributions of source code must retain the above copyright notice,
108cfa0ad2SJack F Vogel       this list of conditions and the following disclaimer.
118cfa0ad2SJack F Vogel 
128cfa0ad2SJack F Vogel    2. Redistributions in binary form must reproduce the above copyright
138cfa0ad2SJack F Vogel       notice, this list of conditions and the following disclaimer in the
148cfa0ad2SJack F Vogel       documentation and/or other materials provided with the distribution.
158cfa0ad2SJack F Vogel 
168cfa0ad2SJack F Vogel    3. Neither the name of the Intel Corporation nor the names of its
178cfa0ad2SJack F Vogel       contributors may be used to endorse or promote products derived from
188cfa0ad2SJack F Vogel       this software without specific prior written permission.
198cfa0ad2SJack F Vogel 
208cfa0ad2SJack F Vogel   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
218cfa0ad2SJack F Vogel   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
228cfa0ad2SJack F Vogel   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
238cfa0ad2SJack F Vogel   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
248cfa0ad2SJack F Vogel   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
258cfa0ad2SJack F Vogel   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
268cfa0ad2SJack F Vogel   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
278cfa0ad2SJack F Vogel   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
288cfa0ad2SJack F Vogel   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
298cfa0ad2SJack F Vogel   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
308cfa0ad2SJack F Vogel   POSSIBILITY OF SUCH DAMAGE.
318cfa0ad2SJack F Vogel 
328cfa0ad2SJack F Vogel ******************************************************************************/
338cfa0ad2SJack F Vogel /*$FreeBSD$*/
348cfa0ad2SJack F Vogel 
358cfa0ad2SJack F Vogel #ifndef _E1000_HW_H_
368cfa0ad2SJack F Vogel #define _E1000_HW_H_
378cfa0ad2SJack F Vogel 
388cfa0ad2SJack F Vogel #include "e1000_osdep.h"
398cfa0ad2SJack F Vogel #include "e1000_regs.h"
408cfa0ad2SJack F Vogel #include "e1000_defines.h"
418cfa0ad2SJack F Vogel 
428cfa0ad2SJack F Vogel struct e1000_hw;
438cfa0ad2SJack F Vogel 
448cfa0ad2SJack F Vogel #define E1000_DEV_ID_82542                    0x1000
458cfa0ad2SJack F Vogel #define E1000_DEV_ID_82543GC_FIBER            0x1001
468cfa0ad2SJack F Vogel #define E1000_DEV_ID_82543GC_COPPER           0x1004
478cfa0ad2SJack F Vogel #define E1000_DEV_ID_82544EI_COPPER           0x1008
488cfa0ad2SJack F Vogel #define E1000_DEV_ID_82544EI_FIBER            0x1009
498cfa0ad2SJack F Vogel #define E1000_DEV_ID_82544GC_COPPER           0x100C
508cfa0ad2SJack F Vogel #define E1000_DEV_ID_82544GC_LOM              0x100D
518cfa0ad2SJack F Vogel #define E1000_DEV_ID_82540EM                  0x100E
528cfa0ad2SJack F Vogel #define E1000_DEV_ID_82540EM_LOM              0x1015
538cfa0ad2SJack F Vogel #define E1000_DEV_ID_82540EP_LOM              0x1016
548cfa0ad2SJack F Vogel #define E1000_DEV_ID_82540EP                  0x1017
558cfa0ad2SJack F Vogel #define E1000_DEV_ID_82540EP_LP               0x101E
568cfa0ad2SJack F Vogel #define E1000_DEV_ID_82545EM_COPPER           0x100F
578cfa0ad2SJack F Vogel #define E1000_DEV_ID_82545EM_FIBER            0x1011
588cfa0ad2SJack F Vogel #define E1000_DEV_ID_82545GM_COPPER           0x1026
598cfa0ad2SJack F Vogel #define E1000_DEV_ID_82545GM_FIBER            0x1027
608cfa0ad2SJack F Vogel #define E1000_DEV_ID_82545GM_SERDES           0x1028
618cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546EB_COPPER           0x1010
628cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546EB_FIBER            0x1012
638cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546EB_QUAD_COPPER      0x101D
648cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546GB_COPPER           0x1079
658cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546GB_FIBER            0x107A
668cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546GB_SERDES           0x107B
678cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546GB_PCIE             0x108A
688cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546GB_QUAD_COPPER      0x1099
698cfa0ad2SJack F Vogel #define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5
708cfa0ad2SJack F Vogel #define E1000_DEV_ID_82541EI                  0x1013
718cfa0ad2SJack F Vogel #define E1000_DEV_ID_82541EI_MOBILE           0x1018
728cfa0ad2SJack F Vogel #define E1000_DEV_ID_82541ER_LOM              0x1014
738cfa0ad2SJack F Vogel #define E1000_DEV_ID_82541ER                  0x1078
748cfa0ad2SJack F Vogel #define E1000_DEV_ID_82541GI                  0x1076
758cfa0ad2SJack F Vogel #define E1000_DEV_ID_82541GI_LF               0x107C
768cfa0ad2SJack F Vogel #define E1000_DEV_ID_82541GI_MOBILE           0x1077
778cfa0ad2SJack F Vogel #define E1000_DEV_ID_82547EI                  0x1019
788cfa0ad2SJack F Vogel #define E1000_DEV_ID_82547EI_MOBILE           0x101A
798cfa0ad2SJack F Vogel #define E1000_DEV_ID_82547GI                  0x1075
808cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_COPPER           0x105E
818cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_FIBER            0x105F
828cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_SERDES           0x1060
838cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_SERDES_DUAL      0x10D9
848cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_SERDES_QUAD      0x10DA
858cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_QUAD_COPPER      0x10A4
868cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571PT_QUAD_COPPER      0x10D5
878cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_QUAD_FIBER       0x10A5
888cfa0ad2SJack F Vogel #define E1000_DEV_ID_82571EB_QUAD_COPPER_LP   0x10BC
898cfa0ad2SJack F Vogel #define E1000_DEV_ID_82572EI_COPPER           0x107D
908cfa0ad2SJack F Vogel #define E1000_DEV_ID_82572EI_FIBER            0x107E
918cfa0ad2SJack F Vogel #define E1000_DEV_ID_82572EI_SERDES           0x107F
928cfa0ad2SJack F Vogel #define E1000_DEV_ID_82572EI                  0x10B9
938cfa0ad2SJack F Vogel #define E1000_DEV_ID_82573E                   0x108B
948cfa0ad2SJack F Vogel #define E1000_DEV_ID_82573E_IAMT              0x108C
958cfa0ad2SJack F Vogel #define E1000_DEV_ID_82573L                   0x109A
968cfa0ad2SJack F Vogel #define E1000_DEV_ID_82574L                   0x10D3
97d035aa2dSJack F Vogel #define E1000_DEV_ID_82574LA                  0x10F6
988cfa0ad2SJack F Vogel #define E1000_DEV_ID_80003ES2LAN_COPPER_DPT   0x1096
998cfa0ad2SJack F Vogel #define E1000_DEV_ID_80003ES2LAN_SERDES_DPT   0x1098
1008cfa0ad2SJack F Vogel #define E1000_DEV_ID_80003ES2LAN_COPPER_SPT   0x10BA
1018cfa0ad2SJack F Vogel #define E1000_DEV_ID_80003ES2LAN_SERDES_SPT   0x10BB
1028cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH8_IGP_M_AMT           0x1049
1038cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH8_IGP_AMT             0x104A
1048cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH8_IGP_C               0x104B
1058cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH8_IFE                 0x104C
1068cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH8_IFE_GT              0x10C4
1078cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH8_IFE_G               0x10C5
1088cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH8_IGP_M               0x104D
1098cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IGP_M               0x10BF
1108cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IGP_M_AMT           0x10F5
1118cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IGP_M_V             0x10CB
1128cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IGP_AMT             0x10BD
1138cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_BM                  0x10E5
1148cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IGP_C               0x294C
1158cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IFE                 0x10C0
1168cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IFE_GT              0x10C3
1178cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH9_IFE_G               0x10C2
1188cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH10_R_BM_LM            0x10CC
1198cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH10_R_BM_LF            0x10CD
1208cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH10_R_BM_V             0x10CE
1218cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH10_D_BM_LM            0x10DE
1228cfa0ad2SJack F Vogel #define E1000_DEV_ID_ICH10_D_BM_LF            0x10DF
1238cfa0ad2SJack F Vogel #define E1000_DEV_ID_82576                    0x10C9
1248cfa0ad2SJack F Vogel #define E1000_DEV_ID_82576_FIBER              0x10E6
1258cfa0ad2SJack F Vogel #define E1000_DEV_ID_82576_SERDES             0x10E7
1268cfa0ad2SJack F Vogel #define E1000_DEV_ID_82576_QUAD_COPPER        0x10E8
127d035aa2dSJack F Vogel #define E1000_DEV_ID_82576_NS                 0x150A
1288cfa0ad2SJack F Vogel #define E1000_DEV_ID_82575EB_COPPER           0x10A7
1298cfa0ad2SJack F Vogel #define E1000_DEV_ID_82575EB_FIBER_SERDES     0x10A9
1308cfa0ad2SJack F Vogel #define E1000_DEV_ID_82575GB_QUAD_COPPER      0x10D6
131d035aa2dSJack F Vogel #define E1000_DEV_ID_82575GB_QUAD_COPPER_PM   0x10E2
1328cfa0ad2SJack F Vogel #define E1000_REVISION_0 0
1338cfa0ad2SJack F Vogel #define E1000_REVISION_1 1
1348cfa0ad2SJack F Vogel #define E1000_REVISION_2 2
1358cfa0ad2SJack F Vogel #define E1000_REVISION_3 3
1368cfa0ad2SJack F Vogel #define E1000_REVISION_4 4
1378cfa0ad2SJack F Vogel 
1388cfa0ad2SJack F Vogel #define E1000_FUNC_0     0
1398cfa0ad2SJack F Vogel #define E1000_FUNC_1     1
1408cfa0ad2SJack F Vogel 
141d035aa2dSJack F Vogel #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0   0
142d035aa2dSJack F Vogel #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1   3
143d035aa2dSJack F Vogel 
1448cfa0ad2SJack F Vogel enum e1000_mac_type {
1458cfa0ad2SJack F Vogel 	e1000_undefined = 0,
1468cfa0ad2SJack F Vogel 	e1000_82542,
1478cfa0ad2SJack F Vogel 	e1000_82543,
1488cfa0ad2SJack F Vogel 	e1000_82544,
1498cfa0ad2SJack F Vogel 	e1000_82540,
1508cfa0ad2SJack F Vogel 	e1000_82545,
1518cfa0ad2SJack F Vogel 	e1000_82545_rev_3,
1528cfa0ad2SJack F Vogel 	e1000_82546,
1538cfa0ad2SJack F Vogel 	e1000_82546_rev_3,
1548cfa0ad2SJack F Vogel 	e1000_82541,
1558cfa0ad2SJack F Vogel 	e1000_82541_rev_2,
1568cfa0ad2SJack F Vogel 	e1000_82547,
1578cfa0ad2SJack F Vogel 	e1000_82547_rev_2,
1588cfa0ad2SJack F Vogel 	e1000_82571,
1598cfa0ad2SJack F Vogel 	e1000_82572,
1608cfa0ad2SJack F Vogel 	e1000_82573,
1618cfa0ad2SJack F Vogel 	e1000_82574,
1628cfa0ad2SJack F Vogel 	e1000_80003es2lan,
1638cfa0ad2SJack F Vogel 	e1000_ich8lan,
1648cfa0ad2SJack F Vogel 	e1000_ich9lan,
1658cfa0ad2SJack F Vogel 	e1000_ich10lan,
1668cfa0ad2SJack F Vogel 	e1000_82575,
1678cfa0ad2SJack F Vogel 	e1000_82576,
1688cfa0ad2SJack F Vogel 	e1000_num_macs  /* List is 1-based, so subtract 1 for TRUE count. */
1698cfa0ad2SJack F Vogel };
1708cfa0ad2SJack F Vogel 
1718cfa0ad2SJack F Vogel enum e1000_media_type {
1728cfa0ad2SJack F Vogel 	e1000_media_type_unknown = 0,
1738cfa0ad2SJack F Vogel 	e1000_media_type_copper = 1,
1748cfa0ad2SJack F Vogel 	e1000_media_type_fiber = 2,
1758cfa0ad2SJack F Vogel 	e1000_media_type_internal_serdes = 3,
1768cfa0ad2SJack F Vogel 	e1000_num_media_types
1778cfa0ad2SJack F Vogel };
1788cfa0ad2SJack F Vogel 
1798cfa0ad2SJack F Vogel enum e1000_nvm_type {
1808cfa0ad2SJack F Vogel 	e1000_nvm_unknown = 0,
1818cfa0ad2SJack F Vogel 	e1000_nvm_none,
1828cfa0ad2SJack F Vogel 	e1000_nvm_eeprom_spi,
1838cfa0ad2SJack F Vogel 	e1000_nvm_eeprom_microwire,
1848cfa0ad2SJack F Vogel 	e1000_nvm_flash_hw,
1858cfa0ad2SJack F Vogel 	e1000_nvm_flash_sw
1868cfa0ad2SJack F Vogel };
1878cfa0ad2SJack F Vogel 
1888cfa0ad2SJack F Vogel enum e1000_nvm_override {
1898cfa0ad2SJack F Vogel 	e1000_nvm_override_none = 0,
1908cfa0ad2SJack F Vogel 	e1000_nvm_override_spi_small,
1918cfa0ad2SJack F Vogel 	e1000_nvm_override_spi_large,
1928cfa0ad2SJack F Vogel 	e1000_nvm_override_microwire_small,
1938cfa0ad2SJack F Vogel 	e1000_nvm_override_microwire_large
1948cfa0ad2SJack F Vogel };
1958cfa0ad2SJack F Vogel 
1968cfa0ad2SJack F Vogel enum e1000_phy_type {
1978cfa0ad2SJack F Vogel 	e1000_phy_unknown = 0,
1988cfa0ad2SJack F Vogel 	e1000_phy_none,
1998cfa0ad2SJack F Vogel 	e1000_phy_m88,
2008cfa0ad2SJack F Vogel 	e1000_phy_igp,
2018cfa0ad2SJack F Vogel 	e1000_phy_igp_2,
2028cfa0ad2SJack F Vogel 	e1000_phy_gg82563,
2038cfa0ad2SJack F Vogel 	e1000_phy_igp_3,
2048cfa0ad2SJack F Vogel 	e1000_phy_ife,
2058cfa0ad2SJack F Vogel 	e1000_phy_bm,
2068cfa0ad2SJack F Vogel 	e1000_phy_vf,
2078cfa0ad2SJack F Vogel };
2088cfa0ad2SJack F Vogel 
2098cfa0ad2SJack F Vogel enum e1000_bus_type {
2108cfa0ad2SJack F Vogel 	e1000_bus_type_unknown = 0,
2118cfa0ad2SJack F Vogel 	e1000_bus_type_pci,
2128cfa0ad2SJack F Vogel 	e1000_bus_type_pcix,
2138cfa0ad2SJack F Vogel 	e1000_bus_type_pci_express,
2148cfa0ad2SJack F Vogel 	e1000_bus_type_reserved
2158cfa0ad2SJack F Vogel };
2168cfa0ad2SJack F Vogel 
2178cfa0ad2SJack F Vogel enum e1000_bus_speed {
2188cfa0ad2SJack F Vogel 	e1000_bus_speed_unknown = 0,
2198cfa0ad2SJack F Vogel 	e1000_bus_speed_33,
2208cfa0ad2SJack F Vogel 	e1000_bus_speed_66,
2218cfa0ad2SJack F Vogel 	e1000_bus_speed_100,
2228cfa0ad2SJack F Vogel 	e1000_bus_speed_120,
2238cfa0ad2SJack F Vogel 	e1000_bus_speed_133,
2248cfa0ad2SJack F Vogel 	e1000_bus_speed_2500,
2258cfa0ad2SJack F Vogel 	e1000_bus_speed_5000,
2268cfa0ad2SJack F Vogel 	e1000_bus_speed_reserved
2278cfa0ad2SJack F Vogel };
2288cfa0ad2SJack F Vogel 
2298cfa0ad2SJack F Vogel enum e1000_bus_width {
2308cfa0ad2SJack F Vogel 	e1000_bus_width_unknown = 0,
2318cfa0ad2SJack F Vogel 	e1000_bus_width_pcie_x1,
2328cfa0ad2SJack F Vogel 	e1000_bus_width_pcie_x2,
2338cfa0ad2SJack F Vogel 	e1000_bus_width_pcie_x4 = 4,
2348cfa0ad2SJack F Vogel 	e1000_bus_width_pcie_x8 = 8,
2358cfa0ad2SJack F Vogel 	e1000_bus_width_32,
2368cfa0ad2SJack F Vogel 	e1000_bus_width_64,
2378cfa0ad2SJack F Vogel 	e1000_bus_width_reserved
2388cfa0ad2SJack F Vogel };
2398cfa0ad2SJack F Vogel 
2408cfa0ad2SJack F Vogel enum e1000_1000t_rx_status {
2418cfa0ad2SJack F Vogel 	e1000_1000t_rx_status_not_ok = 0,
2428cfa0ad2SJack F Vogel 	e1000_1000t_rx_status_ok,
2438cfa0ad2SJack F Vogel 	e1000_1000t_rx_status_undefined = 0xFF
2448cfa0ad2SJack F Vogel };
2458cfa0ad2SJack F Vogel 
2468cfa0ad2SJack F Vogel enum e1000_rev_polarity {
2478cfa0ad2SJack F Vogel 	e1000_rev_polarity_normal = 0,
2488cfa0ad2SJack F Vogel 	e1000_rev_polarity_reversed,
2498cfa0ad2SJack F Vogel 	e1000_rev_polarity_undefined = 0xFF
2508cfa0ad2SJack F Vogel };
2518cfa0ad2SJack F Vogel 
252daf9197cSJack F Vogel enum e1000_fc_mode {
2538cfa0ad2SJack F Vogel 	e1000_fc_none = 0,
2548cfa0ad2SJack F Vogel 	e1000_fc_rx_pause,
2558cfa0ad2SJack F Vogel 	e1000_fc_tx_pause,
2568cfa0ad2SJack F Vogel 	e1000_fc_full,
2578cfa0ad2SJack F Vogel 	e1000_fc_default = 0xFF
2588cfa0ad2SJack F Vogel };
2598cfa0ad2SJack F Vogel 
2608cfa0ad2SJack F Vogel enum e1000_ffe_config {
2618cfa0ad2SJack F Vogel 	e1000_ffe_config_enabled = 0,
2628cfa0ad2SJack F Vogel 	e1000_ffe_config_active,
2638cfa0ad2SJack F Vogel 	e1000_ffe_config_blocked
2648cfa0ad2SJack F Vogel };
2658cfa0ad2SJack F Vogel 
2668cfa0ad2SJack F Vogel enum e1000_dsp_config {
2678cfa0ad2SJack F Vogel 	e1000_dsp_config_disabled = 0,
2688cfa0ad2SJack F Vogel 	e1000_dsp_config_enabled,
2698cfa0ad2SJack F Vogel 	e1000_dsp_config_activated,
2708cfa0ad2SJack F Vogel 	e1000_dsp_config_undefined = 0xFF
2718cfa0ad2SJack F Vogel };
2728cfa0ad2SJack F Vogel 
273daf9197cSJack F Vogel enum e1000_ms_type {
274daf9197cSJack F Vogel 	e1000_ms_hw_default = 0,
275daf9197cSJack F Vogel 	e1000_ms_force_master,
276daf9197cSJack F Vogel 	e1000_ms_force_slave,
277daf9197cSJack F Vogel 	e1000_ms_auto
278daf9197cSJack F Vogel };
279daf9197cSJack F Vogel 
280daf9197cSJack F Vogel enum e1000_smart_speed {
281daf9197cSJack F Vogel 	e1000_smart_speed_default = 0,
282daf9197cSJack F Vogel 	e1000_smart_speed_on,
283daf9197cSJack F Vogel 	e1000_smart_speed_off
284daf9197cSJack F Vogel };
285daf9197cSJack F Vogel 
286d035aa2dSJack F Vogel enum e1000_serdes_link_state {
287d035aa2dSJack F Vogel 	e1000_serdes_link_down = 0,
288d035aa2dSJack F Vogel 	e1000_serdes_link_autoneg_progress,
289d035aa2dSJack F Vogel 	e1000_serdes_link_autoneg_complete,
290d035aa2dSJack F Vogel 	e1000_serdes_link_forced_up
291d035aa2dSJack F Vogel };
292d035aa2dSJack F Vogel 
2938cfa0ad2SJack F Vogel /* Receive Descriptor */
2948cfa0ad2SJack F Vogel struct e1000_rx_desc {
295daf9197cSJack F Vogel 	__le64 buffer_addr; /* Address of the descriptor's data buffer */
296daf9197cSJack F Vogel 	__le16 length;      /* Length of data DMAed into data buffer */
297daf9197cSJack F Vogel 	__le16 csum;        /* Packet checksum */
2988cfa0ad2SJack F Vogel 	u8  status;         /* Descriptor status */
2998cfa0ad2SJack F Vogel 	u8  errors;         /* Descriptor Errors */
300daf9197cSJack F Vogel 	__le16 special;
3018cfa0ad2SJack F Vogel };
3028cfa0ad2SJack F Vogel 
3038cfa0ad2SJack F Vogel /* Receive Descriptor - Extended */
3048cfa0ad2SJack F Vogel union e1000_rx_desc_extended {
3058cfa0ad2SJack F Vogel 	struct {
306daf9197cSJack F Vogel 		__le64 buffer_addr;
307daf9197cSJack F Vogel 		__le64 reserved;
3088cfa0ad2SJack F Vogel 	} read;
3098cfa0ad2SJack F Vogel 	struct {
3108cfa0ad2SJack F Vogel 		struct {
311daf9197cSJack F Vogel 			__le32 mrq;           /* Multiple Rx Queues */
3128cfa0ad2SJack F Vogel 			union {
313daf9197cSJack F Vogel 				__le32 rss;         /* RSS Hash */
3148cfa0ad2SJack F Vogel 				struct {
315daf9197cSJack F Vogel 					__le16 ip_id;  /* IP id */
316daf9197cSJack F Vogel 					__le16 csum;   /* Packet Checksum */
3178cfa0ad2SJack F Vogel 				} csum_ip;
3188cfa0ad2SJack F Vogel 			} hi_dword;
3198cfa0ad2SJack F Vogel 		} lower;
3208cfa0ad2SJack F Vogel 		struct {
321daf9197cSJack F Vogel 			__le32 status_error;  /* ext status/error */
322daf9197cSJack F Vogel 			__le16 length;
323daf9197cSJack F Vogel 			__le16 vlan;          /* VLAN tag */
3248cfa0ad2SJack F Vogel 		} upper;
3258cfa0ad2SJack F Vogel 	} wb;  /* writeback */
3268cfa0ad2SJack F Vogel };
3278cfa0ad2SJack F Vogel 
3288cfa0ad2SJack F Vogel #define MAX_PS_BUFFERS 4
3298cfa0ad2SJack F Vogel /* Receive Descriptor - Packet Split */
3308cfa0ad2SJack F Vogel union e1000_rx_desc_packet_split {
3318cfa0ad2SJack F Vogel 	struct {
3328cfa0ad2SJack F Vogel 		/* one buffer for protocol header(s), three data buffers */
333daf9197cSJack F Vogel 		__le64 buffer_addr[MAX_PS_BUFFERS];
3348cfa0ad2SJack F Vogel 	} read;
3358cfa0ad2SJack F Vogel 	struct {
3368cfa0ad2SJack F Vogel 		struct {
337daf9197cSJack F Vogel 			__le32 mrq;           /* Multiple Rx Queues */
3388cfa0ad2SJack F Vogel 			union {
339daf9197cSJack F Vogel 				__le32 rss;           /* RSS Hash */
3408cfa0ad2SJack F Vogel 				struct {
341daf9197cSJack F Vogel 					__le16 ip_id;    /* IP id */
342daf9197cSJack F Vogel 					__le16 csum;     /* Packet Checksum */
3438cfa0ad2SJack F Vogel 				} csum_ip;
3448cfa0ad2SJack F Vogel 			} hi_dword;
3458cfa0ad2SJack F Vogel 		} lower;
3468cfa0ad2SJack F Vogel 		struct {
347daf9197cSJack F Vogel 			__le32 status_error;  /* ext status/error */
348daf9197cSJack F Vogel 			__le16 length0;       /* length of buffer 0 */
349daf9197cSJack F Vogel 			__le16 vlan;          /* VLAN tag */
3508cfa0ad2SJack F Vogel 		} middle;
3518cfa0ad2SJack F Vogel 		struct {
352daf9197cSJack F Vogel 			__le16 header_status;
353daf9197cSJack F Vogel 			__le16 length[3];     /* length of buffers 1-3 */
3548cfa0ad2SJack F Vogel 		} upper;
355daf9197cSJack F Vogel 		__le64 reserved;
3568cfa0ad2SJack F Vogel 	} wb; /* writeback */
3578cfa0ad2SJack F Vogel };
3588cfa0ad2SJack F Vogel 
3598cfa0ad2SJack F Vogel /* Transmit Descriptor */
3608cfa0ad2SJack F Vogel struct e1000_tx_desc {
361daf9197cSJack F Vogel 	__le64 buffer_addr;   /* Address of the descriptor's data buffer */
3628cfa0ad2SJack F Vogel 	union {
363daf9197cSJack F Vogel 		__le32 data;
3648cfa0ad2SJack F Vogel 		struct {
365daf9197cSJack F Vogel 			__le16 length;    /* Data buffer length */
3668cfa0ad2SJack F Vogel 			u8 cso;           /* Checksum offset */
3678cfa0ad2SJack F Vogel 			u8 cmd;           /* Descriptor control */
3688cfa0ad2SJack F Vogel 		} flags;
3698cfa0ad2SJack F Vogel 	} lower;
3708cfa0ad2SJack F Vogel 	union {
371daf9197cSJack F Vogel 		__le32 data;
3728cfa0ad2SJack F Vogel 		struct {
3738cfa0ad2SJack F Vogel 			u8 status;        /* Descriptor status */
3748cfa0ad2SJack F Vogel 			u8 css;           /* Checksum start */
375daf9197cSJack F Vogel 			__le16 special;
3768cfa0ad2SJack F Vogel 		} fields;
3778cfa0ad2SJack F Vogel 	} upper;
3788cfa0ad2SJack F Vogel };
3798cfa0ad2SJack F Vogel 
3808cfa0ad2SJack F Vogel /* Offload Context Descriptor */
3818cfa0ad2SJack F Vogel struct e1000_context_desc {
3828cfa0ad2SJack F Vogel 	union {
383daf9197cSJack F Vogel 		__le32 ip_config;
3848cfa0ad2SJack F Vogel 		struct {
3858cfa0ad2SJack F Vogel 			u8 ipcss;         /* IP checksum start */
3868cfa0ad2SJack F Vogel 			u8 ipcso;         /* IP checksum offset */
387daf9197cSJack F Vogel 			__le16 ipcse;     /* IP checksum end */
3888cfa0ad2SJack F Vogel 		} ip_fields;
3898cfa0ad2SJack F Vogel 	} lower_setup;
3908cfa0ad2SJack F Vogel 	union {
391daf9197cSJack F Vogel 		__le32 tcp_config;
3928cfa0ad2SJack F Vogel 		struct {
3938cfa0ad2SJack F Vogel 			u8 tucss;         /* TCP checksum start */
3948cfa0ad2SJack F Vogel 			u8 tucso;         /* TCP checksum offset */
395daf9197cSJack F Vogel 			__le16 tucse;     /* TCP checksum end */
3968cfa0ad2SJack F Vogel 		} tcp_fields;
3978cfa0ad2SJack F Vogel 	} upper_setup;
398daf9197cSJack F Vogel 	__le32 cmd_and_length;
3998cfa0ad2SJack F Vogel 	union {
400daf9197cSJack F Vogel 		__le32 data;
4018cfa0ad2SJack F Vogel 		struct {
4028cfa0ad2SJack F Vogel 			u8 status;        /* Descriptor status */
4038cfa0ad2SJack F Vogel 			u8 hdr_len;       /* Header length */
404daf9197cSJack F Vogel 			__le16 mss;       /* Maximum segment size */
4058cfa0ad2SJack F Vogel 		} fields;
4068cfa0ad2SJack F Vogel 	} tcp_seg_setup;
4078cfa0ad2SJack F Vogel };
4088cfa0ad2SJack F Vogel 
4098cfa0ad2SJack F Vogel /* Offload data descriptor */
4108cfa0ad2SJack F Vogel struct e1000_data_desc {
411daf9197cSJack F Vogel 	__le64 buffer_addr;   /* Address of the descriptor's buffer address */
4128cfa0ad2SJack F Vogel 	union {
413daf9197cSJack F Vogel 		__le32 data;
4148cfa0ad2SJack F Vogel 		struct {
415daf9197cSJack F Vogel 			__le16 length;    /* Data buffer length */
4168cfa0ad2SJack F Vogel 			u8 typ_len_ext;
4178cfa0ad2SJack F Vogel 			u8 cmd;
4188cfa0ad2SJack F Vogel 		} flags;
4198cfa0ad2SJack F Vogel 	} lower;
4208cfa0ad2SJack F Vogel 	union {
421daf9197cSJack F Vogel 		__le32 data;
4228cfa0ad2SJack F Vogel 		struct {
4238cfa0ad2SJack F Vogel 			u8 status;        /* Descriptor status */
4248cfa0ad2SJack F Vogel 			u8 popts;         /* Packet Options */
425daf9197cSJack F Vogel 			__le16 special;
4268cfa0ad2SJack F Vogel 		} fields;
4278cfa0ad2SJack F Vogel 	} upper;
4288cfa0ad2SJack F Vogel };
4298cfa0ad2SJack F Vogel 
4308cfa0ad2SJack F Vogel /* Statistics counters collected by the MAC */
4318cfa0ad2SJack F Vogel struct e1000_hw_stats {
4328cfa0ad2SJack F Vogel 	u64 crcerrs;
4338cfa0ad2SJack F Vogel 	u64 algnerrc;
4348cfa0ad2SJack F Vogel 	u64 symerrs;
4358cfa0ad2SJack F Vogel 	u64 rxerrc;
4368cfa0ad2SJack F Vogel 	u64 mpc;
4378cfa0ad2SJack F Vogel 	u64 scc;
4388cfa0ad2SJack F Vogel 	u64 ecol;
4398cfa0ad2SJack F Vogel 	u64 mcc;
4408cfa0ad2SJack F Vogel 	u64 latecol;
4418cfa0ad2SJack F Vogel 	u64 colc;
4428cfa0ad2SJack F Vogel 	u64 dc;
4438cfa0ad2SJack F Vogel 	u64 tncrs;
4448cfa0ad2SJack F Vogel 	u64 sec;
4458cfa0ad2SJack F Vogel 	u64 cexterr;
4468cfa0ad2SJack F Vogel 	u64 rlec;
4478cfa0ad2SJack F Vogel 	u64 xonrxc;
4488cfa0ad2SJack F Vogel 	u64 xontxc;
4498cfa0ad2SJack F Vogel 	u64 xoffrxc;
4508cfa0ad2SJack F Vogel 	u64 xofftxc;
4518cfa0ad2SJack F Vogel 	u64 fcruc;
4528cfa0ad2SJack F Vogel 	u64 prc64;
4538cfa0ad2SJack F Vogel 	u64 prc127;
4548cfa0ad2SJack F Vogel 	u64 prc255;
4558cfa0ad2SJack F Vogel 	u64 prc511;
4568cfa0ad2SJack F Vogel 	u64 prc1023;
4578cfa0ad2SJack F Vogel 	u64 prc1522;
4588cfa0ad2SJack F Vogel 	u64 gprc;
4598cfa0ad2SJack F Vogel 	u64 bprc;
4608cfa0ad2SJack F Vogel 	u64 mprc;
4618cfa0ad2SJack F Vogel 	u64 gptc;
4628cfa0ad2SJack F Vogel 	u64 gorc;
4638cfa0ad2SJack F Vogel 	u64 gotc;
4648cfa0ad2SJack F Vogel 	u64 rnbc;
4658cfa0ad2SJack F Vogel 	u64 ruc;
4668cfa0ad2SJack F Vogel 	u64 rfc;
4678cfa0ad2SJack F Vogel 	u64 roc;
4688cfa0ad2SJack F Vogel 	u64 rjc;
4698cfa0ad2SJack F Vogel 	u64 mgprc;
4708cfa0ad2SJack F Vogel 	u64 mgpdc;
4718cfa0ad2SJack F Vogel 	u64 mgptc;
4728cfa0ad2SJack F Vogel 	u64 tor;
4738cfa0ad2SJack F Vogel 	u64 tot;
4748cfa0ad2SJack F Vogel 	u64 tpr;
4758cfa0ad2SJack F Vogel 	u64 tpt;
4768cfa0ad2SJack F Vogel 	u64 ptc64;
4778cfa0ad2SJack F Vogel 	u64 ptc127;
4788cfa0ad2SJack F Vogel 	u64 ptc255;
4798cfa0ad2SJack F Vogel 	u64 ptc511;
4808cfa0ad2SJack F Vogel 	u64 ptc1023;
4818cfa0ad2SJack F Vogel 	u64 ptc1522;
4828cfa0ad2SJack F Vogel 	u64 mptc;
4838cfa0ad2SJack F Vogel 	u64 bptc;
4848cfa0ad2SJack F Vogel 	u64 tsctc;
4858cfa0ad2SJack F Vogel 	u64 tsctfc;
4868cfa0ad2SJack F Vogel 	u64 iac;
4878cfa0ad2SJack F Vogel 	u64 icrxptc;
4888cfa0ad2SJack F Vogel 	u64 icrxatc;
4898cfa0ad2SJack F Vogel 	u64 ictxptc;
4908cfa0ad2SJack F Vogel 	u64 ictxatc;
4918cfa0ad2SJack F Vogel 	u64 ictxqec;
4928cfa0ad2SJack F Vogel 	u64 ictxqmtc;
4938cfa0ad2SJack F Vogel 	u64 icrxdmtc;
4948cfa0ad2SJack F Vogel 	u64 icrxoc;
4958cfa0ad2SJack F Vogel 	u64 cbtmpc;
4968cfa0ad2SJack F Vogel 	u64 htdpmc;
4978cfa0ad2SJack F Vogel 	u64 cbrdpc;
4988cfa0ad2SJack F Vogel 	u64 cbrmpc;
4998cfa0ad2SJack F Vogel 	u64 rpthc;
5008cfa0ad2SJack F Vogel 	u64 hgptc;
5018cfa0ad2SJack F Vogel 	u64 htcbdpc;
5028cfa0ad2SJack F Vogel 	u64 hgorc;
5038cfa0ad2SJack F Vogel 	u64 hgotc;
5048cfa0ad2SJack F Vogel 	u64 lenerrs;
5058cfa0ad2SJack F Vogel 	u64 scvpc;
5068cfa0ad2SJack F Vogel 	u64 hrmpc;
507daf9197cSJack F Vogel 	u64 doosync;
508daf9197cSJack F Vogel };
509daf9197cSJack F Vogel 
5108cfa0ad2SJack F Vogel 
5118cfa0ad2SJack F Vogel struct e1000_phy_stats {
5128cfa0ad2SJack F Vogel 	u32 idle_errors;
5138cfa0ad2SJack F Vogel 	u32 receive_errors;
5148cfa0ad2SJack F Vogel };
5158cfa0ad2SJack F Vogel 
5168cfa0ad2SJack F Vogel struct e1000_host_mng_dhcp_cookie {
5178cfa0ad2SJack F Vogel 	u32 signature;
5188cfa0ad2SJack F Vogel 	u8  status;
5198cfa0ad2SJack F Vogel 	u8  reserved0;
5208cfa0ad2SJack F Vogel 	u16 vlan_id;
5218cfa0ad2SJack F Vogel 	u32 reserved1;
5228cfa0ad2SJack F Vogel 	u16 reserved2;
5238cfa0ad2SJack F Vogel 	u8  reserved3;
5248cfa0ad2SJack F Vogel 	u8  checksum;
5258cfa0ad2SJack F Vogel };
5268cfa0ad2SJack F Vogel 
5278cfa0ad2SJack F Vogel /* Host Interface "Rev 1" */
5288cfa0ad2SJack F Vogel struct e1000_host_command_header {
5298cfa0ad2SJack F Vogel 	u8 command_id;
5308cfa0ad2SJack F Vogel 	u8 command_length;
5318cfa0ad2SJack F Vogel 	u8 command_options;
5328cfa0ad2SJack F Vogel 	u8 checksum;
5338cfa0ad2SJack F Vogel };
5348cfa0ad2SJack F Vogel 
5358cfa0ad2SJack F Vogel #define E1000_HI_MAX_DATA_LENGTH     252
5368cfa0ad2SJack F Vogel struct e1000_host_command_info {
5378cfa0ad2SJack F Vogel 	struct e1000_host_command_header command_header;
5388cfa0ad2SJack F Vogel 	u8 command_data[E1000_HI_MAX_DATA_LENGTH];
5398cfa0ad2SJack F Vogel };
5408cfa0ad2SJack F Vogel 
5418cfa0ad2SJack F Vogel /* Host Interface "Rev 2" */
5428cfa0ad2SJack F Vogel struct e1000_host_mng_command_header {
5438cfa0ad2SJack F Vogel 	u8  command_id;
5448cfa0ad2SJack F Vogel 	u8  checksum;
5458cfa0ad2SJack F Vogel 	u16 reserved1;
5468cfa0ad2SJack F Vogel 	u16 reserved2;
5478cfa0ad2SJack F Vogel 	u16 command_length;
5488cfa0ad2SJack F Vogel };
5498cfa0ad2SJack F Vogel 
5508cfa0ad2SJack F Vogel #define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8
5518cfa0ad2SJack F Vogel struct e1000_host_mng_command_info {
5528cfa0ad2SJack F Vogel 	struct e1000_host_mng_command_header command_header;
5538cfa0ad2SJack F Vogel 	u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH];
5548cfa0ad2SJack F Vogel };
5558cfa0ad2SJack F Vogel 
5568cfa0ad2SJack F Vogel #include "e1000_mac.h"
5578cfa0ad2SJack F Vogel #include "e1000_phy.h"
5588cfa0ad2SJack F Vogel #include "e1000_nvm.h"
5598cfa0ad2SJack F Vogel #include "e1000_manage.h"
5608cfa0ad2SJack F Vogel 
5618cfa0ad2SJack F Vogel struct e1000_mac_operations {
5628cfa0ad2SJack F Vogel 	/* Function pointers for the MAC. */
5638cfa0ad2SJack F Vogel 	s32  (*init_params)(struct e1000_hw *);
564d035aa2dSJack F Vogel 	s32  (*id_led_init)(struct e1000_hw *);
5658cfa0ad2SJack F Vogel 	s32  (*blink_led)(struct e1000_hw *);
5668cfa0ad2SJack F Vogel 	s32  (*check_for_link)(struct e1000_hw *);
5678cfa0ad2SJack F Vogel 	bool (*check_mng_mode)(struct e1000_hw *hw);
5688cfa0ad2SJack F Vogel 	s32  (*cleanup_led)(struct e1000_hw *);
5698cfa0ad2SJack F Vogel 	void (*clear_hw_cntrs)(struct e1000_hw *);
5708cfa0ad2SJack F Vogel 	void (*clear_vfta)(struct e1000_hw *);
5718cfa0ad2SJack F Vogel 	s32  (*get_bus_info)(struct e1000_hw *);
572daf9197cSJack F Vogel 	void (*set_lan_id)(struct e1000_hw *);
5738cfa0ad2SJack F Vogel 	s32  (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *);
5748cfa0ad2SJack F Vogel 	s32  (*led_on)(struct e1000_hw *);
5758cfa0ad2SJack F Vogel 	s32  (*led_off)(struct e1000_hw *);
576d035aa2dSJack F Vogel 	void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32);
5778cfa0ad2SJack F Vogel 	s32  (*reset_hw)(struct e1000_hw *);
5788cfa0ad2SJack F Vogel 	s32  (*init_hw)(struct e1000_hw *);
5798cfa0ad2SJack F Vogel 	void (*shutdown_serdes)(struct e1000_hw *);
5808cfa0ad2SJack F Vogel 	s32  (*setup_link)(struct e1000_hw *);
5818cfa0ad2SJack F Vogel 	s32  (*setup_physical_interface)(struct e1000_hw *);
5828cfa0ad2SJack F Vogel 	s32  (*setup_led)(struct e1000_hw *);
5838cfa0ad2SJack F Vogel 	void (*write_vfta)(struct e1000_hw *, u32, u32);
5848cfa0ad2SJack F Vogel 	void (*mta_set)(struct e1000_hw *, u32);
5858cfa0ad2SJack F Vogel 	void (*config_collision_dist)(struct e1000_hw *);
5868cfa0ad2SJack F Vogel 	void (*rar_set)(struct e1000_hw *, u8*, u32);
5878cfa0ad2SJack F Vogel 	s32  (*read_mac_addr)(struct e1000_hw *);
5888cfa0ad2SJack F Vogel 	s32  (*validate_mdi_setting)(struct e1000_hw *);
5898cfa0ad2SJack F Vogel 	s32  (*mng_host_if_write)(struct e1000_hw *, u8*, u16, u16, u8*);
5908cfa0ad2SJack F Vogel 	s32  (*mng_write_cmd_header)(struct e1000_hw *hw,
5918cfa0ad2SJack F Vogel                       struct e1000_host_mng_command_header*);
5928cfa0ad2SJack F Vogel 	s32  (*mng_enable_host_if)(struct e1000_hw *);
5938cfa0ad2SJack F Vogel 	s32  (*wait_autoneg)(struct e1000_hw *);
5948cfa0ad2SJack F Vogel };
5958cfa0ad2SJack F Vogel 
5968cfa0ad2SJack F Vogel struct e1000_phy_operations {
5978cfa0ad2SJack F Vogel 	s32  (*init_params)(struct e1000_hw *);
5988cfa0ad2SJack F Vogel 	s32  (*acquire)(struct e1000_hw *);
599daf9197cSJack F Vogel 	s32  (*cfg_on_link_up)(struct e1000_hw *);
6008cfa0ad2SJack F Vogel 	s32  (*check_polarity)(struct e1000_hw *);
6018cfa0ad2SJack F Vogel 	s32  (*check_reset_block)(struct e1000_hw *);
6028cfa0ad2SJack F Vogel 	s32  (*commit)(struct e1000_hw *);
6038cfa0ad2SJack F Vogel 	s32  (*force_speed_duplex)(struct e1000_hw *);
6048cfa0ad2SJack F Vogel 	s32  (*get_cfg_done)(struct e1000_hw *hw);
6058cfa0ad2SJack F Vogel 	s32  (*get_cable_length)(struct e1000_hw *);
6068cfa0ad2SJack F Vogel 	s32  (*get_info)(struct e1000_hw *);
6078cfa0ad2SJack F Vogel 	s32  (*read_reg)(struct e1000_hw *, u32, u16 *);
6088cfa0ad2SJack F Vogel 	void (*release)(struct e1000_hw *);
6098cfa0ad2SJack F Vogel 	s32  (*reset)(struct e1000_hw *);
6108cfa0ad2SJack F Vogel 	s32  (*set_d0_lplu_state)(struct e1000_hw *, bool);
6118cfa0ad2SJack F Vogel 	s32  (*set_d3_lplu_state)(struct e1000_hw *, bool);
6128cfa0ad2SJack F Vogel 	s32  (*write_reg)(struct e1000_hw *, u32, u16);
6138cfa0ad2SJack F Vogel 	void (*power_up)(struct e1000_hw *);
6148cfa0ad2SJack F Vogel 	void (*power_down)(struct e1000_hw *);
6158cfa0ad2SJack F Vogel };
6168cfa0ad2SJack F Vogel 
6178cfa0ad2SJack F Vogel struct e1000_nvm_operations {
6188cfa0ad2SJack F Vogel 	s32  (*init_params)(struct e1000_hw *);
6198cfa0ad2SJack F Vogel 	s32  (*acquire)(struct e1000_hw *);
6208cfa0ad2SJack F Vogel 	s32  (*read)(struct e1000_hw *, u16, u16, u16 *);
6218cfa0ad2SJack F Vogel 	void (*release)(struct e1000_hw *);
6228cfa0ad2SJack F Vogel 	void (*reload)(struct e1000_hw *);
6238cfa0ad2SJack F Vogel 	s32  (*update)(struct e1000_hw *);
6248cfa0ad2SJack F Vogel 	s32  (*valid_led_default)(struct e1000_hw *, u16 *);
6258cfa0ad2SJack F Vogel 	s32  (*validate)(struct e1000_hw *);
6268cfa0ad2SJack F Vogel 	s32  (*write)(struct e1000_hw *, u16, u16, u16 *);
6278cfa0ad2SJack F Vogel };
6288cfa0ad2SJack F Vogel 
6298cfa0ad2SJack F Vogel struct e1000_mac_info {
6308cfa0ad2SJack F Vogel 	struct e1000_mac_operations ops;
6318cfa0ad2SJack F Vogel 	u8 addr[6];
6328cfa0ad2SJack F Vogel 	u8 perm_addr[6];
6338cfa0ad2SJack F Vogel 
6348cfa0ad2SJack F Vogel 	enum e1000_mac_type type;
6358cfa0ad2SJack F Vogel 
6368cfa0ad2SJack F Vogel 	u32 collision_delta;
6378cfa0ad2SJack F Vogel 	u32 ledctl_default;
6388cfa0ad2SJack F Vogel 	u32 ledctl_mode1;
6398cfa0ad2SJack F Vogel 	u32 ledctl_mode2;
6408cfa0ad2SJack F Vogel 	u32 mc_filter_type;
6418cfa0ad2SJack F Vogel 	u32 tx_packet_delta;
6428cfa0ad2SJack F Vogel 	u32 txcw;
6438cfa0ad2SJack F Vogel 
6448cfa0ad2SJack F Vogel 	u16 current_ifs_val;
6458cfa0ad2SJack F Vogel 	u16 ifs_max_val;
6468cfa0ad2SJack F Vogel 	u16 ifs_min_val;
6478cfa0ad2SJack F Vogel 	u16 ifs_ratio;
6488cfa0ad2SJack F Vogel 	u16 ifs_step_size;
6498cfa0ad2SJack F Vogel 	u16 mta_reg_count;
650d035aa2dSJack F Vogel #define MAX_MTA_REG 128	/* this must be the maximum size of the MTA register
651d035aa2dSJack F Vogel 			 * table in all supported adapters
652d035aa2dSJack F Vogel 			 */
653d035aa2dSJack F Vogel 	u32 mta_shadow[MAX_MTA_REG];
6548cfa0ad2SJack F Vogel 	u16 rar_entry_count;
6558cfa0ad2SJack F Vogel 
6568cfa0ad2SJack F Vogel 	u8  forced_speed_duplex;
6578cfa0ad2SJack F Vogel 
6588cfa0ad2SJack F Vogel 	bool adaptive_ifs;
6598cfa0ad2SJack F Vogel 	bool arc_subsystem_valid;
6608cfa0ad2SJack F Vogel 	bool asf_firmware_present;
6618cfa0ad2SJack F Vogel 	bool autoneg;
6628cfa0ad2SJack F Vogel 	bool autoneg_failed;
6638cfa0ad2SJack F Vogel 	bool get_link_status;
6648cfa0ad2SJack F Vogel 	bool in_ifs_mode;
6658cfa0ad2SJack F Vogel 	bool report_tx_early;
666d035aa2dSJack F Vogel 	enum e1000_serdes_link_state serdes_link_state;
6678cfa0ad2SJack F Vogel 	bool serdes_has_link;
6688cfa0ad2SJack F Vogel 	bool tx_pkt_filtering;
6698cfa0ad2SJack F Vogel };
6708cfa0ad2SJack F Vogel 
6718cfa0ad2SJack F Vogel struct e1000_phy_info {
6728cfa0ad2SJack F Vogel 	struct e1000_phy_operations ops;
6738cfa0ad2SJack F Vogel 	enum e1000_phy_type type;
6748cfa0ad2SJack F Vogel 
6758cfa0ad2SJack F Vogel 	enum e1000_1000t_rx_status local_rx;
6768cfa0ad2SJack F Vogel 	enum e1000_1000t_rx_status remote_rx;
6778cfa0ad2SJack F Vogel 	enum e1000_ms_type ms_type;
6788cfa0ad2SJack F Vogel 	enum e1000_ms_type original_ms_type;
6798cfa0ad2SJack F Vogel 	enum e1000_rev_polarity cable_polarity;
6808cfa0ad2SJack F Vogel 	enum e1000_smart_speed smart_speed;
6818cfa0ad2SJack F Vogel 
6828cfa0ad2SJack F Vogel 	u32 addr;
6838cfa0ad2SJack F Vogel 	u32 id;
6848cfa0ad2SJack F Vogel 	u32 reset_delay_us; /* in usec */
6858cfa0ad2SJack F Vogel 	u32 revision;
6868cfa0ad2SJack F Vogel 
6878cfa0ad2SJack F Vogel 	enum e1000_media_type media_type;
6888cfa0ad2SJack F Vogel 
6898cfa0ad2SJack F Vogel 	u16 autoneg_advertised;
6908cfa0ad2SJack F Vogel 	u16 autoneg_mask;
6918cfa0ad2SJack F Vogel 	u16 cable_length;
6928cfa0ad2SJack F Vogel 	u16 max_cable_length;
6938cfa0ad2SJack F Vogel 	u16 min_cable_length;
6948cfa0ad2SJack F Vogel 
6958cfa0ad2SJack F Vogel 	u8 mdix;
6968cfa0ad2SJack F Vogel 
6978cfa0ad2SJack F Vogel 	bool disable_polarity_correction;
6988cfa0ad2SJack F Vogel 	bool is_mdix;
6998cfa0ad2SJack F Vogel 	bool polarity_correction;
7008cfa0ad2SJack F Vogel 	bool reset_disable;
7018cfa0ad2SJack F Vogel 	bool speed_downgraded;
7028cfa0ad2SJack F Vogel 	bool autoneg_wait_to_complete;
7038cfa0ad2SJack F Vogel };
7048cfa0ad2SJack F Vogel 
7058cfa0ad2SJack F Vogel struct e1000_nvm_info {
7068cfa0ad2SJack F Vogel 	struct e1000_nvm_operations ops;
7078cfa0ad2SJack F Vogel 	enum e1000_nvm_type type;
7088cfa0ad2SJack F Vogel 	enum e1000_nvm_override override;
7098cfa0ad2SJack F Vogel 
7108cfa0ad2SJack F Vogel 	u32 flash_bank_size;
7118cfa0ad2SJack F Vogel 	u32 flash_base_addr;
7128cfa0ad2SJack F Vogel 
7138cfa0ad2SJack F Vogel 	u16 word_size;
7148cfa0ad2SJack F Vogel 	u16 delay_usec;
7158cfa0ad2SJack F Vogel 	u16 address_bits;
7168cfa0ad2SJack F Vogel 	u16 opcode_bits;
7178cfa0ad2SJack F Vogel 	u16 page_size;
7188cfa0ad2SJack F Vogel };
7198cfa0ad2SJack F Vogel 
7208cfa0ad2SJack F Vogel struct e1000_bus_info {
7218cfa0ad2SJack F Vogel 	enum e1000_bus_type type;
7228cfa0ad2SJack F Vogel 	enum e1000_bus_speed speed;
7238cfa0ad2SJack F Vogel 	enum e1000_bus_width width;
7248cfa0ad2SJack F Vogel 
7258cfa0ad2SJack F Vogel 	u16 func;
7268cfa0ad2SJack F Vogel 	u16 pci_cmd_word;
7278cfa0ad2SJack F Vogel };
7288cfa0ad2SJack F Vogel 
7298cfa0ad2SJack F Vogel struct e1000_fc_info {
7308cfa0ad2SJack F Vogel 	u32 high_water;          /* Flow control high-water mark */
7318cfa0ad2SJack F Vogel 	u32 low_water;           /* Flow control low-water mark */
7328cfa0ad2SJack F Vogel 	u16 pause_time;          /* Flow control pause timer */
7338cfa0ad2SJack F Vogel 	bool send_xon;           /* Flow control send XON */
7348cfa0ad2SJack F Vogel 	bool strict_ieee;        /* Strict IEEE mode */
735daf9197cSJack F Vogel 	enum e1000_fc_mode current_mode; /* FC mode in effect */
736daf9197cSJack F Vogel 	enum e1000_fc_mode requested_mode; /* FC mode requested by caller */
737daf9197cSJack F Vogel };
738daf9197cSJack F Vogel 
739daf9197cSJack F Vogel struct e1000_dev_spec_82541 {
740daf9197cSJack F Vogel 	enum e1000_dsp_config dsp_config;
741daf9197cSJack F Vogel 	enum e1000_ffe_config ffe_config;
742daf9197cSJack F Vogel 	u16 spd_default;
743daf9197cSJack F Vogel 	bool phy_init_script;
744daf9197cSJack F Vogel };
745daf9197cSJack F Vogel 
746daf9197cSJack F Vogel struct e1000_dev_spec_82542 {
747daf9197cSJack F Vogel 	bool dma_fairness;
748daf9197cSJack F Vogel };
749daf9197cSJack F Vogel 
750daf9197cSJack F Vogel struct e1000_dev_spec_82543 {
751daf9197cSJack F Vogel 	u32  tbi_compatibility;
752daf9197cSJack F Vogel 	bool dma_fairness;
753daf9197cSJack F Vogel 	bool init_phy_disabled;
754daf9197cSJack F Vogel };
755daf9197cSJack F Vogel 
756daf9197cSJack F Vogel struct e1000_dev_spec_82571 {
757daf9197cSJack F Vogel 	bool laa_is_present;
758daf9197cSJack F Vogel };
759daf9197cSJack F Vogel 
760daf9197cSJack F Vogel struct e1000_shadow_ram {
761daf9197cSJack F Vogel 	u16  value;
762daf9197cSJack F Vogel 	bool modified;
763daf9197cSJack F Vogel };
764daf9197cSJack F Vogel 
765daf9197cSJack F Vogel #define E1000_SHADOW_RAM_WORDS		2048
766daf9197cSJack F Vogel 
767daf9197cSJack F Vogel struct e1000_dev_spec_ich8lan {
768daf9197cSJack F Vogel 	bool kmrn_lock_loss_workaround_enabled;
769daf9197cSJack F Vogel 	struct e1000_shadow_ram shadow_ram[E1000_SHADOW_RAM_WORDS];
770daf9197cSJack F Vogel };
771daf9197cSJack F Vogel 
772daf9197cSJack F Vogel struct e1000_dev_spec_82575 {
773daf9197cSJack F Vogel 	bool sgmii_active;
774d035aa2dSJack F Vogel 	bool global_device_reset;
775daf9197cSJack F Vogel };
776daf9197cSJack F Vogel 
777daf9197cSJack F Vogel struct e1000_dev_spec_vf {
778daf9197cSJack F Vogel 	u32	vf_number;
779d035aa2dSJack F Vogel 	u32	v2p_mailbox;
7808cfa0ad2SJack F Vogel };
7818cfa0ad2SJack F Vogel 
782d035aa2dSJack F Vogel 
7838cfa0ad2SJack F Vogel struct e1000_hw {
7848cfa0ad2SJack F Vogel 	void *back;
7858cfa0ad2SJack F Vogel 
7868cfa0ad2SJack F Vogel 	u8 *hw_addr;
7878cfa0ad2SJack F Vogel 	u8 *flash_address;
7888cfa0ad2SJack F Vogel 	unsigned long io_base;
7898cfa0ad2SJack F Vogel 
7908cfa0ad2SJack F Vogel 	struct e1000_mac_info  mac;
7918cfa0ad2SJack F Vogel 	struct e1000_fc_info   fc;
7928cfa0ad2SJack F Vogel 	struct e1000_phy_info  phy;
7938cfa0ad2SJack F Vogel 	struct e1000_nvm_info  nvm;
7948cfa0ad2SJack F Vogel 	struct e1000_bus_info  bus;
7958cfa0ad2SJack F Vogel 	struct e1000_host_mng_dhcp_cookie mng_cookie;
7968cfa0ad2SJack F Vogel 
797daf9197cSJack F Vogel 	union {
798daf9197cSJack F Vogel 		struct e1000_dev_spec_82541	_82541;
799daf9197cSJack F Vogel 		struct e1000_dev_spec_82542	_82542;
800daf9197cSJack F Vogel 		struct e1000_dev_spec_82543	_82543;
801daf9197cSJack F Vogel 		struct e1000_dev_spec_82571	_82571;
802daf9197cSJack F Vogel 		struct e1000_dev_spec_ich8lan	ich8lan;
803daf9197cSJack F Vogel 		struct e1000_dev_spec_82575	_82575;
804daf9197cSJack F Vogel 		struct e1000_dev_spec_vf	vf;
805daf9197cSJack F Vogel 	} dev_spec;
8068cfa0ad2SJack F Vogel 
8078cfa0ad2SJack F Vogel 	u16 device_id;
8088cfa0ad2SJack F Vogel 	u16 subsystem_vendor_id;
8098cfa0ad2SJack F Vogel 	u16 subsystem_device_id;
8108cfa0ad2SJack F Vogel 	u16 vendor_id;
8118cfa0ad2SJack F Vogel 
8128cfa0ad2SJack F Vogel 	u8  revision_id;
8138cfa0ad2SJack F Vogel };
8148cfa0ad2SJack F Vogel 
8158cfa0ad2SJack F Vogel #include "e1000_82541.h"
8168cfa0ad2SJack F Vogel #include "e1000_82543.h"
8178cfa0ad2SJack F Vogel #include "e1000_82571.h"
8188cfa0ad2SJack F Vogel #include "e1000_80003es2lan.h"
8198cfa0ad2SJack F Vogel #include "e1000_ich8lan.h"
8208cfa0ad2SJack F Vogel #include "e1000_82575.h"
8218cfa0ad2SJack F Vogel 
8228cfa0ad2SJack F Vogel /* These functions must be implemented by drivers */
8238cfa0ad2SJack F Vogel void e1000_pci_clear_mwi(struct e1000_hw *hw);
8248cfa0ad2SJack F Vogel void e1000_pci_set_mwi(struct e1000_hw *hw);
8258cfa0ad2SJack F Vogel s32  e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
8268cfa0ad2SJack F Vogel void e1000_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
8278cfa0ad2SJack F Vogel void e1000_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
8288cfa0ad2SJack F Vogel 
8298cfa0ad2SJack F Vogel #endif
830