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