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