1517904deSPeter Grehan /*- 2517904deSPeter Grehan * Copyright 2021 Intel Corp 3517904deSPeter Grehan * Copyright 2021 Rubicon Communications, LLC (Netgate) 4517904deSPeter Grehan * SPDX-License-Identifier: BSD-3-Clause 5517904deSPeter Grehan * 6517904deSPeter Grehan * $FreeBSD$ 7517904deSPeter Grehan */ 8517904deSPeter Grehan 9517904deSPeter Grehan #ifndef _IGC_HW_H_ 10517904deSPeter Grehan #define _IGC_HW_H_ 11517904deSPeter Grehan 12517904deSPeter Grehan #include "igc_osdep.h" 13517904deSPeter Grehan #include "igc_regs.h" 14517904deSPeter Grehan #include "igc_defines.h" 15517904deSPeter Grehan 16517904deSPeter Grehan struct igc_hw; 17517904deSPeter Grehan 18517904deSPeter Grehan #define IGC_DEV_ID_I225_LM 0x15F2 19517904deSPeter Grehan #define IGC_DEV_ID_I225_V 0x15F3 20517904deSPeter Grehan #define IGC_DEV_ID_I225_K 0x3100 21517904deSPeter Grehan #define IGC_DEV_ID_I225_I 0x15F8 22517904deSPeter Grehan #define IGC_DEV_ID_I220_V 0x15F7 23517904deSPeter Grehan #define IGC_DEV_ID_I225_K2 0x3101 24517904deSPeter Grehan #define IGC_DEV_ID_I225_LMVP 0x5502 25*bf0aa72fSKevin Bowling #define IGC_DEV_ID_I226_K 0x3102 26*bf0aa72fSKevin Bowling #define IGC_DEV_ID_I226_LMVP 0x5503 27517904deSPeter Grehan #define IGC_DEV_ID_I225_IT 0x0D9F 28517904deSPeter Grehan #define IGC_DEV_ID_I226_LM 0x125B 29517904deSPeter Grehan #define IGC_DEV_ID_I226_V 0x125C 30517904deSPeter Grehan #define IGC_DEV_ID_I226_IT 0x125D 31517904deSPeter Grehan #define IGC_DEV_ID_I221_V 0x125E 32517904deSPeter Grehan #define IGC_DEV_ID_I226_BLANK_NVM 0x125F 33517904deSPeter Grehan #define IGC_DEV_ID_I225_BLANK_NVM 0x15FD 34517904deSPeter Grehan 35517904deSPeter Grehan #define IGC_REVISION_0 0 36517904deSPeter Grehan #define IGC_REVISION_1 1 37517904deSPeter Grehan #define IGC_REVISION_2 2 38517904deSPeter Grehan #define IGC_REVISION_3 3 39517904deSPeter Grehan #define IGC_REVISION_4 4 40517904deSPeter Grehan 41517904deSPeter Grehan #define IGC_FUNC_1 1 42517904deSPeter Grehan 43517904deSPeter Grehan #define IGC_ALT_MAC_ADDRESS_OFFSET_LAN0 0 44517904deSPeter Grehan #define IGC_ALT_MAC_ADDRESS_OFFSET_LAN1 3 45517904deSPeter Grehan 46517904deSPeter Grehan enum igc_mac_type { 47517904deSPeter Grehan igc_undefined = 0, 48517904deSPeter Grehan igc_i225, 49517904deSPeter Grehan igc_num_macs /* List is 1-based, so subtract 1 for TRUE count. */ 50517904deSPeter Grehan }; 51517904deSPeter Grehan 52517904deSPeter Grehan enum igc_media_type { 53517904deSPeter Grehan igc_media_type_unknown = 0, 54517904deSPeter Grehan igc_media_type_copper = 1, 55517904deSPeter Grehan igc_num_media_types 56517904deSPeter Grehan }; 57517904deSPeter Grehan 58517904deSPeter Grehan enum igc_nvm_type { 59517904deSPeter Grehan igc_nvm_unknown = 0, 60517904deSPeter Grehan igc_nvm_eeprom_spi, 61517904deSPeter Grehan igc_nvm_flash_hw, 62517904deSPeter Grehan igc_nvm_invm, 63517904deSPeter Grehan }; 64517904deSPeter Grehan 65517904deSPeter Grehan enum igc_phy_type { 66517904deSPeter Grehan igc_phy_unknown = 0, 67517904deSPeter Grehan igc_phy_none, 68517904deSPeter Grehan igc_phy_i225, 69517904deSPeter Grehan }; 70517904deSPeter Grehan 71517904deSPeter Grehan enum igc_bus_type { 72517904deSPeter Grehan igc_bus_type_unknown = 0, 73517904deSPeter Grehan igc_bus_type_pci, 74517904deSPeter Grehan igc_bus_type_pcix, 75517904deSPeter Grehan igc_bus_type_pci_express, 76517904deSPeter Grehan igc_bus_type_reserved 77517904deSPeter Grehan }; 78517904deSPeter Grehan 79517904deSPeter Grehan enum igc_bus_speed { 80517904deSPeter Grehan igc_bus_speed_unknown = 0, 81517904deSPeter Grehan igc_bus_speed_33, 82517904deSPeter Grehan igc_bus_speed_66, 83517904deSPeter Grehan igc_bus_speed_100, 84517904deSPeter Grehan igc_bus_speed_120, 85517904deSPeter Grehan igc_bus_speed_133, 86517904deSPeter Grehan igc_bus_speed_2500, 87517904deSPeter Grehan igc_bus_speed_5000, 88517904deSPeter Grehan igc_bus_speed_reserved 89517904deSPeter Grehan }; 90517904deSPeter Grehan 91517904deSPeter Grehan enum igc_bus_width { 92517904deSPeter Grehan igc_bus_width_unknown = 0, 93517904deSPeter Grehan igc_bus_width_pcie_x1, 94517904deSPeter Grehan igc_bus_width_pcie_x2, 95517904deSPeter Grehan igc_bus_width_pcie_x4 = 4, 96517904deSPeter Grehan igc_bus_width_pcie_x8 = 8, 97517904deSPeter Grehan igc_bus_width_32, 98517904deSPeter Grehan igc_bus_width_64, 99517904deSPeter Grehan igc_bus_width_reserved 100517904deSPeter Grehan }; 101517904deSPeter Grehan 102517904deSPeter Grehan enum igc_fc_mode { 103517904deSPeter Grehan igc_fc_none = 0, 104517904deSPeter Grehan igc_fc_rx_pause, 105517904deSPeter Grehan igc_fc_tx_pause, 106517904deSPeter Grehan igc_fc_full, 107517904deSPeter Grehan igc_fc_default = 0xFF 108517904deSPeter Grehan }; 109517904deSPeter Grehan 110517904deSPeter Grehan enum igc_ms_type { 111517904deSPeter Grehan igc_ms_hw_default = 0, 112517904deSPeter Grehan igc_ms_force_master, 113517904deSPeter Grehan igc_ms_force_slave, 114517904deSPeter Grehan igc_ms_auto 115517904deSPeter Grehan }; 116517904deSPeter Grehan 117517904deSPeter Grehan enum igc_smart_speed { 118517904deSPeter Grehan igc_smart_speed_default = 0, 119517904deSPeter Grehan igc_smart_speed_on, 120517904deSPeter Grehan igc_smart_speed_off 121517904deSPeter Grehan }; 122517904deSPeter Grehan 123517904deSPeter Grehan #define __le16 u16 124517904deSPeter Grehan #define __le32 u32 125517904deSPeter Grehan #define __le64 u64 126517904deSPeter Grehan /* Receive Descriptor */ 127517904deSPeter Grehan struct igc_rx_desc { 128517904deSPeter Grehan __le64 buffer_addr; /* Address of the descriptor's data buffer */ 129517904deSPeter Grehan __le16 length; /* Length of data DMAed into data buffer */ 130517904deSPeter Grehan __le16 csum; /* Packet checksum */ 131517904deSPeter Grehan u8 status; /* Descriptor status */ 132517904deSPeter Grehan u8 errors; /* Descriptor Errors */ 133517904deSPeter Grehan __le16 special; 134517904deSPeter Grehan }; 135517904deSPeter Grehan 136517904deSPeter Grehan /* Receive Descriptor - Extended */ 137517904deSPeter Grehan union igc_rx_desc_extended { 138517904deSPeter Grehan struct { 139517904deSPeter Grehan __le64 buffer_addr; 140517904deSPeter Grehan __le64 reserved; 141517904deSPeter Grehan } read; 142517904deSPeter Grehan struct { 143517904deSPeter Grehan struct { 144517904deSPeter Grehan __le32 mrq; /* Multiple Rx Queues */ 145517904deSPeter Grehan union { 146517904deSPeter Grehan __le32 rss; /* RSS Hash */ 147517904deSPeter Grehan struct { 148517904deSPeter Grehan __le16 ip_id; /* IP id */ 149517904deSPeter Grehan __le16 csum; /* Packet Checksum */ 150517904deSPeter Grehan } csum_ip; 151517904deSPeter Grehan } hi_dword; 152517904deSPeter Grehan } lower; 153517904deSPeter Grehan struct { 154517904deSPeter Grehan __le32 status_error; /* ext status/error */ 155517904deSPeter Grehan __le16 length; 156517904deSPeter Grehan __le16 vlan; /* VLAN tag */ 157517904deSPeter Grehan } upper; 158517904deSPeter Grehan } wb; /* writeback */ 159517904deSPeter Grehan }; 160517904deSPeter Grehan 161517904deSPeter Grehan #define MAX_PS_BUFFERS 4 162517904deSPeter Grehan 163517904deSPeter Grehan /* Number of packet split data buffers (not including the header buffer) */ 164517904deSPeter Grehan #define PS_PAGE_BUFFERS (MAX_PS_BUFFERS - 1) 165517904deSPeter Grehan 166517904deSPeter Grehan /* Receive Descriptor - Packet Split */ 167517904deSPeter Grehan union igc_rx_desc_packet_split { 168517904deSPeter Grehan struct { 169517904deSPeter Grehan /* one buffer for protocol header(s), three data buffers */ 170517904deSPeter Grehan __le64 buffer_addr[MAX_PS_BUFFERS]; 171517904deSPeter Grehan } read; 172517904deSPeter Grehan struct { 173517904deSPeter Grehan struct { 174517904deSPeter Grehan __le32 mrq; /* Multiple Rx Queues */ 175517904deSPeter Grehan union { 176517904deSPeter Grehan __le32 rss; /* RSS Hash */ 177517904deSPeter Grehan struct { 178517904deSPeter Grehan __le16 ip_id; /* IP id */ 179517904deSPeter Grehan __le16 csum; /* Packet Checksum */ 180517904deSPeter Grehan } csum_ip; 181517904deSPeter Grehan } hi_dword; 182517904deSPeter Grehan } lower; 183517904deSPeter Grehan struct { 184517904deSPeter Grehan __le32 status_error; /* ext status/error */ 185517904deSPeter Grehan __le16 length0; /* length of buffer 0 */ 186517904deSPeter Grehan __le16 vlan; /* VLAN tag */ 187517904deSPeter Grehan } middle; 188517904deSPeter Grehan struct { 189517904deSPeter Grehan __le16 header_status; 190517904deSPeter Grehan /* length of buffers 1-3 */ 191517904deSPeter Grehan __le16 length[PS_PAGE_BUFFERS]; 192517904deSPeter Grehan } upper; 193517904deSPeter Grehan __le64 reserved; 194517904deSPeter Grehan } wb; /* writeback */ 195517904deSPeter Grehan }; 196517904deSPeter Grehan 197517904deSPeter Grehan /* Transmit Descriptor */ 198517904deSPeter Grehan struct igc_tx_desc { 199517904deSPeter Grehan __le64 buffer_addr; /* Address of the descriptor's data buffer */ 200517904deSPeter Grehan union { 201517904deSPeter Grehan __le32 data; 202517904deSPeter Grehan struct { 203517904deSPeter Grehan __le16 length; /* Data buffer length */ 204517904deSPeter Grehan u8 cso; /* Checksum offset */ 205517904deSPeter Grehan u8 cmd; /* Descriptor control */ 206517904deSPeter Grehan } flags; 207517904deSPeter Grehan } lower; 208517904deSPeter Grehan union { 209517904deSPeter Grehan __le32 data; 210517904deSPeter Grehan struct { 211517904deSPeter Grehan u8 status; /* Descriptor status */ 212517904deSPeter Grehan u8 css; /* Checksum start */ 213517904deSPeter Grehan __le16 special; 214517904deSPeter Grehan } fields; 215517904deSPeter Grehan } upper; 216517904deSPeter Grehan }; 217517904deSPeter Grehan 218517904deSPeter Grehan /* Offload Context Descriptor */ 219517904deSPeter Grehan struct igc_context_desc { 220517904deSPeter Grehan union { 221517904deSPeter Grehan __le32 ip_config; 222517904deSPeter Grehan struct { 223517904deSPeter Grehan u8 ipcss; /* IP checksum start */ 224517904deSPeter Grehan u8 ipcso; /* IP checksum offset */ 225517904deSPeter Grehan __le16 ipcse; /* IP checksum end */ 226517904deSPeter Grehan } ip_fields; 227517904deSPeter Grehan } lower_setup; 228517904deSPeter Grehan union { 229517904deSPeter Grehan __le32 tcp_config; 230517904deSPeter Grehan struct { 231517904deSPeter Grehan u8 tucss; /* TCP checksum start */ 232517904deSPeter Grehan u8 tucso; /* TCP checksum offset */ 233517904deSPeter Grehan __le16 tucse; /* TCP checksum end */ 234517904deSPeter Grehan } tcp_fields; 235517904deSPeter Grehan } upper_setup; 236517904deSPeter Grehan __le32 cmd_and_length; 237517904deSPeter Grehan union { 238517904deSPeter Grehan __le32 data; 239517904deSPeter Grehan struct { 240517904deSPeter Grehan u8 status; /* Descriptor status */ 241517904deSPeter Grehan u8 hdr_len; /* Header length */ 242517904deSPeter Grehan __le16 mss; /* Maximum segment size */ 243517904deSPeter Grehan } fields; 244517904deSPeter Grehan } tcp_seg_setup; 245517904deSPeter Grehan }; 246517904deSPeter Grehan 247517904deSPeter Grehan /* Offload data descriptor */ 248517904deSPeter Grehan struct igc_data_desc { 249517904deSPeter Grehan __le64 buffer_addr; /* Address of the descriptor's buffer address */ 250517904deSPeter Grehan union { 251517904deSPeter Grehan __le32 data; 252517904deSPeter Grehan struct { 253517904deSPeter Grehan __le16 length; /* Data buffer length */ 254517904deSPeter Grehan u8 typ_len_ext; 255517904deSPeter Grehan u8 cmd; 256517904deSPeter Grehan } flags; 257517904deSPeter Grehan } lower; 258517904deSPeter Grehan union { 259517904deSPeter Grehan __le32 data; 260517904deSPeter Grehan struct { 261517904deSPeter Grehan u8 status; /* Descriptor status */ 262517904deSPeter Grehan u8 popts; /* Packet Options */ 263517904deSPeter Grehan __le16 special; 264517904deSPeter Grehan } fields; 265517904deSPeter Grehan } upper; 266517904deSPeter Grehan }; 267517904deSPeter Grehan 268517904deSPeter Grehan /* Statistics counters collected by the MAC */ 269517904deSPeter Grehan struct igc_hw_stats { 270517904deSPeter Grehan u64 crcerrs; 271517904deSPeter Grehan u64 algnerrc; 272517904deSPeter Grehan u64 symerrs; 273517904deSPeter Grehan u64 rxerrc; 274517904deSPeter Grehan u64 mpc; 275517904deSPeter Grehan u64 scc; 276517904deSPeter Grehan u64 ecol; 277517904deSPeter Grehan u64 mcc; 278517904deSPeter Grehan u64 latecol; 279517904deSPeter Grehan u64 colc; 280517904deSPeter Grehan u64 dc; 281517904deSPeter Grehan u64 tncrs; 282517904deSPeter Grehan u64 sec; 283517904deSPeter Grehan u64 rlec; 284517904deSPeter Grehan u64 xonrxc; 285517904deSPeter Grehan u64 xontxc; 286517904deSPeter Grehan u64 xoffrxc; 287517904deSPeter Grehan u64 xofftxc; 288517904deSPeter Grehan u64 fcruc; 289517904deSPeter Grehan u64 prc64; 290517904deSPeter Grehan u64 prc127; 291517904deSPeter Grehan u64 prc255; 292517904deSPeter Grehan u64 prc511; 293517904deSPeter Grehan u64 prc1023; 294517904deSPeter Grehan u64 prc1522; 295517904deSPeter Grehan u64 tlpic; 296517904deSPeter Grehan u64 rlpic; 297517904deSPeter Grehan u64 gprc; 298517904deSPeter Grehan u64 bprc; 299517904deSPeter Grehan u64 mprc; 300517904deSPeter Grehan u64 gptc; 301517904deSPeter Grehan u64 gorc; 302517904deSPeter Grehan u64 gotc; 303517904deSPeter Grehan u64 rnbc; 304517904deSPeter Grehan u64 ruc; 305517904deSPeter Grehan u64 rfc; 306517904deSPeter Grehan u64 roc; 307517904deSPeter Grehan u64 rjc; 308517904deSPeter Grehan u64 mgprc; 309517904deSPeter Grehan u64 mgpdc; 310517904deSPeter Grehan u64 mgptc; 311517904deSPeter Grehan u64 tor; 312517904deSPeter Grehan u64 tot; 313517904deSPeter Grehan u64 tpr; 314517904deSPeter Grehan u64 tpt; 315517904deSPeter Grehan u64 ptc64; 316517904deSPeter Grehan u64 ptc127; 317517904deSPeter Grehan u64 ptc255; 318517904deSPeter Grehan u64 ptc511; 319517904deSPeter Grehan u64 ptc1023; 320517904deSPeter Grehan u64 ptc1522; 321517904deSPeter Grehan u64 mptc; 322517904deSPeter Grehan u64 bptc; 323517904deSPeter Grehan u64 tsctc; 324517904deSPeter Grehan u64 iac; 325517904deSPeter Grehan u64 rxdmtc; 326517904deSPeter Grehan u64 htdpmc; 327517904deSPeter Grehan u64 rpthc; 328517904deSPeter Grehan u64 hgptc; 329517904deSPeter Grehan u64 hgorc; 330517904deSPeter Grehan u64 hgotc; 331517904deSPeter Grehan u64 lenerrs; 332517904deSPeter Grehan u64 scvpc; 333517904deSPeter Grehan u64 hrmpc; 334517904deSPeter Grehan u64 doosync; 335517904deSPeter Grehan u64 o2bgptc; 336517904deSPeter Grehan u64 o2bspc; 337517904deSPeter Grehan u64 b2ospc; 338517904deSPeter Grehan u64 b2ogprc; 339517904deSPeter Grehan }; 340517904deSPeter Grehan 341517904deSPeter Grehan #include "igc_mac.h" 342517904deSPeter Grehan #include "igc_phy.h" 343517904deSPeter Grehan #include "igc_nvm.h" 344517904deSPeter Grehan 345517904deSPeter Grehan /* Function pointers for the MAC. */ 346517904deSPeter Grehan struct igc_mac_operations { 347517904deSPeter Grehan s32 (*init_params)(struct igc_hw *); 348517904deSPeter Grehan s32 (*check_for_link)(struct igc_hw *); 349517904deSPeter Grehan void (*clear_hw_cntrs)(struct igc_hw *); 350517904deSPeter Grehan void (*clear_vfta)(struct igc_hw *); 351517904deSPeter Grehan s32 (*get_bus_info)(struct igc_hw *); 352517904deSPeter Grehan void (*set_lan_id)(struct igc_hw *); 353517904deSPeter Grehan s32 (*get_link_up_info)(struct igc_hw *, u16 *, u16 *); 354517904deSPeter Grehan void (*update_mc_addr_list)(struct igc_hw *, u8 *, u32); 355517904deSPeter Grehan s32 (*reset_hw)(struct igc_hw *); 356517904deSPeter Grehan s32 (*init_hw)(struct igc_hw *); 357517904deSPeter Grehan s32 (*setup_link)(struct igc_hw *); 358517904deSPeter Grehan s32 (*setup_physical_interface)(struct igc_hw *); 359517904deSPeter Grehan void (*write_vfta)(struct igc_hw *, u32, u32); 360517904deSPeter Grehan void (*config_collision_dist)(struct igc_hw *); 361517904deSPeter Grehan int (*rar_set)(struct igc_hw *, u8*, u32); 362517904deSPeter Grehan s32 (*read_mac_addr)(struct igc_hw *); 363517904deSPeter Grehan s32 (*validate_mdi_setting)(struct igc_hw *); 364517904deSPeter Grehan s32 (*acquire_swfw_sync)(struct igc_hw *, u16); 365517904deSPeter Grehan void (*release_swfw_sync)(struct igc_hw *, u16); 366517904deSPeter Grehan }; 367517904deSPeter Grehan 368517904deSPeter Grehan /* When to use various PHY register access functions: 369517904deSPeter Grehan * 370517904deSPeter Grehan * Func Caller 371517904deSPeter Grehan * Function Does Does When to use 372517904deSPeter Grehan * ~~~~~~~~~~~~ ~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373517904deSPeter Grehan * X_reg L,P,A n/a for simple PHY reg accesses 374517904deSPeter Grehan * X_reg_locked P,A L for multiple accesses of different regs 375517904deSPeter Grehan * on different pages 376517904deSPeter Grehan * X_reg_page A L,P for multiple accesses of different regs 377517904deSPeter Grehan * on the same page 378517904deSPeter Grehan * 379517904deSPeter Grehan * Where X=[read|write], L=locking, P=sets page, A=register access 380517904deSPeter Grehan * 381517904deSPeter Grehan */ 382517904deSPeter Grehan struct igc_phy_operations { 383517904deSPeter Grehan s32 (*init_params)(struct igc_hw *); 384517904deSPeter Grehan s32 (*acquire)(struct igc_hw *); 385517904deSPeter Grehan s32 (*check_reset_block)(struct igc_hw *); 386517904deSPeter Grehan s32 (*force_speed_duplex)(struct igc_hw *); 387517904deSPeter Grehan s32 (*get_info)(struct igc_hw *); 388517904deSPeter Grehan s32 (*set_page)(struct igc_hw *, u16); 389517904deSPeter Grehan s32 (*read_reg)(struct igc_hw *, u32, u16 *); 390517904deSPeter Grehan s32 (*read_reg_locked)(struct igc_hw *, u32, u16 *); 391517904deSPeter Grehan s32 (*read_reg_page)(struct igc_hw *, u32, u16 *); 392517904deSPeter Grehan void (*release)(struct igc_hw *); 393517904deSPeter Grehan s32 (*reset)(struct igc_hw *); 394517904deSPeter Grehan s32 (*set_d0_lplu_state)(struct igc_hw *, bool); 395517904deSPeter Grehan s32 (*set_d3_lplu_state)(struct igc_hw *, bool); 396517904deSPeter Grehan s32 (*write_reg)(struct igc_hw *, u32, u16); 397517904deSPeter Grehan s32 (*write_reg_locked)(struct igc_hw *, u32, u16); 398517904deSPeter Grehan s32 (*write_reg_page)(struct igc_hw *, u32, u16); 399517904deSPeter Grehan void (*power_up)(struct igc_hw *); 400517904deSPeter Grehan void (*power_down)(struct igc_hw *); 401517904deSPeter Grehan }; 402517904deSPeter Grehan 403517904deSPeter Grehan /* Function pointers for the NVM. */ 404517904deSPeter Grehan struct igc_nvm_operations { 405517904deSPeter Grehan s32 (*init_params)(struct igc_hw *); 406517904deSPeter Grehan s32 (*acquire)(struct igc_hw *); 407517904deSPeter Grehan s32 (*read)(struct igc_hw *, u16, u16, u16 *); 408517904deSPeter Grehan void (*release)(struct igc_hw *); 409517904deSPeter Grehan void (*reload)(struct igc_hw *); 410517904deSPeter Grehan s32 (*update)(struct igc_hw *); 411517904deSPeter Grehan s32 (*validate)(struct igc_hw *); 412517904deSPeter Grehan s32 (*write)(struct igc_hw *, u16, u16, u16 *); 413517904deSPeter Grehan }; 414517904deSPeter Grehan 415517904deSPeter Grehan struct igc_info { 416517904deSPeter Grehan s32 (*get_invariants)(struct igc_hw *hw); 417517904deSPeter Grehan struct igc_mac_operations *mac_ops; 418517904deSPeter Grehan const struct igc_phy_operations *phy_ops; 419517904deSPeter Grehan struct igc_nvm_operations *nvm_ops; 420517904deSPeter Grehan }; 421517904deSPeter Grehan 422517904deSPeter Grehan extern const struct igc_info igc_i225_info; 423517904deSPeter Grehan 424517904deSPeter Grehan struct igc_mac_info { 425517904deSPeter Grehan struct igc_mac_operations ops; 426517904deSPeter Grehan u8 addr[ETH_ADDR_LEN]; 427517904deSPeter Grehan u8 perm_addr[ETH_ADDR_LEN]; 428517904deSPeter Grehan 429517904deSPeter Grehan enum igc_mac_type type; 430517904deSPeter Grehan 431517904deSPeter Grehan u32 mc_filter_type; 432517904deSPeter Grehan 433517904deSPeter Grehan u16 current_ifs_val; 434517904deSPeter Grehan u16 ifs_max_val; 435517904deSPeter Grehan u16 ifs_min_val; 436517904deSPeter Grehan u16 ifs_ratio; 437517904deSPeter Grehan u16 ifs_step_size; 438517904deSPeter Grehan u16 mta_reg_count; 439517904deSPeter Grehan u16 uta_reg_count; 440517904deSPeter Grehan 441517904deSPeter Grehan /* Maximum size of the MTA register table in all supported adapters */ 442517904deSPeter Grehan #define MAX_MTA_REG 128 443517904deSPeter Grehan u32 mta_shadow[MAX_MTA_REG]; 444517904deSPeter Grehan u16 rar_entry_count; 445517904deSPeter Grehan 446517904deSPeter Grehan u8 forced_speed_duplex; 447517904deSPeter Grehan 448517904deSPeter Grehan bool asf_firmware_present; 449517904deSPeter Grehan bool autoneg; 450517904deSPeter Grehan bool get_link_status; 451517904deSPeter Grehan u32 max_frame_size; 452517904deSPeter Grehan }; 453517904deSPeter Grehan 454517904deSPeter Grehan struct igc_phy_info { 455517904deSPeter Grehan struct igc_phy_operations ops; 456517904deSPeter Grehan enum igc_phy_type type; 457517904deSPeter Grehan 458517904deSPeter Grehan enum igc_smart_speed smart_speed; 459517904deSPeter Grehan 460517904deSPeter Grehan u32 addr; 461517904deSPeter Grehan u32 id; 462517904deSPeter Grehan u32 reset_delay_us; /* in usec */ 463517904deSPeter Grehan u32 revision; 464517904deSPeter Grehan 465517904deSPeter Grehan enum igc_media_type media_type; 466517904deSPeter Grehan 467517904deSPeter Grehan u16 autoneg_advertised; 468517904deSPeter Grehan u16 autoneg_mask; 469517904deSPeter Grehan 470517904deSPeter Grehan u8 mdix; 471517904deSPeter Grehan 472517904deSPeter Grehan bool polarity_correction; 473517904deSPeter Grehan bool speed_downgraded; 474517904deSPeter Grehan bool autoneg_wait_to_complete; 475517904deSPeter Grehan }; 476517904deSPeter Grehan 477517904deSPeter Grehan struct igc_nvm_info { 478517904deSPeter Grehan struct igc_nvm_operations ops; 479517904deSPeter Grehan enum igc_nvm_type type; 480517904deSPeter Grehan 481517904deSPeter Grehan u16 word_size; 482517904deSPeter Grehan u16 delay_usec; 483517904deSPeter Grehan u16 address_bits; 484517904deSPeter Grehan u16 opcode_bits; 485517904deSPeter Grehan u16 page_size; 486517904deSPeter Grehan }; 487517904deSPeter Grehan 488517904deSPeter Grehan struct igc_bus_info { 489517904deSPeter Grehan enum igc_bus_type type; 490517904deSPeter Grehan enum igc_bus_speed speed; 491517904deSPeter Grehan enum igc_bus_width width; 492517904deSPeter Grehan 493517904deSPeter Grehan u16 func; 494517904deSPeter Grehan u16 pci_cmd_word; 495517904deSPeter Grehan }; 496517904deSPeter Grehan 497517904deSPeter Grehan struct igc_fc_info { 498517904deSPeter Grehan u32 high_water; /* Flow control high-water mark */ 499517904deSPeter Grehan u32 low_water; /* Flow control low-water mark */ 500517904deSPeter Grehan u16 pause_time; /* Flow control pause timer */ 501517904deSPeter Grehan u16 refresh_time; /* Flow control refresh timer */ 502517904deSPeter Grehan bool send_xon; /* Flow control send XON */ 503517904deSPeter Grehan bool strict_ieee; /* Strict IEEE mode */ 504517904deSPeter Grehan enum igc_fc_mode current_mode; /* FC mode in effect */ 505517904deSPeter Grehan enum igc_fc_mode requested_mode; /* FC mode requested by caller */ 506517904deSPeter Grehan }; 507517904deSPeter Grehan 508517904deSPeter Grehan struct igc_dev_spec_i225 { 509517904deSPeter Grehan bool eee_disable; 510517904deSPeter Grehan bool clear_semaphore_once; 511517904deSPeter Grehan u32 mtu; 512517904deSPeter Grehan }; 513517904deSPeter Grehan 514517904deSPeter Grehan struct igc_hw { 515517904deSPeter Grehan void *back; 516517904deSPeter Grehan 517517904deSPeter Grehan u8 *hw_addr; 518517904deSPeter Grehan u8 *flash_address; 519517904deSPeter Grehan unsigned long io_base; 520517904deSPeter Grehan 521517904deSPeter Grehan struct igc_mac_info mac; 522517904deSPeter Grehan struct igc_fc_info fc; 523517904deSPeter Grehan struct igc_phy_info phy; 524517904deSPeter Grehan struct igc_nvm_info nvm; 525517904deSPeter Grehan struct igc_bus_info bus; 526517904deSPeter Grehan 527517904deSPeter Grehan union { 528517904deSPeter Grehan struct igc_dev_spec_i225 _i225; 529517904deSPeter Grehan } dev_spec; 530517904deSPeter Grehan 531517904deSPeter Grehan u16 device_id; 532517904deSPeter Grehan u16 subsystem_vendor_id; 533517904deSPeter Grehan u16 subsystem_device_id; 534517904deSPeter Grehan u16 vendor_id; 535517904deSPeter Grehan 536517904deSPeter Grehan u8 revision_id; 537517904deSPeter Grehan }; 538517904deSPeter Grehan 539517904deSPeter Grehan #include "igc_i225.h" 540517904deSPeter Grehan #include "igc_base.h" 541517904deSPeter Grehan 542517904deSPeter Grehan /* These functions must be implemented by drivers */ 543517904deSPeter Grehan s32 igc_read_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 544517904deSPeter Grehan s32 igc_write_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value); 545517904deSPeter Grehan void igc_read_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 546517904deSPeter Grehan void igc_write_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value); 547517904deSPeter Grehan 548517904deSPeter Grehan #endif 549