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 | |
13 | struct 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 | |
46 | struct 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 | |
64 | struct 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 | |
74 | struct mac_address_s { |
75 | u8 mac_address[6]; |
76 | }; |
77 | |
78 | struct mac_address_aligned_s { |
79 | struct mac_address_s aligned; |
80 | u16 rsvd; |
81 | }; |
82 | |
83 | struct 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 | |
194 | struct 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 | |
209 | struct data_buffer_status_s { |
210 | u32 data_offset; |
211 | u32 data_length; |
212 | }; |
213 | |
214 | struct 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 | |
226 | struct 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 | |
246 | struct 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 | |
259 | struct 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 | |
270 | struct 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 | |
282 | struct 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 | |
294 | struct 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 | |
327 | struct 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 | |
360 | struct 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 | |
389 | struct 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 | |
400 | struct trace_s { |
401 | u32 sync_counter; |
402 | u32 mem_buffer[0x1ff]; |
403 | }; |
404 | |
405 | struct cable_diag_control_s { |
406 | u8 toggle :1; |
407 | u8 rsvd:7; |
408 | |
409 | u8 wait_timeout_sec; |
410 | u16 rsvd2; |
411 | }; |
412 | |
413 | struct cable_diag_lane_data_s { |
414 | u8 result_code; |
415 | u8 dist; |
416 | u8 far_dist; |
417 | u8 rsvd; |
418 | }; |
419 | |
420 | struct 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 | |
428 | struct 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 | |
461 | struct __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 | |
481 | struct __packed statistics_s { |
482 | union __packed { |
483 | struct statistics_a0_s a0; |
484 | struct statistics_b0_s b0; |
485 | }; |
486 | }; |
487 | |
488 | struct 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 | |
510 | struct 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 | |
535 | struct 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 | |
555 | struct transaction_counter_s { |
556 | u16 transaction_cnt_a; |
557 | u16 transaction_cnt_b; |
558 | }; |
559 | |
560 | struct 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 | |
576 | struct __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 | |
625 | int hw_atl2_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops); |
626 | |
627 | int hw_atl2_utils_soft_reset(struct aq_hw_s *self); |
628 | |
629 | u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self); |
630 | |
631 | int hw_atl2_utils_get_action_resolve_table_caps(struct aq_hw_s *self, |
632 | u8 *base_index, u8 *count); |
633 | |
634 | extern const struct aq_fw_ops aq_a2_fw_ops; |
635 | |
636 | #endif /* HW_ATL2_UTILS_H */ |
637 | |