/* SPDX-License-Identifier: GPL-2.0-only */ /* Atlantic Network Driver * Copyright (C) 2020 Marvell International Ltd. */ #ifndef HW_ATL2_UTILS_H #define HW_ATL2_UTILS_H #include "aq_hw.h" /* F W A P I */ struct link_options_s { u8 link_up:1; u8 link_renegotiate:1; u8 minimal_link_speed:1; u8 internal_loopback:1; u8 external_loopback:1; u8 rate_10M_hd:1; u8 rate_100M_hd:1; u8 rate_1G_hd:1; u8 rate_10M:1; u8 rate_100M:1; u8 rate_1G:1; u8 rate_2P5G:1; u8 rate_N2P5G:1; u8 rate_5G:1; u8 rate_N5G:1; u8 rate_10G:1; u8 eee_100M:1; u8 eee_1G:1; u8 eee_2P5G:1; u8 eee_5G:1; u8 eee_10G:1; u8 rsvd3:3; u8 pause_rx:1; u8 pause_tx:1; u8 rsvd4:1; u8 downshift:1; u8 downshift_retry:4; }; struct link_control_s { u8 mode:4; u8 disable_crc_corruption:1; u8 discard_short_frames:1; u8 flow_control_mode:1; u8 disable_length_check:1; u8 discard_errored_frames:1; u8 control_frame_enable:1; u8 enable_tx_padding:1; u8 enable_crc_forwarding:1; u8 enable_frame_padding_removal_rx: 1; u8 promiscuous_mode: 1; u8 rsvd:2; u16 rsvd2; }; struct thermal_shutdown_s { u8 enable:1; u8 warning_enable:1; u8 rsvd:6; u8 shutdown_temperature; u8 cold_temperature; u8 warning_temperature; }; struct mac_address_s { u8 mac_address[6]; }; struct mac_address_aligned_s { struct mac_address_s aligned; u16 rsvd; }; struct sleep_proxy_s { struct wake_on_lan_s { u8 wake_on_magic_packet:1; u8 wake_on_pattern:1; u8 wake_on_link_up:1; u8 wake_on_link_down:1; u8 wake_on_ping:1; u8 wake_on_timer:1; u8 rsvd:2; u8 rsvd2; u16 rsvd3; u32 link_up_timeout; u32 link_down_timeout; u32 timer; } wake_on_lan; struct { u32 mask[4]; u32 crc32; } wake_up_pattern[8]; struct __packed { u8 arp_responder:1; u8 echo_responder:1; u8 igmp_client:1; u8 echo_truncate:1; u8 address_guard:1; u8 ignore_fragmented:1; u8 rsvd:2; u16 echo_max_len; u8 rsvd2; } ipv4_offload; u32 ipv4_offload_addr[8]; u32 reserved[8]; struct __packed { u8 ns_responder:1; u8 echo_responder:1; u8 mld_client:1; u8 echo_truncate:1; u8 address_guard:1; u8 rsvd:3; u16 echo_max_len; u8 rsvd2; } ipv6_offload; u32 ipv6_offload_addr[16][4]; struct { u16 port[16]; } tcp_port_offload; struct { u16 port[16]; } udp_port_offload; struct { u32 retry_count; u32 retry_interval; } ka4_offload; struct { u32 timeout; u16 local_port; u16 remote_port; u8 remote_mac_addr[6]; u16 rsvd; u32 rsvd2; u32 rsvd3; u16 rsvd4; u16 win_size; u32 seq_num; u32 ack_num; u32 local_ip; u32 remote_ip; } ka4_connection[16]; struct { u32 retry_count; u32 retry_interval; } ka6_offload; struct { u32 timeout; u16 local_port; u16 remote_port; u8 remote_mac_addr[6]; u16 rsvd; u32 rsvd2; u32 rsvd3; u16 rsvd4; u16 win_size; u32 seq_num; u32 ack_num; u32 local_ip[4]; u32 remote_ip[4]; } ka6_connection[16]; struct { u32 rr_count; u32 rr_buf_len; u32 idx_offset; u32 rr__offset; } mdns_offload; }; struct pause_quanta_s { u16 quanta_10M; u16 threshold_10M; u16 quanta_100M; u16 threshold_100M; u16 quanta_1G; u16 threshold_1G; u16 quanta_2P5G; u16 threshold_2P5G; u16 quanta_5G; u16 threshold_5G; u16 quanta_10G; u16 threshold_10G; }; struct data_buffer_status_s { u32 data_offset; u32 data_length; }; struct device_caps_s { u8 finite_flashless:1; u8 cable_diag:1; u8 ncsi:1; u8 avb:1; u8 rsvd:4; u8 rsvd2; u16 rsvd3; u32 rsvd4; }; struct version_s { struct bundle_version_t { u8 major; u8 minor; u16 build; } bundle; struct mac_version_t { u8 major; u8 minor; u16 build; } mac; struct phy_version_t { u8 major; u8 minor; u16 build; } phy; u32 drv_iface_ver:4; u32 rsvd:28; }; struct link_status_s { u8 link_state:4; u8 link_rate:4; u8 pause_tx:1; u8 pause_rx:1; u8 eee:1; u8 duplex:1; u8 rsvd:4; u16 rsvd2; }; struct wol_status_s { u8 wake_count; u8 wake_reason; u16 wake_up_packet_length :12; u16 wake_up_pattern_number :3; u16 rsvd:1; u32 wake_up_packet[379]; }; struct mac_health_monitor_s { u8 mac_ready:1; u8 mac_fault:1; u8 mac_flashless_finished:1; u8 rsvd:5; u8 mac_temperature; u16 mac_heart_beat; u16 mac_fault_code; u16 rsvd2; }; struct phy_health_monitor_s { u8 phy_ready:1; u8 phy_fault:1; u8 phy_hot_warning:1; u8 rsvd:5; u8 phy_temperature; u16 phy_heart_beat; u16 phy_fault_code; u16 rsvd2; }; struct device_link_caps_s { u8 rsvd:3; u8 internal_loopback:1; u8 external_loopback:1; u8 rate_10M_hd:1; u8 rate_100M_hd:1; u8 rate_1G_hd:1; u8 rate_10M:1; u8 rate_100M:1; u8 rate_1G:1; u8 rate_2P5G:1; u8 rate_N2P5G:1; u8 rate_5G:1; u8 rate_N5G:1; u8 rate_10G:1; u8 rsvd3:1; u8 eee_100M:1; u8 eee_1G:1; u8 eee_2P5G:1; u8 rsvd4:1; u8 eee_5G:1; u8 rsvd5:1; u8 eee_10G:1; u8 pause_rx:1; u8 pause_tx:1; u8 pfc:1; u8 downshift:1; u8 downshift_retry:4; }; struct sleep_proxy_caps_s { u8 ipv4_offload:1; u8 ipv6_offload:1; u8 tcp_port_offload:1; u8 udp_port_offload:1; u8 ka4_offload:1; u8 ka6_offload:1; u8 mdns_offload:1; u8 wake_on_ping:1; u8 wake_on_magic_packet:1; u8 wake_on_pattern:1; u8 wake_on_timer:1; u8 wake_on_link:1; u8 wake_patterns_count:4; u8 ipv4_count; u8 ipv6_count; u8 tcp_port_offload_count; u8 udp_port_offload_count; u8 tcp4_ka_count; u8 tcp6_ka_count; u8 igmp_offload:1; u8 mld_offload:1; u8 rsvd:6; u8 rsvd2; u16 rsvd3; }; struct lkp_link_caps_s { u8 rsvd:5; u8 rate_10M_hd:1; u8 rate_100M_hd:1; u8 rate_1G_hd:1; u8 rate_10M:1; u8 rate_100M:1; u8 rate_1G:1; u8 rate_2P5G:1; u8 rate_N2P5G:1; u8 rate_5G:1; u8 rate_N5G:1; u8 rate_10G:1; u8 rsvd2:1; u8 eee_100M:1; u8 eee_1G:1; u8 eee_2P5G:1; u8 rsvd3:1; u8 eee_5G:1; u8 rsvd4:1; u8 eee_10G:1; u8 pause_rx:1; u8 pause_tx:1; u8 rsvd5:6; }; struct core_dump_s { u32 reg0; u32 reg1; u32 reg2; u32 hi; u32 lo; u32 regs[32]; }; struct trace_s { u32 sync_counter; u32 mem_buffer[0x1ff]; }; struct cable_diag_control_s { u8 toggle :1; u8 rsvd:7; u8 wait_timeout_sec; u16 rsvd2; }; struct cable_diag_lane_data_s { u8 result_code; u8 dist; u8 far_dist; u8 rsvd; }; struct cable_diag_status_s { struct cable_diag_lane_data_s lane_data[4]; u8 transact_id; u8 status:4; u8 rsvd:4; u16 rsvd2; }; struct statistics_a0_s { struct { u32 link_up; u32 link_down; } link; struct { u64 tx_unicast_octets; u64 tx_multicast_octets; u64 tx_broadcast_octets; u64 rx_unicast_octets; u64 rx_multicast_octets; u64 rx_broadcast_octets; u32 tx_unicast_frames; u32 tx_multicast_frames; u32 tx_broadcast_frames; u32 tx_errors; u32 rx_unicast_frames; u32 rx_multicast_frames; u32 rx_broadcast_frames; u32 rx_dropped_frames; u32 rx_error_frames; u32 tx_good_frames; u32 rx_good_frames; u32 reserve_fw_gap; } msm; u32 main_loop_cycles; u32 reserve_fw_gap; }; struct __packed statistics_b0_s { u64 rx_good_octets; u64 rx_pause_frames; u64 rx_good_frames; u64 rx_errors; u64 rx_unicast_frames; u64 rx_multicast_frames; u64 rx_broadcast_frames; u64 tx_good_octets; u64 tx_pause_frames; u64 tx_good_frames; u64 tx_errors; u64 tx_unicast_frames; u64 tx_multicast_frames; u64 tx_broadcast_frames; u32 main_loop_cycles; }; struct __packed statistics_s { union __packed { struct statistics_a0_s a0; struct statistics_b0_s b0; }; }; struct filter_caps_s { u8 l2_filters_base_index:6; u8 flexible_filter_mask:2; u8 l2_filter_count; u8 ethertype_filter_base_index; u8 ethertype_filter_count; u8 vlan_filter_base_index; u8 vlan_filter_count; u8 l3_ip4_filter_base_index:4; u8 l3_ip4_filter_count:4; u8 l3_ip6_filter_base_index:4; u8 l3_ip6_filter_count:4; u8 l4_filter_base_index:4; u8 l4_filter_count:4; u8 l4_flex_filter_base_index:4; u8 l4_flex_filter_count:4; u8 rslv_tbl_base_index; u8 rslv_tbl_count; }; struct request_policy_s { struct { u8 all:1; u8 mcast:1; u8 rx_queue_tc_index:5; u8 queue_or_tc:1; } promisc; struct { u8 accept:1; u8 rsvd:1; u8 rx_queue_tc_index:5; u8 queue_or_tc:1; } bcast; struct { u8 accept:1; u8 rsvd:1; u8 rx_queue_tc_index:5; u8 queue_or_tc:1; } mcast; u8 rsvd:8; }; struct fw_interface_in { u32 mtu; u32 rsvd1; struct mac_address_aligned_s mac_address; struct link_control_s link_control; u32 rsvd2; struct link_options_s link_options; u32 rsvd3; struct thermal_shutdown_s thermal_shutdown; u32 rsvd4; struct sleep_proxy_s sleep_proxy; u32 rsvd5; struct pause_quanta_s pause_quanta[8]; struct cable_diag_control_s cable_diag_control; u32 rsvd6; struct data_buffer_status_s data_buffer_status; u32 rsvd7; struct request_policy_s request_policy; }; struct transaction_counter_s { u16 transaction_cnt_a; u16 transaction_cnt_b; }; struct management_status_s { struct mac_address_s mac_address; u16 vlan; struct{ u32 enable : 1; u32 rsvd:31; } flags; u32 rsvd1; u32 rsvd2; u32 rsvd3; u32 rsvd4; u32 rsvd5; }; struct __packed fw_interface_out { struct transaction_counter_s transaction_id; struct version_s version; struct link_status_s link_status; struct wol_status_s wol_status; u32 rsvd; u32 rsvd2; struct mac_health_monitor_s mac_health_monitor; u32 rsvd3; u32 rsvd4; struct phy_health_monitor_s phy_health_monitor; u32 rsvd5; u32 rsvd6; struct cable_diag_status_s cable_diag_status; u32 rsvd7; struct device_link_caps_s device_link_caps; u32 rsvd8; struct sleep_proxy_caps_s sleep_proxy_caps; u32 rsvd9; struct lkp_link_caps_s lkp_link_caps; u32 rsvd10; struct core_dump_s core_dump; u32 rsvd11; struct statistics_s stats; struct filter_caps_s filter_caps; struct device_caps_s device_caps; u32 rsvd13; struct management_status_s management_status; u32 reserve[21]; struct trace_s trace; }; #define AQ_A2_FW_LINK_RATE_INVALID 0 #define AQ_A2_FW_LINK_RATE_10M 1 #define AQ_A2_FW_LINK_RATE_100M 2 #define AQ_A2_FW_LINK_RATE_1G 3 #define AQ_A2_FW_LINK_RATE_2G5 4 #define AQ_A2_FW_LINK_RATE_5G 5 #define AQ_A2_FW_LINK_RATE_10G 6 #define AQ_HOST_MODE_INVALID 0U #define AQ_HOST_MODE_ACTIVE 1U #define AQ_HOST_MODE_SLEEP_PROXY 2U #define AQ_HOST_MODE_LOW_POWER 3U #define AQ_HOST_MODE_SHUTDOWN 4U #define AQ_A2_FW_INTERFACE_A0 0 #define AQ_A2_FW_INTERFACE_B0 1 int hw_atl2_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops); int hw_atl2_utils_soft_reset(struct aq_hw_s *self); u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self); int hw_atl2_utils_get_action_resolve_table_caps(struct aq_hw_s *self, u8 *base_index, u8 *count); extern const struct aq_fw_ops aq_a2_fw_ops; #endif /* HW_ATL2_UTILS_H */