1753f4783SDavid VomLehn /* 2753f4783SDavid VomLehn * aQuantia Corporation Network Driver 3753f4783SDavid VomLehn * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved 4753f4783SDavid VomLehn * 5753f4783SDavid VomLehn * This program is free software; you can redistribute it and/or modify it 6753f4783SDavid VomLehn * under the terms and conditions of the GNU General Public License, 7753f4783SDavid VomLehn * version 2, as published by the Free Software Foundation. 8753f4783SDavid VomLehn */ 9753f4783SDavid VomLehn 101a713f87SIgor Russkikh /* File aq_hw.h: Declaration of abstract interface for NIC hardware specific 11753f4783SDavid VomLehn * functions. 12753f4783SDavid VomLehn */ 13753f4783SDavid VomLehn 14753f4783SDavid VomLehn #ifndef AQ_HW_H 15753f4783SDavid VomLehn #define AQ_HW_H 16753f4783SDavid VomLehn 17753f4783SDavid VomLehn #include "aq_common.h" 18db550615SIgor Russkikh #include "aq_rss.h" 191a713f87SIgor Russkikh #include "hw_atl/hw_atl_utils.h" 20753f4783SDavid VomLehn 21753f4783SDavid VomLehn /* NIC H/W capabilities */ 22753f4783SDavid VomLehn struct aq_hw_caps_s { 23753f4783SDavid VomLehn u64 hw_features; 24753f4783SDavid VomLehn u64 link_speed_msk; 25753f4783SDavid VomLehn unsigned int hw_priv_flags; 264948293fSIgor Russkikh u32 media_type; 27753f4783SDavid VomLehn u32 rxds; 28753f4783SDavid VomLehn u32 txds; 29753f4783SDavid VomLehn u32 txhwb_alignment; 30753f4783SDavid VomLehn u32 irq_mask; 31753f4783SDavid VomLehn u32 vecs; 32753f4783SDavid VomLehn u32 mtu; 33753f4783SDavid VomLehn u32 mac_regs_count; 3476c19c6cSIgor Russkikh u32 hw_alive_check_addr; 35753f4783SDavid VomLehn u8 msix_irqs; 36753f4783SDavid VomLehn u8 tcs; 37753f4783SDavid VomLehn u8 rxd_alignment; 38753f4783SDavid VomLehn u8 rxd_size; 39753f4783SDavid VomLehn u8 txd_alignment; 40753f4783SDavid VomLehn u8 txd_size; 41753f4783SDavid VomLehn u8 tx_rings; 42753f4783SDavid VomLehn u8 rx_rings; 43753f4783SDavid VomLehn bool flow_control; 44753f4783SDavid VomLehn bool is_64_dma; 45753f4783SDavid VomLehn u32 fw_ver_expected; 46753f4783SDavid VomLehn }; 47753f4783SDavid VomLehn 48753f4783SDavid VomLehn struct aq_hw_link_status_s { 49753f4783SDavid VomLehn unsigned int mbps; 50753f4783SDavid VomLehn }; 51753f4783SDavid VomLehn 52be08d839SIgor Russkikh struct aq_stats_s { 53be08d839SIgor Russkikh u64 uprc; 54be08d839SIgor Russkikh u64 mprc; 55be08d839SIgor Russkikh u64 bprc; 56be08d839SIgor Russkikh u64 erpt; 57be08d839SIgor Russkikh u64 uptc; 58be08d839SIgor Russkikh u64 mptc; 59be08d839SIgor Russkikh u64 bptc; 60be08d839SIgor Russkikh u64 erpr; 61be08d839SIgor Russkikh u64 mbtc; 62be08d839SIgor Russkikh u64 bbtc; 63be08d839SIgor Russkikh u64 mbrc; 64be08d839SIgor Russkikh u64 bbrc; 65be08d839SIgor Russkikh u64 ubrc; 66be08d839SIgor Russkikh u64 ubtc; 67be08d839SIgor Russkikh u64 dpc; 68be08d839SIgor Russkikh u64 dma_pkt_rc; 69be08d839SIgor Russkikh u64 dma_pkt_tc; 70be08d839SIgor Russkikh u64 dma_oct_rc; 71be08d839SIgor Russkikh u64 dma_oct_tc; 72be08d839SIgor Russkikh }; 73be08d839SIgor Russkikh 74753f4783SDavid VomLehn #define AQ_HW_IRQ_INVALID 0U 75753f4783SDavid VomLehn #define AQ_HW_IRQ_LEGACY 1U 76753f4783SDavid VomLehn #define AQ_HW_IRQ_MSI 2U 77753f4783SDavid VomLehn #define AQ_HW_IRQ_MSIX 3U 78753f4783SDavid VomLehn 79753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D0 0U 80753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D3 3U 81753f4783SDavid VomLehn 82753f4783SDavid VomLehn #define AQ_HW_FLAG_STARTED 0x00000004U 83753f4783SDavid VomLehn #define AQ_HW_FLAG_STOPPING 0x00000008U 84753f4783SDavid VomLehn #define AQ_HW_FLAG_RESETTING 0x00000010U 85753f4783SDavid VomLehn #define AQ_HW_FLAG_CLOSING 0x00000020U 86753f4783SDavid VomLehn #define AQ_HW_LINK_DOWN 0x04000000U 87753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_UNPLUG 0x40000000U 88753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_HW 0x80000000U 89753f4783SDavid VomLehn 90753f4783SDavid VomLehn #define AQ_HW_FLAG_ERRORS (AQ_HW_FLAG_ERR_HW | AQ_HW_FLAG_ERR_UNPLUG) 91753f4783SDavid VomLehn 92db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_READY (AQ_NIC_FLAG_STOPPING | \ 93db550615SIgor Russkikh AQ_NIC_FLAG_RESETTING | AQ_NIC_FLAG_CLOSING | \ 94db550615SIgor Russkikh AQ_NIC_FLAG_ERR_UNPLUG | AQ_NIC_FLAG_ERR_HW) 95db550615SIgor Russkikh 96db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_TX_READY (AQ_NIC_FLAGS_IS_NOT_READY | \ 97db550615SIgor Russkikh AQ_NIC_LINK_DOWN) 98db550615SIgor Russkikh 994948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_TP 1U 1004948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_FIBRE 2U 1014948293fSIgor Russkikh 102753f4783SDavid VomLehn struct aq_hw_s { 10378f5193dSIgor Russkikh atomic_t flags; 104753f4783SDavid VomLehn struct aq_nic_cfg_s *aq_nic_cfg; 105*0c58c35fSIgor Russkikh const struct aq_fw_ops *aq_fw_ops; 106753f4783SDavid VomLehn void __iomem *mmio; 107753f4783SDavid VomLehn struct aq_hw_link_status_s aq_link_status; 1081a713f87SIgor Russkikh struct hw_aq_atl_utils_mbox mbox; 1091a713f87SIgor Russkikh struct hw_atl_stats_s last_stats; 1101a713f87SIgor Russkikh struct aq_stats_s curr_stats; 1111a713f87SIgor Russkikh u64 speed; 1121a713f87SIgor Russkikh u32 itr_tx; 1131a713f87SIgor Russkikh u32 itr_rx; 1141a713f87SIgor Russkikh unsigned int chip_features; 1151a713f87SIgor Russkikh u32 fw_ver_actual; 1161a713f87SIgor Russkikh atomic_t dpc; 1171a713f87SIgor Russkikh u32 mbox_addr; 1181a713f87SIgor Russkikh u32 rpc_addr; 1191a713f87SIgor Russkikh u32 rpc_tid; 1201a713f87SIgor Russkikh struct hw_aq_atl_utils_fw_rpc rpc; 121753f4783SDavid VomLehn }; 122753f4783SDavid VomLehn 123753f4783SDavid VomLehn struct aq_ring_s; 124753f4783SDavid VomLehn struct aq_ring_param_s; 125753f4783SDavid VomLehn struct sk_buff; 126753f4783SDavid VomLehn 127753f4783SDavid VomLehn struct aq_hw_ops { 128753f4783SDavid VomLehn 129753f4783SDavid VomLehn int (*hw_ring_tx_xmit)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 130753f4783SDavid VomLehn unsigned int frags); 131753f4783SDavid VomLehn 132753f4783SDavid VomLehn int (*hw_ring_rx_receive)(struct aq_hw_s *self, 133753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 134753f4783SDavid VomLehn 135753f4783SDavid VomLehn int (*hw_ring_rx_fill)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 136753f4783SDavid VomLehn unsigned int sw_tail_old); 137753f4783SDavid VomLehn 138753f4783SDavid VomLehn int (*hw_ring_tx_head_update)(struct aq_hw_s *self, 139753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 140753f4783SDavid VomLehn 141753f4783SDavid VomLehn int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr); 142753f4783SDavid VomLehn 143753f4783SDavid VomLehn int (*hw_reset)(struct aq_hw_s *self); 144753f4783SDavid VomLehn 1451a713f87SIgor Russkikh int (*hw_init)(struct aq_hw_s *self, u8 *mac_addr); 146753f4783SDavid VomLehn 147753f4783SDavid VomLehn int (*hw_start)(struct aq_hw_s *self); 148753f4783SDavid VomLehn 149753f4783SDavid VomLehn int (*hw_stop)(struct aq_hw_s *self); 150753f4783SDavid VomLehn 151753f4783SDavid VomLehn int (*hw_ring_tx_init)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 152753f4783SDavid VomLehn struct aq_ring_param_s *aq_ring_param); 153753f4783SDavid VomLehn 154753f4783SDavid VomLehn int (*hw_ring_tx_start)(struct aq_hw_s *self, 155753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 156753f4783SDavid VomLehn 157753f4783SDavid VomLehn int (*hw_ring_tx_stop)(struct aq_hw_s *self, 158753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 159753f4783SDavid VomLehn 160753f4783SDavid VomLehn int (*hw_ring_rx_init)(struct aq_hw_s *self, 161753f4783SDavid VomLehn struct aq_ring_s *aq_ring, 162753f4783SDavid VomLehn struct aq_ring_param_s *aq_ring_param); 163753f4783SDavid VomLehn 164753f4783SDavid VomLehn int (*hw_ring_rx_start)(struct aq_hw_s *self, 165753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 166753f4783SDavid VomLehn 167753f4783SDavid VomLehn int (*hw_ring_rx_stop)(struct aq_hw_s *self, 168753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 169753f4783SDavid VomLehn 170753f4783SDavid VomLehn int (*hw_irq_enable)(struct aq_hw_s *self, u64 mask); 171753f4783SDavid VomLehn 172753f4783SDavid VomLehn int (*hw_irq_disable)(struct aq_hw_s *self, u64 mask); 173753f4783SDavid VomLehn 174753f4783SDavid VomLehn int (*hw_irq_read)(struct aq_hw_s *self, u64 *mask); 175753f4783SDavid VomLehn 176753f4783SDavid VomLehn int (*hw_packet_filter_set)(struct aq_hw_s *self, 177753f4783SDavid VomLehn unsigned int packet_filter); 178753f4783SDavid VomLehn 179753f4783SDavid VomLehn int (*hw_multicast_list_set)(struct aq_hw_s *self, 180753f4783SDavid VomLehn u8 ar_mac[AQ_CFG_MULTICAST_ADDRESS_MAX] 181753f4783SDavid VomLehn [ETH_ALEN], 182753f4783SDavid VomLehn u32 count); 183753f4783SDavid VomLehn 184b82ee71aSIgor Russkikh int (*hw_interrupt_moderation_set)(struct aq_hw_s *self); 185753f4783SDavid VomLehn 186753f4783SDavid VomLehn int (*hw_rss_set)(struct aq_hw_s *self, 187753f4783SDavid VomLehn struct aq_rss_parameters *rss_params); 188753f4783SDavid VomLehn 189753f4783SDavid VomLehn int (*hw_rss_hash_set)(struct aq_hw_s *self, 190753f4783SDavid VomLehn struct aq_rss_parameters *rss_params); 191753f4783SDavid VomLehn 192753f4783SDavid VomLehn int (*hw_get_regs)(struct aq_hw_s *self, 1934cbc9f92SIgor Russkikh const struct aq_hw_caps_s *aq_hw_caps, 1944cbc9f92SIgor Russkikh u32 *regs_buff); 195753f4783SDavid VomLehn 196be08d839SIgor Russkikh struct aq_stats_s *(*hw_get_hw_stats)(struct aq_hw_s *self); 197753f4783SDavid VomLehn 198753f4783SDavid VomLehn int (*hw_get_fw_version)(struct aq_hw_s *self, u32 *fw_version); 199753f4783SDavid VomLehn 200753f4783SDavid VomLehn int (*hw_deinit)(struct aq_hw_s *self); 201753f4783SDavid VomLehn 202753f4783SDavid VomLehn int (*hw_set_power)(struct aq_hw_s *self, unsigned int power_state); 203753f4783SDavid VomLehn }; 204753f4783SDavid VomLehn 205*0c58c35fSIgor Russkikh struct aq_fw_ops { 206*0c58c35fSIgor Russkikh int (*init)(struct aq_hw_s *self); 207*0c58c35fSIgor Russkikh 208*0c58c35fSIgor Russkikh int (*reset)(struct aq_hw_s *self); 209*0c58c35fSIgor Russkikh 210*0c58c35fSIgor Russkikh int (*get_mac_permanent)(struct aq_hw_s *self, u8 *mac); 211*0c58c35fSIgor Russkikh 212*0c58c35fSIgor Russkikh int (*set_link_speed)(struct aq_hw_s *self, u32 speed); 213*0c58c35fSIgor Russkikh 214*0c58c35fSIgor Russkikh int (*set_state)(struct aq_hw_s *self, enum hal_atl_utils_fw_state_e state); 215*0c58c35fSIgor Russkikh 216*0c58c35fSIgor Russkikh int (*update_link_status)(struct aq_hw_s *self); 217*0c58c35fSIgor Russkikh 218*0c58c35fSIgor Russkikh int (*update_stats)(struct aq_hw_s *self); 219*0c58c35fSIgor Russkikh }; 220*0c58c35fSIgor Russkikh 221753f4783SDavid VomLehn #endif /* AQ_HW_H */ 222