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 2154bcb3d1SDmitry Bogdanov #define AQ_RX_FIRST_LOC_FVLANID 0U 2254bcb3d1SDmitry Bogdanov #define AQ_RX_LAST_LOC_FVLANID 15U 23*9a8cac4bSDmitry Bogdanov #define AQ_RX_FIRST_LOC_FETHERT 16U 24*9a8cac4bSDmitry Bogdanov #define AQ_RX_LAST_LOC_FETHERT 31U 25a6ed6f22SDmitry Bogdanov #define AQ_RX_FIRST_LOC_FL3L4 32U 26a6ed6f22SDmitry Bogdanov #define AQ_RX_LAST_LOC_FL3L4 39U 27a6ed6f22SDmitry Bogdanov #define AQ_RX_MAX_RXNFC_LOC AQ_RX_LAST_LOC_FL3L4 2854bcb3d1SDmitry Bogdanov #define AQ_VLAN_MAX_FILTERS \ 2954bcb3d1SDmitry Bogdanov (AQ_RX_LAST_LOC_FVLANID - AQ_RX_FIRST_LOC_FVLANID + 1U) 30a6ed6f22SDmitry Bogdanov 31753f4783SDavid VomLehn /* NIC H/W capabilities */ 32753f4783SDavid VomLehn struct aq_hw_caps_s { 33753f4783SDavid VomLehn u64 hw_features; 34753f4783SDavid VomLehn u64 link_speed_msk; 35753f4783SDavid VomLehn unsigned int hw_priv_flags; 364948293fSIgor Russkikh u32 media_type; 37c1af5427SAnton Mikaev u32 rxds_max; 38c1af5427SAnton Mikaev u32 txds_max; 39c1af5427SAnton Mikaev u32 rxds_min; 40c1af5427SAnton Mikaev u32 txds_min; 41753f4783SDavid VomLehn u32 txhwb_alignment; 42753f4783SDavid VomLehn u32 irq_mask; 43753f4783SDavid VomLehn u32 vecs; 44753f4783SDavid VomLehn u32 mtu; 45753f4783SDavid VomLehn u32 mac_regs_count; 4676c19c6cSIgor Russkikh u32 hw_alive_check_addr; 47753f4783SDavid VomLehn u8 msix_irqs; 48753f4783SDavid VomLehn u8 tcs; 49753f4783SDavid VomLehn u8 rxd_alignment; 50753f4783SDavid VomLehn u8 rxd_size; 51753f4783SDavid VomLehn u8 txd_alignment; 52753f4783SDavid VomLehn u8 txd_size; 53753f4783SDavid VomLehn u8 tx_rings; 54753f4783SDavid VomLehn u8 rx_rings; 55753f4783SDavid VomLehn bool flow_control; 56753f4783SDavid VomLehn bool is_64_dma; 57753f4783SDavid VomLehn }; 58753f4783SDavid VomLehn 59753f4783SDavid VomLehn struct aq_hw_link_status_s { 60753f4783SDavid VomLehn unsigned int mbps; 61753f4783SDavid VomLehn }; 62753f4783SDavid VomLehn 63be08d839SIgor Russkikh struct aq_stats_s { 64be08d839SIgor Russkikh u64 uprc; 65be08d839SIgor Russkikh u64 mprc; 66be08d839SIgor Russkikh u64 bprc; 67be08d839SIgor Russkikh u64 erpt; 68be08d839SIgor Russkikh u64 uptc; 69be08d839SIgor Russkikh u64 mptc; 70be08d839SIgor Russkikh u64 bptc; 71be08d839SIgor Russkikh u64 erpr; 72be08d839SIgor Russkikh u64 mbtc; 73be08d839SIgor Russkikh u64 bbtc; 74be08d839SIgor Russkikh u64 mbrc; 75be08d839SIgor Russkikh u64 bbrc; 76be08d839SIgor Russkikh u64 ubrc; 77be08d839SIgor Russkikh u64 ubtc; 78be08d839SIgor Russkikh u64 dpc; 79be08d839SIgor Russkikh u64 dma_pkt_rc; 80be08d839SIgor Russkikh u64 dma_pkt_tc; 81be08d839SIgor Russkikh u64 dma_oct_rc; 82be08d839SIgor Russkikh u64 dma_oct_tc; 83be08d839SIgor Russkikh }; 84be08d839SIgor Russkikh 85753f4783SDavid VomLehn #define AQ_HW_IRQ_INVALID 0U 86753f4783SDavid VomLehn #define AQ_HW_IRQ_LEGACY 1U 87753f4783SDavid VomLehn #define AQ_HW_IRQ_MSI 2U 88753f4783SDavid VomLehn #define AQ_HW_IRQ_MSIX 3U 89753f4783SDavid VomLehn 90753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D0 0U 91753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D3 3U 92753f4783SDavid VomLehn 93753f4783SDavid VomLehn #define AQ_HW_FLAG_STARTED 0x00000004U 94753f4783SDavid VomLehn #define AQ_HW_FLAG_STOPPING 0x00000008U 95753f4783SDavid VomLehn #define AQ_HW_FLAG_RESETTING 0x00000010U 96753f4783SDavid VomLehn #define AQ_HW_FLAG_CLOSING 0x00000020U 97753f4783SDavid VomLehn #define AQ_HW_LINK_DOWN 0x04000000U 98753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_UNPLUG 0x40000000U 99753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_HW 0x80000000U 100753f4783SDavid VomLehn 101753f4783SDavid VomLehn #define AQ_HW_FLAG_ERRORS (AQ_HW_FLAG_ERR_HW | AQ_HW_FLAG_ERR_UNPLUG) 102753f4783SDavid VomLehn 103db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_READY (AQ_NIC_FLAG_STOPPING | \ 104db550615SIgor Russkikh AQ_NIC_FLAG_RESETTING | AQ_NIC_FLAG_CLOSING | \ 105db550615SIgor Russkikh AQ_NIC_FLAG_ERR_UNPLUG | AQ_NIC_FLAG_ERR_HW) 106db550615SIgor Russkikh 107db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_TX_READY (AQ_NIC_FLAGS_IS_NOT_READY | \ 108db550615SIgor Russkikh AQ_NIC_LINK_DOWN) 109db550615SIgor Russkikh 1104948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_TP 1U 1114948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_FIBRE 2U 1124948293fSIgor Russkikh 113c1af5427SAnton Mikaev #define AQ_HW_TXD_MULTIPLE 8U 114c1af5427SAnton Mikaev #define AQ_HW_RXD_MULTIPLE 8U 115c1af5427SAnton Mikaev 11694b3b542SIgor Russkikh #define AQ_HW_MULTICAST_ADDRESS_MAX 32U 11794b3b542SIgor Russkikh 118753f4783SDavid VomLehn struct aq_hw_s { 11978f5193dSIgor Russkikh atomic_t flags; 120c8c82eb3SIgor Russkikh u8 rbl_enabled:1; 121753f4783SDavid VomLehn struct aq_nic_cfg_s *aq_nic_cfg; 1220c58c35fSIgor Russkikh const struct aq_fw_ops *aq_fw_ops; 123753f4783SDavid VomLehn void __iomem *mmio; 124753f4783SDavid VomLehn struct aq_hw_link_status_s aq_link_status; 1258f60f762SNikita Danilov struct hw_atl_utils_mbox mbox; 1261a713f87SIgor Russkikh struct hw_atl_stats_s last_stats; 1271a713f87SIgor Russkikh struct aq_stats_s curr_stats; 1281a713f87SIgor Russkikh u64 speed; 1291a713f87SIgor Russkikh u32 itr_tx; 1301a713f87SIgor Russkikh u32 itr_rx; 1311a713f87SIgor Russkikh unsigned int chip_features; 1321a713f87SIgor Russkikh u32 fw_ver_actual; 1331a713f87SIgor Russkikh atomic_t dpc; 1341a713f87SIgor Russkikh u32 mbox_addr; 1351a713f87SIgor Russkikh u32 rpc_addr; 1361a713f87SIgor Russkikh u32 rpc_tid; 1378f60f762SNikita Danilov struct hw_atl_utils_fw_rpc rpc; 138753f4783SDavid VomLehn }; 139753f4783SDavid VomLehn 140753f4783SDavid VomLehn struct aq_ring_s; 141753f4783SDavid VomLehn struct aq_ring_param_s; 142753f4783SDavid VomLehn struct sk_buff; 143a6ed6f22SDmitry Bogdanov struct aq_rx_filter_l3l4; 144753f4783SDavid VomLehn 145753f4783SDavid VomLehn struct aq_hw_ops { 146753f4783SDavid VomLehn 147753f4783SDavid VomLehn int (*hw_ring_tx_xmit)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 148753f4783SDavid VomLehn unsigned int frags); 149753f4783SDavid VomLehn 150753f4783SDavid VomLehn int (*hw_ring_rx_receive)(struct aq_hw_s *self, 151753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 152753f4783SDavid VomLehn 153753f4783SDavid VomLehn int (*hw_ring_rx_fill)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 154753f4783SDavid VomLehn unsigned int sw_tail_old); 155753f4783SDavid VomLehn 156753f4783SDavid VomLehn int (*hw_ring_tx_head_update)(struct aq_hw_s *self, 157753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 158753f4783SDavid VomLehn 159753f4783SDavid VomLehn int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr); 160753f4783SDavid VomLehn 161753f4783SDavid VomLehn int (*hw_reset)(struct aq_hw_s *self); 162753f4783SDavid VomLehn 1631a713f87SIgor Russkikh int (*hw_init)(struct aq_hw_s *self, u8 *mac_addr); 164753f4783SDavid VomLehn 165753f4783SDavid VomLehn int (*hw_start)(struct aq_hw_s *self); 166753f4783SDavid VomLehn 167753f4783SDavid VomLehn int (*hw_stop)(struct aq_hw_s *self); 168753f4783SDavid VomLehn 169753f4783SDavid VomLehn int (*hw_ring_tx_init)(struct aq_hw_s *self, struct aq_ring_s *aq_ring, 170753f4783SDavid VomLehn struct aq_ring_param_s *aq_ring_param); 171753f4783SDavid VomLehn 172753f4783SDavid VomLehn int (*hw_ring_tx_start)(struct aq_hw_s *self, 173753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 174753f4783SDavid VomLehn 175753f4783SDavid VomLehn int (*hw_ring_tx_stop)(struct aq_hw_s *self, 176753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 177753f4783SDavid VomLehn 178753f4783SDavid VomLehn int (*hw_ring_rx_init)(struct aq_hw_s *self, 179753f4783SDavid VomLehn struct aq_ring_s *aq_ring, 180753f4783SDavid VomLehn struct aq_ring_param_s *aq_ring_param); 181753f4783SDavid VomLehn 182753f4783SDavid VomLehn int (*hw_ring_rx_start)(struct aq_hw_s *self, 183753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 184753f4783SDavid VomLehn 185753f4783SDavid VomLehn int (*hw_ring_rx_stop)(struct aq_hw_s *self, 186753f4783SDavid VomLehn struct aq_ring_s *aq_ring); 187753f4783SDavid VomLehn 188753f4783SDavid VomLehn int (*hw_irq_enable)(struct aq_hw_s *self, u64 mask); 189753f4783SDavid VomLehn 190753f4783SDavid VomLehn int (*hw_irq_disable)(struct aq_hw_s *self, u64 mask); 191753f4783SDavid VomLehn 192753f4783SDavid VomLehn int (*hw_irq_read)(struct aq_hw_s *self, u64 *mask); 193753f4783SDavid VomLehn 194753f4783SDavid VomLehn int (*hw_packet_filter_set)(struct aq_hw_s *self, 195753f4783SDavid VomLehn unsigned int packet_filter); 196753f4783SDavid VomLehn 197a6ed6f22SDmitry Bogdanov int (*hw_filter_l3l4_set)(struct aq_hw_s *self, 198a6ed6f22SDmitry Bogdanov struct aq_rx_filter_l3l4 *data); 199a6ed6f22SDmitry Bogdanov 200a6ed6f22SDmitry Bogdanov int (*hw_filter_l3l4_clear)(struct aq_hw_s *self, 201a6ed6f22SDmitry Bogdanov struct aq_rx_filter_l3l4 *data); 202a6ed6f22SDmitry Bogdanov 203*9a8cac4bSDmitry Bogdanov int (*hw_filter_l2_set)(struct aq_hw_s *self, 204*9a8cac4bSDmitry Bogdanov struct aq_rx_filter_l2 *data); 205*9a8cac4bSDmitry Bogdanov 206*9a8cac4bSDmitry Bogdanov int (*hw_filter_l2_clear)(struct aq_hw_s *self, 207*9a8cac4bSDmitry Bogdanov struct aq_rx_filter_l2 *data); 208*9a8cac4bSDmitry Bogdanov 20954bcb3d1SDmitry Bogdanov int (*hw_filter_vlan_set)(struct aq_hw_s *self, 21054bcb3d1SDmitry Bogdanov struct aq_rx_filter_vlan *aq_vlans); 21154bcb3d1SDmitry Bogdanov 21254bcb3d1SDmitry Bogdanov int (*hw_filter_vlan_ctrl)(struct aq_hw_s *self, bool enable); 21354bcb3d1SDmitry Bogdanov 214753f4783SDavid VomLehn int (*hw_multicast_list_set)(struct aq_hw_s *self, 21594b3b542SIgor Russkikh u8 ar_mac[AQ_HW_MULTICAST_ADDRESS_MAX] 216753f4783SDavid VomLehn [ETH_ALEN], 217753f4783SDavid VomLehn u32 count); 218753f4783SDavid VomLehn 219b82ee71aSIgor Russkikh int (*hw_interrupt_moderation_set)(struct aq_hw_s *self); 220753f4783SDavid VomLehn 221753f4783SDavid VomLehn int (*hw_rss_set)(struct aq_hw_s *self, 222753f4783SDavid VomLehn struct aq_rss_parameters *rss_params); 223753f4783SDavid VomLehn 224753f4783SDavid VomLehn int (*hw_rss_hash_set)(struct aq_hw_s *self, 225753f4783SDavid VomLehn struct aq_rss_parameters *rss_params); 226753f4783SDavid VomLehn 227753f4783SDavid VomLehn int (*hw_get_regs)(struct aq_hw_s *self, 2284cbc9f92SIgor Russkikh const struct aq_hw_caps_s *aq_hw_caps, 2294cbc9f92SIgor Russkikh u32 *regs_buff); 230753f4783SDavid VomLehn 231be08d839SIgor Russkikh struct aq_stats_s *(*hw_get_hw_stats)(struct aq_hw_s *self); 232753f4783SDavid VomLehn 233753f4783SDavid VomLehn int (*hw_get_fw_version)(struct aq_hw_s *self, u32 *fw_version); 234753f4783SDavid VomLehn 235bbb67a44SDmitry Bogdanov int (*hw_set_offload)(struct aq_hw_s *self, 236bbb67a44SDmitry Bogdanov struct aq_nic_cfg_s *aq_nic_cfg); 237bbb67a44SDmitry Bogdanov 23835e8e8b4SIgor Russkikh int (*hw_set_fc)(struct aq_hw_s *self, u32 fc, u32 tc); 239753f4783SDavid VomLehn }; 240753f4783SDavid VomLehn 2410c58c35fSIgor Russkikh struct aq_fw_ops { 2420c58c35fSIgor Russkikh int (*init)(struct aq_hw_s *self); 2430c58c35fSIgor Russkikh 24444e00dd8SIgor Russkikh int (*deinit)(struct aq_hw_s *self); 24544e00dd8SIgor Russkikh 2460c58c35fSIgor Russkikh int (*reset)(struct aq_hw_s *self); 2470c58c35fSIgor Russkikh 248b8d68b62SAnton Mikaev int (*renegotiate)(struct aq_hw_s *self); 249b8d68b62SAnton Mikaev 2500c58c35fSIgor Russkikh int (*get_mac_permanent)(struct aq_hw_s *self, u8 *mac); 2510c58c35fSIgor Russkikh 2520c58c35fSIgor Russkikh int (*set_link_speed)(struct aq_hw_s *self, u32 speed); 2530c58c35fSIgor Russkikh 25444e00dd8SIgor Russkikh int (*set_state)(struct aq_hw_s *self, 25544e00dd8SIgor Russkikh enum hal_atl_utils_fw_state_e state); 2560c58c35fSIgor Russkikh 2570c58c35fSIgor Russkikh int (*update_link_status)(struct aq_hw_s *self); 2580c58c35fSIgor Russkikh 2590c58c35fSIgor Russkikh int (*update_stats)(struct aq_hw_s *self); 26044e00dd8SIgor Russkikh 26135e8e8b4SIgor Russkikh u32 (*get_flow_control)(struct aq_hw_s *self, u32 *fcmode); 26235e8e8b4SIgor Russkikh 26344e00dd8SIgor Russkikh int (*set_flow_control)(struct aq_hw_s *self); 264a0da96c0SYana Esina 265a0da96c0SYana Esina int (*set_power)(struct aq_hw_s *self, unsigned int power_state, 266a0da96c0SYana Esina u8 *mac); 26792ab6407SYana Esina 26892ab6407SYana Esina int (*set_eee_rate)(struct aq_hw_s *self, u32 speed); 26992ab6407SYana Esina 27092ab6407SYana Esina int (*get_eee_rate)(struct aq_hw_s *self, u32 *rate, 27192ab6407SYana Esina u32 *supported_rates); 2720c58c35fSIgor Russkikh }; 2730c58c35fSIgor Russkikh 274753f4783SDavid VomLehn #endif /* AQ_HW_H */ 275