175a6faf6SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2071a0204SIgor Russkikh /* Atlantic Network Driver 3071a0204SIgor Russkikh * 4071a0204SIgor Russkikh * Copyright (C) 2014-2019 aQuantia Corporation 5071a0204SIgor Russkikh * Copyright (C) 2019-2020 Marvell International Ltd. 6753f4783SDavid VomLehn */ 7753f4783SDavid VomLehn 81a713f87SIgor Russkikh /* File aq_hw.h: Declaration of abstract interface for NIC hardware specific 9753f4783SDavid VomLehn * functions. 10753f4783SDavid VomLehn */ 11753f4783SDavid VomLehn 12753f4783SDavid VomLehn #ifndef AQ_HW_H 13753f4783SDavid VomLehn #define AQ_HW_H 14753f4783SDavid VomLehn 15753f4783SDavid VomLehn #include "aq_common.h" 16db550615SIgor Russkikh #include "aq_rss.h" 171a713f87SIgor Russkikh #include "hw_atl/hw_atl_utils.h" 18753f4783SDavid VomLehn 19910479a9SEgor Pomozov #define AQ_HW_MAC_COUNTER_HZ 312500000ll 20910479a9SEgor Pomozov #define AQ_HW_PHY_COUNTER_HZ 160000000ll 21910479a9SEgor Pomozov 220aa7bc3eSDmitry Bezrukov enum aq_tc_mode { 230aa7bc3eSDmitry Bezrukov AQ_TC_MODE_INVALID = -1, 240aa7bc3eSDmitry Bezrukov AQ_TC_MODE_8TCS, 250aa7bc3eSDmitry Bezrukov AQ_TC_MODE_4TCS, 260aa7bc3eSDmitry Bezrukov }; 270aa7bc3eSDmitry Bezrukov 2854bcb3d1SDmitry Bogdanov #define AQ_RX_FIRST_LOC_FVLANID 0U 2954bcb3d1SDmitry Bogdanov #define AQ_RX_LAST_LOC_FVLANID 15U 309a8cac4bSDmitry Bogdanov #define AQ_RX_FIRST_LOC_FETHERT 16U 319a8cac4bSDmitry Bogdanov #define AQ_RX_LAST_LOC_FETHERT 31U 32a6ed6f22SDmitry Bogdanov #define AQ_RX_FIRST_LOC_FL3L4 32U 33a6ed6f22SDmitry Bogdanov #define AQ_RX_LAST_LOC_FL3L4 39U 34a6ed6f22SDmitry Bogdanov #define AQ_RX_MAX_RXNFC_LOC AQ_RX_LAST_LOC_FL3L4 3554bcb3d1SDmitry Bogdanov #define AQ_VLAN_MAX_FILTERS \ 3654bcb3d1SDmitry Bogdanov (AQ_RX_LAST_LOC_FVLANID - AQ_RX_FIRST_LOC_FVLANID + 1U) 377975d2afSDmitry Bogdanov #define AQ_RX_QUEUE_NOT_ASSIGNED 0xFFU 38a6ed6f22SDmitry Bogdanov 39519f0cefSMark Starovoytov #define AQ_FRAC_PER_NS 0x100000000LL 40519f0cefSMark Starovoytov 417327699fSMark Starovoytov /* Used for rate to Mbps conversion */ 427327699fSMark Starovoytov #define AQ_MBPS_DIVISOR 125000 /* 1000000 / 8 */ 437327699fSMark Starovoytov 44753f4783SDavid VomLehn /* NIC H/W capabilities */ 45753f4783SDavid VomLehn struct aq_hw_caps_s { 46753f4783SDavid VomLehn u64 hw_features; 47753f4783SDavid VomLehn u64 link_speed_msk; 48753f4783SDavid VomLehn unsigned int hw_priv_flags; 494948293fSIgor Russkikh u32 media_type; 50c1af5427SAnton Mikaev u32 rxds_max; 51c1af5427SAnton Mikaev u32 txds_max; 52c1af5427SAnton Mikaev u32 rxds_min; 53c1af5427SAnton Mikaev u32 txds_min; 54753f4783SDavid VomLehn u32 txhwb_alignment; 55753f4783SDavid VomLehn u32 irq_mask; 56753f4783SDavid VomLehn u32 vecs; 57753f4783SDavid VomLehn u32 mtu; 58753f4783SDavid VomLehn u32 mac_regs_count; 5976c19c6cSIgor Russkikh u32 hw_alive_check_addr; 60753f4783SDavid VomLehn u8 msix_irqs; 618ce84271SDmitry Bezrukov u8 tcs_max; 62753f4783SDavid VomLehn u8 rxd_alignment; 63753f4783SDavid VomLehn u8 rxd_size; 64753f4783SDavid VomLehn u8 txd_alignment; 65753f4783SDavid VomLehn u8 txd_size; 66753f4783SDavid VomLehn u8 tx_rings; 67753f4783SDavid VomLehn u8 rx_rings; 68753f4783SDavid VomLehn bool flow_control; 69753f4783SDavid VomLehn bool is_64_dma; 701e41b3feSPavel Belous bool op64bit; 7123e500e8SNikita Danilov u32 quirks; 72b3f0c79cSIgor Russkikh u32 priv_data_len; 73753f4783SDavid VomLehn }; 74753f4783SDavid VomLehn 75753f4783SDavid VomLehn struct aq_hw_link_status_s { 76753f4783SDavid VomLehn unsigned int mbps; 77071a0204SIgor Russkikh bool full_duplex; 782b53b04dSDmitry Bogdanov u32 lp_link_speed_msk; 792b53b04dSDmitry Bogdanov u32 lp_flow_control; 80753f4783SDavid VomLehn }; 81753f4783SDavid VomLehn 82be08d839SIgor Russkikh struct aq_stats_s { 832087ced0SDmitry Bogdanov u64 brc; 842087ced0SDmitry Bogdanov u64 btc; 85be08d839SIgor Russkikh u64 uprc; 86be08d839SIgor Russkikh u64 mprc; 87be08d839SIgor Russkikh u64 bprc; 88be08d839SIgor Russkikh u64 erpt; 89be08d839SIgor Russkikh u64 uptc; 90be08d839SIgor Russkikh u64 mptc; 91be08d839SIgor Russkikh u64 bptc; 92be08d839SIgor Russkikh u64 erpr; 93be08d839SIgor Russkikh u64 mbtc; 94be08d839SIgor Russkikh u64 bbtc; 95be08d839SIgor Russkikh u64 mbrc; 96be08d839SIgor Russkikh u64 bbrc; 97be08d839SIgor Russkikh u64 ubrc; 98be08d839SIgor Russkikh u64 ubtc; 99be08d839SIgor Russkikh u64 dpc; 100be08d839SIgor Russkikh u64 dma_pkt_rc; 101be08d839SIgor Russkikh u64 dma_pkt_tc; 102be08d839SIgor Russkikh u64 dma_oct_rc; 103be08d839SIgor Russkikh u64 dma_oct_tc; 104be08d839SIgor Russkikh }; 105be08d839SIgor Russkikh 106753f4783SDavid VomLehn #define AQ_HW_IRQ_INVALID 0U 107ff9b5e14SDamien Le Moal #define AQ_HW_IRQ_INTX 1U 108753f4783SDavid VomLehn #define AQ_HW_IRQ_MSI 2U 109753f4783SDavid VomLehn #define AQ_HW_IRQ_MSIX 3U 110753f4783SDavid VomLehn 1113dd3e236SIgor Russkikh #define AQ_HW_SERVICE_IRQS 1U 1123dd3e236SIgor Russkikh 113753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D0 0U 114753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D3 3U 115753f4783SDavid VomLehn 116*fad9cf21SEric Work #define AQ_FW_WAKE_ON_LINK_RTPM BIT(10) 117*fad9cf21SEric Work 118753f4783SDavid VomLehn #define AQ_HW_FLAG_STARTED 0x00000004U 119753f4783SDavid VomLehn #define AQ_HW_FLAG_STOPPING 0x00000008U 120753f4783SDavid VomLehn #define AQ_HW_FLAG_RESETTING 0x00000010U 121753f4783SDavid VomLehn #define AQ_HW_FLAG_CLOSING 0x00000020U 122910479a9SEgor Pomozov #define AQ_HW_PTP_AVAILABLE 0x01000000U 123753f4783SDavid VomLehn #define AQ_HW_LINK_DOWN 0x04000000U 124753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_UNPLUG 0x40000000U 125753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_HW 0x80000000U 126753f4783SDavid VomLehn 127753f4783SDavid VomLehn #define AQ_HW_FLAG_ERRORS (AQ_HW_FLAG_ERR_HW | AQ_HW_FLAG_ERR_UNPLUG) 128753f4783SDavid VomLehn 129db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_READY (AQ_NIC_FLAG_STOPPING | \ 130db550615SIgor Russkikh AQ_NIC_FLAG_RESETTING | AQ_NIC_FLAG_CLOSING | \ 131db550615SIgor Russkikh AQ_NIC_FLAG_ERR_UNPLUG | AQ_NIC_FLAG_ERR_HW) 132db550615SIgor Russkikh 133db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_TX_READY (AQ_NIC_FLAGS_IS_NOT_READY | \ 134db550615SIgor Russkikh AQ_NIC_LINK_DOWN) 135db550615SIgor Russkikh 1364948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_TP 1U 1374948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_FIBRE 2U 1384948293fSIgor Russkikh 139c1af5427SAnton Mikaev #define AQ_HW_TXD_MULTIPLE 8U 140c1af5427SAnton Mikaev #define AQ_HW_RXD_MULTIPLE 8U 141c1af5427SAnton Mikaev 142a83fe6b6SDmitry Bezrukov #define AQ_HW_QUEUES_MAX 32U 14394b3b542SIgor Russkikh #define AQ_HW_MULTICAST_ADDRESS_MAX 32U 14494b3b542SIgor Russkikh 1458ce84271SDmitry Bezrukov #define AQ_HW_PTP_TC 2U 1468ce84271SDmitry Bezrukov 147d1287ce4SNikita Danilov #define AQ_HW_LED_BLINK 0x2U 148d1287ce4SNikita Danilov #define AQ_HW_LED_DEFAULT 0x0U 149d1287ce4SNikita Danilov 15060db5e40SIgor Russkikh #define AQ_HW_MEDIA_DETECT_CNT 6000 15160db5e40SIgor Russkikh 152ea4b4d7fSIgor Russkikh enum aq_priv_flags { 153ea4b4d7fSIgor Russkikh AQ_HW_LOOPBACK_DMA_SYS, 154ea4b4d7fSIgor Russkikh AQ_HW_LOOPBACK_PKT_SYS, 155ea4b4d7fSIgor Russkikh AQ_HW_LOOPBACK_DMA_NET, 156ea4b4d7fSIgor Russkikh AQ_HW_LOOPBACK_PHYINT_SYS, 157ea4b4d7fSIgor Russkikh AQ_HW_LOOPBACK_PHYEXT_SYS, 158ea4b4d7fSIgor Russkikh }; 159ea4b4d7fSIgor Russkikh 160ea4b4d7fSIgor Russkikh #define AQ_HW_LOOPBACK_MASK (BIT(AQ_HW_LOOPBACK_DMA_SYS) |\ 161ea4b4d7fSIgor Russkikh BIT(AQ_HW_LOOPBACK_PKT_SYS) |\ 162ea4b4d7fSIgor Russkikh BIT(AQ_HW_LOOPBACK_DMA_NET) |\ 163ea4b4d7fSIgor Russkikh BIT(AQ_HW_LOOPBACK_PHYINT_SYS) |\ 164ea4b4d7fSIgor Russkikh BIT(AQ_HW_LOOPBACK_PHYEXT_SYS)) 165ea4b4d7fSIgor Russkikh 166d1ad88feSMark Starovoytov #define ATL_HW_CHIP_MIPS 0x00000001U 167d1ad88feSMark Starovoytov #define ATL_HW_CHIP_TPO2 0x00000002U 168d1ad88feSMark Starovoytov #define ATL_HW_CHIP_RPF2 0x00000004U 169d1ad88feSMark Starovoytov #define ATL_HW_CHIP_MPI_AQ 0x00000010U 170d1ad88feSMark Starovoytov #define ATL_HW_CHIP_ATLANTIC 0x00800000U 171d1ad88feSMark Starovoytov #define ATL_HW_CHIP_REVISION_A0 0x01000000U 172d1ad88feSMark Starovoytov #define ATL_HW_CHIP_REVISION_B0 0x02000000U 173d1ad88feSMark Starovoytov #define ATL_HW_CHIP_REVISION_B1 0x04000000U 174d1ad88feSMark Starovoytov #define ATL_HW_CHIP_ANTIGUA 0x08000000U 175d1ad88feSMark Starovoytov 176d1ad88feSMark Starovoytov #define ATL_HW_IS_CHIP_FEATURE(_HW_, _F_) (!!(ATL_HW_CHIP_##_F_ & \ 177d1ad88feSMark Starovoytov (_HW_)->chip_features)) 178d1ad88feSMark Starovoytov 179753f4783SDavid VomLehn struct aq_hw_s { 18078f5193dSIgor Russkikh atomic_t flags; 181c8c82eb3SIgor Russkikh u8 rbl_enabled:1; 182753f4783SDavid VomLehn struct aq_nic_cfg_s *aq_nic_cfg; 1830c58c35fSIgor Russkikh const struct aq_fw_ops *aq_fw_ops; 184753f4783SDavid VomLehn void __iomem *mmio; 185753f4783SDavid VomLehn struct aq_hw_link_status_s aq_link_status; 1868f60f762SNikita Danilov struct hw_atl_utils_mbox mbox; 1871a713f87SIgor Russkikh struct hw_atl_stats_s last_stats; 1881a713f87SIgor Russkikh struct aq_stats_s curr_stats; 1891a713f87SIgor Russkikh u64 speed; 1901a713f87SIgor Russkikh u32 itr_tx; 1911a713f87SIgor Russkikh u32 itr_rx; 1921a713f87SIgor Russkikh unsigned int chip_features; 1931a713f87SIgor Russkikh u32 fw_ver_actual; 1941a713f87SIgor Russkikh atomic_t dpc; 1951a713f87SIgor Russkikh u32 mbox_addr; 1961a713f87SIgor Russkikh u32 rpc_addr; 197dc12f75aSNikita Danilov u32 settings_addr; 1981a713f87SIgor Russkikh u32 rpc_tid; 1998f60f762SNikita Danilov struct hw_atl_utils_fw_rpc rpc; 200910479a9SEgor Pomozov s64 ptp_clk_offset; 201dbcd6806SDmitry Bezrukov u16 phy_id; 202258ff0cfSDmitry Bogdanov void *priv; 203753f4783SDavid VomLehn }; 204753f4783SDavid VomLehn 205753f4783SDavid VomLehn struct aq_ring_s; 206753f4783SDavid VomLehn struct aq_ring_param_s; 207753f4783SDavid VomLehn struct sk_buff; 208a6ed6f22SDmitry Bogdanov struct aq_rx_filter_l3l4; 209753f4783SDavid VomLehn 210753f4783SDavid VomLehn struct aq_hw_ops { 211753f4783SDavid VomLehn 212753f4783SDavid VomLehn int (*hw_ring_tx_xmit)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 213753f4783SDavid VomLehn unsigned int frags); 214753f4783SDavid VomLehn 215753f4783SDavid VomLehn int (*hw_ring_rx_receive)(struct aq_hw_s *self, 216753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 217753f4783SDavid VomLehn 218753f4783SDavid VomLehn int (*hw_ring_rx_fill)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 219753f4783SDavid VomLehn unsigned int sw_tail_old); 220753f4783SDavid VomLehn 221753f4783SDavid VomLehn int (*hw_ring_tx_head_update)(struct aq_hw_s *self, 222753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 223753f4783SDavid VomLehn 22476660757SJakub Kicinski int (*hw_set_mac_address)(struct aq_hw_s *self, const u8 *mac_addr); 225753f4783SDavid VomLehn 226099d074eSMark Starovoytov int (*hw_soft_reset)(struct aq_hw_s *self); 227099d074eSMark Starovoytov 228099d074eSMark Starovoytov int (*hw_prepare)(struct aq_hw_s *self, 229099d074eSMark Starovoytov const struct aq_fw_ops **fw_ops); 230099d074eSMark Starovoytov 231753f4783SDavid VomLehn int (*hw_reset)(struct aq_hw_s *self); 232753f4783SDavid VomLehn 23376660757SJakub Kicinski int (*hw_init)(struct aq_hw_s *self, const u8 *mac_addr); 234753f4783SDavid VomLehn 235753f4783SDavid VomLehn int (*hw_start)(struct aq_hw_s *self); 236753f4783SDavid VomLehn 237753f4783SDavid VomLehn int (*hw_stop)(struct aq_hw_s *self); 238753f4783SDavid VomLehn 239753f4783SDavid VomLehn int (*hw_ring_tx_init)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 240753f4783SDavid VomLehn struct aq_ring_param_s *aq_ring_param); 241753f4783SDavid VomLehn 242753f4783SDavid VomLehn int (*hw_ring_tx_start)(struct aq_hw_s *self, 243753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 244753f4783SDavid VomLehn 245753f4783SDavid VomLehn int (*hw_ring_tx_stop)(struct aq_hw_s *self, 246753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 247753f4783SDavid VomLehn 248753f4783SDavid VomLehn int (*hw_ring_rx_init)(struct aq_hw_s *self, 249753f4783SDavid VomLehn struct aq_ring_s *aq_ring, 250753f4783SDavid VomLehn struct aq_ring_param_s *aq_ring_param); 251753f4783SDavid VomLehn 252753f4783SDavid VomLehn int (*hw_ring_rx_start)(struct aq_hw_s *self, 253753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 254753f4783SDavid VomLehn 255753f4783SDavid VomLehn int (*hw_ring_rx_stop)(struct aq_hw_s *self, 256753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 257753f4783SDavid VomLehn 258753f4783SDavid VomLehn int (*hw_irq_enable)(struct aq_hw_s *self, u64 mask); 259753f4783SDavid VomLehn 260753f4783SDavid VomLehn int (*hw_irq_disable)(struct aq_hw_s *self, u64 mask); 261753f4783SDavid VomLehn 262753f4783SDavid VomLehn int (*hw_irq_read)(struct aq_hw_s *self, u64 *mask); 263753f4783SDavid VomLehn 264753f4783SDavid VomLehn int (*hw_packet_filter_set)(struct aq_hw_s *self, 265753f4783SDavid VomLehn unsigned int packet_filter); 266753f4783SDavid VomLehn 267a6ed6f22SDmitry Bogdanov int (*hw_filter_l3l4_set)(struct aq_hw_s *self, 268a6ed6f22SDmitry Bogdanov struct aq_rx_filter_l3l4 *data); 269a6ed6f22SDmitry Bogdanov 270a6ed6f22SDmitry Bogdanov int (*hw_filter_l3l4_clear)(struct aq_hw_s *self, 271a6ed6f22SDmitry Bogdanov struct aq_rx_filter_l3l4 *data); 272a6ed6f22SDmitry Bogdanov 2739a8cac4bSDmitry Bogdanov int (*hw_filter_l2_set)(struct aq_hw_s *self, 2749a8cac4bSDmitry Bogdanov struct aq_rx_filter_l2 *data); 2759a8cac4bSDmitry Bogdanov 2769a8cac4bSDmitry Bogdanov int (*hw_filter_l2_clear)(struct aq_hw_s *self, 2779a8cac4bSDmitry Bogdanov struct aq_rx_filter_l2 *data); 2789a8cac4bSDmitry Bogdanov 27954bcb3d1SDmitry Bogdanov int (*hw_filter_vlan_set)(struct aq_hw_s *self, 28054bcb3d1SDmitry Bogdanov struct aq_rx_filter_vlan *aq_vlans); 28154bcb3d1SDmitry Bogdanov 28254bcb3d1SDmitry Bogdanov int (*hw_filter_vlan_ctrl)(struct aq_hw_s *self, bool enable); 28354bcb3d1SDmitry Bogdanov 284753f4783SDavid VomLehn int (*hw_multicast_list_set)(struct aq_hw_s *self, 28594b3b542SIgor Russkikh u8 ar_mac[AQ_HW_MULTICAST_ADDRESS_MAX] 286753f4783SDavid VomLehn [ETH_ALEN], 287753f4783SDavid VomLehn u32 count); 288753f4783SDavid VomLehn 289b82ee71aSIgor Russkikh int (*hw_interrupt_moderation_set)(struct aq_hw_s *self); 290753f4783SDavid VomLehn 291753f4783SDavid VomLehn int (*hw_rss_set)(struct aq_hw_s *self, 292753f4783SDavid VomLehn struct aq_rss_parameters *rss_params); 293753f4783SDavid VomLehn 294753f4783SDavid VomLehn int (*hw_rss_hash_set)(struct aq_hw_s *self, 295753f4783SDavid VomLehn struct aq_rss_parameters *rss_params); 296753f4783SDavid VomLehn 2972deac71aSMark Starovoytov int (*hw_tc_rate_limit_set)(struct aq_hw_s *self); 2982deac71aSMark Starovoytov 299753f4783SDavid VomLehn int (*hw_get_regs)(struct aq_hw_s *self, 3004cbc9f92SIgor Russkikh const struct aq_hw_caps_s *aq_hw_caps, 3014cbc9f92SIgor Russkikh u32 *regs_buff); 302753f4783SDavid VomLehn 303be08d839SIgor Russkikh struct aq_stats_s *(*hw_get_hw_stats)(struct aq_hw_s *self); 304753f4783SDavid VomLehn 30536e90a52SNikita Danilov u32 (*hw_get_fw_version)(struct aq_hw_s *self); 306753f4783SDavid VomLehn 307bbb67a44SDmitry Bogdanov int (*hw_set_offload)(struct aq_hw_s *self, 308bbb67a44SDmitry Bogdanov struct aq_nic_cfg_s *aq_nic_cfg); 309bbb67a44SDmitry Bogdanov 31004a18399SEgor Pomozov int (*hw_ring_hwts_rx_fill)(struct aq_hw_s *self, 31104a18399SEgor Pomozov struct aq_ring_s *aq_ring); 31204a18399SEgor Pomozov 31304a18399SEgor Pomozov int (*hw_ring_hwts_rx_receive)(struct aq_hw_s *self, 31404a18399SEgor Pomozov struct aq_ring_s *ring); 31504a18399SEgor Pomozov 316910479a9SEgor Pomozov void (*hw_get_ptp_ts)(struct aq_hw_s *self, u64 *stamp); 317910479a9SEgor Pomozov 318910479a9SEgor Pomozov int (*hw_adj_clock_freq)(struct aq_hw_s *self, s32 delta); 319910479a9SEgor Pomozov 320910479a9SEgor Pomozov int (*hw_adj_sys_clock)(struct aq_hw_s *self, s64 delta); 321910479a9SEgor Pomozov 322910479a9SEgor Pomozov int (*hw_set_sys_clock)(struct aq_hw_s *self, u64 time, u64 ts); 323910479a9SEgor Pomozov 3249c477032SDmitry Bezrukov int (*hw_ts_to_sys_clock)(struct aq_hw_s *self, u64 ts, u64 *time); 3259c477032SDmitry Bezrukov 3269c477032SDmitry Bezrukov int (*hw_gpio_pulse)(struct aq_hw_s *self, u32 index, u64 start, 3279c477032SDmitry Bezrukov u32 period); 3289c477032SDmitry Bezrukov 3299c477032SDmitry Bezrukov int (*hw_extts_gpio_enable)(struct aq_hw_s *self, u32 index, 3309c477032SDmitry Bezrukov u32 enable); 3319c477032SDmitry Bezrukov 3329c477032SDmitry Bezrukov int (*hw_get_sync_ts)(struct aq_hw_s *self, u64 *ts); 3339c477032SDmitry Bezrukov 33404a18399SEgor Pomozov u16 (*rx_extract_ts)(struct aq_hw_s *self, u8 *p, unsigned int len, 33504a18399SEgor Pomozov u64 *timestamp); 33604a18399SEgor Pomozov 33704a18399SEgor Pomozov int (*extract_hwts)(struct aq_hw_s *self, u8 *p, unsigned int len, 33804a18399SEgor Pomozov u64 *timestamp); 33904a18399SEgor Pomozov 34035e8e8b4SIgor Russkikh int (*hw_set_fc)(struct aq_hw_s *self, u32 fc, u32 tc); 341ea4b4d7fSIgor Russkikh 342ea4b4d7fSIgor Russkikh int (*hw_set_loopback)(struct aq_hw_s *self, u32 mode, bool enable); 3438dcf2ad3SMark Starovoytov 3448dcf2ad3SMark Starovoytov int (*hw_get_mac_temp)(struct aq_hw_s *self, u32 *temp); 345853a2944SLorenz Brun 346853a2944SLorenz Brun int (*hw_read_module_eeprom)(struct aq_hw_s *self, u8 dev_addr, 347853a2944SLorenz Brun u8 reg_start_addr, int len, u8 *data); 348753f4783SDavid VomLehn }; 349753f4783SDavid VomLehn 3500c58c35fSIgor Russkikh struct aq_fw_ops { 3510c58c35fSIgor Russkikh int (*init)(struct aq_hw_s *self); 3520c58c35fSIgor Russkikh 35344e00dd8SIgor Russkikh int (*deinit)(struct aq_hw_s *self); 35444e00dd8SIgor Russkikh 3550c58c35fSIgor Russkikh int (*reset)(struct aq_hw_s *self); 3560c58c35fSIgor Russkikh 357b8d68b62SAnton Mikaev int (*renegotiate)(struct aq_hw_s *self); 358b8d68b62SAnton Mikaev 3590c58c35fSIgor Russkikh int (*get_mac_permanent)(struct aq_hw_s *self, u8 *mac); 3600c58c35fSIgor Russkikh 3610c58c35fSIgor Russkikh int (*set_link_speed)(struct aq_hw_s *self, u32 speed); 3620c58c35fSIgor Russkikh 36344e00dd8SIgor Russkikh int (*set_state)(struct aq_hw_s *self, 36444e00dd8SIgor Russkikh enum hal_atl_utils_fw_state_e state); 3650c58c35fSIgor Russkikh 3660c58c35fSIgor Russkikh int (*update_link_status)(struct aq_hw_s *self); 3670c58c35fSIgor Russkikh 3680c58c35fSIgor Russkikh int (*update_stats)(struct aq_hw_s *self); 36944e00dd8SIgor Russkikh 3708dcf2ad3SMark Starovoytov int (*get_mac_temp)(struct aq_hw_s *self, int *temp); 3718dcf2ad3SMark Starovoytov 3728f894011SYana Esina int (*get_phy_temp)(struct aq_hw_s *self, int *temp); 3738f894011SYana Esina 37435e8e8b4SIgor Russkikh u32 (*get_flow_control)(struct aq_hw_s *self, u32 *fcmode); 37535e8e8b4SIgor Russkikh 37644e00dd8SIgor Russkikh int (*set_flow_control)(struct aq_hw_s *self); 377a0da96c0SYana Esina 378d1287ce4SNikita Danilov int (*led_control)(struct aq_hw_s *self, u32 mode); 379d1287ce4SNikita Danilov 380ea4b4d7fSIgor Russkikh int (*set_phyloopback)(struct aq_hw_s *self, u32 mode, bool enable); 381ea4b4d7fSIgor Russkikh 382a0da96c0SYana Esina int (*set_power)(struct aq_hw_s *self, unsigned int power_state, 38376660757SJakub Kicinski const u8 *mac); 38492ab6407SYana Esina 385910479a9SEgor Pomozov int (*send_fw_request)(struct aq_hw_s *self, 386910479a9SEgor Pomozov const struct hw_fw_request_iface *fw_req, 387910479a9SEgor Pomozov size_t size); 388910479a9SEgor Pomozov 389910479a9SEgor Pomozov void (*enable_ptp)(struct aq_hw_s *self, int enable); 390910479a9SEgor Pomozov 391f08a464cSEgor Pomozov void (*adjust_ptp)(struct aq_hw_s *self, uint64_t adj); 392f08a464cSEgor Pomozov 39392ab6407SYana Esina int (*set_eee_rate)(struct aq_hw_s *self, u32 speed); 39492ab6407SYana Esina 39592ab6407SYana Esina int (*get_eee_rate)(struct aq_hw_s *self, u32 *rate, 39692ab6407SYana Esina u32 *supported_rates); 39762c1c2e6SDmitry Bogdanov 398e193c3abSIgor Russkikh int (*set_downshift)(struct aq_hw_s *self, u32 counter); 399e193c3abSIgor Russkikh 40060db5e40SIgor Russkikh int (*set_media_detect)(struct aq_hw_s *self, bool enable); 40160db5e40SIgor Russkikh 40262c1c2e6SDmitry Bogdanov u32 (*get_link_capabilities)(struct aq_hw_s *self); 40362c1c2e6SDmitry Bogdanov 40462c1c2e6SDmitry Bogdanov int (*send_macsec_req)(struct aq_hw_s *self, 40562c1c2e6SDmitry Bogdanov struct macsec_msg_fw_request *msg, 40662c1c2e6SDmitry Bogdanov struct macsec_msg_fw_response *resp); 4070c58c35fSIgor Russkikh }; 4080c58c35fSIgor Russkikh 409753f4783SDavid VomLehn #endif /* AQ_HW_H */ 410