1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright(c) 1999 - 2018 Intel Corporation. */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef _E1000_HW_H_ 5*4882a593Smuzhiyun #define _E1000_HW_H_ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include "regs.h" 8*4882a593Smuzhiyun #include "defines.h" 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun struct e1000_hw; 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_COPPER 0x105E 13*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_FIBER 0x105F 14*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_SERDES 0x1060 15*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_QUAD_COPPER 0x10A4 16*4882a593Smuzhiyun #define E1000_DEV_ID_82571PT_QUAD_COPPER 0x10D5 17*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_QUAD_FIBER 0x10A5 18*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_QUAD_COPPER_LP 0x10BC 19*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_SERDES_DUAL 0x10D9 20*4882a593Smuzhiyun #define E1000_DEV_ID_82571EB_SERDES_QUAD 0x10DA 21*4882a593Smuzhiyun #define E1000_DEV_ID_82572EI_COPPER 0x107D 22*4882a593Smuzhiyun #define E1000_DEV_ID_82572EI_FIBER 0x107E 23*4882a593Smuzhiyun #define E1000_DEV_ID_82572EI_SERDES 0x107F 24*4882a593Smuzhiyun #define E1000_DEV_ID_82572EI 0x10B9 25*4882a593Smuzhiyun #define E1000_DEV_ID_82573E 0x108B 26*4882a593Smuzhiyun #define E1000_DEV_ID_82573E_IAMT 0x108C 27*4882a593Smuzhiyun #define E1000_DEV_ID_82573L 0x109A 28*4882a593Smuzhiyun #define E1000_DEV_ID_82574L 0x10D3 29*4882a593Smuzhiyun #define E1000_DEV_ID_82574LA 0x10F6 30*4882a593Smuzhiyun #define E1000_DEV_ID_82583V 0x150C 31*4882a593Smuzhiyun #define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 32*4882a593Smuzhiyun #define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 33*4882a593Smuzhiyun #define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA 34*4882a593Smuzhiyun #define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB 35*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_82567V_3 0x1501 36*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049 37*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_IGP_AMT 0x104A 38*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_IGP_C 0x104B 39*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_IFE 0x104C 40*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_IFE_GT 0x10C4 41*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_IFE_G 0x10C5 42*4882a593Smuzhiyun #define E1000_DEV_ID_ICH8_IGP_M 0x104D 43*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IGP_AMT 0x10BD 44*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_BM 0x10E5 45*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IGP_M_AMT 0x10F5 46*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IGP_M 0x10BF 47*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IGP_M_V 0x10CB 48*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IGP_C 0x294C 49*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IFE 0x10C0 50*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IFE_GT 0x10C3 51*4882a593Smuzhiyun #define E1000_DEV_ID_ICH9_IFE_G 0x10C2 52*4882a593Smuzhiyun #define E1000_DEV_ID_ICH10_R_BM_LM 0x10CC 53*4882a593Smuzhiyun #define E1000_DEV_ID_ICH10_R_BM_LF 0x10CD 54*4882a593Smuzhiyun #define E1000_DEV_ID_ICH10_R_BM_V 0x10CE 55*4882a593Smuzhiyun #define E1000_DEV_ID_ICH10_D_BM_LM 0x10DE 56*4882a593Smuzhiyun #define E1000_DEV_ID_ICH10_D_BM_LF 0x10DF 57*4882a593Smuzhiyun #define E1000_DEV_ID_ICH10_D_BM_V 0x1525 58*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_M_HV_LM 0x10EA 59*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_M_HV_LC 0x10EB 60*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_D_HV_DM 0x10EF 61*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_D_HV_DC 0x10F0 62*4882a593Smuzhiyun #define E1000_DEV_ID_PCH2_LV_LM 0x1502 63*4882a593Smuzhiyun #define E1000_DEV_ID_PCH2_LV_V 0x1503 64*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_LPT_I217_LM 0x153A 65*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_LPT_I217_V 0x153B 66*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_LPTLP_I218_LM 0x155A 67*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_LPTLP_I218_V 0x1559 68*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_I218_LM2 0x15A0 69*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_I218_V2 0x15A1 70*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_I218_LM3 0x15A2 /* Wildcat Point PCH */ 71*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_I218_V3 0x15A3 /* Wildcat Point PCH */ 72*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_LM 0x156F /* SPT PCH */ 73*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_V 0x1570 /* SPT PCH */ 74*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_LM2 0x15B7 /* SPT-H PCH */ 75*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_V2 0x15B8 /* SPT-H PCH */ 76*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_LBG_I219_LM3 0x15B9 /* LBG PCH */ 77*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_LM4 0x15D7 78*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_V4 0x15D8 79*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_LM5 0x15E3 80*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_SPT_I219_V5 0x15D6 81*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CNP_I219_LM6 0x15BD 82*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CNP_I219_V6 0x15BE 83*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CNP_I219_LM7 0x15BB 84*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CNP_I219_V7 0x15BC 85*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ICP_I219_LM8 0x15DF 86*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ICP_I219_V8 0x15E0 87*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ICP_I219_LM9 0x15E1 88*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ICP_I219_V9 0x15E2 89*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CMP_I219_LM10 0x0D4E 90*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CMP_I219_V10 0x0D4F 91*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CMP_I219_LM11 0x0D4C 92*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CMP_I219_V11 0x0D4D 93*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CMP_I219_LM12 0x0D53 94*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_CMP_I219_V12 0x0D55 95*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_TGP_I219_LM13 0x15FB 96*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_TGP_I219_V13 0x15FC 97*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_TGP_I219_LM14 0x15F9 98*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_TGP_I219_V14 0x15FA 99*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_TGP_I219_LM15 0x15F4 100*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_TGP_I219_V15 0x15F5 101*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ADP_I219_LM16 0x1A1E 102*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ADP_I219_V16 0x1A1F 103*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ADP_I219_LM17 0x1A1C 104*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_ADP_I219_V17 0x1A1D 105*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_MTP_I219_LM18 0x550A 106*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_MTP_I219_V18 0x550B 107*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_MTP_I219_LM19 0x550C 108*4882a593Smuzhiyun #define E1000_DEV_ID_PCH_MTP_I219_V19 0x550D 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define E1000_REVISION_4 4 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define E1000_FUNC_1 1 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0 0 115*4882a593Smuzhiyun #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1 3 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun enum e1000_mac_type { 118*4882a593Smuzhiyun e1000_82571, 119*4882a593Smuzhiyun e1000_82572, 120*4882a593Smuzhiyun e1000_82573, 121*4882a593Smuzhiyun e1000_82574, 122*4882a593Smuzhiyun e1000_82583, 123*4882a593Smuzhiyun e1000_80003es2lan, 124*4882a593Smuzhiyun e1000_ich8lan, 125*4882a593Smuzhiyun e1000_ich9lan, 126*4882a593Smuzhiyun e1000_ich10lan, 127*4882a593Smuzhiyun e1000_pchlan, 128*4882a593Smuzhiyun e1000_pch2lan, 129*4882a593Smuzhiyun e1000_pch_lpt, 130*4882a593Smuzhiyun e1000_pch_spt, 131*4882a593Smuzhiyun e1000_pch_cnp, 132*4882a593Smuzhiyun e1000_pch_tgp, 133*4882a593Smuzhiyun e1000_pch_adp, 134*4882a593Smuzhiyun e1000_pch_mtp, 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun enum e1000_media_type { 138*4882a593Smuzhiyun e1000_media_type_unknown = 0, 139*4882a593Smuzhiyun e1000_media_type_copper = 1, 140*4882a593Smuzhiyun e1000_media_type_fiber = 2, 141*4882a593Smuzhiyun e1000_media_type_internal_serdes = 3, 142*4882a593Smuzhiyun e1000_num_media_types 143*4882a593Smuzhiyun }; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun enum e1000_nvm_type { 146*4882a593Smuzhiyun e1000_nvm_unknown = 0, 147*4882a593Smuzhiyun e1000_nvm_none, 148*4882a593Smuzhiyun e1000_nvm_eeprom_spi, 149*4882a593Smuzhiyun e1000_nvm_flash_hw, 150*4882a593Smuzhiyun e1000_nvm_flash_sw 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun enum e1000_nvm_override { 154*4882a593Smuzhiyun e1000_nvm_override_none = 0, 155*4882a593Smuzhiyun e1000_nvm_override_spi_small, 156*4882a593Smuzhiyun e1000_nvm_override_spi_large 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun enum e1000_phy_type { 160*4882a593Smuzhiyun e1000_phy_unknown = 0, 161*4882a593Smuzhiyun e1000_phy_none, 162*4882a593Smuzhiyun e1000_phy_m88, 163*4882a593Smuzhiyun e1000_phy_igp, 164*4882a593Smuzhiyun e1000_phy_igp_2, 165*4882a593Smuzhiyun e1000_phy_gg82563, 166*4882a593Smuzhiyun e1000_phy_igp_3, 167*4882a593Smuzhiyun e1000_phy_ife, 168*4882a593Smuzhiyun e1000_phy_bm, 169*4882a593Smuzhiyun e1000_phy_82578, 170*4882a593Smuzhiyun e1000_phy_82577, 171*4882a593Smuzhiyun e1000_phy_82579, 172*4882a593Smuzhiyun e1000_phy_i217, 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun enum e1000_bus_width { 176*4882a593Smuzhiyun e1000_bus_width_unknown = 0, 177*4882a593Smuzhiyun e1000_bus_width_pcie_x1, 178*4882a593Smuzhiyun e1000_bus_width_pcie_x2, 179*4882a593Smuzhiyun e1000_bus_width_pcie_x4 = 4, 180*4882a593Smuzhiyun e1000_bus_width_pcie_x8 = 8, 181*4882a593Smuzhiyun e1000_bus_width_32, 182*4882a593Smuzhiyun e1000_bus_width_64, 183*4882a593Smuzhiyun e1000_bus_width_reserved 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun enum e1000_1000t_rx_status { 187*4882a593Smuzhiyun e1000_1000t_rx_status_not_ok = 0, 188*4882a593Smuzhiyun e1000_1000t_rx_status_ok, 189*4882a593Smuzhiyun e1000_1000t_rx_status_undefined = 0xFF 190*4882a593Smuzhiyun }; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun enum e1000_rev_polarity { 193*4882a593Smuzhiyun e1000_rev_polarity_normal = 0, 194*4882a593Smuzhiyun e1000_rev_polarity_reversed, 195*4882a593Smuzhiyun e1000_rev_polarity_undefined = 0xFF 196*4882a593Smuzhiyun }; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun enum e1000_fc_mode { 199*4882a593Smuzhiyun e1000_fc_none = 0, 200*4882a593Smuzhiyun e1000_fc_rx_pause, 201*4882a593Smuzhiyun e1000_fc_tx_pause, 202*4882a593Smuzhiyun e1000_fc_full, 203*4882a593Smuzhiyun e1000_fc_default = 0xFF 204*4882a593Smuzhiyun }; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun enum e1000_ms_type { 207*4882a593Smuzhiyun e1000_ms_hw_default = 0, 208*4882a593Smuzhiyun e1000_ms_force_master, 209*4882a593Smuzhiyun e1000_ms_force_slave, 210*4882a593Smuzhiyun e1000_ms_auto 211*4882a593Smuzhiyun }; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun enum e1000_smart_speed { 214*4882a593Smuzhiyun e1000_smart_speed_default = 0, 215*4882a593Smuzhiyun e1000_smart_speed_on, 216*4882a593Smuzhiyun e1000_smart_speed_off 217*4882a593Smuzhiyun }; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun enum e1000_serdes_link_state { 220*4882a593Smuzhiyun e1000_serdes_link_down = 0, 221*4882a593Smuzhiyun e1000_serdes_link_autoneg_progress, 222*4882a593Smuzhiyun e1000_serdes_link_autoneg_complete, 223*4882a593Smuzhiyun e1000_serdes_link_forced_up 224*4882a593Smuzhiyun }; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* Receive Descriptor - Extended */ 227*4882a593Smuzhiyun union e1000_rx_desc_extended { 228*4882a593Smuzhiyun struct { 229*4882a593Smuzhiyun __le64 buffer_addr; 230*4882a593Smuzhiyun __le64 reserved; 231*4882a593Smuzhiyun } read; 232*4882a593Smuzhiyun struct { 233*4882a593Smuzhiyun struct { 234*4882a593Smuzhiyun __le32 mrq; /* Multiple Rx Queues */ 235*4882a593Smuzhiyun union { 236*4882a593Smuzhiyun __le32 rss; /* RSS Hash */ 237*4882a593Smuzhiyun struct { 238*4882a593Smuzhiyun __le16 ip_id; /* IP id */ 239*4882a593Smuzhiyun __le16 csum; /* Packet Checksum */ 240*4882a593Smuzhiyun } csum_ip; 241*4882a593Smuzhiyun } hi_dword; 242*4882a593Smuzhiyun } lower; 243*4882a593Smuzhiyun struct { 244*4882a593Smuzhiyun __le32 status_error; /* ext status/error */ 245*4882a593Smuzhiyun __le16 length; 246*4882a593Smuzhiyun __le16 vlan; /* VLAN tag */ 247*4882a593Smuzhiyun } upper; 248*4882a593Smuzhiyun } wb; /* writeback */ 249*4882a593Smuzhiyun }; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun #define MAX_PS_BUFFERS 4 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* Number of packet split data buffers (not including the header buffer) */ 254*4882a593Smuzhiyun #define PS_PAGE_BUFFERS (MAX_PS_BUFFERS - 1) 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* Receive Descriptor - Packet Split */ 257*4882a593Smuzhiyun union e1000_rx_desc_packet_split { 258*4882a593Smuzhiyun struct { 259*4882a593Smuzhiyun /* one buffer for protocol header(s), three data buffers */ 260*4882a593Smuzhiyun __le64 buffer_addr[MAX_PS_BUFFERS]; 261*4882a593Smuzhiyun } read; 262*4882a593Smuzhiyun struct { 263*4882a593Smuzhiyun struct { 264*4882a593Smuzhiyun __le32 mrq; /* Multiple Rx Queues */ 265*4882a593Smuzhiyun union { 266*4882a593Smuzhiyun __le32 rss; /* RSS Hash */ 267*4882a593Smuzhiyun struct { 268*4882a593Smuzhiyun __le16 ip_id; /* IP id */ 269*4882a593Smuzhiyun __le16 csum; /* Packet Checksum */ 270*4882a593Smuzhiyun } csum_ip; 271*4882a593Smuzhiyun } hi_dword; 272*4882a593Smuzhiyun } lower; 273*4882a593Smuzhiyun struct { 274*4882a593Smuzhiyun __le32 status_error; /* ext status/error */ 275*4882a593Smuzhiyun __le16 length0; /* length of buffer 0 */ 276*4882a593Smuzhiyun __le16 vlan; /* VLAN tag */ 277*4882a593Smuzhiyun } middle; 278*4882a593Smuzhiyun struct { 279*4882a593Smuzhiyun __le16 header_status; 280*4882a593Smuzhiyun /* length of buffers 1-3 */ 281*4882a593Smuzhiyun __le16 length[PS_PAGE_BUFFERS]; 282*4882a593Smuzhiyun } upper; 283*4882a593Smuzhiyun __le64 reserved; 284*4882a593Smuzhiyun } wb; /* writeback */ 285*4882a593Smuzhiyun }; 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun /* Transmit Descriptor */ 288*4882a593Smuzhiyun struct e1000_tx_desc { 289*4882a593Smuzhiyun __le64 buffer_addr; /* Address of the descriptor's data buffer */ 290*4882a593Smuzhiyun union { 291*4882a593Smuzhiyun __le32 data; 292*4882a593Smuzhiyun struct { 293*4882a593Smuzhiyun __le16 length; /* Data buffer length */ 294*4882a593Smuzhiyun u8 cso; /* Checksum offset */ 295*4882a593Smuzhiyun u8 cmd; /* Descriptor control */ 296*4882a593Smuzhiyun } flags; 297*4882a593Smuzhiyun } lower; 298*4882a593Smuzhiyun union { 299*4882a593Smuzhiyun __le32 data; 300*4882a593Smuzhiyun struct { 301*4882a593Smuzhiyun u8 status; /* Descriptor status */ 302*4882a593Smuzhiyun u8 css; /* Checksum start */ 303*4882a593Smuzhiyun __le16 special; 304*4882a593Smuzhiyun } fields; 305*4882a593Smuzhiyun } upper; 306*4882a593Smuzhiyun }; 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun /* Offload Context Descriptor */ 309*4882a593Smuzhiyun struct e1000_context_desc { 310*4882a593Smuzhiyun union { 311*4882a593Smuzhiyun __le32 ip_config; 312*4882a593Smuzhiyun struct { 313*4882a593Smuzhiyun u8 ipcss; /* IP checksum start */ 314*4882a593Smuzhiyun u8 ipcso; /* IP checksum offset */ 315*4882a593Smuzhiyun __le16 ipcse; /* IP checksum end */ 316*4882a593Smuzhiyun } ip_fields; 317*4882a593Smuzhiyun } lower_setup; 318*4882a593Smuzhiyun union { 319*4882a593Smuzhiyun __le32 tcp_config; 320*4882a593Smuzhiyun struct { 321*4882a593Smuzhiyun u8 tucss; /* TCP checksum start */ 322*4882a593Smuzhiyun u8 tucso; /* TCP checksum offset */ 323*4882a593Smuzhiyun __le16 tucse; /* TCP checksum end */ 324*4882a593Smuzhiyun } tcp_fields; 325*4882a593Smuzhiyun } upper_setup; 326*4882a593Smuzhiyun __le32 cmd_and_length; 327*4882a593Smuzhiyun union { 328*4882a593Smuzhiyun __le32 data; 329*4882a593Smuzhiyun struct { 330*4882a593Smuzhiyun u8 status; /* Descriptor status */ 331*4882a593Smuzhiyun u8 hdr_len; /* Header length */ 332*4882a593Smuzhiyun __le16 mss; /* Maximum segment size */ 333*4882a593Smuzhiyun } fields; 334*4882a593Smuzhiyun } tcp_seg_setup; 335*4882a593Smuzhiyun }; 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun /* Offload data descriptor */ 338*4882a593Smuzhiyun struct e1000_data_desc { 339*4882a593Smuzhiyun __le64 buffer_addr; /* Address of the descriptor's buffer address */ 340*4882a593Smuzhiyun union { 341*4882a593Smuzhiyun __le32 data; 342*4882a593Smuzhiyun struct { 343*4882a593Smuzhiyun __le16 length; /* Data buffer length */ 344*4882a593Smuzhiyun u8 typ_len_ext; 345*4882a593Smuzhiyun u8 cmd; 346*4882a593Smuzhiyun } flags; 347*4882a593Smuzhiyun } lower; 348*4882a593Smuzhiyun union { 349*4882a593Smuzhiyun __le32 data; 350*4882a593Smuzhiyun struct { 351*4882a593Smuzhiyun u8 status; /* Descriptor status */ 352*4882a593Smuzhiyun u8 popts; /* Packet Options */ 353*4882a593Smuzhiyun __le16 special; 354*4882a593Smuzhiyun } fields; 355*4882a593Smuzhiyun } upper; 356*4882a593Smuzhiyun }; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun /* Statistics counters collected by the MAC */ 359*4882a593Smuzhiyun struct e1000_hw_stats { 360*4882a593Smuzhiyun u64 crcerrs; 361*4882a593Smuzhiyun u64 algnerrc; 362*4882a593Smuzhiyun u64 symerrs; 363*4882a593Smuzhiyun u64 rxerrc; 364*4882a593Smuzhiyun u64 mpc; 365*4882a593Smuzhiyun u64 scc; 366*4882a593Smuzhiyun u64 ecol; 367*4882a593Smuzhiyun u64 mcc; 368*4882a593Smuzhiyun u64 latecol; 369*4882a593Smuzhiyun u64 colc; 370*4882a593Smuzhiyun u64 dc; 371*4882a593Smuzhiyun u64 tncrs; 372*4882a593Smuzhiyun u64 sec; 373*4882a593Smuzhiyun u64 cexterr; 374*4882a593Smuzhiyun u64 rlec; 375*4882a593Smuzhiyun u64 xonrxc; 376*4882a593Smuzhiyun u64 xontxc; 377*4882a593Smuzhiyun u64 xoffrxc; 378*4882a593Smuzhiyun u64 xofftxc; 379*4882a593Smuzhiyun u64 fcruc; 380*4882a593Smuzhiyun u64 prc64; 381*4882a593Smuzhiyun u64 prc127; 382*4882a593Smuzhiyun u64 prc255; 383*4882a593Smuzhiyun u64 prc511; 384*4882a593Smuzhiyun u64 prc1023; 385*4882a593Smuzhiyun u64 prc1522; 386*4882a593Smuzhiyun u64 gprc; 387*4882a593Smuzhiyun u64 bprc; 388*4882a593Smuzhiyun u64 mprc; 389*4882a593Smuzhiyun u64 gptc; 390*4882a593Smuzhiyun u64 gorc; 391*4882a593Smuzhiyun u64 gotc; 392*4882a593Smuzhiyun u64 rnbc; 393*4882a593Smuzhiyun u64 ruc; 394*4882a593Smuzhiyun u64 rfc; 395*4882a593Smuzhiyun u64 roc; 396*4882a593Smuzhiyun u64 rjc; 397*4882a593Smuzhiyun u64 mgprc; 398*4882a593Smuzhiyun u64 mgpdc; 399*4882a593Smuzhiyun u64 mgptc; 400*4882a593Smuzhiyun u64 tor; 401*4882a593Smuzhiyun u64 tot; 402*4882a593Smuzhiyun u64 tpr; 403*4882a593Smuzhiyun u64 tpt; 404*4882a593Smuzhiyun u64 ptc64; 405*4882a593Smuzhiyun u64 ptc127; 406*4882a593Smuzhiyun u64 ptc255; 407*4882a593Smuzhiyun u64 ptc511; 408*4882a593Smuzhiyun u64 ptc1023; 409*4882a593Smuzhiyun u64 ptc1522; 410*4882a593Smuzhiyun u64 mptc; 411*4882a593Smuzhiyun u64 bptc; 412*4882a593Smuzhiyun u64 tsctc; 413*4882a593Smuzhiyun u64 tsctfc; 414*4882a593Smuzhiyun u64 iac; 415*4882a593Smuzhiyun u64 icrxptc; 416*4882a593Smuzhiyun u64 icrxatc; 417*4882a593Smuzhiyun u64 ictxptc; 418*4882a593Smuzhiyun u64 ictxatc; 419*4882a593Smuzhiyun u64 ictxqec; 420*4882a593Smuzhiyun u64 ictxqmtc; 421*4882a593Smuzhiyun u64 icrxdmtc; 422*4882a593Smuzhiyun u64 icrxoc; 423*4882a593Smuzhiyun }; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun struct e1000_phy_stats { 426*4882a593Smuzhiyun u32 idle_errors; 427*4882a593Smuzhiyun u32 receive_errors; 428*4882a593Smuzhiyun }; 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun struct e1000_host_mng_dhcp_cookie { 431*4882a593Smuzhiyun u32 signature; 432*4882a593Smuzhiyun u8 status; 433*4882a593Smuzhiyun u8 reserved0; 434*4882a593Smuzhiyun u16 vlan_id; 435*4882a593Smuzhiyun u32 reserved1; 436*4882a593Smuzhiyun u16 reserved2; 437*4882a593Smuzhiyun u8 reserved3; 438*4882a593Smuzhiyun u8 checksum; 439*4882a593Smuzhiyun }; 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun /* Host Interface "Rev 1" */ 442*4882a593Smuzhiyun struct e1000_host_command_header { 443*4882a593Smuzhiyun u8 command_id; 444*4882a593Smuzhiyun u8 command_length; 445*4882a593Smuzhiyun u8 command_options; 446*4882a593Smuzhiyun u8 checksum; 447*4882a593Smuzhiyun }; 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun #define E1000_HI_MAX_DATA_LENGTH 252 450*4882a593Smuzhiyun struct e1000_host_command_info { 451*4882a593Smuzhiyun struct e1000_host_command_header command_header; 452*4882a593Smuzhiyun u8 command_data[E1000_HI_MAX_DATA_LENGTH]; 453*4882a593Smuzhiyun }; 454*4882a593Smuzhiyun 455*4882a593Smuzhiyun /* Host Interface "Rev 2" */ 456*4882a593Smuzhiyun struct e1000_host_mng_command_header { 457*4882a593Smuzhiyun u8 command_id; 458*4882a593Smuzhiyun u8 checksum; 459*4882a593Smuzhiyun u16 reserved1; 460*4882a593Smuzhiyun u16 reserved2; 461*4882a593Smuzhiyun u16 command_length; 462*4882a593Smuzhiyun }; 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun #define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8 465*4882a593Smuzhiyun struct e1000_host_mng_command_info { 466*4882a593Smuzhiyun struct e1000_host_mng_command_header command_header; 467*4882a593Smuzhiyun u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH]; 468*4882a593Smuzhiyun }; 469*4882a593Smuzhiyun 470*4882a593Smuzhiyun #include "mac.h" 471*4882a593Smuzhiyun #include "phy.h" 472*4882a593Smuzhiyun #include "nvm.h" 473*4882a593Smuzhiyun #include "manage.h" 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun /* Function pointers for the MAC. */ 476*4882a593Smuzhiyun struct e1000_mac_operations { 477*4882a593Smuzhiyun s32 (*id_led_init)(struct e1000_hw *); 478*4882a593Smuzhiyun s32 (*blink_led)(struct e1000_hw *); 479*4882a593Smuzhiyun bool (*check_mng_mode)(struct e1000_hw *); 480*4882a593Smuzhiyun s32 (*check_for_link)(struct e1000_hw *); 481*4882a593Smuzhiyun s32 (*cleanup_led)(struct e1000_hw *); 482*4882a593Smuzhiyun void (*clear_hw_cntrs)(struct e1000_hw *); 483*4882a593Smuzhiyun void (*clear_vfta)(struct e1000_hw *); 484*4882a593Smuzhiyun s32 (*get_bus_info)(struct e1000_hw *); 485*4882a593Smuzhiyun void (*set_lan_id)(struct e1000_hw *); 486*4882a593Smuzhiyun s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); 487*4882a593Smuzhiyun s32 (*led_on)(struct e1000_hw *); 488*4882a593Smuzhiyun s32 (*led_off)(struct e1000_hw *); 489*4882a593Smuzhiyun void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32); 490*4882a593Smuzhiyun s32 (*reset_hw)(struct e1000_hw *); 491*4882a593Smuzhiyun s32 (*init_hw)(struct e1000_hw *); 492*4882a593Smuzhiyun s32 (*setup_link)(struct e1000_hw *); 493*4882a593Smuzhiyun s32 (*setup_physical_interface)(struct e1000_hw *); 494*4882a593Smuzhiyun s32 (*setup_led)(struct e1000_hw *); 495*4882a593Smuzhiyun void (*write_vfta)(struct e1000_hw *, u32, u32); 496*4882a593Smuzhiyun void (*config_collision_dist)(struct e1000_hw *); 497*4882a593Smuzhiyun int (*rar_set)(struct e1000_hw *, u8 *, u32); 498*4882a593Smuzhiyun s32 (*read_mac_addr)(struct e1000_hw *); 499*4882a593Smuzhiyun u32 (*rar_get_count)(struct e1000_hw *); 500*4882a593Smuzhiyun }; 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun /* When to use various PHY register access functions: 503*4882a593Smuzhiyun * 504*4882a593Smuzhiyun * Func Caller 505*4882a593Smuzhiyun * Function Does Does When to use 506*4882a593Smuzhiyun * ~~~~~~~~~~~~ ~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507*4882a593Smuzhiyun * X_reg L,P,A n/a for simple PHY reg accesses 508*4882a593Smuzhiyun * X_reg_locked P,A L for multiple accesses of different regs 509*4882a593Smuzhiyun * on different pages 510*4882a593Smuzhiyun * X_reg_page A L,P for multiple accesses of different regs 511*4882a593Smuzhiyun * on the same page 512*4882a593Smuzhiyun * 513*4882a593Smuzhiyun * Where X=[read|write], L=locking, P=sets page, A=register access 514*4882a593Smuzhiyun * 515*4882a593Smuzhiyun */ 516*4882a593Smuzhiyun struct e1000_phy_operations { 517*4882a593Smuzhiyun s32 (*acquire)(struct e1000_hw *); 518*4882a593Smuzhiyun s32 (*cfg_on_link_up)(struct e1000_hw *); 519*4882a593Smuzhiyun s32 (*check_polarity)(struct e1000_hw *); 520*4882a593Smuzhiyun s32 (*check_reset_block)(struct e1000_hw *); 521*4882a593Smuzhiyun s32 (*commit)(struct e1000_hw *); 522*4882a593Smuzhiyun s32 (*force_speed_duplex)(struct e1000_hw *); 523*4882a593Smuzhiyun s32 (*get_cfg_done)(struct e1000_hw *hw); 524*4882a593Smuzhiyun s32 (*get_cable_length)(struct e1000_hw *); 525*4882a593Smuzhiyun s32 (*get_info)(struct e1000_hw *); 526*4882a593Smuzhiyun s32 (*set_page)(struct e1000_hw *, u16); 527*4882a593Smuzhiyun s32 (*read_reg)(struct e1000_hw *, u32, u16 *); 528*4882a593Smuzhiyun s32 (*read_reg_locked)(struct e1000_hw *, u32, u16 *); 529*4882a593Smuzhiyun s32 (*read_reg_page)(struct e1000_hw *, u32, u16 *); 530*4882a593Smuzhiyun void (*release)(struct e1000_hw *); 531*4882a593Smuzhiyun s32 (*reset)(struct e1000_hw *); 532*4882a593Smuzhiyun s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); 533*4882a593Smuzhiyun s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); 534*4882a593Smuzhiyun s32 (*write_reg)(struct e1000_hw *, u32, u16); 535*4882a593Smuzhiyun s32 (*write_reg_locked)(struct e1000_hw *, u32, u16); 536*4882a593Smuzhiyun s32 (*write_reg_page)(struct e1000_hw *, u32, u16); 537*4882a593Smuzhiyun void (*power_up)(struct e1000_hw *); 538*4882a593Smuzhiyun void (*power_down)(struct e1000_hw *); 539*4882a593Smuzhiyun }; 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun /* Function pointers for the NVM. */ 542*4882a593Smuzhiyun struct e1000_nvm_operations { 543*4882a593Smuzhiyun s32 (*acquire)(struct e1000_hw *); 544*4882a593Smuzhiyun s32 (*read)(struct e1000_hw *, u16, u16, u16 *); 545*4882a593Smuzhiyun void (*release)(struct e1000_hw *); 546*4882a593Smuzhiyun void (*reload)(struct e1000_hw *); 547*4882a593Smuzhiyun s32 (*update)(struct e1000_hw *); 548*4882a593Smuzhiyun s32 (*valid_led_default)(struct e1000_hw *, u16 *); 549*4882a593Smuzhiyun s32 (*validate)(struct e1000_hw *); 550*4882a593Smuzhiyun s32 (*write)(struct e1000_hw *, u16, u16, u16 *); 551*4882a593Smuzhiyun }; 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun struct e1000_mac_info { 554*4882a593Smuzhiyun struct e1000_mac_operations ops; 555*4882a593Smuzhiyun u8 addr[ETH_ALEN]; 556*4882a593Smuzhiyun u8 perm_addr[ETH_ALEN]; 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun enum e1000_mac_type type; 559*4882a593Smuzhiyun 560*4882a593Smuzhiyun u32 collision_delta; 561*4882a593Smuzhiyun u32 ledctl_default; 562*4882a593Smuzhiyun u32 ledctl_mode1; 563*4882a593Smuzhiyun u32 ledctl_mode2; 564*4882a593Smuzhiyun u32 mc_filter_type; 565*4882a593Smuzhiyun u32 tx_packet_delta; 566*4882a593Smuzhiyun u32 txcw; 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun u16 current_ifs_val; 569*4882a593Smuzhiyun u16 ifs_max_val; 570*4882a593Smuzhiyun u16 ifs_min_val; 571*4882a593Smuzhiyun u16 ifs_ratio; 572*4882a593Smuzhiyun u16 ifs_step_size; 573*4882a593Smuzhiyun u16 mta_reg_count; 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun /* Maximum size of the MTA register table in all supported adapters */ 576*4882a593Smuzhiyun #define MAX_MTA_REG 128 577*4882a593Smuzhiyun u32 mta_shadow[MAX_MTA_REG]; 578*4882a593Smuzhiyun u16 rar_entry_count; 579*4882a593Smuzhiyun 580*4882a593Smuzhiyun u8 forced_speed_duplex; 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun bool adaptive_ifs; 583*4882a593Smuzhiyun bool has_fwsm; 584*4882a593Smuzhiyun bool arc_subsystem_valid; 585*4882a593Smuzhiyun bool autoneg; 586*4882a593Smuzhiyun bool autoneg_failed; 587*4882a593Smuzhiyun bool get_link_status; 588*4882a593Smuzhiyun bool in_ifs_mode; 589*4882a593Smuzhiyun bool serdes_has_link; 590*4882a593Smuzhiyun bool tx_pkt_filtering; 591*4882a593Smuzhiyun enum e1000_serdes_link_state serdes_link_state; 592*4882a593Smuzhiyun }; 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun struct e1000_phy_info { 595*4882a593Smuzhiyun struct e1000_phy_operations ops; 596*4882a593Smuzhiyun 597*4882a593Smuzhiyun enum e1000_phy_type type; 598*4882a593Smuzhiyun 599*4882a593Smuzhiyun enum e1000_1000t_rx_status local_rx; 600*4882a593Smuzhiyun enum e1000_1000t_rx_status remote_rx; 601*4882a593Smuzhiyun enum e1000_ms_type ms_type; 602*4882a593Smuzhiyun enum e1000_ms_type original_ms_type; 603*4882a593Smuzhiyun enum e1000_rev_polarity cable_polarity; 604*4882a593Smuzhiyun enum e1000_smart_speed smart_speed; 605*4882a593Smuzhiyun 606*4882a593Smuzhiyun u32 addr; 607*4882a593Smuzhiyun u32 id; 608*4882a593Smuzhiyun u32 reset_delay_us; /* in usec */ 609*4882a593Smuzhiyun u32 revision; 610*4882a593Smuzhiyun 611*4882a593Smuzhiyun enum e1000_media_type media_type; 612*4882a593Smuzhiyun 613*4882a593Smuzhiyun u16 autoneg_advertised; 614*4882a593Smuzhiyun u16 autoneg_mask; 615*4882a593Smuzhiyun u16 cable_length; 616*4882a593Smuzhiyun u16 max_cable_length; 617*4882a593Smuzhiyun u16 min_cable_length; 618*4882a593Smuzhiyun 619*4882a593Smuzhiyun u8 mdix; 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun bool disable_polarity_correction; 622*4882a593Smuzhiyun bool is_mdix; 623*4882a593Smuzhiyun bool polarity_correction; 624*4882a593Smuzhiyun bool speed_downgraded; 625*4882a593Smuzhiyun bool autoneg_wait_to_complete; 626*4882a593Smuzhiyun }; 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun struct e1000_nvm_info { 629*4882a593Smuzhiyun struct e1000_nvm_operations ops; 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun enum e1000_nvm_type type; 632*4882a593Smuzhiyun enum e1000_nvm_override override; 633*4882a593Smuzhiyun 634*4882a593Smuzhiyun u32 flash_bank_size; 635*4882a593Smuzhiyun u32 flash_base_addr; 636*4882a593Smuzhiyun 637*4882a593Smuzhiyun u16 word_size; 638*4882a593Smuzhiyun u16 delay_usec; 639*4882a593Smuzhiyun u16 address_bits; 640*4882a593Smuzhiyun u16 opcode_bits; 641*4882a593Smuzhiyun u16 page_size; 642*4882a593Smuzhiyun }; 643*4882a593Smuzhiyun 644*4882a593Smuzhiyun struct e1000_bus_info { 645*4882a593Smuzhiyun enum e1000_bus_width width; 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun u16 func; 648*4882a593Smuzhiyun }; 649*4882a593Smuzhiyun 650*4882a593Smuzhiyun struct e1000_fc_info { 651*4882a593Smuzhiyun u32 high_water; /* Flow control high-water mark */ 652*4882a593Smuzhiyun u32 low_water; /* Flow control low-water mark */ 653*4882a593Smuzhiyun u16 pause_time; /* Flow control pause timer */ 654*4882a593Smuzhiyun u16 refresh_time; /* Flow control refresh timer */ 655*4882a593Smuzhiyun bool send_xon; /* Flow control send XON */ 656*4882a593Smuzhiyun bool strict_ieee; /* Strict IEEE mode */ 657*4882a593Smuzhiyun enum e1000_fc_mode current_mode; /* FC mode in effect */ 658*4882a593Smuzhiyun enum e1000_fc_mode requested_mode; /* FC mode requested by caller */ 659*4882a593Smuzhiyun }; 660*4882a593Smuzhiyun 661*4882a593Smuzhiyun struct e1000_dev_spec_82571 { 662*4882a593Smuzhiyun bool laa_is_present; 663*4882a593Smuzhiyun u32 smb_counter; 664*4882a593Smuzhiyun }; 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun struct e1000_dev_spec_80003es2lan { 667*4882a593Smuzhiyun bool mdic_wa_enable; 668*4882a593Smuzhiyun }; 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun struct e1000_shadow_ram { 671*4882a593Smuzhiyun u16 value; 672*4882a593Smuzhiyun bool modified; 673*4882a593Smuzhiyun }; 674*4882a593Smuzhiyun 675*4882a593Smuzhiyun #define E1000_ICH8_SHADOW_RAM_WORDS 2048 676*4882a593Smuzhiyun 677*4882a593Smuzhiyun /* I218 PHY Ultra Low Power (ULP) states */ 678*4882a593Smuzhiyun enum e1000_ulp_state { 679*4882a593Smuzhiyun e1000_ulp_state_unknown, 680*4882a593Smuzhiyun e1000_ulp_state_off, 681*4882a593Smuzhiyun e1000_ulp_state_on, 682*4882a593Smuzhiyun }; 683*4882a593Smuzhiyun 684*4882a593Smuzhiyun struct e1000_dev_spec_ich8lan { 685*4882a593Smuzhiyun bool kmrn_lock_loss_workaround_enabled; 686*4882a593Smuzhiyun struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS]; 687*4882a593Smuzhiyun bool nvm_k1_enabled; 688*4882a593Smuzhiyun bool eee_disable; 689*4882a593Smuzhiyun u16 eee_lp_ability; 690*4882a593Smuzhiyun enum e1000_ulp_state ulp_state; 691*4882a593Smuzhiyun }; 692*4882a593Smuzhiyun 693*4882a593Smuzhiyun struct e1000_hw { 694*4882a593Smuzhiyun struct e1000_adapter *adapter; 695*4882a593Smuzhiyun 696*4882a593Smuzhiyun void __iomem *hw_addr; 697*4882a593Smuzhiyun void __iomem *flash_address; 698*4882a593Smuzhiyun 699*4882a593Smuzhiyun struct e1000_mac_info mac; 700*4882a593Smuzhiyun struct e1000_fc_info fc; 701*4882a593Smuzhiyun struct e1000_phy_info phy; 702*4882a593Smuzhiyun struct e1000_nvm_info nvm; 703*4882a593Smuzhiyun struct e1000_bus_info bus; 704*4882a593Smuzhiyun struct e1000_host_mng_dhcp_cookie mng_cookie; 705*4882a593Smuzhiyun 706*4882a593Smuzhiyun union { 707*4882a593Smuzhiyun struct e1000_dev_spec_82571 e82571; 708*4882a593Smuzhiyun struct e1000_dev_spec_80003es2lan e80003es2lan; 709*4882a593Smuzhiyun struct e1000_dev_spec_ich8lan ich8lan; 710*4882a593Smuzhiyun } dev_spec; 711*4882a593Smuzhiyun }; 712*4882a593Smuzhiyun 713*4882a593Smuzhiyun #include "82571.h" 714*4882a593Smuzhiyun #include "80003es2lan.h" 715*4882a593Smuzhiyun #include "ich8lan.h" 716*4882a593Smuzhiyun 717*4882a593Smuzhiyun #endif 718