/* * aQuantia Corporation Network Driver * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * (1) Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * (2) Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * (3)The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _AQ_DEVICE_H_ #define _AQ_DEVICE_H_ #include "aq_hw.h" enum aq_media_type { AQ_MEDIA_TYPE_UNKNOWN = 0, AQ_MEDIA_TYPE_FIBRE, AQ_MEDIA_TYPE_TP, }; #define AQ_LINK_UNKNOWN 0x00000000 #define AQ_LINK_100M 0x00000001 #define AQ_LINK_1G 0x00000002 #define AQ_LINK_2G5 0x00000004 #define AQ_LINK_5G 0x00000008 #define AQ_LINK_10G 0x00000010 #define AQ_LINK_ALL (AQ_LINK_100M | AQ_LINK_1G | AQ_LINK_2G5 | AQ_LINK_5G | \ AQ_LINK_10G ) struct aq_stats_s { uint64_t prc; uint64_t uprc; uint64_t mprc; uint64_t bprc; uint64_t cprc; uint64_t erpr; uint64_t dpc; uint64_t brc; uint64_t ubrc; uint64_t mbrc; uint64_t bbrc; uint64_t ptc; uint64_t uptc; uint64_t mptc; uint64_t bptc; uint64_t erpt; uint64_t btc; uint64_t ubtc; uint64_t mbtc; uint64_t bbtc; }; enum aq_dev_state_e { AQ_DEV_STATE_UNLOAD, AQ_DEV_STATE_PCI_STOP, AQ_DEV_STATE_DOWN, AQ_DEV_STATE_UP, }; struct aq_rx_filters { unsigned int rule_cnt; struct aq_rx_filter_vlan vlan_filters[AQ_HW_VLAN_MAX_FILTERS]; struct aq_rx_filter_l2 etype_filters[AQ_HW_ETYPE_MAX_FILTERS]; }; struct aq_vlan_tag { SLIST_ENTRY(aq_vlan_tag) next; uint16_t tag; }; struct aq_dev { device_t dev; if_ctx_t ctx; if_softc_ctx_t scctx; if_shared_ctx_t sctx; struct ifmedia * media; struct aq_hw hw; enum aq_media_type media_type; uint32_t link_speeds; uint32_t chip_features; uint32_t mbox_addr; uint8_t mac_addr[ETHER_ADDR_LEN]; uint64_t admin_ticks; struct if_irq irq; int msix; int mmio_rid; struct resource * mmio_res; bus_space_tag_t mmio_tag; bus_space_handle_t mmio_handle; bus_size_t mmio_size; struct aq_ring *tx_rings[HW_ATL_B0_RINGS_MAX]; struct aq_ring *rx_rings[HW_ATL_B0_RINGS_MAX]; uint32_t tx_rings_count; uint32_t rx_rings_count; bool linkup; int media_active; struct aq_hw_stats_s last_stats; struct aq_stats_s curr_stats; bitstr_t *vlan_tags; int mcnt; uint8_t rss_key[HW_ATL_RSS_HASHKEY_SIZE]; uint8_t rss_table[HW_ATL_RSS_INDIRECTION_TABLE_MAX]; }; typedef struct aq_dev aq_dev_t; int aq_update_hw_stats(aq_dev_t *aq_dev); void aq_initmedia(aq_dev_t *aq_dev); int aq_linkstat_isr(void *arg); int aq_isr_rx(void *arg); void aq_mediastatus_update(aq_dev_t *aq_dev, uint32_t link_speed, const struct aq_hw_fc_info *fc_neg); void aq_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr); int aq_mediachange(struct ifnet *ifp); void aq_if_update_admin_status(if_ctx_t ctx); #endif // _AQ_DEVICE_H_