root/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils.h
/* 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 */