1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* Atlantic Network Driver 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2014-2019 aQuantia Corporation 5*4882a593Smuzhiyun * Copyright (C) 2019-2020 Marvell International Ltd. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* File aq_hw.h: Declaration of abstract interface for NIC hardware specific 9*4882a593Smuzhiyun * functions. 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef AQ_HW_H 13*4882a593Smuzhiyun #define AQ_HW_H 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include "aq_common.h" 16*4882a593Smuzhiyun #include "aq_rss.h" 17*4882a593Smuzhiyun #include "hw_atl/hw_atl_utils.h" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define AQ_HW_MAC_COUNTER_HZ 312500000ll 20*4882a593Smuzhiyun #define AQ_HW_PHY_COUNTER_HZ 160000000ll 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum aq_tc_mode { 23*4882a593Smuzhiyun AQ_TC_MODE_INVALID = -1, 24*4882a593Smuzhiyun AQ_TC_MODE_8TCS, 25*4882a593Smuzhiyun AQ_TC_MODE_4TCS, 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define AQ_RX_FIRST_LOC_FVLANID 0U 29*4882a593Smuzhiyun #define AQ_RX_LAST_LOC_FVLANID 15U 30*4882a593Smuzhiyun #define AQ_RX_FIRST_LOC_FETHERT 16U 31*4882a593Smuzhiyun #define AQ_RX_LAST_LOC_FETHERT 31U 32*4882a593Smuzhiyun #define AQ_RX_FIRST_LOC_FL3L4 32U 33*4882a593Smuzhiyun #define AQ_RX_LAST_LOC_FL3L4 39U 34*4882a593Smuzhiyun #define AQ_RX_MAX_RXNFC_LOC AQ_RX_LAST_LOC_FL3L4 35*4882a593Smuzhiyun #define AQ_VLAN_MAX_FILTERS \ 36*4882a593Smuzhiyun (AQ_RX_LAST_LOC_FVLANID - AQ_RX_FIRST_LOC_FVLANID + 1U) 37*4882a593Smuzhiyun #define AQ_RX_QUEUE_NOT_ASSIGNED 0xFFU 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define AQ_FRAC_PER_NS 0x100000000LL 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* Used for rate to Mbps conversion */ 42*4882a593Smuzhiyun #define AQ_MBPS_DIVISOR 125000 /* 1000000 / 8 */ 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* NIC H/W capabilities */ 45*4882a593Smuzhiyun struct aq_hw_caps_s { 46*4882a593Smuzhiyun u64 hw_features; 47*4882a593Smuzhiyun u64 link_speed_msk; 48*4882a593Smuzhiyun unsigned int hw_priv_flags; 49*4882a593Smuzhiyun u32 media_type; 50*4882a593Smuzhiyun u32 rxds_max; 51*4882a593Smuzhiyun u32 txds_max; 52*4882a593Smuzhiyun u32 rxds_min; 53*4882a593Smuzhiyun u32 txds_min; 54*4882a593Smuzhiyun u32 txhwb_alignment; 55*4882a593Smuzhiyun u32 irq_mask; 56*4882a593Smuzhiyun u32 vecs; 57*4882a593Smuzhiyun u32 mtu; 58*4882a593Smuzhiyun u32 mac_regs_count; 59*4882a593Smuzhiyun u32 hw_alive_check_addr; 60*4882a593Smuzhiyun u8 msix_irqs; 61*4882a593Smuzhiyun u8 tcs_max; 62*4882a593Smuzhiyun u8 rxd_alignment; 63*4882a593Smuzhiyun u8 rxd_size; 64*4882a593Smuzhiyun u8 txd_alignment; 65*4882a593Smuzhiyun u8 txd_size; 66*4882a593Smuzhiyun u8 tx_rings; 67*4882a593Smuzhiyun u8 rx_rings; 68*4882a593Smuzhiyun bool flow_control; 69*4882a593Smuzhiyun bool is_64_dma; 70*4882a593Smuzhiyun bool op64bit; 71*4882a593Smuzhiyun u32 quirks; 72*4882a593Smuzhiyun u32 priv_data_len; 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun struct aq_hw_link_status_s { 76*4882a593Smuzhiyun unsigned int mbps; 77*4882a593Smuzhiyun bool full_duplex; 78*4882a593Smuzhiyun u32 lp_link_speed_msk; 79*4882a593Smuzhiyun u32 lp_flow_control; 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct aq_stats_s { 83*4882a593Smuzhiyun u64 brc; 84*4882a593Smuzhiyun u64 btc; 85*4882a593Smuzhiyun u64 uprc; 86*4882a593Smuzhiyun u64 mprc; 87*4882a593Smuzhiyun u64 bprc; 88*4882a593Smuzhiyun u64 erpt; 89*4882a593Smuzhiyun u64 uptc; 90*4882a593Smuzhiyun u64 mptc; 91*4882a593Smuzhiyun u64 bptc; 92*4882a593Smuzhiyun u64 erpr; 93*4882a593Smuzhiyun u64 mbtc; 94*4882a593Smuzhiyun u64 bbtc; 95*4882a593Smuzhiyun u64 mbrc; 96*4882a593Smuzhiyun u64 bbrc; 97*4882a593Smuzhiyun u64 ubrc; 98*4882a593Smuzhiyun u64 ubtc; 99*4882a593Smuzhiyun u64 dpc; 100*4882a593Smuzhiyun u64 dma_pkt_rc; 101*4882a593Smuzhiyun u64 dma_pkt_tc; 102*4882a593Smuzhiyun u64 dma_oct_rc; 103*4882a593Smuzhiyun u64 dma_oct_tc; 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define AQ_HW_IRQ_INVALID 0U 107*4882a593Smuzhiyun #define AQ_HW_IRQ_LEGACY 1U 108*4882a593Smuzhiyun #define AQ_HW_IRQ_MSI 2U 109*4882a593Smuzhiyun #define AQ_HW_IRQ_MSIX 3U 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define AQ_HW_SERVICE_IRQS 1U 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define AQ_HW_POWER_STATE_D0 0U 114*4882a593Smuzhiyun #define AQ_HW_POWER_STATE_D3 3U 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define AQ_HW_FLAG_STARTED 0x00000004U 117*4882a593Smuzhiyun #define AQ_HW_FLAG_STOPPING 0x00000008U 118*4882a593Smuzhiyun #define AQ_HW_FLAG_RESETTING 0x00000010U 119*4882a593Smuzhiyun #define AQ_HW_FLAG_CLOSING 0x00000020U 120*4882a593Smuzhiyun #define AQ_HW_PTP_AVAILABLE 0x01000000U 121*4882a593Smuzhiyun #define AQ_HW_LINK_DOWN 0x04000000U 122*4882a593Smuzhiyun #define AQ_HW_FLAG_ERR_UNPLUG 0x40000000U 123*4882a593Smuzhiyun #define AQ_HW_FLAG_ERR_HW 0x80000000U 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun #define AQ_HW_FLAG_ERRORS (AQ_HW_FLAG_ERR_HW | AQ_HW_FLAG_ERR_UNPLUG) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define AQ_NIC_FLAGS_IS_NOT_READY (AQ_NIC_FLAG_STOPPING | \ 128*4882a593Smuzhiyun AQ_NIC_FLAG_RESETTING | AQ_NIC_FLAG_CLOSING | \ 129*4882a593Smuzhiyun AQ_NIC_FLAG_ERR_UNPLUG | AQ_NIC_FLAG_ERR_HW) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define AQ_NIC_FLAGS_IS_NOT_TX_READY (AQ_NIC_FLAGS_IS_NOT_READY | \ 132*4882a593Smuzhiyun AQ_NIC_LINK_DOWN) 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #define AQ_HW_MEDIA_TYPE_TP 1U 135*4882a593Smuzhiyun #define AQ_HW_MEDIA_TYPE_FIBRE 2U 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define AQ_HW_TXD_MULTIPLE 8U 138*4882a593Smuzhiyun #define AQ_HW_RXD_MULTIPLE 8U 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define AQ_HW_QUEUES_MAX 32U 141*4882a593Smuzhiyun #define AQ_HW_MULTICAST_ADDRESS_MAX 32U 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define AQ_HW_PTP_TC 2U 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define AQ_HW_LED_BLINK 0x2U 146*4882a593Smuzhiyun #define AQ_HW_LED_DEFAULT 0x0U 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define AQ_HW_MEDIA_DETECT_CNT 6000 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun enum aq_priv_flags { 151*4882a593Smuzhiyun AQ_HW_LOOPBACK_DMA_SYS, 152*4882a593Smuzhiyun AQ_HW_LOOPBACK_PKT_SYS, 153*4882a593Smuzhiyun AQ_HW_LOOPBACK_DMA_NET, 154*4882a593Smuzhiyun AQ_HW_LOOPBACK_PHYINT_SYS, 155*4882a593Smuzhiyun AQ_HW_LOOPBACK_PHYEXT_SYS, 156*4882a593Smuzhiyun }; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define AQ_HW_LOOPBACK_MASK (BIT(AQ_HW_LOOPBACK_DMA_SYS) |\ 159*4882a593Smuzhiyun BIT(AQ_HW_LOOPBACK_PKT_SYS) |\ 160*4882a593Smuzhiyun BIT(AQ_HW_LOOPBACK_DMA_NET) |\ 161*4882a593Smuzhiyun BIT(AQ_HW_LOOPBACK_PHYINT_SYS) |\ 162*4882a593Smuzhiyun BIT(AQ_HW_LOOPBACK_PHYEXT_SYS)) 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #define ATL_HW_CHIP_MIPS 0x00000001U 165*4882a593Smuzhiyun #define ATL_HW_CHIP_TPO2 0x00000002U 166*4882a593Smuzhiyun #define ATL_HW_CHIP_RPF2 0x00000004U 167*4882a593Smuzhiyun #define ATL_HW_CHIP_MPI_AQ 0x00000010U 168*4882a593Smuzhiyun #define ATL_HW_CHIP_ATLANTIC 0x00800000U 169*4882a593Smuzhiyun #define ATL_HW_CHIP_REVISION_A0 0x01000000U 170*4882a593Smuzhiyun #define ATL_HW_CHIP_REVISION_B0 0x02000000U 171*4882a593Smuzhiyun #define ATL_HW_CHIP_REVISION_B1 0x04000000U 172*4882a593Smuzhiyun #define ATL_HW_CHIP_ANTIGUA 0x08000000U 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #define ATL_HW_IS_CHIP_FEATURE(_HW_, _F_) (!!(ATL_HW_CHIP_##_F_ & \ 175*4882a593Smuzhiyun (_HW_)->chip_features)) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct aq_hw_s { 178*4882a593Smuzhiyun atomic_t flags; 179*4882a593Smuzhiyun u8 rbl_enabled:1; 180*4882a593Smuzhiyun struct aq_nic_cfg_s *aq_nic_cfg; 181*4882a593Smuzhiyun const struct aq_fw_ops *aq_fw_ops; 182*4882a593Smuzhiyun void __iomem *mmio; 183*4882a593Smuzhiyun struct aq_hw_link_status_s aq_link_status; 184*4882a593Smuzhiyun struct hw_atl_utils_mbox mbox; 185*4882a593Smuzhiyun struct hw_atl_stats_s last_stats; 186*4882a593Smuzhiyun struct aq_stats_s curr_stats; 187*4882a593Smuzhiyun u64 speed; 188*4882a593Smuzhiyun u32 itr_tx; 189*4882a593Smuzhiyun u32 itr_rx; 190*4882a593Smuzhiyun unsigned int chip_features; 191*4882a593Smuzhiyun u32 fw_ver_actual; 192*4882a593Smuzhiyun atomic_t dpc; 193*4882a593Smuzhiyun u32 mbox_addr; 194*4882a593Smuzhiyun u32 rpc_addr; 195*4882a593Smuzhiyun u32 settings_addr; 196*4882a593Smuzhiyun u32 rpc_tid; 197*4882a593Smuzhiyun struct hw_atl_utils_fw_rpc rpc; 198*4882a593Smuzhiyun s64 ptp_clk_offset; 199*4882a593Smuzhiyun u16 phy_id; 200*4882a593Smuzhiyun void *priv; 201*4882a593Smuzhiyun }; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun struct aq_ring_s; 204*4882a593Smuzhiyun struct aq_ring_param_s; 205*4882a593Smuzhiyun struct sk_buff; 206*4882a593Smuzhiyun struct aq_rx_filter_l3l4; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun struct aq_hw_ops { 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun int (*hw_ring_tx_xmit)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 211*4882a593Smuzhiyun unsigned int frags); 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun int (*hw_ring_rx_receive)(struct aq_hw_s *self, 214*4882a593Smuzhiyun struct aq_ring_s *aq_ring); 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun int (*hw_ring_rx_fill)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 217*4882a593Smuzhiyun unsigned int sw_tail_old); 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun int (*hw_ring_tx_head_update)(struct aq_hw_s *self, 220*4882a593Smuzhiyun struct aq_ring_s *aq_ring); 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr); 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun int (*hw_soft_reset)(struct aq_hw_s *self); 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun int (*hw_prepare)(struct aq_hw_s *self, 227*4882a593Smuzhiyun const struct aq_fw_ops **fw_ops); 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun int (*hw_reset)(struct aq_hw_s *self); 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun int (*hw_init)(struct aq_hw_s *self, u8 *mac_addr); 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun int (*hw_start)(struct aq_hw_s *self); 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun int (*hw_stop)(struct aq_hw_s *self); 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun int (*hw_ring_tx_init)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 238*4882a593Smuzhiyun struct aq_ring_param_s *aq_ring_param); 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun int (*hw_ring_tx_start)(struct aq_hw_s *self, 241*4882a593Smuzhiyun struct aq_ring_s *aq_ring); 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun int (*hw_ring_tx_stop)(struct aq_hw_s *self, 244*4882a593Smuzhiyun struct aq_ring_s *aq_ring); 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun int (*hw_ring_rx_init)(struct aq_hw_s *self, 247*4882a593Smuzhiyun struct aq_ring_s *aq_ring, 248*4882a593Smuzhiyun struct aq_ring_param_s *aq_ring_param); 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun int (*hw_ring_rx_start)(struct aq_hw_s *self, 251*4882a593Smuzhiyun struct aq_ring_s *aq_ring); 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun int (*hw_ring_rx_stop)(struct aq_hw_s *self, 254*4882a593Smuzhiyun struct aq_ring_s *aq_ring); 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun int (*hw_irq_enable)(struct aq_hw_s *self, u64 mask); 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun int (*hw_irq_disable)(struct aq_hw_s *self, u64 mask); 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun int (*hw_irq_read)(struct aq_hw_s *self, u64 *mask); 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun int (*hw_packet_filter_set)(struct aq_hw_s *self, 263*4882a593Smuzhiyun unsigned int packet_filter); 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun int (*hw_filter_l3l4_set)(struct aq_hw_s *self, 266*4882a593Smuzhiyun struct aq_rx_filter_l3l4 *data); 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun int (*hw_filter_l3l4_clear)(struct aq_hw_s *self, 269*4882a593Smuzhiyun struct aq_rx_filter_l3l4 *data); 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun int (*hw_filter_l2_set)(struct aq_hw_s *self, 272*4882a593Smuzhiyun struct aq_rx_filter_l2 *data); 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun int (*hw_filter_l2_clear)(struct aq_hw_s *self, 275*4882a593Smuzhiyun struct aq_rx_filter_l2 *data); 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun int (*hw_filter_vlan_set)(struct aq_hw_s *self, 278*4882a593Smuzhiyun struct aq_rx_filter_vlan *aq_vlans); 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun int (*hw_filter_vlan_ctrl)(struct aq_hw_s *self, bool enable); 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun int (*hw_multicast_list_set)(struct aq_hw_s *self, 283*4882a593Smuzhiyun u8 ar_mac[AQ_HW_MULTICAST_ADDRESS_MAX] 284*4882a593Smuzhiyun [ETH_ALEN], 285*4882a593Smuzhiyun u32 count); 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun int (*hw_interrupt_moderation_set)(struct aq_hw_s *self); 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun int (*hw_rss_set)(struct aq_hw_s *self, 290*4882a593Smuzhiyun struct aq_rss_parameters *rss_params); 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun int (*hw_rss_hash_set)(struct aq_hw_s *self, 293*4882a593Smuzhiyun struct aq_rss_parameters *rss_params); 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun int (*hw_tc_rate_limit_set)(struct aq_hw_s *self); 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun int (*hw_get_regs)(struct aq_hw_s *self, 298*4882a593Smuzhiyun const struct aq_hw_caps_s *aq_hw_caps, 299*4882a593Smuzhiyun u32 *regs_buff); 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun struct aq_stats_s *(*hw_get_hw_stats)(struct aq_hw_s *self); 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun u32 (*hw_get_fw_version)(struct aq_hw_s *self); 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun int (*hw_set_offload)(struct aq_hw_s *self, 306*4882a593Smuzhiyun struct aq_nic_cfg_s *aq_nic_cfg); 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun int (*hw_ring_hwts_rx_fill)(struct aq_hw_s *self, 309*4882a593Smuzhiyun struct aq_ring_s *aq_ring); 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun int (*hw_ring_hwts_rx_receive)(struct aq_hw_s *self, 312*4882a593Smuzhiyun struct aq_ring_s *ring); 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun void (*hw_get_ptp_ts)(struct aq_hw_s *self, u64 *stamp); 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun int (*hw_adj_clock_freq)(struct aq_hw_s *self, s32 delta); 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun int (*hw_adj_sys_clock)(struct aq_hw_s *self, s64 delta); 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun int (*hw_set_sys_clock)(struct aq_hw_s *self, u64 time, u64 ts); 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun int (*hw_ts_to_sys_clock)(struct aq_hw_s *self, u64 ts, u64 *time); 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun int (*hw_gpio_pulse)(struct aq_hw_s *self, u32 index, u64 start, 325*4882a593Smuzhiyun u32 period); 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun int (*hw_extts_gpio_enable)(struct aq_hw_s *self, u32 index, 328*4882a593Smuzhiyun u32 enable); 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun int (*hw_get_sync_ts)(struct aq_hw_s *self, u64 *ts); 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun u16 (*rx_extract_ts)(struct aq_hw_s *self, u8 *p, unsigned int len, 333*4882a593Smuzhiyun u64 *timestamp); 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun int (*extract_hwts)(struct aq_hw_s *self, u8 *p, unsigned int len, 336*4882a593Smuzhiyun u64 *timestamp); 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun int (*hw_set_fc)(struct aq_hw_s *self, u32 fc, u32 tc); 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun int (*hw_set_loopback)(struct aq_hw_s *self, u32 mode, bool enable); 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun int (*hw_get_mac_temp)(struct aq_hw_s *self, u32 *temp); 343*4882a593Smuzhiyun }; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun struct aq_fw_ops { 346*4882a593Smuzhiyun int (*init)(struct aq_hw_s *self); 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun int (*deinit)(struct aq_hw_s *self); 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun int (*reset)(struct aq_hw_s *self); 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun int (*renegotiate)(struct aq_hw_s *self); 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun int (*get_mac_permanent)(struct aq_hw_s *self, u8 *mac); 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun int (*set_link_speed)(struct aq_hw_s *self, u32 speed); 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun int (*set_state)(struct aq_hw_s *self, 359*4882a593Smuzhiyun enum hal_atl_utils_fw_state_e state); 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun int (*update_link_status)(struct aq_hw_s *self); 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun int (*update_stats)(struct aq_hw_s *self); 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun int (*get_mac_temp)(struct aq_hw_s *self, int *temp); 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun int (*get_phy_temp)(struct aq_hw_s *self, int *temp); 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun u32 (*get_flow_control)(struct aq_hw_s *self, u32 *fcmode); 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun int (*set_flow_control)(struct aq_hw_s *self); 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun int (*led_control)(struct aq_hw_s *self, u32 mode); 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun int (*set_phyloopback)(struct aq_hw_s *self, u32 mode, bool enable); 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun int (*set_power)(struct aq_hw_s *self, unsigned int power_state, 378*4882a593Smuzhiyun u8 *mac); 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun int (*send_fw_request)(struct aq_hw_s *self, 381*4882a593Smuzhiyun const struct hw_fw_request_iface *fw_req, 382*4882a593Smuzhiyun size_t size); 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun void (*enable_ptp)(struct aq_hw_s *self, int enable); 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun void (*adjust_ptp)(struct aq_hw_s *self, uint64_t adj); 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun int (*set_eee_rate)(struct aq_hw_s *self, u32 speed); 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun int (*get_eee_rate)(struct aq_hw_s *self, u32 *rate, 391*4882a593Smuzhiyun u32 *supported_rates); 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun int (*set_downshift)(struct aq_hw_s *self, u32 counter); 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun int (*set_media_detect)(struct aq_hw_s *self, bool enable); 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun u32 (*get_link_capabilities)(struct aq_hw_s *self); 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun int (*send_macsec_req)(struct aq_hw_s *self, 400*4882a593Smuzhiyun struct macsec_msg_fw_request *msg, 401*4882a593Smuzhiyun struct macsec_msg_fw_response *resp); 402*4882a593Smuzhiyun }; 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun #endif /* AQ_HW_H */ 405