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