1/* SPDX-License-Identifier: GPL-2.0-only */
2/* Atlantic Network Driver
3 * Copyright (C) 2020 Marvell International Ltd.
4 */
5
6#ifndef HW_ATL2_UTILS_H
7#define HW_ATL2_UTILS_H
8
9#include "aq_hw.h"
10
11/* F W A P I */
12
13struct link_options_s {
14 u8 link_up:1;
15 u8 link_renegotiate:1;
16 u8 minimal_link_speed:1;
17 u8 internal_loopback:1;
18 u8 external_loopback:1;
19 u8 rate_10M_hd:1;
20 u8 rate_100M_hd:1;
21 u8 rate_1G_hd:1;
22
23 u8 rate_10M:1;
24 u8 rate_100M:1;
25 u8 rate_1G:1;
26 u8 rate_2P5G:1;
27 u8 rate_N2P5G:1;
28 u8 rate_5G:1;
29 u8 rate_N5G:1;
30 u8 rate_10G:1;
31
32 u8 eee_100M:1;
33 u8 eee_1G:1;
34 u8 eee_2P5G:1;
35 u8 eee_5G:1;
36 u8 eee_10G:1;
37 u8 rsvd3:3;
38
39 u8 pause_rx:1;
40 u8 pause_tx:1;
41 u8 rsvd4:1;
42 u8 downshift:1;
43 u8 downshift_retry:4;
44};
45
46struct link_control_s {
47 u8 mode:4;
48 u8 disable_crc_corruption:1;
49 u8 discard_short_frames:1;
50 u8 flow_control_mode:1;
51 u8 disable_length_check:1;
52
53 u8 discard_errored_frames:1;
54 u8 control_frame_enable:1;
55 u8 enable_tx_padding:1;
56 u8 enable_crc_forwarding:1;
57 u8 enable_frame_padding_removal_rx: 1;
58 u8 promiscuous_mode: 1;
59 u8 rsvd:2;
60
61 u16 rsvd2;
62};
63
64struct thermal_shutdown_s {
65 u8 enable:1;
66 u8 warning_enable:1;
67 u8 rsvd:6;
68
69 u8 shutdown_temperature;
70 u8 cold_temperature;
71 u8 warning_temperature;
72};
73
74struct mac_address_s {
75 u8 mac_address[6];
76};
77
78struct mac_address_aligned_s {
79 struct mac_address_s aligned;
80 u16 rsvd;
81};
82
83struct sleep_proxy_s {
84 struct wake_on_lan_s {
85 u8 wake_on_magic_packet:1;
86 u8 wake_on_pattern:1;
87 u8 wake_on_link_up:1;
88 u8 wake_on_link_down:1;
89 u8 wake_on_ping:1;
90 u8 wake_on_timer:1;
91 u8 rsvd:2;
92
93 u8 rsvd2;
94 u16 rsvd3;
95
96 u32 link_up_timeout;
97 u32 link_down_timeout;
98 u32 timer;
99 } wake_on_lan;
100
101 struct {
102 u32 mask[4];
103 u32 crc32;
104 } wake_up_pattern[8];
105
106 struct __packed {
107 u8 arp_responder:1;
108 u8 echo_responder:1;
109 u8 igmp_client:1;
110 u8 echo_truncate:1;
111 u8 address_guard:1;
112 u8 ignore_fragmented:1;
113 u8 rsvd:2;
114
115 u16 echo_max_len;
116 u8 rsvd2;
117 } ipv4_offload;
118
119 u32 ipv4_offload_addr[8];
120 u32 reserved[8];
121
122 struct __packed {
123 u8 ns_responder:1;
124 u8 echo_responder:1;
125 u8 mld_client:1;
126 u8 echo_truncate:1;
127 u8 address_guard:1;
128 u8 rsvd:3;
129
130 u16 echo_max_len;
131 u8 rsvd2;
132 } ipv6_offload;
133
134 u32 ipv6_offload_addr[16][4];
135
136 struct {
137 u16 port[16];
138 } tcp_port_offload;
139
140 struct {
141 u16 port[16];
142 } udp_port_offload;
143
144 struct {
145 u32 retry_count;
146 u32 retry_interval;
147 } ka4_offload;
148
149 struct {
150 u32 timeout;
151 u16 local_port;
152 u16 remote_port;
153 u8 remote_mac_addr[6];
154 u16 rsvd;
155 u32 rsvd2;
156 u32 rsvd3;
157 u16 rsvd4;
158 u16 win_size;
159 u32 seq_num;
160 u32 ack_num;
161 u32 local_ip;
162 u32 remote_ip;
163 } ka4_connection[16];
164
165 struct {
166 u32 retry_count;
167 u32 retry_interval;
168 } ka6_offload;
169
170 struct {
171 u32 timeout;
172 u16 local_port;
173 u16 remote_port;
174 u8 remote_mac_addr[6];
175 u16 rsvd;
176 u32 rsvd2;
177 u32 rsvd3;
178 u16 rsvd4;
179 u16 win_size;
180 u32 seq_num;
181 u32 ack_num;
182 u32 local_ip[4];
183 u32 remote_ip[4];
184 } ka6_connection[16];
185
186 struct {
187 u32 rr_count;
188 u32 rr_buf_len;
189 u32 idx_offset;
190 u32 rr__offset;
191 } mdns_offload;
192};
193
194struct pause_quanta_s {
195 u16 quanta_10M;
196 u16 threshold_10M;
197 u16 quanta_100M;
198 u16 threshold_100M;
199 u16 quanta_1G;
200 u16 threshold_1G;
201 u16 quanta_2P5G;
202 u16 threshold_2P5G;
203 u16 quanta_5G;
204 u16 threshold_5G;
205 u16 quanta_10G;
206 u16 threshold_10G;
207};
208
209struct data_buffer_status_s {
210 u32 data_offset;
211 u32 data_length;
212};
213
214struct device_caps_s {
215 u8 finite_flashless:1;
216 u8 cable_diag:1;
217 u8 ncsi:1;
218 u8 avb:1;
219 u8 rsvd:4;
220
221 u8 rsvd2;
222 u16 rsvd3;
223 u32 rsvd4;
224};
225
226struct version_s {
227 struct bundle_version_t {
228 u8 major;
229 u8 minor;
230 u16 build;
231 } bundle;
232 struct mac_version_t {
233 u8 major;
234 u8 minor;
235 u16 build;
236 } mac;
237 struct phy_version_t {
238 u8 major;
239 u8 minor;
240 u16 build;
241 } phy;
242 u32 drv_iface_ver:4;
243 u32 rsvd:28;
244};
245
246struct link_status_s {
247 u8 link_state:4;
248 u8 link_rate:4;
249
250 u8 pause_tx:1;
251 u8 pause_rx:1;
252 u8 eee:1;
253 u8 duplex:1;
254 u8 rsvd:4;
255
256 u16 rsvd2;
257};
258
259struct wol_status_s {
260 u8 wake_count;
261 u8 wake_reason;
262
263 u16 wake_up_packet_length :12;
264 u16 wake_up_pattern_number :3;
265 u16 rsvd:1;
266
267 u32 wake_up_packet[379];
268};
269
270struct mac_health_monitor_s {
271 u8 mac_ready:1;
272 u8 mac_fault:1;
273 u8 mac_flashless_finished:1;
274 u8 rsvd:5;
275
276 u8 mac_temperature;
277 u16 mac_heart_beat;
278 u16 mac_fault_code;
279 u16 rsvd2;
280};
281
282struct phy_health_monitor_s {
283 u8 phy_ready:1;
284 u8 phy_fault:1;
285 u8 phy_hot_warning:1;
286 u8 rsvd:5;
287
288 u8 phy_temperature;
289 u16 phy_heart_beat;
290 u16 phy_fault_code;
291 u16 rsvd2;
292};
293
294struct device_link_caps_s {
295 u8 rsvd:3;
296 u8 internal_loopback:1;
297 u8 external_loopback:1;
298 u8 rate_10M_hd:1;
299 u8 rate_100M_hd:1;
300 u8 rate_1G_hd:1;
301
302 u8 rate_10M:1;
303 u8 rate_100M:1;
304 u8 rate_1G:1;
305 u8 rate_2P5G:1;
306 u8 rate_N2P5G:1;
307 u8 rate_5G:1;
308 u8 rate_N5G:1;
309 u8 rate_10G:1;
310
311 u8 rsvd3:1;
312 u8 eee_100M:1;
313 u8 eee_1G:1;
314 u8 eee_2P5G:1;
315 u8 rsvd4:1;
316 u8 eee_5G:1;
317 u8 rsvd5:1;
318 u8 eee_10G:1;
319
320 u8 pause_rx:1;
321 u8 pause_tx:1;
322 u8 pfc:1;
323 u8 downshift:1;
324 u8 downshift_retry:4;
325};
326
327struct sleep_proxy_caps_s {
328 u8 ipv4_offload:1;
329 u8 ipv6_offload:1;
330 u8 tcp_port_offload:1;
331 u8 udp_port_offload:1;
332 u8 ka4_offload:1;
333 u8 ka6_offload:1;
334 u8 mdns_offload:1;
335 u8 wake_on_ping:1;
336
337 u8 wake_on_magic_packet:1;
338 u8 wake_on_pattern:1;
339 u8 wake_on_timer:1;
340 u8 wake_on_link:1;
341 u8 wake_patterns_count:4;
342
343 u8 ipv4_count;
344 u8 ipv6_count;
345
346 u8 tcp_port_offload_count;
347 u8 udp_port_offload_count;
348
349 u8 tcp4_ka_count;
350 u8 tcp6_ka_count;
351
352 u8 igmp_offload:1;
353 u8 mld_offload:1;
354 u8 rsvd:6;
355
356 u8 rsvd2;
357 u16 rsvd3;
358};
359
360struct lkp_link_caps_s {
361 u8 rsvd:5;
362 u8 rate_10M_hd:1;
363 u8 rate_100M_hd:1;
364 u8 rate_1G_hd:1;
365
366 u8 rate_10M:1;
367 u8 rate_100M:1;
368 u8 rate_1G:1;
369 u8 rate_2P5G:1;
370 u8 rate_N2P5G:1;
371 u8 rate_5G:1;
372 u8 rate_N5G:1;
373 u8 rate_10G:1;
374
375 u8 rsvd2:1;
376 u8 eee_100M:1;
377 u8 eee_1G:1;
378 u8 eee_2P5G:1;
379 u8 rsvd3:1;
380 u8 eee_5G:1;
381 u8 rsvd4:1;
382 u8 eee_10G:1;
383
384 u8 pause_rx:1;
385 u8 pause_tx:1;
386 u8 rsvd5:6;
387};
388
389struct core_dump_s {
390 u32 reg0;
391 u32 reg1;
392 u32 reg2;
393
394 u32 hi;
395 u32 lo;
396
397 u32 regs[32];
398};
399
400struct trace_s {
401 u32 sync_counter;
402 u32 mem_buffer[0x1ff];
403};
404
405struct cable_diag_control_s {
406 u8 toggle :1;
407 u8 rsvd:7;
408
409 u8 wait_timeout_sec;
410 u16 rsvd2;
411};
412
413struct cable_diag_lane_data_s {
414 u8 result_code;
415 u8 dist;
416 u8 far_dist;
417 u8 rsvd;
418};
419
420struct cable_diag_status_s {
421 struct cable_diag_lane_data_s lane_data[4];
422 u8 transact_id;
423 u8 status:4;
424 u8 rsvd:4;
425 u16 rsvd2;
426};
427
428struct statistics_a0_s {
429 struct {
430 u32 link_up;
431 u32 link_down;
432 } link;
433
434 struct {
435 u64 tx_unicast_octets;
436 u64 tx_multicast_octets;
437 u64 tx_broadcast_octets;
438 u64 rx_unicast_octets;
439 u64 rx_multicast_octets;
440 u64 rx_broadcast_octets;
441
442 u32 tx_unicast_frames;
443 u32 tx_multicast_frames;
444 u32 tx_broadcast_frames;
445 u32 tx_errors;
446
447 u32 rx_unicast_frames;
448 u32 rx_multicast_frames;
449 u32 rx_broadcast_frames;
450 u32 rx_dropped_frames;
451 u32 rx_error_frames;
452
453 u32 tx_good_frames;
454 u32 rx_good_frames;
455 u32 reserve_fw_gap;
456 } msm;
457 u32 main_loop_cycles;
458 u32 reserve_fw_gap;
459};
460
461struct __packed statistics_b0_s {
462 u64 rx_good_octets;
463 u64 rx_pause_frames;
464 u64 rx_good_frames;
465 u64 rx_errors;
466 u64 rx_unicast_frames;
467 u64 rx_multicast_frames;
468 u64 rx_broadcast_frames;
469
470 u64 tx_good_octets;
471 u64 tx_pause_frames;
472 u64 tx_good_frames;
473 u64 tx_errors;
474 u64 tx_unicast_frames;
475 u64 tx_multicast_frames;
476 u64 tx_broadcast_frames;
477
478 u32 main_loop_cycles;
479};
480
481struct __packed statistics_s {
482 union __packed {
483 struct statistics_a0_s a0;
484 struct statistics_b0_s b0;
485 };
486};
487
488struct filter_caps_s {
489 u8 l2_filters_base_index:6;
490 u8 flexible_filter_mask:2;
491 u8 l2_filter_count;
492 u8 ethertype_filter_base_index;
493 u8 ethertype_filter_count;
494
495 u8 vlan_filter_base_index;
496 u8 vlan_filter_count;
497 u8 l3_ip4_filter_base_index:4;
498 u8 l3_ip4_filter_count:4;
499 u8 l3_ip6_filter_base_index:4;
500 u8 l3_ip6_filter_count:4;
501
502 u8 l4_filter_base_index:4;
503 u8 l4_filter_count:4;
504 u8 l4_flex_filter_base_index:4;
505 u8 l4_flex_filter_count:4;
506 u8 rslv_tbl_base_index;
507 u8 rslv_tbl_count;
508};
509
510struct request_policy_s {
511 struct {
512 u8 all:1;
513 u8 mcast:1;
514 u8 rx_queue_tc_index:5;
515 u8 queue_or_tc:1;
516 } promisc;
517
518 struct {
519 u8 accept:1;
520 u8 rsvd:1;
521 u8 rx_queue_tc_index:5;
522 u8 queue_or_tc:1;
523 } bcast;
524
525 struct {
526 u8 accept:1;
527 u8 rsvd:1;
528 u8 rx_queue_tc_index:5;
529 u8 queue_or_tc:1;
530 } mcast;
531
532 u8 rsvd:8;
533};
534
535struct fw_interface_in {
536 u32 mtu;
537 u32 rsvd1;
538 struct mac_address_aligned_s mac_address;
539 struct link_control_s link_control;
540 u32 rsvd2;
541 struct link_options_s link_options;
542 u32 rsvd3;
543 struct thermal_shutdown_s thermal_shutdown;
544 u32 rsvd4;
545 struct sleep_proxy_s sleep_proxy;
546 u32 rsvd5;
547 struct pause_quanta_s pause_quanta[8];
548 struct cable_diag_control_s cable_diag_control;
549 u32 rsvd6;
550 struct data_buffer_status_s data_buffer_status;
551 u32 rsvd7;
552 struct request_policy_s request_policy;
553};
554
555struct transaction_counter_s {
556 u16 transaction_cnt_a;
557 u16 transaction_cnt_b;
558};
559
560struct management_status_s {
561 struct mac_address_s mac_address;
562 u16 vlan;
563
564 struct{
565 u32 enable : 1;
566 u32 rsvd:31;
567 } flags;
568
569 u32 rsvd1;
570 u32 rsvd2;
571 u32 rsvd3;
572 u32 rsvd4;
573 u32 rsvd5;
574};
575
576struct __packed fw_interface_out {
577 struct transaction_counter_s transaction_id;
578 struct version_s version;
579 struct link_status_s link_status;
580 struct wol_status_s wol_status;
581 u32 rsvd;
582 u32 rsvd2;
583 struct mac_health_monitor_s mac_health_monitor;
584 u32 rsvd3;
585 u32 rsvd4;
586 struct phy_health_monitor_s phy_health_monitor;
587 u32 rsvd5;
588 u32 rsvd6;
589 struct cable_diag_status_s cable_diag_status;
590 u32 rsvd7;
591 struct device_link_caps_s device_link_caps;
592 u32 rsvd8;
593 struct sleep_proxy_caps_s sleep_proxy_caps;
594 u32 rsvd9;
595 struct lkp_link_caps_s lkp_link_caps;
596 u32 rsvd10;
597 struct core_dump_s core_dump;
598 u32 rsvd11;
599 struct statistics_s stats;
600 struct filter_caps_s filter_caps;
601 struct device_caps_s device_caps;
602 u32 rsvd13;
603 struct management_status_s management_status;
604 u32 reserve[21];
605 struct trace_s trace;
606};
607
608#define AQ_A2_FW_LINK_RATE_INVALID 0
609#define AQ_A2_FW_LINK_RATE_10M 1
610#define AQ_A2_FW_LINK_RATE_100M 2
611#define AQ_A2_FW_LINK_RATE_1G 3
612#define AQ_A2_FW_LINK_RATE_2G5 4
613#define AQ_A2_FW_LINK_RATE_5G 5
614#define AQ_A2_FW_LINK_RATE_10G 6
615
616#define AQ_HOST_MODE_INVALID 0U
617#define AQ_HOST_MODE_ACTIVE 1U
618#define AQ_HOST_MODE_SLEEP_PROXY 2U
619#define AQ_HOST_MODE_LOW_POWER 3U
620#define AQ_HOST_MODE_SHUTDOWN 4U
621
622#define AQ_A2_FW_INTERFACE_A0 0
623#define AQ_A2_FW_INTERFACE_B0 1
624
625int hw_atl2_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops);
626
627int hw_atl2_utils_soft_reset(struct aq_hw_s *self);
628
629u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self);
630
631int hw_atl2_utils_get_action_resolve_table_caps(struct aq_hw_s *self,
632 u8 *base_index, u8 *count);
633
634extern const struct aq_fw_ops aq_a2_fw_ops;
635
636#endif /* HW_ATL2_UTILS_H */
637

source code of linux/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils.h