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