1 1.2 rin /* $NetBSD: igc_hw.h,v 1.2 2023/10/04 07:35:27 rin Exp $ */ 2 1.1 rin /* $OpenBSD: igc_hw.h,v 1.2 2022/05/11 06:14:15 kevlo Exp $ */ 3 1.1 rin /*- 4 1.1 rin * Copyright 2021 Intel Corp 5 1.1 rin * Copyright 2021 Rubicon Communications, LLC (Netgate) 6 1.1 rin * SPDX-License-Identifier: BSD-3-Clause 7 1.1 rin * 8 1.1 rin * $FreeBSD$ 9 1.1 rin */ 10 1.1 rin 11 1.1 rin #ifndef _IGC_HW_H_ 12 1.1 rin #define _IGC_HW_H_ 13 1.1 rin 14 1.2 rin #ifdef _KERNEL_OPT 15 1.1 rin #include "vlan.h" 16 1.2 rin #endif 17 1.1 rin 18 1.1 rin #include <sys/param.h> 19 1.1 rin #include <sys/systm.h> 20 1.2 rin #include <sys/bus.h> 21 1.1 rin #include <sys/mbuf.h> 22 1.1 rin #include <sys/kernel.h> 23 1.2 rin #include <sys/kmem.h> 24 1.1 rin #include <sys/socket.h> 25 1.1 rin #include <sys/device.h> 26 1.1 rin #include <sys/endian.h> 27 1.1 rin 28 1.2 rin #include <net/bpf.h> 29 1.1 rin #include <net/if.h> 30 1.1 rin #include <net/if_media.h> 31 1.2 rin #include <net/if_ether.h> 32 1.1 rin 33 1.1 rin #include <netinet/in.h> 34 1.1 rin 35 1.1 rin #include <dev/pci/pcivar.h> 36 1.1 rin #include <dev/pci/pcireg.h> 37 1.1 rin #include <dev/pci/pcidevs.h> 38 1.1 rin 39 1.2 rin #include <dev/pci/igc/igc_base.h> 40 1.2 rin #include <dev/pci/igc/igc_defines.h> 41 1.2 rin #include <dev/pci/igc/igc_i225.h> 42 1.2 rin #include <dev/pci/igc/igc_mac.h> 43 1.2 rin #include <dev/pci/igc/igc_nvm.h> 44 1.2 rin #include <dev/pci/igc/igc_phy.h> 45 1.2 rin #include <dev/pci/igc/igc_regs.h> 46 1.1 rin 47 1.1 rin struct igc_hw; 48 1.1 rin 49 1.1 rin #define IGC_FUNC_1 1 50 1.1 rin 51 1.1 rin #define IGC_ALT_MAC_ADDRESS_OFFSET_LAN0 0 52 1.1 rin #define IGC_ALT_MAC_ADDRESS_OFFSET_LAN1 3 53 1.1 rin 54 1.2 rin #define IGC_MAX_NQUEUES 4 55 1.2 rin 56 1.1 rin enum igc_mac_type { 57 1.1 rin igc_undefined = 0, 58 1.1 rin igc_i225, 59 1.1 rin igc_num_macs /* List is 1-based, so subtract 1 for TRUE count. */ 60 1.1 rin }; 61 1.1 rin 62 1.1 rin enum igc_media_type { 63 1.1 rin igc_media_type_unknown = 0, 64 1.1 rin igc_media_type_copper = 1, 65 1.1 rin igc_num_media_types 66 1.1 rin }; 67 1.1 rin 68 1.1 rin enum igc_nvm_type { 69 1.1 rin igc_nvm_unknown = 0, 70 1.1 rin igc_nvm_eeprom_spi, 71 1.1 rin igc_nvm_flash_hw, 72 1.1 rin igc_nvm_invm 73 1.1 rin }; 74 1.1 rin 75 1.1 rin enum igc_phy_type { 76 1.1 rin igc_phy_unknown = 0, 77 1.1 rin igc_phy_none, 78 1.1 rin igc_phy_i225 79 1.1 rin }; 80 1.1 rin 81 1.1 rin enum igc_bus_type { 82 1.1 rin igc_bus_type_unknown = 0, 83 1.1 rin igc_bus_type_pci, 84 1.1 rin igc_bus_type_pcix, 85 1.1 rin igc_bus_type_pci_express, 86 1.1 rin igc_bus_type_reserved 87 1.1 rin }; 88 1.1 rin 89 1.1 rin enum igc_bus_speed { 90 1.1 rin igc_bus_speed_unknown = 0, 91 1.1 rin igc_bus_speed_33, 92 1.1 rin igc_bus_speed_66, 93 1.1 rin igc_bus_speed_100, 94 1.1 rin igc_bus_speed_120, 95 1.1 rin igc_bus_speed_133, 96 1.1 rin igc_bus_speed_2500, 97 1.1 rin igc_bus_speed_5000, 98 1.1 rin igc_bus_speed_reserved 99 1.1 rin }; 100 1.1 rin 101 1.1 rin enum igc_bus_width { 102 1.1 rin igc_bus_width_unknown = 0, 103 1.1 rin igc_bus_width_pcie_x1, 104 1.1 rin igc_bus_width_pcie_x2, 105 1.1 rin igc_bus_width_pcie_x4 = 4, 106 1.1 rin igc_bus_width_pcie_x8 = 8, 107 1.1 rin igc_bus_width_32, 108 1.1 rin igc_bus_width_64, 109 1.1 rin igc_bus_width_reserved 110 1.1 rin }; 111 1.1 rin 112 1.1 rin enum igc_fc_mode { 113 1.1 rin igc_fc_none = 0, 114 1.1 rin igc_fc_rx_pause, 115 1.1 rin igc_fc_tx_pause, 116 1.1 rin igc_fc_full, 117 1.1 rin igc_fc_default = 0xFF 118 1.1 rin }; 119 1.1 rin 120 1.1 rin enum igc_ms_type { 121 1.1 rin igc_ms_hw_default = 0, 122 1.1 rin igc_ms_force_master, 123 1.1 rin igc_ms_force_slave, 124 1.1 rin igc_ms_auto 125 1.1 rin }; 126 1.1 rin 127 1.1 rin enum igc_smart_speed { 128 1.1 rin igc_smart_speed_default = 0, 129 1.1 rin igc_smart_speed_on, 130 1.1 rin igc_smart_speed_off 131 1.1 rin }; 132 1.1 rin 133 1.1 rin /* Receive Descriptor */ 134 1.1 rin struct igc_rx_desc { 135 1.1 rin uint64_t buffer_addr; /* Address of the descriptor's data buffer */ 136 1.2 rin uint16_t length; /* Length of data DMAed into data buffer */ 137 1.1 rin uint16_t csum; /* Packet checksum */ 138 1.1 rin uint8_t status; /* Descriptor status */ 139 1.1 rin uint8_t errors; /* Descriptor errors */ 140 1.1 rin uint16_t special; 141 1.1 rin }; 142 1.1 rin 143 1.1 rin /* Receive Descriptor - Extended */ 144 1.1 rin union igc_rx_desc_extended { 145 1.1 rin struct { 146 1.1 rin uint64_t buffer_addr; 147 1.1 rin uint64_t reserved; 148 1.1 rin } read; 149 1.1 rin struct { 150 1.1 rin struct { 151 1.1 rin uint32_t mrq; /* Multiple Rx queues */ 152 1.1 rin union { 153 1.1 rin uint32_t rss; /* RSS hash */ 154 1.1 rin struct { 155 1.1 rin uint16_t ip_id; /* IP id */ 156 1.1 rin uint16_t csum; /* Packet checksum */ 157 1.1 rin } csum_ip; 158 1.1 rin } hi_dword; 159 1.1 rin } lower; 160 1.1 rin struct { 161 1.1 rin uint32_t status_error; /* ext status/error */ 162 1.1 rin uint16_t length; 163 1.1 rin uint16_t vlan; /* VLAN tag */ 164 1.1 rin } upper; 165 1.1 rin } wb; /* writeback */ 166 1.1 rin }; 167 1.1 rin 168 1.1 rin /* Transmit Descriptor */ 169 1.1 rin struct igc_tx_desc { 170 1.1 rin uint64_t buffer_addr; /* Address of the descriptor's data buffer */ 171 1.1 rin union { 172 1.1 rin uint32_t data; 173 1.1 rin struct { 174 1.1 rin uint16_t length; /* Data buffer length */ 175 1.1 rin uint8_t cso; /* Checksum offset */ 176 1.1 rin uint8_t cmd; /* Descriptor control */ 177 1.1 rin } flags; 178 1.1 rin } lower; 179 1.1 rin union { 180 1.1 rin uint32_t data; 181 1.1 rin struct { 182 1.1 rin uint8_t status; /* Descriptor status */ 183 1.1 rin uint8_t css; /* Checksum start */ 184 1.1 rin uint16_t special; 185 1.1 rin } fields; 186 1.1 rin } upper; 187 1.1 rin }; 188 1.1 rin 189 1.1 rin /* Function pointers for the MAC. */ 190 1.1 rin struct igc_mac_operations { 191 1.1 rin int (*init_params)(struct igc_hw *); 192 1.1 rin int (*check_for_link)(struct igc_hw *); 193 1.1 rin void (*clear_hw_cntrs)(struct igc_hw *); 194 1.1 rin void (*clear_vfta)(struct igc_hw *); 195 1.1 rin int (*get_bus_info)(struct igc_hw *); 196 1.1 rin void (*set_lan_id)(struct igc_hw *); 197 1.1 rin int (*get_link_up_info)(struct igc_hw *, uint16_t *, uint16_t *); 198 1.1 rin void (*update_mc_addr_list)(struct igc_hw *, uint8_t *, uint32_t); 199 1.1 rin int (*reset_hw)(struct igc_hw *); 200 1.1 rin int (*init_hw)(struct igc_hw *); 201 1.1 rin int (*setup_link)(struct igc_hw *); 202 1.1 rin int (*setup_physical_interface)(struct igc_hw *); 203 1.1 rin void (*write_vfta)(struct igc_hw *, uint32_t, uint32_t); 204 1.1 rin void (*config_collision_dist)(struct igc_hw *); 205 1.1 rin int (*rar_set)(struct igc_hw *, uint8_t *, uint32_t); 206 1.1 rin int (*read_mac_addr)(struct igc_hw *); 207 1.1 rin int (*validate_mdi_setting)(struct igc_hw *); 208 1.1 rin int (*acquire_swfw_sync)(struct igc_hw *, uint16_t); 209 1.1 rin void (*release_swfw_sync)(struct igc_hw *, uint16_t); 210 1.1 rin }; 211 1.1 rin 212 1.1 rin /* When to use various PHY register access functions: 213 1.1 rin * 214 1.1 rin * Func Caller 215 1.1 rin * Function Does Does When to use 216 1.1 rin * ~~~~~~~~~~~~ ~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 217 1.1 rin * X_reg L,P,A n/a for simple PHY reg accesses 218 1.1 rin * X_reg_locked P,A L for multiple accesses of different regs 219 1.1 rin * on different pages 220 1.1 rin * X_reg_page A L,P for multiple accesses of different regs 221 1.1 rin * on the same page 222 1.1 rin * 223 1.1 rin * Where X=[read|write], L=locking, P=sets page, A=register access 224 1.1 rin * 225 1.1 rin */ 226 1.1 rin struct igc_phy_operations { 227 1.1 rin int (*init_params)(struct igc_hw *); 228 1.1 rin int (*acquire)(struct igc_hw *); 229 1.1 rin int (*check_reset_block)(struct igc_hw *); 230 1.1 rin int (*force_speed_duplex)(struct igc_hw *); 231 1.1 rin int (*get_info)(struct igc_hw *); 232 1.1 rin int (*set_page)(struct igc_hw *, uint16_t); 233 1.1 rin int (*read_reg)(struct igc_hw *, uint32_t, uint16_t *); 234 1.1 rin int (*read_reg_locked)(struct igc_hw *, uint32_t, uint16_t *); 235 1.1 rin int (*read_reg_page)(struct igc_hw *, uint32_t, uint16_t *); 236 1.1 rin void (*release)(struct igc_hw *); 237 1.1 rin int (*reset)(struct igc_hw *); 238 1.1 rin int (*set_d0_lplu_state)(struct igc_hw *, bool); 239 1.1 rin int (*set_d3_lplu_state)(struct igc_hw *, bool); 240 1.1 rin int (*write_reg)(struct igc_hw *, uint32_t, uint16_t); 241 1.1 rin int (*write_reg_locked)(struct igc_hw *, uint32_t, uint16_t); 242 1.1 rin int (*write_reg_page)(struct igc_hw *, uint32_t, uint16_t); 243 1.1 rin void (*power_up)(struct igc_hw *); 244 1.1 rin void (*power_down)(struct igc_hw *); 245 1.1 rin }; 246 1.1 rin 247 1.1 rin /* Function pointers for the NVM. */ 248 1.1 rin struct igc_nvm_operations { 249 1.1 rin int (*init_params)(struct igc_hw *); 250 1.1 rin int (*acquire)(struct igc_hw *); 251 1.1 rin int (*read)(struct igc_hw *, uint16_t, uint16_t, uint16_t *); 252 1.1 rin void (*release)(struct igc_hw *); 253 1.1 rin void (*reload)(struct igc_hw *); 254 1.1 rin int (*update)(struct igc_hw *); 255 1.1 rin int (*validate)(struct igc_hw *); 256 1.1 rin int (*write)(struct igc_hw *, uint16_t, uint16_t, uint16_t *); 257 1.1 rin }; 258 1.1 rin 259 1.1 rin struct igc_info { 260 1.1 rin int (*get_invariants)(struct igc_hw *hw); 261 1.1 rin struct igc_mac_operations *mac_ops; 262 1.1 rin const struct igc_phy_operations *phy_ops; 263 1.1 rin struct igc_nvm_operations *nvm_ops; 264 1.1 rin }; 265 1.1 rin 266 1.1 rin extern const struct igc_info igc_i225_info; 267 1.1 rin 268 1.1 rin struct igc_mac_info { 269 1.1 rin struct igc_mac_operations ops; 270 1.1 rin uint8_t addr[ETHER_ADDR_LEN]; 271 1.1 rin uint8_t perm_addr[ETHER_ADDR_LEN]; 272 1.1 rin 273 1.1 rin enum igc_mac_type type; 274 1.1 rin 275 1.1 rin uint32_t mc_filter_type; 276 1.1 rin 277 1.1 rin uint16_t current_ifs_val; 278 1.1 rin uint16_t ifs_max_val; 279 1.1 rin uint16_t ifs_min_val; 280 1.1 rin uint16_t ifs_ratio; 281 1.1 rin uint16_t ifs_step_size; 282 1.1 rin uint16_t mta_reg_count; 283 1.1 rin uint16_t uta_reg_count; 284 1.1 rin 285 1.1 rin /* Maximum size of the MTA register table in all supported adapters */ 286 1.1 rin #define MAX_MTA_REG 128 287 1.1 rin uint32_t mta_shadow[MAX_MTA_REG]; 288 1.1 rin uint16_t rar_entry_count; 289 1.1 rin 290 1.1 rin uint8_t forced_speed_duplex; 291 1.1 rin 292 1.1 rin bool asf_firmware_present; 293 1.1 rin bool autoneg; 294 1.1 rin bool get_link_status; 295 1.1 rin uint32_t max_frame_size; 296 1.1 rin }; 297 1.1 rin 298 1.1 rin struct igc_phy_info { 299 1.1 rin struct igc_phy_operations ops; 300 1.1 rin enum igc_phy_type type; 301 1.1 rin 302 1.1 rin enum igc_smart_speed smart_speed; 303 1.1 rin 304 1.1 rin uint32_t addr; 305 1.1 rin uint32_t id; 306 1.1 rin uint32_t reset_delay_us; /* in usec */ 307 1.1 rin uint32_t revision; 308 1.1 rin 309 1.1 rin enum igc_media_type media_type; 310 1.1 rin 311 1.1 rin uint16_t autoneg_advertised; 312 1.1 rin uint16_t autoneg_mask; 313 1.1 rin 314 1.1 rin uint8_t mdix; 315 1.1 rin 316 1.1 rin bool polarity_correction; 317 1.1 rin bool speed_downgraded; 318 1.1 rin bool autoneg_wait_to_complete; 319 1.1 rin }; 320 1.1 rin 321 1.1 rin struct igc_nvm_info { 322 1.1 rin struct igc_nvm_operations ops; 323 1.1 rin enum igc_nvm_type type; 324 1.1 rin 325 1.1 rin uint16_t word_size; 326 1.1 rin uint16_t delay_usec; 327 1.1 rin uint16_t address_bits; 328 1.1 rin uint16_t opcode_bits; 329 1.1 rin uint16_t page_size; 330 1.1 rin }; 331 1.1 rin 332 1.1 rin struct igc_bus_info { 333 1.1 rin enum igc_bus_type type; 334 1.1 rin enum igc_bus_speed speed; 335 1.1 rin enum igc_bus_width width; 336 1.1 rin 337 1.1 rin uint16_t func; 338 1.1 rin uint16_t pci_cmd_word; 339 1.1 rin }; 340 1.1 rin 341 1.1 rin struct igc_fc_info { 342 1.1 rin uint32_t high_water; 343 1.1 rin uint32_t low_water; 344 1.1 rin uint16_t pause_time; 345 1.1 rin uint16_t refresh_time; 346 1.1 rin bool send_xon; 347 1.1 rin bool strict_ieee; 348 1.1 rin enum igc_fc_mode current_mode; 349 1.1 rin enum igc_fc_mode requested_mode; 350 1.1 rin }; 351 1.1 rin 352 1.1 rin struct igc_dev_spec_i225 { 353 1.1 rin bool eee_disable; 354 1.1 rin bool clear_semaphore_once; 355 1.1 rin uint32_t mtu; 356 1.1 rin }; 357 1.1 rin 358 1.1 rin struct igc_hw { 359 1.1 rin void *back; 360 1.1 rin 361 1.2 rin bus_addr_t hw_addr; 362 1.1 rin 363 1.1 rin struct igc_mac_info mac; 364 1.1 rin struct igc_fc_info fc; 365 1.1 rin struct igc_phy_info phy; 366 1.1 rin struct igc_nvm_info nvm; 367 1.1 rin struct igc_bus_info bus; 368 1.1 rin 369 1.1 rin union { 370 1.1 rin struct igc_dev_spec_i225 _i225; 371 1.1 rin } dev_spec; 372 1.1 rin 373 1.1 rin uint16_t device_id; 374 1.1 rin }; 375 1.1 rin 376 1.1 rin #endif /* _IGC_HW_H_ */ 377