igc_hw.h revision 1.2 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