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